summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2014-10-02 17:01:16 +0000
committerGerrit Code Review <review@openstack.org>2014-10-02 17:01:16 +0000
commitabecb9ea1a987ea87baf243e0bae42c6a7ec7ecc (patch)
tree19ee77d572e021cf5a1088b38d62c17d7d742099
parenta7b3522477356d5bdf25294f41f7b3090648d4d6 (diff)
parent7a3e091c1c9cc9ae6e34279c7c99c9989afd8894 (diff)
downloadoslo-db-abecb9ea1a987ea87baf243e0bae42c6a7ec7ecc.tar.gz
Merge "Unwrap DialectFunctionDispatcher from itself."
-rw-r--r--oslo/db/sqlalchemy/utils.py3
-rw-r--r--tests/sqlalchemy/test_utils.py35
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