[Checkins] SVN: grok/trunk/src/grok/ Local utilities in subclasses
override those in base classes if they
Philipp von Weitershausen
philikon at philikon.de
Sun Jan 7 13:32:32 EST 2007
Log message for revision 71785:
Local utilities in subclasses override those in base classes if they
are registered for the same registration.
Changed:
U grok/trunk/src/grok/_grok.py
A grok/trunk/src/grok/ftests/utility/local_override.py
U grok/trunk/src/grok/ftests/utility/public.py
U grok/trunk/src/grok/meta.py
-=-
Modified: grok/trunk/src/grok/_grok.py
===================================================================
--- grok/trunk/src/grok/_grok.py 2007-01-07 18:07:54 UTC (rev 71784)
+++ grok/trunk/src/grok/_grok.py 2007-01-07 18:32:31 UTC (rev 71785)
@@ -52,6 +52,10 @@
def addSiteHandler(site, event):
sitemanager = LocalSiteManager(site)
+ # LocalSiteManager creates the 'default' folder in its __init__.
+ # It's not needed anymore in new versions of Zope 3, therefore we
+ # remove it
+ del sitemanager['default']
site.setSiteManager(sitemanager)
# add a cleanup hook so that grok will bootstrap itself again whenever
Added: grok/trunk/src/grok/ftests/utility/local_override.py
===================================================================
--- grok/trunk/src/grok/ftests/utility/local_override.py 2007-01-07 18:07:54 UTC (rev 71784)
+++ grok/trunk/src/grok/ftests/utility/local_override.py 2007-01-07 18:32:31 UTC (rev 71785)
@@ -0,0 +1,44 @@
+"""
+Local Utilities can be registered on subclasses of grok.Site using
+grok.local_utility:
+
+ >>> import grok
+ >>> from zope import component
+ >>> from grok.ftests.utility.local_override import *
+
+ >>> grok.grok('grok.ftests.utility.local_override')
+
+ >>> cave = SpikyCave()
+ >>> getRootFolder()['cave'] = cave
+
+ >>> from zope.app.component.hooks import getSite, setSite
+ >>> setSite(cave)
+
+ >>> club = component.getUtility(IClub)
+ >>> IClub.providedBy(club)
+ True
+ >>> isinstance(club, SpikyClub)
+ True
+
+ >>> list(cave.getSiteManager().keys())
+ [u'SpikyClub']
+"""
+import grok
+from zope import interface
+import persistent
+
+class IClub(interface.Interface):
+ pass
+
+class Club(grok.LocalUtility):
+ grok.implements(IClub)
+
+class SpikyClub(grok.LocalUtility):
+ grok.implements(IClub)
+
+class Cave(grok.Model, grok.Site):
+ grok.local_utility(Club)
+
+class SpikyCave(Cave):
+ grok.local_utility(SpikyClub)
+
Property changes on: grok/trunk/src/grok/ftests/utility/local_override.py
___________________________________________________________________
Name: svn:eol-style
+ native
Modified: grok/trunk/src/grok/ftests/utility/public.py
===================================================================
--- grok/trunk/src/grok/ftests/utility/public.py 2007-01-07 18:07:54 UTC (rev 71784)
+++ grok/trunk/src/grok/ftests/utility/public.py 2007-01-07 18:32:31 UTC (rev 71785)
@@ -23,7 +23,7 @@
>>> cave2 = Cave2()
>>> getRootFolder()['cave2'] = cave2
>>> setSite(cave2)
- >>> (cave2.getSiteManager()['default']['fireplace'] is
+ >>> (cave2.getSiteManager()['fireplace'] is
... component.getUtility(IFireplace))
True
Modified: grok/trunk/src/grok/meta.py
===================================================================
--- grok/trunk/src/grok/meta.py 2007-01-07 18:07:54 UTC (rev 71784)
+++ grok/trunk/src/grok/meta.py 2007-01-07 18:32:31 UTC (rev 71785)
@@ -315,7 +315,6 @@
"the site (%r) is not a container." %
factory, factory)
if info.provides is None:
- provides = []
if util.check_subclass(info.factory, grok.LocalUtility):
baseInterfaces = interface.implementedBy(grok.LocalUtility)
utilityInterfaces = interface.implementedBy(info.factory)
@@ -336,8 +335,21 @@
util.check_implements_one_from_list(provides, info.factory)
info.provides = provides[0]
+ # Make sure that local utilities from subclasses override
+ # utilities from base classes if the registration (provided
+ # interface, name) is identical.
+ overridden_infos = []
+ used = set()
+ for info in reversed(infos):
+ key = (info.provides, info.name)
+ if key in used:
+ continue
+ used.add(key)
+ overridden_infos.append(info)
+ overridden_infos.reverse()
+
# store infos on site class
- factory.__grok_utilities_to_install__ = infos
+ factory.__grok_utilities_to_install__ = overridden_infos
component.provideHandler(localUtilityRegistrationSubscriber,
adapts=(factory, grok.IObjectAddedEvent))
@@ -355,15 +367,14 @@
# store utility
if not info.public:
- container = site_manager['default']
+ container = site_manager
else:
container = site
name_in_container = info.name_in_container
if name_in_container is None:
name_in_container = INameChooser(container).chooseName(
- info.factory.__class__.__name__,
- utility)
+ info.factory.__name__, utility)
container[name_in_container] = utility
# execute setup callback
More information about the Checkins
mailing list