From 6faf093f9dc6d605d1b7c2285b1a2d8223b7b537 Mon Sep 17 00:00:00 2001 From: David Lord Date: Tue, 9 Nov 2021 12:50:28 -0800 Subject: remove deprecated legacy resolve mode for context subclass --- CHANGES.rst | 3 +++ src/jinja2/runtime.py | 38 -------------------------------------- tests/test_regression.py | 17 ----------------- 3 files changed, 3 insertions(+), 55 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 7a3c420..da7f17c 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -17,6 +17,9 @@ Unreleased - ``Markup`` and ``escape`` should be imported from MarkupSafe. - Compiled templates from very old Jinja versions may need to be recompiled. + - Legacy resolve mode for ``Context`` subclasses is no longer + supported. Override ``resolve_or_missing`` instead of + ``resolve``. Version 3.0.3 diff --git a/src/jinja2/runtime.py b/src/jinja2/runtime.py index 764091a..ab7b042 100644 --- a/src/jinja2/runtime.py +++ b/src/jinja2/runtime.py @@ -161,27 +161,6 @@ class Context: :class:`Undefined` object for missing variables. """ - _legacy_resolve_mode: t.ClassVar[bool] = False - - def __init_subclass__(cls) -> None: - if "resolve_or_missing" in cls.__dict__: - # If the subclass overrides resolve_or_missing it opts in to - # modern mode no matter what. - cls._legacy_resolve_mode = False - elif "resolve" in cls.__dict__ or cls._legacy_resolve_mode: - # If the subclass overrides resolve, or if its base is - # already in legacy mode, warn about legacy behavior. - import warnings - - warnings.warn( - "Overriding 'resolve' is deprecated and will not have" - " the expected behavior in Jinja 3.1. Override" - " 'resolve_or_missing' instead ", - DeprecationWarning, - stacklevel=2, - ) - cls._legacy_resolve_mode = True - def __init__( self, environment: "Environment", @@ -239,15 +218,6 @@ class Context: :param key: The variable name to look up. """ - if self._legacy_resolve_mode: - if key in self.vars: - return self.vars[key] - - if key in self.parent: - return self.parent[key] - - return self.environment.undefined(name=key) - rv = self.resolve_or_missing(key) if rv is missing: @@ -265,14 +235,6 @@ class Context: :param key: The variable name to look up. """ - if self._legacy_resolve_mode: - rv = self.resolve(key) - - if isinstance(rv, Undefined): - return missing - - return rv - if key in self.vars: return self.vars[key] diff --git a/tests/test_regression.py b/tests/test_regression.py index 7e23369..46e492b 100644 --- a/tests/test_regression.py +++ b/tests/test_regression.py @@ -591,23 +591,6 @@ class TestBug: env = MyEnvironment(loader=loader) assert env.get_template("test").render(foobar="test") == "test" - def test_legacy_custom_context(self, env): - from jinja2.runtime import Context, missing - - with pytest.deprecated_call(): - - class MyContext(Context): - def resolve(self, name): - if name == "foo": - return 42 - return super().resolve(name) - - x = MyContext(env, parent={"bar": 23}, name="foo", blocks={}) - assert x._legacy_resolve_mode - assert x.resolve_or_missing("foo") == 42 - assert x.resolve_or_missing("bar") == 23 - assert x.resolve_or_missing("baz") is missing - def test_recursive_loop_bug(self, env): tmpl = env.from_string( "{%- for value in values recursive %}1{% else %}0{% endfor -%}" -- cgit v1.2.1