Skip to content

Commit

Permalink
add test and changelog
Browse files Browse the repository at this point in the history
use ignore_case function
  • Loading branch information
davidism committed Jul 8, 2017
1 parent 10fc8af commit 34ca7f1
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 14 deletions.
2 changes: 2 additions & 0 deletions CHANGES
Expand Up @@ -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
Expand All @@ -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
-------------
Expand Down
12 changes: 8 additions & 4 deletions jinja2/filters.py
Expand Up @@ -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)
Expand Down
20 changes: 10 additions & 10 deletions tests/test_filters.py
Expand Up @@ -45,16 +45,16 @@ def test_default(self, env):
)
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 }}|"
Expand Down

0 comments on commit 34ca7f1

Please sign in to comment.