From d5f49f5cc135f1a78704dba7db8212be2388b50e Mon Sep 17 00:00:00 2001 From: Joachim Jablon Date: Wed, 26 May 2021 11:54:58 +0200 Subject: [PATCH] Fixes #1448: Revert Undefined.__contains__ to 2.x behaviour --- CHANGES.rst | 4 ++-- src/jinja2/runtime.py | 3 ++- tests/test_api.py | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 116461af..074dd1f8 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -3,12 +3,12 @@ Version 3.0.2 ------------- -Unreleased - - Fix a loop scoping bug that caused assignments in nested loops to still be referenced outside of it. :issue:`1427` - Make ``compile_templates`` deterministic for filter and import names. :issue:`1452, 1453` +- Revert an unintended change that caused ``Undefined`` to act like + ``StrictUndefined`` for the ``in`` operator. :issue:`1448` Version 3.0.1 diff --git a/src/jinja2/runtime.py b/src/jinja2/runtime.py index 87bb1327..2346cf2b 100644 --- a/src/jinja2/runtime.py +++ b/src/jinja2/runtime.py @@ -915,7 +915,7 @@ class Undefined: __floordiv__ = __rfloordiv__ = _fail_with_undefined_error __mod__ = __rmod__ = _fail_with_undefined_error __pos__ = __neg__ = _fail_with_undefined_error - __call__ = __getitem__ = __contains__ = _fail_with_undefined_error + __call__ = __getitem__ = _fail_with_undefined_error __lt__ = __le__ = __gt__ = __ge__ = _fail_with_undefined_error __int__ = __float__ = __complex__ = _fail_with_undefined_error __pow__ = __rpow__ = _fail_with_undefined_error @@ -1091,6 +1091,7 @@ class StrictUndefined(Undefined): __slots__ = () __iter__ = __str__ = __len__ = Undefined._fail_with_undefined_error __eq__ = __ne__ = __bool__ = __hash__ = Undefined._fail_with_undefined_error + __contains__ = Undefined._fail_with_undefined_error # Remove slots attributes, after the metaclass is applied they are diff --git a/tests/test_api.py b/tests/test_api.py index 774bb3c9..4db3b4a9 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -316,7 +316,7 @@ class TestUndefined: assert env.from_string("{{ foo.missing }}").render(foo=42) == "" assert env.from_string("{{ not missing }}").render() == "True" pytest.raises(UndefinedError, env.from_string("{{ missing - 1}}").render) - pytest.raises(UndefinedError, env.from_string("{{ 'foo' in missing }}").render) + assert env.from_string("{{ 'foo' in missing }}").render() == "False" und1 = Undefined(name="x") und2 = Undefined(name="y") assert und1 == und2 @@ -375,6 +375,7 @@ class TestUndefined: pytest.raises(UndefinedError, env.from_string("{{ missing }}").render) pytest.raises(UndefinedError, env.from_string("{{ missing.attribute }}").render) pytest.raises(UndefinedError, env.from_string("{{ missing|list }}").render) + pytest.raises(UndefinedError, env.from_string("{{ 'foo' in missing }}").render) assert env.from_string("{{ missing is not defined }}").render() == "True" pytest.raises( UndefinedError, env.from_string("{{ foo.missing }}").render, foo=42 -- 2.47.2