]> git.ipfire.org Git - thirdparty/jinja.git/commitdiff
ported list and sum
authorArmin Ronacher <armin.ronacher@active-4.com>
Wed, 28 Dec 2016 23:20:34 +0000 (00:20 +0100)
committerArmin Ronacher <armin.ronacher@active-4.com>
Wed, 28 Dec 2016 23:20:34 +0000 (00:20 +0100)
jinja2/asyncfilters.py
tests/test_asyncfilters.py

index 2a6eb5200b744d078790c232de5adf2a54c80db8..26caccbcb6b4d4d99488215811d997152d8b474c 100644 (file)
@@ -77,6 +77,11 @@ async def do_join(eval_ctx, value, d=u'', attribute=None):
     return filters.do_join(eval_ctx, await auto_to_seq(value), d, attribute)
 
 
+@asyncfiltervariant(filters.do_list)
+async def do_list(value):
+    return await auto_to_seq(value)
+
+
 @asyncfiltervariant(filters.do_reject)
 async def do_reject(*args, **kwargs):
     return async_select_or_reject(args, kwargs, lambda x: not x, False)
@@ -101,14 +106,27 @@ async def do_selectattr(*args, **kwargs):
 async def do_map(*args, **kwargs):
     seq, func = filters.prepare_map(args, kwargs)
     if seq:
-        async for item in seq:
+        async for item in auto_aiter(seq):
             yield func(item)
 
 
+@asyncfiltervariant(filters.do_sum)
+async def do_sum(environment, iterable, attribute=None, start=0):
+    rv = start
+    if attribute is not None:
+        func = filters.make_attrgetter(environment, attribute)
+    else:
+        func = lambda x: x
+    async for item in auto_aiter(iterable):
+        rv += func(item)
+    return rv
+
+
 ASYNC_FILTERS = {
     'first':        do_first,
     'groupby':      do_groupby,
     'join':         do_join,
+    'list':         do_list,
     # we intentionally do not support do_last because that would be
     # ridiculous
     'reject':       do_reject,
@@ -116,4 +134,5 @@ ASYNC_FILTERS = {
     'map':          do_map,
     'select':       do_select,
     'selectattr':   do_selectattr,
+    'sum':          do_sum,
 }
index 348a66b75f8b02c8264435f3e796fec19f855d9e..8732e78020ff27b332ab6fe860756691edb540b3 100644 (file)
@@ -165,3 +165,52 @@ def test_simple_select_attr(env_async, users):
         'map(attribute="name")|join("|") }}'
     )
     assert tmpl.render(users=users) == 'john|jane'
+
+
+@mark_dualiter('items', lambda: list('123'))
+def test_simple_map(env_async, items):
+    tmpl = env_async.from_string('{{ items()|map("int")|sum }}')
+    assert tmpl.render(items=items) == '6'
+
+
+@mark_dualiter('users', make_users)
+def test_attribute_map(env_async, users):
+    tmpl = env_async.from_string('{{ users()|map(attribute="name")|join("|") }}')
+    assert tmpl.render(users=users) == 'john|jane|mike'
+
+
+def test_empty_map(env_async):
+    tmpl = env_async.from_string('{{ none|map("upper")|list }}')
+    assert tmpl.render() == '[]'
+
+
+def test_sum(env_async):
+    tmpl = env_async.from_string('''{{ [1, 2, 3, 4, 5, 6]|sum }}''')
+    assert tmpl.render() == '21'
+
+
+def test_sum_attributes(env_async):
+    tmpl = env_async.from_string('''{{ values|sum('value') }}''')
+    assert tmpl.render(values=[
+        {'value': 23},
+        {'value': 1},
+        {'value': 18},
+    ]) == '42'
+
+
+def test_sum_attributes_nested(env_async):
+    tmpl = env_async.from_string('''{{ values|sum('real.value') }}''')
+    assert tmpl.render(values=[
+        {'real': {'value': 23}},
+        {'real': {'value': 1}},
+        {'real': {'value': 18}},
+    ]) == '42'
+
+
+def test_sum_attributes_tuple(env_async):
+    tmpl = env_async.from_string('''{{ values.items()|sum('1') }}''')
+    assert tmpl.render(values={
+        'foo': 23,
+        'bar': 1,
+        'baz': 18,
+    }) == '42'