[Checkins] SVN: grok/branches/jw-philipp-using-ndir-directives/src/grok/ Fixed and simplified the SiteGrokker by moving checks for local utility registrations to the corresponding directive.

Philipp von Weitershausen philikon at philikon.de
Sat May 3 16:09:05 EDT 2008


Log message for revision 86284:
  Fixed and simplified the SiteGrokker by moving checks for local utility registrations to the corresponding directive.

Changed:
  U   grok/branches/jw-philipp-using-ndir-directives/src/grok/directive.py
  U   grok/branches/jw-philipp-using-ndir-directives/src/grok/meta.py
  U   grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/local_implementsmany.py
  A   grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/local_implementsmany_fixture.py
  U   grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/local_implementsnone.py
  U   grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/local_implementsnone2.py
  A   grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/local_implementsnone2_fixture.py
  A   grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/local_implementsnone_fixture.py
  U   grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/multiple_class.py
  A   grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/multiple_class_fixture.py
  U   grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/multiple_directive.py
  A   grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/multiple_directive_fixture.py

-=-
Modified: grok/branches/jw-philipp-using-ndir-directives/src/grok/directive.py
===================================================================
--- grok/branches/jw-philipp-using-ndir-directives/src/grok/directive.py	2008-05-03 20:05:26 UTC (rev 86283)
+++ grok/branches/jw-philipp-using-ndir-directives/src/grok/directive.py	2008-05-03 20:09:04 UTC (rev 86284)
@@ -16,6 +16,7 @@
 
 import sys
 import grok
+from zope import interface
 from zope.interface.interfaces import IInterface
 from zope.publisher.interfaces.browser import IBrowserView
 
@@ -36,23 +37,56 @@
     store = martian.ONCE
     validate = martian.validateText
 
-class local_utility(martian.MultipleTimesDirective):
+class local_utility(martian.Directive):
     scope = martian.CLASS
+    store = martian.DICT
 
     def factory(self, factory, provides=None, name=u'',
                 setup=None, public=False, name_in_container=None):
         if provides is not None and not IInterface.providedBy(provides):
             raise GrokImportError("You can only pass an interface to the "
                                   "provides argument of %s." % self.name)
-        return LocalUtilityInfo(factory, provides, name, setup,
-                                public, name_in_container)
 
+        if provides is None:
+            provides = grok.provides.get(factory)
+
+        if provides is None:
+            if util.check_subclass(factory, grok.LocalUtility):
+                baseInterfaces = interface.implementedBy(grok.LocalUtility)
+                utilityInterfaces = interface.implementedBy(factory)
+                provides = list(utilityInterfaces - baseInterfaces)
+
+                if len(provides) == 0 and len(list(utilityInterfaces)) > 0:
+                    raise GrokImportError(
+                        "Cannot determine which interface to use "
+                        "for utility registration of %r. "
+                        "It implements an interface that is a specialization "
+                        "of an interface implemented by grok.LocalUtility. "
+                        "Specify the interface by either using grok.provides "
+                        "on the utility or passing 'provides' to "
+                        "grok.local_utility." % factory, factory)
+            else:
+                provides = list(interface.implementedBy(factory))
+
+            util.check_implements_one_from_list(provides, factory)
+            provides = provides[0]
+
+        if (provides, name) in self.frame.f_locals.get(self.dotted_name(), {}):
+            raise GrokImportError(
+                "Conflicting local utility registration %r. "
+                "Local utilities are registered multiple "
+                "times for interface %r and name %r." %
+                (factory, provides, name), factory)
+
+        info = LocalUtilityInfo(factory, provides, name, setup, public,
+                                name_in_container)
+        return (provides, name), info
+
+
 class LocalUtilityInfo(object):
