summaryrefslogtreecommitdiff
path: root/jinja2
diff options
context:
space:
mode:
authorFlorian Mounier <florian.mounier@kozea.fr>2012-01-05 17:06:36 +0100
committerFlorian Mounier <florian.mounier@kozea.fr>2012-01-05 17:06:36 +0100
commit33aee12a29426987805420a410e13e0470a79cbf (patch)
tree3c675fa6c034206814f9cbee5715d8a96a31eb3b /jinja2
parent80b4fe6159a31fe3752b659785c0c75ce3af2ef3 (diff)
downloadjinja2-33aee12a29426987805420a410e13e0470a79cbf.tar.gz
Support included blocks override
Diffstat (limited to 'jinja2')
-rw-r--r--jinja2/compiler.py11
-rw-r--r--jinja2/testsuite/imports.py16
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) %}