[Checkins] SVN: z3c.pt/trunk/ Added API to render template macros.

Malthe Borch mborch at gmail.com
Sat Sep 13 15:26:04 EDT 2008


Log message for revision 91123:
  Added API to render template macros.

Changed:
  U   z3c.pt/trunk/CHANGES.txt
  U   z3c.pt/trunk/benchmark/benchmark/tests.py
  U   z3c.pt/trunk/src/z3c/pt/macro.py
  U   z3c.pt/trunk/src/z3c/pt/pagetemplate.py
  U   z3c.pt/trunk/src/z3c/pt/template.py
  U   z3c.pt/trunk/src/z3c/pt/testing.py

-=-
Modified: z3c.pt/trunk/CHANGES.txt
===================================================================
--- z3c.pt/trunk/CHANGES.txt	2008-09-13 18:40:19 UTC (rev 91122)
+++ z3c.pt/trunk/CHANGES.txt	2008-09-13 19:26:04 UTC (rev 91123)
@@ -6,6 +6,8 @@
 
   Backwards incompatibilities
 
+- Changes to template method signatures. [malthe]
+  
 - Engine now expects all strings to be unicode or contain ASCII
   characters only, unless an encoding is provided. [malthe]
   
@@ -20,6 +22,8 @@
 
   Features
 
+- Added template API to render macros. [malthe]
+  
 - Optimized template loader so only a single template is instantiated
   per file. [malthe]
   

Modified: z3c.pt/trunk/benchmark/benchmark/tests.py
===================================================================
--- z3c.pt/trunk/benchmark/benchmark/tests.py	2008-09-13 18:40:19 UTC (rev 91122)
+++ z3c.pt/trunk/benchmark/benchmark/tests.py	2008-09-13 19:26:04 UTC (rev 91123)
@@ -165,7 +165,7 @@
     def testCompilation(self):
         table = self.table
 
-        t_z3c = timing(self.bigtable_python_z3c.cook, params=('table',))
+        t_z3c = timing(self.bigtable_python_z3c.cook, parameters=('table',))
         t_zope = timing(self.bigtable_python_zope._cook)
 
         print "z3c.pt:            %.2f" % t_z3c
@@ -191,7 +191,7 @@
             self._testfile('bigtable_python_z3c.pt'))
         z3cfile.registry = filecache.TemplateCache(z3cfile.filename)
         z3cfile.registry.purge()
-        z3cfile.cook_check(None, ())
+        z3cfile.cook_check(parameters=())
         assert len(z3cfile.registry) == 1
         z3cfile.registry.save()
     
@@ -199,7 +199,7 @@
             self._testfile('bigtable_python_zope.pt'))
 
         t_cached_z3c = timing(z3cfile.registry.load)
-        t_cook_z3c = timing(z3cfile.cook, params=('table',))
+        t_cook_z3c = timing(z3cfile.cook, parameters=('table',))
         t_zope = timing(zopefile._cook)
 
         print "z3c.pt cooking:    %.3f" % t_cook_z3c

Modified: z3c.pt/trunk/src/z3c/pt/macro.py
===================================================================
--- z3c.pt/trunk/src/z3c/pt/macro.py	2008-09-13 18:40:19 UTC (rev 91122)
+++ z3c.pt/trunk/src/z3c/pt/macro.py	2008-09-13 19:26:04 UTC (rev 91123)
@@ -1,12 +1,12 @@
 class Macro(object):
     def __init__(self, render):
         self.render = render
-        
+
 class Macros(object):
-    def __init__(self, render):
-        self.render = render
+    def __init__(self, render_macro):
+        self.render = render_macro
 
     def __getitem__(self, name):
         def render(**kwargs):
-            return self.render(macro=name, **kwargs)
+            return self.render(name, parameters=kwargs)
         return Macro(render)

Modified: z3c.pt/trunk/src/z3c/pt/pagetemplate.py
===================================================================
--- z3c.pt/trunk/src/z3c/pt/pagetemplate.py	2008-09-13 18:40:19 UTC (rev 91122)
+++ z3c.pt/trunk/src/z3c/pt/pagetemplate.py	2008-09-13 19:26:04 UTC (rev 91123)
@@ -6,7 +6,7 @@
 import sys
 import os
 
