handle merge options at parameter initialisation
diff --git a/reclass/datatypes/exports.py b/reclass/datatypes/exports.py
index ea81912..dcd4976 100644
--- a/reclass/datatypes/exports.py
+++ b/reclass/datatypes/exports.py
@@ -7,8 +7,8 @@
class Exports(Parameters):
- def __init__(self, mapping=None, delimiter=None):
- super(Exports, self).__init__(mapping, delimiter)
+ def __init__(self, mapping=None, delimiter=None, options=None):
+ super(Exports, self).__init__(mapping, delimiter, options)
def __repr__(self):
return '%s(%r, %r)' % (self.__class__.__name__, self._base,
@@ -22,9 +22,9 @@
overdict = {'~' + key: value for key, value in other.iteritems()}
self.merge(overdict)
- def interpolate_from_external(self, external, options=None):
- self._initialise_interpolate(options)
- external._initialise_interpolate(options)
+ def interpolate_from_external(self, external):
+ self._initialise_interpolate()
+ external._initialise_interpolate()
while len(self._unrendered) > 0:
path, v = self._unrendered.iteritems().next()
value = path.get_value(self._base)
diff --git a/reclass/datatypes/parameters.py b/reclass/datatypes/parameters.py
index 711db88..c935000 100644
--- a/reclass/datatypes/parameters.py
+++ b/reclass/datatypes/parameters.py
@@ -44,15 +44,17 @@
DEFAULT_PATH_DELIMITER = PARAMETER_INTERPOLATION_DELIMITER
DICT_KEY_OVERRIDE_PREFIX = PARAMETER_DICT_KEY_OVERRIDE_PREFIX
- def __init__(self, mapping=None, delimiter=None):
+ def __init__(self, mapping=None, delimiter=None, options=None):
if delimiter is None:
delimiter = Parameters.DEFAULT_PATH_DELIMITER
+ if options is None:
+ options = MergeOptions()
self._delimiter = delimiter
self._base = {}
self._unrendered = None
self._escapes_handled = {}
- self._options = None
self._has_inv_query = False
+ self._options = options
if mapping is not None:
# we initialise by merging
self._keep_overrides = True
@@ -228,7 +230,7 @@
self._render_simple_container(item_list, n, value, path)
def interpolate(self, inventory=None):
- self._initialise_interpolate(self._options)
+ self._initialise_interpolate()
while len(self._unrendered) > 0:
# we could use a view here, but this is simple enough:
# _interpolate_inner removes references from the refs hash after
@@ -236,16 +238,11 @@
path, v = self._unrendered.iteritems().next()
self._interpolate_inner(path, inventory)
- def initialise_interpolation(self, options=None):
+ def initialise_interpolation(self):
self._unrendered = None
- self._initialise_interpolate(options)
+ self._initialise_interpolate()
- def _initialise_interpolate(self, options):
- if options is None:
- self._options = MergeOptions()
- else:
- self._options = options
-
+ def _initialise_interpolate(self):
if self._unrendered is None:
self._unrendered = {}
self._has_inv_query = False
diff --git a/reclass/datatypes/tests/test_parameters.py b/reclass/datatypes/tests/test_parameters.py
index 0eb7815..9ae854b 100644
--- a/reclass/datatypes/tests/test_parameters.py
+++ b/reclass/datatypes/tests/test_parameters.py
@@ -172,18 +172,18 @@
l = ['foo', 1, 2]
options = MergeOptions()
options.allow_list_over_scalar = True
- p1 = Parameters(dict(key=l[0]))
+ p1 = Parameters(dict(key=l[0]), options=options)
p1.merge(Parameters(dict(key=l[1:])))
- p1.initialise_interpolation(options)
+ p1.initialise_interpolation()
self.assertListEqual(p1.as_dict()['key'], l)
def test_merge_scalar_over_list(self):
l = ['foo', 1, 2]
options = MergeOptions()
options.allow_scalar_over_list = True
- p1 = Parameters(dict(key=l[:2]))
+ p1 = Parameters(dict(key=l[:2]), options=options)
p1.merge(Parameters(dict(key=l[2])))
- p1.initialise_interpolation(options)
+ p1.initialise_interpolation()
self.assertEqual(p1.as_dict()['key'], l[2])
def test_merge_dicts(self):
@@ -224,12 +224,12 @@
p.interpolate()
def test_merge_scalar_over_dict(self):
- p = Parameters(dict(base=SIMPLE))
- mergee = {'base':'foo'}
options = MergeOptions()
options.allow_scalar_over_dict = True
+ p = Parameters(dict(base=SIMPLE), options=options)
+ mergee = {'base':'foo'}
p.merge(Parameters(mergee))
- p.initialise_interpolation(options)
+ p.initialise_interpolation()
self.assertDictEqual(p.as_dict(), mergee)
def test_interpolate_single(self):