[Checkins] SVN: five.grok/trunk/src/five/grok/ Last of the view unit tests.

Lennart Regebro regebro at gmail.com
Thu Jul 17 09:36:23 EDT 2008


Log message for revision 88441:
  Last of the view unit tests.
  

Changed:
  U   five.grok/trunk/src/five/grok/components.py
  U   five.grok/trunk/src/five/grok/tests/view/modequalspkgname/modequalspkgname.py
  A   five.grok/trunk/src/five/grok/tests/view/template.py
  A   five.grok/trunk/src/five/grok/tests/view/templatedirectory.py
  A   five.grok/trunk/src/five/grok/tests/view/templatedirectoryname/
  A   five.grok/trunk/src/five/grok/tests/view/templatedirectoryname/food.pt
  A   five.grok/trunk/src/five/grok/tests/view/templatefile.py
  A   five.grok/trunk/src/five/grok/tests/view/templatenotfound.py
  A   five.grok/trunk/src/five/grok/tests/view/templatereload.py
  A   five.grok/trunk/src/five/grok/tests/view/templatereload_templates/
  A   five.grok/trunk/src/five/grok/tests/view/templatereload_templates/index.pt
  A   five.grok/trunk/src/five/grok/tests/view/twoviewsusetemplate.py
  A   five.grok/trunk/src/five/grok/tests/view/unassociated.py
  A   five.grok/trunk/src/five/grok/tests/view/unassociated_templates/
  A   five.grok/trunk/src/five/grok/tests/view/unassociated_templates/index.pt
  A   five.grok/trunk/src/five/grok/tests/view/update.py
  A   five.grok/trunk/src/five/grok/tests/view/update_redirect.py

-=-
Modified: five.grok/trunk/src/five/grok/components.py
===================================================================
--- five.grok/trunk/src/five/grok/components.py	2008-07-17 13:28:10 UTC (rev 88440)
+++ five.grok/trunk/src/five/grok/components.py	2008-07-17 13:36:22 UTC (rev 88441)
@@ -1,3 +1,5 @@
+import sys, os
+
 import martian
 from zope import interface
 from zope import component

