diff options
author | Jenkins <jenkins@review.openstack.org> | 2014-10-02 17:01:16 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2014-10-02 17:01:16 +0000 |
commit | abecb9ea1a987ea87baf243e0bae42c6a7ec7ecc (patch) | |
tree | 19ee77d572e021cf5a1088b38d62c17d7d742099 | |
parent | a7b3522477356d5bdf25294f41f7b3090648d4d6 (diff) | |
parent | 7a3e091c1c9cc9ae6e34279c7c99c9989afd8894 (diff) | |
download | oslo-db-abecb9ea1a987ea87baf243e0bae42c6a7ec7ecc.tar.gz |
Merge "Unwrap DialectFunctionDispatcher from itself."
-rw-r--r-- | oslo/db/sqlalchemy/utils.py | 3 | ||||
-rw-r--r-- | tests/sqlalchemy/test_utils.py | 35 |
2 files changed, 38 insertions, 0 deletions
diff --git a/oslo/db/sqlalchemy/utils.py b/oslo/db/sqlalchemy/utils.py index adc9bef..71cd1ea 100644 --- a/oslo/db/sqlalchemy/utils.py +++ b/oslo/db/sqlalchemy/utils.py @@ -899,6 +899,9 @@ class DialectFunctionDispatcher(object): def dispatch_for(self, expr): def decorate(fn): dbname, driver = self._parse_dispatch(expr) + if fn is self: + fn = fn._last + self._last = fn self._register(expr, dbname, driver, fn) return self return decorate diff --git a/tests/sqlalchemy/test_utils.py b/tests/sqlalchemy/test_utils.py index a4cd3f2..742cd38 100644 --- a/tests/sqlalchemy/test_utils.py +++ b/tests/sqlalchemy/test_utils.py @@ -990,6 +990,41 @@ class TestDialectFunctionDispatcher(test_base.BaseTestCase): callable_fn.mock_calls ) + def test_multiple_nesting(self): + callable_fn = mock.Mock( + default=mock.Mock(return_value=None), + mysql=mock.Mock(return_value=None) + ) + + dispatcher = utils.dispatch_for_dialect("*", multiple=True)( + callable_fn.default) + + dispatcher = dispatcher.dispatch_for("mysql+mysqlconnector")( + dispatcher.dispatch_for("mysql+mysqldb")( + callable_fn.mysql + ) + ) + + mysqldb_url = sqlalchemy.engine.url.make_url("mysql+mysqldb://") + mysqlconnector_url = sqlalchemy.engine.url.make_url( + "mysql+mysqlconnector://") + sqlite_url = sqlalchemy.engine.url.make_url("sqlite://") + + dispatcher(mysqldb_url, 1) + dispatcher(mysqlconnector_url, 2) + dispatcher(sqlite_url, 3) + + self.assertEqual( + [ + mock.call.mysql(mysqldb_url, 1), + mock.call.default(mysqldb_url, 1), + mock.call.mysql(mysqlconnector_url, 2), + mock.call.default(mysqlconnector_url, 2), + mock.call.default(sqlite_url, 3) + ], + callable_fn.mock_calls + ) + def test_single_retval(self): dispatcher, callable_fn = self._single_fixture() callable_fn.mysql_mysqldb.return_value = 5 |