diff --git a/test/test_requires.py b/test/test_requires.py index 23b310a..2c19fa6 100644 --- a/test/test_requires.py +++ b/test/test_requires.py @@ -494,6 +494,30 @@ def test_requires_multi_disabled_new_format(): assert props == ['disabled'] +def test_requires_unknown_operator(): + a = BoolOption('activate_service', '') + b = IntOption('num_service', '') + raises(ValueError, """IPOption('ip_address_service', '', + requires=[{'expected': [{'option': a, 'value': True}, {'option': b, 'value': 1}], + 'action': 'disabled', 'operator': 'unknown'}])""") + + +def test_requires_keys(): + a = BoolOption('activate_service', '') + b = IntOption('num_service', '') + raises(ValueError, """IPOption('ip_address_service', '', + requires=[{'expected': [{'option': a, 'value2': True}, {'option': b, 'value': 1}], + 'action': 'disabled', 'operator': 'and'}])""") + + +def test_requires_unvalid(): + a = BoolOption('activate_service', '') + b = IntOption('num_service', '') + raises(ValueError, """IPOption('ip_address_service', '', + requires=[{'expected': [{'option': a, 'value': 'unvalid'}, {'option': b, 'value': 1}], + 'action': 'disabled', 'operator': 'and'}])""") + + def test_requires_multi_disabled_new_format_and(): a = BoolOption('activate_service', '') b = IntOption('num_service', '') diff --git a/test/test_storage.py b/test/test_storage.py index 8e0771f..7c0c7af 100644 --- a/test/test_storage.py +++ b/test/test_storage.py @@ -2,8 +2,9 @@ from .autopath import do_autopath do_autopath() -#from py.test import raises +from py.test import raises +from tiramisu.error import ConfigError from tiramisu.config import Config from tiramisu.option import BoolOption, OptionDescription from tiramisu.setting import groups, owners @@ -37,6 +38,15 @@ def test_create_persistent(): pass +def test_create_delete_not_persistent(): + b = BoolOption('b', '') + o = OptionDescription('od', '', [b]) + try: + Config(o, session_id='test_persistent', persistent=True) + except ValueError: + raises(ConfigError, "delete_session('option', 'test_persistent')") + + def test_list_sessions_persistent(): b = BoolOption('b', '') o = OptionDescription('od', '', [b]) diff --git a/tiramisu/config.py b/tiramisu/config.py index a53f34a..4252d87 100644 --- a/tiramisu/config.py +++ b/tiramisu/config.py @@ -29,8 +29,7 @@ from .option import OptionDescription, Option, SymLinkOption, \ DynSymLinkOption, SynDynOptionDescription from .option.baseoption import valid_name from .setting import groups, Settings, default_encoding, undefined -from .storage import get_storages, get_storage, set_storage, \ - get_default_values_storages +from .storage import get_storages, set_storage, get_default_values_storages from .value import Values, Multi from .i18n import _ diff --git a/tiramisu/option/baseoption.py b/tiramisu/option/baseoption.py index 0976fb1..61600bf 100644 --- a/tiramisu/option/baseoption.py +++ b/tiramisu/option/baseoption.py @@ -23,7 +23,7 @@ from types import FunctionType import warnings import sys -if sys.version_info[0] >= 3: +if sys.version_info[0] >= 3: # pragma: no cover from inspect import signature else: from inspect import getargspec @@ -190,7 +190,7 @@ class Base(StorageBase): if defaults is None: defaults = [] args = func_args.args[0:len(func_args.args)-len(defaults)] - else: + else: # pragma: no cover func_params = signature(validator).parameters args = [f.name for f in func_params.values() if f.default is f.empty] if validator_params is not None: @@ -273,14 +273,9 @@ class BaseOption(Base): is_readonly = False # never change _name dans _opt if name == '_name': - try: - if self.impl_getname() is not None: - #so _name is already set - is_readonly = True - except (KeyError, AttributeError): - pass - elif name == '_opt': - pass + if self.impl_getname() is not None: + #so _name is already set + is_readonly = True elif name != '_readonly': is_readonly = self.impl_is_readonly() if is_readonly: @@ -635,10 +630,6 @@ class Option(OnlyOption): def impl_get_master_slaves(self): masterslaves = self._get_master_slave() - if masterslaves is None: - return None - if not isinstance(masterslaves, MasterSlaves): - return MasterSlaves(masterslaves) return masterslaves def impl_getdoc(self): @@ -906,8 +897,8 @@ def validate_requires_arg(new_option, multi, requires, name): def get_operator(require): operator = require.get('operator', 'or') if operator not in ['and', 'or']: - raise ValueError(_('malformed requirements for option: {0}' - ' operator must be "or" or "and"')) + raise ValueError(_('malformed requirements for option: "{0}"' + ' operator must be "or" or "and"').format(operator)) return operator @@ -968,11 +959,7 @@ class SymLinkOption(OnlyOption): self.commit(session) def __getattr__(self, name, context=undefined): - if name in ('_opt', '_readonly', 'impl_getpath', '_name', - '_impl_setopt'): - return object.__getattr__(self, name) - else: - return getattr(self._impl_getopt(), name) + return getattr(self._impl_getopt(), name) def impl_get_information(self, key, default=undefined): return self._impl_getopt().impl_get_information(key, default) @@ -1012,10 +999,7 @@ class DynSymLinkOption(object): self._opt = opt def __getattr__(self, name, context=undefined): - if name in ('_opt', '_readonly', 'impl_getpath', '_name'): - return object.__getattr__(self, name) - else: - return getattr(self._impl_getopt(), name) + return getattr(self._impl_getopt(), name) def impl_getname(self): return self._name diff --git a/tiramisu/setting.py b/tiramisu/setting.py index 676abbc..a3289c0 100644 --- a/tiramisu/setting.py +++ b/tiramisu/setting.py @@ -760,7 +760,7 @@ class Settings(object): else: if operator == 'and': calc_properties.add(action) - continue + continue # pragma: no cover if breaked: break return calc_properties diff --git a/tiramisu/storage/__init__.py b/tiramisu/storage/__init__.py index d9e172c..2652f5a 100644 --- a/tiramisu/storage/__init__.py +++ b/tiramisu/storage/__init__.py @@ -83,6 +83,18 @@ default_validation = StorageType() default_validation.set(DEFAULT_STORAGE) +def set_storage(type_, name): # pragma: optional cover + """Change storage's configuration + + :params name: is the storage name. If storage is already set, cannot + reset storage name + + Other attributes are differents according to the selected storage's name + """ + storage_type.set(name) + setting = storage_type.get().setting + + def get_storages(context, session_id, persistent): def gen_id(config): return 'c' + str(id(config)) + str(int(time())) + str(randint(0, 500)) @@ -135,11 +147,11 @@ def delete_session(type_, session_id): # pragma: optional cover use by an other instance :params session_id: id of session to delete """ + storage_module = storage_type.get() + session = storage_module.storage.getsession() if type_ == 'option': - storage_option_type.get().delete_session(session_id) + storage_option_type.get().delete_session(session_id, session) else: - storage_module = storage_type.get() - session = storage_module.storage.getsession() storage_module.value.delete_session(session_id, session) storage_module.storage.delete_session(session_id, session) if session: