[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