]> git.ipfire.org Git - thirdparty/jinja.git/commitdiff
namespace object works in async templates 1181/head
authorBart Feenstra <bart@mynameisbart.com>
Sat, 28 Mar 2020 16:18:58 +0000 (16:18 +0000)
committerDavid Lord <davidism@gmail.com>
Mon, 30 Mar 2020 18:32:34 +0000 (11:32 -0700)
CHANGES.rst
src/jinja2/utils.py
tests/test_async.py

index 62b1b072c2f93709e7c73a559a9163dd9720426c..579b80b9d13000d6989223787d6437b9dc8a0b64 100644 (file)
@@ -23,6 +23,8 @@ Unreleased
     :pr:`1182`
 -   Fix line numbers in error messages when newlines are stripped.
     :pr:`1178`
+-   The special ``namespace()`` assignment object in templates works in
+    async environments. :issue:`1180`
 
 
 Version 2.11.1
index 94581ca855d973d473a0fffb861f369537bf7f9e..b422ba9686fa5f3224564c7af4db7f4ce7ca3368 100644 (file)
@@ -697,7 +697,8 @@ class Namespace(object):
         self.__attrs = dict(*args, **kwargs)
 
     def __getattribute__(self, name):
-        if name == "_Namespace__attrs":
+        # __class__ is needed for the awaitable check in async mode
+        if name in {"_Namespace__attrs", "__class__"}:
             return object.__getattribute__(self, name)
         try:
             return self.__attrs[name]
index 11efd849f062918d8f0b78100f6e51bb0f813e68..2b9974e35d9bfafaa22465ad03c86b34e575e686 100644 (file)
@@ -578,3 +578,14 @@ class TestAsyncForLoop(object):
     def test_awaitable_property_slicing(self, test_env_async):
         t = test_env_async.from_string("{% for x in a.b[:1] %}{{ x }}{% endfor %}")
         assert t.render(a=dict(b=[1, 2, 3])) == "1"
+
+
+def test_namespace_awaitable(test_env_async):
+    async def _test():
+        t = test_env_async.from_string(
+            '{% set ns = namespace(foo="Bar") %}{{ ns.foo }}'
+        )
+        actual = await t.render_async()
+        assert actual == "Bar"
+
+    run(_test())