[Checkins] SVN: grokcore.component/trunk/ Add support for an @provider decorator to let a function directly provide
Martin Aspeli
optilude at gmx.net
Thu Apr 9 08:28:27 EDT 2009
Log message for revision 99031:
Add support for an @provider decorator to let a function directly provide
an interface::
Changed:
U grokcore.component/trunk/CHANGES.txt
U grokcore.component/trunk/src/grokcore/component/__init__.py
U grokcore.component/trunk/src/grokcore/component/decorators.py
A grokcore.component/trunk/src/grokcore/component/tests/adapter/providerdecorator.py
-=-
Modified: grokcore.component/trunk/CHANGES.txt
===================================================================
--- grokcore.component/trunk/CHANGES.txt 2009-04-09 12:09:19 UTC (rev 99030)
+++ grokcore.component/trunk/CHANGES.txt 2009-04-09 12:28:27 UTC (rev 99031)
@@ -4,6 +4,15 @@
1.6 (unreleased)
----------------
+* Add support for an @provider decorator to let a function directly provide
+ an interface::
+
+ @provider(IFoo, IBar)
+ def some_function():
+ ...
+
+ This is equivalent to doing alsoProvides(some_function, IFoo, IBar).
+
* Add support for named adapters with the @adapter decorator::
@adapter(IAdaptedOne, IAdaptedTwo, name=u"foo")
Modified: grokcore.component/trunk/src/grokcore/component/__init__.py
===================================================================
--- grokcore.component/trunk/src/grokcore/component/__init__.py 2009-04-09 12:09:19 UTC (rev 99030)
+++ grokcore.component/trunk/src/grokcore/component/__init__.py 2009-04-09 12:28:27 UTC (rev 99031)
@@ -23,7 +23,7 @@
from martian import baseclass
from grokcore.component.directive import (
context, name, title, description, provides, global_utility, direct)
-from grokcore.component.decorators import subscribe, adapter, implementer
+from grokcore.component.decorators import subscribe, adapter, implementer, provider
from martian.error import GrokError, GrokImportError
# Import this module so that it's available as soon as you import the
Modified: grokcore.component/trunk/src/grokcore/component/decorators.py
===================================================================
--- grokcore.component/trunk/src/grokcore/component/decorators.py 2009-04-09 12:09:19 UTC (rev 99030)
+++ grokcore.component/trunk/src/grokcore/component/decorators.py 2009-04-09 12:28:27 UTC (rev 99031)
@@ -20,6 +20,8 @@
from martian.util import frame_is_module
from martian.error import GrokImportError
+from zope.interface.declarations import DescriptorAwareMetaClasses
+
class subscribe:
def __init__(self, *args):
@@ -86,3 +88,16 @@
frame.f_locals['__grok_adapters__'] = adapters = []
adapters.append(ob)
return zope.interface.implementer.__call__(self, ob)
+
+class provider:
+
+ def __init__(self, *interfaces):
+ self.interfaces = interfaces
+
+ def __call__(self, ob):
+ if isinstance(ob, DescriptorAwareMetaClasses):
+ raise TypeError("Can't use implementer with classes. Use one of "
+ "the class-declaration functions instead."
+ )
+ zope.interface.alsoProvides(ob, *self.interfaces)
+ return ob
Added: grokcore.component/trunk/src/grokcore/component/tests/adapter/providerdecorator.py
===================================================================
--- grokcore.component/trunk/src/grokcore/component/tests/adapter/providerdecorator.py (rev 0)
+++ grokcore.component/trunk/src/grokcore/component/tests/adapter/providerdecorator.py 2009-04-09 12:28:27 UTC (rev 99031)
@@ -0,0 +1,44 @@
+"""
+ >>> grok.testing.grok(__name__)
+
+ >>> IMarker.providedBy(not_marked)
+ False
+ >>> IMarker.providedBy(marked)
+ True
+ >>> IMarker.providedBy(double_marked)
+ True
+
+ >>> IMarker2.providedBy(not_marked)
+ False
+ >>> IMarker2.providedBy(marked)
+ False
+ >>> IMarker2.providedBy(double_marked)
+ True
+
+ >>> marked()
+ 123
+
+ >>> double_marked()
+ 234
+
+"""
+
+import grokcore.component as grok
+from zope import interface
+
+class IMarker(interface.Interface):
+ pass
+
+class IMarker2(interface.Interface):
+ pass
+
+ at grok.provider(IMarker)
+def marked():
+ return 123
+
+ at grok.provider(IMarker, IMarker2)
+def double_marked():
+ return 234
+
+def not_marked():
+ return 456
\ No newline at end of file
More information about the Checkins
mailing list