[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