init_commit

pull/1/head
cidrblock 2020-10-08 15:01:46 -07:00
parent 9672b6b361
commit 0ffadc48c6
2 changed files with 85 additions and 0 deletions

40
plugins/filter/paths.py Normal file
View File

@ -0,0 +1,40 @@
# -*- coding: utf-8 -*-
# Copyright 2020 Red Hat
# GNU General Public License v3.0+
# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
"""
flatten a complex object to dot bracket notation
"""
from __future__ import absolute_import, division, print_function
__metaclass__ = type
from ansible.errors import AnsibleFilterError
from ansible.module_utils.common._collections_compat import (
Mapping,
MutableMapping,
)
from ansible_collections.ansible.utils.plugins.module_utils.generate_paths import (
generate_paths,
)
from jinja2.filters import environmentfilter
def to_paths(obj, prepend=None):
return generate_paths(obj, prepend)
@environmentfilter
def get_path(environment, vars, path):
string_to_variable = "{{ %s }}" % path
return environment.from_string(string_to_variable).render(**vars)
class FilterModule(object):
""" Network filter """
def filters(self):
return {"to_paths": to_paths, "get_path": get_path}

View File

@ -0,0 +1,45 @@
# -*- coding: utf-8 -*-
# Copyright 2020 Red Hat
# GNU General Public License v3.0+
# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
"""
flatten a complex object to dot bracket notation
"""
from __future__ import absolute_import, division, print_function
__metaclass__ = type
import re
from ansible.module_utils.common._collections_compat import (
Mapping,
MutableMapping,
)
def generate_paths(nested_json, prepend):
out = {}
def flatten(data, name=""):
if isinstance(data, (dict, Mapping, MutableMapping)):
for key, val in data.items():
if name:
if re.match("^[a-zA-Z_][a-zA-Z0-9_]*$", key):
nname = name + ".{key}".format(key=key)
else:
nname = name + "['{key}']".format(key=key)
else:
nname = key
flatten(val, nname)
elif isinstance(data, list):
for idx, val in enumerate(data):
flatten(val, "{name}[{idx}]".format(name=name, idx=idx))
else:
out[name] = data
if prepend:
flatten({prepend: nested_json})
else:
flatten(nested_json)
return out