Works callback/multi/master-slave
- in multi, never modify _default value - _reset slave when _reset master - if append None in master with callback return not a list, replace None by the value - list support in slave
This commit is contained in:
@ -30,7 +30,7 @@ from tiramisu.i18n import _
|
||||
# return calc_factory(name, callback, callback_params, config)
|
||||
|
||||
|
||||
def carry_out_calculation(name, config, callback, callback_params):
|
||||
def carry_out_calculation(name, config, callback, callback_params, index=None):
|
||||
"a function that carries out a calculation for an option's value"
|
||||
#callback, callback_params = option.getcallback()
|
||||
#if callback_params is None:
|
||||
@ -71,7 +71,11 @@ def carry_out_calculation(name, config, callback, callback_params):
|
||||
|
||||
if one_is_multi:
|
||||
ret = []
|
||||
for incr in range(len_multi):
|
||||
if index:
|
||||
range_ = [index]
|
||||
else:
|
||||
range_ = range(len_multi)
|
||||
for incr in range_:
|
||||
tcp = {}
|
||||
params = []
|
||||
for key, couples in tcparams.items():
|
||||
@ -91,10 +95,13 @@ def carry_out_calculation(name, config, callback, callback_params):
|
||||
else:
|
||||
tcp[key] = value
|
||||
calc = calculate(name, callback, params, tcp)
|
||||
if isinstance(calc, list):
|
||||
ret.extend(calc)
|
||||
if index:
|
||||
ret = calc
|
||||
else:
|
||||
ret.append(calc)
|
||||
if isinstance(calc, list):
|
||||
ret.extend(calc)
|
||||
else:
|
||||
ret.append(calc)
|
||||
|
||||
return ret
|
||||
else:
|
||||
|
@ -18,6 +18,7 @@
|
||||
#
|
||||
# ____________________________________________________________
|
||||
from time import time
|
||||
from copy import copy
|
||||
from tiramisu.error import ConfigError, SlaveError
|
||||
from tiramisu.setting import owners, multitypes, expires_time
|
||||
from tiramisu.autolib import carry_out_calculation
|
||||
@ -47,9 +48,13 @@ class Values(object):
|
||||
def _get_default(self, opt):
|
||||
meta = self.context.cfgimpl_get_meta()
|
||||
if meta is not None:
|
||||
return meta.cfgimpl_get_values()[opt]
|
||||
value = meta.cfgimpl_get_values()[opt]
|
||||
else:
|
||||
return opt.impl_getdefault()
|
||||
value = opt.impl_getdefault()
|
||||
if opt.impl_is_multi():
|
||||
return copy(value)
|
||||
else:
|
||||
return value
|
||||
|
||||
def _get_value(self, opt, validate=True):
|
||||
"return value or default value if not set"
|
||||
@ -72,6 +77,9 @@ class Values(object):
|
||||
opt.impl_validate(opt.impl_getdefault(), self.context,
|
||||
'validator' in setting)
|
||||
self.context.cfgimpl_reset_cache()
|
||||
if opt.impl_is_multi() and opt.impl_get_multitype() == multitypes.master:
|
||||
for slave in opt.impl_get_master_slaves():
|
||||
self._reset(slave)
|
||||
del(self._values[opt])
|
||||
|
||||
def _is_empty(self, opt, value):
|
||||
@ -83,13 +91,14 @@ class Values(object):
|
||||
return True
|
||||
return False
|
||||
|
||||
def _getcallback_value(self, opt):
|
||||
def _getcallback_value(self, opt, index=None):
|
||||
callback, callback_params = opt._callback
|
||||
if callback_params is None:
|
||||
callback_params = {}
|
||||
return carry_out_calculation(opt._name, config=self.context,
|
||||
callback=callback,
|
||||
callback_params=callback_params)
|
||||
callback_params=callback_params,
|
||||
index=index)
|
||||
|
||||
def __getitem__(self, opt):
|
||||
return self.getitem(opt)
|
||||
@ -133,11 +142,8 @@ class Values(object):
|
||||
if not no_value_slave:
|
||||
value = self._getcallback_value(opt)
|
||||
if opt.impl_is_multi() and opt.impl_get_multitype() == multitypes.slave:
|
||||
if isinstance(value, list):
|
||||
raise ValueError('callback must not return list '
|
||||
'in slave {0}: {1}'.format(opt._name,
|
||||
value))
|
||||
value = [value for i in range(lenmaster)]
|
||||
if not isinstance(value, list):
|
||||
value = [value for i in range(lenmaster)]
|
||||
if opt.impl_is_multi():
|
||||
value = Multi(value, self.context, opt, validate)
|
||||
#suppress value if already set
|
||||
@ -297,20 +303,27 @@ class Multi(list):
|
||||
raise SlaveError(_("cannot append a value on a multi option {0}"
|
||||
" which is a slave").format(self.opt._name))
|
||||
elif self.opt.impl_get_multitype() == multitypes.master:
|
||||
for slave in self.opt.impl_get_master_slaves():
|
||||
values = self.context.cfgimpl_get_values()
|
||||
if not values.is_default_owner(slave):
|
||||
if slave.impl_has_callback():
|
||||
dvalue = values._getcallback_value(slave)
|
||||
else:
|
||||
dvalue = slave.impl_getdefault_multi()
|
||||
#get multi without valid properties
|
||||
values.getitem(slave, validate_properties=False).append(
|
||||
dvalue, force=True)
|
||||
values = self.context.cfgimpl_get_values()
|
||||
if value is None and self.opt.impl_has_callback():
|
||||
value = values._getcallback_value(self.opt)
|
||||
#Force None il return a list
|
||||
if isinstance(value, list):
|
||||
value = None
|
||||
self._validate(value)
|
||||
#set value without valid properties
|
||||
self.context.cfgimpl_get_values()._setvalue(self.opt, self, validate_properties=not force)
|
||||
super(Multi, self).append(value)
|
||||
if not force and self.opt.impl_get_multitype() == multitypes.master:
|
||||
for slave in self.opt.impl_get_master_slaves():
|
||||
if not values.is_default_owner(slave):
|
||||
if slave.impl_has_callback():
|
||||
index = self.__len__() - 1
|
||||
dvalue = values._getcallback_value(slave, index=index)
|
||||
else:
|
||||
dvalue = slave.impl_getdefault_multi()
|
||||
#get multi without valid properties
|
||||
values.getitem(slave, validate_properties=False).append(
|
||||
dvalue, force=True)
|
||||
|
||||
def _validate(self, value):
|
||||
if value is not None and not self.opt._validate(value):
|
||||
|
Reference in New Issue
Block a user