# HG changeset patch
# User cmlenz
# Date 1236960402 0
# Node ID eb8aa869048043145cd880a7cac2c0ae5eee71ca
# Parent 8ebccfa9a9fe3f69f61609748c58a3df02d16238
inline branch: template object can be compiled, and remembers the generated module.
diff --git a/examples/bench/bigtable.py b/examples/bench/bigtable.py
--- a/examples/bench/bigtable.py
+++ b/examples/bench/bigtable.py
@@ -57,7 +57,13 @@
""")
-genshi_tmpl_compiled = genshi_tmpl.compile()
+genshi_tmpl_compiled = MarkupTemplate("""
+
+""").compile()
genshi_tmpl2 = MarkupTemplate("""
@@ -108,7 +114,7 @@
def test_genshi_compiled():
"""Genshi template, compiled to Python"""
- stream = Stream(genshi_tmpl_compiled.generate(Context(table=table)))
+ stream = genshi_tmpl_compiled.generate(table=table)
stream.render('html', strip_whitespace=False)
def test_genshi_text():
diff --git a/genshi/template/base.py b/genshi/template/base.py
--- a/genshi/template/base.py
+++ b/genshi/template/base.py
@@ -22,6 +22,7 @@
import os
from StringIO import StringIO
import sys
+from types import ModuleType
from genshi.core import Attrs, Stream, StreamEventKind, START, TEXT, _ensure
from genshi.input import ParseError
@@ -394,6 +395,7 @@
self.lookup = lookup
self.allow_exec = allow_exec
self._init_filters()
+ self._module = None
self._prepared = False
if isinstance(source, basestring):
@@ -498,11 +500,12 @@
from genshi.template.inline import inline
name = (self.filename or '_some_ident').replace('.', '_')
- module = new_module(name)
+ module = ModuleType(name)
source = u'\n'.join(list(inline(self)))
code = compile(source, self.filepath or '', 'exec')
exec code in module.__dict__, module.__dict__
- return module
+ self._module = module
+ return self
def generate(self, *args, **kwargs):
"""Apply the template to the given context data.
@@ -529,9 +532,15 @@
else:
ctxt = Context(**kwargs)
- stream = self.stream
- for filter_ in self.filters:
- stream = filter_(iter(stream), ctxt, **vars)
+ if self._module is not None:
+ stream = self._module.generate(ctxt)
+ for filter_ in [f for f in self.filters if f != self._flatten]:
+ stream = filter_(iter(stream), ctxt, **vars)
+ else:
+ stream = self.stream
+ for filter_ in self.filters:
+ stream = filter_(iter(stream), ctxt, **vars)
+
return Stream(stream, self.serializer)
def _flatten(self, stream, ctxt, **vars):
diff --git a/genshi/template/inline.py b/genshi/template/inline.py
--- a/genshi/template/inline.py
+++ b/genshi/template/inline.py
@@ -313,23 +313,23 @@
print
print 'Executed module:'
- module = tmpl.compile()
- print Stream(module.generate(ctxt)).render('html')
+ tmpl.compile()
+ print tmpl.generate(ctxt).render('html')
print
print
t = timeit.Timer('list(tmpl.generate(**data))', '''
-from genshi.template import Context, MarkupTemplate
+from genshi.template import MarkupTemplate
data = dict(hello='world', items=range(10))
tmpl = MarkupTemplate("""%s""")''' % text)
print 'Interpreted: %.2f msec/pass' % (1000 * t.timeit(number=1000) / 1000)
print
- t = timeit.Timer('list(module.generate(Context(**data)))', '''
+ t = timeit.Timer('list(tmpl.generate(**data))', '''
from genshi.core import Stream
-from genshi.template import Context, MarkupTemplate
+from genshi.template import MarkupTemplate
data = dict(hello='world', items=range(10))
tmpl = MarkupTemplate("""%s""")
-module = tmpl.compile()''' % text)
+tmpl.compile()''' % text)
print 'Compiled: %.2f msec/pass' % (1000 * t.timeit(number=1000) / 1000)
print