From: Florian Mounier Date: Thu, 5 Jan 2012 16:06:36 +0000 (+0100) Subject: Support included blocks override X-Git-Tag: 2.7~33^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=33aee12a29426987805420a410e13e0470a79cbf;p=thirdparty%2Fjinja.git Support included blocks override --- diff --git a/jinja2/compiler.py b/jinja2/compiler.py index b21cb386..5eab2b74 100644 --- a/jinja2/compiler.py +++ b/jinja2/compiler.py @@ -950,9 +950,16 @@ class CodeGenerator(NodeVisitor): self.indent() if node.with_context: + self.writeline('include_context = template.new_context(' + 'context.parent, True, locals())') + self.writeline('for name, context_blocks in context.' + 'blocks.%s():' % dict_item_iter) + self.indent() + self.writeline('include_context.blocks.setdefault(' + 'name, [])[0:0] = context_blocks') + self.outdent() self.writeline('for event in template.root_render_func(' - 'template.new_context(context.parent, True, ' - 'locals())):') + 'include_context):') else: self.writeline('for event in template.module._body_stream:') diff --git a/jinja2/testsuite/imports.py b/jinja2/testsuite/imports.py index 1cb12cbd..ea49922a 100644 --- a/jinja2/testsuite/imports.py +++ b/jinja2/testsuite/imports.py @@ -121,6 +121,22 @@ class IncludesTestCase(JinjaTestCase): ))) assert env.get_template("main").render() == "123" + def test_included_block_override(self): + env = Environment(loader=DictLoader(dict( + main="{% extends 'base' %}{% block b %}1337{% endblock %}", + base="{% include 'inc' %}", + inc="{% block b %}42{% endblock %}" + ))) + assert env.get_template("main").render() == "1337" + + def test_included_block_override_with_super(self): + env = Environment(loader=DictLoader(dict( + main="{% extends 'base' %}{% block b %}1337|{{ super() }}{% endblock %}", + base="{% include 'inc' %}", + inc="{% block b %}42{% endblock %}" + ))) + assert env.get_template("main").render() == "1337|42" + def test_unoptimized_scopes(self): t = test_env.from_string(""" {% macro outer(o) %}