[Zope-CMF] Re: Plone needs a release this week

yuppie y.2007- at wcm-solutions.de
Tue Aug 7 06:02:12 EDT 2007


Hi!


Wichert Akkerman wrote:
> Previously yuppie wrote:
>> Wichert Akkerman wrote:
>>> Previously yuppie wrote:
>>>> - The exports created by the new components handler are still flawed, 
>>>> ISiteRoot and placeless components are not exported correctly.
>>> I'm quite sure I fixed that: I was able to export the components and
>>> import them again. Has that been broken since?
>> Don't know since when these things are broken, but in the latest code 
>> there are these 2 bugs:
>>
>>
>> 1.) Exporting the ISiteRoot utility, 'object' should be empty. But I get 
>> this instead:
>>
>>   <utility interface="Products.CMFCore.interfaces._content.ISiteRoot"
>>      object="SITE_ID"/>
>>
>>
>> 2.) By placeless components I mean something like this:
>>
>>   <utility component="foo.bar" interface="foo.IBar"/>
>>
>> The import works fine, but the export looks like this:
>>
>>   <utility factory="foo.Bar" interface="foo.IBar"/>

Attached is a diff for test_components.py. Unfortunately the 
AssertionErrors are a bit cryptic, but they show that the factory is 
exported instead of the component.

> I get something else: if I import this:
> 
>   <utility interface="foo.IBar" factory="foo.bar"/>
> 
> the export looks like this:
> 
>   <utility interface="foo.IBar" object=""/>

That seems to be a similar but different bug.

> this is caused by the zope.component.registerUtility not storing the
> factory method but the return value from the factory, so we no longer
> have the factory method available when we export.
> 
> The only way to fix that appears to be for us to keep a a registry of
> factory methods in the setup tool. That may be too big of a change
> in a minor release though.

Not sure if your issue is a problem in real life. AFAICS this only 
happens if you use a factory that is meant for ZODB objects. In that 
case you should register an object.

> So my vote would be: document that exporting of utility factories is
> currently not supported and will be fixed in GenericSetup 1.4 and
> tag the current code as 1.3.1.

I'm fine with that.


Cheers,

	Yuppie

-------------- next part --------------
Index: Products/GenericSetup/tests/test_components.py
===================================================================
--- Products/GenericSetup/tests/test_components.py	(revision 78655)
+++ Products/GenericSetup/tests/test_components.py	(working copy)
@@ -69,6 +69,8 @@
     def verify(self):
         return True
 
+dummy_utility = DummyUtility()
+
 
 class DummyTool(SimpleItem):
     """A dummy tool."""
@@ -113,6 +115,9 @@
   <utility name="dummy tool name2"
      interface="Products.GenericSetup.tests.test_components.IDummyInterface"
      object="dummy_tool2"/>
+  <utility name="dummy utility name"
+     component="Products.GenericSetup.tests.test_components.dummy_utility"
+     interface="Products.GenericSetup.tests.test_components.IDummyInterface"/>
   <utility name="foo"
      factory="Products.GenericSetup.tests.test_components.DummyUtility"
      interface="Products.GenericSetup.tests.test_components.IDummyInterface"/>
@@ -135,6 +140,9 @@
         tool2 = aq_base(self.app['dummy_tool2'])
         obj.registerUtility(tool2, IDummyInterface, name=u'dummy tool name2')
 
+        obj.registerUtility(dummy_utility, IDummyInterface,
+                            name=u'dummy utility name')
+
     def test_body_get(self):
         self._populate(self._obj)
         context = DummyExportContext(self.app)
@@ -171,6 +179,10 @@
         self.failUnless(IDummyInterface.providedBy(util))
         self.failUnless(util.verify())
 
+        util = queryUtility(IDummyInterface, name=u'dummy utility name')
+        self.failUnless(IDummyInterface.providedBy(util))
+        self.failUnless(util.verify())
+
         util = queryUtility(IDummyInterface)
         self.failUnless(IDummyInterface.providedBy(util))
         self.failUnless(util.verify())


More information about the Zope-CMF mailing list