validator's function can have 1 arg, 2 args or 3 args

This commit is contained in:
2017-01-16 09:25:56 +01:00
parent 89fd367b20
commit 9920f001ea
3 changed files with 192 additions and 16 deletions

View File

@ -140,16 +140,8 @@ class Base(StorageBase):
type(properties),
name))
if validator is not None:
if validator_params is None:
func_args = getargspec(validator)
defaults = func_args.defaults
if defaults is None:
defaults = []
args = func_args.args[0:len(func_args.args)-len(defaults)]
if len(args) == 2:
validator_params = {'': ((self, False),)}
elif len(args) == 3:
validator_params = {'': ((self, False), ('index',))}
if multi: # and validator_params is None:
validator_params = self._build_validator_params(validator, validator_params)
validate_callback(validator, validator_params, 'validator')
self._set_validator(validator, validator_params)
@ -176,6 +168,33 @@ class Base(StorageBase):
self.impl_set_callback(callback, callback_params, _init=True)
self.commit(session)
def _build_validator_params(self, validator, validator_params):
func_args = getargspec(validator)
defaults = func_args.defaults
if defaults is None:
defaults = []
args = func_args.args[0:len(func_args.args)-len(defaults)]
if validator_params is not None:
len_args = len(validator_params.get('', []))
if len_args != 0 and len(args) <= len_args:
args = args[0:len(args)-len_args]
if len(args) >= 2:
if validator_params is not None and args[1] in validator_params:
args = []
elif validator_params is not None and '' in validator_params:
params = list(validator_params[''])
params.append((self, False))
validator_params[''] = tuple(params)
else:
if validator_params is None:
validator_params = {}
validator_params[''] = ((self, False),)
if len(args) == 3 and args[2] not in validator_params:
params = list(validator_params[''])
params.append(('index',))
validator_params[''] = tuple(params)
return validator_params
def _set_has_dependency(self):
if not isinstance(self, SymLinkOption):
self._has_dependency = True
@ -545,7 +564,7 @@ class Option(OnlyOption):
value = carry_out_calculation(current_opt, context=context,
callback=validator,
callback_params=validator_params_,
value_index=_index)
index=_index)
if isinstance(value, Exception):
return value