[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