From 03d8372fdff7a3f093c65812962135c8b0cd158b Mon Sep 17 00:00:00 2001 From: bcaudell95 Date: Tue, 29 May 2018 13:34:40 -0700 Subject: [PATCH 1/5] added method and bumped version number --- asyncpg/__init__.py | 2 +- asyncpg/connection.py | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/asyncpg/__init__.py b/asyncpg/__init__.py index 0df7ed31..16bf5047 100644 --- a/asyncpg/__init__.py +++ b/asyncpg/__init__.py @@ -15,4 +15,4 @@ __all__ = ('connect', 'create_pool', 'Record', 'Connection') + \ exceptions.__all__ # NOQA -__version__ = '0.16.0.dev0' +__version__ = '0.16.0.dev1' diff --git a/asyncpg/connection.py b/asyncpg/connection.py index 2a4eba86..7d8dc903 100644 --- a/asyncpg/connection.py +++ b/asyncpg/connection.py @@ -204,6 +204,13 @@ def transaction(self, *, isolation='read_committed', readonly=False, self._check_open() return transaction.Transaction(self, isolation, readonly, deferrable) + def is_in_transaction(self): + """Return True if Connection is currently inside a transaction + + :return bool: True if inside transaction, False otherwise + """ + return self._top_xact is not None + async def execute(self, query: str, *args, timeout: float=None) -> str: """Execute an SQL command (or commands). From 7b2520d59e13ec49d28418f57bce49e3533b6022 Mon Sep 17 00:00:00 2001 From: bcaudell95 Date: Tue, 29 May 2018 14:08:25 -0700 Subject: [PATCH 2/5] broadened condition and added test assertions --- asyncpg/connection.py | 2 +- tests/test_transaction.py | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/asyncpg/connection.py b/asyncpg/connection.py index 7d8dc903..dce1675d 100644 --- a/asyncpg/connection.py +++ b/asyncpg/connection.py @@ -209,7 +209,7 @@ def is_in_transaction(self): :return bool: True if inside transaction, False otherwise """ - return self._top_xact is not None + return self._top_xact is not None or self._protocol.is_in_transaction() async def execute(self, query: str, *args, timeout: float=None) -> str: """Execute an SQL command (or commands). diff --git a/tests/test_transaction.py b/tests/test_transaction.py index 935d2abf..eb2d948e 100644 --- a/tests/test_transaction.py +++ b/tests/test_transaction.py @@ -14,12 +14,15 @@ class TestTransaction(tb.ConnectedTestCase): async def test_transaction_regular(self): self.assertIsNone(self.con._top_xact) + self.assertFalse(self.con.is_in_transaction()) tr = self.con.transaction() self.assertIsNone(self.con._top_xact) + self.assertFalse(self.con.is_in_transaction()) with self.assertRaises(ZeroDivisionError): async with tr as with_tr: self.assertIs(self.con._top_xact, tr) + self.assertTrue(self.con.is_in_transaction()) # We don't return the transaction object from __aenter__, # to make it harder for people to use '.rollback()' and @@ -33,6 +36,7 @@ async def test_transaction_regular(self): 1 / 0 self.assertIsNone(self.con._top_xact) + self.assertFalse(self.con.is_in_transaction()) with self.assertRaisesRegex(asyncpg.PostgresError, '"mytab" does not exist'): @@ -42,12 +46,17 @@ async def test_transaction_regular(self): async def test_transaction_nested(self): self.assertIsNone(self.con._top_xact) + self.assertFalse(self.con.is_in_transaction()) + tr = self.con.transaction() + self.assertIsNone(self.con._top_xact) + self.assertFalse(self.con.is_in_transaction()) with self.assertRaises(ZeroDivisionError): async with tr: self.assertIs(self.con._top_xact, tr) + self.assertTrue(self.con.is_in_transaction()) await self.con.execute(''' CREATE TABLE mytab (a int); @@ -55,18 +64,21 @@ async def test_transaction_nested(self): async with self.con.transaction(): self.assertIs(self.con._top_xact, tr) + self.assertTrue(self.con.is_in_transaction()) await self.con.execute(''' INSERT INTO mytab (a) VALUES (1), (2); ''') self.assertIs(self.con._top_xact, tr) + self.assertTrue(self.con.is_in_transaction()) with self.assertRaises(ZeroDivisionError): in_tr = self.con.transaction() async with in_tr: self.assertIs(self.con._top_xact, tr) + self.assertTrue(self.con.is_in_transaction()) await self.con.execute(''' INSERT INTO mytab (a) VALUES (3), (4); @@ -85,10 +97,12 @@ async def test_transaction_nested(self): self.assertEqual(recs[1][0], 2) self.assertIs(self.con._top_xact, tr) + self.assertTrue(self.con.is_in_transaction()) 1 / 0 self.assertIs(self.con._top_xact, None) + self.assertFalse(self.con.is_in_transaction()) with self.assertRaisesRegex(asyncpg.PostgresError, '"mytab" does not exist'): @@ -98,6 +112,7 @@ async def test_transaction_nested(self): async def test_transaction_interface_errors(self): self.assertIsNone(self.con._top_xact) + self.assertFalse(self.con.is_in_transaction()) tr = self.con.transaction(readonly=True, isolation='serializable') with self.assertRaisesRegex(asyncpg.InterfaceError, @@ -109,6 +124,7 @@ async def test_transaction_interface_errors(self): ' Date: Tue, 29 May 2018 18:21:03 -0700 Subject: [PATCH 3/5] added versionadded doc --- asyncpg/connection.py | 1 + 1 file changed, 1 insertion(+) diff --git a/asyncpg/connection.py b/asyncpg/connection.py index dce1675d..0e2b4804 100644 --- a/asyncpg/connection.py +++ b/asyncpg/connection.py @@ -208,6 +208,7 @@ def is_in_transaction(self): """Return True if Connection is currently inside a transaction :return bool: True if inside transaction, False otherwise + .. versionadded:: 0.16.0 """ return self._top_xact is not None or self._protocol.is_in_transaction() From d584784bb52a281f0ae71a933af5a3cc0f37241a Mon Sep 17 00:00:00 2001 From: bcaudell95 Date: Tue, 29 May 2018 18:21:46 -0700 Subject: [PATCH 4/5] changed conditional for in_transaction --- asyncpg/connection.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asyncpg/connection.py b/asyncpg/connection.py index 0e2b4804..a0dfae8b 100644 --- a/asyncpg/connection.py +++ b/asyncpg/connection.py @@ -210,7 +210,7 @@ def is_in_transaction(self): :return bool: True if inside transaction, False otherwise .. versionadded:: 0.16.0 """ - return self._top_xact is not None or self._protocol.is_in_transaction() + return self._protocol.is_in_transaction() async def execute(self, query: str, *args, timeout: float=None) -> str: """Execute an SQL command (or commands). From 117cac51be533e335315f2385c54e59fd19a2717 Mon Sep 17 00:00:00 2001 From: bcaudell95 Date: Wed, 30 May 2018 08:58:26 -0700 Subject: [PATCH 5/5] fixed comments --- asyncpg/connection.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/asyncpg/connection.py b/asyncpg/connection.py index a0dfae8b..ea1a86fa 100644 --- a/asyncpg/connection.py +++ b/asyncpg/connection.py @@ -205,9 +205,9 @@ def transaction(self, *, isolation='read_committed', readonly=False, return transaction.Transaction(self, isolation, readonly, deferrable) def is_in_transaction(self): - """Return True if Connection is currently inside a transaction + """Return True if Connection is currently inside a transaction. - :return bool: True if inside transaction, False otherwise + :return bool: True if inside transaction, False otherwise. .. versionadded:: 0.16.0 """ return self._protocol.is_in_transaction()