blob: 3dc9c6224b3d1d0be0d2c04eb4099c10c876b487 [file] [log] [blame]
#
# -*- coding: utf-8 -*-
#
# This file is part of reclass
#
import copy
class ValueList(object):
def __init__(self, value):
self._refs = []
self._allRefs = True
self._values = [ value ]
self._has_inv_query = False
self._update()
def append(self, value):
self._values.append(value)
self._update()
def extend(self, values):
self._values.extend(values._values)
self._update()
def _update(self):
self._has_inv_query = False
self.assembleRefs()
self._check_for_inv_query()
def has_references(self):
return len(self._refs) > 0
def has_inv_query(self):
return self._has_inv_query
def is_complex(self):
return (self.has_references() | self.has_inv_query())
def get_references(self):
return self._refs
def allRefs(self):
return self._allRefs
def _check_for_inv_query(self):
self._has_inv_query = False
for value in self._values:
if value.has_inv_query():
self._has_inv_query = True
def assembleRefs(self, context={}):
self._refs = []
self._allRefs = True
for value in self._values:
value.assembleRefs(context)
if value.has_references():
self._refs.extend(value.get_references())
if value.allRefs() is False:
self._allRefs = False
def merge(self, options):
output = None
for n, value in enumerate(self._values):
if output is None:
output = value
else:
output = value.merge_over(output, options)
return output
def render(self, context, inventory, options):
from reclass.datatypes.parameters import Parameters
output = None
deepCopied = False
for n, value in enumerate(self._values):
if output is None:
output = self._values[n].render(context, inventory)
deepCopied = False
else:
new = value.render(context, inventory)
if isinstance(output, dict) and isinstance(new, dict):
p1 = Parameters(output, delimiter=value._delimiter)
p2 = Parameters(new, delimiter=value._delimiter)
p1.merge(p2)
output = p1.as_dict()
continue
elif isinstance(output, list) and isinstance(new, list):
if not deepCopied:
output = copy.deepcopy(output)
deepCopied = True
output.extend(new)
continue
elif isinstance(output, (dict, list)) or isinstance(new, (dict, list)):
raise TypeError('Cannot merge %s over %s' % (repr(self._values[n]), repr(self._values[n-1])))
else:
output = new
return output
def __repr__(self):
return 'ValueList(%r)' % self._values