summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Lord <davidism@gmail.com>2021-08-09 11:10:01 -0700
committerGitHub <noreply@github.com>2021-08-09 11:10:01 -0700
commit531145d28b2207f9f7886eebdc2171b13e681018 (patch)
tree25efb577e1696c2bd9fc611201a618f5092b2e5c
parent189132094135d4c84414404c3b388500d35dc49e (diff)
parentd5f49f5cc135f1a78704dba7db8212be2388b50e (diff)
downloadjinja2-531145d28b2207f9f7886eebdc2171b13e681018.tar.gz
Merge pull request #1455 from ewjoachim/undefined-contains-1204
Only StrictUndefined.__contains__ raises error
-rw-r--r--CHANGES.rst4
-rw-r--r--src/jinja2/runtime.py3
-rw-r--r--tests/test_api.py3
3 files changed, 6 insertions, 4 deletions
diff --git a/CHANGES.rst b/CHANGES.rst
index 116461a..074dd1f 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 87bb132..2346cf2 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 774bb3c..4db3b4a 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