callback must be a function and validator support same paramaters has callback
This commit is contained in:
parent
e883e5b89e
commit
1fd5f685de
|
@ -43,6 +43,8 @@ def carry_out_calculation(name, config, callback, callback_params):
|
||||||
for key, values in callback_params.items():
|
for key, values in callback_params.items():
|
||||||
for value in values:
|
for value in values:
|
||||||
if type(value) == tuple:
|
if type(value) == tuple:
|
||||||
|
if config is None:
|
||||||
|
raise ConfigError(_('no config specified but needed'))
|
||||||
path, check_disabled = value
|
path, check_disabled = value
|
||||||
try:
|
try:
|
||||||
opt_value = config._getattr(path, force_permissive=True)
|
opt_value = config._getattr(path, force_permissive=True)
|
||||||
|
@ -108,13 +110,4 @@ def carry_out_calculation(name, config, callback, callback_params):
|
||||||
|
|
||||||
|
|
||||||
def calculate(name, callback, params, tcparams):
|
def calculate(name, callback, params, tcparams):
|
||||||
try:
|
return callback(*params, **tcparams)
|
||||||
# XXX not only creole...
|
|
||||||
from creole import eosfunc
|
|
||||||
return getattr(eosfunc, callback)(*params, **tcparams)
|
|
||||||
except AttributeError, err:
|
|
||||||
import traceback
|
|
||||||
traceback.print_exc()
|
|
||||||
raise ConfigError("callback: {0} return error {1} for "
|
|
||||||
"option: {2}".format(callback, str(err),
|
|
||||||
name))
|
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
# or if not logical
|
# or if not logical
|
||||||
# or if validation failled
|
# or if validation failled
|
||||||
# or multi must be a list
|
# or multi must be a list
|
||||||
|
# or error in autolib
|
||||||
#TypeError if parameter has no good type
|
#TypeError if parameter has no good type
|
||||||
#AttributeError if no option or optiondescription in optiondescription (also when specified a path)
|
#AttributeError if no option or optiondescription in optiondescription (also when specified a path)
|
||||||
|
|
||||||
|
|
|
@ -21,13 +21,14 @@
|
||||||
# the whole pypy projet is under MIT licence
|
# the whole pypy projet is under MIT licence
|
||||||
# ____________________________________________________________
|
# ____________________________________________________________
|
||||||
import re
|
import re
|
||||||
from copy import copy
|
from copy import copy, deepcopy
|
||||||
from types import FunctionType
|
from types import FunctionType
|
||||||
from IPy import IP
|
from IPy import IP
|
||||||
|
|
||||||
from tiramisu.error import ConflictError
|
from tiramisu.error import ConflictError
|
||||||
from tiramisu.setting import groups, multitypes
|
from tiramisu.setting import groups, multitypes
|
||||||
from tiramisu.i18n import _
|
from tiramisu.i18n import _
|
||||||
|
from tiramisu.autolib import carry_out_calculation
|
||||||
|
|
||||||
name_regexp = re.compile(r'^\d+')
|
name_regexp = re.compile(r'^\d+')
|
||||||
forbidden_names = ['iter_all', 'iter_group', 'find', 'find_fisrt',
|
forbidden_names = ['iter_all', 'iter_group', 'find', 'find_fisrt',
|
||||||
|
@ -138,8 +139,8 @@ class Option(BaseInformation):
|
||||||
raise ValueError(_("params defined for a callback function but "
|
raise ValueError(_("params defined for a callback function but "
|
||||||
"no callback defined yet for option {0}").format(name))
|
"no callback defined yet for option {0}").format(name))
|
||||||
if callback is not None:
|
if callback is not None:
|
||||||
if not isinstance(callback, str):
|
if type(callback) != FunctionType:
|
||||||
raise ValueError('callback must be a string')
|
raise ValueError('callback must be a function')
|
||||||
if callback_params is not None and \
|
if callback_params is not None and \
|
||||||
not isinstance(callback_params, dict):
|
not isinstance(callback_params, dict):
|
||||||
raise ValueError('callback_params must be a dict')
|
raise ValueError('callback_params must be a dict')
|
||||||
|
@ -176,6 +177,22 @@ class Option(BaseInformation):
|
||||||
:param value: the option's value
|
:param value: the option's value
|
||||||
:param validate: if true enables ``self._validator`` validation
|
:param validate: if true enables ``self._validator`` validation
|
||||||
"""
|
"""
|
||||||
|
def _val_validator(val):
|
||||||
|
callback_params = deepcopy(self._validator[1])
|
||||||
|
callback_params.setdefault('', []).insert(0, val)
|
||||||
|
return carry_out_calculation(self._name, config=context,
|
||||||
|
callback=self._validator[0],
|
||||||
|
callback_params=callback_params)
|
||||||
|
|
||||||
|
def val_validator():
|
||||||
|
#add current value has first argument
|
||||||
|
if self.optimpl_is_multi():
|
||||||
|
for val in value:
|
||||||
|
if not _val_validator(val):
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
return _val_validator(val)
|
||||||
|
return True
|
||||||
# generic calculation
|
# generic calculation
|
||||||
if context is not None:
|
if context is not None:
|
||||||
cons = context.cfgimpl_get_description()
|
cons = context.cfgimpl_get_description()
|
||||||
|
@ -203,11 +220,14 @@ class Option(BaseInformation):
|
||||||
if val is not None:
|
if val is not None:
|
||||||
# customizing the validator
|
# customizing the validator
|
||||||
if validate and self._validator is not None and \
|
if validate and self._validator is not None and \
|
||||||
not self._validator[0](val, **self._validator[1]):
|
not val_validator():
|
||||||
return False
|
return False
|
||||||
if not self._validate(val):
|
if not self._validate(val):
|
||||||
return False
|
return False
|
||||||
if cons is not None and not cons._valid_consistency(self, val, context, index):
|
if cons is not None and not cons._valid_consistency(self,
|
||||||
|
val,
|
||||||
|
context,
|
||||||
|
index):
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
@ -308,6 +328,12 @@ class ChoiceOption(Option):
|
||||||
validator_args=validator_args,
|
validator_args=validator_args,
|
||||||
properties=properties)
|
properties=properties)
|
||||||
|
|
||||||
|
def optimpl_get_values(self):
|
||||||
|
return self._values
|
||||||
|
|
||||||
|
def optimpl_is_openvalues(self):
|
||||||
|
return self._open_values
|
||||||
|
|
||||||
def _validate(self, value):
|
def _validate(self, value):
|
||||||
if not self._open_values:
|
if not self._open_values:
|
||||||
return value is None or value in self._values
|
return value is None or value in self._values
|
||||||
|
|
Loading…
Reference in New Issue