[Checkins] SVN: grokcore.component/trunk/s Bring over the @grok.subscribe() decorator and the SubscribeGrokker (plus tests)

Philipp von Weitershausen philikon at philikon.de
Thu May 1 04:33:24 EDT 2008


Log message for revision 85961:
  Bring over the @grok.subscribe() decorator and the SubscribeGrokker (plus tests)

Changed:
  U   grokcore.component/trunk/setup.py
  U   grokcore.component/trunk/src/grokcore/component/__init__.py
  U   grokcore.component/trunk/src/grokcore/component/decorators.py
  U   grokcore.component/trunk/src/grokcore/component/meta.py
  A   grokcore.component/trunk/src/grokcore/component/tests/event/
  U   grokcore.component/trunk/src/grokcore/component/tests/event/errorconditions.py
  U   grokcore.component/trunk/src/grokcore/component/tests/event/errorconditions_fixture.py
  U   grokcore.component/trunk/src/grokcore/component/tests/event/subscriber.py
  U   grokcore.component/trunk/src/grokcore/component/tests/test_grok.py

-=-
Modified: grokcore.component/trunk/setup.py
===================================================================
--- grokcore.component/trunk/setup.py	2008-05-01 08:32:26 UTC (rev 85960)
+++ grokcore.component/trunk/setup.py	2008-05-01 08:33:23 UTC (rev 85961)
@@ -38,5 +38,6 @@
                       'zope.component',
                       'zope.configuration',
                       'zope.interface',
+                      'zope.event', # for tests
                       ],
 )

Modified: grokcore.component/trunk/src/grokcore/component/__init__.py
===================================================================
--- grokcore.component/trunk/src/grokcore/component/__init__.py	2008-05-01 08:32:26 UTC (rev 85960)
+++ grokcore.component/trunk/src/grokcore/component/__init__.py	2008-05-01 08:33:23 UTC (rev 85961)
@@ -23,7 +23,7 @@
 from grokcore.component.directive import (context, name, title,
                             provides, baseclass, global_utility,
                             direct, order)
-from grokcore.component.decorators import adapter, implementer
+from grokcore.component.decorators import subscribe, adapter, implementer
 from martian.error import GrokError, GrokImportError
 
 # BBB These two functions are meant for test fixtures and should be

Modified: grokcore.component/trunk/src/grokcore/component/decorators.py
===================================================================
--- grokcore.component/trunk/src/grokcore/component/decorators.py	2008-05-01 08:32:26 UTC (rev 85960)
+++ grokcore.component/trunk/src/grokcore/component/decorators.py	2008-05-01 08:33:23 UTC (rev 85961)
@@ -17,8 +17,30 @@
 import types
 from zope.component._declaration import adapter as _adapter
 from zope.interface.declarations import implementer as _implementer
+from martian.util import frame_is_module
 from martian.error import GrokImportError
 
+class subscribe:
+
+    def __init__(self, *args):
+        self.subscribed = args
+
+    def __call__(self, function):
+        frame = sys._getframe(1)
+        if not frame_is_module(frame):
+            raise GrokImportError("@grok.subscribe can only be used on module "
+                                  "level.")
+
+        if not self.subscribed:
+            raise GrokImportError("@grok.subscribe requires at least one "
+                                  "argument.")
+
+        subscribers = frame.f_locals.get('__grok_subscribers__', None)
+        if subscribers is None:
+            frame.f_locals['__grok_subscribers__'] = subscribers = []
+        subscribers.append((function, self.subscribed))
+        return function
+
 class adapter(_adapter):
 
     def __init__(self, *interfaces):

Modified: grokcore.component/trunk/src/grokcore/component/meta.py
===================================================================
--- grokcore.component/trunk/src/grokcore/component/meta.py	2008-05-01 08:32:26 UTC (rev 85960)
+++ grokcore.component/trunk/src/grokcore/component/meta.py	2008-05-01 08:33:23 UTC (rev 85961)
@@ -15,6 +15,7 @@
 
 import martian
 import grokcore.component
+import zope.component.interface
 
 from zope import component
 from martian import util
@@ -151,3 +152,24 @@
                                      provides=info.provides,
                                      name=info.name)
         return True
+
+
+class SubscriberGrokker(martian.GlobalGrokker):
+
+    def grok(self, name, module, module_info, config, **kw):
+        subscribers = module_info.getAnnotation('grok.subscribers', [])
+
+        for factory, subscribed in subscribers:
+            config.action(
+                discriminator=None,
+                callable=component.provideHandler,
+                args=(factory, subscribed),
+                )
+
+            for iface in subscribed:
+                config.action(
+                    discriminator=None,
+                    callable=zope.component.interface.provideInterface,
+                    args=('', iface)
+                    )
+        return True

