diff --git a/changelogs/fragments/keep_keys.yaml b/changelogs/fragments/keep_keys.yaml new file mode 100644 index 0000000..e1a61f9 --- /dev/null +++ b/changelogs/fragments/keep_keys.yaml @@ -0,0 +1,3 @@ +--- +bugfixes: + - keep_keys - Fixes issue where all keys are removed when data is passed in as a dict. diff --git a/plugins/plugin_utils/keep_keys.py b/plugins/plugin_utils/keep_keys.py index b0f425d..2390a56 100644 --- a/plugins/plugin_utils/keep_keys.py +++ b/plugins/plugin_utils/keep_keys.py @@ -35,13 +35,12 @@ def keep_keys_from_dict_n_list(data, target, matching_parameter): if isinstance(data, dict): keep = {} for k, val in data.items(): + match = False for key in target: - match = None if not isinstance(val, (list, dict)): if matching_parameter == "regex": - match = re.match(key, k) - if match: - keep[k] = val + if re.match(key, k): + keep[k], match = val, True elif matching_parameter == "starts_with": if k.startswith(key): keep[k], match = val, True @@ -53,13 +52,14 @@ def keep_keys_from_dict_n_list(data, target, matching_parameter): keep[k], match = val, True else: list_data = keep_keys_from_dict_n_list(val, target, matching_parameter) - if isinstance(list_data, list) and not match: + if isinstance(list_data, list): list_data = [r for r in list_data if r not in ([], {})] - if all(isinstance(s, str) for s in list_data): - continue - if list_data in ([], {}): - continue - keep[k] = list_data + if list_data not in ([], {}): + keep[k], match = list_data, True + if not match and isinstance(val, (list, dict)): + nested_keep = keep_keys_from_dict_n_list(val, target, matching_parameter) + if nested_keep not in ([], {}): + keep[k] = nested_keep return keep return data diff --git a/tests/integration/targets/utils_keep_keys/tasks/simple.yaml b/tests/integration/targets/utils_keep_keys/tasks/simple.yaml index 5a7b1cd..822e590 100644 --- a/tests/integration/targets/utils_keep_keys/tasks/simple.yaml +++ b/tests/integration/targets/utils_keep_keys/tasks/simple.yaml @@ -33,7 +33,7 @@ - name: Assert result dicts ansible.builtin.assert: that: - - keep['starts_with'] == result['msg'] + - keep_values['starts_with'] == result['msg'] - name: Setup data as facts for equivalent ansible.builtin.set_fact: @@ -70,3 +70,27 @@ ansible.builtin.assert: that: - keep_default['default'] == result['msg'] + +- name: Setup data for multiple keys in dict + ansible.builtin.set_fact: + tomcat_data: + tomcat: + tomcat1: + name: tomcat1 + tomcat2: + name: tomcat2 + tomcat3: + name: tomcat3 + tomcats_block: + - tomcat1 + - tomcat2 + +- name: Debug + ansible.builtin.debug: + msg: "{{ tomcat_data | ansible.utils.keep_keys(target=['tomcats_block']) }}" + register: result + +- name: Assert result dicts + ansible.builtin.assert: + that: + - keep_tomcat['tomcat'] == result['msg'] diff --git a/tests/integration/targets/utils_keep_keys/vars/main.yaml b/tests/integration/targets/utils_keep_keys/vars/main.yaml index d7d0d90..1814789 100644 --- a/tests/integration/targets/utils_keep_keys/vars/main.yaml +++ b/tests/integration/targets/utils_keep_keys/vars/main.yaml @@ -1,5 +1,5 @@ --- -keep: +keep_values: starts_with: - interface_name: eth0 - interface_name: eth1 @@ -22,3 +22,9 @@ keep_default: is_enabled: true - interface_name: eth2 is_enabled: false + +keep_tomcat: + tomcat: + tomcats_block: + - tomcat1 + - tomcat2