From df6bf3401266f42271627c1e408f87c71a06cef7 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Tue, 12 Jun 2018 13:26:39 -0400 Subject: Rename enginefacade.async to enginefacade.async_ Python 3.7 now makes "async" a keyword, so deprecate the "async" name and replace with "async_". Additionally, use attribute name access only in order to implement and test "async" as it won't work under Python 3.7. Closes-Bug: #1775866 Change-Id: Ifb2c59c2cfbd615b04570b31fcfe868f4ffea3c6 --- oslo_db/sqlalchemy/enginefacade.py | 14 +++++++++++- oslo_db/tests/sqlalchemy/test_enginefacade.py | 31 ++++++++++++++++++++++----- 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/oslo_db/sqlalchemy/enginefacade.py b/oslo_db/sqlalchemy/enginefacade.py index 2b9f81e..481e166 100644 --- a/oslo_db/sqlalchemy/enginefacade.py +++ b/oslo_db/sqlalchemy/enginefacade.py @@ -17,6 +17,7 @@ import operator import threading import warnings +import debtcollector.moves import debtcollector.removals import debtcollector.renames from oslo_config import cfg @@ -965,7 +966,7 @@ class _TransactionContextManager(object): return self._clone(connection=True) @property - def async(self): + def async_(self): """Modifier to set a READER operation to ASYNC_READER.""" if self._mode is _WRITER: @@ -1049,6 +1050,17 @@ class _TransactionContextManager(object): transaction_contexts_by_thread.current = restore +@property +@debtcollector.moves.moved_property("async_") +def async_compat(self): + return self.async_ + +setattr( + _TransactionContextManager, + "async", async_compat +) + + def _context_descriptor(attr=None): getter = operator.attrgetter(attr) diff --git a/oslo_db/tests/sqlalchemy/test_enginefacade.py b/oslo_db/tests/sqlalchemy/test_enginefacade.py index ced9483..cab7547 100644 --- a/oslo_db/tests/sqlalchemy/test_enginefacade.py +++ b/oslo_db/tests/sqlalchemy/test_enginefacade.py @@ -15,6 +15,7 @@ import contextlib import copy import fixtures import pickle +import sys import warnings import mock @@ -607,7 +608,7 @@ class MockFacadeTest(oslo_test_base.BaseTestCase): def test_async_on_writer_raises(self): exc = self.assertRaises( - TypeError, getattr, enginefacade.writer, "async" + TypeError, getattr, enginefacade.writer, "async_" ) self.assertEqual( "Setting async on a WRITER makes no sense", @@ -626,7 +627,7 @@ class MockFacadeTest(oslo_test_base.BaseTestCase): def test_reader_nested_in_async_reader_raises(self): context = oslo_context.RequestContext() - @enginefacade.reader.async + @enginefacade.reader.async_ def go1(context): context.session.execute("test1") go2(context) @@ -647,7 +648,7 @@ class MockFacadeTest(oslo_test_base.BaseTestCase): def test_reader_allow_async_nested_in_async_reader(self): context = oslo_context.RequestContext() - @enginefacade.reader.async + @enginefacade.reader.async_ def go1(context): context.session.execute("test1") go2(context) @@ -701,7 +702,7 @@ class MockFacadeTest(oslo_test_base.BaseTestCase): def test_writer_nested_in_async_reader_raises(self): context = oslo_context.RequestContext() - @enginefacade.reader.async + @enginefacade.reader.async_ def go1(context): context.session.execute("test1") go2(context) @@ -741,10 +742,30 @@ class MockFacadeTest(oslo_test_base.BaseTestCase): with self._assert_writer_session(makers) as session: session.execute("test2") + def test_deprecated_async_reader_name(self): + if sys.version_info >= (3, 7): + self.skipTest("Test only runs on Python < 3.7") + + context = oslo_context.RequestContext() + + old = getattr(enginefacade.reader, "async") + + @old + def go1(context): + context.session.execute("test1") + + go1(context) + + with self._assert_engines() as engines: + with self._assert_makers(engines) as makers: + with self._assert_async_reader_session( + makers, assert_calls=False) as session: + session.execute("test1") + def test_async_reader_then_reader_ok(self): context = oslo_context.RequestContext() - @enginefacade.reader.async + @enginefacade.reader.async_ def go1(context): context.session.execute("test1") -- cgit v1.2.1