Skip to content

Commit

Permalink
update stemplate for smart merge
Browse files Browse the repository at this point in the history
  • Loading branch information
mandarjog committed Mar 22, 2016
1 parent 5e6cdde commit 96da9a1
Showing 1 changed file with 73 additions and 0 deletions.
73 changes: 73 additions & 0 deletions stemplate.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 96da9a1

Please sign in to comment.