[Checkins] SVN: grokcore.view/trunk/src/grokcore/view/ Add an interface for a CodeView, and test that View and CodeView respect correctly theirs interfaces.

Sylvain Viollon sylvain at infrae.com
Tue Sep 15 11:43:17 EDT 2009


Log message for revision 104101:
  Add an interface for a CodeView, and test that View and CodeView respect correctly theirs interfaces.
  
  

Changed:
  U   grokcore.view/trunk/src/grokcore/view/components.py
  U   grokcore.view/trunk/src/grokcore/view/interfaces.py
  U   grokcore.view/trunk/src/grokcore/view/tests/view/codeview.py
  U   grokcore.view/trunk/src/grokcore/view/tests/view/view.py
  A   grokcore.view/trunk/src/grokcore/view/tests/view/view_templates/
  A   grokcore.view/trunk/src/grokcore/view/tests/view/view_templates/cavepainting.pt
  A   grokcore.view/trunk/src/grokcore/view/tests/view/view_templates/meal.pt

-=-
Modified: grokcore.view/trunk/src/grokcore/view/components.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/components.py	2009-09-15 15:15:23 UTC (rev 104100)
+++ grokcore.view/trunk/src/grokcore/view/components.py	2009-09-15 15:43:16 UTC (rev 104101)
@@ -32,13 +32,13 @@
 
 
 class BaseView(BrowserPage):
-    interface.implements(interfaces.IGrokView)
+    interface.implements(interfaces.IGrokBaseView)
 
     def __init__(self, context, request):
         super(BaseView, self).__init__(context, request)
         self.__name__ = getattr(self, '__view_name__', None)
 
-    def update(self):
+    def update(self, **kwargs):
         pass
 
     def redirect(self, url):
@@ -78,10 +78,12 @@
 
 class CodeView(BaseView):
 
+    interface.implements(interfaces.IGrokCodeView)
+
     def __init__(self, context, request):
         super(CodeView, self).__init__(context, request)
 
-    def __call__(self):
+    def __call__(self, *args, **kwargs):
         mapply(self.update, (), self.request)
         if self.request.response.getStatus() in (302, 303):
             # A redirect was triggered somewhere in update().  Don't
@@ -93,6 +95,8 @@
 
 class View(BaseView):
 
+    interface.implements(interfaces.IGrokView)
+
     def __init__(self, context, request):
         super(View, self).__init__(context, request)
 
@@ -105,7 +109,7 @@
         else:
             self.static = None
 
-    def __call__(self):
+    def __call__(self, *args, **kwargs):
         mapply(self.update, (), self.request)
         if self.request.response.getStatus() in (302, 303):
             # A redirect was triggered somewhere in update().  Don't
@@ -236,6 +240,7 @@
         factory.macros = property(_get_macros)
 
     def render(self, view):
+        assert interfaces.IGrokView.providedBy(view)
         namespace = self.getNamespace(view)
         template = self._template
         namespace.update(template.pt_getContext())

Modified: grokcore.view/trunk/src/grokcore/view/interfaces.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/interfaces.py	2009-09-15 15:15:23 UTC (rev 104100)
+++ grokcore.view/trunk/src/grokcore/view/interfaces.py	2009-09-15 15:43:16 UTC (rev 104101)
@@ -74,7 +74,7 @@
     IDefaultBrowserLayer = Attribute('Default layer for browser views.')
 
 
-class IGrokView(IBrowserPage, IBrowserView):
+class IGrokBaseView(IBrowserPage, IBrowserView):
     """Grok views all provide this interface."""
 
     context = Attribute('context', "Object that the view presents.")
@@ -84,9 +84,6 @@
     response = Attribute('response', "Response object that is "
                          "associated with the current request.")
 
-    static = Attribute('static', "Directory resource containing "
-                       "the static files of the view's package.")
-
     def redirect(url):
        """Redirect to given URL"""
 
@@ -107,22 +104,6 @@
         as a cgi query string.
         """
 
-    def default_namespace():
-        """Returns a dictionary of namespaces that the template
-        implementation expects to always be available.
-
-        This method is *not* intended to be overridden by application
-        developers.
-        """
-
-    def namespace():
-        """Returns a dictionary that is injected in the template
-        namespace in addition to the default namespace.
-
-        This method *is* intended to be overridden by the application
-        developer.
-        """
-
     def update(**kw):
         """This method is meant to be implemented by grok.View
         subclasses.  It will be called *before* the view's associated
@@ -133,6 +114,9 @@
         filled in from the request (in that case they *must* be
         present in the request)."""
 
+
+class IGrokCodeView(IGrokBaseView):
+
     def render(**kw):
         """A view can either be rendered by an associated template, or
         it can implement this method to render itself from Python.
