[Checkins] SVN: grok/trunk/src/grok/ Refactored context determination

Philipp von Weitershausen philikon at philikon.de
Sun Oct 15 08:48:18 EDT 2006


Log message for revision 70640:
  Refactored context determination
  Improved error messages when missing or ambiguous context
  Minimal grok view registration
  

Changed:
  U   grok/trunk/src/grok/__init__.py
  U   grok/trunk/src/grok/_grok.py
  U   grok/trunk/src/grok/tests/adapter/importedmodel2.py
  U   grok/trunk/src/grok/tests/adapter/multiple.py
  U   grok/trunk/src/grok/tests/adapter/nomodel.py
  U   grok/trunk/src/grok/tests/test_grok.py
  A   grok/trunk/src/grok/tests/view/
  A   grok/trunk/src/grok/tests/view/__init__.py
  A   grok/trunk/src/grok/tests/view/view.py

-=-
Modified: grok/trunk/src/grok/__init__.py
===================================================================
--- grok/trunk/src/grok/__init__.py	2006-10-15 12:20:21 UTC (rev 70639)
+++ grok/trunk/src/grok/__init__.py	2006-10-15 12:48:17 UTC (rev 70640)
@@ -15,4 +15,4 @@
 """
 
 from zope.interface import implements
-from _grok import Model, Adapter, grok, context
+from _grok import Model, Adapter, View, grok, context

Modified: grok/trunk/src/grok/_grok.py
===================================================================
--- grok/trunk/src/grok/_grok.py	2006-10-15 12:20:21 UTC (rev 70639)
+++ grok/trunk/src/grok/_grok.py	2006-10-15 12:48:17 UTC (rev 70640)
@@ -17,7 +17,10 @@
 import sys
 from zope.dottedname.resolve import resolve
 from zope import component
+from zope import interface
 from zope.interface.interfaces import IInterface
+from zope.publisher.browser import BrowserPage
+from zope.publisher.interfaces.browser import IDefaultBrowserLayer
 
 class Model(object):
     pass
@@ -27,6 +30,14 @@
     def __init__(self, context):
         self.context = context
 
+class View(BrowserPage):
+
+    def __call__(self):
+        return self.render()
+
+    def render(self):
+        raise NotImplemented
+
 class GrokError(Exception):
     pass
 
@@ -46,6 +57,7 @@
 
     context = None
     adapters = []
+    views = []
     for name in dir(module):
         obj = getattr(module, name)
 
@@ -59,18 +71,34 @@
                 context = AMBIGUOUS_CONTEXT
         elif check_subclass(obj, Adapter):
             adapters.append(obj)
+        elif check_subclass(obj, View):
+            views.append(obj)
 
     if getattr(module, '__grok_context__', None):
         context = module.__grok_context__
 
     for factory in adapters:
-        adapter_context = getattr(factory, '__grok_context__', context)
-        if adapter_context is None:
-            raise GrokError("Adapter without context")
-        elif adapter_context is AMBIGUOUS_CONTEXT:
-            raise GrokError("Ambiguous contexts, please use grok.context.")
+        adapter_context = determineContext(factory, context)
         component.provideAdapter(factory, adapts=(adapter_context,))
 
+    for factory in views:
+        view_context = determineContext(factory, context)
+        name = factory.__name__.lower()
+        component.provideAdapter(factory,
+                                 adapts=(view_context, IDefaultBrowserLayer),
+                                 provides=interface.Interface,
+                                 name=name)
+
+def determineContext(factory, module_context):
+    context = getattr(factory, '__grok_context__', module_context)
+    if context is None:
+        raise GrokError("Cannot determine context for %r, please use "
+                        "grok.context." % factory)
+    elif context is AMBIGUOUS_CONTEXT:
+        raise GrokError("Ambiguous contexts for %r, please use "
+                        "grok.context." % factory)
+    return context
+
 def context(obj):
     if not (IInterface.providedBy(obj) or isclass(obj)):
         raise GrokError("You can only pass classes or interfaces to "

Modified: grok/trunk/src/grok/tests/adapter/importedmodel2.py
===================================================================
--- grok/trunk/src/grok/tests/adapter/importedmodel2.py	2006-10-15 12:20:21 UTC (rev 70639)
+++ grok/trunk/src/grok/tests/adapter/importedmodel2.py	2006-10-15 12:48:17 UTC (rev 70640)
@@ -4,7 +4,7 @@
   >>> grok.grok(__name__)
   Traceback (most recent call last):
     ...
-  GrokError: Adapter without context
+  GrokError: Cannot determine context for <class 'grok.tests.adapter.importedmodel2.Painting'>, please use grok.context.
 
 """
 import grok

Modified: grok/trunk/src/grok/tests/adapter/multiple.py
===================================================================
--- grok/trunk/src/grok/tests/adapter/multiple.py	2006-10-15 12:20:21 UTC (rev 70639)
+++ grok/trunk/src/grok/tests/adapter/multiple.py	2006-10-15 12:48:17 UTC (rev 70640)
@@ -4,7 +4,7 @@
   >>> grok.grok(__name__)
   Traceback (most recent call last):
     ...
-  GrokError: Ambiguous contexts, please use grok.context.
+  GrokError: Ambiguous contexts for <class 'grok.tests.adapter.multiple.Home'>, please use grok.context.
 
 """
 import grok

Modified: grok/trunk/src/grok/tests/adapter/nomodel.py
===================================================================
--- grok/trunk/src/grok/tests/adapter/nomodel.py	2006-10-15 12:20:21 UTC (rev 70639)
+++ grok/trunk/src/grok/tests/adapter/nomodel.py	2006-10-15 12:48:17 UTC (rev 70640)
@@ -4,7 +4,7 @@
   >>> grok.grok(__name__)
   Traceback (most recent call last):
     ...
-  GrokError: Adapter without context
+  GrokError: Cannot determine context for <class 'grok.tests.adapter.nomodel.Home'>, please use grok.context.
 
 """
 import grok

Modified: grok/trunk/src/grok/tests/test_grok.py
===================================================================
--- grok/trunk/src/grok/tests/test_grok.py	2006-10-15 12:20:21 UTC (rev 70639)
+++ grok/trunk/src/grok/tests/test_grok.py	2006-10-15 12:48:17 UTC (rev 70640)
@@ -25,7 +25,7 @@
 
 def test_suite():
     suite = unittest.TestSuite()
-    for name in ['adapter']:
+    for name in ['adapter', 'view']:
         suite.addTest(suiteFromPackage(name))
     return suite
 

Copied: grok/trunk/src/grok/tests/view/__init__.py (from rev 70615, grok/trunk/src/grok/tests/__init__.py)

Added: grok/trunk/src/grok/tests/view/view.py
===================================================================
--- grok/trunk/src/grok/tests/view/view.py	2006-10-15 12:20:21 UTC (rev 70639)
+++ grok/trunk/src/grok/tests/view/view.py	2006-10-15 12:48:17 UTC (rev 70640)
@@ -0,0 +1,23 @@
+"""
+
+  >>> grok.grok(__name__)
+
+  >>> manfred = Mammoth()
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest()
+  >>> from zope import component
+  >>> view = component.getMultiAdapter((manfred, request), name='cavepainting')
+  >>> view()
+  'A cave painting of a mammoth'
+
+"""
+
+import grok
+
+class Mammoth(grok.Model):
+    pass
+
+class CavePainting(grok.View):
+
+    def render(self):
+        return 'A cave painting of a mammoth'


Property changes on: grok/trunk/src/grok/tests/view/view.py
___________________________________________________________________
Name: svn:eol-style
   + native



More information about the Checkins mailing list