From a74232c70cd8e3857646038900fc03edf63f0dd8 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sun, 29 Apr 2007 16:56:11 +0000 Subject: [PATCH] - added 'url' attribute to Engine - added docstring to 'echo' attribute --- CHANGES | 2 ++ lib/sqlalchemy/engine/base.py | 7 ++++--- lib/sqlalchemy/engine/default.py | 3 ++- lib/sqlalchemy/engine/strategies.py | 12 ++++++------ lib/sqlalchemy/logging.py | 6 ++++++ test/engine/parseconnect.py | 12 +++++++++++- 6 files changed, 31 insertions(+), 11 deletions(-) diff --git a/CHANGES b/CHANGES index 0cde130960..36817c77fb 100644 --- a/CHANGES +++ b/CHANGES @@ -20,6 +20,8 @@ entry points. loading the built-in database dialects works the same as always, but if none found will fall back to trying pkg_resources to load an external module [ticket:521] + - Engine contains a "url" attribute referencing the url.URL object + used by create_engine(). - sql: - keys() of result set columns are not lowercased, come back exactly as they're expressed in cursor.description. note this diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py index 1cea9ffc35..c2ee0c08d4 100644 --- a/lib/sqlalchemy/engine/base.py +++ b/lib/sqlalchemy/engine/base.py @@ -676,11 +676,12 @@ class Engine(Connectable): self.echo = echo self.logger = logging.instance_logger(self) - name = property(lambda s:sys.modules[s.dialect.__module__].descriptor()['name']) + name = property(lambda s:sys.modules[s.dialect.__module__].descriptor()['name'], doc="String name of the [sqlalchemy.engine#Dialect] in use by this ``Engine``.") engine = property(lambda s:s) - dialect = property(lambda s:s._dialect) + dialect = property(lambda s:s._dialect, doc="the [sqlalchemy.engine#Dialect] in use by this engine.") echo = logging.echo_property() - + url = property(lambda s:s.connection_provider.url, doc="The [sqlalchemy.engine.url#URL] object representing this ``Engine`` object's datasource.") + def dispose(self): self.connection_provider.dispose() diff --git a/lib/sqlalchemy/engine/default.py b/lib/sqlalchemy/engine/default.py index 92bb9ba72f..ae12a8dd0f 100644 --- a/lib/sqlalchemy/engine/default.py +++ b/lib/sqlalchemy/engine/default.py @@ -12,7 +12,8 @@ from sqlalchemy.engine import base """Provide default implementations of the engine interfaces""" class PoolConnectionProvider(base.ConnectionProvider): - def __init__(self, pool): + def __init__(self, url, pool): + self.url = url self._pool = pool def get_connection(self): diff --git a/lib/sqlalchemy/engine/strategies.py b/lib/sqlalchemy/engine/strategies.py index ed31743d8e..7d85de9add 100644 --- a/lib/sqlalchemy/engine/strategies.py +++ b/lib/sqlalchemy/engine/strategies.py @@ -92,7 +92,7 @@ class DefaultEngineStrategy(EngineStrategy): else: pool = pool - provider = self.get_pool_provider(pool) + provider = self.get_pool_provider(u, pool) # create engine. engineclass = self.get_engine_cls() @@ -110,7 +110,7 @@ class DefaultEngineStrategy(EngineStrategy): def pool_threadlocal(self): raise NotImplementedError() - def get_pool_provider(self, pool): + def get_pool_provider(self, url, pool): raise NotImplementedError() def get_engine_cls(self): @@ -123,8 +123,8 @@ class PlainEngineStrategy(DefaultEngineStrategy): def pool_threadlocal(self): return False - def get_pool_provider(self, pool): - return default.PoolConnectionProvider(pool) + def get_pool_provider(self, url, pool): + return default.PoolConnectionProvider(url, pool) def get_engine_cls(self): return base.Engine @@ -138,8 +138,8 @@ class ThreadLocalEngineStrategy(DefaultEngineStrategy): def pool_threadlocal(self): return True - def get_pool_provider(self, pool): - return threadlocal.TLocalConnectionProvider(pool) + def get_pool_provider(self, url, pool): + return threadlocal.TLocalConnectionProvider(url, pool) def get_engine_cls(self): return threadlocal.TLEngine diff --git a/lib/sqlalchemy/logging.py b/lib/sqlalchemy/logging.py index 91326233a6..665a5cff9c 100644 --- a/lib/sqlalchemy/logging.py +++ b/lib/sqlalchemy/logging.py @@ -66,10 +66,16 @@ def is_info_enabled(logger): class echo_property(object): level_map={logging.DEBUG : "debug", logging.INFO:True} + + __doc__ = "when ``True``, enable echoing for this element." + def __get__(self, instance, owner): level = logging.getLogger(_get_instance_name(instance)).getEffectiveLevel() return echo_property.level_map.get(level, False) + def __set__(self, instance, value): + if instance is None: + return self if value: default_logging(_get_instance_name(instance)) logging.getLogger(_get_instance_name(instance)).setLevel(value == 'debug' and logging.DEBUG or logging.INFO) diff --git a/test/engine/parseconnect.py b/test/engine/parseconnect.py index 49f71f8817..967a20ed5d 100644 --- a/test/engine/parseconnect.py +++ b/test/engine/parseconnect.py @@ -125,7 +125,17 @@ class CreateEngineTest(PersistTest): assert False except exceptions.DBAPIError: assert True - + + def testurlattr(self): + """test the url attribute on ``Engine``.""" + + e = create_engine('mysql://scott:tiger@localhost/test', module=MockDBAPI()) + u = url.make_url('mysql://scott:tiger@localhost/test') + e2 = create_engine(u, module=MockDBAPI()) + assert e.url.drivername == e2.url.drivername == 'mysql' + assert e.url.username == e2.url.username == 'scott' + assert e2.url is u + def testpoolargs(self): """test that connection pool args make it thru""" e = create_engine('postgres://', creator=None, pool_recycle=-1, echo_pool=None, auto_close_cursors=False, disallow_open_cursors=True, module=MockDBAPI()) -- 2.47.2