diff options
author | David Lord <davidism@gmail.com> | 2022-03-07 09:14:21 -0800 |
---|---|---|
committer | David Lord <davidism@gmail.com> | 2022-03-07 09:14:21 -0800 |
commit | a150ff749a0347c41e8e353c2ce2063e8f84ab42 (patch) | |
tree | abce210072c8825316c155ee9990cc0046c5f4fa | |
parent | a819eb37bd182a4e668ab2299f303630df0d7973 (diff) | |
download | jinja2-a150ff749a0347c41e8e353c2ce2063e8f84ab42.tar.gz |
add parens around auto_await for filters and calls
-rw-r--r-- | CHANGES.rst | 2 | ||||
-rw-r--r-- | src/jinja2/compiler.py | 8 | ||||
-rw-r--r-- | tests/test_async.py | 16 |
3 files changed, 22 insertions, 4 deletions
diff --git a/CHANGES.rst b/CHANGES.rst index 8c041f6..d67381b 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -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 diff --git a/src/jinja2/compiler.py b/src/jinja2/compiler.py index dfea00a..3458095 100644 --- a/src/jinja2/compiler.py +++ b/src/jinja2/compiler.py @@ -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 + "=") diff --git a/tests/test_async.py b/tests/test_async.py index 635727e..c9ba70c 100644 --- a/tests/test_async.py +++ b/tests/test_async.py @@ -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]" |