]> git.ipfire.org Git - thirdparty/jinja.git/commitdiff
add parens around auto_await for filters and calls 1614/head
authorDavid Lord <davidism@gmail.com>
Mon, 7 Mar 2022 17:14:21 +0000 (09:14 -0800)
committerDavid Lord <davidism@gmail.com>
Mon, 7 Mar 2022 17:14:21 +0000 (09:14 -0800)
CHANGES.rst
src/jinja2/compiler.py
tests/test_async.py

index 8c041f60de9a92e72aed53a006ef481f94ef03dd..d67381b1bb8025d0f6ab693577321b42b0fa3cfe 100644 (file)
@@ -31,6 +31,8 @@ Unreleased
 -   Filters and tests decorated with ``@async_variant`` are pickleable.
     :pr:`1612`
 -   Add ``items`` filter. :issue:`1561`
+-   Subscriptions (``[0]``, etc.) can be used after filters, tests, and
+    calls when the environment is in async mode. :issue:`1573`
 
 
 Version 3.0.3
index dfea00aa6fa6c45dc003c36bf6b896b10be3272a..3458095f54ede1322eb2ab9e34288da87db54ca1 100644 (file)
@@ -1755,7 +1755,7 @@ class CodeGenerator(NodeVisitor):
         self, node: t.Union[nodes.Filter, nodes.Test], frame: Frame, is_filter: bool
     ) -> t.Iterator[None]:
         if self.environment.is_async:
-            self.write("await auto_await(")
+            self.write("(await auto_await(")
 
         if is_filter:
             self.write(f"{self.filters[node.name]}(")
@@ -1790,7 +1790,7 @@ class CodeGenerator(NodeVisitor):
         self.write(")")
 
         if self.environment.is_async:
-            self.write(")")
+            self.write("))")
 
     @optimizeconst
     def visit_Filter(self, node: nodes.Filter, frame: Frame) -> None:
@@ -1842,7 +1842,7 @@ class CodeGenerator(NodeVisitor):
         self, node: nodes.Call, frame: Frame, forward_caller: bool = False
     ) -> None:
         if self.environment.is_async:
-            self.write("await auto_await(")
+            self.write("(await auto_await(")
         if self.environment.sandboxed:
             self.write("environment.call(context, ")
         else:
@@ -1858,7 +1858,7 @@ class CodeGenerator(NodeVisitor):
         self.signature(node, frame, extra_kwargs)
         self.write(")")
         if self.environment.is_async:
-            self.write(")")
+            self.write("))")
 
     def visit_Keyword(self, node: nodes.Keyword, frame: Frame) -> None:
         self.write(node.key + "=")
index 635727e273c64221ce8657afc480a0677d3d4fda..c9ba70c3e66f9afb4d438fc6bce86266d1763198 100644 (file)
@@ -642,3 +642,19 @@ def test_native_list_async(async_native_env):
         assert rv == [0, 1, 2]
 
     asyncio.run(_test())
+
+
+def test_getitem_after_filter():
+    env = Environment(enable_async=True)
+    env.filters["add_each"] = lambda v, x: [i + x for i in v]
+    t = env.from_string("{{ (a|add_each(2))[1:] }}")
+    out = t.render(a=range(3))
+    assert out == "[3, 4]"
+
+
+def test_getitem_after_call():
+    env = Environment(enable_async=True)
+    env.globals["add_each"] = lambda v, x: [i + x for i in v]
+    t = env.from_string("{{ add_each(a, 2)[1:] }}")
+    out = t.render(a=range(3))
+    assert out == "[3, 4]"