[Checkins] SVN: grokcore.component/trunk/ Add support for named adapters with the @adapter decorator

Martin Aspeli optilude at gmx.net
Thu Apr 9 08:09:19 EDT 2009


Log message for revision 99030:
  Add support for named adapters with the @adapter decorator

Changed:
  U   grokcore.component/trunk/CHANGES.txt
  U   grokcore.component/trunk/src/grokcore/component/decorators.py
  U   grokcore.component/trunk/src/grokcore/component/meta.py
  U   grokcore.component/trunk/src/grokcore/component/tests/adapter/adapterdecorator.py

-=-
Modified: grokcore.component/trunk/CHANGES.txt
===================================================================
--- grokcore.component/trunk/CHANGES.txt	2009-04-09 10:20:12 UTC (rev 99029)
+++ grokcore.component/trunk/CHANGES.txt	2009-04-09 12:09:19 UTC (rev 99030)
@@ -4,8 +4,12 @@
 1.6 (unreleased)
 ----------------
 
-* ...
+* Add support for named adapters with the @adapter decorator::
 
+    @adapter(IAdaptedOne, IAdaptedTwo, name=u"foo")
+    def some_function(one, two):
+        ...
+
 1.5.1 (2008-07-28)
 ------------------
 

Modified: grokcore.component/trunk/src/grokcore/component/decorators.py
===================================================================
--- grokcore.component/trunk/src/grokcore/component/decorators.py	2009-04-09 10:20:12 UTC (rev 99029)
+++ grokcore.component/trunk/src/grokcore/component/decorators.py	2009-04-09 12:09:19 UTC (rev 99030)
@@ -48,17 +48,32 @@
 class adapter(zope.component.adapter):
 
     # Override the z.c.adapter decorator to force sanity checking and
-    # have better error reporting.
+    # have better error reporting and add the ability to capture the name
 
-    def __init__(self, *interfaces):
+    def __init__(self, *interfaces, **kw):
         if not interfaces:
             raise GrokImportError(
                 "@grok.adapter requires at least one argument.")
         if type(interfaces[0]) is types.FunctionType:
             raise GrokImportError(
                 "@grok.adapter requires at least one argument.")
-
+        
+        self.name = u""
+        
+        if kw:
+            if 'name' in kw:
+                self.name = kw.pop('name')
+            if kw:
+                raise GrokImportError(
+                    "@grok.adapter got unexpected keyword arguments: %s" % ','.join(kw.keys()))
+        
         zope.component.adapter.__init__(self, *interfaces)
+    
+    def __call__(self, ob):
+        ob = zope.component.adapter.__call__(self, ob)
+        if self.name:
+            ob.__component_name__ = self.name
+        return ob
 
 class implementer(zope.interface.implementer):
 

Modified: grokcore.component/trunk/src/grokcore/component/meta.py
===================================================================
--- grokcore.component/trunk/src/grokcore/component/meta.py	2009-04-09 10:20:12 UTC (rev 99029)
+++ grokcore.component/trunk/src/grokcore/component/meta.py	2009-04-09 12:09:19 UTC (rev 99030)
@@ -123,11 +123,11 @@
                 check_module_component(function, context, 'context',
                                        grokcore.component.context)
                 interfaces = (context, )
-
+            name = getattr(function, '__component_name__', u"")
             config.action(
-                discriminator=('adapter', interfaces, function.__implemented__),
+                discriminator=('adapter', interfaces, function.__implemented__, name),
                 callable=component.provideAdapter,
-                args=(function, interfaces, function.__implemented__),
+                args=(function, interfaces, function.__implemented__, name),
                 )
         return True
 

Modified: grokcore.component/trunk/src/grokcore/component/tests/adapter/adapterdecorator.py
===================================================================
--- grokcore.component/trunk/src/grokcore/component/tests/adapter/adapterdecorator.py	2009-04-09 10:20:12 UTC (rev 99029)
+++ grokcore.component/trunk/src/grokcore/component/tests/adapter/adapterdecorator.py	2009-04-09 12:09:19 UTC (rev 99030)
@@ -3,12 +3,16 @@
   >>>
   >>> cave = Cave()
   >>> home = IHome(cave)
+  >>> home.id
+  u'default'
   >>> IHome.providedBy(home)
   True
   >>>
   >>> isinstance(home, Home)
   True
   >>> morehome = IMoreHome(cave)
+  >>> morehome.id
+  u'default'
   >>> IHome.providedBy(morehome)
   True
   >>> isinstance(morehome, Home)
@@ -18,6 +22,8 @@
   True
   >>> isinstance(yetanotherhome, Home)
   True
+  >>> yetanotherhome.id
+  u'default'
 
   >>> from grokcore.component.tests.adapter import noarguments_fixture
   Traceback (most recent call last):
@@ -29,6 +35,11 @@
   ...
   GrokImportError: @grok.adapter requires at least one argument.
 
+  >>> from zope.component import getAdapter
+  >>> home = getAdapter(cave, IHome, name='home')
+  >>> home.id
+  u'secondary'
+
 """
 
 import grokcore.component as grok
@@ -55,6 +66,9 @@
 
 class Home(object):
     grok.implements(IHome)
+    
+    def __init__(self, id=u"default"):
+        self.id = id
 
 @grok.adapter(Cave)
 @grok.implementer(IHome)
@@ -69,3 +83,8 @@
 @grok.implementer(IYetAnotherHome)
 def yet_another_home_for_cave(cave):
     return Home()
+
+ at grok.adapter(Cave, name=u"home")
+ at grok.implementer(IHome)
+def home_for_cave_named(cave):
+    return Home(u"secondary")
\ No newline at end of file



More information about the Checkins mailing list