[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