From 1a18d5a59d14877984fe00d6257ba8bd5d5036d4 Mon Sep 17 00:00:00 2001
From: John Estabrook <jestabro@vyos.io>
Date: Tue, 16 May 2023 21:18:34 -0500
Subject: config: T5228: simplify mangle_dict_keys

---
 python/vyos/utils/dict.py | 43 +++++++++++++++++++------------------------
 1 file changed, 19 insertions(+), 24 deletions(-)

(limited to 'python')

diff --git a/python/vyos/utils/dict.py b/python/vyos/utils/dict.py
index 7c93deef6..8fb519a5c 100644
--- a/python/vyos/utils/dict.py
+++ b/python/vyos/utils/dict.py
@@ -65,7 +65,7 @@ def colon_separated_to_dict(data_string, uniquekeys=False):
 
     return data
 
-def _mangle_dict_keys(data, regex, replacement, abs_path=[], no_tag_node_value_mangle=False, mod=0):
+def mangle_dict_keys(data, regex, replacement, abs_path=None, no_tag_node_value_mangle=False):
     """ Mangles dict keys according to a regex and replacement character.
     Some libraries like Jinja2 do not like certain characters in dict keys.
     This function can be used for replacing all offending characters
@@ -73,44 +73,39 @@ def _mangle_dict_keys(data, regex, replacement, abs_path=[], no_tag_node_value_m
 
     Args:
         data (dict): Original dict to mangle
+        regex, replacement (str): arguments to re.sub(regex, replacement, ...)
+        abs_path (list): if data is a config dict and no_tag_node_value_mangle is True
+                         then abs_path should be the absolute config path to the first
+                         keys of data, non-inclusive
+        no_tag_node_value_mangle (bool): do not mangle keys of tag node values
 
     Returns: dict
     """
-    from vyos.xml import is_tag
-
-    new_dict = {}
+    import re
+    from vyos.xml_ref import is_tag_value
 
-    for key in data.keys():
-        save_mod = mod
-        save_path = abs_path[:]
+    if abs_path is None:
+        abs_path = []
 
-        abs_path.append(key)
+    new_dict = {}
 
-        if not is_tag(abs_path):
-            new_key = re.sub(regex, replacement, key)
+    for k in data.keys():
+        if no_tag_node_value_mangle and is_tag_value(abs_path + [k]):
+            new_key = k
         else:
-            if mod%2:
-                new_key = key
-            else:
-                new_key = re.sub(regex, replacement, key)
-            if no_tag_node_value_mangle:
-                mod += 1
+            new_key = re.sub(regex, replacement, k)
 
-        value = data[key]
+        value = data[k]
 
         if isinstance(value, dict):
-            new_dict[new_key] = _mangle_dict_keys(value, regex, replacement, abs_path=abs_path, mod=mod, no_tag_node_value_mangle=no_tag_node_value_mangle)
+            new_dict[new_key] = mangle_dict_keys(value, regex, replacement,
+                                                 abs_path=abs_path + [k],
+                                                 no_tag_node_value_mangle=no_tag_node_value_mangle)
         else:
             new_dict[new_key] = value
 
-        mod = save_mod
-        abs_path = save_path[:]
-
     return new_dict
 
-def mangle_dict_keys(data, regex, replacement, abs_path=[], no_tag_node_value_mangle=False):
-    return _mangle_dict_keys(data, regex, replacement, abs_path=abs_path, no_tag_node_value_mangle=no_tag_node_value_mangle, mod=0)
-
 def _get_sub_dict(d, lpath):
     k = lpath[0]
     if k not in d.keys():
-- 
cgit v1.2.3