Modified: five.grok/trunk/src/five/grok/tests/view/modequalspkgname/modequalspkgname.py
===================================================================
--- five.grok/trunk/src/five/grok/tests/view/modequalspkgname/modequalspkgname.py	2008-07-17 13:28:10 UTC (rev 88440)
+++ five.grok/trunk/src/five/grok/tests/view/modequalspkgname/modequalspkgname.py	2008-07-17 13:36:22 UTC (rev 88441)
@@ -3,7 +3,7 @@
 resides in. Grokking it should not provoke an `unassociated template`
 error or warning.
 """
-import grok
+from five import grok
 class Cave(grok.Model):
     pass
 

Added: five.grok/trunk/src/five/grok/tests/view/template.py
===================================================================
--- five.grok/trunk/src/five/grok/tests/view/template.py	                        (rev 0)
+++ five.grok/trunk/src/five/grok/tests/view/template.py	2008-07-17 13:36:22 UTC (rev 88441)
@@ -0,0 +1,41 @@
+"""
+
+  >>> grok.testing.grok(__name__)
+
+View with an associated PageTemplate that is referred to using
+``grok.template``:
+
+  >>> manfred = Mammoth()
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest()
+  >>> from zope import component
+  >>> view = component.getMultiAdapter((manfred, request), name='painting')
+  >>> print view()
+  <html><body><h1>GROK PAINT MAMMOTH!</h1></body></html>
+
+``grok.name`` and ``grok.template`` can be combined:
+
+  >>> view = component.getMultiAdapter((manfred, request), name='meal')
+  >>> print view()
+  <html><body><h1>GROK EAT MAMMOTH!</h1></body></html>
+
+"""
+from five import grok
+
+class Mammoth(grok.Model):
+    pass
+
+class Painting(grok.View):
+    grok.template('cavepainting')
+
+cavepainting = grok.PageTemplate("""\
+<html><body><h1>GROK PAINT MAMMOTH!</h1></body></html>
+""")
+
+class Food(grok.View):
+    grok.template('food_template')
+    grok.name('meal')
+
+food_template = grok.PageTemplate("""\
+<html><body><h1>GROK EAT MAMMOTH!</h1></body></html>
+""")


Property changes on: five.grok/trunk/src/five/grok/tests/view/template.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: five.grok/trunk/src/five/grok/tests/view/templatedirectory.py
===================================================================
--- five.grok/trunk/src/five/grok/tests/view/templatedirectory.py	                        (rev 0)
+++ five.grok/trunk/src/five/grok/tests/view/templatedirectory.py	2008-07-17 13:36:22 UTC (rev 88441)
@@ -0,0 +1,27 @@
+"""
+You can explicitly specify the template directory using grok.templatedir on module level:
+
+  >>> grok.testing.grok(__name__)
+
+  >>> manfred = Mammoth()
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest()
+  >>> from zope import component
+  >>> view = component.getMultiAdapter((manfred, request), name='food')
+  >>> print view()
+  <html>
+  <body>
+  ME GROK EAT MAMMOTH!
+  </body>
+  </html>
+
+"""
+from five import grok
+
+grok.templatedir('templatedirectoryname')
+
+class Mammoth(grok.Model):
+    pass
+
+class Food(grok.View):
+    pass


Property changes on: five.grok/trunk/src/five/grok/tests/view/templatedirectory.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: five.grok/trunk/src/five/grok/tests/view/templatedirectoryname/food.pt
===================================================================
--- five.grok/trunk/src/five/grok/tests/view/templatedirectoryname/food.pt	                        (rev 0)
+++ five.grok/trunk/src/five/grok/tests/view/templatedirectoryname/food.pt	2008-07-17 13:36:22 UTC (rev 88441)
@@ -0,0 +1,5 @@
+<html>
+<body>
+ME GROK EAT MAMMOTH!
+</body>
+</html>


Property changes on: five.grok/trunk/src/five/grok/tests/view/templatedirectoryname/food.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: five.grok/trunk/src/five/grok/tests/view/templatefile.py
===================================================================
--- five.grok/trunk/src/five/grok/tests/view/templatefile.py	                        (rev 0)
+++ five.grok/trunk/src/five/grok/tests/view/templatefile.py	2008-07-17 13:36:22 UTC (rev 88441)
@@ -0,0 +1,31 @@
+"""
+
+  >>> grok.testing.grok(__name__)
+
+View with an associated PageTemplate that is referred to using
+``grok.template``:
+
+  >>> manfred = Mammoth()
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest()
+  >>> from zope import component
+  >>> view = component.getMultiAdapter((manfred, request), name='food')
+  >>> print view()
+  <html>
+  <body>
+  ME GROK EAT MAMMOTH!
+  </body>
+  </html>
+
+"""
+from five import grok
+import os.path
+
+class Mammoth(grok.Model):
+    pass
+
+class Food(grok.View):
+    pass
+
+food = grok.PageTemplate(filename=os.path.join('templatedirectoryname',
+                                               'food.pt'))


Property changes on: five.grok/trunk/src/five/grok/tests/view/templatefile.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: five.grok/trunk/src/five/grok/tests/view/templatenotfound.py
===================================================================
--- five.grok/trunk/src/five/grok/tests/view/templatenotfound.py	                        (rev 0)
+++ five.grok/trunk/src/five/grok/tests/view/templatenotfound.py	2008-07-17 13:36:22 UTC (rev 88441)
@@ -0,0 +1,20 @@
+"""
+This should fail because ``grok.template`` points to a non-existing
+template:
+
+  >>> grok.testing.grok(__name__)
+  Traceback (most recent call last):
+    ...
+  ConfigurationExecutionError: martian.error.GrokError: View <class 'five.grok.tests.view.templatenotfound.Painting'>
+  has no associated template or 'render' method.
+  in:
+"""
+from five import grok
+
+class Mammoth(grok.Model):
+    pass
+
+class Painting(grok.View):
+    grok.template('cavepainting')
+
+# no cavepainting template here


Property changes on: five.grok/trunk/src/five/grok/tests/view/templatenotfound.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: five.grok/trunk/src/five/grok/tests/view/templatereload.py
===================================================================
--- five.grok/trunk/src/five/grok/tests/view/templatereload.py	                        (rev 0)
+++ five.grok/trunk/src/five/grok/tests/view/templatereload.py	2008-07-17 13:36:22 UTC (rev 88441)
@@ -0,0 +1,39 @@
+"""
+Filesystem-based templates, once grokked, can be changed.  The change
+will automatically be picked up, reloading Zope is not necessary.
+
+  >>> grok.testing.grok(__name__)
+  >>> from zope.component import getMultiAdapter
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest()
+  >>> view = getMultiAdapter((Mammoth(), request), name='index')
+  >>> print view()
+  before
+
+Now we change the file:
+
+  >>> import os.path
+  >>> here = os.path.dirname(__file__)
+  >>> template_file = os.path.join(here, 'templatereload_templates', 'index.pt')
+  >>> template = open(template_file, 'w')
+  >>> template.write('after')
+  >>> template.close()
+
+and find that the output of the view has changed as well:
+
+  >>> print view()
+  after
+
+At last, we should change everything back to normal:
+
+  >>> template = open(template_file, 'w')
+  >>> template.write('before')
+  >>> template.close()
+"""
+from five import grok
+
+class Mammoth(grok.Model):
+    pass
+
+class Index(grok.View):
+    pass


Property changes on: five.grok/trunk/src/five/grok/tests/view/templatereload.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: five.grok/trunk/src/five/grok/tests/view/templatereload_templates/index.pt
===================================================================
--- five.grok/trunk/src/five/grok/tests/view/templatereload_templates/index.pt	                        (rev 0)
+++ five.grok/trunk/src/five/grok/tests/view/templatereload_templates/index.pt	2008-07-17 13:36:22 UTC (rev 88441)
@@ -0,0 +1 @@
+before
\ No newline at end of file


Property changes on: five.grok/trunk/src/five/grok/tests/view/templatereload_templates/index.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: five.grok/trunk/src/five/grok/tests/view/twoviewsusetemplate.py
===================================================================
--- five.grok/trunk/src/five/grok/tests/view/twoviewsusetemplate.py	                        (rev 0)
+++ five.grok/trunk/src/five/grok/tests/view/twoviewsusetemplate.py	2008-07-17 13:36:22 UTC (rev 88441)
@@ -0,0 +1,61 @@
+"""
+A template can be used by multiple views at the same time:
+
+  >>> grok.testing.grok(__name__)
+
+  >>> manfred = Mammoth()
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest()
+  >>> from zope import component
+
+  >>> view = component.getMultiAdapter((manfred, request), name='a')
+  >>> print view()
+  View A
+
+  >>> view = component.getMultiAdapter((manfred, request), name='b')
+  >>> print view()
+  View A
+
+It also works if templates are both associated explicitly:
+
+  >>> view = component.getMultiAdapter((manfred, request), name='c')
+  >>> print view()
+  Template
+
+  >>> view = component.getMultiAdapter((manfred, request), name='d')
+  >>> print view()
+  Template
+
+Because the template is associated, we do not expect it to be
+registered as its own view:
+
+  >>> view = component.getMultiAdapter((manfred, request), name='templ')
+  Traceback (most recent call last):
+    ...
+  ComponentLookupError:
+  ((<five.grok.tests.view.twoviewsusetemplate.Mammoth object at 0x...>,
+  <zope.publisher.browser.TestRequest instance URL=http://127.0.0.1>),
+  <InterfaceClass zope.interface.Interface>, 'templ')
+
+
+"""
+from five import grok
+
+class Mammoth(grok.Model):
+    pass
+
+class A(grok.View):
+    pass
+
+a = grok.PageTemplate("View A")
+
+class B(grok.View):
+    grok.template('a')
+
+class C(grok.View):
+    grok.template('templ')
+
+class D(grok.View):
+    grok.template('templ')
+
+templ = grok.PageTemplate('Template')


Property changes on: five.grok/trunk/src/five/grok/tests/view/twoviewsusetemplate.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: five.grok/trunk/src/five/grok/tests/view/unassociated.py
===================================================================
--- five.grok/trunk/src/five/grok/tests/view/unassociated.py	                        (rev 0)
+++ five.grok/trunk/src/five/grok/tests/view/unassociated.py	2008-07-17 13:36:22 UTC (rev 88441)
@@ -0,0 +1,32 @@
+"""
+Templates that are not associated with a view class will provoke an
+error:
+
+  >>> from five.grok.testing import warn
+  >>> import warnings
+  >>> saved_warn = warnings.warn
+  >>> warnings.warn = warn
+
+  >>> grok.testing.grok(__name__)
+  From five.grok.testing's warn():
+  ...UserWarning: Found the following unassociated template(s) when grokking
+  'five.grok.tests.view.unassociated': index.  Define view classes inheriting from
+  grok.View to enable the template(s)...
+
+Also templates of modules named equally as the package name the module
+resides in, should be found without error or warning. We check this
+with the local package `modequalspkgname`::
+
+  >>> warnings.warn = warn
+
+  >>> pkg = __name__.rsplit('.', 1)[0] + '.modequalspkgname'
+  >>> grok.testing.grok(pkg) is None
+  True
+
+  >>> warnings.warn = saved_warn
+
+"""
+from five import grok
+
+class Mammoth(grok.Model):
+    pass


Property changes on: five.grok/trunk/src/five/grok/tests/view/unassociated.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: five.grok/trunk/src/five/grok/tests/view/unassociated_templates/index.pt
===================================================================
--- five.grok/trunk/src/five/grok/tests/view/unassociated_templates/index.pt	                        (rev 0)
+++ five.grok/trunk/src/five/grok/tests/view/unassociated_templates/index.pt	2008-07-17 13:36:22 UTC (rev 88441)
@@ -0,0 +1,3 @@
+This template does not have an associated view class (in other words,
+there's no grok.tests.view.unassociated.Index class), therefore it
+provokes a GrokError.


Property changes on: five.grok/trunk/src/five/grok/tests/view/unassociated_templates/index.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: five.grok/trunk/src/five/grok/tests/view/update.py
===================================================================
--- five.grok/trunk/src/five/grok/tests/view/update.py	                        (rev 0)
+++ five.grok/trunk/src/five/grok/tests/view/update.py	2008-07-17 13:36:22 UTC (rev 88441)
@@ -0,0 +1,46 @@
+"""
+Before a view is rendered, the update() method is executed. It can be
+used e. g. to execute side effects or set up data for use in the
+template.
+
+  >>> grok.testing.grok(__name__)
+
+We need to set up a default ITraversable adapter so that TALES
+expressions can resolve paths:
+
+  >>> from zope import component
+  >>> from zope.traversing.adapters import DefaultTraversable
+  >>> component.provideAdapter(DefaultTraversable, (None,))
+
+  >>> manfred = Mammoth()
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest()
+  >>> view = component.getMultiAdapter((manfred, request), name='cavepainting')
+  >>> print view()
+  <html>
+  <body>
+  <h1>red</h1>
+  <h1>red</h1>
+  </body>
+  </html>
+  
+
+"""
+from five import grok
+
+class Mammoth(grok.Model):
+    pass
+
+class CavePainting(grok.View):
+    def update(self):
+        self.color = "red"
+
+
+cavepainting = grok.PageTemplate("""\
+<html>
+<body>
+<h1 tal:content="view/color"/>
+<h1 tal:content="python: view.color"/>
+</body>
+</html>
+""")


Property changes on: five.grok/trunk/src/five/grok/tests/view/update.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: five.grok/trunk/src/five/grok/tests/view/update_redirect.py
===================================================================
--- five.grok/trunk/src/five/grok/tests/view/update_redirect.py	                        (rev 0)
+++ five.grok/trunk/src/five/grok/tests/view/update_redirect.py	2008-07-17 13:36:22 UTC (rev 88441)
@@ -0,0 +1,36 @@
+"""
+When a view's update() method redirects somewhere else, the template
+is not executed subsequently.
+
+  >>> grok.testing.grok(__name__)
+
+  >>> manfred = Mammoth()
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest()
+  >>> from zope.component import getMultiAdapter
+  >>> view = getMultiAdapter((manfred, request), name='cavepainting')
+  >>> print view()
+  None
+  >>> print request.response.getStatus()
+  302
+  >>> print request.response.getHeader('Location')
+  somewhere-else
+
+"""
+from five import grok
+
+class Mammoth(grok.Model):
+    pass
+
+class CavePainting(grok.View):
+    def update(self):
+        self.request.response.redirect('somewhere-else')
+
+
+cavepainting = grok.PageTemplate("""\
+<html>
+<body>
+<h1 tal:content="this-is-an-error" />
+</body>
+</html>
+""")


Property changes on: five.grok/trunk/src/five/grok/tests/view/update_redirect.py
___________________________________________________________________
Name: svn:keywords
   + Id



More information about the Checkins mailing list