refactor
This commit is contained in:
@ -135,7 +135,7 @@ class Base(object):
|
||||
|
||||
def __init__(self, name, doc, requires=None, properties=None, is_multi=False):
|
||||
if not valid_name(name):
|
||||
raise ValueError(_("invalid name: {0} for option").format(name))
|
||||
raise ValueError(_('invalid name: "{0}" for option').format(name))
|
||||
if requires is not None:
|
||||
calc_properties, requires = validate_requires_arg(self, is_multi,
|
||||
requires, name)
|
||||
@ -654,13 +654,18 @@ class DynSymLinkOption(object):
|
||||
else:
|
||||
return base_path + '.' + self._dyn
|
||||
|
||||
def impl_validate(self, value, context=undefined, validate=True,
|
||||
force_index=None, force_submulti_index=None, is_multi=None,
|
||||
display_error=True, display_warnings=True, multi=None,
|
||||
def impl_validate(self,
|
||||
value,
|
||||
context=undefined,
|
||||
validate=True,
|
||||
force_index=None,
|
||||
is_multi=None,
|
||||
display_error=True,
|
||||
display_warnings=True,
|
||||
multi=None,
|
||||
setting_properties=undefined):
|
||||
return self._impl_getopt().impl_validate(value, context, validate,
|
||||
force_index,
|
||||
force_submulti_index,
|
||||
current_opt=self,
|
||||
is_multi=is_multi,
|
||||
display_error=display_error,
|
||||
|
@ -112,12 +112,23 @@ class Option(OnlyOption):
|
||||
super(Option, self).__init__(name, doc, requires=requires,
|
||||
properties=properties, is_multi=is_multi)
|
||||
if is_multi and default_multi is not None:
|
||||
err = self._validate(default_multi)
|
||||
if err:
|
||||
raise ValueError(_("invalid default_multi value {0} "
|
||||
"for option {1}: {2}").format(
|
||||
str(default_multi),
|
||||
self.impl_getname(), str(err)))
|
||||
def test_multi_value(value):
|
||||
err = self._validate(value)
|
||||
if err:
|
||||
raise ValueError(_("invalid default_multi value {0} "
|
||||
"for option {1}: {2}").format(
|
||||
str(value),
|
||||
self.impl_getname(), str(err)))
|
||||
if _multi is submulti:
|
||||
if not isinstance(default_multi, list):
|
||||
raise ValueError(_("invalid default_multi value {0} "
|
||||
"for option {1}: must be a list for a submulti").format(
|
||||
str(default_multi),
|
||||
self.impl_getname()))
|
||||
for value in default_multi:
|
||||
test_multi_value(value)
|
||||
else:
|
||||
test_multi_value(default_multi)
|
||||
_setattr(self, '_default_multi', default_multi)
|
||||
if unique is not undefined:
|
||||
_setattr(self, '_unique', unique)
|
||||
@ -239,10 +250,17 @@ class Option(OnlyOption):
|
||||
ret_val = val
|
||||
return ret_val
|
||||
|
||||
def impl_validate(self, value, context=undefined, validate=True,
|
||||
force_index=None, force_submulti_index=None,
|
||||
current_opt=undefined, is_multi=None,
|
||||
display_error=True, display_warnings=True, multi=None,
|
||||
def impl_validate(self,
|
||||
value,
|
||||
context=undefined,
|
||||
validate=True,
|
||||
force_index=None,
|
||||
force_submulti_index=None,
|
||||
current_opt=undefined,
|
||||
is_multi=None,
|
||||
display_error=True,
|
||||
display_warnings=True,
|
||||
multi=None,
|
||||
setting_properties=undefined):
|
||||
"""
|
||||
:param value: the option's value
|
||||
@ -290,7 +308,8 @@ class Option(OnlyOption):
|
||||
else:
|
||||
validator_params_ = {'': (val,)}
|
||||
# Raise ValueError if not valid
|
||||
value = carry_out_calculation(current_opt, context=context,
|
||||
value = carry_out_calculation(current_opt,
|
||||
context=context,
|
||||
callback=validator,
|
||||
callback_params=validator_params_,
|
||||
index=_index,
|
||||
@ -304,11 +323,14 @@ class Option(OnlyOption):
|
||||
else:
|
||||
if display_error:
|
||||
# option validation
|
||||
err = self._validate(_value, context, current_opt)
|
||||
err = self._validate(_value,
|
||||
context,
|
||||
current_opt)
|
||||
if err:
|
||||
if debug: # pragma: no cover
|
||||
log.debug('do_validation: value: {0}, index: {1}, '
|
||||
'submulti_index: {2}'.format(_value, _index,
|
||||
'submulti_index: {2}'.format(_value,
|
||||
_index,
|
||||
submulti_index),
|
||||
exc_info=True)
|
||||
err_msg = '{0}'.format(err)
|
||||
@ -342,8 +364,12 @@ class Option(OnlyOption):
|
||||
if error is None:
|
||||
# if context launch consistency validation
|
||||
#if context is not undefined:
|
||||
ret = self._valid_consistency(current_opt, _value, context,
|
||||
_index, submulti_index, display_warnings,
|
||||
ret = self._valid_consistency(current_opt,
|
||||
_value,
|
||||
context,
|
||||
_index,
|
||||
submulti_index,
|
||||
display_warnings,
|
||||
display_error)
|
||||
if isinstance(ret, ValueError):
|
||||
error = ret
|
||||
@ -421,8 +447,13 @@ class Option(OnlyOption):
|
||||
err = do_validation(val, idx, force_submulti_index)
|
||||
if err:
|
||||
return err
|
||||
return self._valid_consistency(current_opt, None, context,
|
||||
None, None, display_warnings, display_error)
|
||||
return self._valid_consistency(current_opt,
|
||||
None,
|
||||
context,
|
||||
None,
|
||||
None,
|
||||
display_warnings,
|
||||
display_error)
|
||||
|
||||
def impl_is_dynsymlinkoption(self):
|
||||
return False
|
||||
@ -596,7 +627,11 @@ class Option(OnlyOption):
|
||||
|
||||
def impl_getdefault_multi(self):
|
||||
"accessing the default value for a multi"
|
||||
return getattr(self, '_default_multi', None)
|
||||
if self.impl_is_submulti():
|
||||
default_value = []
|
||||
else:
|
||||
default_value = None
|
||||
return getattr(self, '_default_multi', default_value)
|
||||
|
||||
def _validate_callback(self, callback, callback_params):
|
||||
"""callback_params:
|
||||
@ -605,7 +640,7 @@ class Option(OnlyOption):
|
||||
"""
|
||||
if callback is None:
|
||||
return
|
||||
default_multi = self.impl_getdefault_multi()
|
||||
default_multi = getattr(self, '_default_multi', None)
|
||||
is_multi = self.impl_is_multi()
|
||||
default = self.impl_getdefault()
|
||||
if (not is_multi and (default is not None or default_multi is not None)) or \
|
||||
|
@ -163,11 +163,11 @@ class CacheOptionDescription(BaseOption):
|
||||
raise ConfigError(_('a dynoption ({0}) cannot have '
|
||||
'force_store_value property').format(subpath))
|
||||
if force_store_values and not config._impl_values._p_.hasvalue(subpath, session):
|
||||
value = config.cfgimpl_get_values()._get_cached_value(option,
|
||||
path=subpath,
|
||||
validate=False,
|
||||
trusted_cached_properties=False,
|
||||
validate_properties=True)
|
||||
value = config.cfgimpl_get_values().get_cached_value(option,
|
||||
path=subpath,
|
||||
validate=False,
|
||||
trusted_cached_properties=False,
|
||||
validate_properties=True)
|
||||
value_set = True
|
||||
config._impl_values._p_.setvalue(subpath, value,
|
||||
owners.forced, None, session, False)
|
||||
@ -497,6 +497,9 @@ class OptionDescription(OptionDescriptionWalk):
|
||||
raise ValueError(_("invalid suffix: {0} for option").format(val))
|
||||
return values
|
||||
|
||||
def impl_validate_value(self, option, value, context):
|
||||
pass
|
||||
|
||||
|
||||
class DynOptionDescription(OptionDescription):
|
||||
def __init__(self, name, doc, children, requires=None, properties=None,
|
||||
@ -561,9 +564,13 @@ class SynDynOptionDescription(object):
|
||||
class MasterSlaves(OptionDescription):
|
||||
__slots__ = ('master', 'slaves')
|
||||
|
||||
def __init__(self, name, doc, children, requires=None, properties=None):
|
||||
#if master (same name has group) is set
|
||||
#for collect all slaves
|
||||
def __init__(self,
|
||||
name,
|
||||
doc,
|
||||
children,
|
||||
requires=None,
|
||||
properties=None):
|
||||
|
||||
super(MasterSlaves, self).__init__(name,
|
||||
doc,
|
||||
children,
|
||||
@ -572,10 +579,6 @@ class MasterSlaves(OptionDescription):
|
||||
self._group_type = groups.master
|
||||
slaves = []
|
||||
master = children[0]
|
||||
if master.impl_getname() != name:
|
||||
raise ValueError(_('master group with wrong'
|
||||
' master name for {0}'
|
||||
).format(name))
|
||||
for child in children[1:]:
|
||||
if child.impl_getdefault() != []:
|
||||
raise ValueError(_("not allowed default value for option {0} "
|
||||
@ -604,8 +607,6 @@ class MasterSlaves(OptionDescription):
|
||||
raise ValueError(_("callback of master's option shall "
|
||||
"not refered a slave's ones"))
|
||||
#everything is ok, store references
|
||||
#self.master = master
|
||||
#self.slaves = tuple(slaves)
|
||||
for child in children:
|
||||
child._master_slaves = self
|
||||
master._add_dependency(self)
|
||||
@ -644,41 +645,74 @@ class MasterSlaves(OptionDescription):
|
||||
c_opt = opt
|
||||
return c_opt in self._children[1]
|
||||
|
||||
def reset(self, opt, values, setting_properties, _commit=True, force_permissive=False):
|
||||
for slave in self.getslaves(opt):
|
||||
values.reset(slave, validate=False, _setting_properties=setting_properties,
|
||||
_commit=_commit, force_permissive=force_permissive)
|
||||
def reset(self,
|
||||
opt,
|
||||
values,
|
||||
setting_properties,
|
||||
_commit=True,
|
||||
force_permissive=False):
|
||||
|
||||
def pop(self, opt, values, index):
|
||||
for slave in self.getslaves(opt):
|
||||
slave_path = slave.impl_getpath(values._getcontext())
|
||||
slavelen = values._p_.get_max_length(slave_path, None)
|
||||
# just for raise if needed
|
||||
if not values.is_default_owner(slave, validate_properties=False,
|
||||
validate_meta=False, index=index):
|
||||
multi = values._get_cached_value(slave, validate=False,
|
||||
validate_properties=False,
|
||||
)
|
||||
if isinstance(multi, Exception):
|
||||
raise multi
|
||||
values.reset(slave,
|
||||
slave_path,
|
||||
setting_properties,
|
||||
validate=False,
|
||||
_commit=_commit,
|
||||
force_permissive=force_permissive)
|
||||
|
||||
def pop(self,
|
||||
opt,
|
||||
path,
|
||||
values,
|
||||
index):
|
||||
|
||||
for slave in self.getslaves(opt):
|
||||
slave_path = slave.impl_getpath(values._getcontext())
|
||||
slavelen = values._p_.get_max_length(slave_path)
|
||||
if not values.is_default_owner(slave,
|
||||
validate_properties=False,
|
||||
validate_meta=False,
|
||||
index=index):
|
||||
#FIXME # just for raise if needed
|
||||
#multi = values.get_cached_value(slave,
|
||||
# validate=False,
|
||||
# validate_properties=False,
|
||||
# )
|
||||
#if isinstance(multi, Exception):
|
||||
# raise multi
|
||||
if slavelen > index:
|
||||
values._p_.resetvalue_index(slave_path, index)
|
||||
values._p_.resetvalue_index(slave_path,
|
||||
index)
|
||||
if slavelen > index + 1:
|
||||
for idx in xrange(index + 1, slavelen):
|
||||
values._p_.reduce_index(slave_path, idx)
|
||||
values._p_.reduce_index(slave_path,
|
||||
idx)
|
||||
|
||||
|
||||
def getitem(self, values, opt, path, validate, force_permissive,
|
||||
trusted_cached_properties, validate_properties,
|
||||
slave_path=undefined, slave_value=undefined,
|
||||
setting_properties=undefined, self_properties=undefined, index=None,
|
||||
def getitem(self,
|
||||
values,
|
||||
opt,
|
||||
path,
|
||||
validate,
|
||||
force_permissive,
|
||||
trusted_cached_properties,
|
||||
validate_properties,
|
||||
setting_properties=undefined,
|
||||
self_properties=undefined,
|
||||
index=None,
|
||||
check_frozen=False):
|
||||
if self.is_master(opt):
|
||||
return self._getmaster(values, opt, path, validate,
|
||||
return self._getmaster(values,
|
||||
opt,
|
||||
path,
|
||||
validate,
|
||||
force_permissive,
|
||||
validate_properties, slave_path,
|
||||
slave_value, self_properties, index,
|
||||
setting_properties, check_frozen)
|
||||
validate_properties,
|
||||
self_properties,
|
||||
index,
|
||||
setting_properties,
|
||||
check_frozen)
|
||||
else:
|
||||
return self._getslave(values, opt, path, validate,
|
||||
force_permissive, trusted_cached_properties,
|
||||
@ -686,17 +720,26 @@ class MasterSlaves(OptionDescription):
|
||||
self_properties, index,
|
||||
check_frozen)
|
||||
|
||||
def _getmaster(self, values, opt, path, validate, force_permissive,
|
||||
validate_properties, c_slave_path,
|
||||
c_slave_value, self_properties, index,
|
||||
setting_properties, check_frozen):
|
||||
return values._get_cached_value(opt, path=path, validate=validate,
|
||||
force_permissive=force_permissive,
|
||||
validate_properties=validate_properties,
|
||||
self_properties=self_properties,
|
||||
from_masterslave=True, index=index,
|
||||
setting_properties=setting_properties,
|
||||
check_frozen=check_frozen)
|
||||
def _getmaster(self,
|
||||
values,
|
||||
opt,
|
||||
path,
|
||||
validate,
|
||||
force_permissive,
|
||||
validate_properties,
|
||||
self_properties,
|
||||
index,
|
||||
setting_properties,
|
||||
check_frozen):
|
||||
return values.get_cached_value(opt,
|
||||
path=path,
|
||||
validate=validate,
|
||||
force_permissive=force_permissive,
|
||||
validate_properties=validate_properties,
|
||||
self_properties=self_properties,
|
||||
index=index,
|
||||
setting_properties=setting_properties,
|
||||
check_frozen=check_frozen)
|
||||
|
||||
def _getslave(self, values, opt, path, validate, force_permissive,
|
||||
trusted_cached_properties, validate_properties, setting_properties,
|
||||
@ -725,20 +768,20 @@ class MasterSlaves(OptionDescription):
|
||||
master = self.getmaster(opt)
|
||||
context = values._getcontext()
|
||||
masterp = master.impl_getpath(context)
|
||||
mastervalue = values._get_cached_value(master, path=masterp, validate=validate,
|
||||
force_permissive=force_permissive,
|
||||
validate_properties=validate_properties,
|
||||
self_properties=self_properties,
|
||||
from_masterslave=True,
|
||||
setting_properties=setting_properties,
|
||||
check_frozen=check_frozen)
|
||||
mastervalue = values.get_cached_value(master, path=masterp, validate=validate,
|
||||
force_permissive=force_permissive,
|
||||
validate_properties=validate_properties,
|
||||
self_properties=self_properties,
|
||||
from_masterslave=True,
|
||||
setting_properties=setting_properties,
|
||||
check_frozen=check_frozen)
|
||||
if isinstance(mastervalue, Exception):
|
||||
if isinstance(mastervalue, PropertiesOptionError):
|
||||
mastervalue.set_orig_opt(opt)
|
||||
return mastervalue
|
||||
masterlen = len(mastervalue)
|
||||
master_is_meta = values._is_meta(master, masterp, force_permissive=force_permissive)
|
||||
multi = values._get_multi(opt, path)
|
||||
#self._master_is_meta = values._is_meta(master, masterp, force_permissive=force_permissive)
|
||||
multi = list() # values._get_multi(opt, path)
|
||||
if validate_properties:
|
||||
props = context.cfgimpl_get_settings().validate_properties(opt, False,
|
||||
check_frozen,
|
||||
@ -748,68 +791,84 @@ class MasterSlaves(OptionDescription):
|
||||
setting_properties=setting_properties)
|
||||
if props:
|
||||
return props
|
||||
#FIXME shouldn't have index!!!
|
||||
if index is None:
|
||||
indexes = xrange(0, masterlen)
|
||||
else:
|
||||
indexes = [index]
|
||||
for idx in indexes:
|
||||
value = values._get_cached_value(opt, path, validate,
|
||||
force_permissive,
|
||||
trusted_cached_properties,
|
||||
validate_properties,
|
||||
with_meta=master_is_meta,
|
||||
index=idx,
|
||||
# not self_properties,
|
||||
# depends to index
|
||||
#self_properties=self_properties,
|
||||
setting_properties=setting_properties,
|
||||
masterlen=masterlen,
|
||||
from_masterslave=True,
|
||||
check_frozen=check_frozen)
|
||||
value = values.get_cached_value(opt, path, validate,
|
||||
force_permissive,
|
||||
trusted_cached_properties,
|
||||
validate_properties,
|
||||
index=idx,
|
||||
# not self_properties,
|
||||
# depends to index
|
||||
#self_properties=self_properties,
|
||||
setting_properties=setting_properties,
|
||||
from_masterslave=True,
|
||||
check_frozen=check_frozen)
|
||||
if isinstance(value, Exception):
|
||||
if isinstance(value, PropertiesOptionError):
|
||||
err = value
|
||||
if index is None:
|
||||
multi.append_properties_error(value)
|
||||
multi.append(value)
|
||||
else:
|
||||
multi = value
|
||||
else:
|
||||
return value
|
||||
elif index is None:
|
||||
multi.append(value, setitem=False, force=True, validate=False,
|
||||
force_permissive=force_permissive)
|
||||
multi.append(value)
|
||||
else:
|
||||
multi = value
|
||||
return multi
|
||||
|
||||
def validate(self, values, opt, index, path, setitem):
|
||||
def validate(self,
|
||||
values,
|
||||
opt,
|
||||
index,
|
||||
path,
|
||||
setitem):
|
||||
if self.is_master(opt):
|
||||
#for regen slave path
|
||||
base_path = '.'.join(path.split('.')[:-1]) + '.'
|
||||
for slave in self.getslaves(opt):
|
||||
slave_path = base_path + slave.impl_getname()
|
||||
slavelen = values._p_.get_max_length(slave_path)
|
||||
self.validate_slave_length(index, slavelen, slave.impl_getname(), opt)
|
||||
self.validate_slave_length(index,
|
||||
slavelen,
|
||||
slave.impl_getname(),
|
||||
opt)
|
||||
else:
|
||||
val_len = self.get_length(values, opt, slave_path=path)
|
||||
val_len = self.get_length(values)
|
||||
if isinstance(val_len, Exception):
|
||||
return val_len
|
||||
self.validate_slave_length(val_len, index,
|
||||
opt.impl_getname(), opt, setitem=setitem)
|
||||
self.validate_slave_length(val_len,
|
||||
index,
|
||||
opt.impl_getname(),
|
||||
opt,
|
||||
setitem=setitem)
|
||||
|
||||
def get_length(self, values, opt, validate=True, slave_path=undefined,
|
||||
slave_value=undefined, force_permissive=False, master=None,
|
||||
masterp=None, setting_properties=undefined):
|
||||
def get_length(self,
|
||||
values,
|
||||
validate=True,
|
||||
force_permissive=False,
|
||||
master=None,
|
||||
masterp=None,
|
||||
setting_properties=undefined):
|
||||
"""get master len with slave option"""
|
||||
if master is None:
|
||||
master = self.getmaster(None)
|
||||
if masterp is None:
|
||||
masterp = master.impl_getpath(self._getcontext())
|
||||
if slave_value is undefined:
|
||||
slave_path = undefined
|
||||
value = self.getitem(values, master, masterp, validate,
|
||||
force_permissive, None, True, slave_path=slave_path,
|
||||
slave_value=slave_value, setting_properties=setting_properties)
|
||||
masterp = master.impl_getpath(values._getcontext())
|
||||
value = self.getitem(values,
|
||||
master,
|
||||
masterp,
|
||||
validate,
|
||||
force_permissive,
|
||||
None,
|
||||
True,
|
||||
setting_properties=setting_properties)
|
||||
if isinstance(value, Exception):
|
||||
return value
|
||||
return len(value)
|
||||
@ -843,10 +902,9 @@ class MasterSlaves(OptionDescription):
|
||||
master = self.getmaster(opt)
|
||||
masterp = master.impl_getpath(context)
|
||||
|
||||
mastervalue = values._get_cached_value(master, path=masterp,
|
||||
force_permissive=force_permissive,
|
||||
from_masterslave=True,
|
||||
setting_properties=setting_properties)
|
||||
mastervalue = values.get_cached_value(master, path=masterp,
|
||||
force_permissive=force_permissive,
|
||||
setting_properties=setting_properties)
|
||||
if isinstance(mastervalue, Exception):
|
||||
return mastervalue
|
||||
masterlen = len(mastervalue)
|
||||
@ -857,9 +915,15 @@ class MasterSlaves(OptionDescription):
|
||||
else:
|
||||
for slave in self.getslaves(master):
|
||||
slave_path = slave.impl_getpath(context)
|
||||
slavelen = values._p_.get_max_length(slave_path, None)
|
||||
slavelen = values._p_.get_max_length(slave_path)
|
||||
self.validate_slave_length(masterlen, slavelen, slave.impl_getname(), master)
|
||||
|
||||
def impl_validate_value(self, option, value, context):
|
||||
if option.impl_is_master_slaves('master') and isinstance(value, list):
|
||||
if len(value) < context._impl_length:
|
||||
return ValueError(_('cannot reduce length of master "{}"'
|
||||
'').format(option.impl_get_display_name()))
|
||||
|
||||
|
||||
def _impl_getpaths(klass, include_groups, _currpath):
|
||||
"""returns a list of all paths in klass, recursively
|
||||
|
Reference in New Issue
Block a user