allow key values of None/null to be unconditionally over written
diff --git a/reclass/datatypes/tests/test_parameters.py b/reclass/datatypes/tests/test_parameters.py
index c1ef640..e33f3b8 100644
--- a/reclass/datatypes/tests/test_parameters.py
+++ b/reclass/datatypes/tests/test_parameters.py
@@ -346,6 +346,14 @@
p.interpolate()
self.assertEqual(p.as_dict(), r)
+ def test_overwrite_none(self):
+ p1 = Parameters({'A': None, 'B': None, 'C': None, 'D': None, 'E': None, 'F': None})
+ p2 = Parameters({'A': 'abc', 'B': [1, 2, 3], 'C': {'a': 'aaa', 'b': 'bbb'}, 'D': '${A}', 'E': '${B}', 'F': '${C}'})
+ r = {'A': 'abc', 'B': [1, 2, 3], 'C': {'a': 'aaa', 'b': 'bbb'}, 'D': 'abc', 'E': [1, 2, 3], 'F': {'a': 'aaa', 'b': 'bbb'}}
+ p1.merge(p2)
+ p1.interpolate()
+ self.assertEqual(p1.as_dict(), r)
+
def test_interpolate_escaping(self):
v = 'bar'.join(PARAMETER_INTERPOLATION_SENTINELS)
d = {'foo': ESCAPE_CHARACTER + 'bar'.join(PARAMETER_INTERPOLATION_SENTINELS),
diff --git a/reclass/utils/dictitem.py b/reclass/utils/dictitem.py
index fca9982..9492f49 100644
--- a/reclass/utils/dictitem.py
+++ b/reclass/utils/dictitem.py
@@ -44,7 +44,7 @@
from reclass.utils.scaitem import ScaItem
if isinstance(item, ScaItem):
- if options.allow_dict_over_scalar:
+ if item.contents() is None or options.allow_dict_over_scalar:
return self
else:
raise TypeError('allow dict over scalar = False: cannot merge %s onto %s' % (repr(self), repr(item)))
diff --git a/reclass/utils/listitem.py b/reclass/utils/listitem.py
index ed13257..4abf9a6 100644
--- a/reclass/utils/listitem.py
+++ b/reclass/utils/listitem.py
@@ -45,7 +45,9 @@
item._list.append(i)
return item
elif isinstance(item, ScaItem):
- if options.allow_list_over_scalar:
+ if item.contents() is None:
+ return self
+ elif options.allow_list_over_scalar:
self._list.insert(0, item.contents())
return self
else:
diff --git a/reclass/utils/valuelist.py b/reclass/utils/valuelist.py
index 5e57f6f..0fa7d0a 100644
--- a/reclass/utils/valuelist.py
+++ b/reclass/utils/valuelist.py
@@ -64,11 +64,11 @@
if options is None:
options = MergeOptions()
output = None
+ deepCopied = False
for n, value in enumerate(self._values):
- if n is 0:
- output = self._values[0].render(context, options)
- if isinstance(output, list):
- output = copy.deepcopy(output)
+ if output is None:
+ output = self._values[n].render(context, options)
+ deepCopied = False
else:
new = value.render(context, options)
if isinstance(output, dict) and isinstance(new, dict):
@@ -78,6 +78,8 @@
output = p1.as_dict()
continue
elif isinstance(output, list) and isinstance(new, list):
+ if not deepCopied:
+ output = copy.deepcopy(output)
output.extend(new)
continue
elif isinstance(output, (dict, list)) or isinstance(new, (dict, list)):