[Checkins] SVN: grok/trunk/src/grok/ support explicit view names with grok.name

Philipp von Weitershausen philikon at philikon.de
Sun Oct 15 09:02:27 EDT 2006


Log message for revision 70642:
  support explicit view names with grok.name
  

Changed:
  U   grok/trunk/src/grok/__init__.py
  U   grok/trunk/src/grok/_grok.py
  U   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:49:37 UTC (rev 70641)
+++ grok/trunk/src/grok/__init__.py	2006-10-15 13:02:26 UTC (rev 70642)
@@ -15,4 +15,4 @@
 """
 
 from zope.interface import implements
-from _grok import Model, Adapter, View, grok, context
+from _grok import Model, Adapter, View, grok, context, name

Modified: grok/trunk/src/grok/_grok.py
===================================================================
--- grok/trunk/src/grok/_grok.py	2006-10-15 12:49:37 UTC (rev 70641)
+++ grok/trunk/src/grok/_grok.py	2006-10-15 13:02:26 UTC (rev 70642)
@@ -84,6 +84,7 @@
     for factory in views:
         view_context = determineContext(factory, context)
         name = factory.__name__.lower()
+        name = getattr(factory, '__grok_name__', name)
         component.provideAdapter(factory,
                                  adapts=(view_context, IDefaultBrowserLayer),
                                  provides=interface.Interface,
@@ -115,3 +116,14 @@
         raise GrokError("grok.context can only be called once per class "
                         "or module.")
     frame.f_locals['__grok_context__'] = obj
+
+def name(name):
+    frame = sys._getframe(1)
+    is_class = '__module__' in frame.f_locals
+    if not is_class:
+        raise GrokError("grok.name can only be used on class level.")
+
+    if '__grok_name__' in frame.f_locals:
+        raise GrokError("grok.name can only be called once per class.")
+
+    frame.f_locals['__grok_name__'] = name

Modified: grok/trunk/src/grok/tests/view/view.py
===================================================================
--- grok/trunk/src/grok/tests/view/view.py	2006-10-15 12:49:37 UTC (rev 70641)
+++ grok/trunk/src/grok/tests/view/view.py	2006-10-15 13:02:26 UTC (rev 70642)
@@ -2,6 +2,8 @@
 
   >>> grok.grok(__name__)
 
+We should find the ``cavepainting`` view for a mammoth:
+
   >>> manfred = Mammoth()
   >>> from zope.publisher.browser import TestRequest
   >>> request = TestRequest()
@@ -14,6 +16,20 @@
   True
   >>> view.request is request
   True
+
+Look up a view with a name explicitly set with ``grok.name``:
+
+  >>> view = component.getMultiAdapter((manfred, request), name='meal')
+  >>> view()
+  'Mammoth burger'
+
+There's no view 'food':
+
+  >>> view = component.getMultiAdapter((manfred, request), name='food')
+  Traceback (most recent call last):
+    ...
+  ComponentLookupError: ((<grok.tests.view.view.Mammoth object at 0x...>, <zope.publisher.browser.TestRequest instance URL=http://127.0.0.1>), <InterfaceClass zope.interface.Interface>, 'food')
+
 """
 
 import grok
@@ -25,3 +41,10 @@
 
     def render(self):
         return 'A cave painting of a mammoth'
+
+class Food(grok.View):
+    """Grok says: ME NO SEE MAMMOTH, ME SEE MEAL!"""
+    grok.name('meal')
+
+    def render(self):
+        return 'Mammoth burger'



More information about the Checkins mailing list