diff options
-rw-r--r-- | lib/mako/codegen.py | 11 | ||||
-rw-r--r-- | test/cache.py | 14 | ||||
-rw-r--r-- | test/filters.py | 6 |
3 files changed, 25 insertions, 6 deletions
diff --git a/lib/mako/codegen.py b/lib/mako/codegen.py index c2a10d3..52ded80 100644 --- a/lib/mako/codegen.py +++ b/lib/mako/codegen.py @@ -346,8 +346,9 @@ class _GenerateRenderMethod(object): s = "_buf.getvalue()" if filtered: s = self.create_filter_callable(node.filter_args.args, s, False) - s = self.create_filter_callable(self.compiler.buffer_filters, s, False) self.printer.writeline(None) + if buffered and not cached: + s = self.create_filter_callable(self.compiler.buffer_filters, s, False) if buffered or cached: self.printer.writeline("return %s" % s) else: @@ -384,10 +385,10 @@ class _GenerateRenderMethod(object): self.write_variable_declares(identifiers, limit=node_or_pagetag.undeclared_identifiers()) if buffered: - self.printer.writelines( - "return context.get('local').get_cached(%s, %screatefunc=lambda:__%s(%s*args, **kwargs))" % (cachekey, ''.join(["%s=%s, " % (k,v) for k, v in cacheargs.iteritems()]), name, ctx_arg), - None - ) + s = "context.get('local').get_cached(%s, %screatefunc=lambda:__%s(%s*args, **kwargs))" % (cachekey, ''.join(["%s=%s, " % (k,v) for k, v in cacheargs.iteritems()]), name, ctx_arg) + # apply buffer_filters + s = self.create_filter_callable(self.compiler.buffer_filters, s, False) + self.printer.writelines("return " + s,None) else: self.printer.writelines( "context.write(context.get('local').get_cached(%s, %screatefunc=lambda:__%s(%s*args, **kwargs)))" % (cachekey, ''.join(["%s=%s, " % (k,v) for k, v in cacheargs.iteritems()]), name, ctx_arg), diff --git a/test/cache.py b/test/cache.py index f6f318f..1542a2c 100644 --- a/test/cache.py +++ b/test/cache.py @@ -222,6 +222,20 @@ class CacheTest(unittest.TestCase): ] assert m.kwargs == {'data_dir':'./test_htdocs', 'type':'file'} + def test_buffered(self): + t = Template(""" + <%! + def a(text): + return "this is a " + text.strip() + %> + ${foo()} + ${foo()} + <%def name="foo()" cached="True" buffered="True"> + this is a test + </%def> + """, buffer_filters=["a"]) + assert result_lines(t.render()) == ["this is a this is a test", "this is a this is a test"] + def _install_mock_cache(self, template): m = MockCache(template.module._template_cache) template.module._template_cache = m diff --git a/test/filters.py b/test/filters.py index aa0eb4e..da7caa9 100644 --- a/test/filters.py +++ b/test/filters.py @@ -160,11 +160,15 @@ class FilterTest(unittest.TestCase): %> ${foo()} + ${bar()} <%def name="foo()" filter="b"> this is text </%def> + <%def name="bar()" filter="b" buffered="True"> + this is text + </%def> """, buffer_filters=['a']) - assert flatten_result(t.render()) == "this is a" + assert flatten_result(t.render()) == "this is b this is a" def test_builtins(self): |