From 2018a92b66de2a8d6dcdd1618a2cad7479f74ca9 Mon Sep 17 00:00:00 2001 From: Emmanuel Garette Date: Sun, 22 Apr 2018 10:43:19 +0200 Subject: [PATCH] improvement --- tiramisu/api.py | 7 ++----- tiramisu/function.py | 2 ++ tiramisu/option/baseoption.py | 7 ++----- tiramisu/option/intoption.py | 20 ++++++++++++++++++++ tiramisu/option/option.py | 10 ++++++---- tiramisu/setting.py | 6 ++++++ 6 files changed, 38 insertions(+), 14 deletions(-) diff --git a/tiramisu/api.py b/tiramisu/api.py index 1a2c1e8..bc4c0ac 100644 --- a/tiramisu/api.py +++ b/tiramisu/api.py @@ -803,7 +803,7 @@ class TiramisuContextProperty(TiramisuContext): """set configuration to read only mode""" settings = self.config_bag.config.cfgimpl_get_settings() settings.read_only() - self.config_bag.setting_properties = settings.get_context_properties() + self.config_bag.delete('setting_properties') @count def read_write(self): @@ -812,7 +812,7 @@ class TiramisuContextProperty(TiramisuContext): settings.read_write() # #FIXME ? settings.set_context_permissive(frozenset(['hidden'])) - self.config_bag.setting_properties = settings.get_context_properties() + self.config_bag.delete('setting_properties') #/FIXME ? @count @@ -821,7 +821,6 @@ class TiramisuContextProperty(TiramisuContext): props = self.get() props.add(prop) self.set(frozenset(props)) - self.config_bag.setting_properties = self.config_bag.config.cfgimpl_get_settings().get_context_properties() @count def pop(self, prop): @@ -830,7 +829,6 @@ class TiramisuContextProperty(TiramisuContext): if prop in props: props.remove(prop) self.set(frozenset(props)) - self.config_bag.setting_properties = self.config_bag.config.cfgimpl_get_settings().get_context_properties() @count def get(self): @@ -841,7 +839,6 @@ class TiramisuContextProperty(TiramisuContext): def set(self, props): """personalise configuration properties""" self.config_bag.config.cfgimpl_get_settings().set_context_properties(props) - self.config_bag.setting_properties = self.config_bag.config.cfgimpl_get_settings().get_context_properties() @count def reset(self): diff --git a/tiramisu/function.py b/tiramisu/function.py index 8630eb4..9ee350d 100644 --- a/tiramisu/function.py +++ b/tiramisu/function.py @@ -46,6 +46,8 @@ class Param: class ParamOption(Param): __slots__ = ('option', 'notraisepropertyerror') def __init__(self, option, notraisepropertyerror=False): + if not hasattr(option, 'impl_is_symlinkoption'): + raise ValueError(_('paramoption needs an option not {}').format(type(option))) if option.impl_is_symlinkoption(): cur_opt = option.impl_getopt() else: diff --git a/tiramisu/option/baseoption.py b/tiramisu/option/baseoption.py index 1cb49f8..6c1c3f0 100644 --- a/tiramisu/option/baseoption.py +++ b/tiramisu/option/baseoption.py @@ -469,8 +469,7 @@ def validate_requires_arg(new_option, """ def get_option(require): option = require['option'] - #FIXME etrange ... - if not hasattr(option, 'impl_is_symlinkoption'): + if not isinstance(option, BaseOption): raise ValueError(_('malformed requirements ' 'must be an option in option {0}').format(name)) if not multi and option.impl_is_multi(): @@ -509,8 +508,7 @@ def validate_requires_arg(new_option, if set(exp.keys()) != {'option', 'value'}: raise ValueError(_('malformed requirements expected must have ' 'option and value for option {0}').format(name)) - option = exp['option'] - option._add_dependency(new_option) + option = get_option(exp) if option is not None: try: option._validate(exp['value'], undefined) @@ -534,7 +532,6 @@ def validate_requires_arg(new_option, raise ValueError(_('malformed requirements expected value ' 'must be valid for option {0}' ': {1}').format(name, err)) - option._add_dependency(new_option) _set_expected(action, inverse, transitive, diff --git a/tiramisu/option/intoption.py b/tiramisu/option/intoption.py index 4299b38..b895502 100644 --- a/tiramisu/option/intoption.py +++ b/tiramisu/option/intoption.py @@ -29,9 +29,29 @@ class IntOption(Option): __slots__ = tuple() _display_name = _('integer') + def __init__(self, + name, + *args, + min_number=None, + max_number=None, + **kwargs): + extra = {} + if min_number is not None: + extra['min_number'] = min_number + if max_number is not None: + extra['max_number'] = min_number + super().__init__(name, extra=extra, *args, **kwargs) + + def _validate(self, value, *args, **kwargs): if not isinstance(value, int): raise ValueError() + min_number = self._get_extra('min_number') + if min_number and value < min_number: + raise ValueError(_('value must be greater than "{0}"'.format(min_number))) + max_number = self._get_extra('max_number') + if max_number and value > max_number: + raise ValueError(_('value must be less than "{0}"'.format(max_number))) diff --git a/tiramisu/option/option.py b/tiramisu/option/option.py index e79048f..43633fd 100644 --- a/tiramisu/option/option.py +++ b/tiramisu/option/option.py @@ -112,7 +112,7 @@ class Option(OnlyOption): else: val_call = (validator, validator_params) self._val_call = (val_call, None) - if extra is not None: + if extra is not None and extra != {}: _setattr(self, '_extra', extra) if unique != undefined and not isinstance(unique, bool): raise ValueError(_('unique must be a boolean, not "{}"').format(unique)) @@ -723,11 +723,13 @@ class Option(OnlyOption): def _get_extra(self, key): - extra = self._extra + extra = getattr(self, '_extra', {}) if isinstance(extra, tuple): - return extra[1][extra[0].index(key)] + if key in extra[0]: + return extra[1][extra[0].index(key)] + return None else: - return extra[key] + return extra.get(key) def impl_is_submulti(self): return getattr(self, '_multi', 1) == 2 diff --git a/tiramisu/setting.py b/tiramisu/setting.py index 7b73cd9..e8ab1e4 100644 --- a/tiramisu/setting.py +++ b/tiramisu/setting.py @@ -154,6 +154,12 @@ class ConfigBag(object): return self.setting_properties return self.default.get(key) + def delete(self, key): + try: + return self.__delattr__(key) + except AttributeError: + pass + def copy(self, filters='all'): kwargs = {} for key in self.__slots__: