From 96da9a102de4b29afd9d921ebe1fb725c4784208 Mon Sep 17 00:00:00 2001 From: Mandar U Jog Date: Tue, 22 Mar 2016 19:57:18 -0400 Subject: [PATCH] update stemplate for smart merge --- stemplate.py | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/stemplate.py b/stemplate.py index 623357f..c52ec8d 100644 --- a/stemplate.py +++ b/stemplate.py @@ -38,3 +38,76 @@ def kv(obj): return enumerate([]) else: raise Exception("{} {}".format(obj, type(obj))) + + +def isElementry(val): + return isinstance( + val, + (int, long, bool, str, unicode)) + + +def isTerminal(val): + if isElementry(val) is True: + return True + if isinstance(val, list): + return all(isElementry(vv) for vv in val) + + return False + + +def cfgmerge(dest, src): + dest_keys = dest.keys() + for key in src.keys(): + if key == src.idfield: + continue + val = src[key] + if key == 'value' or isTerminal(val.obj): + dest[key] = val.obj + continue + if key in dest_keys: + cfgmerge(dest[key], src[key]) + else: + print( + "{} key {} is missing from {} ".format( + src, + key, + dest_keys)) + dest[key] = val.obj + + +class Cfg(object): + def __init__(self, obj, idfield='identifier', key=""): + self.obj = obj + self.idfield = idfield + self.key = key + + def __getitem__(self, key): + if isinstance(self.obj, dict): + return Cfg(self.obj[key], self.idfield, self.key+"."+key) + if isinstance(self.obj, list): + if isinstance(key, (str, unicode)): + val = next(vv for vv in self.obj if vv[self.idfield] == key) + return Cfg(val, self.idfield, self.key+"."+key) + elif isinstance(key, (int, long)): + return Cfg(self.obj[key], self.idfield, self.key+"."+key) + + def __setitem__(self, key, val): + if isinstance(self.obj, dict): + self.obj[key] = val + + def keys(self): + if isinstance(self.obj, dict): + return self.obj.keys() + elif isinstance(self.obj, list): + return [v[self.idfield] for v in self.obj] + + def get(self, jpath): + vx = self + for comp in jpath.split('.'): + if comp == '': + continue + vx = vx[comp] + return vx + + def __repr__(self): + return self.key