[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