[Checkins] SVN: five.pt/trunk/ Added support for ``PageTemplate`` and ``ZopePageTemplate`` classes. Also added test cases for the patches. Tested on 3.3 and 4.0.

Malthe Borch mborch at gmail.com
Wed Sep 8 02:54:51 EDT 2010


Log message for revision 116217:
  Added support for ``PageTemplate`` and ``ZopePageTemplate`` classes. Also added test cases for the patches. Tested on 3.3 and 4.0.

Changed:
  U   five.pt/trunk/CHANGES.txt
  U   five.pt/trunk/src/five/pt/pagetemplate.py
  U   five.pt/trunk/src/five/pt/patches.py
  U   five.pt/trunk/src/five/pt/tests/simple.pt
  D   five.pt/trunk/src/five/pt/tests/test_pagetemplatefile.py
  A   five.pt/trunk/src/five/pt/tests/test_viewpagetemplatefile.py

-=-
Modified: five.pt/trunk/CHANGES.txt
===================================================================
--- five.pt/trunk/CHANGES.txt	2010-09-07 21:49:08 UTC (rev 116216)
+++ five.pt/trunk/CHANGES.txt	2010-09-08 06:54:50 UTC (rev 116217)
@@ -3,9 +3,9 @@
 
 In next release...
 
-- ...
+- Added support for ``PageTemplate`` and
+  ``ZopePageTemplate``. [malthe]
 
-
 1.2 - 2010-08-30
 ~~~~~~~~~~~~~~~~
 