-    def __init__(self, factory, provides=None, name=u'',
+    def __init__(self, factory, provides, name=u'',
                  setup=None, public=False, name_in_container=None):
         self.factory = factory
-        if provides is None:
-            provides = grok.provides.get(factory)
         self.provides = provides
         self.name = name
         self.setup = setup
@@ -62,8 +96,7 @@
 class RequireDirectiveStore(StoreMultipleTimes):
 
     def get(self, directive, component, default):
-        permissions = super(RequireDirectiveStore, self).get(
-            directive, component, default)
+        permissions = getattr(component, directive.dotted_name(), default)
         if (permissions is default) or not permissions:
             return default
         if len(permissions) > 1:

Modified: grok/branches/jw-philipp-using-ndir-directives/src/grok/meta.py
===================================================================
--- grok/branches/jw-philipp-using-ndir-directives/src/grok/meta.py	2008-05-03 20:05:26 UTC (rev 86283)
+++ grok/branches/jw-philipp-using-ndir-directives/src/grok/meta.py	2008-05-03 20:09:04 UTC (rev 86284)
@@ -432,64 +432,16 @@
         if not infos:
             return False
 
+        infos = infos.values()
         for info in infos:
             if info.public and not IContainer.implementedBy(factory):
                 raise GrokError(
                     "Cannot set public to True with grok.local_utility as "
                     "the site (%r) is not a container." %
                     factory, factory)
-            if info.provides is None:
-                if util.check_subclass(info.factory, grok.LocalUtility):
-                    baseInterfaces = interface.implementedBy(grok.LocalUtility)
-                    utilityInterfaces = interface.implementedBy(info.factory)
-                    provides = list(utilityInterfaces - baseInterfaces)
 
-                    if len(provides) == 0 and len(list(utilityInterfaces)) > 0:
-                        raise GrokError(
-                            "Cannot determine which interface to use "
-                            "for utility registration of %r in site %r. "
-                            "It implements an interface that is a specialization "
-                            "of an interface implemented by grok.LocalUtility. "
-                            "Specify the interface by either using grok.provides "
-                            "on the utility or passing 'provides' to "
-                            "grok.local_utility." % (info.factory, factory),
-                            info.factory)
-                else:
-                    provides = list(interface.implementedBy(info.factory))
-
-                util.check_implements_one_from_list(provides, info.factory)
-                info.provides = provides[0]
-
-        # raise an error in case of any duplicate registrations
-        # on the class level (subclassing overrides, see below)
-        used = set()
-        class_infos = grok.local_utility.get(factory)
-        for info in class_infos:
-            key = (info.provides, info.name)
-            if key in used:
-                raise GrokError(
-                    "Conflicting local utility registration %r in "
-                    "site %r. Local utilities are registered multiple "
-                    "times for interface %r and name %r." %
-                    (info.factory, factory, info.provides, info.name),
-                    factory)
-            used.add(key)
-
-        # 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__ = overridden_infos
+        factory.__grok_utilities_to_install__ = infos
         adapts = (factory, grok.IObjectAddedEvent)
 
         config.action(

Modified: grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/local_implementsmany.py
===================================================================
--- grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/local_implementsmany.py	2008-05-03 20:05:26 UTC (rev 86283)
+++ grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/local_implementsmany.py	2008-05-03 20:09:04 UTC (rev 86284)
@@ -5,26 +5,11 @@
 In this test, the utility implements more than one interface, so it cannot be
 registered as a local utility.
 
-  >>> grok.testing.grok(__name__)
+  >>> import grok.tests.utility.local_implementsmany_fixture
   Traceback (most recent call last):
     ...
-  GrokError: <class 'grok.tests.utility.local_implementsmany.Fireplace'>
+  GrokError: <class 'grok.tests.utility.local_implementsmany_fixture.Fireplace'>
   is implementing more than one interface (use grok.provides to specify
   which one to use).
 
 """
-
-import grok
-from zope import interface
-
-class IHome(interface.Interface):
-    pass
-
-class IFireplace(interface.Interface):
-    pass
-
-class Fireplace(object):
-    interface.implements(IHome, IFireplace)
-
-class Cave(grok.Model, grok.Site):
-    grok.local_utility(Fireplace)

Added: grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/local_implementsmany_fixture.py
===================================================================
--- grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/local_implementsmany_fixture.py	                        (rev 0)
+++ grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/local_implementsmany_fixture.py	2008-05-03 20:09:04 UTC (rev 86284)
@@ -0,0 +1,14 @@
+import grok
+from zope import interface
+
+class IHome(interface.Interface):
+    pass
+
+class IFireplace(interface.Interface):
+    pass
+
+class Fireplace(object):
+    interface.implements(IHome, IFireplace)
+
+class Cave(grok.Model, grok.Site):
+    grok.local_utility(Fireplace)


Property changes on: grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/local_implementsmany_fixture.py
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/local_implementsnone.py
===================================================================
--- grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/local_implementsnone.py	2008-05-03 20:05:26 UTC (rev 86283)
+++ grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/local_implementsnone.py	2008-05-03 20:09:04 UTC (rev 86284)
@@ -5,19 +5,10 @@
 In this test, the utility does not implement any interface, so it cannot be
 registered as a local utility.
 
-  >>> grok.testing.grok(__name__)
+  >>> import grok.tests.utility.local_implementsnone_fixture
   Traceback (most recent call last):
     ...
-  GrokError: <class 'grok.tests.utility.local_implementsnone.Fireplace'>
+  GrokError: <class 'grok.tests.utility.local_implementsnone_fixture.Fireplace'>
   must implement at least one interface (use grok.implements to specify).
 
 """
-
-import grok
-from zope import interface
-
-class Fireplace(object):
-    pass
-
-class Cave(grok.Model, grok.Site):
-    grok.local_utility(Fireplace)

Modified: grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/local_implementsnone2.py
===================================================================
--- grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/local_implementsnone2.py	2008-05-03 20:05:26 UTC (rev 86283)
+++ grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/local_implementsnone2.py	2008-05-03 20:09:04 UTC (rev 86284)
@@ -1,25 +1,14 @@
 """
-  >>> grok.testing.grok(__name__)
+  >>> import grok.tests.utility.local_implementsnone2_fixture
   Traceback (most recent call last):
     ...
-  GrokError: Cannot determine which interface to use for utility registration of
-  <class 'grok.tests.utility.local_implementsnone2.Fireplace'> in site
-  <class 'grok.tests.utility.local_implementsnone2.Cave'>. It implements
-  an interface that is a specialization of an interface implemented
-  by grok.LocalUtility. Specify the interface by either using grok.provides on
-  the utility or passing 'provides' to grok.local_utility.
+  GrokImportError: ("Cannot determine which interface to use for utility
+  registration of
+  <class 'grok.tests.utility.local_implementsnone2_fixture.Fireplace'>.
+  It implements an interface that is a specialization of an interface
+  implemented by grok.LocalUtility. Specify the interface by either
+  using grok.provides on the utility or passing 'provides' to
+  grok.local_utility.",
+  <class 'grok.tests.utility.local_implementsnone2_fixture.Fireplace'>)
 
 """
-
-import grok
-from zope import interface
-import persistent
-
-class ISpecialPersistent(persistent.interfaces.IPersistent):
-    pass
-
-class Fireplace(grok.LocalUtility):
-    grok.implements(ISpecialPersistent)
-
-class Cave(grok.Model, grok.Site):
-    grok.local_utility(Fireplace)

Added: grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/local_implementsnone2_fixture.py
===================================================================
--- grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/local_implementsnone2_fixture.py	                        (rev 0)
+++ grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/local_implementsnone2_fixture.py	2008-05-03 20:09:04 UTC (rev 86284)
@@ -0,0 +1,12 @@
+import grok
+from zope import interface
+import persistent
+
+class ISpecialPersistent(persistent.interfaces.IPersistent):
+    pass
+
+class Fireplace(grok.LocalUtility):
+    grok.implements(ISpecialPersistent)
+
+class Cave(grok.Model, grok.Site):
+    grok.local_utility(Fireplace)


Property changes on: grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/local_implementsnone2_fixture.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/local_implementsnone_fixture.py
===================================================================
--- grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/local_implementsnone_fixture.py	                        (rev 0)
+++ grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/local_implementsnone_fixture.py	2008-05-03 20:09:04 UTC (rev 86284)
@@ -0,0 +1,8 @@
+import grok
+from zope import interface
+
+class Fireplace(object):
+    pass
+
+class Cave(grok.Model, grok.Site):
+    grok.local_utility(Fireplace)


Property changes on: grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/local_implementsnone_fixture.py
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/multiple_class.py
===================================================================
--- grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/multiple_class.py	2008-05-03 20:05:26 UTC (rev 86283)
+++ grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/multiple_class.py	2008-05-03 20:09:04 UTC (rev 86284)
@@ -2,28 +2,13 @@
 When you try to register multiple classes with the same (interface, name)
 combination multiple times using grok.local_utility, we expect an error:
 
-  >>> grok.testing.grok(__name__)
+  >>> import grok.tests.utility.multiple_class_fixture
   Traceback (most recent call last):
     ...
-  GrokError: Conflicting local utility registration
-  <class 'grok.tests.utility.multiple_class.Fireplace2'> in site
-  <class 'grok.tests.utility.multiple_class.Cave'>.
+  GrokImportError: ("Conflicting local utility registration
+  <class 'grok.tests.utility.multiple_class_fixture.Fireplace2'>.
   Local utilities are registered multiple times for interface
-  <InterfaceClass grok.tests.utility.multiple_class.IFireplace> and
-  name 'Foo'.  
+  <InterfaceClass grok.tests.utility.multiple_class_fixture.IFireplace>
+  and name 'Foo'.",
+  <class 'grok.tests.utility.multiple_class_fixture.Fireplace2'>)
 """
-import grok
-from zope import interface
-
-class IFireplace(interface.Interface):
-    pass
-
-class Fireplace(grok.LocalUtility):
-    grok.implements(IFireplace)
-
-class Fireplace2(grok.LocalUtility):
-    grok.implements(IFireplace)
-    
-class Cave(grok.Model, grok.Site):
-    grok.local_utility(Fireplace, name='Foo')
-    grok.local_utility(Fireplace2, name='Foo')

Added: grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/multiple_class_fixture.py
===================================================================
--- grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/multiple_class_fixture.py	                        (rev 0)
+++ grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/multiple_class_fixture.py	2008-05-03 20:09:04 UTC (rev 86284)
@@ -0,0 +1,15 @@
+import grok
+from zope import interface
+
+class IFireplace(interface.Interface):
+    pass
+
+class Fireplace(grok.LocalUtility):
+    grok.implements(IFireplace)
+
+class Fireplace2(grok.LocalUtility):
+    grok.implements(IFireplace)
+    
+class Cave(grok.Model, grok.Site):
+    grok.local_utility(Fireplace, name='Foo')
+    grok.local_utility(Fireplace2, name='Foo')


Property changes on: grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/multiple_class_fixture.py
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/multiple_directive.py
===================================================================
--- grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/multiple_directive.py	2008-05-03 20:05:26 UTC (rev 86283)
+++ grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/multiple_directive.py	2008-05-03 20:09:04 UTC (rev 86284)
@@ -2,28 +2,13 @@
 When you call the grok.local_utility directive multiple times specifying
 the same (interface, name) combination, we expect an error:
 
-  >>> grok.testing.grok(__name__)
+  >>> import grok.tests.utility.multiple_directive_fixture
   Traceback (most recent call last):
     ...
-  GrokError: Conflicting local utility registration
-  <class 'grok.tests.utility.multiple_directive.Fireplace2'> in site
-  <class 'grok.tests.utility.multiple_directive.Cave'>.
+  GrokImportError: ("Conflicting local utility registration
+  <class 'grok.tests.utility.multiple_directive_fixture.Fireplace2'>.
   Local utilities are registered multiple times for interface
-  <InterfaceClass grok.tests.utility.multiple_directive.IFireplace> and
-  name u''.  
+  <InterfaceClass grok.tests.utility.multiple_directive_fixture.IFireplace>
+  and name u''.",
+  <class 'grok.tests.utility.multiple_directive_fixture.Fireplace2'>)
 """
-import grok
-from zope import interface
-
-class IFireplace(interface.Interface):
-    pass
-
-class Fireplace(grok.LocalUtility):
-    grok.implements(IFireplace)
-
-class Fireplace2(grok.LocalUtility):
-    grok.implements(IFireplace)
-    
-class Cave(grok.Model, grok.Site):
-    grok.local_utility(Fireplace, provides=IFireplace)
-    grok.local_utility(Fireplace2, provides=IFireplace)

Added: grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/multiple_directive_fixture.py
===================================================================
--- grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/multiple_directive_fixture.py	                        (rev 0)
+++ grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/multiple_directive_fixture.py	2008-05-03 20:09:04 UTC (rev 86284)
@@ -0,0 +1,15 @@
+import grok
+from zope import interface
+
+class IFireplace(interface.Interface):
+    pass
+
+class Fireplace(grok.LocalUtility):
+    grok.implements(IFireplace)
+
+class Fireplace2(grok.LocalUtility):
+    grok.implements(IFireplace)
+    
+class Cave(grok.Model, grok.Site):
+    grok.local_utility(Fireplace, provides=IFireplace)
+    grok.local_utility(Fireplace2, provides=IFireplace)


Property changes on: grok/branches/jw-philipp-using-ndir-directives/src/grok/tests/utility/multiple_directive_fixture.py
___________________________________________________________________
Name: svn:eol-style
   + native



More information about the Checkins mailing list