Michael Bayer wrote:
> ok anyway, im behind on patches (which i like to test and stuff) so
> ive added ticket 521 to my "in queue" list.
> 
> if youd like to add a short unit test script that would be handy
> (otherwise we might not have test coverage for the setuptools portion
> of the feature).

Ok. I'll put that in my queue. I hate queues.


> On Mar 28, 12:26 pm, Monty Taylor <[EMAIL PROTECTED]> wrote:
>> Michael Bayer wrote:
>>> dialects can be used on their own without the engine being present
>>> (such as, to generate SQL), also you can construct an engine passing
>>> in your own module object which might have been procured from
>>> somewhere else (or could be a mock object,for example).
>> Ok, yes indeed. Those are good reasons. :)
>>
>>> On Mar 26, 2007, at 11:45 PM, Monty Taylor wrote:
>>>> Always one in every bunch. :)
>>>> I hear what you're saying about the import errors. But does it really
>>>> help to allow work to get done before throwing the error? I would
>>>> think
>>>> you'd want to know right up front if you don't have a driver loaded
>>>> rather then letting a program actually get started up and think you
>>>> can
>>>> write data (think fat client app) only to get a connection exception.
>>>> But I, of course, could be very wrong about this. I am about many
>>>> things...
>>>> Monty
>>>> Michael Bayer wrote:
>>>>> yeah i dont like setup.py develop either :)....but anyway,  patch is
>>>>> good.  one thing i have to nail down though is ticket #480.   the
>>>>> main point of that ticket is to cleanly isolate ImportErrors of
>>>>> actual DBAPI modules apart from the containing dialect module
>>>>> itself.   the dialects are catching all the DBAPI-related
>>>>> ImportErrors though so its not necessarily blocking this patch (its
>>>>> just they cant report them nicely).
>>>>> On Mar 26, 2007, at 1:34 PM, Monty Taylor wrote:
>>>>>> 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
>>>>>> === 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:
> 
> 
> > 


--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to