From: Armin Ronacher Date: Sat, 31 Dec 2016 00:11:20 +0000 (+0100) Subject: Support block-set in toplevel situations when extends is used X-Git-Tag: 2.9~36 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=45b59b522a542c21611214b352df049a3b6dbcb4;p=thirdparty%2Fjinja.git Support block-set in toplevel situations when extends is used --- diff --git a/CHANGES b/CHANGES index e92c3719..9a29db23 100644 --- a/CHANGES +++ b/CHANGES @@ -14,6 +14,7 @@ Version 2.9 - Added policies for filter defaults and similar things. - urlize now sets "rel noopener" by default. - Support attribute fallback for old-style classes in 2.x. +- Support toplevel set statements in extend situations. Version 2.8.2 ------------- diff --git a/jinja2/compiler.py b/jinja2/compiler.py index 056d60ea..0fe0d920 100644 --- a/jinja2/compiler.py +++ b/jinja2/compiler.py @@ -1458,6 +1458,10 @@ class CodeGenerator(NodeVisitor): def visit_AssignBlock(self, node, frame): block_frame = frame.inner() + # This is a special case. Since a set block always captures we + # will disable output checks. This way one can use set blocks + # toplevel even in extended templates. + block_frame.require_output_check = False block_frame.inspect(node.body) aliases = self.push_scope(block_frame) self.pull_locals(block_frame) diff --git a/tests/test_regression.py b/tests/test_regression.py index cd46c8c8..951e8d4a 100644 --- a/tests/test_regression.py +++ b/tests/test_regression.py @@ -284,3 +284,10 @@ class TestBug(): class Foo: x = 42 assert env.getitem(Foo(), 'x') == 42 + + def test_block_set_with_extends(self): + env = Environment(loader=DictLoader({ + 'main': '{% block body %}[{{ x }}]{% endblock %}', + })) + t = env.from_string('{% extends "main" %}{% set x %}42{% endset %}') + assert t.render() == '[42]'