Better support for slave with callback:
- callback must return single value, not a list - if default value, append slave values with master len - if not default and append, set default value
This commit is contained in:
@ -115,27 +115,41 @@ class Values(object):
|
||||
validate_properties):
|
||||
# options with callbacks
|
||||
setting = self.context.cfgimpl_get_settings()
|
||||
value = self._get_value(opt, validate)
|
||||
is_frozen = 'frozen' in setting[opt]
|
||||
if opt.impl_has_callback():
|
||||
#if value is set and :
|
||||
# - not frozen
|
||||
# - frozen and not force_default_on_freeze
|
||||
if not self.is_default_owner(opt) and (
|
||||
not is_frozen or (is_frozen and
|
||||
not 'force_default_on_freeze' in setting[opt])):
|
||||
pass
|
||||
else:
|
||||
#if value is callback and is not set or frozen with force_default_on_freeze
|
||||
if opt.impl_has_callback() and (self.is_default_owner(opt) or
|
||||
(is_frozen and
|
||||
'force_default_on_freeze' in setting[opt])):
|
||||
no_value_slave = False
|
||||
if opt.impl_get_multitype() == multitypes.slave:
|
||||
masterp = self.context.cfgimpl_get_description().impl_get_path_by_opt(
|
||||
opt.impl_get_master_slaves())
|
||||
mastervalue = getattr(self.context, masterp)
|
||||
lenmaster = len(mastervalue)
|
||||
if lenmaster == 0:
|
||||
value = []
|
||||
no_value_slave = True
|
||||
|
||||
if not no_value_slave:
|
||||
value = self._getcallback_value(opt)
|
||||
if opt.impl_is_multi():
|
||||
value = Multi(value, self.context, opt, validate)
|
||||
#suppress value if already set
|
||||
self._reset(opt)
|
||||
if 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 opt.impl_is_multi():
|
||||
value = Multi(value, self.context, opt, validate)
|
||||
#suppress value if already set
|
||||
self._reset(opt)
|
||||
# frozen and force default
|
||||
elif is_frozen and 'force_default_on_freeze' in setting[opt]:
|
||||
value = self._get_default(opt)
|
||||
if opt.impl_is_multi():
|
||||
value = Multi(value, self.context, opt, validate)
|
||||
else:
|
||||
value = self._get_value(opt, validate)
|
||||
if validate:
|
||||
opt.impl_validate(value, self.context, 'validator' in setting)
|
||||
if self.is_default_owner(opt) and \
|
||||
@ -287,10 +301,13 @@ class Multi(list):
|
||||
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(
|
||||
slave.impl_getdefault_multi(),
|
||||
force=True)
|
||||
dvalue, force=True)
|
||||
self._validate(value)
|
||||
#set value without valid properties
|
||||
self.context.cfgimpl_get_values()._setvalue(self.opt, self, validate_properties=not force)
|
||||
|
Reference in New Issue
Block a user