[Checkins] SVN: grok/trunk/src/grok/ implemented global utilities

Wolfgang Schnerring wosc at wosc.de
Wed Oct 18 08:47:28 EDT 2006


Log message for revision 70779:
  implemented global utilities

Changed:
  U   grok/trunk/src/grok/__init__.py
  U   grok/trunk/src/grok/_grok.py
  U   grok/trunk/src/grok/interfaces.py
  U   grok/trunk/src/grok/tests/test_grok.py
  A   grok/trunk/src/grok/tests/utility/
  A   grok/trunk/src/grok/tests/utility/__init__.py
  A   grok/trunk/src/grok/tests/utility/utility.py

-=-
Modified: grok/trunk/src/grok/__init__.py
===================================================================
--- grok/trunk/src/grok/__init__.py	2006-10-18 11:33:41 UTC (rev 70778)
+++ grok/trunk/src/grok/__init__.py	2006-10-18 12:47:28 UTC (rev 70779)
@@ -27,7 +27,7 @@
     IObjectRemovedEvent, ObjectRemovedEvent,
     IContainerModifiedEvent, ContainerModifiedEvent)
 
-from grok._grok import (Model, Adapter, MultiAdapter, View, PageTemplate,
+from grok._grok import (Model, Adapter, MultiAdapter, View, PageTemplate, Utility,
                         grok, context, name, template, templatedir, )
 from grok._grok import SubscribeDecorator as subscribe
 from grok.error import GrokError, GrokImportError

Modified: grok/trunk/src/grok/_grok.py
===================================================================
--- grok/trunk/src/grok/_grok.py	2006-10-18 11:33:41 UTC (rev 70778)
+++ grok/trunk/src/grok/_grok.py	2006-10-18 12:47:28 UTC (rev 70779)
@@ -51,6 +51,9 @@
     def __init__(self, context):
         self.context = context
 
+class Utility(object):
+    pass
+
 class MultiAdapter(object):
     pass
 
@@ -145,7 +148,7 @@
 
 
 def grok_module(module_info):
-    (models, adapters, multiadapters,
+    (models, adapters, multiadapters, utilities,
      views, templates, subscribers) = scan_module(module_info)
 
     find_filesystem_templates(module_info, templates)
@@ -155,6 +158,7 @@
     register_models(models)
     register_adapters(context, adapters)
     register_multiadapters(multiadapters)
+    register_utilities(utilities)
     register_views(context, views, templates)
     register_unassociated_templates(context, templates)
     register_subscribers(subscribers)
@@ -163,6 +167,7 @@
     models = []
     adapters = []
     multiadapters = []
+    utilities = []
     views = []
     templates = TemplateRegistry()
     subscribers = module_info.getAnnotation('grok.subscribers', [])
@@ -182,11 +187,14 @@
             multiadapters.append(obj)
         elif util.check_subclass(obj, View):
             views.append(obj)
+        elif util.check_subclass(obj, Utility):
+            utilities.append(obj)
         elif isinstance(obj, PageTemplate):
             templates.register(name, obj)
             obj._annotateGrokInfo(module_info, name, module_info.dotted_name)
 
-    return models, adapters, multiadapters, views, templates, subscribers
+    return (models, adapters, multiadapters, utilities,
+            views, templates, subscribers)
 
 def find_filesystem_templates(module_info, templates):
     template_dir_name = module_info.getAnnotation('grok.templatedir', module_info.name)
@@ -304,6 +312,11 @@
         name = class_annotation(factory, 'grok.name', '')
         component.provideAdapter(factory, name=name)
 
+def register_utilities(utilities):
+    for factory in utilities:
+        name = class_annotation(factory, 'grok.name', '')
+        component.provideUtility(factory(), name=name)
+
 def register_views(context, views, templates):
     for factory in views:
         view_context = determine_class_context(factory, context)

Modified: grok/trunk/src/grok/interfaces.py
===================================================================
--- grok/trunk/src/grok/interfaces.py	2006-10-18 11:33:41 UTC (rev 70778)
+++ grok/trunk/src/grok/interfaces.py	2006-10-18 12:47:28 UTC (rev 70779)
@@ -21,6 +21,7 @@
                                 "(models).")
     Adapter = interface.Attribute("Base class for adapters.")
     MultiAdapter = interface.Attribute("Base class for multi-adapters.")
+    Utility = interface.Attribute("Base class for utilities.")
     View = interface.Attribute("Base class for browser views.")
 
 class IGrokErrors(interface.Interface):

Modified: grok/trunk/src/grok/tests/test_grok.py
===================================================================
--- grok/trunk/src/grok/tests/test_grok.py	2006-10-18 11:33:41 UTC (rev 70778)
+++ grok/trunk/src/grok/tests/test_grok.py	2006-10-18 12:47:28 UTC (rev 70779)
@@ -33,7 +33,7 @@
 def test_suite():
     suite = unittest.TestSuite()
     for name in ['adapter', 'error', 'view', 'security', 'scan',
-                 'event', 'zcml', 'static']:
+                 'event', 'zcml', 'static', 'utility']:
         suite.addTest(suiteFromPackage(name))
     return suite
 

Added: grok/trunk/src/grok/tests/utility/__init__.py
===================================================================
--- grok/trunk/src/grok/tests/utility/__init__.py	2006-10-18 11:33:41 UTC (rev 70778)
+++ grok/trunk/src/grok/tests/utility/__init__.py	2006-10-18 12:47:28 UTC (rev 70779)
@@ -0,0 +1 @@
+# this is a package

Added: grok/trunk/src/grok/tests/utility/utility.py
===================================================================
--- grok/trunk/src/grok/tests/utility/utility.py	2006-10-18 11:33:41 UTC (rev 70778)
+++ grok/trunk/src/grok/tests/utility/utility.py	2006-10-18 12:47:28 UTC (rev 70779)
@@ -0,0 +1,33 @@
+"""
+Global utilities can be created by subclassing grok.Utility:
+
+  >>> grok.grok(__name__)
+  >>> from zope import component
+
+  >>> normal_club = component.getUtility(IClub)
+  >>> IClub.providedBy(normal_club)
+  True
+  >>> isinstance(normal_club, NormalClub)
+  True
+
+Named utilities are registered using grok.name:
+
+  >>> huge_club = component.getUtility(IClub, name='huge')
+  >>> IClub.providedBy(huge_club)
+  True
+  >>> isinstance(huge_club, HugeClub)
+  True
+"""
+import grok
+
+from zope import interface
+
+class IClub(interface.Interface):
+    pass
+
+class NormalClub(grok.Utility):
+    grok.implements(IClub)
+
+class HugeClub(grok.Utility):
+    grok.implements(IClub)
+    grok.name('huge')    



More information about the Checkins mailing list