[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