[Checkins] SVN: z3c.sqlalchemy/trunk/src/z3c/sqlalchemy/ added lazy
registration of the wrapper as named utility
Andreas Jung
andreas at andreas-jung.com
Fri Apr 20 05:55:13 EDT 2007
Log message for revision 74257:
added lazy registration of the wrapper as named utility
in order to get around late ZCML initialization within Zope 2
Changed:
U z3c.sqlalchemy/trunk/src/z3c/sqlalchemy/CHANGES.txt
U z3c.sqlalchemy/trunk/src/z3c/sqlalchemy/tests/testSQLAlchemy.py
U z3c.sqlalchemy/trunk/src/z3c/sqlalchemy/util.py
-=-
Modified: z3c.sqlalchemy/trunk/src/z3c/sqlalchemy/CHANGES.txt
===================================================================
--- z3c.sqlalchemy/trunk/src/z3c/sqlalchemy/CHANGES.txt 2007-04-19 16:51:47 UTC (rev 74256)
+++ z3c.sqlalchemy/trunk/src/z3c/sqlalchemy/CHANGES.txt 2007-04-20 09:55:10 UTC (rev 74257)
@@ -8,6 +8,9 @@
- fixed the documentation a bit
- added registerMapper() to BaseWrapper class
+
+ - registerSQLAlchemyWrapper() now defers the registration until
+ the Wrapper is used first when calling getSQLAlchemyWrapper()
0.1.6 (28.03.2007)
Modified: z3c.sqlalchemy/trunk/src/z3c/sqlalchemy/tests/testSQLAlchemy.py
===================================================================
--- z3c.sqlalchemy/trunk/src/z3c/sqlalchemy/tests/testSQLAlchemy.py 2007-04-19 16:51:47 UTC (rev 74256)
+++ z3c.sqlalchemy/trunk/src/z3c/sqlalchemy/tests/testSQLAlchemy.py 2007-04-20 09:55:10 UTC (rev 74257)
@@ -22,7 +22,7 @@
from z3c.sqlalchemy.interfaces import ISQLAlchemyWrapper
from z3c.sqlalchemy.postgres import PythonPostgresWrapper, ZopePostgresWrapper
from z3c.sqlalchemy.base import BaseWrapper
-from z3c.sqlalchemy import createSQLAlchemyWrapper, Model, registerSQLAlchemyWrapper
+from z3c.sqlalchemy import createSQLAlchemyWrapper, Model, registerSQLAlchemyWrapper, getSQLAlchemyWrapper
class WrapperTests(unittest.TestCase):
@@ -119,12 +119,16 @@
except sqlalchemy.exceptions.NoSuchTableError:
pass
-
def testWrapperRegistration(self):
wrapper = createSQLAlchemyWrapper('sqlite:///test')
registerSQLAlchemyWrapper(wrapper, 'test.wrapper')
- wrapper2 = getUtility(ISQLAlchemyWrapper, 'test.wrapper')
+ wrapper2 = getSQLAlchemyWrapper('test.wrapper')
self.assertEqual(wrapper, wrapper2)
+
+ def testWrapperRegistrationFailing(self):
+ wrapper = createSQLAlchemyWrapper('sqlite:///test')
+ registerSQLAlchemyWrapper(wrapper, 'test.wrapper')
+ self.assertRaises(ValueError, getSQLAlchemyWrapper, 'test.wrapperNonExistant')
def test_suite():
Modified: z3c.sqlalchemy/trunk/src/z3c/sqlalchemy/util.py
===================================================================
--- z3c.sqlalchemy/trunk/src/z3c/sqlalchemy/util.py 2007-04-19 16:51:47 UTC (rev 74256)
+++ z3c.sqlalchemy/trunk/src/z3c/sqlalchemy/util.py 2007-04-20 09:55:10 UTC (rev 74257)
@@ -14,7 +14,7 @@
from sqlalchemy.engine.url import make_url
-from zope.component import getService, getGlobalServices, getUtilitiesFor
+from zope.component import getService, getGlobalServices, getUtilitiesFor, getUtility
from zope.component.utility import GlobalUtilityService
from zope.component.interfaces import IUtilityService, ComponentLookupError
from zope.component.servicenames import Utilities
@@ -23,8 +23,9 @@
from z3c.sqlalchemy.postgres import ZopePostgresWrapper, PythonPostgresWrapper
from z3c.sqlalchemy.base import BaseWrapper
-__all__ = ('createSQLAlchemyWrapper', 'registerSQLAlchemyWrapper', 'allRegisteredSQLAlchemyWrappers')
+__all__ = ('createSQLAlchemyWrapper', 'registerSQLAlchemyWrapper', 'allRegisteredSQLAlchemyWrappers', 'getSQLAlchemyWrapper')
+registeredWrappers = {}
def createSQLAlchemyWrapper(dsn, model=None, forZope=False, **kw):
""" Convenience method to generate a wrapper for a DSN and a model.
@@ -44,6 +45,12 @@
def registerSQLAlchemyWrapper(wrapper, name):
+ """ deferred registration of the wrapper as named utility """
+
+ if not registeredWrappers.has_key(name):
+ registeredWrappers[name] = wrapper
+
+def _registerSQLAlchemyWrapper(wrapper, name):
""" register a SQLAlchemyWrapper as named utility """
try:
@@ -66,6 +73,20 @@
utilityService.provideUtility(ISQLAlchemyWrapper, wrapper, name)
+
+def getSQLAlchemyWrapper(name):
+
+ if not registeredWrappers.has_key(name):
+ raise ValueError('No registered SQLAlchemyWrapper with name %s found' % name)
+
+ try:
+ return getUtility(ISQLAlchemyWrapper, name)
+ except ComponentLookupError:
+ wrapper = registeredWrappers[name]
+ _registerSQLAlchemyWrapper(wrapper, name)
+ return wrapper
+
+
def allRegisteredSQLAlchemyWrappers():
""" return a dict containing information for all
registered wrappers.
More information about the Checkins
mailing list