[Checkins] SVN: grok/trunk/src/grok/ test that Adapter, MultiAdapter and Utility have to implement exactly one interface

Wolfgang Schnerring wosc at wosc.de
Wed Oct 18 09:26:06 EDT 2006


Log message for revision 70780:
  test that Adapter, MultiAdapter and Utility have to implement exactly one interface

Changed:
  U   grok/trunk/src/grok/_grok.py
  A   grok/trunk/src/grok/tests/adapter/implementsmany.py
  A   grok/trunk/src/grok/tests/adapter/implementsnone.py
  A   grok/trunk/src/grok/tests/adapter/implementsnonemulti.py
  A   grok/trunk/src/grok/tests/utility/implementsnone.py

-=-
Modified: grok/trunk/src/grok/_grok.py
===================================================================
--- grok/trunk/src/grok/_grok.py	2006-10-18 12:47:28 UTC (rev 70779)
+++ grok/trunk/src/grok/_grok.py	2006-10-18 13:26:05 UTC (rev 70780)
@@ -304,16 +304,19 @@
 def register_adapters(context, adapters):
     for factory in adapters:
         adapter_context = determine_class_context(factory, context)
+        check_implements_one(factory)
         name = class_annotation(factory, 'grok.name', '')
         component.provideAdapter(factory, adapts=(adapter_context,), name=name)
 
 def register_multiadapters(multiadapters):
     for factory in multiadapters:
+        check_implements_one(factory)
         name = class_annotation(factory, 'grok.name', '')
         component.provideAdapter(factory, name=name)
 
 def register_utilities(utilities):
     for factory in utilities:
+        check_implements_one(factory)
         name = class_annotation(factory, 'grok.name', '')
         component.provideUtility(factory(), name=name)
 
@@ -419,6 +422,12 @@
         raise GrokError("Multiple possible contexts for %r, please use "
                         "grok.context." % component, component)
 
+def check_implements_one(class_):
+    if len(list(interface.implementedBy(class_))) != 1:
+        raise GrokError("%r must implement exactly one interface "
+                        "(use grok.implements to specify)."
+                        % class_, class_)
+
 def determine_module_context(module_info, models):
     if len(models) == 0:
         context = None

Added: grok/trunk/src/grok/tests/adapter/implementsmany.py
===================================================================
--- grok/trunk/src/grok/tests/adapter/implementsmany.py	2006-10-18 12:47:28 UTC (rev 70779)
+++ grok/trunk/src/grok/tests/adapter/implementsmany.py	2006-10-18 13:26:05 UTC (rev 70780)
@@ -0,0 +1,24 @@
+"""
+Subclasses of grok.Adapter and grok.MultiAdapter must implement exactly one
+interface:
+
+  >>> grok.grok(__name__)
+  Traceback (most recent call last):
+    ...
+  GrokError: <class 'grok.tests.adapter.implementsmany.Home'> must implement exactly one interface (use grok.implements to specify).
+"""
+import grok
+
+from zope import interface
+
+class Cave(grok.Model):
+    pass
+
+class IHome(interface.Interface):
+    pass
+
+class IFireplace(interface.Interface):
+    pass
+
+class Home(grok.Adapter):
+    grok.implements(IHome, IFireplace)

Added: grok/trunk/src/grok/tests/adapter/implementsnone.py
===================================================================
--- grok/trunk/src/grok/tests/adapter/implementsnone.py	2006-10-18 12:47:28 UTC (rev 70779)
+++ grok/trunk/src/grok/tests/adapter/implementsnone.py	2006-10-18 13:26:05 UTC (rev 70780)
@@ -0,0 +1,17 @@
+"""
+Subclasses of grok.Adapter and grok.MultiAdapter must implement exactly one
+interface:
+
+  >>> grok.grok(__name__)
+  Traceback (most recent call last):
+    ...
+  GrokError: <class 'grok.tests.adapter.implementsnone.Home'> must
+  implement exactly one interface (use grok.implements to specify).
+"""
+import grok
+
+class Cave(grok.Model):
+    pass
+
+class Home(grok.Adapter):
+    pass

Added: grok/trunk/src/grok/tests/adapter/implementsnonemulti.py
===================================================================
--- grok/trunk/src/grok/tests/adapter/implementsnonemulti.py	2006-10-18 12:47:28 UTC (rev 70779)
+++ grok/trunk/src/grok/tests/adapter/implementsnonemulti.py	2006-10-18 13:26:05 UTC (rev 70780)
@@ -0,0 +1,17 @@
+"""
+Subclasses of grok.Adapter and grok.MultiAdapter must implement exactly one
+interface:
+
+  >>> grok.grok(__name__)
+  Traceback (most recent call last):
+    ...
+  GrokError: <class 'grok.tests.adapter.implementsnonemulti.Home'> must
+  implement exactly one interface (use grok.implements to specify).
+"""
+import grok
+
+class Cave(grok.Model):
+    pass
+
+class Home(grok.MultiAdapter):
+    pass

Added: grok/trunk/src/grok/tests/utility/implementsnone.py
===================================================================
--- grok/trunk/src/grok/tests/utility/implementsnone.py	2006-10-18 12:47:28 UTC (rev 70779)
+++ grok/trunk/src/grok/tests/utility/implementsnone.py	2006-10-18 13:26:05 UTC (rev 70780)
@@ -0,0 +1,13 @@
+"""
+Subclasses of grok.Utility must implement exactly one interface:
+
+  >>> grok.grok(__name__)
+  Traceback (most recent call last):
+    ...
+  GrokError: <class 'grok.tests.utility.implementsnone.Club'> must
+  implement exactly one interface (use grok.implements to specify).
+"""
+import grok
+
+class Club(grok.Utility):
+    pass



More information about the Checkins mailing list