[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