From: David Lord Date: Sat, 8 Jul 2017 16:04:29 +0000 (-0700) Subject: add test and changelog X-Git-Tag: 2.10~11^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=34ca7f17c26ddb1bbdf7b59384fb5e96e66070e7;p=thirdparty%2Fjinja.git add test and changelog use ignore_case function --- diff --git a/CHANGES b/CHANGES index 4240a63d..c7d78b91 100644 --- a/CHANGES +++ b/CHANGES @@ -30,6 +30,7 @@ Version 2.10 ``gt``, ``ge``. (`#665`_) - ``import`` statement cannot end with a trailing comma. (`#617`_, `#618`_) - ``indent`` filter will not indent blank lines by default. (`#685`_) +- Add ``reverse`` argument for ``dictsort`` filter. (`#692`_) .. _#469: https://github.com/pallets/jinja/pull/469 .. _#475: https://github.com/pallets/jinja/pull/475 @@ -38,6 +39,7 @@ Version 2.10 .. _#618: https://github.com/pallets/jinja/pull/618 .. _#665: https://github.com/pallets/jinja/pull/665 .. _#685: https://github.com/pallets/jinja/pull/685 +.. _#692: https://github.com/pallets/jinja/pull/692 Version 2.9.6 ------------- diff --git a/jinja2/filters.py b/jinja2/filters.py index 2496d3aa..07e8ccae 100644 --- a/jinja2/filters.py +++ b/jinja2/filters.py @@ -227,12 +227,16 @@ def do_dictsort(value, case_sensitive=False, by='key', reverse=False): elif by == 'value': pos = 1 else: - raise FilterArgumentError('You can only sort by either ' - '"key" or "value"') + raise FilterArgumentError( + 'You can only sort by either "key" or "value"' + ) + def sort_func(item): value = item[pos] - if isinstance(value, string_types) and not case_sensitive: - value = value.lower() + + if not case_sensitive: + value = ignore_case(value) + return value return sorted(value.items(), key=sort_func, reverse=reverse) diff --git a/tests/test_filters.py b/tests/test_filters.py index 2ef3249e..f323f761 100644 --- a/tests/test_filters.py +++ b/tests/test_filters.py @@ -45,16 +45,16 @@ class TestFilter(object): ) assert tmpl.render(given='yes') == 'no|False|no|yes' - def test_dictsort(self, env): - tmpl = env.from_string( - '{{ foo|dictsort }}|' - '{{ foo|dictsort(true) }}|' - '{{ foo|dictsort(false, "value") }}' - ) - out = tmpl.render(foo={"aa": 0, "b": 1, "c": 2, "AB": 3}) - assert out == ("[('aa', 0), ('AB', 3), ('b', 1), ('c', 2)]|" - "[('AB', 3), ('aa', 0), ('b', 1), ('c', 2)]|" - "[('aa', 0), ('b', 1), ('c', 2), ('AB', 3)]") + @pytest.mark.parametrize('args,expect', ( + ('', "[('aa', 0), ('AB', 3), ('b', 1), ('c', 2)]"), + ('true', "[('AB', 3), ('aa', 0), ('b', 1), ('c', 2)]"), + ('by="value"', "[('aa', 0), ('b', 1), ('c', 2), ('AB', 3)]"), + ('reverse=true', "[('c', 2), ('b', 1), ('AB', 3), ('aa', 0)]") + )) + def test_dictsort(self, env, args, expect): + t = env.from_string('{{{{ foo|dictsort({args}) }}}}'.format(args=args)) + out = t.render(foo={"aa": 0, "b": 1, "c": 2, "AB": 3}) + assert out == expect def test_batch(self, env): tmpl = env.from_string("{{ foo|batch(3)|list }}|"