diff --git a/src/jinja2/filters.py b/src/jinja2/filters.py index 2bcba4fbd..89b571f96 100644 --- a/src/jinja2/filters.py +++ b/src/jinja2/filters.py @@ -383,7 +383,7 @@ def sort_func(item: t.Tuple[t.Any, t.Any]) -> t.Any: @pass_environment -def do_sort( +def sync_do_sort( environment: "Environment", value: "t.Iterable[V]", reverse: bool = False, @@ -438,6 +438,20 @@ def do_sort( return sorted(value, key=key_func, reverse=reverse) +@async_variant(sync_do_sort) # type: ignore +async def do_sort( + environment: "Environment", + value: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", + reverse: bool = False, + case_sensitive: bool = False, + attribute: t.Optional[t.Union[str, int]] = None, +) -> "t.List[V]": + key_func = make_multi_attrgetter( + environment, attribute, postprocess=ignore_case if not case_sensitive else None + ) + return sorted(await auto_to_list(value), key=key_func, reverse=reverse) + + @pass_environment def sync_do_unique( environment: "Environment", diff --git a/tests/test_async_filters.py b/tests/test_async_filters.py index e9892f1ed..b9432380c 100644 --- a/tests/test_async_filters.py +++ b/tests/test_async_filters.py @@ -218,6 +218,12 @@ def test_simple_map(env_async, items): assert tmpl.render(items=items) == "6" +@mark_dualiter("items", lambda: list("1423")) +def test_simple_map_sort(env_async, items): + tmpl = env_async.from_string('{{ items()|map("int")|sort }}') + assert tmpl.render(items=items) == "[1, 2, 3, 4]" + + def test_map_sum(env_async): # async map + async filter tmpl = env_async.from_string('{{ [[1,2], [3], [4,5,6]]|map("sum")|list }}') assert tmpl.render() == "[3, 3, 15]"