Login | Register For Free | Help
Search for: (Advanced)

Mailing List Archive: Zope: Dev

Re: SVN: zope.component/ Merge wichert-utility-factories branch to trunk

 

 

Zope dev RSS feed   Index | Next | Previous | View Threaded


jh at improva

Jul 24, 2008, 10:41 AM

Post #1 of 6 (324 views)
Permalink
Re: SVN: zope.component/ Merge wichert-utility-factories branch to trunk

Hello

This checkin contains the following change to
zope.component/trunk/src/zope/component/registry.py
which looks wrong to me (it's a noop). It looks to me as if the [:2]
should move outside the ")" following it. I am surprised that this
doesn't break any tests, as it means that reregistrations are not
detected as such.

- if (self._utility_registrations.get((provided, name))
+ if (self._utility_registrations.get((provided, name)[:2])



Wichert Akkerman wrote:
> Log message for revision 88794:
> Merge wichert-utility-factories branch to trunk
>
> Changed:
> D zope.component/branches/wichert-utility-factories/
> U zope.component/trunk/README.txt
> U zope.component/trunk/src/zope/component/interfaces.py
> U zope.component/trunk/src/zope/component/registry.py
> U zope.component/trunk/src/zope/component/registry.txt
> U zope.component/trunk/src/zope/component/zcml.py
>
> -=-
> Modified: zope.component/trunk/README.txt
> ===================================================================
> --- zope.component/trunk/README.txt 2008-07-24 16:00:26 UTC (rev 88793)
> +++ zope.component/trunk/README.txt 2008-07-24 16:17:58 UTC (rev 88794)
> @@ -14,6 +14,10 @@
> 3.5.0 (unreleased)
> ==================
>
> +Support registration of utilities via factories through the component registry
> +and return factory information in the registration information. This fixes
> +https://bugs.launchpad.net/zope3/+bug/240631
> +
> Optimized un/registerUtility via storing an optimized data structure for
> efficient retrieval of already registered utilities. This avoids looping over
> all utilities when registering a new one.
>
> Modified: zope.component/trunk/src/zope/component/interfaces.py
> ===================================================================
> --- zope.component/trunk/src/zope/component/interfaces.py 2008-07-24 16:00:26 UTC (rev 88793)
> +++ zope.component/trunk/src/zope/component/interfaces.py 2008-07-24 16:17:58 UTC (rev 88794)
> @@ -512,6 +512,7 @@
> """Information about the registration of a utility
> """
>
> + factory = interface.Attribute("The factory used to create the utility. Optional.")
> component = interface.Attribute("The object registered")
> provided = interface.Attribute("The interface provided by the component")
>
> @@ -583,9 +584,12 @@
> """Register components
> """
>
> - def registerUtility(component, provided=None, name=u'', info=u''):
> + def registerUtility(component=None, provided=None, name=u'', info=u'', factory=None):
> """Register a utility
>
> + factory
> + Factory for the component to be registerd.
> +
> component
> The registered component
>
> @@ -602,10 +606,11 @@
> An object that can be converted to a string to provide
> information about the registration.
>
> + Only one of component and factory can be used.
> A Registered event is generated with an IUtilityRegistration.
> """
>
> - def unregisterUtility(component=None, provided=None, name=u''):
> + def unregisterUtility(component=None, provided=None, name=u'', factory=None):
> """Unregister a utility
>
> A boolean is returned indicating whether the registry was
> @@ -614,6 +619,9 @@
> None and is not registered, then the function returns
> False, otherwise it returns True.
>
> + factory
> + Factory for the component to be unregisterd.
> +
> component
> The registered component The given component can be
> None, in which case any component registered to provide
> @@ -629,6 +637,7 @@
> name
> The utility name.
>
> + Only one of component and factory can be used.
> An UnRegistered event is generated with an IUtilityRegistration.
> """
>
>
> Modified: zope.component/trunk/src/zope/component/registry.py
> ===================================================================
> --- zope.component/trunk/src/zope/component/registry.py 2008-07-24 16:00:26 UTC (rev 88793)
> +++ zope.component/trunk/src/zope/component/registry.py 2008-07-24 16:17:58 UTC (rev 88794)
> @@ -65,12 +65,17 @@
> lambda self, bases: self._setBases(bases),
> )
>
> - def registerUtility(self, component, provided=None, name=u'', info=u'',
> - event=True):
> + def registerUtility(self, component=None, provided=None, name=u'', info=u'',
> + event=True, factory=None):
> + if factory:
> + if component:
> + raise TypeError("Can't specify factory and component.")
> + component = factory()
> +
> if provided is None:
> provided = _getUtilityProvided(component)
>
> - if (self._utility_registrations.get((provided, name))
> + if (self._utility_registrations.get((provided, name)[:2])
> == (component, info)):
> # already registered
> return
> @@ -81,7 +86,7 @@
> subscribed = True
> break
>
> - self._utility_registrations[(provided, name)] = component, info
> + self._utility_registrations[(provided, name)] = component, info, factory
> self.utilities.register((), provided, name, component)
>
> if not subscribed:
> @@ -89,13 +94,18 @@
>
> if event:
> zope.event.notify(interfaces.Registered(
> - UtilityRegistration(self, provided, name, component, info)
> + UtilityRegistration(self, provided, name, component, info, factory)
> ))
>
> - def unregisterUtility(self, component=None, provided=None, name=u''):
> + def unregisterUtility(self, component=None, provided=None, name=u'', factory=None):
> + if factory:
> + if component:
> + raise TypeError("Can't specify factory and component.")
> + component = factory()
> +
> if provided is None:
> if component is None:
> - raise TypeError("Must specify one of component and provided")
> + raise TypeError("Must specify one of component, factory and provided")
> provided = _getUtilityProvided(component)
>
> old = self._utility_registrations.get((provided, name))
> @@ -118,15 +128,15 @@
> self.utilities.unsubscribe((), provided, component)
>
> zope.event.notify(interfaces.Unregistered(
> - UtilityRegistration(self, provided, name, component, old[1])
> + UtilityRegistration(self, provided, name, component, *old[1:])
> ))
>
> return True
>
> def registeredUtilities(self):
> - for ((provided, name), (component, info)
> + for ((provided, name), data
> ) in self._utility_registrations.iteritems():
> - yield UtilityRegistration(self, provided, name, component, info)
> + yield UtilityRegistration(self, provided, name, *data)
>
> def queryUtility(self, provided, name=u'', default=None):
> return self.utilities.lookup((), provided, name, default)
> @@ -398,18 +408,20 @@
>
> interface.implements(interfaces.IUtilityRegistration)
>
> - def __init__(self, registry, provided, name, component, doc):
> - (self.registry, self.provided, self.name, self.component, self.info
> - ) = registry, provided, name, component, doc
> + def __init__(self, registry, provided, name, component, doc, factory=None):
> + (self.registry, self.provided, self.name, self.component, self.info,
> + self.factory
> + ) = registry, provided, name, component, doc, factory
>
> def __repr__(self):
> - return '%s(%r, %s, %r, %s, %r)' % (
> - self.__class__.__name__,
> - self.registry,
> - getattr(self.provided, '__name__', None), self.name,
> - getattr(self.component, '__name__', `self.component`), self.info,
> - )
> -
> + return '%s(%r, %s, %r, %s, %r, %r)' % (
> + self.__class__.__name__,
> + self.registry,
> + getattr(self.provided, '__name__', None), self.name,
> + getattr(self.component, '__name__', `self.component`),
> + self.factory, self.info,
> + )
> +
> def __cmp__(self, other):
> return cmp(self.__repr__(), other.__repr__())
>
>
> Modified: zope.component/trunk/src/zope/component/registry.txt
> ===================================================================
> --- zope.component/trunk/src/zope/component/registry.txt 2008-07-24 16:00:26 UTC (rev 88793)
> +++ zope.component/trunk/src/zope/component/registry.txt 2008-07-24 16:17:58 UTC (rev 88794)
> @@ -35,7 +35,7 @@
>
> >>> components.registerUtility(tests.U1(1))
> Registered event:
> - UtilityRegistration(<Components comps>, I1, u'', 1, u'')
> + UtilityRegistration(<Components comps>, I1, u'', 1, None, u'')
>
> Here we didn't specify an interface or name. An unnamed utility was
> registered for interface I1, since that is only interface implemented
> @@ -44,6 +44,15 @@
> >>> components.getUtility(tests.I1)
> U1(1)
>
> +You can also register a utility using a factory instead of a utility instance:
> +
> + >>> def factory():
> + ... return tests.U1(1)
> + >>> components.registerUtility(factory=factory)
> + Registered event:
> + UtilityRegistration(<Components comps>, I1, u'', 1, <function factory at <SOME ADDRESS>>, u'')
> +
> +
> If a component implements other than one interface or no interface,
> then an error will be raised:
>
> @@ -66,13 +75,13 @@
>
> >>> components.registerUtility(tests.U12(2), tests.I2)
> Registered event:
> - UtilityRegistration(<Components comps>, I2, u'', 2, u'')
> + UtilityRegistration(<Components comps>, I2, u'', 2, None, u'')
>
> and we can specify a name:
>
> >>> components.registerUtility(tests.U12(3), tests.I2, u'three')
> Registered event:
> - UtilityRegistration(<Components comps>, I2, u'three', 3, u'')
> + UtilityRegistration(<Components comps>, I2, u'three', 3, None, u'')
>
> >>> components.getUtility(tests.I2)
> U12(2)
> @@ -113,7 +122,7 @@
>
> >>> components.registerUtility(tests.U1(4), info=u'use 4 now')
> Registered event:
> - UtilityRegistration(<Components comps>, I1, u'', 4, u'use 4 now')
> + UtilityRegistration(<Components comps>, I1, u'', 4, None, u'use 4 now')
> >>> components.getUtility(tests.I1)
> U1(4)
>
> @@ -135,7 +144,7 @@
>
> >>> components.unregisterUtility(provided=tests.I1)
> Unregistered event:
> - UtilityRegistration(<Components comps>, I1, u'', 4, u'use 4 now')
> + UtilityRegistration(<Components comps>, I1, u'', 4, None, u'use 4 now')
> True
>
> A boolean is returned indicating whether anything changed:
> @@ -155,14 +164,14 @@
> >>> u5 = tests.U1(5)
> >>> components.registerUtility(u5)
> Registered event:
> - UtilityRegistration(<Components comps>, I1, u'', 5, u'')
> + UtilityRegistration(<Components comps>, I1, u'', 5, None, u'')
> >>> components.unregisterUtility(tests.U1(6))
> False
> >>> components.queryUtility(tests.I1)
> U1(5)
> >>> components.unregisterUtility(u5)
> Unregistered event:
> - UtilityRegistration(<Components comps>, I1, u'', 5, u'')
> + UtilityRegistration(<Components comps>, I1, u'', 5, None, u'')
> True
> >>> components.queryUtility(tests.I1)
>
> @@ -179,7 +188,7 @@
> >>> util = tests.U('ext')
> >>> components.registerUtility(util, tests.I2e)
> Registered event:
> - UtilityRegistration(<Components comps>, I2e, u'', ext, u'')
> + UtilityRegistration(<Components comps>, I2e, u'', ext, None, u'')
>
> We don't get the new utility for getUtilitiesFor:
>
> @@ -910,7 +919,7 @@
>
> >>> c1.registerUtility(tests.U1(1))
> Registered event:
> - UtilityRegistration(<Components 1>, I1, u'', 1, u'')
> + UtilityRegistration(<Components 1>, I1, u'', 1, None, u'')
>
> >>> c1.queryUtility(tests.I1)
> U1(1)
> @@ -918,7 +927,7 @@
> U1(1)
> >>> c1.registerUtility(tests.U1(2))
> Registered event:
> - UtilityRegistration(<Components 1>, I1, u'', 2, u'')
> + UtilityRegistration(<Components 1>, I1, u'', 2, None, u'')
>
> >>> c2.queryUtility(tests.I1)
> U1(2)
> @@ -932,14 +941,14 @@
>
> >>> c1.registerUtility(tests.U12(1), tests.I2)
> Registered event:
> - UtilityRegistration(<Components 1>, I2, u'', 1, u'')
> + UtilityRegistration(<Components 1>, I2, u'', 1, None, u'')
>
> >>> c4.queryUtility(tests.I2)
> U12(1)
>
> >>> c3.registerUtility(tests.U12(3), tests.I2)
> Registered event:
> - UtilityRegistration(<Components 3>, I2, u'', 3, u'')
> + UtilityRegistration(<Components 3>, I2, u'', 3, None, u'')
> >>> c4.queryUtility(tests.I2)
> U12(3)
>
> @@ -1065,15 +1074,15 @@
> >>> components.registerUtility(u5)
> ... # doctest: +NORMALIZE_WHITESPACE
> Double dispatch:
> - UtilityRegistration(<Components comps>, I1, u'', 5, u'')
> + UtilityRegistration(<Components comps>, I1, u'', 5, None, u'')
> Registered event:
> - UtilityRegistration(<Components comps>, I1, u'', 5, u'')
> + UtilityRegistration(<Components comps>, I1, u'', 5, None, u'')
> Double dispatch:
> U1(5)
> Registered event:
> - UtilityRegistration(<Components comps>, I1, u'', 5, u'')
> + UtilityRegistration(<Components comps>, I1, u'', 5, None, u'')
> Registered event:
> - UtilityRegistration(<Components comps>, I1, u'', 5, u'')
> + UtilityRegistration(<Components comps>, I1, u'', 5, None, u'')
>
> >>> components.registerAdapter(tests.A12_1)
> ... # doctest: +NORMALIZE_WHITESPACE
>
> Modified: zope.component/trunk/src/zope/component/zcml.py
> ===================================================================
> --- zope.component/trunk/src/zope/component/zcml.py 2008-07-24 16:00:26 UTC (rev 88793)
> +++ zope.component/trunk/src/zope/component/zcml.py 2008-07-24 16:17:58 UTC (rev 88794)
> @@ -400,10 +400,8 @@
>
> def utility(_context, provides=None, component=None, factory=None,
> permission=None, name=''):
> - if factory:
> - if component:
> - raise TypeError("Can't specify factory and component.")
> - component = factory()
> + if factory and component:
> + raise TypeError("Can't specify factory and component.")
>
> if provides is None:
> provides = list(zope.interface.providedBy(component))
> @@ -423,6 +421,7 @@
> discriminator = ('utility', provides, name),
> callable = handler,
> args = ('registerUtility', component, provides, name),
> + kw = dict(factory=factory),
> )
> _context.action(
> discriminator = None,
>
> _______________________________________________
> Checkins mailing list
> Checkins[at]zope.org
> http://mail.zope.org/mailman/listinfo/checkins
>

_______________________________________________
Zope-Dev maillist - Zope-Dev[at]zope.org
http://mail.zope.org/mailman/listinfo/zope-dev
** No cross posts or HTML encoding! **
(Related lists -
http://mail.zope.org/mailman/listinfo/zope-announce
http://mail.zope.org/mailman/listinfo/zope )


wichert at wiggy

Jul 24, 2008, 10:45 AM

Post #2 of 6 (317 views)
Permalink
Re: SVN: zope.component/ Merge wichert-utility-factories branch to trunk [In reply to]

Jacob Holm wrote:
> Hello
>
> This checkin contains the following change to
> zope.component/trunk/src/zope/component/registry.py
> which looks wrong to me (it's a noop). It looks to me as if the [:2]
> should move outside the ")" following it. I am surprised that this
> doesn't break any tests, as it means that reregistrations are not
> detected as such.
>
> - if (self._utility_registrations.get((provided, name))
> + if (self._utility_registrations.get((provided, name)[:2])

Excellent catch, fixed.

Wichert.

--
Wichert Akkerman<wichert[at]wiggy.net> It is simple to make things.
http://www.wiggy.net/ It is hard to make things simple.

_______________________________________________
Zope-Dev maillist - Zope-Dev[at]zope.org
http://mail.zope.org/mailman/listinfo/zope-dev
** No cross posts or HTML encoding! **
(Related lists -
http://mail.zope.org/mailman/listinfo/zope-announce
http://mail.zope.org/mailman/listinfo/zope )


chris at simplistix

Jul 25, 2008, 8:58 AM

Post #3 of 6 (292 views)
Permalink
Re: Re: SVN: zope.component/ Merge wichert-utility-factories branch to trunk [In reply to]

Wichert Akkerman wrote:
>> - if (self._utility_registrations.get((provided, name))
>> + if (self._utility_registrations.get((provided, name)[:2])
>
> Excellent catch, fixed.

With a test I hope?

cheers,

Chris

--
Simplistix - Content Management, Zope & Python Consulting
- http://www.simplistix.co.uk
_______________________________________________
Zope-Dev maillist - Zope-Dev[at]zope.org
http://mail.zope.org/mailman/listinfo/zope-dev
** No cross posts or HTML encoding! **
(Related lists -
http://mail.zope.org/mailman/listinfo/zope-announce
http://mail.zope.org/mailman/listinfo/zope )


ct at gocept

Jul 25, 2008, 9:18 AM

Post #4 of 6 (291 views)
Permalink
Re: Re: SVN: zope.component/ Merge wichert-utility-factories branch to trunk [In reply to]

On Fri, 2008-07-25 at 16:58 +0100, Chris Withers wrote:
> Wichert Akkerman wrote:
> >> - if (self._utility_registrations.get((provided, name))
> >> + if (self._utility_registrations.get((provided, name)[:2])
> >
> > Excellent catch, fixed.
>
> With a test I hope?

Uh. Lol?

To me this looks like an inefficiency that's gonna be hard to test from
the outside. Or did I miss anything?

Christian

--
Christian Theune · ct[at]gocept.com
gocept gmbh & co. kg · forsterstraße 29 · 06112 halle (saale) · germany
http://gocept.com · tel +49 345 1229889 7 · fax +49 345 1229889 1
Zope and Plone consulting and development
Attachments: signature.asc (0.18 KB)


chris at simplistix

Jul 25, 2008, 9:34 AM

Post #5 of 6 (291 views)
Permalink
Re: Re: SVN: zope.component/ Merge wichert-utility-factories branch to trunk [In reply to]

Christian Theune wrote:
> To me this looks like an inefficiency that's gonna be hard to test from
> the outside. Or did I miss anything?

That's not the impression I got, which is why a test would be good...

cheers,

Chris

--
Simplistix - Content Management, Zope & Python Consulting
- http://www.simplistix.co.uk
_______________________________________________
Zope-Dev maillist - Zope-Dev[at]zope.org
http://mail.zope.org/mailman/listinfo/zope-dev
** No cross posts or HTML encoding! **
(Related lists -
http://mail.zope.org/mailman/listinfo/zope-announce
http://mail.zope.org/mailman/listinfo/zope )


wichert at wiggy

Jul 25, 2008, 3:00 PM

Post #6 of 6 (282 views)
Permalink
Re: Re: SVN: zope.component/ Merge wichert-utility-factories branch to trunk [In reply to]

Christian Theune wrote:
> On Fri, 2008-07-25 at 16:58 +0100, Chris Withers wrote:
>
>> Wichert Akkerman wrote:
>>
>>>> - if (self._utility_registrations.get((provided, name))
>>>> + if (self._utility_registrations.get((provided, name)[:2])
>>>>
>>> Excellent catch, fixed.
>>>
>> With a test I hope?
>>
>
> Uh. Lol?
>
> To me this looks like an inefficiency that's gonna be hard to test from
> the outside. Or did I miss anything?
>

No.

Wichert.

--
Wichert Akkerman<wichert[at]wiggy.net> It is simple to make things.
http://www.wiggy.net/ It is hard to make things simple.

Zope dev RSS feed   Index | Next | Previous | View Threaded
 
 


Interested in having your list archived? Contact lists@gossamer-threads.com
 
  Web Applications & Managed Hosting Powered by Gossamer Threads Inc.