[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