-def prepare_language_support(kwargs):
+def prepare_language_support(**kwargs):
     target_language = kwargs.get('target_language')
 
     if config.DISABLE_I18N:
@@ -31,9 +31,9 @@
             parser = self.default_parser
         super(PageTemplate, self).__init__(body, parser, format, doctype)
 
-    def prepare(self, kwargs):
-        super(PageTemplate, self).prepare(kwargs)
-        prepare_language_support(kwargs)
+    def render(self, **kwargs):
+        prepare_language_support(**kwargs)
+        return super(PageTemplate, self).render(**kwargs)
 
 class PageTemplateFile(template.BaseTemplateFile):
     __doc__ = template.BaseTemplateFile.__doc__ # for Sphinx autodoc
@@ -47,9 +47,9 @@
         super(PageTemplateFile, self).__init__(filename, parser, format,
                                                doctype, **kwargs)
 
-    def prepare(self, kwargs):
-        super(PageTemplateFile, self).prepare(kwargs)
-        prepare_language_support(kwargs)
+    def render(self, **kwargs):
+        prepare_language_support(**kwargs)
+        return super(PageTemplateFile, self).render(**kwargs)
 
 class ZopePageTemplate(PageTemplate):
     default_parser = zpt.ZopePageTemplateParser(default_expression='path')
@@ -69,15 +69,29 @@
         self.template = ZopePageTemplate(body, **kwargs)
         property.__init__(self, self.bind)
 
-    def bind(self, view):
-        def template(**kwargs):
-            return self.template.render(view=view,
-                                        context=view.context,
-                                        request=view.request,
-                                        template=self.template,
-                                        options=kwargs)
-        return template
+    def bind(self, view, request=None, macro=None, global_scope=True):
+        def render(**kwargs):
+            template = self.template
+            
+            parameters = dict(
+                view=view,
+                context=view.context,
+                request=request or view.request,
+                template=template,
+                options=kwargs)
 
+            if macro is None:
+                return template.render(**parameters)
+            else:
+                return template.render_macro(
+                    macro, global_scope=global_scope, parameters=parameters)
+            
+        return render
+
+    @property
+    def macros(self):
+        return self.template.macros
+    
 class ViewPageTemplateFile(ViewPageTemplate):
     """If ``filename`` is a relative path, the module path of the
     class where the instance is used to get an absolute path."""

Modified: z3c.pt/trunk/src/z3c/pt/template.py
===================================================================
--- z3c.pt/trunk/src/z3c/pt/template.py	2008-09-13 18:40:19 UTC (rev 91122)
+++ z3c.pt/trunk/src/z3c/pt/template.py	2008-09-13 19:26:04 UTC (rev 91123)
@@ -35,12 +35,8 @@
             self.explicit_doctype = doctype
         
     @property
-    def translate(self):
-        return NotImplementedError("Must be provided by subclass.")
-
-    @property
     def macros(self):
-        return macro.Macros(self.render)
+        return macro.Macros(self.render_macro)
 
     @property
     def compiler(self):
@@ -53,27 +49,33 @@
     def cook(self, **kwargs):
         return self.compiler(**kwargs)
     
-    def cook_check(self, macro, params):
-        key = self.signature, macro, params, self.explicit_doctype
+    def cook_check(self, parameters, **kwargs):
+        key = tuple(parameters), \
+              tuple(item for item in kwargs.iteritems()), \
+              self.signature, self.explicit_doctype
         template = self.registry.get(key, None)
         if template is None:
-            template = self.cook(macro=macro, params=params)
+            template = self.cook(parameters=parameters, **kwargs)
             self.registry[key] = template
         return template
 
-    def prepare(self, kwargs):
-        pass
-    
-    def render(self, macro=None, **kwargs):
-        self.prepare(kwargs)
-        template = self.cook_check(macro, tuple(kwargs))
-        kwargs.update(template.selectors)
+    def render(self, **kwargs):
+        template = self.cook_check(parameters=kwargs)
         return template.render(**kwargs)
 
