summaryrefslogtreecommitdiffstats
path: root/scripts/utils/dovetail_utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/utils/dovetail_utils.py')
-rw-r--r--scripts/utils/dovetail_utils.py33
1 files changed, 32 insertions, 1 deletions
diff --git a/scripts/utils/dovetail_utils.py b/scripts/utils/dovetail_utils.py
index f79c6fc4..4c671552 100644
--- a/scripts/utils/dovetail_utils.py
+++ b/scripts/utils/dovetail_utils.py
@@ -32,7 +32,7 @@ def exec_cmd(cmd, logger=None,
stderr=subprocess.STDOUT)
output = p.communicate()
for line in output[0].strip().split('\n'):
- line = line.replace('\n', '')
+ line = line.replace('\n', '')
if logger:
if info:
logger.info(line)
@@ -54,3 +54,34 @@ def exec_cmd(cmd, logger=None,
return returncode, output[0].strip()
+
+#walkthrough the object, yield path and value
+from collections import Mapping, Set, Sequence
+
+# dual python 2/3 compatability, inspired by the "six" library
+string_types = (str, unicode) if str is bytes else (str, bytes)
+iteritems = lambda mapping: getattr(mapping, 'iteritems', mapping.items)()
+
+def objwalk(obj, path=(), memo=None):
+ if memo is None:
+ memo = set()
+ iterator = None
+ if isinstance(obj, Mapping):
+ iterator = iteritems
+ elif isinstance(obj, (Sequence, Set)) and not isinstance(obj, string_types):
+ iterator = enumerate
+ if iterator:
+ if id(obj) not in memo:
+ memo.add(id(obj))
+ for path_component, value in iterator(obj):
+ for result in objwalk(value, path + (path_component,), memo):
+ yield result
+ memo.remove(id(obj))
+ else:
+ yield path, obj
+
+def get_obj_by_path(obj,dst_path):
+ for path, obj in objwalk(obj):
+ if path == dst_path:
+ return obj
+