From 1cda79154e216d57db9023b3694adbd1984de4a1 Mon Sep 17 00:00:00 2001 From: Emmanuel Garette Date: Mon, 29 Oct 2018 21:01:01 +0100 Subject: [PATCH] can remove prefix in ValueOptionError --- test/auto/test_auto.py | 12 ++++++------ test/test_option_setting.py | 12 ++++++++++++ tiramisu/api.py | 27 ++++++++++++++++++++++----- tiramisu/error.py | 24 ++++++++++++++++++++++++ tiramisu/option/option.py | 14 +++++--------- 5 files changed, 69 insertions(+), 20 deletions(-) diff --git a/test/auto/test_auto.py b/test/auto/test_auto.py index ebe8bd4..7b485f9 100644 --- a/test/auto/test_auto.py +++ b/test/auto/test_auto.py @@ -1743,15 +1743,15 @@ def test_options(paths): pass # for meta in (True,): # for callback in (False,): -# for consistency in (False,): -# for require in (False,): -# for default_multi in (False,): +# for consistency in (True,): +# for require in (True,): +# for default_multi in (True,): # for symlink in (False,): # if callback and default_multi: # continue -# for default in (False,): -# for multi in (False,): -# print(meta, callback, consistency, require, default_multi, symlink, default, multi) +# for default in (True,): +# for multi in (submulti,): + meta, callback, consistency, require, default_multi, symlink, default, multi = (True, False, True, False, True, True, True, True) if multi is submulti and default: continue if multi is submulti and consistency: diff --git a/test/test_option_setting.py b/test/test_option_setting.py index 5a812c6..3118f92 100644 --- a/test/test_option_setting.py +++ b/test/test_option_setting.py @@ -84,6 +84,18 @@ def test_reset_with_multi(): raises(ValueError, "api.option('string').value.set(None)") +def test_property_only_raises(): + s = StrOption("string", "", default=["string"], default_multi="string", multi=True) + intoption = IntOption('int', 'Test int option', default=0) + stroption = StrOption('str', 'Test string option', default=["abc"], default_multi="abc", + requires=[{'option': intoption, 'expected': 1, 'action': 'hidden'}], multi=True) + descr = OptionDescription("options", "", [s, intoption, stroption]) + api = Config(descr) + api.property.read_write() + assert api.option('str').property.get() == {'empty'} + assert api.option('str').property.get(only_raises=True) == set() + + def test_default_with_multi(): "default with multi is a list" s = StrOption("string", "", default=[], default_multi="string", multi=True) diff --git a/tiramisu/api.py b/tiramisu/api.py index 9a6a615..c1ac7a0 100644 --- a/tiramisu/api.py +++ b/tiramisu/api.py @@ -297,7 +297,9 @@ class TiramisuOptionProperty(CommonTiramisuOption): if option_bag and option_bag.config_bag: self._settings = option_bag.config_bag.context.cfgimpl_get_settings() - def get(self, apply_requires=True): + def get(self, + apply_requires=True, + only_raises=False): """Get properties for an option""" option = self._option_bag.option if apply_requires: @@ -305,8 +307,12 @@ class TiramisuOptionProperty(CommonTiramisuOption): properties = self._option_bag.properties else: properties = self._settings.getproperties(self._option_bag, - apply_requires=False) - return set(properties) + apply_requires=False) + if not only_raises: + return properties + return self._settings.calc_raises_properties(properties, + self._option_bag.config_bag.properties, + self._option_bag.config_bag.permissives) def add(self, prop): """Add new property for an option""" @@ -335,7 +341,7 @@ class TiramisuOptionProperty(CommonTiramisuOption): """Reset all personalised properties""" option = self._option_bag.option self._settings.reset(self._option_bag, - self._option_bag.config_bag.context) + self._option_bag.config_bag.context) class TiramisuOptionPermissive(CommonTiramisuOption): @@ -1066,6 +1072,17 @@ class _TiramisuContextConfigReset(): # Remove cache self._config_bag.context.cfgimpl_reset_cache(None, None) + def __call__(self, + path: Optional[str]): + """select a child Tiramisu config""" + if path is None: + return Config(self._config_bag) + spaths = path.split('.') + config = self._config_bag.context + for spath in spaths: + config = config.getconfig(spath) + return Config(config) + class _TiramisuContextConfig(TiramisuContext, _TiramisuContextConfigReset): """Actions to Config""" @@ -1166,7 +1183,7 @@ class TiramisuAPI(TiramisuHelp): return TiramisuAPI(config_bag) elif subfunc == 'unrestraint': config_bag = self._config_bag.copy() - config_bag.properties = frozenset() + config_bag.properties = frozenset(['cache']) return TiramisuAPI(config_bag) elif subfunc == 'config': config_type = self._config_bag.context.impl_type diff --git a/tiramisu/error.py b/tiramisu/error.py index 7292d1a..8d71bce 100644 --- a/tiramisu/error.py +++ b/tiramisu/error.py @@ -185,5 +185,29 @@ class ValueWarning(UserWarning): super(ValueWarning, self).__init__(msg) +class ValueOptionError(ValueError): + def __init__(self, + val, + display_type, + display_name, + err_msg): + self.prefix = _('"{0}" is an invalid {1} for "{2}"' + '').format(val, + display_type, + display_name) + self.err_msg = err_msg + + def __str__(self): + msg = self.prefix + if self.err_msg: + if msg: + msg += ', {}'.format(self.err_msg) + else: + msg = self.err_msg + if not msg: + msg = _('invalid value') + return msg + + class APIError(Exception): pass diff --git a/tiramisu/option/option.py b/tiramisu/option/option.py index 5a1c1ea..11305f2 100644 --- a/tiramisu/option/option.py +++ b/tiramisu/option/option.py @@ -28,7 +28,7 @@ from ..i18n import _ from ..setting import log, undefined, OptionBag from ..autolib import carry_out_calculation from ..error import (ConfigError, ValueWarning, PropertiesOptionError, - display_list) + ValueOptionError, display_list) from ..function import Params, ParamValue ALLOWED_CONST_LIST = ['_cons_not_equal'] @@ -350,14 +350,10 @@ class Option(OnlyOption): check_error, is_warnings_only) except ValueError as err: - msg = _('"{0}" is an invalid {1} for "{2}"' - '').format(val, - self._display_name, - option_bag.ori_option.impl_get_display_name()) - err_msg = '{0}'.format(err) - if err_msg: - msg += ', {}'.format(err_msg) - raise ValueError(msg) + raise ValueOptionError(val, + self._display_name, + option_bag.ori_option.impl_get_display_name(), + '{0}'.format(err)) def _validate_calculator(self, callback,