Skip to content

Commit 0cc7169

Browse files
committed
reorg calling override, dont dupe
1 parent d425653 commit 0cc7169

File tree

3 files changed

+24
-57
lines changed

3 files changed

+24
-57
lines changed

Diff for: pattern_library/__init__.py

-8
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,3 @@ def get_sections():
6464

6565
def get_pattern_context_var_name():
6666
return "is_pattern_library"
67-
68-
if get_pattern_template_suffix() == ".jinja":
69-
from jinja2.compiler import CodeGenerator as JinjaCodeGenerator
70-
from jinja2.environment import Template as JinjaTemplate
71-
from .loader_tags import template_new_context, visit_extends
72-
73-
JinjaTemplate.new_context = template_new_context
74-
JinjaCodeGenerator.visit_Extends = visit_extends

Diff for: pattern_library/loader_tags.py

+8-48
Original file line numberDiff line numberDiff line change
@@ -152,62 +152,22 @@ def do_include(parser, token):
152152
)
153153

154154
def visit_extends(self, node, frame):
155-
"""This method serves as overriding the jinja extends tag
156-
Dupe of the jinja2.compiler.CodeGenerator visit_Extends
157-
except for
158-
self.writeline(
159-
"parent_template.new_context(context.get_all(), True,"
160-
f" {self.dump_local_context(frame)})"
161-
)
162-
which executes at runtime to pull in the dpl context
155+
"""This method overrides the jinja extends tag
156+
Is called as part of the compiler CodeGenerator
157+
and adds a line to use the template_new_context as
158+
part of the runtime render to pull in the dpl context
163159
Handles visiting extends
164160
"""
165-
from jinja2.compiler import CompilerExit
166-
167-
if not frame.toplevel:
168-
self.fail("cannot use extend from a non top-level scope", node.lineno)
169-
# if the number of extends statements in general is zero so
170-
# far, we don't have to add a check if something extended
171-
# the template before this one.
172-
if self.extends_so_far > 0:
173-
# if we have a known extends we just add a template runtime
174-
# error into the generated code. We could catch that at compile
175-
# time too, but i welcome it not to confuse users by throwing the
176-
# same error at different times just "because we can".
177-
if not self.has_known_extends:
178-
self.writeline("if parent_template is not None:")
179-
self.indent()
180-
self.writeline('raise TemplateRuntimeError("extended multiple times")')
181-
182-
# if we have a known extends already we don't need that code here
183-
# as we know that the template execution will end here.
184-
if self.has_known_extends:
185-
raise CompilerExit()
186-
else:
187-
self.outdent()
188-
self.writeline("parent_template = environment.get_template(", node)
189-
self.visit(node.template, frame)
190-
self.write(f", {self.name!r})")
161+
from .monkey_utils import jinja_visit_Extends
162+
163+
jinja_visit_Extends(self, node, frame)
191164
# addition to update the context with dpl context
192165
# calls the template_new_context method below when
193166
# invoked at runtime
194167
self.writeline(
195168
"parent_template.new_context(context.get_all(), True,"
196169
f" {self.dump_local_context(frame)})"
197170
)
198-
self.writeline("for name, parent_block in parent_template.blocks.items():")
199-
self.indent()
200-
self.writeline("context.blocks.setdefault(name, []).append(parent_block)")
201-
self.outdent()
202-
203-
# if this extends statement was in the root level we can take
204-
# advantage of that information and simplify the generated code
205-
# in the top level from this point onwards
206-
if frame.rootlevel:
207-
self.has_known_extends = True
208-
209-
# and now we have one more
210-
self.extends_so_far += 1
211171

212172

213173
def template_new_context(
@@ -216,7 +176,7 @@ def template_new_context(
216176
shared=False,
217177
locals=None,
218178
):
219-
"""This method serves as overriding the jinja include tag
179+
"""This method overrides the jinja include tag
220180
Is called as part of Template.render by jinja2 and is updated
221181
to pull in the dpl context
222182
Create a new :class:`Context` for this template. The vars

Diff for: pattern_library/monkey_utils.py

+16-1
Original file line numberDiff line numberDiff line change
@@ -95,4 +95,19 @@ def node_render(context):
9595

9696
return original_node
9797

98-
return tag_func
98+
return tag_func
99+
100+
jinja_visit_Extends = None
101+
102+
def override_jinja_tags():
103+
global jinja_visit_Extends
104+
try:
105+
from jinja2.compiler import CodeGenerator as JinjaCodeGenerator
106+
from jinja2.environment import Template as JinjaTemplate
107+
except ModuleNotFoundError:
108+
ModuleNotFoundError("install jinja2 to override tags")
109+
110+
from .loader_tags import template_new_context, visit_extends
111+
jinja_visit_Extends = JinjaCodeGenerator.visit_Extends
112+
JinjaTemplate.new_context = template_new_context
113+
JinjaCodeGenerator.visit_Extends = visit_extends

0 commit comments

Comments
 (0)