From: Joachim Jablon Date: Wed, 26 May 2021 09:54:58 +0000 (+0200) Subject: Fixes #1448: Revert Undefined.__contains__ to 2.x behaviour X-Git-Tag: 3.0.2~8^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F1455%2Fhead;p=thirdparty%2Fjinja.git Fixes #1448: Revert Undefined.__contains__ to 2.x behaviour --- 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