[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