[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