Michael Bayer wrote: > i think using entry points to load in external database dialects is a > great idea. > > though the current six core dialects i think i still want to load via > __import__ though since im a big fan of running SA straight out of > the source directory (and therefore thered be no entry points for > those in that case). > > so probably a check via __import__('sqlalchemy.databases') first, > then an entry point lookup. does that work ?
Here is a patch that implements use of entry points to load dialects. The largest change is actually adding a get_dialect to replace the functionality of get_module, since entry points really want to return classes, and we only ever use the dialect class from the returned module anyway... This does not break code that I have that loads the mysql dialect, and it does work with my new code that adds a new dialect - although I suppose it's possible it could have broken something I didn't find. As a side note, I agree with Gaetan - you can run entry points and stuff out of the current directory, especially if you use setup.py develop ... but this code does the entry points second, after a check for the module the old way. Monty --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---
=== modified file 'lib/sqlalchemy/engine/strategies.py' --- lib/sqlalchemy/engine/strategies.py 2007-02-25 22:44:52 +0000 +++ lib/sqlalchemy/engine/strategies.py 2007-03-26 17:03:13 +0000 @@ -42,16 +42,16 @@ u = url.make_url(name_or_url) # get module from sqlalchemy.databases - module = u.get_module() + dialect_cls = u.get_dialect() dialect_args = {} # consume dialect arguments from kwargs - for k in util.get_cls_kwargs(module.dialect): + for k in util.get_cls_kwargs(dialect_cls): if k in kwargs: dialect_args[k] = kwargs.pop(k) # create dialect - dialect = module.dialect(**dialect_args) + dialect = dialect_cls(**dialect_args) # assemble connection arguments (cargs, cparams) = dialect.create_connect_args(u) @@ -71,7 +71,7 @@ raise exceptions.DBAPIError("Connection failed", e) creator = kwargs.pop('creator', connect) - poolclass = kwargs.pop('poolclass', getattr(module, 'poolclass', poollib.QueuePool)) + poolclass = kwargs.pop('poolclass', getattr(dialect_cls, 'poolclass', poollib.QueuePool)) pool_args = {} # consume pool arguments from kwargs, translating a few of the arguments for k in util.get_cls_kwargs(poolclass): === modified file 'lib/sqlalchemy/engine/url.py' --- lib/sqlalchemy/engine/url.py 2007-03-18 22:35:19 +0000 +++ lib/sqlalchemy/engine/url.py 2007-03-26 16:47:01 +0000 @@ -2,6 +2,7 @@ import cgi import sys import urllib +import pkg_resources from sqlalchemy import exceptions """Provide the URL object as well as the make_url parsing function.""" @@ -69,6 +70,23 @@ s += '?' + "&".join(["%s=%s" % (k, self.query[k]) for k in keys]) return s + def get_dialect(self): + """Return the SQLAlchemy database dialect class corresponding to this URL's driver name.""" + dialect=None + try: + module=getattr(__import__('sqlalchemy.databases.%s' % self.drivername).databases, self.drivername) + dialect=module.dialect + except ImportError: + if sys.exc_info()[2].tb_next is None: + for res in pkg_resources.iter_entry_points('sqlalchemy.databases'): + if res.name==self.drivername: + dialect=res.load() + else: + raise + if dialect is not None: + return dialect + raise exceptions.ArgumentError('unknown database %r' % self.drivername) + def get_module(self): """Return the SQLAlchemy database module corresponding to this URL's driver name.""" try: === modified file 'setup.py' --- setup.py 2007-03-23 21:33:24 +0000 +++ setup.py 2007-03-26 17:01:51 +0000 @@ -10,6 +10,10 @@ url = "http://www.sqlalchemy.org", packages = find_packages('lib'), package_dir = {'':'lib'}, + entry_points = { + 'sqlalchemy.databases': [ + '%s = sqlalchemy.databases.%s:dialect' % (f,f) for f in + ['sqlite', 'postgres', 'mysql', 'oracle', 'mssql', 'firebird']]}, license = "MIT License", long_description = """\ SQLAlchemy is: