feat: mandatory for a variable and replace suffix to identifier

This commit is contained in:
egarette@silique.fr 2024-10-22 10:16:48 +02:00
parent bbec439a5e
commit 7761758096
21 changed files with 404 additions and 358 deletions

View file

@ -13,9 +13,8 @@ import pytest
# submulti, undefined, owners, Params, ParamOption, Calculation
from tiramisu import Config, DynOptionDescription, OptionDescription, Leadership, \
StrOption, IntOption, ChoiceOption, SymLinkOption, \
Calculation, Params, ParamValue, ParamOption, ParamSelfOption, ParamInformation, ParamSelfInformation, ParamIndex, ParamSuffix, \
Calculation, Params, ParamValue, ParamOption, ParamSelfOption, ParamInformation, ParamSelfInformation, ParamIndex, ParamIdentifier, \
submulti, calc_value, owners
from tiramisu.i18n import _
from tiramisu.option.baseoption import BaseOption
from tiramisu.error import ConfigError, ConstError, PropertiesOptionError, LeadershipError
from tiramisu.setting import ALLOWED_LEADER_PROPERTIES
@ -86,6 +85,9 @@ def build_variables(*,
base_name += 'dynamic_'
if hidden:
base_name += 'hidden_'
#str_mandatory_multi_hidden_information_deps
if base_name + 'information_deps' == 'str_mandatory_multi_hidden_information_deps':
print('blah', multi, properties, str1_5_informations)
str1 = StrOption(base_name + 'information_deps',
'',
multi=multi,
@ -211,10 +213,10 @@ def build_variables(*,
)
)
if dynoptiondescription:
default = Calculation(calc_value, Params(ParamSuffix()))
default = Calculation(calc_value, Params(ParamIdentifier()))
if param_multi:
default = [default]
variables.append(StrOption(base_name + 'calc_default_suffix',
variables.append(StrOption(base_name + 'calc_default_identifier',
'',
default,
multi=multi,
@ -309,40 +311,43 @@ def build_root_variables(*,
follower_params['multi'] = submulti
else:
follower_params['multi'] = True
suffix = ''
identifier = ''
if dynamic:
suffix += '_dynamic'
lsuffix = suffix
identifier += '_dynamic'
lidentifier = identifier
if hidden:
lsuffix += '_hidden'
variables.append(Leadership('leadership' + lsuffix, '', [StrOption('leader_multi_deps' + lsuffix,
lidentifier += '_hidden'
variables.append(Leadership('leadership' + lidentifier, '', [StrOption('leader_multi_deps' + lidentifier,
'',
default=['l1', 'l2'],
multi=True,
),
] + build_variables(**follower_params, parent_variables=parent_variables, dynamic=dynamic, hidden=hidden),
))
suffixes = StrOption('suffixes_multi_deps' + lsuffix, '', ['d1', 'd2'], multi=True)
variables.append(suffixes)
identifiers = StrOption('identifiers_multi_deps' + lidentifier, '', ['d1', 'd2'], multi=True)
variables.append(identifiers)
dynamic_name = 'dynamic_'
if hidden:
dynamic_name += 'hidden_'
variables.append(DynOptionDescription(dynamic_name, '', build_variables(**kwargs, dynoptiondescription=True, parent_variables=parent_variables, dynamic=dynamic, hidden=hidden), Calculation(return_var, Params(ParamOption(suffixes)))))
variables.append(DynOptionDescription(dynamic_name, '', build_variables(**kwargs, dynoptiondescription=True, parent_variables=parent_variables, dynamic=dynamic, hidden=hidden), Calculation(return_var, Params(ParamOption(identifiers)))))
tree.reverse()
for idx, t in enumerate(tree):
lsuffix = suffix
lidentifier = identifier
variables.extend(parent_variables.pop(-1))
if hidden and idx <= hidden_idx:
lsuffix = '_hidden' + suffix
if t.startswith('h'):
lidentifier = '_self_hidden' + identifier
else:
lidentifier = '_hidden' + identifier
if t.startswith('h'):
t = t[1:]
properties = frozenset(['hidden'])
else:
properties = frozenset()
if t == 'dod':
variables = [DynOptionDescription('tree_dynamic' + lsuffix, '', variables, Calculation(return_var, Params(ParamValue(['var1', 'var2']))), properties=properties)]
variables = [DynOptionDescription('tree_dynamic' + lidentifier, '', variables, Calculation(return_var, Params(ParamValue(['var1', 'var2']))), properties=properties)]
else:
variables = [OptionDescription('tree' + lsuffix, '', variables, properties=properties)]
variables = [OptionDescription('tree' + lidentifier, '', variables, properties=properties)]
od = OptionDescription('root', 'root', variables, informations={'cfg_key': 'cfg_info'})
return od
@ -445,21 +450,22 @@ def _test_option(option, without_index=False):
option.leadership()
assert option.isdynamic() == ('dynamic' in name)
if option.isdynamic():
suffixes = []
identifiers = []
for path in option.path().split('.'):
if 'dynamicvar1' in path:
suffixes.append('var1')
identifiers.append('var1')
if 'dynamicvar2' in path:
suffixes.append('var2')
identifiers.append('var2')
if 'd1' in path:
suffixes.append('d1')
identifiers.append('d1')
if 'd2' in path:
suffixes.append('d2')
assert option.suffixes() == suffixes
identifiers.append('d2')
assert option.identifiers() == identifiers
assert isinstance(option.description(), str) and option.description() == name and option.description(uncalculated=True) == ''
assert isinstance(option.path(), str) and (option.path() == name or option.path().endswith(f'.{name}'))
if '_deps' in name:
assert option.has_dependency(False)
print(option.path())
assert option.dependencies()
else:
assert not option.has_dependency(False)
@ -467,11 +473,11 @@ def _test_option(option, without_index=False):
if option.isoptiondescription():
assert option.type() == 'optiondescription'
elif 'index' in name:
assert option.type() == _('integer')
assert option.type() == 'integer'
elif 'choice' in name:
assert option.type() == _('choice')
assert option.type() == 'choice'
else:
assert option.type() == _('string')
assert option.type() == 'string'
# only option
if option.isoptiondescription():
with pytest.raises(ConfigError):
@ -485,9 +491,9 @@ def _test_option(option, without_index=False):
with pytest.raises(ConfigError):
option.issymlinkoption()
with pytest.raises(ConfigError):
option.default()
option.value.default()
with pytest.raises(ConfigError):
option.defaultmulti()
option.value.defaultmulti()
with pytest.raises(ConfigError):
option.pattern()
with pytest.raises(ConfigError):
@ -514,14 +520,14 @@ def _test_option(option, without_index=False):
assert option.index() in [0, 1]
else:
assert option.index() is None
if option.type() == _('integer'):
if option.type() == 'integer':
assert option.pattern() == '^[0-9]+$'
else:
assert not option.pattern()
default = option.default()
default = option.value.default(uncalculated=True)
if 'calc_default' in name:
assert isinstance(default, Calculation) or (isinstance(default, list) and len(default) == 1 and isinstance(default[0], Calculation))
elif 'suffixes_multi' in name:
elif 'identifiers_multi' in name:
assert default == ['d1', 'd2']
elif 'leader_multi' in name:
assert default == ['l1', 'l2']
@ -530,9 +536,9 @@ def _test_option(option, without_index=False):
else:
assert default is None
if option.issubmulti():
assert option.defaultmulti() == []
assert option.value.defaultmulti() == []
elif option.ismulti():
assert option.defaultmulti() is None
assert option.value.defaultmulti() is None
def _test_information(cfg, option, without_index=False):
@ -764,8 +770,8 @@ def _get_value(name, option, unrestraint):
value = 'value'
if 'multi' in name:
value = [value]
elif 'calc_default_suffix' in name:
value = option.suffixes()[-1]
elif 'calc_default_identifier' in name:
value = option.identifiers()[-1]
if 'multi' in name:
value = [value]
elif 'calc_default_index' in name:
@ -776,7 +782,7 @@ def _get_value(name, option, unrestraint):
value = 'val'
if 'multi' in name:
value = [value]
elif 'suffixes_multi' in name:
elif 'identifiers_multi' in name:
value = ['d1', 'd2']
elif 'leader_multi_deps' in name:
value = ['l1', 'l2']
@ -816,11 +822,11 @@ def _test_value_normal(name, cfg, option, unrestraint, without_index):
with pytest.raises(ConfigError):
option.value.list()
else:
if option.type() == _('string'):
if option.type() == 'string':
new_value = 'new_value'
new_value2 = 'new_value1'
new_value3 = 'new_value2'
elif option.type() == _('integer'):
elif option.type() == 'integer':
new_value = 10
new_value2 = 11
new_value3 = 12
@ -904,7 +910,8 @@ def _test_property(cfg, option, unrestraint=False, without_index=False):
if not unrestraint:
properties_only_raises.append('hidden')
properties_apply_requires.append('hidden')
properties_uncalculated.append('hidden')
if 'self_hidden' in option.name():
properties_uncalculated.append('hidden')
if name and 'mandatory' in name:
properties.append('mandatory')
properties_apply_requires.append('mandatory')

View file

@ -1,3 +0,0 @@
{
"options.unicode": null
}

View file

@ -32,6 +32,9 @@ def list_data(ext='.py'):
for filename in filenames:
# if filename.endswith(ext) and not filename.startswith('__'):
if filename.endswith(ext) and not filename.startswith('__') and not 'not_equal' in filename and not 'callback' in filename and not filename == 'unicode2_copy.py' and not filename == 'unicode2_multi_copy.py':
# if 'leadership' in filename:
# print('FIXME')
# continue
ret.append(filename)
return ret
@ -58,7 +61,7 @@ def load_config(filename,
form.extend(mod.get_form(add_extra_od))
config.property.read_write()
if root is None:
values = loads(dumps(config.option.dict(remotable=remote, clearable=clearable, form=form)))
values = loads(dumps(config.dict(remotable=remote, clearable=clearable, form=form)))
else:
values = loads(dumps(config.option(root).dict(remotable=remote, clearable=clearable, form=form)))
return values
@ -380,11 +383,12 @@ def test_updates(filename_mod):
if dico_ori is None:
if clearable == 'minimum' and remote == 'minimum':
with open(join(datadir, modulepath + '.dict'), 'w') as fh:
dump(config.value.dict(), fh, indent=2)
pouet
dump(config.value.get(), fh, indent=2)
else:
assert config.value.dict() == dico_ori, "clearable {}, remote: {}, filename: {}".format(clearable, remote, filename_mod)
assert config.value.get() == dico_ori, "clearable {}, remote: {}, filename: {}".format(clearable, remote, filename_mod)
if root is None:
suboption = config.option
suboption = config
else:
suboption = config.option(root)
if with_model:

View file

@ -201,7 +201,7 @@ def test_deref_symlink():
def test_deref_dyn():
a = StrOption('a', '', ['val1', 'val2'], multi=True)
b = StrOption('b', '')
dod = DynOptionDescription('dod', '', [b], suffixes=Calculation(funcname, Params((ParamOption(a),))))
dod = DynOptionDescription('dod', '', [b], identifiers=Calculation(funcname, Params((ParamOption(a),))))
o = OptionDescription('od', '', [dod, a])
cfg = Config(o)
w = weakref.ref(a)

View file

@ -11,45 +11,47 @@ from tiramisu import BoolOption, StrOption, ChoiceOption, IPOption, \
EmailOption, URLOption, UsernameOption, FilenameOption, SymLinkOption, \
OptionDescription, DynOptionDescription, submulti, Leadership, \
Config, \
Params, ParamOption, ParamValue, ParamSuffix, ParamSelfOption, ParamDynOption, ParamIndex, ParamSelfInformation, ParamInformation, \
Params, ParamOption, ParamValue, ParamIdentifier, ParamSelfOption, ParamDynOption, ParamIndex, ParamSelfInformation, ParamInformation, \
Calculation, calc_value
from tiramisu.error import PropertiesOptionError, ConfigError, ConflictError, ValueOptionError
def display_name(kls, subconfig) -> str:
def display_name(kls, subconfig, with_quote=False) -> str:
"""Replace the Tiramisu display_name function to display path + description"""
doc = kls._get_information(subconfig, "doc", None)
comment = f" ({doc})" if doc and doc != subconfig.path.rsplit('.', 1)[-1] else ""
if with_quote:
return f'"{subconfig.path}"{comment}'
return f"{subconfig.path}{comment}"
class ConvertDynOptionDescription(DynOptionDescription):
def convert_suffix_to_path(self, suffix):
def convert_identifier_to_path(self, identifier):
# remove dot with is illegal
return suffix.replace('.', '')
return identifier.replace('.', '')
def return_true(value, param=None, suffix=None):
def return_true(value, param=None, identifier=None):
if value == 'val' and param in [None, 'yes']:
return
raise ValueError('no value')
def return_dynval(value='val', suffix=None):
def return_dynval(value='val', identifier=None):
return value
def return_list2(suffix):
return [str(suffix), 'val2']
def return_list2(identifier):
return [str(identifier), 'val2']
def return_list(val=None, suffix=None):
def return_list(val=None, identifier=None):
if val:
return val
return ['val1', 'val2']
def return_list_dot(val=None, suffix=None):
def return_list_dot(val=None, identifier=None):
return ['val.1', 'val.2']
@ -71,7 +73,7 @@ def return_str(*args, **kwargs):
def test_build_dyndescription():
st1 = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_list))
dod = DynOptionDescription('dod', '', [st1], identifiers=Calculation(return_list))
od1 = OptionDescription('od', '', [dod])
cfg = Config(od1)
assert parse_od_get(cfg.value.get()) == {'dodval1.st': None, 'dodval2.st': None}
@ -82,23 +84,39 @@ def test_build_dyndescription():
# assert not list_sessions()
def test_dyndescription_suffixes():
def test_dyndescription_identifiers():
st1 = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_list))
dod = DynOptionDescription('dod', '', [st1], identifiers=Calculation(return_list))
od1 = OptionDescription('od', '', [dod])
cfg = Config(od1)
assert parse_od_get(cfg.value.get()) == {'dodval1.st': None, 'dodval2.st': None}
assert cfg.option('dodval1').suffixes() == ['val1']
assert cfg.option('dodval1.st').suffixes() == ['val1']
assert cfg.option('dodval1').suffixes(only_self=True) == ['val1', 'val2']
assert cfg.option('dodval1').identifiers() == ['val1']
assert cfg.option('dodval1.st').identifiers() == ['val1']
assert cfg.option('dodval1').identifiers(only_self=True) == ['val1', 'val2']
with pytest.raises(ConfigError):
cfg.option('dodval1.st').suffixes(only_self=True)
cfg.option('dodval1.st').identifiers(only_self=True)
# assert not list_sessions()
def test_dyndescription_identifiers_2():
st1 = StrOption('st', '')
od = OptionDescription('od', '', [st1])
dod = DynOptionDescription('dod', '', [od], identifiers=Calculation(return_list))
od1 = OptionDescription('od', '', [dod])
cfg = Config(od1)
assert parse_od_get(cfg.value.get()) == {'dodval1.od.st': None, 'dodval2.od.st': None}
assert cfg.option('dodval1').identifiers() == ['val1']
assert cfg.option('dodval1.od').identifiers() == ['val1']
assert cfg.option('dodval1.od.st').identifiers() == ['val1']
assert cfg.option('dodval1').identifiers(only_self=True) == ['val1', 'val2']
with pytest.raises(ConfigError):
cfg.option('dodval1.od').identifiers(only_self=True)
# assert not list_sessions()
def test_build_dyndescription_with_int():
int1 = IntOption('int', '', default=Calculation(calc_value, Params(ParamSuffix())))
dod = DynOptionDescription('dod', '', [int1], suffixes=Calculation(return_list, Params(ParamValue([1, 2]))))
int1 = IntOption('int', '', default=Calculation(calc_value, Params(ParamIdentifier())))
dod = DynOptionDescription('dod', '', [int1], identifiers=Calculation(return_list, Params(ParamValue([1, 2]))))
od1 = OptionDescription('od', '', [dod])
cfg = Config(od1)
assert parse_od_get(cfg.value.get()) == {'dod1.int': 1, 'dod2.int': 2}
@ -106,8 +124,8 @@ def test_build_dyndescription_with_int():
def test_build_dyndescription_with_dot():
st1 = StrOption('st', '', default=Calculation(calc_value, Params(ParamSuffix())))
dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_list_dot))
st1 = StrOption('st', '', default=Calculation(calc_value, Params(ParamIdentifier())))
dod = DynOptionDescription('dod', '', [st1], identifiers=Calculation(return_list_dot))
od1 = OptionDescription('od', '', [dod])
cfg = Config(od1)
assert parse_od_get(cfg.value.get()) == {'dodval_1.st': 'val.1', 'dodval_2.st': 'val.2'}
@ -116,7 +134,7 @@ def test_build_dyndescription_with_dot():
def test_build_dyndescription_raise():
st1 = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_raise))
dod = DynOptionDescription('dod', '', [st1], identifiers=Calculation(return_raise))
od1 = OptionDescription('od', '', [dod])
cfg = Config(od1)
with pytest.raises(ConfigError):
@ -126,7 +144,7 @@ def test_build_dyndescription_raise():
def test_build_dyndescription_not_list():
st1 = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_str))
dod = DynOptionDescription('dod', '', [st1], identifiers=Calculation(return_str))
od1 = OptionDescription('od', '', [dod])
cfg = Config(od1)
with pytest.raises(ValueError):
@ -136,7 +154,7 @@ def test_build_dyndescription_not_list():
def test_subpath_dyndescription():
st1 = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_list))
dod = DynOptionDescription('dod', '', [st1], identifiers=Calculation(return_list))
od1 = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od1])
cfg = Config(od2)
@ -146,7 +164,7 @@ def test_subpath_dyndescription():
def test_list_dyndescription():
st = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list))
od = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od])
cfg = Config(od2)
@ -157,7 +175,7 @@ def test_list_dyndescription():
def test_unknown_dyndescription():
st = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list))
od = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od])
cfg = Config(od2)
@ -174,7 +192,7 @@ def test_unknown_dyndescription():
def test_getdoc_dyndescription():
st1 = StrOption('st', 'doc1')
dod = DynOptionDescription('dod', 'doc2', [st1], suffixes=Calculation(return_list))
dod = DynOptionDescription('dod', 'doc2', [st1], identifiers=Calculation(return_list))
od1 = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od1])
cfg = Config(od2)
@ -193,7 +211,7 @@ def test_getdoc_dyndescription():
def test_dyndescription_path():
st1 = StrOption('st', 'doc1')
dod = DynOptionDescription('dod', 'doc2', [st1], suffixes=Calculation(return_list))
dod = DynOptionDescription('dod', 'doc2', [st1], identifiers=Calculation(return_list))
od1 = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od1])
cfg = Config(od2)
@ -207,7 +225,7 @@ def test_dyndescription_path():
def test_mod_dyndescription():
st = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list))
od = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od])
cfg = Config(od2)
@ -234,7 +252,7 @@ def test_mod_dyndescription():
def test_del_dyndescription():
st = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list))
od = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od])
cfg = Config(od2)
@ -250,7 +268,7 @@ def test_del_dyndescription():
def test_multi_dyndescription():
st = StrOption('st', '', multi=True)
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list))
od = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od])
cfg = Config(od2)
@ -278,7 +296,7 @@ def test_multi_dyndescription():
def test_prop_dyndescription():
st = StrOption('st', '', properties=('test',))
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list))
od = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od])
cfg = Config(od2)
@ -301,7 +319,7 @@ def test_prop_dyndescription():
def test_prop_dyndescription_force_store_value():
st = StrOption('st', '', properties=('force_store_value',))
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list))
od = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od])
cfg = Config(od2)
@ -312,8 +330,8 @@ def test_prop_dyndescription_force_store_value():
def test_prop_dyndescription_force_store_value_calculation_prefix():
lst = StrOption('lst', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '', Calculation(return_list, Params(ParamSuffix())) , properties=('force_store_value',))
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list, Params(ParamOption(lst))))
st = StrOption('st', '', Calculation(return_list, Params(ParamIdentifier())) , properties=('force_store_value',))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list, Params(ParamOption(lst))))
od = OptionDescription('od', '', [dod, lst])
od2 = OptionDescription('od', '', [od])
cfg = Config(od2)
@ -333,7 +351,7 @@ def test_prop_dyndescription_force_store_value_calculation_prefix():
def test_callback_dyndescription():
st = StrOption('st', '', Calculation(return_dynval))
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list))
od = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od])
cfg = Config(od2)
@ -358,7 +376,7 @@ def test_callback_dyndescription():
def test_callback_dyndescription_outside_wrong_param():
lst = StrOption('lst', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '', Calculation(return_dynval))
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list, Params(ParamOption(lst))))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list, Params(ParamOption(lst))))
out = StrOption('out', '', Calculation(return_dynval, Params(ParamOption(st))))
od = OptionDescription('od', '', [dod, out])
od2 = OptionDescription('od', '', [od, lst])
@ -371,7 +389,7 @@ def test_callback_dyndescription_outside_wrong_param():
def test_callback_dyndescription_outside1():
lst = StrOption('lst', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '', Calculation(return_dynval))
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list, Params(ParamOption(lst))))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list, Params(ParamOption(lst))))
out = StrOption('out', '', Calculation(return_dynval, Params(ParamDynOption(st, ['val1']))))
od = OptionDescription('od', '', [dod, out])
od2 = OptionDescription('od', '', [od, lst])
@ -392,7 +410,7 @@ def test_callback_dyndescription_outside2():
lst = StrOption('lst', '', ['val1', 'val2'], multi=True)
out = StrOption('out', '')
st = StrOption('st', '', Calculation(return_dynval, Params(ParamOption(out))))
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list, Params(ParamOption(lst))))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list, Params(ParamOption(lst))))
od = OptionDescription('od', '', [dod, out])
od2 = OptionDescription('od', '', [od, lst])
cfg = Config(od2)
@ -402,9 +420,34 @@ def test_callback_dyndescription_outside2():
# assert not list_sessions()
def test_callback_dyndescription_outside3():
lst = StrOption('lst', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '', 'val1')
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list, Params(ParamOption(lst))), properties=('hidden',))
out = StrOption('out', '', Calculation(return_dynval, Params(ParamDynOption(st, ['val1']))))
od = OptionDescription('od', '', [dod, out])
od2 = OptionDescription('od', '', [od, lst])
cfg = Config(od2)
cfg.property.read_write()
assert parse_od_get(cfg.value.get()) == {'od.out': 'val1', 'lst': ['val1', 'val2']}
def test_callback_dyndescription_subdyn():
lst = StrOption('lst', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '', 'val1')
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list, Params(ParamOption(lst))))
out = StrOption('out', '', Calculation(return_dynval, Params(ParamDynOption(st, ['val1', None]))), multi=True, properties=('notunique',))
dod2 = DynOptionDescription('dod2', '', [dod, out], identifiers=Calculation(return_list, Params(ParamOption(lst))))
od = OptionDescription('od', '', [dod2])
od2 = OptionDescription('od', '', [od, lst])
cfg = Config(od2)
cfg.property.read_write()
assert parse_od_get(cfg.value.get()) == {'od.dod2val1.dodval1.st': 'val1', 'od.dod2val1.dodval2.st': 'val1', 'od.dod2val1.out': ['val1', 'val1'], 'od.dod2val2.dodval1.st': 'val1', 'od.dod2val2.dodval2.st': 'val1', 'od.dod2val2.out': ['val1', 'val1'], 'lst': ['val1', 'val2']}
def test_callback_list_dyndescription():
st = StrOption('st', '', Calculation(return_list2, Params(ParamSuffix())), multi=True, properties=('notunique',))
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
st = StrOption('st', '', Calculation(return_list2, Params(ParamIdentifier())), multi=True, properties=('notunique',))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list))
od = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od])
cfg = Config(od2)
@ -423,7 +466,7 @@ def test_callback_list_dyndescription():
def test_mandatory_dyndescription():
st = StrOption('st', '', properties=('mandatory',))
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list))
od = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od])
cfg = Config(od2)
@ -449,7 +492,7 @@ def test_mandatory_dyndescription():
def test_build_dyndescription_context():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
st1 = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_list, Params(ParamOption(val1))))
dod = DynOptionDescription('dod', '', [st1], identifiers=Calculation(return_list, Params(ParamOption(val1))))
od1 = OptionDescription('od', '', [dod, val1])
cfg = Config(od1)
assert parse_od_get(cfg.value.get()) == {'dodval1.st': None, 'dodval2.st': None, 'val1': ['val1', 'val2']}
@ -459,7 +502,7 @@ def test_build_dyndescription_context():
def test_subpath_dyndescription_context():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
st1 = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_list, Params(ParamOption(val1))))
dod = DynOptionDescription('dod', '', [st1], identifiers=Calculation(return_list, Params(ParamOption(val1))))
od1 = OptionDescription('od', '', [dod, val1])
od2 = OptionDescription('od', '', [od1])
cfg = Config(od2)
@ -470,7 +513,7 @@ def test_subpath_dyndescription_context():
def test_list_dyndescription_context():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list, Params(ParamOption(val1))))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list, Params(ParamOption(val1))))
od = OptionDescription('od', '', [dod, val1])
od2 = OptionDescription('od', '', [od])
cfg = Config(od2)
@ -484,7 +527,7 @@ def test_list_dyndescription_context():
def test_mod_dyndescription_context():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list, Params(ParamOption(val1))))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list, Params(ParamOption(val1))))
od = OptionDescription('od', '', [dod, val1])
od2 = OptionDescription('od', '', [od])
cfg = Config(od2)
@ -509,7 +552,7 @@ def test_mod_dyndescription_context():
def test_del_dyndescription_context():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list, Params(ParamOption(val1))))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list, Params(ParamOption(val1))))
od = OptionDescription('od', '', [dod, val1])
od2 = OptionDescription('od', '', [od])
cfg = Config(od2)
@ -526,7 +569,7 @@ def test_del_dyndescription_context():
def test_multi_dyndescription_context():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '', multi=True, properties=('notunique',))
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list, Params(ParamOption(val1))))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list, Params(ParamOption(val1))))
od = OptionDescription('od', '', [dod, val1])
od2 = OptionDescription('od', '', [od])
cfg = Config(od2)
@ -555,7 +598,7 @@ def test_multi_dyndescription_context():
def test_prop_dyndescription_context():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '', properties=('test',))
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list, Params(ParamOption(val1))))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list, Params(ParamOption(val1))))
od = OptionDescription('od', '', [dod, val1])
od2 = OptionDescription('od', '', [od])
cfg = Config(od2)
@ -573,7 +616,7 @@ def test_prop_dyndescription_context():
def test_callback_dyndescription_context():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '', Calculation(return_dynval))
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list))
od = OptionDescription('od', '', [dod, val1])
od2 = OptionDescription('od', '', [od])
cfg = Config(od2)
@ -598,7 +641,7 @@ def test_callback_dyndescription_context():
def test_mandatory_dyndescription_context():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '', properties=('mandatory',))
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list, Params(ParamOption(val1))))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list, Params(ParamOption(val1))))
od = OptionDescription('od', '', [dod, val1])
od2 = OptionDescription('od', '', [od])
cfg = Config(od2)
@ -624,7 +667,7 @@ def test_mandatory_dyndescription_context():
def test_increase_dyndescription_context():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '', properties=('mandatory',))
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list, Params(ParamOption(val1))))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list, Params(ParamOption(val1))))
od = OptionDescription('od', '', [dod, val1])
od2 = OptionDescription('od', '', [od])
cfg = Config(od2)
@ -643,7 +686,7 @@ def test_increase_dyndescription_context():
def test_decrease_dyndescription_context():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '', properties=('mandatory',))
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list, Params(ParamOption(val1))))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list, Params(ParamOption(val1))))
od = OptionDescription('od', '', [dod, val1])
od2 = OptionDescription('od', '', [od])
cfg = Config(od2)
@ -680,13 +723,13 @@ def test_dyndescription_root():
'expected': ParamValue(False),
'default': ParamValue(None)}))
st1 = StrOption('st', '', properties=(disabled_property,))
dod = DynOptionDescription('dod', '', [boolean, st1], suffixes=Calculation(return_list))
dod = DynOptionDescription('dod', '', [boolean, st1], identifiers=Calculation(return_list))
with pytest.raises(ConfigError):
cfg = Config(dod)
# assert not list_sessions()
def test_dyndescription_disable_suffix_root():
def test_dyndescription_disable_identifier_root():
boolean = BoolOption('boolean', '', True)
disabled_property = Calculation(calc_value,
Params(ParamValue('disabled'),
@ -695,7 +738,7 @@ def test_dyndescription_disable_suffix_root():
'default': ParamValue(None)}))
val = StrOption('val', '', ['ext1', 'ext2'], properties=(disabled_property,), multi=True)
st1 = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(calc_value, Params(ParamOption(val, notraisepropertyerror=True))), properties=(disabled_property,))
dod = DynOptionDescription('dod', '', [st1], identifiers=Calculation(calc_value, Params(ParamOption(val, notraisepropertyerror=True))), properties=(disabled_property,))
od1 = OptionDescription('root', 'root', [boolean, val, dod])
cfg = Config(od1)
cfg.property.read_write()
@ -706,7 +749,7 @@ def test_dyndescription_disable_suffix_root():
# assert not list_sessions()
def test_dyndescription_disable_suffix_root_2():
def test_dyndescription_disable_identifier_root_2():
boolean = BoolOption('boolean', '', False)
disabled_property = Calculation(calc_value,
Params(ParamValue('disabled'),
@ -715,7 +758,7 @@ def test_dyndescription_disable_suffix_root_2():
'default': ParamValue(None)}))
val = StrOption('val', '', ['ext1', 'ext2'], properties=(disabled_property,), multi=True)
st1 = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(calc_value, Params(ParamOption(val, notraisepropertyerror=True))), properties=(disabled_property,))
dod = DynOptionDescription('dod', '', [st1], identifiers=Calculation(calc_value, Params(ParamOption(val, notraisepropertyerror=True))), properties=(disabled_property,))
od1 = OptionDescription('root', 'root', [boolean, val, dod])
cfg = Config(od1)
cfg.property.read_write()
@ -726,7 +769,7 @@ def test_dyndescription_disable_suffix_root_2():
# assert not list_sessions()
def test_dyndescription_disable_suffix():
def test_dyndescription_disable_identifier():
boolean = BoolOption('boolean', '', True)
disabled_property = Calculation(calc_value,
Params(ParamValue('disabled'),
@ -735,7 +778,7 @@ def test_dyndescription_disable_suffix():
'default': ParamValue(None)}))
val = StrOption('val', '', ['ext1', 'ext2'], properties=(disabled_property,), multi=True)
st1 = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(calc_value, Params(ParamOption(val, notraisepropertyerror=True))), properties=(disabled_property,))
dod = DynOptionDescription('dod', '', [st1], identifiers=Calculation(calc_value, Params(ParamOption(val, notraisepropertyerror=True))), properties=(disabled_property,))
od = OptionDescription('root', 'root', [boolean, val, dod])
od1 = OptionDescription('root', 'root', [od])
cfg = Config(od1)
@ -755,7 +798,7 @@ def test_requires_dyndescription():
'expected': ParamValue(False),
'default': ParamValue(None)}))
st1 = StrOption('st', '', properties=(disabled_property,))
dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_list))
dod = DynOptionDescription('dod', '', [st1], identifiers=Calculation(return_list))
od1 = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od1, boolean])
cfg = Config(od2)
@ -811,7 +854,7 @@ def test_requires_dyndescription_boolean():
'expected': ParamValue(False),
'default': ParamValue(None)}))
st = StrOption('st', '', properties=(disabled_property,))
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list))
od = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od, boolean1, boolean])
cfg = Config(od2)
@ -844,7 +887,7 @@ def test_requires_dyndescription_in_dyn():
'expected': ParamValue(False),
'default': ParamValue(None)}))
st = StrOption('st', '', properties=(disabled_property,))
dod = DynOptionDescription('dod', '', [boolean, st], suffixes=Calculation(return_list))
dod = DynOptionDescription('dod', '', [boolean, st], identifiers=Calculation(return_list))
od = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od])
cfg = Config(od2)
@ -870,8 +913,8 @@ def test_requires_dyndescription_in_dyn():
# assert not list_sessions()
def calc_value_not_same(param, condition, expected, default, suffix):
if suffix == 'val1':
def calc_value_not_same(param, condition, expected, default, identifier):
if identifier == 'val1':
index = 0
else:
index = 1
@ -885,10 +928,10 @@ def test_requires_dyndescription_in_dyn_not_same():
kwargs={'condition': ParamOption(boolean, raisepropertyerror=True),
'expected': ParamValue(False),
'default': ParamValue(None),
'suffix': ParamSuffix()}))
'identifier': ParamIdentifier()}))
st = StrOption('st', '', properties=(disabled_property,))
dod1 = DynOptionDescription('dod1', '', [boolean], suffixes=Calculation(return_list))
dod2 = DynOptionDescription('dod2', '', [st], suffixes=Calculation(return_list))
dod1 = DynOptionDescription('dod1', '', [boolean], identifiers=Calculation(return_list))
dod2 = DynOptionDescription('dod2', '', [st], identifiers=Calculation(return_list))
od = OptionDescription('od', '', [dod1, dod2])
od2 = OptionDescription('od', '', [od])
cfg = Config(od2)
@ -922,7 +965,7 @@ def test_requires_dyndescription2():
kwargs={'condition': ParamOption(boolean, raisepropertyerror=True),
'expected': ParamValue(False),
'default': ParamValue(None)}))
dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_list), properties=(disabled_property,))
dod = DynOptionDescription('dod', '', [st1], identifiers=Calculation(return_list), properties=(disabled_property,))
od1 = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od1, boolean])
cfg = Config(od2)
@ -967,7 +1010,7 @@ def test_requires_dyndescription2():
def test_validator_dyndescription():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '', validators=[Calculation(return_true, Params((ParamSelfOption(), ParamValue('yes'))))], default='val')
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list))
od = OptionDescription('od', '', [dod, val1])
od2 = OptionDescription('od', '', [od])
cfg = Config(od2)
@ -981,7 +1024,7 @@ def test_validator_dyndescription():
def test_makedict_dyndescription_context():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list))
od = OptionDescription('od', '', [dod, val1])
od2 = OptionDescription('od', '', [od])
cfg = Config(od2)
@ -993,7 +1036,7 @@ def test_makedict_dyndescription_context():
#def test_find_dyndescription_context():
# val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
# st = StrOption('st', '')
# dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
# dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list))
# od = OptionDescription('od', '', [dod, val1])
# od2 = OptionDescription('od', '', [od])
# cfg = Config(od2)
@ -1015,7 +1058,7 @@ def test_makedict_dyndescription_context():
def test_information_dyndescription_context():
val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
st = StrOption('st', '', informations={'testst': 'val2'})
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list), informations={'testod': 'val1'})
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list), informations={'testod': 'val1'})
od = OptionDescription('od', '', [dod, val1])
od2 = OptionDescription('od', '', [od])
cfg = Config(od2)
@ -1049,7 +1092,7 @@ def test_all_dyndescription():
dod = DynOptionDescription('dod', '', [st, ip, network, netmask, ch, ch1,
boo, intr, floa, uni, port, broad,
domain, email, url, username,
filename], suffixes=Calculation(return_list))
filename], identifiers=Calculation(return_list))
od1 = OptionDescription('od', '', [dod])
cfg = Config(od1)
assert cfg.option('dodval1.st').value.get() is None
@ -1128,7 +1171,7 @@ def test_leadership_dyndescription():
st1 = StrOption('st1', "", multi=True)
st2 = StrOption('st2', "", multi=True)
stm = Leadership('st1', '', [st1, st2])
st = DynOptionDescription('st', '', [stm], suffixes=Calculation(return_list))
st = DynOptionDescription('st', '', [stm], identifiers=Calculation(return_list))
od = OptionDescription('od', '', [st])
od1 = OptionDescription('od', '', [od])
cfg = Config(od1)
@ -1188,7 +1231,7 @@ def test_leadership_dyndescription_force_store_value_leader():
st2 = StrOption('st2', "", multi=True, default=Calculation(return_list, Params(ParamOption(st1))))
stm = Leadership('st1', '', [st1, st2])
val1 = StrOption('val1', '', multi=True, default=['val1', 'val2'])
st = DynOptionDescription('st', '', [stm], suffixes=Calculation(return_list, Params(ParamOption(val1))))
st = DynOptionDescription('st', '', [stm], identifiers=Calculation(return_list, Params(ParamOption(val1))))
od = OptionDescription('od', '', [val1, st])
od1 = OptionDescription('od', '', [od])
cfg = Config(od1)
@ -1221,7 +1264,7 @@ def test_leadership_dyndescription_force_store_value():
st2 = StrOption('st2', "", multi=True, properties=('force_store_value',), default=Calculation(return_list, Params(ParamOption(st1))))
stm = Leadership('st1', '', [st1, st2])
val1 = StrOption('val1', '', multi=True, default=['val1', 'val2'])
st = DynOptionDescription('st', '', [stm], suffixes=Calculation(return_list, Params(ParamOption(val1))))
st = DynOptionDescription('st', '', [stm], identifiers=Calculation(return_list, Params(ParamOption(val1))))
od = OptionDescription('od', '', [val1, st])
od1 = OptionDescription('od', '', [od])
cfg = Config(od1)
@ -1253,7 +1296,7 @@ def test_leadership_default_multi_dyndescription1():
st1 = StrOption('st1', "", multi=True)
st2 = StrOption('st2', "", multi=True, default_multi='no')
stm = Leadership('st1', '', [st1, st2])
st = DynOptionDescription('st', '', [stm], suffixes=Calculation(return_list))
st = DynOptionDescription('st', '', [stm], identifiers=Calculation(return_list))
od = OptionDescription('od', '', [st])
od1 = OptionDescription('od', '', [od])
cfg = Config(od1)
@ -1280,7 +1323,7 @@ def test_leadership_dyndescription_param():
st1 = StrOption('st1', "", multi=True)
st2 = StrOption('st2', "", multi=True)
stm = Leadership('st1', '', [st1, st2])
st = DynOptionDescription('st', '', [stm], suffixes=Calculation(return_list, Params(ParamOption(val1))))
st = DynOptionDescription('st', '', [stm], identifiers=Calculation(return_list, Params(ParamOption(val1))))
od = OptionDescription('od', '', [st, odval])
od1 = OptionDescription('od', '', [od])
cfg = Config(od1)
@ -1339,7 +1382,7 @@ def test_leadership_default_multi_dyndescription2():
st1 = StrOption('st1', "", multi=True)
st2 = StrOption('st2', "", multi=True, default_multi='no')
stm = Leadership('st1', '', [st1, st2])
st = DynOptionDescription('st', '', [stm], suffixes=Calculation(return_list))
st = DynOptionDescription('st', '', [stm], identifiers=Calculation(return_list))
od = OptionDescription('od', '', [st])
od1 = OptionDescription('od', '', [od])
cfg = Config(od1)
@ -1421,7 +1464,7 @@ def test_leadership_dyndescription_param_leader():
st1 = StrOption('st1', "", multi=True)
st2 = StrOption('st2', "", multi=True)
stm = Leadership('st1', '', [st1, st2])
st = DynOptionDescription('st', '', [stm], suffixes=Calculation(return_list, Params(ParamOption(val1))))
st = DynOptionDescription('st', '', [stm], identifiers=Calculation(return_list, Params(ParamOption(val1))))
od = OptionDescription('od', '', [st, odval])
od1 = OptionDescription('od', '', [od])
cfg = Config(od1)
@ -1433,7 +1476,7 @@ def test_leadership_default_multi_dyndescription3():
st1 = StrOption('st1', "", multi=True)
st2 = StrOption('st2', "", multi=True, default_multi='no')
stm = Leadership('st1', '', [st1, st2])
st = DynOptionDescription('st', '', [stm], suffixes=Calculation(return_list))
st = DynOptionDescription('st', '', [stm], identifiers=Calculation(return_list))
od = OptionDescription('od', '', [st])
od2 = OptionDescription('od', '', [od])
cfg = Config(od2)
@ -1461,7 +1504,7 @@ def test_leadership_dyndescription_param_follower():
st1 = StrOption('st1', "", multi=True)
st2 = StrOption('st2', "", multi=True)
stm = Leadership('st1', '', [st1, st2])
st = DynOptionDescription('st', '', [stm], suffixes=Calculation(return_list, Params(ParamOption(val2))))
st = DynOptionDescription('st', '', [stm], identifiers=Calculation(return_list, Params(ParamOption(val2))))
od = OptionDescription('od', '', [st, odval])
od1 = OptionDescription('od', '', [od])
cfg = Config(od1)
@ -1473,7 +1516,7 @@ def test_leadership_default_multi_dyndescription_sub():
st1 = StrOption('st1', "", multi=True)
st2 = StrOption('st2', "", multi=True, default_multi='no')
stm = Leadership('st1', '', [st1, st2])
st = DynOptionDescription('st', '', [stm], suffixes=Calculation(return_list))
st = DynOptionDescription('st', '', [stm], identifiers=Calculation(return_list))
od = OptionDescription('od', '', [st])
od1 = OptionDescription('od', '', [od])
cfg = Config(od1)
@ -1498,7 +1541,7 @@ def test_leadership_submulti_dyndescription():
st1 = StrOption('st1', "", multi=True)
st2 = StrOption('st2', "", multi=submulti)
stm = Leadership('st1', '', [st1, st2])
std = DynOptionDescription('st', '', [stm], suffixes=Calculation(return_list))
std = DynOptionDescription('st', '', [stm], identifiers=Calculation(return_list))
od1 = OptionDescription('od', '', [std])
od2 = OptionDescription('od', '', [od1])
cfg = Config(od2)
@ -1531,7 +1574,7 @@ def test_leadership_callback_dyndescription():
st1 = StrOption('st1', "", multi=True)
st2 = StrOption('st2', "", Calculation(return_dynval, Params(kwargs={'value': ParamOption(st1)})), multi=True)
stm = Leadership('st1', '', [st1, st2])
st1 = DynOptionDescription('st', '', [stm], suffixes=Calculation(return_list))
st1 = DynOptionDescription('st', '', [stm], identifiers=Calculation(return_list))
od1 = OptionDescription('od', '', [st1])
od2 = OptionDescription('od', '', [od1])
cfg = Config(od2)
@ -1593,7 +1636,7 @@ def test_leadership_callback_value_dyndescription():
st1 = StrOption('st1', "", multi=True)
st2 = StrOption('st2', "", Calculation(return_dynval, Params(kwargs={'value': ParamValue('val')})), multi=True)
stm = Leadership('st1', '', [st1, st2])
st = DynOptionDescription('st', '', [stm], suffixes=Calculation(return_list))
st = DynOptionDescription('st', '', [stm], identifiers=Calculation(return_list))
od = OptionDescription('od', '', [st])
od1 = OptionDescription('od', '', [od])
cfg = Config(od1)
@ -1610,7 +1653,7 @@ def test_leadership_callback_nomulti_dyndescription():
st1 = StrOption('st1', "", multi=True)
st2 = StrOption('st2', "", Calculation(return_dynval, Params(ParamOption(v11))), multi=True)
stm = Leadership('st1', '', [st1, st2])
stt = DynOptionDescription('st', '', [stm], suffixes=Calculation(return_list))
stt = DynOptionDescription('st', '', [stm], identifiers=Calculation(return_list))
od1 = OptionDescription('od', '', [stt])
od2 = OptionDescription('od', '', [od1, v11])
cfg = Config(od2)
@ -1626,7 +1669,7 @@ def test_leadership_callback_samegroup_dyndescription():
st2 = StrOption('st2', "", multi=True)
st3 = StrOption('st3', "", Calculation(return_dynval, Params(ParamOption(st2))), multi=True)
stm = Leadership('st1', '', [st1, st2, st3])
stt = DynOptionDescription('st', '', [stm], suffixes=Calculation(return_list))
stt = DynOptionDescription('st', '', [stm], identifiers=Calculation(return_list))
od1 = OptionDescription('od', '', [stt])
od2 = OptionDescription('od', '', [od1])
cfg = Config(od2)
@ -1655,7 +1698,7 @@ def test_leadership_callback_samegroup_dyndescription():
def test_invalid_conflict_dyndescription():
st = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list))
dodinvalid = StrOption('dodinvalid', '')
dod, dodinvalid
with pytest.raises(ConflictError):
@ -1668,7 +1711,7 @@ def test_leadership_default_multi_dyndescription4():
st2 = StrOption('st2', "", multi=True, default_multi='no')
stm = Leadership('st1', '', [st1, st2])
od1 = OptionDescription('od1', '', [stm])
st = DynOptionDescription('st', '', [od1], suffixes=Calculation(return_list))
st = DynOptionDescription('st', '', [od1], identifiers=Calculation(return_list))
od = OptionDescription('od', '', [st])
od1 = OptionDescription('od', '', [od])
cfg = Config(od1)
@ -1698,8 +1741,8 @@ def test_leadership_default_multi_dyndescription4():
def test_subdynod_dyndescription_root():
st2 = StrOption('st2', '')
dod1 = DynOptionDescription('dod1', '', [st2], suffixes=Calculation(return_list, Params(ParamValue(['a', 'b']))))
dod = DynOptionDescription('dod', '', [dod1], suffixes=Calculation(return_list))
dod1 = DynOptionDescription('dod1', '', [st2], identifiers=Calculation(return_list, Params(ParamValue(['a', 'b']))))
dod = DynOptionDescription('dod', '', [dod1], identifiers=Calculation(return_list))
st3 = StrOption('st3', '', Calculation(return_dynval, Params(ParamDynOption(st2, ['val1', 'a']))))
# FIXME st4 = StrOption('st4', '', Calculation(return_dynval, Params(ParamOption(st2))), multi=True)
od1 = OptionDescription('od', '', [dod, st3]) #, st4])
@ -1764,8 +1807,8 @@ def test_subdynod_dyndescription_root():
def test_subdynod_dyndescription():
st2 = StrOption('st2', '')
dod1 = DynOptionDescription('dod1', '', [st2], suffixes=Calculation(return_list, Params(ParamValue(['a', 'b']))))
dod = DynOptionDescription('dod', '', [dod1], suffixes=Calculation(return_list))
dod1 = DynOptionDescription('dod1', '', [st2], identifiers=Calculation(return_list, Params(ParamValue(['a', 'b']))))
dod = DynOptionDescription('dod', '', [dod1], identifiers=Calculation(return_list))
od1 = OptionDescription('od', '', [dod])
st3 = StrOption('st3', '', Calculation(return_dynval, Params(ParamDynOption(st2, ['val1', 'a']))))
od = OptionDescription('od', '', [od1, st3]) #, st4])
@ -1830,8 +1873,8 @@ def test_subdynod_dyndescription():
def test_subdynod_dyndescription_2():
st2 = StrOption('st2', '')
st1 = StrOption('st1', '', default=['a', 'b'], multi=True)
dod1 = DynOptionDescription('dod1', '', [st2], suffixes=Calculation(return_list, Params(ParamOption(st1))))
dod = DynOptionDescription('dod', '', [dod1, st1], suffixes=Calculation(return_list))
dod1 = DynOptionDescription('dod1', '', [st2], identifiers=Calculation(return_list, Params(ParamOption(st1))))
dod = DynOptionDescription('dod', '', [dod1, st1], identifiers=Calculation(return_list))
od1 = OptionDescription('od', '', [dod])
st3 = StrOption('st3', '', Calculation(return_dynval, Params(ParamDynOption(st2, ['val1', 'a']))))
od = OptionDescription('od', '', [od1, st3]) #, st4])
@ -1868,8 +1911,8 @@ def test_subdynod_dyndescription_leadership():
st1 = StrOption('st1', '', multi=True)
st2 = StrOption('st2', '', multi=True)
stm = Leadership('stm', '', [st1, st2])
dod1 = DynOptionDescription('dod1', '', [stm], suffixes=Calculation(return_list, Params(ParamValue(['a', 'b']))))
dod = DynOptionDescription('dod', '', [dod1], suffixes=Calculation(return_list))
dod1 = DynOptionDescription('dod1', '', [stm], identifiers=Calculation(return_list, Params(ParamValue(['a', 'b']))))
dod = DynOptionDescription('dod', '', [dod1], identifiers=Calculation(return_list))
od1 = OptionDescription('od', '', [dod])
st3 = StrOption('st3', '', Calculation(return_dynval, Params(ParamDynOption(st1, ['val1', 'a']))), multi=True)
# FIXME st4 = StrOption('st4', '', Calculation(return_dynval, Params(ParamOption(st2))), multi=True)
@ -1916,7 +1959,7 @@ def test_dyndescription_symlink():
st = StrOption('st', '')
st2 = SymLinkOption('st2', st)
# with pytest.raises(ConfigError):
dod = DynOptionDescription('dod', '', [st, st2], suffixes=Calculation(return_list))
dod = DynOptionDescription('dod', '', [st, st2], identifiers=Calculation(return_list))
od = OptionDescription('od', '', [dod])
cfg = Config(od)
assert parse_od_get(cfg.value.get()) == {'dodval1.st': None, 'dodval1.st2': None, 'dodval2.st': None, 'dodval2.st2': None}
@ -1927,10 +1970,10 @@ def test_dyndescription_symlink():
def test_dyndescription_symlink_not_same():
st = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list))
st2 = SymLinkOption('st2', st)
# with pytest.raises(ConfigError):
dod2 = DynOptionDescription('sdod', '', [st2], suffixes=Calculation(return_list))
dod2 = DynOptionDescription('sdod', '', [st2], identifiers=Calculation(return_list))
od = OptionDescription('od', '', [dod, dod2])
cfg = Config(od)
assert parse_od_get(cfg.value.get()) == {'dodval1.st': None, 'dodval2.st': None, 'sdodval1.st2': [None, None], 'sdodval2.st2': [None, None]}
@ -1942,7 +1985,7 @@ def test_dyndescription_symlink_not_same():
def test_dyndescription_symlink_outside():
st = StrOption('st', '')
# with pytest.raises(ConfigError):
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list))
st2 = SymLinkOption('st2', st)
od = OptionDescription('od', '', [dod, st2])
cfg = Config(od)
@ -1956,7 +1999,7 @@ def test_dyndescription_symlink_inside():
st = StrOption('st', '')
st2 = SymLinkOption('st2', st)
# with pytest.raises(ConfigError):
dod = DynOptionDescription('dod', '', [st2], suffixes=Calculation(return_list))
dod = DynOptionDescription('dod', '', [st2], identifiers=Calculation(return_list))
od = OptionDescription('od', '', [dod, st])
cfg = Config(od)
assert parse_od_get(cfg.value.get()) == {'dodval1.st2': None, 'dodval2.st2': None, 'st': None}
@ -1975,7 +2018,7 @@ def test_nocallback_dyndescription():
def test_invalid_samevalue_dyndescription():
st1 = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_same_list))
dod = DynOptionDescription('dod', '', [st1], identifiers=Calculation(return_same_list))
od1 = OptionDescription('od', '', [dod])
cfg = Config(od1)
with pytest.raises(ValueError):
@ -1985,7 +2028,7 @@ def test_invalid_samevalue_dyndescription():
def test_invalid_name_dyndescription():
st1 = StrOption('st', '')
dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_wrong_list))
dod = DynOptionDescription('dod', '', [st1], identifiers=Calculation(return_wrong_list))
od1 = OptionDescription('od', '', [dod])
cfg = Config(od1)
with pytest.raises(ValueError):
@ -1997,7 +2040,7 @@ def test_leadership_dyndescription_convert():
st1 = StrOption('st1', "", multi=True)
st2 = StrOption('st2', "", multi=True)
stm = Leadership('st1', '', [st1, st2])
st = ConvertDynOptionDescription('st', '', [stm], suffixes=Calculation(return_list_dot))
st = ConvertDynOptionDescription('st', '', [stm], identifiers=Calculation(return_list_dot))
od = OptionDescription('od', '', [st])
od1 = OptionDescription('od', '', [od])
cfg = Config(od1)
@ -2057,7 +2100,7 @@ def test_leadership_callback_samegroup_dyndescription_convert():
st2 = StrOption('st2', "", multi=True)
st3 = StrOption('st3', "", Calculation(return_dynval, Params(ParamOption(st2))), multi=True)
stm = Leadership('st1', '', [st1, st2, st3])
stt = ConvertDynOptionDescription('st', '', [stm], suffixes=Calculation(return_list_dot))
stt = ConvertDynOptionDescription('st', '', [stm], identifiers=Calculation(return_list_dot))
od1 = OptionDescription('od', '', [stt])
od2 = OptionDescription('od', '', [od1])
cfg = Config(od2)
@ -2088,7 +2131,7 @@ def test_dyn_with_leader_hidden_in_config():
ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True, properties=('hidden',))
interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0], properties=('hidden',))
dyn = DynOptionDescription('leader', '', [interface1], suffixes=Calculation(return_list))
dyn = DynOptionDescription('leader', '', [interface1], identifiers=Calculation(return_list))
od1 = OptionDescription('root', '', [dyn])
cfg = Config(od1)
cfg.property.read_write()
@ -2110,7 +2153,7 @@ def test_dyn_with_leader_hidden_in_config2():
ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True, properties=('hidden',))
interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
dyn = DynOptionDescription('leader', '', [interface1], suffixes=Calculation(return_list))
dyn = DynOptionDescription('leader', '', [interface1], identifiers=Calculation(return_list))
od1 = OptionDescription('root', '', [dyn])
cfg = Config(od1)
cfg.property.read_write()
@ -2135,7 +2178,7 @@ def test_dyn_leadership_requires():
'index': ParamIndex()}))
netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True, properties=(disabled_property,))
interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
dyn = DynOptionDescription('leader', '', [interface1], suffixes=Calculation(return_list))
dyn = DynOptionDescription('leader', '', [interface1], identifiers=Calculation(return_list))
od1 = OptionDescription('toto', '', [dyn])
cfg = Config(od1)
cfg.property.read_write()
@ -2175,7 +2218,7 @@ def test_dyn_leadership_mandatory():
hostname = DomainnameOption(name="hostname_", doc="hostname_", multi=True, type='hostname')
choice = ChoiceOption(name="type_", doc="type_", values=('A', 'CNAME'), multi=True, default_multi="A")
leadership = Leadership(name="hostname_", doc="hostname_", children=[hostname, choice], properties=frozenset({Calculation(calc_value, Params(ParamValue('hidden'), kwargs={'condition': ParamOption(is_auto, notraisepropertyerror=True), 'expected': ParamValue(True)}))}))
dyn = DynOptionDescription(name="nsd_zone_", doc="Zone ", suffixes=Calculation(calc_value, Params((ParamOption(nsd_zones_all, notraisepropertyerror=True)))), children=[is_auto, leadership], properties=frozenset({"normal"}))
dyn = DynOptionDescription(name="nsd_zone_", doc="Zone ", identifiers=Calculation(calc_value, Params((ParamOption(nsd_zones_all, notraisepropertyerror=True)))), children=[is_auto, leadership], properties=frozenset({"normal"}))
od1 = OptionDescription(name="nsd", doc="nsd", children=[nsd_zones_all, dyn])
cfg = Config(od1)
assert cfg.value.mandatory() == []
@ -2184,8 +2227,8 @@ def test_dyn_leadership_mandatory():
def test_dyn_symlink():
remotes = StrOption("remotes", "Remotes", ['a', 'b', 'c'], multi=True)
remote_ip = StrOption("remote_ip_", "Remote IP", Calculation(calc_value, Params(ParamSuffix())))
dyn_remote = DynOptionDescription("remote_", "Account for ", suffixes=Calculation(calc_value, Params((ParamOption(remotes)))), children=[remote_ip])
remote_ip = StrOption("remote_ip_", "Remote IP", Calculation(calc_value, Params(ParamIdentifier())))
dyn_remote = DynOptionDescription("remote_", "Account for ", identifiers=Calculation(calc_value, Params((ParamOption(remotes)))), children=[remote_ip])
name = SymLinkOption("name", opt=remote_ip)
od1 = OptionDescription(name="accounts", doc="accounts.remote_.remote_ip_", children=[remotes, dyn_remote, name])
cfg = Config(od1)
@ -2198,8 +2241,8 @@ def test_dyn_symlink():
def test_dyn_callback_with_not_dyn():
remotes = StrOption("remotes", "Remotes", ['a', 'b', 'c'], multi=True)
remote_ip = StrOption("remote_ip_", "Remote IP", Calculation(calc_value, Params(ParamSuffix())))
dyn_remote = DynOptionDescription("remote_", "Account for ", suffixes=Calculation(calc_value, Params((ParamOption(remotes)))), children=[remote_ip])
remote_ip = StrOption("remote_ip_", "Remote IP", Calculation(calc_value, Params(ParamIdentifier())))
dyn_remote = DynOptionDescription("remote_", "Account for ", identifiers=Calculation(calc_value, Params((ParamOption(remotes)))), children=[remote_ip])
names = StrOption('names', '', Calculation(calc_value, Params(ParamOption(remote_ip))), multi=True)
od1 = OptionDescription(name="accounts", doc="accounts.remote_.remote_ip_", children=[remotes, dyn_remote, names])
cfg = Config(od1)
@ -2217,7 +2260,7 @@ def test_dyn_link_subdyn():
password2 = StrOption(name="password", doc="password", default=Calculation(calc_value, Params((ParamOption(password)))), properties=('mandatory',))
user = OptionDescription(name="user", doc="user", children=[name, password2])
sub = OptionDescription(name="sub", doc="sub", children=[user])
user_database = DynOptionDescription(name="user_database_", doc="user database", suffixes=Calculation(calc_value, Params((ParamOption(database_names, notraisepropertyerror=True)))), children=[password, sub])
user_database = DynOptionDescription(name="user_database_", doc="user database", identifiers=Calculation(calc_value, Params((ParamOption(database_names, notraisepropertyerror=True)))), children=[password, sub])
socle = OptionDescription(name="socle", doc="socle", children=[user_database, database_names])
root = OptionDescription(name="baseoption", doc="baseoption", children=[socle])
cfg = Config(root)
@ -2279,7 +2322,7 @@ def test_dyn_link_subdyn_2():
name = StrOption(name="name", doc="name", properties=('mandatory',))
user = OptionDescription(name="user", doc="user", children=[name, password2])
sub = OptionDescription(name="sub", doc="sub", children=[user])
user_database = DynOptionDescription(name="user_database_", doc="user database", suffixes=Calculation(calc_value, Params((ParamOption(database_names, notraisepropertyerror=True)))), children=[password, sub])
user_database = DynOptionDescription(name="user_database_", doc="user database", identifiers=Calculation(calc_value, Params((ParamOption(database_names, notraisepropertyerror=True)))), children=[password, sub])
socle = OptionDescription(name="socle", doc="socle", children=[user_database, database_names])
root = OptionDescription(name="baseoption", doc="baseoption", children=[socle])
cfg = Config(root)
@ -2342,10 +2385,10 @@ def test_dyn_link_subdyn_twice():
login = StrOption(name="login", doc="login", default=Calculation(calc_value, Params((ParamOption(name)))), properties=('mandatory',))
password2 = StrOption(name="password2", doc="password2", default=Calculation(calc_value, Params((ParamOption(password)))), properties=('mandatory',))
database_names = StrOption(name="database_names", doc="database_names", multi=True, default=["srep", "snom", "srem"])
user_database = DynOptionDescription(name="user_database_", doc="user database", suffixes=Calculation(calc_value, Params((ParamOption(database_names, notraisepropertyerror=True)))), children=[name, login, password2])
user_database = DynOptionDescription(name="user_database_", doc="user database", identifiers=Calculation(calc_value, Params((ParamOption(database_names, notraisepropertyerror=True)))), children=[name, login, password2])
databases = OptionDescription(name="databases", doc="database", children=[password, user_database])
schema_names = StrOption(name="database_schemas", doc="database_schemas", multi=True, default=["schema1", "schema2", "schema3"])
schema = DynOptionDescription(name="schema_", doc="schema_", suffixes=Calculation(calc_value, Params((ParamOption(schema_names, notraisepropertyerror=True)))), children=[database_names, databases])
schema = DynOptionDescription(name="schema_", doc="schema_", identifiers=Calculation(calc_value, Params((ParamOption(schema_names, notraisepropertyerror=True)))), children=[database_names, databases])
socle = OptionDescription(name="socle", doc="socle", children=[schema, schema_names])
root = OptionDescription(name="baseoption", doc="baseoption", children=[socle])
cfg = Config(root)
@ -2517,11 +2560,11 @@ def test_dyn_link_subdyn_tree():
login = StrOption(name="login", doc="login", default=Calculation(calc_value, Params((ParamOption(name)))), properties=('mandatory',))
password2 = StrOption(name="password2", doc="password2", default=Calculation(calc_value, Params((ParamOption(password)))), properties=('mandatory',))
user_names = StrOption(name="users", doc="users", multi=True, default=["user1"])
user_database = DynOptionDescription(name="user_database_", doc="user database", suffixes=Calculation(calc_value, Params((ParamOption(user_names, notraisepropertyerror=True)))), children=[name, login, password2])
user_database = DynOptionDescription(name="user_database_", doc="user database", identifiers=Calculation(calc_value, Params((ParamOption(user_names, notraisepropertyerror=True)))), children=[name, login, password2])
database_names = StrOption(name="database_names", doc="database_names", multi=True, default=["srep"])
databases = DynOptionDescription(name="db_", doc="database", suffixes=Calculation(calc_value, Params((ParamOption(database_names, notraisepropertyerror=True)))), children=[user_names, password, user_database])
databases = DynOptionDescription(name="db_", doc="database", identifiers=Calculation(calc_value, Params((ParamOption(database_names, notraisepropertyerror=True)))), children=[user_names, password, user_database])
schema_names = StrOption(name="database_schemas", doc="database_schemas", multi=True, default=["schema1"])
schema = DynOptionDescription(name="schema_", doc="schema_", suffixes=Calculation(calc_value, Params((ParamOption(schema_names, notraisepropertyerror=True)))), children=[database_names, databases])
schema = DynOptionDescription(name="schema_", doc="schema_", identifiers=Calculation(calc_value, Params((ParamOption(schema_names, notraisepropertyerror=True)))), children=[database_names, databases])
socle = OptionDescription(name="socle", doc="socle", children=[schema, schema_names])
root = OptionDescription(name="baseoption", doc="baseoption", children=[socle])
cfg = Config(root)
@ -2595,9 +2638,9 @@ def test_dyn_link_subdyn_same_variable():
login = StrOption(name="login", doc="login", default=Calculation(calc_value, Params((ParamOption(name)))), properties=('mandatory',))
password2 = StrOption(name="password2", doc="password2", default=Calculation(calc_value, Params((ParamOption(password)))), properties=('mandatory',))
schema_names = StrOption(name="database_schemas", doc="database_schemas", multi=True, default=["schema1"])
user_database = DynOptionDescription(name="user_database_", doc="user database", suffixes=Calculation(calc_value, Params((ParamOption(schema_names, notraisepropertyerror=True)))), children=[name, login, password2])
databases = DynOptionDescription(name="db_", doc="database", suffixes=Calculation(calc_value, Params((ParamOption(schema_names, notraisepropertyerror=True)))), children=[password, user_database])
schema = DynOptionDescription(name="schema_", doc="schema_", suffixes=Calculation(calc_value, Params((ParamOption(schema_names, notraisepropertyerror=True)))), children=[databases])
user_database = DynOptionDescription(name="user_database_", doc="user database", identifiers=Calculation(calc_value, Params((ParamOption(schema_names, notraisepropertyerror=True)))), children=[name, login, password2])
databases = DynOptionDescription(name="db_", doc="database", identifiers=Calculation(calc_value, Params((ParamOption(schema_names, notraisepropertyerror=True)))), children=[password, user_database])
schema = DynOptionDescription(name="schema_", doc="schema_", identifiers=Calculation(calc_value, Params((ParamOption(schema_names, notraisepropertyerror=True)))), children=[databases])
socle = OptionDescription(name="socle", doc="socle", children=[schema, schema_names])
root = OptionDescription(name="baseoption", doc="baseoption", children=[socle])
cfg = Config(root)
@ -2696,9 +2739,9 @@ def test_dyn_link_subdyn_disabled():
'default': ParamValue(None)}))
password2 = StrOption(name="password2", doc="password2", default=Calculation(calc_value, Params((ParamOption(password)))), properties=(disabled_property,))
schema_names = StrOption(name="database_schemas", doc="database_schemas", multi=True, default=["schema1"])
user_database = DynOptionDescription(name="user_database_", doc="user database", suffixes=Calculation(calc_value, Params((ParamOption(schema_names, notraisepropertyerror=True)))), children=[name, login, password2])
databases = DynOptionDescription(name="db_", doc="database", suffixes=Calculation(calc_value, Params((ParamOption(schema_names, notraisepropertyerror=True)))), children=[password, user_database])
schema = DynOptionDescription(name="schema_", doc="schema_", suffixes=Calculation(calc_value, Params((ParamOption(schema_names, notraisepropertyerror=True)))), children=[databases])
user_database = DynOptionDescription(name="user_database_", doc="user database", identifiers=Calculation(calc_value, Params((ParamOption(schema_names, notraisepropertyerror=True)))), children=[name, login, password2])
databases = DynOptionDescription(name="db_", doc="database", identifiers=Calculation(calc_value, Params((ParamOption(schema_names, notraisepropertyerror=True)))), children=[password, user_database])
schema = DynOptionDescription(name="schema_", doc="schema_", identifiers=Calculation(calc_value, Params((ParamOption(schema_names, notraisepropertyerror=True)))), children=[databases])
socle = OptionDescription(name="socle", doc="socle", children=[schema, schema_names])
root = OptionDescription(name="baseoption", doc="baseoption", children=[socle])
cfg = Config(root)
@ -2757,8 +2800,8 @@ def test_option_dynoption_display_name():
password = StrOption(name="password", doc="password")
schema_names = StrOption(name="database_schemas", doc="database_schemas", multi=True, default=["schema1"])
user_database = OptionDescription(name="user_database", doc="user database", children=[password])
databases = DynOptionDescription(name="db_", doc="database", suffixes=Calculation(calc_value, Params((ParamOption(schema_names, notraisepropertyerror=True)))), children=[user_database])
schema = DynOptionDescription(name="schema_", doc="schema_", suffixes=Calculation(calc_value, Params((ParamOption(schema_names, notraisepropertyerror=True)))), children=[databases])
databases = DynOptionDescription(name="db_", doc="database", identifiers=Calculation(calc_value, Params((ParamOption(schema_names, notraisepropertyerror=True)))), children=[user_database])
schema = DynOptionDescription(name="schema_", doc="schema_", identifiers=Calculation(calc_value, Params((ParamOption(schema_names, notraisepropertyerror=True)))), children=[databases])
socle = OptionDescription(name="socle", doc="socle", children=[schema, schema_names])
root = OptionDescription(name="baseoption", doc="baseoption", children=[socle])
cfg = Config(root, display_name=display_name)
@ -2768,7 +2811,7 @@ def test_option_dynoption_display_name():
def test_option_dynoption_param_information():
info1 = StrOption("info1", '', Calculation(calc_value, Params(ParamSelfInformation('key'))), informations={'key': 'value'})
info2 = StrOption("info2", '', Calculation(calc_value, Params(ParamInformation('key', option=info1))))
schema = DynOptionDescription(name="schema_", doc="schema_", suffixes=Calculation(calc_value, Params(ParamValue(['1', '2']))), children=[info1, info2])
schema = DynOptionDescription(name="schema_", doc="schema_", identifiers=Calculation(calc_value, Params(ParamValue(['1', '2']))), children=[info1, info2])
root = OptionDescription(name="baseoption", doc="baseoption", children=[schema])
cfg = Config(root, display_name=display_name)
assert parse_od_get(cfg.value.get()) == {'schema_1.info1': 'value', 'schema_1.info2': 'value', 'schema_2.info1': 'value', 'schema_2.info2': 'value'}
@ -2777,10 +2820,10 @@ def test_option_dynoption_param_information():
def test_callback_list_dyndescription_information():
st = StrOption('st', '', Calculation(return_list2, Params(ParamSuffix())), multi=True, properties=('notunique',))
dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list, Params(ParamInformation('suffix'))))
st = StrOption('st', '', Calculation(return_list2, Params(ParamIdentifier())), multi=True, properties=('notunique',))
dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list, Params(ParamInformation('identifier'))))
od = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od], informations={'suffix': ['ival1', 'ival2']})
od2 = OptionDescription('od', '', [od], informations={'identifier': ['ival1', 'ival2']})
cfg = Config(od2)
owner = cfg.owner.get()
assert cfg.option('od.dodival1.st').value.get() == ['ival1', 'val2']
@ -2792,16 +2835,16 @@ def test_callback_list_dyndescription_information():
assert cfg.option('od.dodival2.st').value.get() == ['ival2', 'val2']
assert cfg.option('od.dodival1.st').owner.get() == owner
assert cfg.option('od.dodival2.st').owner.isdefault()
cfg.information.set('suffix', ['ival3'])
cfg.information.set('identifier', ['ival3'])
assert cfg.option('od.dodival3.st').value.get() == ['ival3', 'val2']
# assert not list_sessions()
def test_callback_list_dyndescription_information_not_list():
st = StrOption('st', '', Calculation(return_list2, Params(ParamSuffix())), multi=True, properties=('notunique',))
dod = DynOptionDescription('dod', '', [st], suffixes=["sval1", Calculation(return_dynval, Params(ParamInformation('suffix')))])
st = StrOption('st', '', Calculation(return_list2, Params(ParamIdentifier())), multi=True, properties=('notunique',))
dod = DynOptionDescription('dod', '', [st], identifiers=["sval1", Calculation(return_dynval, Params(ParamInformation('identifier')))])
od = OptionDescription('od', '', [dod])
od2 = OptionDescription('od', '', [od], informations={'suffix': 'ival2'})
od2 = OptionDescription('od', '', [od], informations={'identifier': 'ival2'})
cfg = Config(od2)
owner = cfg.owner.get()
assert cfg.option('od.dodsval1.st').value.get() == ['sval1', 'val2']
@ -2813,6 +2856,6 @@ def test_callback_list_dyndescription_information_not_list():
assert cfg.option('od.dodival2.st').value.get() == ['ival2', 'val2']
assert cfg.option('od.dodsval1.st').owner.get() == owner
assert cfg.option('od.dodival2.st').owner.isdefault()
cfg.information.set('suffix', 'ival3')
cfg.information.set('identifier', 'ival3')
assert cfg.option('od.dodival3.st').value.get() == ['ival3', 'val2']
# assert not list_sessions()

View file

@ -681,7 +681,7 @@ def test_mandatory_od_disabled():
# assert not list_sessions()
def return_list(val=None, suffix=None):
def return_list(val=None, identifier=None):
if val:
return val
else:
@ -690,7 +690,7 @@ def return_list(val=None, suffix=None):
#def test_mandatory_dyndescription():
# st = StrOption('st', '', properties=('mandatory',))
# dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list))
# dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list))
# od = OptionDescription('od', '', [dod])
# od2 = OptionDescription('od', '', [od])
# cfg = Config(od2)
@ -701,7 +701,7 @@ def return_list(val=None, suffix=None):
#def test_mandatory_dyndescription_context():
# val1 = StrOption('val1', '', ['val1', 'val2'], multi=True)
# st = StrOption('st', '', properties=('mandatory',))
# dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list, Params(ParamOption(val1))))
# dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list, Params(ParamOption(val1))))
# od = OptionDescription('od', '', [dod, val1])
# od2 = OptionDescription('od', '', [od])
# cfg = Config(od2)

View file

@ -20,7 +20,7 @@ def a_func():
return None
def display_name(*args):
def display_name(*args, with_quote=False):
return 'display_name'

View file

@ -945,7 +945,7 @@ def test_consistency_leader_and_followers_leader_mandatory_transitive():
try:
cfg.option('val1.val2', 0).value.get()
except PropertiesOptionError as error:
assert str(error) == str(_('cannot access to {0} "{1}" because has {2} {3}').format('option', 'val2', _('property'), '"disabled"'))
assert str(error) == str(_('cannot access to {0} {1} because has {2} {3}').format('option', '"val2"', _('property'), '"disabled"'))
else:
raise Exception('must raises')
assert list(cfg.value.mandatory()) == []
@ -1502,6 +1502,22 @@ def test_leadership_callback_description(config_type):
# assert not list_sessions()
def test_leadership_callback_outside(config_type):
st1 = StrOption('st1', "", multi=True)
st2 = StrOption('st2', "", multi=True, default_multi='val2')
stm = Leadership('st1', '', [st1, st2])
st3 = StrOption('st3', "", Calculation(return_value, Params(ParamOption(st2))), multi=True)
st = OptionDescription('st', '', [stm, st3])
od = OptionDescription('od', '', [st])
od2 = OptionDescription('od', '', [od])
cfg = Config(od2)
cfg = get_config(cfg, config_type)
owner = cfg.owner.get()
cfg.option('od.st.st1.st1').value.set(['yes'])
assert parse_od_get(cfg.value.get()) == {'od.st.st1.st1': [{'od.st.st1.st1': 'yes', 'od.st.st1.st2': 'val2'}], 'od.st.st3': ['val2']}
## assert not list_sessions()
def test_callback_raise():
opt1 = BoolOption('opt1', 'Option 1', Calculation(return_raise))
opt2 = BoolOption('opt2', 'Option 2', Calculation(return_valueerror))

View file

@ -933,7 +933,7 @@ def test_set_modified_value():
#
#
def test_pprint():
msg_error = _("cannot access to {0} \"{1}\" because has {2} {3}")
msg_error = _("cannot access to {0} {1} because has {2} {3}")
msg_is_not = _('the value of "{0}" is not {1}')
msg_is = _('the value of "{0}" is {1}')
properties = _('properties')
@ -988,7 +988,7 @@ def test_pprint():
list_disabled = '"disabled" (' + display_list([msg_is.format('Test int option', '"1"'), msg_is.format('string2', '"string"')], add_quote=False) + ')'
list_hidden = '"hidden" (' + msg_is_not.format('Test int option', display_list([2, 3, 4], separator='or', add_quote=True)) + ')'
assert str(err) == _(msg_error.format('option', 'Test string option', properties, display_list([list_disabled, list_hidden], add_quote=False)))
assert str(err) == _(msg_error.format('option', '"Test string option"', properties, display_list([list_disabled, list_hidden], add_quote=False)))
del err
err = None
@ -997,7 +997,7 @@ def test_pprint():
except PropertiesOptionError as error:
err = error
assert str(err) == msg_error.format('optiondescription', 'options', prop, '"hidden" (' + msg_is.format('Test int option', '"1"') + ')')
assert str(err) == msg_error.format('optiondescription', '"options"', prop, '"hidden" (' + msg_is.format('Test int option', '"1"') + ')')
#err = None
#try:
@ -1018,7 +1018,7 @@ def test_pprint():
except Exception as error:
err = error
assert str(err) == msg_error.format('option', 'string', properties, display_list(['disabled', 'hidden'], add_quote=True))
assert str(err) == msg_error.format('option', '"string"', properties, display_list(['disabled', 'hidden'], add_quote=True))
del err
err = None
@ -1027,13 +1027,13 @@ def test_pprint():
except Exception as error:
err = error
assert str(err) == msg_error.format('option', 'string3', prop, '"hidden"')
assert str(err) == msg_error.format('option', '"string3"', prop, '"hidden"')
del err
# assert not list_sessions()
def test_pprint_not_todict():
msg_error = _("cannot access to {0} \"{1}\" because has {2} {3}")
msg_error = _("cannot access to {0} {1} because has {2} {3}")
msg_is_not = _('the value of "{0}" is not {1}')
msg_is = _('the value of "{0}" is {1}')
properties = _('properties')
@ -1088,7 +1088,7 @@ def test_pprint_not_todict():
list_disabled = '"disabled"'
list_hidden = '"hidden"'
assert str(err) == _(msg_error.format('option', 'Test string option', properties, display_list([list_disabled, list_hidden], add_quote=False)))
assert str(err) == _(msg_error.format('option', '"Test string option"', properties, display_list([list_disabled, list_hidden], add_quote=False)))
del err
err = None
@ -1097,7 +1097,7 @@ def test_pprint_not_todict():
except PropertiesOptionError as error:
err = error
assert str(err) == msg_error.format('optiondescription', 'options', prop, '"hidden"')
assert str(err) == msg_error.format('optiondescription', '"options"', prop, '"hidden"')
err = None
try:
@ -1105,7 +1105,7 @@ def test_pprint_not_todict():
except Exception as error:
err = error
assert str(err) == msg_error.format('option', 'string', properties, display_list(['disabled', 'hidden'], add_quote=True))
assert str(err) == msg_error.format('option', '"string"', properties, display_list(['disabled', 'hidden'], add_quote=True))
del err
err = None
@ -1114,7 +1114,7 @@ def test_pprint_not_todict():
except Exception as error:
err = error
assert str(err) == msg_error.format('option', 'string3', prop, '"hidden"')
assert str(err) == msg_error.format('option', '"string3"', prop, '"hidden"')
del err
# assert not list_sessions()

View file

@ -196,10 +196,10 @@ def test_requires_same_action(config_type):
submsg = '"disabled" (' + _('the value of "{0}" is {1}').format('activate_service', '"False"') + ')'
if config_type == 'tiramisu':
submsg = '"new" (' + _('the value of "{0}" is {1}').format('activate_service', '"False"') + ')'
submsg = '"disabled" (' + str(_('cannot access to {0} "{1}" because has {2} {3}').format('option', 'activate_service_web', _('property'), submsg)) + ')'
assert str(err) == str(_('cannot access to {0} "{1}" because has {2} {3}').format('option', 'ip_address_service_web', _('property'), submsg))
submsg = '"disabled" (' + str(_('cannot access to {0} {1} because has {2} {3}').format('option', '"activate_service_web"', _('property'), submsg)) + ')'
assert str(err) == str(_('cannot access to {0} {1} because has {2} {3}').format('option', '"ip_address_service_web"', _('property'), submsg))
#access to cache
assert str(err) == str(_('cannot access to {0} "{1}" because has {2} {3}').format('option', 'ip_address_service_web', _('property'), submsg))
assert str(err) == str(_('cannot access to {0} {1} because has {2} {3}').format('option', '"ip_address_service_web"', _('property'), submsg))
else:
# FIXME
assert str(err) == 'error'
@ -593,7 +593,7 @@ def test_requires_transitive_hidden_disabled_multiple(config_type):
cfg.option('activate_service').value.set(False)
except ConfigError as err:
req = err
error_msg = str(_('unable to transform tiramisu object to dict: {}').format(_('cannot access to option "{0}" because required option "{1}" has {2} {3}').format('ip_address_service_web', 'activate_service_web', _('property'), '"disabled"')))
error_msg = str(_('unable to transform tiramisu object to dict: {}').format(_('cannot access to option {0} because required option {1} has {2} {3}').format('ip_address_service_web', '"activate_service_web"', _('property'), '"disabled"')))
else:
cfg.option('activate_service').value.set(False)
#
@ -609,7 +609,7 @@ def test_requires_transitive_hidden_disabled_multiple(config_type):
cfg.option('ip_address_service_web').value.get()
except ConfigError as err:
req = err
error_msg = str(_('unable to carry out a calculation for "{}", {}').format('ip_address_service_web', _('cannot access to {0} "{1}" because has {2} {3}').format('option', 'activate_service_web', _('property'), display_list(['disabled'], add_quote=True))))
error_msg = str(_('unable to carry out a calculation for {}, {}').format('"ip_address_service_web"', _('cannot access to {0} {1} because has {2} {3}').format('option', '"activate_service_web"', _('property'), display_list(['disabled'], add_quote=True))))
assert req, "ip_address_service_web should raise ConfigError"
assert str(req) == error_msg
del req
@ -621,14 +621,14 @@ def test_requires_transitive_hidden_disabled_multiple(config_type):
cfg = get_config(cfg_ori, config_type)
except ConfigError as err:
req = err
error_msg = str(_('unable to transform tiramisu object to dict: {}').format(_('cannot access to option "{0}" because required option "{1}" has {2} {3}').format('ip_address_service_web', 'activate_service_web', _('properties'), '"disabled" {} "hidden"'.format(_('and')))))
error_msg = str(_('unable to transform tiramisu object to dict: {}').format(_('cannot access to option "{0}" because required option {1} has {2} {3}').format('ip_address_service_web', '"activate_service_web"', _('properties'), '"disabled" {} "hidden"'.format(_('and')))))
else:
cfg = get_config(cfg_ori, config_type)
try:
cfg.option('ip_address_service_web').value.get()
except ConfigError as err:
req = err
error_msg = str(_('unable to carry out a calculation for "{}", {}').format('ip_address_service_web', _('cannot access to {0} "{1}" because has {2} {3}').format('option', 'activate_service_web', _('properties'), display_list(['hidden', 'disabled'], add_quote=True))))
error_msg = str(_('unable to carry out a calculation for {}, {}').format('"ip_address_service_web"', _('cannot access to {0} {1} because has {2} {3}').format('option', '"activate_service_web"', _('properties'), display_list(['hidden', 'disabled'], add_quote=True))))
assert req, "ip_address_service_web should raise ConfigError"
assert str(req) == error_msg
del req

