summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorRoland Hedberg <roland.hedberg@adm.umu.se>2014-04-15 00:11:21 +0200
committerRoland Hedberg <roland.hedberg@adm.umu.se>2014-04-15 00:11:21 +0200
commit817733a82140fcc6ec77e600514090d49eba6e12 (patch)
tree7f038477f4157e90b54ba7f66a32a37ebd8c1386 /tools
parent4fcb94b6ed39fbc2a17d38e96160fa9116d889d4 (diff)
downloadpysaml2-817733a82140fcc6ec77e600514090d49eba6e12.tar.gz
Added tool to keep attributemaps in sync. Ran it on the standard maps.
Diffstat (limited to 'tools')
-rwxr-xr-xtools/sync_attrmaps.py140
1 files changed, 140 insertions, 0 deletions
diff --git a/tools/sync_attrmaps.py b/tools/sync_attrmaps.py
new file mode 100755
index 00000000..0dc84328
--- /dev/null
+++ b/tools/sync_attrmaps.py
@@ -0,0 +1,140 @@
+#!/usr/bin/env python
+
+from importlib import import_module
+import sys
+import os
+
+__author__ = 'roland'
+
+
+def load(head, tail):
+ if head == "":
+ if sys.path[0] != ".":
+ sys.path.insert(0, ".")
+ else:
+ sys.path.insert(0, head)
+
+ if tail.endswith(".py"):
+ tail = tail[:-3]
+
+ return import_module(tail)
+
+
+def intcmp(s1, s2):
+ try:
+ _i1 = int(s1)
+ _i2 = int(s2)
+ except ValueError:
+ _i1 = s1
+ _i2 = s2
+
+ if _i1 < _i2:
+ return -1
+ if _i1 > _i2:
+ return 1
+ else:
+ return 0
+
+
+class AMap(object):
+ def __init__(self, head, tail, indent=4 * " "):
+ self.mod = load(head, tail)
+ self.variable = {}
+ self.vars = []
+ self.text = []
+ self.indent = indent
+ for key, val in self.mod.__dict__.items():
+ if key.startswith("__"):
+ continue
+ elif key == "MAP":
+ continue
+ else:
+ self.variable[key] = val
+ self.vars.append(key)
+ self.vars.sort()
+
+ def sync(self):
+ for key, val in self.mod.MAP["fro"].items():
+ try:
+ assert self.mod.MAP["to"][val] == key
+ except KeyError: # missing value
+ print "# Added %s=%s" % (self.mod.MAP["to"][val], key)
+ self.mod.MAP["to"][val] = key
+ except AssertionError:
+ raise Exception("Mismatch key:%s '%s' != '%s'" % (
+ key, val, self.mod.MAP["to"][val]))
+
+ for val in self.mod.MAP["to"].values():
+ if val not in self.mod.MAP["fro"]:
+ print "# Missing URN '%s'" % val
+
+ def do_fro(self):
+ txt = ["%s'fro': {" % self.indent]
+ i2 = self.indent + self.indent
+ _fro = self.mod.MAP["fro"]
+ for var in self.vars:
+ _v = self.variable[var]
+ li = [k[len(_v):] for k in _fro.keys() if k.startswith(_v)]
+ li.sort(intcmp)
+ for item in li:
+ txt.append("%s%s+'%s': '%s'," % (i2, var, item,
+ _fro[_v + item]))
+ txt.append('%s},' % self.indent)
+ return txt
+
+ def do_to(self):
+ txt = ["%s'to': {" % self.indent]
+ i2 = self.indent + self.indent
+ _to = self.mod.MAP["to"]
+ _keys = _to.keys()
+ _keys.sort()
+ invmap = dict([(v, k) for k, v in self.variable.items()])
+
+ for key in _keys:
+ val = _to[key]
+ for _urn, _name in invmap.items():
+ if val.startswith(_urn):
+ txt.append("%s'%s': %s+'%s'," % (i2, key, _name,
+ val[len(_urn):]))
+
+ txt.append('%s}' % self.indent)
+ return txt
+
+ def __str__(self):
+ self.sync()
+ text = []
+ for key in self.vars:
+ text.append("%s = '%s'" % (key, self.variable[key]))
+
+ text.extend(["", ""])
+
+ text.append("MAP = {")
+ text.append("%s'identifier': '%s'," % (self.indent,
+ self.mod.MAP["identifier"]))
+ text.extend(self.do_fro())
+ text.extend(self.do_to())
+
+ text.append("}")
+ text.append("")
+ return "\n".join(text)
+
+
+if __name__ == "__main__":
+ _name = sys.argv[1]
+ if os.path.isfile(_name):
+ directory, fname = os.path.split(_name)
+ amap = AMap(directory, fname, 4 * " ")
+ f = open(_name)
+ f.write("%s" % amap)
+ f.close()
+ elif os.path.isdir(_name):
+ for fname in os.listdir(_name):
+ if fname == "__init__.py":
+ continue
+ elif fname.endswith(".pyc"):
+ continue
+ print 10 * "=" + fname + 10 * "="
+ amap = AMap(_name, fname, 4 * " ")
+ f = open(fname, "w")
+ f.write("%s" % amap)
+ f.close()