summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBaptiste Mille-Mathias <baptiste.millemathias@gmail.com>2021-03-27 00:18:55 +0100
committerGitHub <noreply@github.com>2021-03-27 00:18:55 +0100
commit99a6627c60d8734d90f6982107eebb9de24ba54d (patch)
tree7e10fcd138b8af29614efa809ca9ba406c53b06e
parentdef2870df7f4585ca8c026bae2dd42e815041552 (diff)
downloadansible-99a6627c60d8734d90f6982107eebb9de24ba54d.tar.gz
Add duplicated set filter and documentation (#72729)
Co-authored-by: Kerry <kerry@flatline-studios.com>
-rw-r--r--changelogs/fragments/72729-add-filter-duplicated.yml3
-rw-r--r--docs/docsite/rst/user_guide/playbooks_filters.rst8
-rw-r--r--lib/ansible/plugins/filter/mathstuff.py7
-rw-r--r--test/units/plugins/filter/test_mathstuff.py8
4 files changed, 26 insertions, 0 deletions
diff --git a/changelogs/fragments/72729-add-filter-duplicated.yml b/changelogs/fragments/72729-add-filter-duplicated.yml
new file mode 100644
index 0000000000..949184c8e2
--- /dev/null
+++ b/changelogs/fragments/72729-add-filter-duplicated.yml
@@ -0,0 +1,3 @@
+minor_changes:
+ - add filter duplicated that will return duplicate items from a list.
+ (https://github.com/ansible/ansible/pull/72729/)
diff --git a/docs/docsite/rst/user_guide/playbooks_filters.rst b/docs/docsite/rst/user_guide/playbooks_filters.rst
index 984de55e4b..9ea4104440 100644
--- a/docs/docsite/rst/user_guide/playbooks_filters.rst
+++ b/docs/docsite/rst/user_guide/playbooks_filters.rst
@@ -978,6 +978,14 @@ To get the symmetric difference of 2 lists (items exclusive to each list)::
{{ list1 | symmetric_difference(list2) }}
# => [10, 11, 99]
+To get the duplicate values from a list (the resulting list contains unique duplicates)::
+
+.. versionadded:: 2.11
+
+ # list1: [1, 2, 5, 1, 3, 4, 10, 'a', 'z', 'a']
+ {{ list1 | duplicated }}
+ # => [1, 'a']
+
.. _math_stuff:
Calculating numbers (math)
diff --git a/lib/ansible/plugins/filter/mathstuff.py b/lib/ansible/plugins/filter/mathstuff.py
index 77baa7ef00..52deb37fdf 100644
--- a/lib/ansible/plugins/filter/mathstuff.py
+++ b/lib/ansible/plugins/filter/mathstuff.py
@@ -26,6 +26,7 @@ __metaclass__ = type
import itertools
import math
+from collections import Counter
from jinja2.filters import environmentfilter
from ansible.errors import AnsibleFilterError, AnsibleFilterTypeError
@@ -87,6 +88,11 @@ def unique(environment, a, case_sensitive=False, attribute=None):
@environmentfilter
+def duplicated(environment, a):
+ return [k for k, v in Counter(a).items() if v > 1]
+
+
+@environmentfilter
def intersect(environment, a, b):
if isinstance(a, Hashable) and isinstance(b, Hashable):
c = set(a) & set(b)
@@ -257,6 +263,7 @@ class FilterModule(object):
# set theory
'unique': unique,
+ 'duplicated': duplicated,
'intersect': intersect,
'difference': difference,
'symmetric_difference': symmetric_difference,
diff --git a/test/units/plugins/filter/test_mathstuff.py b/test/units/plugins/filter/test_mathstuff.py
index d44a714669..ec4d5be034 100644
--- a/test/units/plugins/filter/test_mathstuff.py
+++ b/test/units/plugins/filter/test_mathstuff.py
@@ -180,3 +180,11 @@ class TestRekeyOnMember():
list_original = ({'proto': 'eigrp', 'id': 1}, {'proto': 'ospf', 'id': 2}, {'proto': 'eigrp', 'id': 3})
expected = {'eigrp': {'proto': 'eigrp', 'id': 3}, 'ospf': {'proto': 'ospf', 'id': 2}}
assert ms.rekey_on_member(list_original, 'proto', duplicates='overwrite') == expected
+
+
+class TestDuplicated:
+ def test_empty(self):
+ assert ms.duplicated(env, []) == []
+
+ def test_numbers(self):
+ assert ms.duplicated(env, [1, 3, 5, 5]) == [5]