[Zope-Checkins] SVN: Products.Five/branches/1.2/ Merge Lennart's regebro-localutility-fix branch to Five 1.2 as well.

Philipp von Weitershausen philikon at philikon.de
Sun Mar 26 17:12:11 EST 2006


Log message for revision 66207:
  Merge Lennart's regebro-localutility-fix branch to Five 1.2 as well.
  

Changed:
  U   Products.Five/branches/1.2/CHANGES.txt
  U   Products.Five/branches/1.2/site/tests/test_utility.py
  U   Products.Five/branches/1.2/site/utility.py

-=-
Modified: Products.Five/branches/1.2/CHANGES.txt
===================================================================
--- Products.Five/branches/1.2/CHANGES.txt	2006-03-26 22:01:24 UTC (rev 66206)
+++ Products.Five/branches/1.2/CHANGES.txt	2006-03-26 22:12:10 UTC (rev 66207)
@@ -2,6 +2,12 @@
 Five Changes
 ============
 
+Five 1.2.1 (2006-03-26)
+=======================
+
+* A local utility registered with an derived interface will now be available
+  by the inherited interface as well, in the same way as Zope3.
+
 Five 1.2.1 (2006-02-25)
 =======================
 

Modified: Products.Five/branches/1.2/site/tests/test_utility.py
===================================================================
--- Products.Five/branches/1.2/site/tests/test_utility.py	2006-03-26 22:01:24 UTC (rev 66206)
+++ Products.Five/branches/1.2/site/tests/test_utility.py	2006-03-26 22:12:10 UTC (rev 66207)
@@ -76,9 +76,10 @@
     def test_getUtilitiesNoUtilitiesFolder(self):
         utils = zapi.getService(Utilities)
         #XXX test whether utils really is a local utility service...
-        self.assertRaises(ComponentLookupError, utils.getUtility, IDummyUtility)
+        self.failUnless(utils.queryUtility(IDummyUtility) is None)
         self.assertEquals(list(utils.getUtilitiesFor(IDummyUtility)), [])
-        self.assertEquals(list(utils.getAllUtilitiesRegisteredFor(IDummyUtility)), [])
+        self.assertEquals(list(utils.getAllUtilitiesRegisteredFor(IDummyUtility)),
+                          [])
 
     def test_registerUtilityOnUtilityService(self):
         utils = zapi.getService(Utilities)
@@ -116,6 +117,49 @@
         self.assertEquals(zapi.getUtility(ISuperDummyUtility, 'dummy'),
                           superdummy)
 
+    def test_derivedInterfaceRegistration(self):
+        # Utilities providing a derived interface should be listed
+        # when you ask for an interface. So ask for IDummmyInterace, and
+        # anything registered for IDummyInterface of ISuperDummyInterface
+        # should come back.
+
+        sm = zapi.getServices()
+        self.failUnless(IRegisterUtilitySimply.providedBy(sm))
+        dummy = DummyUtility()
+        superdummy = DummyUtility()
+        directlyProvides(superdummy, ISuperDummyUtility)
+        uts = list(zapi.getUtilitiesFor(IDummyUtility))
+        self.failUnlessEqual(uts, [])
+
+        sm.registerUtility(ISuperDummyUtility, superdummy)
+        
+        # We should be able to access this utility both with 
+        # IDummyUtility and ISuperDummyUtility interfaces:
+        uts = list(zapi.getUtilitiesFor(IDummyUtility))
+        self.failUnless(uts[0][1].aq_base is superdummy)
+        uts = list(zapi.getUtilitiesFor(ISuperDummyUtility))
+        self.failUnless(uts[0][1].aq_base is superdummy)
+        
+        # Also try that the standard zapi call works:
+        ut = zapi.getUtility(IDummyUtility, context=self.folder.site)
+        self.failUnless(ut.aq_base is superdummy)
+        ut = zapi.getUtility(ISuperDummyUtility, context=self.folder.site)
+        self.failUnless(ut.aq_base is superdummy)
+    
+        # If we register a second utility we should find both utilities
+        # when looking for the base interface
+        sm.registerUtility(IDummyUtility, dummy)
+
+        uts = list(zapi.getAllUtilitiesRegisteredFor(IDummyUtility))
+        self.failUnless(dummy in uts)
+        self.failUnless(superdummy in uts)
+
+        # But we should find only one when looking for the derived interface
+        uts = list(zapi.getAllUtilitiesRegisteredFor(ISuperDummyUtility))
+        self.failUnless(dummy not in uts)
+        self.failUnless(superdummy in uts)
+
+
     def test_nestedSitesDontConflictButStillAcquire(self):
         # let's register a dummy utility in the dummy site
         dummy = DummyUtility()

Modified: Products.Five/branches/1.2/site/utility.py
===================================================================
--- Products.Five/branches/1.2/site/utility.py	2006-03-26 22:01:24 UTC (rev 66206)
+++ Products.Five/branches/1.2/site/utility.py	2006-03-26 22:12:10 UTC (rev 66207)
@@ -52,29 +52,26 @@
     def queryUtility(self, interface, name='', default=None):
         """See IUtilityService interface
         """
-        if name == '':
-            # Singletons. Only one per interface allowed, so, let's call it
-            # by the interface.
-            id = interface.getName()
-        else:
-            id = interface.getName() + '-' + name
-
         if getattr(aq_base(self.context), 'utilities', None) is not None:
-            utility = self.context.utilities._getOb(id, None)
-            if utility is not None:
-                return utility
+            for id, utility in self.context.utilities.objectItems():
+                if interface.providedBy(utility):
+                    if id.find('-') != -1:
+                        prefix, utility_name = id.split('-', 1)
+                    else:
+                        utility_name = ''
+                    if name == utility_name:
+                        return utility
         return self.next.queryUtility(interface, name, default)
 
     def getUtilitiesFor(self, interface):
         names = []
-        prefix = interface.getName() + '-'
         if getattr(aq_base(self.context), 'utilities', None) is not None:
-            for name, utility in self.context.utilities.objectItems():
-                if name == interface.getName():
-                    names.append('')
-                    yield '', utility
-                elif name.startswith(prefix):
-                    name = name[len(prefix):]
+            for id, utility in self.context.utilities.objectItems():
+                if interface.providedBy(utility):
+                    if id.find('-') != -1:
+                        prefix, name = id.split('-', 1)
+                    else:
+                        name = ''
                     names.append(name)
                     yield (name, utility)
         for name, utility in self.next.getUtilitiesFor(interface):



More information about the Zope-Checkins mailing list