[Checkins] SVN: grok/trunk/src/grok/ added tests for
grok.global_utility
Wolfgang Schnerring
wosc at wosc.de
Sun Jan 7 07:07:57 EST 2007
Log message for revision 71761:
added tests for grok.global_utility
Changed:
U grok/trunk/src/grok/directive.py
U grok/trunk/src/grok/meta.py
A grok/trunk/src/grok/tests/utility/implementsmany2.py
A grok/trunk/src/grok/tests/utility/implementsnone2.py
U grok/trunk/src/grok/tests/utility/utility.py
-=-
Modified: grok/trunk/src/grok/directive.py
===================================================================
--- grok/trunk/src/grok/directive.py 2007-01-07 12:03:03 UTC (rev 71760)
+++ grok/trunk/src/grok/directive.py 2007-01-07 12:07:57 UTC (rev 71761)
@@ -179,7 +179,13 @@
class GlobalUtilityInfo(object):
def __init__(self, factory, provides=None, name=u''):
self.factory = factory
+
+ if provides is None:
+ provides = util.class_annotation(factory, 'grok.provides', None)
self.provides = provides
+
+ if name is u'':
+ name = util.class_annotation(factory, 'grok.name', u'')
self.name = name
class LocalUtilityDirective(MultipleTimesDirective):
Modified: grok/trunk/src/grok/meta.py
===================================================================
--- grok/trunk/src/grok/meta.py 2007-01-07 12:03:03 UTC (rev 71760)
+++ grok/trunk/src/grok/meta.py 2007-01-07 12:07:57 UTC (rev 71761)
@@ -247,9 +247,12 @@
infos = module_info.getAnnotation('grok.global_utility', [])
for info in infos:
+ if info.provides is None:
+ util.check_implements_one(info.factory)
component.provideUtility(info.factory(),
provides=info.provides,
name=info.name)
+
class SiteGrokker(grok.ClassGrokker):
component_class = grok.Site
priority = 500
Added: grok/trunk/src/grok/tests/utility/implementsmany2.py
===================================================================
--- grok/trunk/src/grok/tests/utility/implementsmany2.py 2007-01-07 12:03:03 UTC (rev 71760)
+++ grok/trunk/src/grok/tests/utility/implementsmany2.py 2007-01-07 12:07:57 UTC (rev 71761)
@@ -0,0 +1,24 @@
+"""
+Subclasses of grok.GlobalUtility that implement more than one interface must
+specify which interface to use for the registration:
+
+ >>> grok.grok(__name__)
+ Traceback (most recent call last):
+ ...
+ GrokError: <class 'grok.tests.utility.implementsmany2.Club'> is implementing
+ more than one interface (use grok.provides to specify which one to use).
+"""
+import grok
+from zope import interface
+
+class IClub(interface.Interface):
+ pass
+
+class ISpikyClub(interface.Interface):
+ pass
+
+class Club(object):
+ grok.implements(IClub, ISpikyClub)
+
+grok.global_utility(Club)
+
Added: grok/trunk/src/grok/tests/utility/implementsnone2.py
===================================================================
--- grok/trunk/src/grok/tests/utility/implementsnone2.py 2007-01-07 12:03:03 UTC (rev 71760)
+++ grok/trunk/src/grok/tests/utility/implementsnone2.py 2007-01-07 12:07:57 UTC (rev 71761)
@@ -0,0 +1,15 @@
+"""
+Subclasses of grok.GlobalUtility must implement exactly one interface:
+
+ >>> grok.grok(__name__)
+ Traceback (most recent call last):
+ ...
+ GrokError: <class 'grok.tests.utility.implementsnone2.Club'> must
+ implement at least one interface (use grok.implements to specify).
+"""
+import grok
+
+class Club(object):
+ pass
+
+grok.global_utility(Club)
Modified: grok/trunk/src/grok/tests/utility/utility.py
===================================================================
--- grok/trunk/src/grok/tests/utility/utility.py 2007-01-07 12:03:03 UTC (rev 71760)
+++ grok/trunk/src/grok/tests/utility/utility.py 2007-01-07 12:07:57 UTC (rev 71761)
@@ -38,6 +38,65 @@
True
>>> isinstance(nightclub, NightClub)
True
+
+Utilities (including classes that do not subclass from grok.GlobalUtility) can
+be (re-)registered using grok.global_utility:
+
+ >>> fireplace = component.getUtility(IFireplace)
+ >>> IFireplace.providedBy(fireplace)
+ True
+ >>> isinstance(fireplace, Fireplace)
+ True
+
+ >>> fireplace = component.getUtility(IFireplace, name='hot')
+ >>> IFireplace.providedBy(fireplace)
+ True
+ >>> isinstance(fireplace, Fireplace)
+ True
+
+ >>> home = component.getUtility(IHome)
+ >>> IHome.providedBy(home)
+ True
+ >>> isinstance(home, Home)
+ True
+
+ >>> night = component.getUtility(INightClub, name='cool')
+ >>> IClub.providedBy(night)
+ True
+ >>> isinstance(night, NightClub)
+ True
+
+ >>> spiky = component.getUtility(ISpikyClub)
+ >>> ISpikyClub.providedBy(spiky)
+ True
+ >>> isinstance(spiky, NightClub)
+ True
+
+When re-registering a grok.GlobalUtility, the directives grok.name and
+grok.provides on the class will be used, but can be overriden in the
+grok.global_utility directive:
+
+ >>> small = component.getUtility(ISmallClub, name='tiny')
+ >>> ISmallClub.providedBy(small)
+ True
+ >>> isinstance(small, SmallClub)
+ True
+
+ >>> small2 = component.getUtility(ITinyClub, name='tiny')
+ >>> ISmallClub.providedBy(small2)
+ True
+ >>> isinstance(small2, SmallClub)
+ True
+ >>> small is not small2
+ True
+
+ >>> small3 = component.getUtility(ISmallClub, name='small')
+ >>> ISmallClub.providedBy(small3)
+ True
+ >>> isinstance(small3, SmallClub)
+ True
+ >>> small3 is not small2 and small3 is not small
+ True
"""
import grok
from zope import interface
@@ -48,6 +107,12 @@
class ISpikyClub(IClub):
pass
+class ISmallClub(IClub):
+ pass
+
+class ITinyClub(IClub):
+ pass
+
class INightClub(interface.Interface):
pass
@@ -66,3 +131,30 @@
class NightClub(grok.GlobalUtility):
grok.implements(INightClub, ISpikyClub)
grok.provides(INightClub)
+
+class SmallClub(grok.GlobalUtility):
+ grok.implements(ISmallClub, ITinyClub)
+ grok.provides(ISmallClub)
+ grok.name('tiny')
+
+class IFireplace(interface.Interface):
+ pass
+
+class IHome(interface.Interface):
+ pass
+
+class Fireplace(object):
+ grok.implements(IFireplace)
+
+class Home(object):
+ grok.implements(IFireplace, IHome)
+
+grok.global_utility(Fireplace)
+grok.global_utility(Fireplace, name='hot')
+grok.global_utility(Home, provides=IHome)
+
+grok.global_utility(NightClub, name='cool')
+grok.global_utility(NightClub, provides=ISpikyClub)
+
+grok.global_utility(SmallClub, provides=ITinyClub)
+grok.global_utility(SmallClub, name='small')
More information about the Checkins
mailing list