]> git.ipfire.org Git - thirdparty/jinja.git/commitdiff
NativeEnvironment supports async mode 1363/head
authorremidebette <remi.debette@gmail.com>
Tue, 2 Mar 2021 22:12:30 +0000 (23:12 +0100)
committerDavid Lord <davidism@gmail.com>
Mon, 5 Apr 2021 18:36:54 +0000 (11:36 -0700)
CHANGES.rst
src/jinja2/nativetypes.py
tests/test_async.py

index 45ff144430fbbbfb82fbfc7b5eb20a8ae44e1144..dad0d0efcb47953629670c7764117e5172463948 100644 (file)
@@ -55,6 +55,7 @@ Unreleased
 -   ``Undefined.__contains__`` (``in``) raises an ``UndefinedError``
     instead of a ``TypeError``. :issue:`1198`
 -   ``Undefined`` is iterable in an async environment. :issue:`1294`
+-   ``NativeEnvironment`` supports async mode. :issue:`1362`
 
 
 Version 2.11.3
index 3ac70cf71e28f0e3f9727abba2a121274c12423c..8867a3165fbdaa2a321c88f77f1c5827e9626f21 100644 (file)
@@ -93,5 +93,19 @@ class NativeTemplate(Template):
         except Exception:
             return self.environment.handle_exception()
 
+    async def render_async(self, *args, **kwargs):
+        if not self.environment.is_async:
+            raise RuntimeError(
+                "The environment was not created with async mode enabled."
+            )
+
+        vars = dict(*args, **kwargs)
+        ctx = self.new_context(vars)
+
+        try:
+            return native_concat([n async for n in self.root_render_func(ctx)])
+        except Exception:
+            return self.environment.handle_exception()
+
 
 NativeEnvironment.template_class = NativeTemplate
index 44b4bf13cf70a1ff01cabd3adba634a3d2e698bd..cd243fd8286fe88c1629acbb1f9475b64af7e6ad 100644 (file)
@@ -10,6 +10,7 @@ from jinja2.asyncsupport import auto_aiter
 from jinja2.exceptions import TemplateNotFound
 from jinja2.exceptions import TemplatesNotFound
 from jinja2.exceptions import UndefinedError
+from jinja2.nativetypes import NativeEnvironment
 
 
 def run(coro):
@@ -602,3 +603,26 @@ def test_chainable_undefined_aiter():
         assert rv == ""
 
     run(_test())
+
+
+@pytest.fixture
+def async_native_env():
+    return NativeEnvironment(enable_async=True)
+
+
+def test_native_async(async_native_env):
+    async def _test():
+        t = async_native_env.from_string("{{ x }}")
+        rv = await t.render_async(x=23)
+        assert rv == 23
+
+    run(_test())
+
+
+def test_native_list_async(async_native_env):
+    async def _test():
+        t = async_native_env.from_string("{{ x }}")
+        rv = await t.render_async(x=list(range(3)))
+        assert rv == [0, 1, 2]
+
+    run(_test())