[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