import shutil import tempfile from pathlib import Path import pytest from jinja2 import ChainableUndefined from jinja2 import DebugUndefined from jinja2 import DictLoader from jinja2 import Environment from jinja2 import is_undefined from jinja2 import make_logging_undefined from jinja2 import meta from jinja2 import StrictUndefined from jinja2 import Template from jinja2 import TemplatesNotFound from jinja2 import Undefined from jinja2 import UndefinedError from jinja2.compiler import CodeGenerator from jinja2.runtime import Context from jinja2.utils import Cycler from jinja2.utils import pass_context from jinja2.utils import pass_environment from jinja2.utils import pass_eval_context class TestExtendedAPI: def test_item_and_attribute(self, env): from jinja2.sandbox import SandboxedEnvironment for env in Environment(), SandboxedEnvironment(): tmpl = env.from_string("{{ foo.items()|list }}") assert tmpl.render(foo={"items": 42}) == "[('items', 42)]" tmpl = env.from_string('{{ foo|attr("items")()|list }}') assert tmpl.render(foo={"items": 42}) == "[('items', 42)]" tmpl = env.from_string('{{ foo["items"] }}') assert tmpl.render(foo={"items": 42}) == "42" def test_finalize(self): e = Environment(finalize=lambda v: "" if v is None else v) t = e.from_string("{% for item in seq %}|{{ item }}{% endfor %}") assert t.render(seq=(None, 1, "foo")) == "||1|foo" def test_finalize_constant_expression(self): e = Environment(finalize=lambda v: "" if v is None else v) t = e.from_string("<{{ none }}>") assert t.render() == "<>" def test_no_finalize_template_data(self): e = Environment(finalize=lambda v: type(v).__name__) t = e.from_string("<{{ value }}>") # If template data was finalized, it would print "strintstr". assert t.render(value=123) == "" def test_context_finalize(self): @pass_context def finalize(context, value): return value * context["scale"] e = Environment(finalize=finalize) t = e.from_string("{{ value }}") assert t.render(value=5, scale=3) == "15" def test_eval_finalize(self): @pass_eval_context def finalize(eval_ctx, value): return str(eval_ctx.autoescape) + value e = Environment(finalize=finalize, autoescape=True) t = e.from_string("{{ value }}") assert t.render(value="