add validator tests
This commit is contained in:
@ -197,13 +197,16 @@ class Base(object):
|
||||
kwargs = set()
|
||||
if add_value:
|
||||
args.add('value')
|
||||
for param in calculator_params.keys():
|
||||
if param == '':
|
||||
for idx, _ in enumerate(calculator_params['']):
|
||||
# construct an appropriate name
|
||||
args.add('param{}'.format(idx))
|
||||
else:
|
||||
kwargs.add(param)
|
||||
if self.impl_is_dynoptiondescription():
|
||||
kwargs.add('suffix')
|
||||
if calculator_params is not None:
|
||||
for param in calculator_params.keys():
|
||||
if param == '':
|
||||
for idx, _ in enumerate(calculator_params['']):
|
||||
# construct an appropriate name
|
||||
args.add('param{}'.format(idx))
|
||||
else:
|
||||
kwargs.add(param)
|
||||
return args, kwargs
|
||||
|
||||
def _build_calculator_params(self,
|
||||
@ -211,65 +214,70 @@ class Base(object):
|
||||
calculator_params,
|
||||
add_value=False):
|
||||
|
||||
if calculator_params is not None:
|
||||
func_args, func_kwargs, func_positional, func_keyword = self._get_function_args(calculator)
|
||||
calculator_args, calculator_kwargs = self._get_parameters_args(calculator_params, add_value)
|
||||
# remove knowned kwargs
|
||||
common_kwargs = func_kwargs & calculator_kwargs
|
||||
func_kwargs -= common_kwargs
|
||||
calculator_kwargs -= common_kwargs
|
||||
# remove knowned calculator's kwargs in func's args
|
||||
common = func_args & calculator_kwargs
|
||||
func_args -= common
|
||||
calculator_kwargs -= common
|
||||
# remove unknown calculator's args in func's args
|
||||
for idx in range(min(len(calculator_args), len(func_args))):
|
||||
func_args.pop()
|
||||
calculator_args.pop()
|
||||
# remove unknown calculator's args in func's kwargs
|
||||
is_multi = self.impl_is_optiondescription() or self.impl_is_multi()
|
||||
if calculator_params is None:
|
||||
calculator_params = {}
|
||||
func_args, func_kwargs, func_positional, func_keyword = self._get_function_args(calculator)
|
||||
calculator_args, calculator_kwargs = self._get_parameters_args(calculator_params, add_value)
|
||||
# remove knowned kwargs
|
||||
common_kwargs = func_kwargs & calculator_kwargs
|
||||
func_kwargs -= common_kwargs
|
||||
calculator_kwargs -= common_kwargs
|
||||
# remove knowned calculator's kwargs in func's args
|
||||
common = func_args & calculator_kwargs
|
||||
func_args -= common
|
||||
calculator_kwargs -= common
|
||||
# remove unknown calculator's args in func's args
|
||||
for idx in range(min(len(calculator_args), len(func_args))):
|
||||
func_args.pop()
|
||||
calculator_args.pop()
|
||||
# remove unknown calculator's args in func's kwargs
|
||||
if is_multi:
|
||||
func_kwargs_left = func_kwargs - {'index', 'self'}
|
||||
func_kwargs_pop = set()
|
||||
for idx in range(min(len(calculator_args), len(func_kwargs_left))):
|
||||
func_kwargs_pop.add(func_kwargs_left.pop())
|
||||
calculator_args.pop()
|
||||
func_kwargs -= func_kwargs_pop
|
||||
if func_positional:
|
||||
calculator_args = set()
|
||||
if func_keyword:
|
||||
calculator_kwargs = set()
|
||||
if calculator_args or calculator_kwargs:
|
||||
# there is more args/kwargs than expected!
|
||||
raise ConfigError(_('cannot find those arguments "{}" in function "{}" for "{}"'
|
||||
'').format(list(calculator_args | calculator_kwargs),
|
||||
else:
|
||||
func_kwargs_left = func_kwargs
|
||||
func_kwargs_pop = set()
|
||||
for idx in range(min(len(calculator_args), len(func_kwargs_left))):
|
||||
func_kwargs_pop.add(func_kwargs_left.pop())
|
||||
calculator_args.pop()
|
||||
func_kwargs -= func_kwargs_pop
|
||||
if func_positional:
|
||||
calculator_args = set()
|
||||
if func_keyword:
|
||||
calculator_kwargs = set()
|
||||
if calculator_args or calculator_kwargs:
|
||||
# there is more args/kwargs than expected!
|
||||
raise ConfigError(_('cannot find those arguments "{}" in function "{}" for "{}"'
|
||||
'').format(list(calculator_args | calculator_kwargs),
|
||||
calculator.__name__,
|
||||
self.impl_get_display_name()))
|
||||
has_self = False
|
||||
has_index = False
|
||||
if is_multi and func_args:
|
||||
# there is extra args/kwargs
|
||||
if not self.impl_is_optiondescription() and is_multi:
|
||||
params = list(calculator_params.get('', tuple()))
|
||||
if add_value:
|
||||
# only for validator
|
||||
has_self = True
|
||||
params.append((self, False))
|
||||
func_args.pop()
|
||||
if func_args:
|
||||
has_index = True
|
||||
params.append(('index',))
|
||||
func_args.pop()
|
||||
if func_args:
|
||||
raise ConfigError(_('missing those arguements "{}" in function "{}" for "{}"'
|
||||
'').format(list(func_args),
|
||||
calculator.__name__,
|
||||
self.impl_get_display_name()))
|
||||
has_self = False
|
||||
has_index = False
|
||||
if func_args:
|
||||
# there is extra args/kwargs
|
||||
if not self.impl_is_optiondescription() and self.impl_is_multi():
|
||||
params = list(calculator_params[''])
|
||||
if add_value:
|
||||
# only for validator
|
||||
has_self = True
|
||||
params.append((self, False))
|
||||
func_args.pop()
|
||||
if func_args:
|
||||
has_index = True
|
||||
params.append(('index',))
|
||||
func_args.pop()
|
||||
if func_args:
|
||||
raise ConfigError(_('missing those arguements "{}" in function "{}" for "{}"'
|
||||
'').format(list(func_args),
|
||||
calculator.__name__,
|
||||
self.impl_get_display_name()))
|
||||
calculator_params[''] = tuple(params)
|
||||
if not self.impl_is_optiondescription() and self.impl_is_multi():
|
||||
if add_value and not has_self and 'self' in func_kwargs:
|
||||
# only for validator
|
||||
calculator_params['self'] = (self, False)
|
||||
if not has_index and 'index' in func_kwargs:
|
||||
calculator_params['index'] = (('index',),)
|
||||
calculator_params[''] = tuple(params)
|
||||
if not self.impl_is_optiondescription() and self.impl_is_multi():
|
||||
if add_value and not has_self and 'self' in func_kwargs:
|
||||
# only for validator
|
||||
calculator_params['self'] = (self, False)
|
||||
if not has_index and 'index' in func_kwargs:
|
||||
calculator_params['index'] = (('index',),)
|
||||
return calculator_params
|
||||
|
||||
def impl_has_dependency(self,
|
||||
|
@ -97,6 +97,11 @@ class Option(OnlyOption):
|
||||
_setattr(self, '_multi', _multi)
|
||||
if multi is not False and default is None:
|
||||
default = []
|
||||
super(Option, self).__init__(name,
|
||||
doc,
|
||||
requires=requires,
|
||||
properties=properties,
|
||||
is_multi=is_multi)
|
||||
if validator is not None:
|
||||
validate_calculator(validator,
|
||||
validator_params,
|
||||
@ -120,12 +125,6 @@ class Option(OnlyOption):
|
||||
_setattr(self, '_warnings_only', warnings_only)
|
||||
if allow_empty_list is not undefined:
|
||||
_setattr(self, '_allow_empty_list', allow_empty_list)
|
||||
|
||||
super(Option, self).__init__(name,
|
||||
doc,
|
||||
requires=requires,
|
||||
properties=properties,
|
||||
is_multi=is_multi)
|
||||
if is_multi and default_multi is not None:
|
||||
def test_multi_value(value):
|
||||
try:
|
||||
@ -241,6 +240,7 @@ class Option(OnlyOption):
|
||||
callback=validator,
|
||||
callback_params=validator_params_,
|
||||
index=_index,
|
||||
orig_value=value,
|
||||
config_bag=config_bag,
|
||||
is_validator=True)
|
||||
|
||||
|
Reference in New Issue
Block a user