Add format_dict filter
This commit is contained in:
parent
534e3435e3
commit
ac795065f0
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,3 +1,5 @@
|
|||||||
|
**/__pycache__/**
|
||||||
|
.coverage
|
||||||
fact_cache/**
|
fact_cache/**
|
||||||
group_vars/**
|
group_vars/**
|
||||||
host_vars/**
|
host_vars/**
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
[defaults]
|
[defaults]
|
||||||
gathering = smart
|
gathering = smart
|
||||||
|
|
||||||
fact_caching = ansible.builtin.jsonfile
|
fact_caching = ansible.builtin.jsonfile
|
||||||
fact_caching_connection = fact_cache
|
fact_caching_connection = fact_cache
|
||||||
|
|
||||||
|
filter_plugins = plugins/filter
|
||||||
|
|
||||||
[privilege_escalation]
|
[privilege_escalation]
|
||||||
become = True
|
become = True
|
||||||
|
6
ci-requirements.txt
Normal file
6
ci-requirements.txt
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
ansible
|
||||||
|
ansible-lint
|
||||||
|
pytest
|
||||||
|
pytest-cov
|
||||||
|
flake8
|
||||||
|
yamllint
|
10
makefile
Normal file
10
makefile
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
ci-requirements:
|
||||||
|
@python -m pip install --upgrade -r ci-requirements.txt
|
||||||
|
|
||||||
|
plugins-test:
|
||||||
|
@python -m pytest -vv --cov plugins/filter --cov-report=term-missing plugins/tests
|
||||||
|
|
||||||
|
plugins-lint:
|
||||||
|
@python -m flake8 plugins
|
||||||
|
|
||||||
|
.PHONY: ci-requirements plugins-test plugins-lint
|
32
plugins/filter/format.py
Normal file
32
plugins/filter/format.py
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
import jinja2.exceptions
|
||||||
|
import ansible.errors
|
||||||
|
import ansible.module_utils
|
||||||
|
|
||||||
|
|
||||||
|
def __format_dict(dict_, pattern, *args):
|
||||||
|
values = []
|
||||||
|
for arg in args:
|
||||||
|
keys = arg.split(".")
|
||||||
|
value = dict_
|
||||||
|
for i, key in enumerate(keys):
|
||||||
|
try:
|
||||||
|
value = value[key]
|
||||||
|
except KeyError:
|
||||||
|
raise KeyError(f"{key} not in {'.'.join(['item'] + keys[:i])}")
|
||||||
|
values.append(value)
|
||||||
|
return pattern.format(*values)
|
||||||
|
|
||||||
|
|
||||||
|
def format_dict(dict_, pattern, *args): # pragma: no cover
|
||||||
|
try:
|
||||||
|
return __format_dict(dict_, pattern, *args)
|
||||||
|
except jinja2.exceptions.UndefinedError as e:
|
||||||
|
raise ansible.errors.AnsibleUndefinedVariable(
|
||||||
|
ansible.module_utils._text.to_native(e)) from e
|
||||||
|
except Exception as e:
|
||||||
|
raise ansible.errors.AnsibleFilterError(ansible.module_utils._text.to_native(e)) from e
|
||||||
|
|
||||||
|
|
||||||
|
class FilterModule: # pragma: no cover
|
||||||
|
def filters(self):
|
||||||
|
return {"format_dict": format_dict}
|
43
plugins/tests/test_filter.py
Normal file
43
plugins/tests/test_filter.py
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
import ansible.errors
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from plugins.filter.format import format_dict
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture()
|
||||||
|
def item():
|
||||||
|
return {
|
||||||
|
"key": "key_value",
|
||||||
|
"value": {
|
||||||
|
"key_2_1": "value_2_1",
|
||||||
|
"key_2_2": {
|
||||||
|
"key_2_2_1": "value_2_2_1",
|
||||||
|
"key_2_2_2": "value_2_2_2",
|
||||||
|
},
|
||||||
|
"key_2_3": {
|
||||||
|
"key_2_3_1": "value_2_3_1",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def test_format_dict(item):
|
||||||
|
string = format_dict(
|
||||||
|
item,
|
||||||
|
"start-{}-{}-{}-end",
|
||||||
|
"key",
|
||||||
|
"value.key_2_1",
|
||||||
|
"value.key_2_2.key_2_2_2",
|
||||||
|
)
|
||||||
|
assert string == "start-key_value-value_2_1-value_2_2_2-end"
|
||||||
|
|
||||||
|
|
||||||
|
def test_format_dict_key_error(item):
|
||||||
|
with pytest.raises(ansible.errors.AnsibleFilterError):
|
||||||
|
format_dict(
|
||||||
|
item,
|
||||||
|
"start-{}-{}-{}-end",
|
||||||
|
"key",
|
||||||
|
"value.key_2_1",
|
||||||
|
"value.key_2_2.key_2_3_1",
|
||||||
|
)
|
Loading…
Reference in New Issue
Block a user