Modified: five.pt/trunk/src/five/pt/pagetemplate.py
===================================================================
--- five.pt/trunk/src/five/pt/pagetemplate.py	2010-09-07 21:49:08 UTC (rev 116216)
+++ five.pt/trunk/src/five/pt/pagetemplate.py	2010-09-08 06:54:50 UTC (rev 116217)
@@ -43,7 +43,7 @@
             context = aq_parent(instance)
             namespace = dict(
                 context=context,
-                request=request or aq_get(instance, 'REQUEST'),
+                request=request or aq_get(instance, 'REQUEST', None),
                 template=self,
                 here=context,
                 container=context,

Modified: five.pt/trunk/src/five/pt/patches.py
===================================================================
--- five.pt/trunk/src/five/pt/patches.py	2010-09-07 21:49:08 UTC (rev 116216)
+++ five.pt/trunk/src/five/pt/patches.py	2010-09-08 06:54:50 UTC (rev 116217)
@@ -12,10 +12,13 @@
      ZopeViewPageTemplateFile
 
 from Products.PageTemplates.PageTemplateFile import PageTemplateFile
+from Products.PageTemplates.PageTemplateFile import PageTemplate
+from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
 from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile as \
      FiveViewPageTemplateFile
 
 from five.pt.pagetemplate import ViewPageTemplateFile
+from five.pt.pagetemplate import BaseTemplate
 from five.pt.pagetemplate import BaseTemplateFile
 
 from Acquisition import aq_base
@@ -23,6 +26,8 @@
 from Acquisition.interfaces import IAcquirer
 from Acquisition import ImplicitAcquisitionWrapper
 
+from ComputedAttribute import ComputedAttribute
+
 try:
     from Products.Five.browser.pagetemplatefile import BoundPageTemplate
 except ImportError:
@@ -56,38 +61,61 @@
     if instance is None:
         return self
 
-    template = getattr(self, '_template', _marker)
+    template = getattr(self, '_v_template', _marker)
     if template is _marker:
-        self._template = template = ViewPageTemplateFile(self.filename)
+        self._v_template = template = ViewPageTemplateFile(self.filename)
 
     return BoundPageTemplate(template, instance)
 
 def call_template(self, *args, **kw):
-    template = getattr(self, '_template', _marker)
+    template = getattr(self, '_v_template', _marker)
+    if template is _marker or self._text != template.body:
+        self._v_template = template = BaseTemplate(self._text)
+
+    return template(self, *args, **kw)
+
+def call_template_and_wrap(self, *args, **kw):
+    template = getattr(self, '_v_template', _marker)
+    if template is _marker or self._text != template.body:
+        self._v_template = template = BaseTemplate(self._text)
+
+    if IAcquirer.providedBy(template):
+        template = template.__of__(aq_parent(self))
+    else:
+        template = ImplicitAcquisitionWrapper(template, aq_parent(self))
+
+    return template(self, *args, **kw)
+
+def call_template_file(self, *args, **kw):
+    template = getattr(self, '_v_template', _marker)
     if template is _marker:
-        self._template = template = BaseTemplateFile(self.filename)
+        self._v_template = template = BaseTemplateFile(self.filename)
 
     if IAcquirer.providedBy(template):
-        template = template.__of__(self)
+        template = template.__of__(aq_parent(self))
     else:
         template = ImplicitAcquisitionWrapper(template, aq_parent(self))
 
     return template(self, *args, **kw)
 
 def get_macros(self):
-    template = getattr(self, '_template', _marker)
+    template = getattr(self, '_v_template', _marker)
     if template is _marker:
-        self._template = template = BaseTemplateFile(self.filename)
+        self._v_template = template = BaseTemplateFile(self.filename)
 
     if IAcquirer.providedBy(template):
-        return template.__of__(self).macros
+        return template.__of__(aq_parent(self)).macros
     else:
         return template.macros
 
 FiveViewPageTemplateFile.__get__ = get_bound_template
 ZopeViewPageTemplateFile.__get__ = get_bound_template
-PageTemplateFile.__call__ = call_template
+PageTemplate.__call__ = call_template
+PageTemplate.macros = ComputedAttribute(get_macros, 1)
+PageTemplateFile.__call__ = call_template_file
 PageTemplateFile.macros = property(get_macros)
+ZopePageTemplate.__call__ = call_template_and_wrap
+ZopePageTemplate.macros = ComputedAttribute(get_macros, 1)
 
 try:
     from five.grok.components import ZopeTwoPageTemplate

Modified: five.pt/trunk/src/five/pt/tests/simple.pt
===================================================================
--- five.pt/trunk/src/five/pt/tests/simple.pt	2010-09-07 21:49:08 UTC (rev 116216)
+++ five.pt/trunk/src/five/pt/tests/simple.pt	2010-09-08 06:54:50 UTC (rev 116217)
@@ -1,4 +1,6 @@
 <div xmlns="http://www.w3.org/1999/xhtml"
-     xmlns:tal="http://xml.zope.org/namespaces/tal">
-    Hello World
+     xmlns:tal="http://xml.zope.org/namespaces/tal"
+     meta:interpolation="true"
+     tal:define="name string:world">
+    Hello ${name}!
 </div>

Deleted: five.pt/trunk/src/five/pt/tests/test_pagetemplatefile.py
===================================================================
--- five.pt/trunk/src/five/pt/tests/test_pagetemplatefile.py	2010-09-07 21:49:08 UTC (rev 116216)
+++ five.pt/trunk/src/five/pt/tests/test_pagetemplatefile.py	2010-09-08 06:54:50 UTC (rev 116217)
@@ -1,62 +0,0 @@
-import unittest
-
-from Products.Five import BrowserView
-from Testing.ZopeTestCase import ZopeTestCase
-
-from five.pt.pagetemplate import ViewPageTemplateFile
-
-class SimpleView(BrowserView):
-    index = ViewPageTemplateFile('simple.pt')
-
-class LocalsView(BrowserView):
-    def available(self):
-        return 'yes'
-
-    def tagsoup(self):
-        return '<foo></bar>'
-
-    index = ViewPageTemplateFile('locals.pt')
-
-class OptionsView(BrowserView):
-    index = ViewPageTemplateFile('options.pt')
-
-class TestPageTemplateFile(ZopeTestCase):
-    def afterSetUp(self):
-        from Products.Five import zcml
-        import Products.Five
-        import z3c.pt
-        zcml.load_config("configure.zcml", Products.Five)
-        zcml.load_config("configure.zcml", z3c.pt)
-
-    def test_simple(self):
-        view = SimpleView(self.folder, self.folder.REQUEST)
-        result = view.index()
-        self.failUnless('Hello World' in result)
-
-    def test_locals(self):
-        view = LocalsView(self.folder, self.folder.REQUEST)
-        result = view.index()
-        self.failUnless("view:yes" in result)
-        #self.failUnless('Folder at test_folder_1_' in result)
-        #self.failUnless('http://nohost' in result)
-        self.failUnless('here==context:True' in result)
-        self.failUnless('here==container:True' in result)
-        self.failUnless("root:(\'\',)" in result)
-        self.failUnless("nothing:None" in result)
-        self.failUnless("modules:&lt;foo&gt;" in result)
-
-    def test_options(self):
-        view = OptionsView(self.folder, self.folder.REQUEST)
-        options = dict(
-            a=1,
-            b=2,
-            c='abc',
-        )
-        result = view.index(**options)
-        self.failUnless("a : 1" in result)
-        self.failUnless("c : abc" in result)
-
-
-def test_suite():
-    import sys
-    return unittest.findTestCases(sys.modules[__name__])

Copied: five.pt/trunk/src/five/pt/tests/test_viewpagetemplatefile.py (from rev 116209, five.pt/trunk/src/five/pt/tests/test_pagetemplatefile.py)
===================================================================
--- five.pt/trunk/src/five/pt/tests/test_viewpagetemplatefile.py	                        (rev 0)
+++ five.pt/trunk/src/five/pt/tests/test_viewpagetemplatefile.py	2010-09-08 06:54:50 UTC (rev 116217)
@@ -0,0 +1,64 @@
+import unittest
+
+from Products.Five import BrowserView
+from Testing.ZopeTestCase import ZopeTestCase
+
+from five.pt.pagetemplate import ViewPageTemplateFile
+
+class SimpleView(BrowserView):
+    index = ViewPageTemplateFile('simple.pt')
+
+class LocalsView(BrowserView):
+    def available(self):
+        return 'yes'
+
+    def tagsoup(self):
+        return '<foo></bar>'
+
+    index = ViewPageTemplateFile('locals.pt')
+
+class OptionsView(BrowserView):
+    index = ViewPageTemplateFile('options.pt')
+
+class TestPageTemplateFile(ZopeTestCase):
+    def afterSetUp(self):
+        from Products.Five import zcml
+        import Products.Five
+        import z3c.pt
+        import five.pt
+        zcml.load_config("configure.zcml", Products.Five)
+        zcml.load_config("configure.zcml", five.pt)
+        zcml.load_config("configure.zcml", z3c.pt)
+
+    def test_simple(self):
+        view = SimpleView(self.folder, self.folder.REQUEST)
+        result = view.index()
+        self.failUnless('Hello world!' in result)
+
+    def test_locals(self):
+        view = LocalsView(self.folder, self.folder.REQUEST)
+        result = view.index()
+        self.failUnless("view:yes" in result)
+        #self.failUnless('Folder at test_folder_1_' in result)
+        #self.failUnless('http://nohost' in result)
+        self.failUnless('here==context:True' in result)
+        self.failUnless('here==container:True' in result)
+        self.failUnless("root:(\'\',)" in result)
+        self.failUnless("nothing:None" in result)
+        self.failUnless("modules:&lt;foo&gt;" in result)
+
+    def test_options(self):
+        view = OptionsView(self.folder, self.folder.REQUEST)
+        options = dict(
+            a=1,
+            b=2,
+            c='abc',
+        )
+        result = view.index(**options)
+        self.failUnless("a : 1" in result)
+        self.failUnless("c : abc" in result)
+
+
+def test_suite():
+    import sys
+    return unittest.findTestCases(sys.modules[__name__])



More information about the checkins mailing list