Copied: grokcore.component/trunk/src/grokcore/component/tests/event (from rev 85959, grok/branches/brandon-grokcore.component/src/grok/tests/event)

Modified: grokcore.component/trunk/src/grokcore/component/tests/event/errorconditions.py
===================================================================
--- grok/branches/brandon-grokcore.component/src/grok/tests/event/errorconditions.py	2008-05-01 08:15:00 UTC (rev 85959)
+++ grokcore.component/trunk/src/grokcore/component/tests/event/errorconditions.py	2008-05-01 08:33:23 UTC (rev 85961)
@@ -14,21 +14,22 @@
 
 @grok.subscribe can not be called without arguments:
 
-  >>> import grok.tests.event.errorconditions_fixture
+  >>> import grokcore.component.tests.event.errorconditions_fixture
   Traceback (most recent call last):
     ...
   GrokImportError: @grok.subscribe requires at least one argument.
   
 """
-import grok
+import grokcore.component as grok
+from zope.component.interfaces import IObjectEvent
 
 def function_context():
-    @grok.subscribe(grok.Model, grok.IObjectCreatedEvent)
+    @grok.subscribe(grok.Context, IObjectEvent)
     def subscriber():
         pass
     
 def class_context():
     class Wrapper:
-        @grok.subscribe(grok.Model, grok.IObjectCreatedEvent)
+        @grok.subscribe(grok.Context, IObjectEvent)
         def subscriber(self):
             pass

Modified: grokcore.component/trunk/src/grokcore/component/tests/event/errorconditions_fixture.py
===================================================================
--- grok/branches/brandon-grokcore.component/src/grok/tests/event/errorconditions_fixture.py	2008-05-01 08:15:00 UTC (rev 85959)
+++ grokcore.component/trunk/src/grokcore/component/tests/event/errorconditions_fixture.py	2008-05-01 08:33:23 UTC (rev 85961)
@@ -1,4 +1,4 @@
-import grok
+import grokcore.component as grok
 
 @grok.subscribe()
 def subscriber():

Modified: grokcore.component/trunk/src/grokcore/component/tests/event/subscriber.py
===================================================================
--- grok/branches/brandon-grokcore.component/src/grok/tests/event/subscriber.py	2008-05-01 08:15:00 UTC (rev 85959)
+++ grokcore.component/trunk/src/grokcore/component/tests/event/subscriber.py	2008-05-01 08:33:23 UTC (rev 85961)
@@ -3,7 +3,7 @@
 
   >>> grok.testing.grok(__name__)
   >>> manfred = Mammoth('Manfred')
-  >>> grok.notify(grok.ObjectCreatedEvent(manfred))
+  >>> zope.event.notify(ObjectEvent(manfred))
   >>> mammoths
   ['Manfred']
   >>> mammoths2
@@ -16,7 +16,9 @@
   ['Manfred', 'Max']
 
 """
-import grok
+import zope.event
+import grokcore.component as grok
+from zope.component.interfaces import IObjectEvent, ObjectEvent
 
 class Mammoth(object):
     def __init__(self, name):
@@ -25,10 +27,10 @@
 mammoths = []
 mammoths2 = []
 
- at grok.subscribe(Mammoth, grok.IObjectCreatedEvent)
+ at grok.subscribe(Mammoth, IObjectEvent)
 def mammothAdded(mammoth, event):
     mammoths.append(mammoth.name)
 
- at grok.subscribe(Mammoth, grok.ObjectCreatedEvent)
+ at grok.subscribe(Mammoth, IObjectEvent)
 def mammothAddedInstance(mammoth, event):
     mammoths2.append(mammoth.name)

Modified: grokcore.component/trunk/src/grokcore/component/tests/test_grok.py
===================================================================
--- grokcore.component/trunk/src/grokcore/component/tests/test_grok.py	2008-05-01 08:32:26 UTC (rev 85960)
+++ grokcore.component/trunk/src/grokcore/component/tests/test_grok.py	2008-05-01 08:33:23 UTC (rev 85961)
@@ -46,7 +46,7 @@
 def test_suite():
     suite = unittest.TestSuite()
     for name in ['adapter', 'directive', 'grokker', 'order', 'testsetup',
-                 'util', 'utility', 'view',]:
+                 'util', 'utility', 'view', 'event']:
         suite.addTest(suiteFromPackage(name))
     return suite
 



More information about the Checkins mailing list