diff --git a/CHANGES.txt b/CHANGES.txt index b40c3c4428125a2c97070ff4ca5cf8c573ba2ed6..c3347196324a062653cca676a7f83abceda23298 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -14,6 +14,11 @@ Config * Added shared namelist settings ([[namelist_a, namelist_b]]) +Templates +--------- + +* Allow use of iterators with 'list' and 'join' filters + Release 1.2.0 ============= diff --git a/mkexp b/mkexp index 5ed63f441b0a46ebd7cc47cb805fca174a04f53a..84cdb0759d4ca5c09da517ce8a08dc5f27f31d04 100755 --- a/mkexp +++ b/mkexp @@ -7,6 +7,7 @@ from __future__ import print_function +from collections.abc import Iterator import io import os import re @@ -358,7 +359,7 @@ def list_singleton(eval_ctx, x, keep_empty=False, *args, **kwargs): # Workaround for 2.8 bug when applied to literals if isinstance(x, jinja2.nodes.EvalContext): (eval_ctx, x) = (x, eval_ctx) - if isinstance(x, (list, tuple)): + if isinstance(x, (list, tuple, Iterator)): if getattr(list_original, 'evalcontextfilter', getattr(list_original, 'jinja_pass_arg', False)): return list_original(eval_ctx, x, *args, **kwargs) return list_original(x, *args, **kwargs) @@ -374,7 +375,7 @@ def join_singleton(eval_ctx, x, *args, **kwargs): # Workaround for 2.8 bug when applied to literals if isinstance(x, jinja2.nodes.EvalContext): (eval_ctx, x) = (x, eval_ctx) - if isinstance(x, (list, tuple)): + if isinstance(x, (list, tuple, Iterator)): return join_original(eval_ctx, x, *args, **kwargs) return x template_env.filters['join'] = join_singleton diff --git a/test.py b/test.py index f490fc1a350d428599ada69cf63fc5629a4b6c22..0a1be0ad707753ef635d8ee458ad10292fdce0fe 100644 --- a/test.py +++ b/test.py @@ -1118,6 +1118,13 @@ class ListTestCase(MkexpSimpleTestCase): ['first', 'second', 'third'] """) + def test_list_on_iterator(self): + self.run_test(u""" + %{('first', 'second', 'third')|reverse|list} + """, u""" + ['third', 'second', 'first'] + """) + class JoinTestCase(MkexpSimpleTestCase): def test_join_on_string(self): @@ -1154,6 +1161,13 @@ class JoinTestCase(MkexpSimpleTestCase): first, second, third """) + def test_join_on_iterator(self): + self.run_test(u""" + %{('first', 'second', 'third')|reverse|join(', ')} + """, u""" + third, second, first + """) + class IsSetTestCase(MkexpSimpleTestCase): def test_empty_string(self):