consistencies now a list

This commit is contained in:
Emmanuel Garette 2013-04-14 10:14:06 +02:00
parent 9644dd3661
commit fbcbbfbd2b

View file

@ -79,7 +79,7 @@ class Option(BaseInformation):
""" """
__slots__ = ('_name', '_requires', '_multi', '_validator', '_default_multi', __slots__ = ('_name', '_requires', '_multi', '_validator', '_default_multi',
'_default', '_properties', '_callback', '_multitype', '_default', '_properties', '_callback', '_multitype',
'_master_slaves', '_consistency') '_master_slaves', '_consistencies')
def __init__(self, name, doc, default=None, default_multi=None, def __init__(self, name, doc, default=None, default_multi=None,
requires=None, multi=False, callback=None, requires=None, multi=False, callback=None,
@ -111,7 +111,7 @@ class Option(BaseInformation):
validate_requires_arg(requires, self._name) validate_requires_arg(requires, self._name)
self._requires = requires self._requires = requires
self._multi = multi self._multi = multi
self._consistency = None self._consistencies = None
if validator is not None: if validator is not None:
if type(validator) != FunctionType: if type(validator) != FunctionType:
raise TypeError(_("validator must be a function")) raise TypeError(_("validator must be a function"))
@ -254,11 +254,22 @@ class Option(BaseInformation):
if opt_ is not opt: if opt_ is not opt:
path = descr.get_path_by_opt(opt_) path = descr.get_path_by_opt(opt_)
val = context._getattr(path, validate=False) val = context._getattr(path, validate=False)
if val in values: if val is not None:
return False if val in values:
values.append(val) return False
values.append(val)
return True return True
def add_consistency(self, func, opts):
pass
if self._consistencies is None:
self._consistencies = []
if self not in opts:
opts = list(opts)
opts.append(self)
opts = tuple(opts)
self._consistencies.append(('cons_{}'.format(func), opts))
class ChoiceOption(Option): class ChoiceOption(Option):
__slots__ = ('_values', '_open_values', 'opt_type') __slots__ = ('_values', '_open_values', 'opt_type')
@ -333,9 +344,9 @@ class UnicodeOption(Option):
class SymLinkOption(object): class SymLinkOption(object):
__slots__ = ('_name', 'opt', '_consistency') __slots__ = ('_name', 'opt', '_consistencies')
opt_type = 'symlink' opt_type = 'symlink'
_consistency = None _consistencies = None
def __init__(self, name, path, opt): def __init__(self, name, path, opt):
self._name = name self._name = name
@ -408,9 +419,9 @@ class NetmaskOption(Option):
if opt_ip is None: if opt_ip is None:
pass pass
elif isinstance(opt_ip, IPOption): elif isinstance(opt_ip, IPOption):
self._consistency = ('cons_ip_netmask', (self, opt_ip)) self._consistencies = [('cons_ip_netmask', (self, opt_ip))]
elif isinstance(opt_ip, NetworkOption): elif isinstance(opt_ip, NetworkOption):
self._consistency = ('cons_network_netmask', (self, opt_ip)) self._consistencies = [('cons_network_netmask', (self, opt_ip))]
else: else:
raise ValueError(_('unknown type for opt_ip')) raise ValueError(_('unknown type for opt_ip'))
@ -547,12 +558,13 @@ class OptionDescription(BaseInformation):
cache_option.append(option) cache_option.append(option)
cache_path.append(str('.'.join(_currpath + [attr]))) cache_path.append(str('.'.join(_currpath + [attr])))
if not isinstance(option, OptionDescription): if not isinstance(option, OptionDescription):
if option._consistency is not None: if option._consistencies is not None:
func, opts = option._consistency for consistency in option._consistencies:
for opt in opts: func, opts = consistency
if opt in _consistencies: for opt in opts:
raise ValueError(_('opt {} already in consistency').format(opt._name)) if opt in _consistencies:
_consistencies[opt] = (func, opts) raise ValueError(_('opt {} already in consistency').format(opt._name))
_consistencies.setdefault(opt, []).append((func, opts))
else: else:
_currpath.append(attr) _currpath.append(attr)
option.build_cache(cache_path, cache_option, _currpath, _consistencies) option.build_cache(cache_path, cache_option, _currpath, _consistencies)
@ -632,10 +644,13 @@ class OptionDescription(BaseInformation):
return self._group_type return self._group_type
def valid_consistency(self, opt, value, context, index): def valid_consistency(self, opt, value, context, index):
cons = self._consistencies.get(opt) consistencies = self._consistencies.get(opt)
if cons is not None: if consistencies is not None:
func, opts = cons for consistency in consistencies:
return getattr(opts[0], func)(opt, value, context, index, opts) func, opts = consistency
ret = getattr(opts[0], func)(opt, value, context, index, opts)
if ret is False:
return False
return True return True