ensure value object contains only one item
diff --git a/reclass/utils/compitem.py b/reclass/utils/compitem.py
new file mode 100644
index 0000000..0e95d48
--- /dev/null
+++ b/reclass/utils/compitem.py
@@ -0,0 +1,53 @@
+#
+# -*- coding: utf-8 -*-
+#
+# This file is part of reclass
+#
+
+from reclass.utils.mergeoptions import MergeOptions
+from reclass.utils.dictpath import DictPath
+from reclass.errors import UndefinedVariableError
+
+class CompItem(object):
+
+ def __init__(self, items):
+ self._items = items
+ self._refs = []
+ self._allRefs = False
+ self.assembleRefs()
+
+ def assembleRefs(self, context={}):
+ self._refs = []
+ self._allRefs = True
+ options = MergeOptions()
+ for item in self._items:
+ if item.has_references():
+ item.assembleRefs(context)
+ self._refs.extend(item.get_references())
+ if item.allRefs() is False:
+ self._allRefs = False
+
+ def contents(self):
+ return self._items
+
+ def allRefs(self):
+ return self._allRefs
+
+ def has_references(self):
+ return len(self._refs) > 0
+
+ def get_references(self):
+ return self._refs
+
+ def render(self, context):
+ # Preserve type if only one item
+ if len(self._items) == 1:
+ return self._items[0].render(context)
+ # Multiple items
+ string = ''
+ for item in self._items:
+ string += str(item.render(context))
+ return string
+
+ def __repr__(self):
+ return 'CompItem(%r)' % self._items
diff --git a/reclass/utils/value.py b/reclass/utils/value.py
index 0e11071..b934b1e 100644
--- a/reclass/utils/value.py
+++ b/reclass/utils/value.py
@@ -6,11 +6,12 @@
import pyparsing as pp
-from reclass.utils.mergeoptions import *
-from reclass.utils.dictitem import *
-from reclass.utils.listitem import *
-from reclass.utils.refitem import *
-from reclass.utils.scaitem import *
+from reclass.utils.mergeoptions import MergeOptions
+from reclass.utils.compitem import CompItem
+from reclass.utils.dictitem import DictItem
+from reclass.utils.listitem import ListItem
+from reclass.utils.refitem import RefItem
+from reclass.utils.scaitem import ScaItem
from reclass.defaults import PARAMETER_INTERPOLATION_DELIMITER, PARAMETER_INTERPOLATION_SENTINELS
_STR = 'STR'
@@ -55,21 +56,24 @@
def __init__(self, val, delimiter=PARAMETER_INTERPOLATION_DELIMITER):
self._delimiter = delimiter
- self._items = []
self._refs = []
self._allRefs = False
self._container = False
if isinstance(val, str):
tokens = Value._parser.leaveWhitespace().parseString(val).asList()
- self._items = self._createItems(tokens)
+ items = self._createItems(tokens)
+ if len(items) is 1:
+ self._item = items[0]
+ else:
+ self._item = CompItem(items)
elif isinstance(val, list):
- self._items.append(ListItem(val))
+ self._item = ListItem(val)
self._container = True
elif isinstance(val, dict):
- self._items.append(DictItem(val))
+ self._item = DictItem(val)
self._container = True
else:
- self._items.append(ScaItem(val))
+ self._item = ScaItem(val)
self.assembleRefs()
def _createRef(self, tokens):
@@ -91,14 +95,13 @@
return items
def assembleRefs(self, context={}):
- self._refs = []
- self._allRefs = True
- for item in self._items:
- if item.has_references():
- item.assembleRefs(context)
- self._refs.extend(item.get_references())
- if item.allRefs() is False:
- self._allRefs = False
+ if self._item.has_references():
+ self._item.assembleRefs(context)
+ self._refs = self._item.get_references()
+ self._allRefs = self._item.allRefs()
+ else:
+ self._refs = []
+ self._allRefs = True
def is_container(self):
return self._container
@@ -112,29 +115,15 @@
def get_references(self):
return self._refs
- def render(self, context, options=None):
- if options is None:
- options = MergeOptions()
- if len(self._items) == 1:
- return self._items[0].render(context, options)
- value = ''
- for item in self._items:
- value += str(item.render(context, options))
- return value
+ def render(self, context, dummy=None):
+ return self._item.render(context)
def contents(self):
- if len(self._items) == 1:
- return self._items[0].contents()
- value = ''
- for item in self._items:
- value += str(item.contents())
- return value
+ return self._item.contents()
def merge_over(self, value, options):
- if len(self._items) is 1 and len(value._items) is 1:
- self._items[0] = self._items[0].merge_over(value._items[0], options)
- return self
- raise TypeError('Cannot merge %s onto %s' % (repr(self), repr(value)))
+ self._item = self._item.merge_over(value._item, options)
+ return self
def __repr__(self):
- return 'Value(%r)' % self._items
+ return 'Value(%r)' % self._item