optimize and import re

This commit is contained in:
Lorenzo Tanganelli 2025-05-15 17:11:39 +02:00 committed by GitHub
commit 9f02444e55
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -126,6 +126,7 @@ _value:
type: raw type: raw
""" """
import re
from ansible.errors import AnsibleFilterError from ansible.errors import AnsibleFilterError
@ -168,18 +169,17 @@ def remove_keys_from_values(data, values=None, recursive=True, matching_paramete
Removes keys from dictionaries or lists of dictionaries Removes keys from dictionaries or lists of dictionaries
if their values match the specified values or regex patterns. if their values match the specified values or regex patterns.
""" """
default_values = ['', [], {}, None]
if values is None:
values = default_values
elif not isinstance(values, list):
values = [values]
if matching_parameter not in ["equal", "regex"]: if not isinstance(data, (dict, list)):
raise AnsibleFilterError(f"Invalid matching_parameter '{matching_parameter}'. Use 'equal' or 'regex'.") raise AnsibleFilterError("Input must be a dictionary or a list.")
if matching_parameter not in ("equal", "regex"):
raise AnsibleFilterError("matching_parameter must be 'equal' or 'regex'")
values = values if isinstance(values, list) else [values or '', [], {}, None]
regex_patterns = [] regex_patterns = []
if matching_parameter == "regex": if matching_parameter == "regex":
# Convert string patterns to compiled regex
try: try:
regex_patterns = [re.compile(v) for v in values] regex_patterns = [re.compile(v) for v in values]
except re.error as e: except re.error as e:
@ -188,7 +188,7 @@ def remove_keys_from_values(data, values=None, recursive=True, matching_paramete
def should_remove(val): def should_remove(val):
if matching_parameter == "equal": if matching_parameter == "equal":
return val in values return val in values
elif matching_parameter == "regex" and isinstance(val, str): if matching_parameter == "regex" and isinstance(val, str):
return any(p.match(val) for p in regex_patterns) return any(p.match(val) for p in regex_patterns)
return False return False
@ -200,15 +200,10 @@ def remove_keys_from_values(data, values=None, recursive=True, matching_paramete
if not should_remove(clean(v) if recursive else v) if not should_remove(clean(v) if recursive else v)
} }
elif isinstance(obj, list): elif isinstance(obj, list):
return [clean(item) if recursive else item for item in obj] return [clean(i) if recursive else i for i in obj]
else:
return obj return obj
if isinstance(data, (dict, list)):
return clean(data) return clean(data)
else:
raise AnsibleFilterError("Input must be a dictionary or a list of dictionaries.")
class FilterModule(object): class FilterModule(object):
def filters(self): def filters(self):