[Checkins] SVN: grok/trunk/src/grok/ implemented grok.MultiAdapter
Wolfgang Schnerring
wosc at wosc.de
Mon Oct 16 11:57:34 EDT 2006
Log message for revision 70703:
implemented grok.MultiAdapter
Changed:
U grok/trunk/src/grok/__init__.py
U grok/trunk/src/grok/_grok.py
A grok/trunk/src/grok/tests/adapter/multiadapter.py
-=-
Modified: grok/trunk/src/grok/__init__.py
===================================================================
--- grok/trunk/src/grok/__init__.py 2006-10-16 15:52:31 UTC (rev 70702)
+++ grok/trunk/src/grok/__init__.py 2006-10-16 15:57:31 UTC (rev 70703)
@@ -15,5 +15,6 @@
"""
from zope.interface import implements
-from _grok import (Model, Adapter, View, PageTemplate,
+from zope.component import adapts
+from _grok import (Model, Adapter, MultiAdapter, View, PageTemplate,
grok, context, name, template, resource)
Modified: grok/trunk/src/grok/_grok.py
===================================================================
--- grok/trunk/src/grok/_grok.py 2006-10-16 15:52:31 UTC (rev 70702)
+++ grok/trunk/src/grok/_grok.py 2006-10-16 15:57:31 UTC (rev 70703)
@@ -39,6 +39,9 @@
def __init__(self, context):
self.context = context
+class MultiAdapter(object):
+ pass
+
class View(BrowserPage):
def __call__(self):
@@ -78,6 +81,7 @@
context = None
adapters = []
+ multiadapters = []
views = []
templates = TemplateRegistry()
for name in dir(module):
@@ -93,6 +97,8 @@
context = AMBIGUOUS_CONTEXT
elif util.check_subclass(obj, Adapter):
adapters.append(obj)
+ elif util.check_subclass(obj, MultiAdapter):
+ multiadapters.append(obj)
elif util.check_subclass(obj, View):
views.append(obj)
elif isinstance(obj, PageTemplate):
@@ -125,6 +131,10 @@
name = directive_annotation(factory, 'grok.name', '')
component.provideAdapter(factory, adapts=(adapter_context,), name=name)
+ for factory in multiadapters:
+ name = directive_annotation(factory, 'grok.name', '')
+ component.provideAdapter(factory, name=name)
+
for factory in views:
view_context = determine_context(factory, context)
factory_name = factory.__name__.lower()
Added: grok/trunk/src/grok/tests/adapter/multiadapter.py
===================================================================
--- grok/trunk/src/grok/tests/adapter/multiadapter.py 2006-10-16 15:52:31 UTC (rev 70702)
+++ grok/trunk/src/grok/tests/adapter/multiadapter.py 2006-10-16 15:57:31 UTC (rev 70703)
@@ -0,0 +1,42 @@
+"""
+Multi-Adapters are supported by subclassing grok.MultiAdapter, giving
+multiple arguments to grok.adapts, and supplying a matching
+__init__():
+
+ >>> grok.grok(__name__)
+
+ >>> cave = Cave()
+ >>> fireplace = Fireplace()
+
+ >>> from zope import component
+ >>> home = component.getMultiAdapter((cave, fireplace))
+
+ >>> IHome.providedBy(home)
+ True
+ >>> isinstance(home, Home)
+ True
+ >>> home.cave is cave
+ True
+ >>> home.fireplace is fireplace
+ True
+"""
+
+import grok
+from zope import interface
+
+class Cave(grok.Model):
+ pass
+
+class Fireplace(grok.Model):
+ pass
+
+class IHome(interface.Interface):
+ pass
+
+class Home(grok.MultiAdapter):
+ grok.adapts(Cave, Fireplace)
+ grok.implements(IHome)
+
+ def __init__(self, cave, fireplace):
+ self.cave = cave
+ self.fireplace = fireplace
More information about the Checkins
mailing list