diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2016-01-06 17:20:57 -0500 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2016-01-06 17:20:57 -0500 |
commit | c8b7729338ba32a726be72b5409b4651326042e9 (patch) | |
tree | 35ec5496df037b60ba5fcc4e2cc5bda54f5bc942 /test/engine/test_parseconnect.py | |
parent | cfb631e0897cf3a8cde67c120eed431eaa5f841d (diff) | |
download | sqlalchemy-c8b7729338ba32a726be72b5409b4651326042e9.tar.gz |
- Added a new entrypoint system to the engine to allow "plugins" to
be stated in the query string for a URL. Custom plugins can
be written which will be given the chance up front to alter and/or
consume the engine's URL and keyword arguments, and then at engine
create time will be given the engine itself to allow additional
modifications or event registration. Plugins are written as a
subclass of :class:`.CreateEnginePlugin`; see that class for
details.
fixes #3536
Diffstat (limited to 'test/engine/test_parseconnect.py')
-rw-r--r-- | test/engine/test_parseconnect.py | 43 |
1 files changed, 35 insertions, 8 deletions
diff --git a/test/engine/test_parseconnect.py b/test/engine/test_parseconnect.py index 4601a6bda..0e1f6c3d2 100644 --- a/test/engine/test_parseconnect.py +++ b/test/engine/test_parseconnect.py @@ -6,8 +6,8 @@ import sqlalchemy as tsa from sqlalchemy.testing import fixtures from sqlalchemy import testing from sqlalchemy.testing.mock import Mock, MagicMock, call -from sqlalchemy import event -from sqlalchemy import select +from sqlalchemy.dialects import registry +from sqlalchemy.dialects import plugins dialect = None @@ -172,7 +172,6 @@ class CreateEngineTest(fixtures.TestBase): def test_engine_from_config_custom(self): from sqlalchemy import util - from sqlalchemy.dialects import registry tokens = __name__.split(".") class MyDialect(MockDialect): @@ -325,21 +324,18 @@ class CreateEngineTest(fixtures.TestBase): class TestRegNewDBAPI(fixtures.TestBase): def test_register_base(self): - from sqlalchemy.dialects import registry registry.register("mockdialect", __name__, "MockDialect") e = create_engine("mockdialect://") assert isinstance(e.dialect, MockDialect) def test_register_dotted(self): - from sqlalchemy.dialects import registry registry.register("mockdialect.foob", __name__, "MockDialect") e = create_engine("mockdialect+foob://") assert isinstance(e.dialect, MockDialect) def test_register_legacy(self): - from sqlalchemy.dialects import registry tokens = __name__.split(".") global dialect @@ -351,7 +347,6 @@ class TestRegNewDBAPI(fixtures.TestBase): assert isinstance(e.dialect, MockDialect) def test_register_per_dbapi(self): - from sqlalchemy.dialects import registry registry.register("mysql.my_mock_dialect", __name__, "MockDialect") e = create_engine("mysql+my_mock_dialect://") @@ -367,7 +362,6 @@ class TestRegNewDBAPI(fixtures.TestBase): WrapperFactory = Mock() WrapperFactory.get_dialect_cls.side_effect = get_dialect_cls - from sqlalchemy.dialects import registry registry.register("wrapperdialect", __name__, "WrapperFactory") from sqlalchemy.dialects import sqlite @@ -384,6 +378,39 @@ class TestRegNewDBAPI(fixtures.TestBase): ] ) + @testing.requires.sqlite + def test_plugin_registration(self): + from sqlalchemy.dialects import sqlite + + global MyEnginePlugin + + def side_effect(url, kw): + eq_(kw, {"logging_name": "foob"}) + kw['logging_name'] = 'bar' + return MyEnginePlugin + + MyEnginePlugin = Mock(side_effect=side_effect) + + plugins.register("engineplugin", __name__, "MyEnginePlugin") + + e = create_engine( + "sqlite:///?plugin=engineplugin&foo=bar", logging_name='foob') + eq_(e.dialect.name, "sqlite") + eq_(e.logging_name, "bar") + assert isinstance(e.dialect, sqlite.dialect) + + eq_( + MyEnginePlugin.mock_calls, + [ + call(e.url, {}), + call.engine_created(e) + ] + ) + eq_( + str(MyEnginePlugin.mock_calls[0][1][0]), + "sqlite:///?foo=bar" + ) + class MockDialect(DefaultDialect): @classmethod |