@@ -144,6 +128,29 @@
         present in the request)."""
 
 
+class IGrokView(IGrokBaseView):
+
+    static = Attribute('static', "Directory resource containing "
+                       "the static files of the view's package.")
+
+    def default_namespace():
+        """Returns a dictionary of namespaces that the template
+        implementation expects to always be available.
+
+        This method is *not* intended to be overridden by application
+        developers.
+        """
+
+    def namespace():
+        """Returns a dictionary that is injected in the template
+        namespace in addition to the default namespace.
+
+        This method *is* intended to be overridden by the application
+        developer.
+        """
+
+
+
 class ITemplateFileFactory(Interface):
     """Utility that generates templates from files in template directories.
     """

Modified: grokcore.view/trunk/src/grokcore/view/tests/view/codeview.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/tests/view/codeview.py	2009-09-15 15:15:23 UTC (rev 104100)
+++ grokcore.view/trunk/src/grokcore/view/tests/view/codeview.py	2009-09-15 15:43:16 UTC (rev 104101)
@@ -3,7 +3,9 @@
   >>> grok.testing.grok(__name__)
 
   >>> from zope.publisher.browser import TestRequest
+  >>> from zope.interface.verify import verifyObject
   >>> from zope.component import getMultiAdapter
+  >>> from grokcore.view.interfaces import IGrokCodeView
 
   >>> mammoth = Mammoth()
 
@@ -11,6 +13,9 @@
   >>> print code_view()
   A cave painting of a mammoth
 
+  >>> verifyObject(IGrokCodeView, code_view)
+  True
+
 """
 
 import grokcore.view as grok
@@ -20,5 +25,5 @@
 
 class CavePainting(grok.CodeView):
 
-    def render(self):
+    def render(self, **kwargs):
         return 'A cave painting of a mammoth'

Modified: grokcore.view/trunk/src/grokcore/view/tests/view/view.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/tests/view/view.py	2009-09-15 15:15:23 UTC (rev 104100)
+++ grokcore.view/trunk/src/grokcore/view/tests/view/view.py	2009-09-15 15:43:16 UTC (rev 104101)
@@ -2,6 +2,9 @@
 
   >>> grok.testing.grok(__name__)
 
+  >>> from zope.interface.verify import verifyObject
+  >>> from grokcore.view.interfaces import IGrokView
+
 We should find the ``cavepainting`` view for a mammoth:
 
   >>> manfred = Mammoth()
@@ -9,19 +12,23 @@
   >>> request = TestRequest()
   >>> from zope import component
   >>> view = component.getMultiAdapter((manfred, request), name='cavepainting')
-  >>> view()
-  'A cave painting of a mammoth'
+  >>> print view()
+  A cave painting of a mammoth
 
   >>> view.context is manfred
   True
   >>> view.request is request
   True
+  >>> verifyObject(IGrokView, view)
+  True
 
 Look up a view with a name explicitly set with ``grok.name``:
 
   >>> view = component.getMultiAdapter((manfred, request), name='meal')
-  >>> view()
-  'Mammoth burger'
+  >>> print view()
+  Mammoth burger
+  >>> verifyObject(IGrokView, view)
+  True
 
 There's no view 'food':
 
@@ -37,14 +44,11 @@
 class Mammoth(grok.Context):
     pass
 
-class CavePainting(grok.CodeView):
+class CavePainting(grok.View):
+    pass
 
-    def render(self):
-        return 'A cave painting of a mammoth'
-
-class Food(grok.CodeView):
+class Food(grok.View):
     """Grok says: ME NO SEE MAMMOTH, ME SEE MEAL!"""
     grok.name('meal')
+    grok.template('meal')
 
-    def render(self):
-        return 'Mammoth burger'

Added: grokcore.view/trunk/src/grokcore/view/tests/view/view_templates/cavepainting.pt
===================================================================
--- grokcore.view/trunk/src/grokcore/view/tests/view/view_templates/cavepainting.pt	                        (rev 0)
+++ grokcore.view/trunk/src/grokcore/view/tests/view/view_templates/cavepainting.pt	2009-09-15 15:43:16 UTC (rev 104101)
@@ -0,0 +1 @@
+<tal:cave>A cave painting of a mammoth</tal:cave>

Added: grokcore.view/trunk/src/grokcore/view/tests/view/view_templates/meal.pt
===================================================================
--- grokcore.view/trunk/src/grokcore/view/tests/view/view_templates/meal.pt	                        (rev 0)
+++ grokcore.view/trunk/src/grokcore/view/tests/view/view_templates/meal.pt	2009-09-15 15:43:16 UTC (rev 104101)
@@ -0,0 +1 @@
+<tal:meal>Mammoth burger</tal:meal>



More information about the checkins mailing list