View file

@ -18,7 +18,7 @@ from .function import calc_value, calc_value_property_help, valid_ip_netmask, \
valid_network_netmask, valid_in_network, valid_broadcast, \
valid_not_equal, function_waiting_for_dict
from .autolib import Calculation, Params, ParamOption, ParamDynOption, ParamSelfOption, \
ParamValue, ParamIndex, ParamSuffix, ParamInformation, ParamSelfInformation
ParamValue, ParamIndex, ParamIdentifier, ParamInformation, ParamSelfInformation
from .option import *
from .error import ConfigError
from .api import Config, MetaConfig, GroupConfig, MixConfig
@ -33,7 +33,7 @@ allfuncs = ['Calculation',
'ParamSelfOption',
'ParamValue',
'ParamIndex',
'ParamSuffix',
'ParamIdentifier',
'ParamInformation',
'ParamSelfInformation',
'MetaConfig',

View file

@ -74,7 +74,7 @@ class PropertiesOptionError(AttributeError):
self._opt_type = 'optiondescription'
else:
self._opt_type = 'option'
self._name = subconfig.option.impl_get_display_name(subconfig)
self._name = subconfig.option.impl_get_display_name(subconfig, with_quote=True)
self._orig_opt = None
self._subconfig = subconfig
self.proptype = proptype
@ -104,18 +104,18 @@ class PropertiesOptionError(AttributeError):
prop_msg = _('properties')
if properties == ['frozen']:
if self._orig_opt:
msg = 'cannot modify the {0} "{1}" because "{2}" has {3} {4}'
msg = 'cannot modify the {0} {1} because "{2}" has {3} {4}'
else:
msg = 'cannot modify the {0} "{1}" because has {2} {3}'
msg = 'cannot modify the {0} {1} because has {2} {3}'
else:
if self._orig_opt:
msg = 'cannot access to {0} "{1}" because "{2}" has {3} {4}'
msg = 'cannot access to {0} {1} because "{2}" has {3} {4}'
else:
msg = 'cannot access to {0} "{1}" because has {2} {3}'
msg = 'cannot access to {0} {1} because has {2} {3}'
if self._orig_opt:
# FIXME _orig_opt ?
self.msg = _(msg).format(self._opt_type,
self._orig_opt.impl_get_display_name(subconfig),
self._orig_opt.impl_get_display_name(subconfig, with_quote=True),
self._name,
prop_msg,
properties_msg)

View file

@ -580,8 +580,8 @@ msgstr ""
"une liste ({})"
#: tiramisu/option/dynoptiondescription.py:92
msgid "invalid suffix \"{}\" for option \"{}\""
msgstr "suffixe \"{}\" invalide pour l'option \"{}\""
msgid "invalid identifier \"{}\" for option \"{}\""
msgstr "identifiant \"{}\" invalide pour l'option \"{}\""
#: tiramisu/option/dynoptiondescription.py:101
msgid "DynOptionDescription callback return a list with multiple value \"{}\""

View file

@ -405,11 +405,11 @@ msgid "some characters are uppercase"
msgstr ""
#: tiramisu/option/dynoptiondescription.py:65
msgid "suffixes in dynoptiondescription has to be a calculation"
msgid "identifiers in dynoptiondescription has to be a calculation"
msgstr ""
#: tiramisu/option/dynoptiondescription.py:109
msgid "invalid suffix \"{}\" for option \"{}\""
msgid "invalid identifier \"{}\" for option \"{}\""
msgstr ""
#: tiramisu/option/emailoption.py:34
@ -702,7 +702,7 @@ msgid "set owner \"{0}\" is forbidden"
msgstr ""
#: tiramisu/value.py:636
msgid "index {index} is greater than the length {length} for option \"{option_bag.option.impl_get_display_name()}\""
msgid "index {index} is greater than the length {length} for option {option_bag.option.impl_get_display_name(with_quote=True)}"
msgstr ""
#: tiramisu/value.py:695

View file

@ -58,7 +58,7 @@ class Base:
'_has_dependency',
'_dependencies',
'_dependencies_information',
'_suffixes_dependencies',
'_identifiers_dependencies',
'__weakref__'
)
@ -130,21 +130,21 @@ class Base:
return set(context_od._dependencies) | ret # pylint: disable=protected-access
return ret
def _get_suffixes_dependencies(self) -> Set[str]:
return getattr(self, '_suffixes_dependencies', STATIC_TUPLE)
def _get_identifiers_dependencies(self) -> Set[str]:
return getattr(self, '_identifiers_dependencies', STATIC_TUPLE)
def _add_dependency(self,
option,
is_suffix: bool=False,
is_identifier: bool=False,
) -> None:
woption = weakref.ref(option)
options = self.get_dependencies(None)
options.add(woption)
self._dependencies = tuple(options) # pylint: disable=attribute-defined-outside-init
if is_suffix:
options = list(self._get_suffixes_dependencies())
if is_identifier:
options = list(self._get_identifiers_dependencies())
options.append(woption)
self._suffixes_dependencies = tuple(options) # pylint: disable=attribute-defined-outside-init
self._identifiers_dependencies = tuple(options) # pylint: disable=attribute-defined-outside-init
def impl_is_optiondescription(self) -> bool:
"""option is an option description
@ -233,7 +233,7 @@ class Base:
if default is not undefined:
return default
# pylint: disable=no-member
raise ValueError(_(f'information\'s item for "{self.impl_get_display_name(subconfig)}" '
raise ValueError(_(f'information\'s item for {self.impl_get_display_name(subconfig, with_quote=True)} '
f'not found: "{key}"'))
def _set_information(self,
@ -298,22 +298,29 @@ class BaseOption(Base):
try:
return self._path
except AttributeError as err:
raise AttributeError(_(f'"{self.impl_get_display_name(None)}" not part of any Config')) \
raise AttributeError(_(f'{self.impl_get_display_name(None, with_quote=True)} not part of any Config')) \
from err
def impl_get_display_name(self,
subconfig: "SubConfig",
*,
with_quote: bool=False,
) -> str:
"""get display name
"""
if hasattr(self, '_display_name_function'):
return self._display_name_function(self, subconfig)
return self._display_name_function(self,
subconfig,
with_quote=with_quote,
)
name = self._get_information(subconfig, 'doc', None)
if name is None or name == '':
if subconfig and subconfig.path:
name = subconfig.path.rsplit('.', 1)[-1]
else:
name = self._name
if with_quote:
return f'"{name}"'
return name
def reset_cache(self,
@ -341,29 +348,29 @@ class BaseOption(Base):
def value_dependencies(self,
value: Any,
is_suffix: bool=False,
is_identifier: bool=False,
) -> Any:
"""parse dependancies to add dependencies
"""
if isinstance(value, list):
for val in value:
if isinstance(value, list):
self.value_dependencies(val, is_suffix)
self.value_dependencies(val, is_identifier)
elif isinstance(value, Calculation):
self.value_dependency(val, is_suffix)
self.value_dependency(val, is_identifier)
elif isinstance(value, Calculation):
self.value_dependency(value, is_suffix)
self.value_dependency(value, is_identifier)
def value_dependency(self,
value: Any,
is_suffix: bool=False,
is_identifier: bool=False,
) -> Any:
"""parse dependancy to add dependencies
"""
for param in chain(value.params.args, value.params.kwargs.values()):
if isinstance(param, ParamOption):
# pylint: disable=protected-access
param.option._add_dependency(self, is_suffix=is_suffix)
param.option._add_dependency(self, is_identifier=is_identifier)
self._has_dependency = True
elif isinstance(param, ParamInformation):
dest = self

View file

@ -39,7 +39,7 @@ NAME_REGEXP = re.compile(r'^[a-zA-Z\d\-_]*$')
class DynOptionDescription(OptionDescription):
"""dyn option description
"""
__slots__ = ('_suffixes',
__slots__ = ('_identifiers',
'_subdyns',
)
@ -47,7 +47,7 @@ class DynOptionDescription(OptionDescription):
name: str,
doc: str,
children: List[BaseOption],
suffixes: Calculation,
identifiers: Calculation,
**kwargs,
) -> None:
# pylint: disable=too-many-arguments
@ -60,29 +60,22 @@ class DynOptionDescription(OptionDescription):
wself = weakref.ref(self)
for child in children:
child._setsubdyn(wself)
# add suffixes
self.value_dependencies(suffixes, is_suffix=True)
# if __debug__ and not isinstance(suffixes, Calculation):
# raise ConfigError(_('suffixes in dynoptiondescription has to be a calculation'))
# for param in chain(suffixes.params.args, suffixes.params.kwargs.values()):
# if isinstance(param, ParamOption):
# param.option._add_dependency(self,
# is_suffix=True,
# )
self._suffixes = suffixes
# add identifiers
self.value_dependencies(identifiers, is_identifier=True)
self._identifiers = identifiers
def convert_suffix_to_path(self,
suffix: Any,
def convert_identifier_to_path(self,
identifier: Any,
) -> str:
"""convert suffix to use it to a path
"""convert identifier to use it to a path
"""
if suffix is None:
if identifier is None:
return None
if not isinstance(suffix, str):
suffix = str(suffix)
if '.' in suffix:
suffix = suffix.replace('.', '_')
return suffix
if not isinstance(identifier, str):
identifier = str(identifier)
if '.' in identifier:
identifier = identifier.replace('.', '_')
return identifier
def impl_is_dynoptiondescription(self) -> bool:
return True
@ -92,34 +85,34 @@ class DynOptionDescription(OptionDescription):
) -> bool:
return option == self
def impl_getname(self, suffix=None) -> str:
def impl_getname(self, identifier=None) -> str:
"""get name
"""
name = super().impl_getname()
if suffix is None:
if identifier is None:
return name
path_suffix = self.convert_suffix_to_path(suffix)
return name + path_suffix
path_identifier = self.convert_identifier_to_path(identifier)
return name + path_identifier
def get_suffixes(self,
def get_identifiers(self,
parent: 'SubConfig',
*,
uncalculated: bool=False,
) -> List[str]:
"""get dynamic suffixes
"""get dynamic identifiers
"""
subconfig = parent.get_child(self,
None,
False,
properties=None,
)
suffixes = self._suffixes
if isinstance(suffixes, list):
suffixes = suffixes.copy()
identifiers = self._identifiers
if isinstance(identifiers, list):
identifiers = identifiers.copy()
if uncalculated:
return suffixes
return identifiers
values = get_calculated_value(subconfig,
suffixes,
identifiers,
validate_properties=False,
)[0]
if values is None:
@ -127,19 +120,19 @@ class DynOptionDescription(OptionDescription):
values_ = []
if __debug__:
if not isinstance(values, list):
raise ValueError(_('DynOptionDescription suffixes for '
f'option "{self.impl_get_display_name(subconfig)}", is not '
raise ValueError(_('DynOptionDescription identifiers for '
f'option {self.impl_get_display_name(subconfig, with_quote=True)}, is not '
f'a list ({values})'))
for val in values:
cval = self.convert_suffix_to_path(val)
cval = self.convert_identifier_to_path(val)
if not isinstance(cval, str) or re.match(NAME_REGEXP, cval) is None:
if __debug__ and cval is not None:
raise ValueError(_('invalid suffix "{}" for option "{}"'
raise ValueError(_('invalid identifier "{}" for option {}'
'').format(cval,
self.impl_get_display_name(subconfig)))
self.impl_get_display_name(subconfig, with_quote=True)))
else:
values_.append(val)
if __debug__ and len(values_) > len(set(values_)):
raise ValueError(_(f'DynOptionDescription "{self._name}" suffixes return a list with '
raise ValueError(_(f'DynOptionDescription "{self._name}" identifiers return a list with '
f'same values "{values_}"'''))
return values_

View file

@ -47,6 +47,8 @@ class Leadership(OptionDescription):
children: List[BaseOption],
**kwargs,
) -> None:
if 'group_type' in kwargs:
raise LeadershipError(_('cannot set "group_type" attribute for a Leadership'))
super().__init__(name,
doc,
children,
@ -81,17 +83,17 @@ class Leadership(OptionDescription):
) -> None:
if child.impl_is_symlinkoption():
if not index:
raise ValueError(_('leadership "{0}" shall not have '
"a symlinkoption").format(self.impl_get_display_name(None)))
raise ValueError(_('leadership {0} shall not have '
"a symlinkoption").format(self.impl_get_display_name(None, with_quote=True)))
return
if not isinstance(child, Option):
raise ValueError(_('leadership "{0}" shall not have '
'a subgroup').format(self.impl_get_display_name(None)))
raise ValueError(_('leadership {0} shall not have '
'a subgroup').format(self.impl_get_display_name(None, with_quote=True)))
if not child.impl_is_multi():
raise ValueError(_('only multi option allowed in leadership "{0}" but option '
'"{1}" is not a multi'
'').format(self.impl_get_display_name(None),
child.impl_get_display_name(None)))
raise ValueError(_('only multi option allowed in leadership {0} but option '
'{1} is not a multi'
'').format(self.impl_get_display_name(None, with_quote=True),
child.impl_get_display_name(None, with_quote=True)))
def _check_default_value(self, child: BaseOption):
if child.impl_is_symlinkoption():
@ -110,8 +112,8 @@ class Leadership(OptionDescription):
calculation = isinstance(default, Calculation)
if not calculation:
raise ValueError(_('not allowed default value for follower option '
f'"{child.impl_get_display_name(None)}" in leadership '
f'"{self.impl_get_display_name(None)}"'))
f'{child.impl_get_display_name(None, with_quote=True)} in leadership '
f'{self.impl_get_display_name(None, with_quote=True)}'))
def _setsubdyn(self,
subdyn,

View file

@ -127,19 +127,19 @@ class Option(BaseOption):
str_err = str(err)
if not str_err:
raise ValueError(_('invalid default_multi value "{0}" '
'for option "{1}"').format(str(value),
self.impl_get_display_name(None))
'for option {1}').format(str(value),
self.impl_get_display_name(None, with_quote=True))
) from err
raise ValueError(_(f'invalid default_multi value "{value}" for option '
f'"{self.impl_get_display_name(None)}", {str_err}')
f'{self.impl_get_display_name(None, with_quote=True)}, {str_err}')
) from err
if _multi is submulti:
if not isinstance(default_multi, Calculation):
if not isinstance(default_multi, list):
raise ValueError(_('invalid default_multi value "{0}" '
'for option "{1}", must be a list for a submulti'
'for option {1}, must be a list for a submulti'
'').format(str(default_multi),
self.impl_get_display_name(None)))
self.impl_get_display_name(None, with_quote=True)))
for value in default_multi:
test_multi_value(value)
else:
@ -274,14 +274,14 @@ class Option(BaseOption):
if _index is not None and subconfig.index == _index:
lsubconfig = subconfig
else:
suffix = subconfig.suffixes
if suffix is not None:
suffix = suffix[-1]
identifier = subconfig.identifiers
if identifier is not None:
identifier = identifier[-1]
lsubconfig = subconfig.parent.get_child(subconfig.option,
_index,
False,
properties=subconfig.properties,
suffix=suffix,
identifier=identifier,
name=subconfig.path.rsplit('.', 1)[-1],
check_index=False,
)
@ -308,9 +308,7 @@ class Option(BaseOption):
if _value is None:
return
if isinstance(_value, list):
raise ValueError(_('which must not be a list').format(_value,
self.impl_get_display_name(subconfig)),
)
raise ValueError(_('which must not be a list'))
if isinstance(_value, Calculation) and not subconfig:
return
# option validation

View file

@ -220,7 +220,7 @@ class OptionDescriptionWalk(CacheOptionDescription):
config_bag: ConfigBag,
parent: 'SubConfig',
*,
with_suffix: bool=False,
with_identifier: bool=False,
allow_dynoption: bool=False,
) -> Union[BaseOption]:
"""get a child
@ -235,32 +235,24 @@ class OptionDescriptionWalk(CacheOptionDescription):
for child in self._children[1]: # pylint: disable=no-member
if not child.impl_is_dynoptiondescription():
continue
for suffix in child.get_suffixes(parent):
if name != child.impl_getname(suffix):
for identifier in child.get_identifiers(parent):
if name != child.impl_getname(identifier):
continue
if not with_suffix:
if not with_identifier:
return child
return suffix, child
return identifier, child
if self.impl_get_group_type() == groups.root: # pylint: disable=no-member
raise AttributeError(_(f'unknown option "{name}" '
'in root optiondescription'
))
raise AttributeError(_(f'unknown option "{name}" '
f'in optiondescription "{self.impl_get_display_name(parent)}"'
f'in optiondescription {self.impl_get_display_name(parent, with_quote=True)}'
))
def get_children(self) -> List[BaseOption]:
"""get children
"""
return self._children[1]
# for child in self._children[1]:
# if config_bag is not undefined and child.impl_is_dynoptiondescription():
# yield from self.get_suffixed_children([],
# config_bag,
# child,
# )
# else:
# yield child
def get_children_recursively(self,
bytype: Optional[BaseOption],
@ -268,7 +260,7 @@ class OptionDescriptionWalk(CacheOptionDescription):
config_bag: ConfigBag,
self_opt: BaseOption=None,
*,
option_suffixes: Optional[list]=None
option_identifiers: Optional[list]=None
) -> Iterator[Union[BaseOption]]:
"""get children recursively
"""
@ -299,6 +291,7 @@ class OptionDescription(OptionDescriptionWalk):
*,
properties=None,
informations: Optional[Dict]=None,
group_type: Optional[groups.GroupType]=groups.default,
) -> None:
"""
:param children: a list of options (including optiondescriptions)
@ -339,7 +332,8 @@ class OptionDescription(OptionDescriptionWalk):
old = child
self._children = children_
# the group_type is useful for filtering OptionDescriptions in a config
self._group_type = groups.default
self._group_type = None
self.impl_set_group_type(group_type)
def _setsubdyn(self,
subdyn,
@ -373,7 +367,7 @@ class OptionDescription(OptionDescriptionWalk):
that lives in `setting.groups`
"""
if __debug__:
if self._group_type != groups.default:
if self._group_type is not None and self._group_type != groups.default:
raise ValueError(_('cannot change group_type if already set '
'(old {0}, new {1})').format(self._group_type,
group_type))
@ -388,22 +382,6 @@ class OptionDescription(OptionDescriptionWalk):
"""get the group type of option description
"""
return self._group_type
#
# def to_dynoption(self,
# rootpath: str,
# suffixes: Optional[list],
# #ori_dyn,
# ) -> Union[SubDynOptionDescription]:
# """get syn dyn option description
# """
# if self.impl_is_dynoptiondescription():
# obj = SynDynOptionDescription
# else:
# obj = SubDynOptionDescription
# return obj(self,
# rootpath,
# suffixes,
# )
def impl_is_dynsymlinkoption(self) -> bool:
"""option is not a dyn symlink option

View file

@ -151,7 +151,7 @@ class Requires(object):
form,
current_action,
):
for requires in childapi.properties(uncalculated=True):
for requires in childapi.property.get(uncalculated=True):
if not isinstance(requires, str):
option = requires.params.kwargs['condition'].option
expected = [requires.params.kwargs['expected'].value]
@ -206,7 +206,7 @@ class Requires(object):
values = self.tiramisu_web.get_enum(require_option,
require_option.ismulti(),
option_path,
require_option.properties())
require_option.property.get())
for value in values:
if value not in expected:
self.requires.setdefault(path,
@ -333,7 +333,7 @@ class TiramisuDict:
def get_list(self, root, subchildapi):
#ret = []
for childapi in subchildapi.list('all'):
for childapi in subchildapi.list():
childname = childapi.name()
if root is None:
path = childname
@ -381,7 +381,7 @@ class TiramisuDict:
try:
if subchildapi is None:
if root is None:
subchildapi = self.config.unrestraint.option
subchildapi = self.config.unrestraint
else:
subchildapi = self.config.unrestraint.option(root)
isleadership = False
@ -395,7 +395,7 @@ class TiramisuDict:
if not childapi.isoptiondescription() and childapi.isfollower():
props_no_requires = set()
else:
props_no_requires = set(childapi.properties())
props_no_requires = set(childapi.property.get())
if form is not None:
self.requires.add(path,
childapi,
@ -452,13 +452,13 @@ class TiramisuDict:
else:
web_type = childapi.get().__class__.__name__.lower()[:-6]
web_type = CONVERT_WEB_TYPE.get(web_type, web_type)
value = childapi.default()
value = childapi.value.default()
if value == []:
value = None
is_multi = childapi.ismulti()
if is_multi:
defaultmulti = childapi.defaultmulti()
defaultmulti = childapi.value.defaultmulti()
if defaultmulti == []:
defaultmulti = None
else:
@ -756,9 +756,10 @@ class TiramisuDict:
except PropertiesOptionError as err:
config_bag = self.config._config_bag
settings = config_bag.context.get_settings()
if settings._calc_raises_properties(config_bag.properties,
config_bag.permissives,
set(err.proptype)):
if settings._calc_raises_properties(childapi._subconfig,
set(err.proptype),
not_unrestraint=True,
):
obj['hidden'] = True
obj['display'] = False
value = childapi.value.get()

View file

@ -186,7 +186,7 @@ class Values:
# calculated value is a new value, so reset cache
subconfig.config_bag.context.reset_cache(subconfig)
# and manage force_store_value
self._set_force_value_suffix(subconfig,
self._set_force_value_identifier(subconfig,
value,
)
@ -246,6 +246,14 @@ class Values:
ori_value,
owner,
)
if 'force_store_value' in setting_properties and subconfig.option.impl_is_leader():
leader = subconfig.option.impl_get_leadership()
parent = subconfig.parent
parent._length = len(value)
leader.follower_force_store_value(value,
parent,
owners.forced,
)
validator = 'validator' in setting_properties and \
'demoting_error_warning' not in setting_properties
if validator and not has_calculation:
@ -257,14 +265,6 @@ class Values:
elif 'validator' in setting_properties and has_calculation:
cache = subconfig.config_bag.context.get_values_cache()
cache.delcache(subconfig.path)
if 'force_store_value' in setting_properties and subconfig.option.impl_is_leader():
leader = subconfig.option.impl_get_leadership()
parent = subconfig.parent
parent._length = len(value)
leader.follower_force_store_value(value,
parent,
owners.forced,
)
def setvalue_validation(self,
subconfig: "SubConfig",
@ -306,7 +306,7 @@ class Values:
value,
owner,
)
self._set_force_value_suffix(subconfig,
self._set_force_value_identifier(subconfig,
value,
)
@ -320,11 +320,11 @@ class Values:
"""
self._values.setdefault(path, {})[index] = [value, owner]
def _set_force_value_suffix(self,
def _set_force_value_identifier(self,
subconfig: 'SubConfig',
suffix_values,
identifier_values,
) -> None:
""" force store value for an option for suffixes
""" force store value for an option for identifiers
"""
# pylint: disable=too-many-locals
if 'force_store_value' not in subconfig.config_bag.properties:
@ -332,7 +332,7 @@ class Values:
config_bag = subconfig.config_bag
context = config_bag.context
for woption in subconfig.option._get_suffixes_dependencies(): # pylint: disable=protected-access
for woption in subconfig.option._get_identifiers_dependencies(): # pylint: disable=protected-access
options = subconfig.get_common_child(woption(),
true_path=subconfig.path,
validate_properties=False,
@ -341,12 +341,12 @@ class Values:
options = [options]
for option in options:
parent = option.parent
for suffix in suffix_values:
name = option.option.impl_getname(suffix)
for identifier in identifier_values:
name = option.option.impl_getname(identifier)
opt_subconfig = parent.get_child(option.option,
None,
False,
suffix=suffix,
identifier=identifier,
name=name,
)
@ -630,7 +630,7 @@ class Values:
length = len(current_value)
if index >= length:
raise IndexError(_('index {index} is greater than the length {length} '
'for option "{subconfig.option.impl_get_display_name()}"'))
'for option {subconfig.option.impl_get_display_name(with_quote=True)}'))
current_value.pop(index)
leadership_subconfig = subconfig.parent
leadership_subconfig.option.pop(subconfig,