]> git.ipfire.org Git - thirdparty/jinja.git/commitdiff
Support included blocks override 84/head
authorFlorian Mounier <florian.mounier@kozea.fr>
Thu, 5 Jan 2012 16:06:36 +0000 (17:06 +0100)
committerFlorian Mounier <florian.mounier@kozea.fr>
Thu, 5 Jan 2012 16:06:36 +0000 (17:06 +0100)
jinja2/compiler.py
jinja2/testsuite/imports.py

index b21cb3865db61c08c321117b8cf6c8a08fa44f15..5eab2b74c28c14d6eaefbc9d2a5f32ab3f0755ef 100644 (file)
@@ -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:')
 
index 1cb12cbd38ac18d4eeee56e3cf8a4a91f1998a7f..ea49922a8cd63601386eab1d81a7cf0bf5fa15d0 100644 (file)
@@ -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) %}