diff --git a/.github/BOTMETA.yml b/.github/BOTMETA.yml index 989752a0a71..b4ae054328e 100644 --- a/.github/BOTMETA.yml +++ b/.github/BOTMETA.yml @@ -135,6 +135,8 @@ files: $doc_fragments/xenserver.py: labels: xenserver maintainers: bvitnik + $filters/accumulate.py: + maintainers: VannTen $filters/counter.py: maintainers: keilr $filters/crc32.py: diff --git a/plugins/filter/accumulate.py b/plugins/filter/accumulate.py new file mode 100644 index 00000000000..d0128038e32 --- /dev/null +++ b/plugins/filter/accumulate.py @@ -0,0 +1,49 @@ +# Copyright: Max Gautier +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +DOCUMENTATION = ''' + name: accumulate + short_description: Produce a list of accumulated sums of the input list contents. + version_added: 10.0.0 + author: Max Gautier (@VannTen) + description: + - Passthrough to L(python itertools.accumulate function,https://docs.python.org/3/library/itertools.html#itertools.accumulate). + - Transforms an input list into the cumulative list of results from applying addition to the elements of the input list. + - Addition means the default python implementation of '+' for input list elements type. + options: + _input: + description: A list + type: list + elements: any + required: true +''' + +RETURN = ''' + _value: + description: A list of cumulated sums of the elements of the input list + type: list +''' + +EXAMPLES = ''' +- name: Enumerate parent directories of some path + ansible.builtin.debug: + var: > + "/some/path/to/my/file" + | split('/') | map('split', '/') + | community.general.enumerate | map('join', '/') + # Produces: ['', '/some', '/some/path', '/some/path/to', '/some/path/to/my', '/some/path/to/my/file'] +''' + +from itertools import accumulate + +def list_accumulate(sequence): + return accumulate(sequence) + + +class FilterModule(object): + + def filters(self): + return { + 'accumulate': list_accumulate, + } diff --git a/tests/integration/targets/filter_accumulate/tasks/main.yml b/tests/integration/targets/filter_accumulate/tasks/main.yml new file mode 100644 index 00000000000..29979fb893f --- /dev/null +++ b/tests/integration/targets/filter_accumulate/tasks/main.yml @@ -0,0 +1,13 @@ +--- +# Copyright (c), Max Gautier +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +- name: "Test accumulate filter" + assert: + that: + - "['a', 'b'] | community.general.accumulate == ['a', 'ab']" + - "[1, 2, 3] | community.general.accumulate == [1, 3, 6]" + - "[['foo'],['bar'],['foobar']] | community.general.accumulate == [['foo'], ['foo', 'bar'], ['foo', 'bar', 'foobar']]" + - "'path/to/file' | split('/') | map('split', '/') | community.general.accumulate | map('join', '/') == ['path', 'path/to', 'path/to/file']" + - "[{'foo':1}, {'bar':2}] | map('dict2items') | community.general.accumulate | map('items2dict') == [{'foo':1}, {'foo':1, 'bar':2}]"