Import of working code base
Signed-off-by: martin f. krafft <madduck@madduck.net>
diff --git a/mergers/dict/recursive_policy_update.py b/mergers/dict/recursive_policy_update.py
new file mode 100644
index 0000000..f3bcb3e
--- /dev/null
+++ b/mergers/dict/recursive_policy_update.py
@@ -0,0 +1,32 @@
+#
+# -*- coding: utf-8 -*-
+#
+# This file is part of reclass (http://github.com/madduck/reclass)
+#
+# Copyright © 2007–13 martin f. krafft <madduck@madduck.net>
+# Released under the terms of the Artistic Licence 2.0
+#
+from base import BaseDictMerger
+
+class DictRecursivePolicyUpdate(BaseDictMerger):
+
+ def __init__(self, policy=None):
+ super(DictRecursivePolicyUpdate, self).__init__()
+ if policy is None:
+ policy = {(dict,dict) : self.merge,
+ (list,list) : lambda x,y: x+y,
+ (dict,list) : lambda x,y: self.merge(x, dict(y)),
+ None : lambda x,y: y
+ }
+ self._policy = policy
+
+ def merge(self, first, second):
+ ret = first.copy()
+ for k,v in second.iteritems():
+ if k in ret:
+ pfn = self._policy.get((type(ret[k]), type(v)),
+ self._policy.get(None))
+ ret[k] = pfn(ret[k], v)
+ else:
+ ret[k] = v
+ return ret