[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