diff options
author | Florian Mounier <florian.mounier@kozea.fr> | 2012-01-05 17:06:36 +0100 |
---|---|---|
committer | Florian Mounier <florian.mounier@kozea.fr> | 2012-01-05 17:06:36 +0100 |
commit | 33aee12a29426987805420a410e13e0470a79cbf (patch) | |
tree | 3c675fa6c034206814f9cbee5715d8a96a31eb3b /jinja2 | |
parent | 80b4fe6159a31fe3752b659785c0c75ce3af2ef3 (diff) | |
download | jinja2-33aee12a29426987805420a410e13e0470a79cbf.tar.gz |
Support included blocks override
Diffstat (limited to 'jinja2')
-rw-r--r-- | jinja2/compiler.py | 11 | ||||
-rw-r--r-- | jinja2/testsuite/imports.py | 16 |
2 files changed, 25 insertions, 2 deletions
diff --git a/jinja2/compiler.py b/jinja2/compiler.py index b21cb38..5eab2b7 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 1cb12cb..ea49922 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) %} |