+    def render_macro(self, macro, global_scope=False, parameters={}):
+        template = self.cook_check(
+            parameters=parameters, macro=macro, global_scope=global_scope)
+        return template.render(**parameters)
+    
+    def render_xinclude(self, **kwargs):
+        return self.render_macro("", parameters=kwargs)
+
     def __repr__(self):
         return u"<%s %d>" % (self.__class__.__name__, id(self))
 
-    __call__ = render
+    def __call__(self, **kwargs):
+        return self.render(**kwargs)
     
 class BaseTemplateFile(BaseTemplate):
     """Constructs a template object using the template language
@@ -124,11 +126,13 @@
     filename = property(_get_filename, _set_filename)
 
     def read(self):
-        fd = open(self.filename, 'r')
+        filename = self.filename
+        mtime = self.mtime()
+        fd = open(filename, 'r')
         self.body = body = fd.read()
         fd.close()
-        self.signature = hash(body)
-        self._v_last_read = self.mtime()
+        self.signature = filename, mtime
+        self._v_last_read = mtime
 
     def cook(self, **kwargs):
         template = self.compiler(**kwargs)
@@ -141,14 +145,15 @@
 
         return template
 
-    def cook_check(self, *args):
+    def cook_check(self, **kwargs):
         if self.auto_reload and self._v_last_read != self.mtime():
             self.read()
 
-        return BaseTemplate.cook_check(self, *args)
+        return BaseTemplate.cook_check(self, **kwargs)
 
-    def prepare(self, kwargs):
+    def render(self, **kwargs):
         kwargs[config.SYMBOLS.xincludes] = self.xincludes
+        return super(BaseTemplateFile, self).render(**kwargs)
 
     def mtime(self):
         try:

Modified: z3c.pt/trunk/src/z3c/pt/testing.py
===================================================================
--- z3c.pt/trunk/src/z3c/pt/testing.py	2008-09-13 18:40:19 UTC (rev 91122)
+++ z3c.pt/trunk/src/z3c/pt/testing.py	2008-09-13 19:26:04 UTC (rev 91123)
@@ -35,7 +35,7 @@
 def compile_xhtml(body, **kwargs):
     compiler = TestCompiler(
         body, mock_parser, implicit_doctype=doctypes.xhtml)
-    return compiler(params=sorted(kwargs.keys()))
+    return compiler(parameters=sorted(kwargs.keys()))
 
 def render_xhtml(body, **kwargs):
     template = compile_xhtml(body, **kwargs)
@@ -44,20 +44,20 @@
 def render_text(body, **kwargs):
     compiler = TestCompiler.from_text(
         body, mock_parser, implicit_doctype=doctypes.xhtml)
-    template = compiler(params=sorted(kwargs.keys()))
+    template = compiler(parameters=sorted(kwargs.keys()))
     return template.render(**kwargs)    
 
 def render_zpt(body, **kwargs):
     compiler = TestCompiler(
         body, zpt.ZopePageTemplateParser(), implicit_doctype=doctypes.xhtml)
-    template = compiler(params=sorted(kwargs.keys()))
+    template = compiler(parameters=sorted(kwargs.keys()))
     return template.render(**kwargs)    
 
 def render_genshi(body, encoding=None, **kwargs):
     compiler = TestCompiler(
         body, genshi.GenshiParser(),
         encoding=encoding, implicit_doctype=doctypes.xhtml)
-    template = compiler(params=sorted(kwargs.keys()))
+    template = compiler(parameters=sorted(kwargs.keys()))
     kwargs.update(template.selectors)
     return template.render(**kwargs)    
 
@@ -68,10 +68,10 @@
 
     @property
     def macros(self):
-        def render(macro=None, **kwargs):
+        def render(name, parameters={}):
             compiler = TestCompiler(self.body, self.parser)
-            template = compiler(macro=macro, params=kwargs.keys())
-            return template.render(**kwargs)
+            template = compiler(macro=name, parameters=parameters)
+            return template.render(**parameters)
         return macro.Macros(render)
 
 class MockElement(translation.Element, translation.VariableInterpolation):



More information about the Checkins mailing list