# coding: utf-8 from .autopath import do_autopath do_autopath() import pytest from tiramisu.setting import groups, owners from tiramisu import BoolOption, StrOption, ChoiceOption, IPOption, \ NetworkOption, NetmaskOption, IntOption, FloatOption, \ StrOption, PortOption, BroadcastOption, DomainnameOption, \ EmailOption, URLOption, UsernameOption, FilenameOption, SymLinkOption, \ OptionDescription, DynOptionDescription, SynDynOption, submulti, Leadership, \ Config, Params, ParamOption, ParamValue, ParamSuffix, ParamSelfOption, ParamIndex, Calculation, calc_value from tiramisu.error import PropertiesOptionError, ConfigError, ConflictError from tiramisu.storage import list_sessions class ConvertDynOptionDescription(DynOptionDescription): def convert_suffix_to_path(self, suffix): # remove dot with is illegal return suffix.replace('.', '') def teardown_function(function): assert list_sessions() == [], 'session list is not empty when leaving "{}"'.format(function.__name__) def return_true(value, param=None, suffix=None): if value == 'val' and param in [None, 'yes']: return raise ValueError('no value') def return_dynval(value='val', suffix=None): return value def return_list2(suffix): return [str(suffix), 'val2'] def return_list(val=None, suffix=None): if val: return val else: return ['val1', 'val2'] def return_list_dot(val=None, suffix=None): return ['val.1', 'val.2'] def return_same_list(*args, **kwargs): return ['val1', 'val1'] def return_wrong_list(*args, **kwargs): return ['---', ' '] def return_raise(suffix): raise Exception('error') def return_str(*args, **kwargs): return 'str' @pytest.mark.asyncio async def test_build_dyndescription(): st1 = StrOption('st', '') dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_list)) od1 = OptionDescription('od', '', [dod]) cfg = await Config(od1) assert await cfg.value.dict() == {'dodval1.stval1': None, 'dodval2.stval2': None} @pytest.mark.asyncio async def test_build_dyndescription_raise(): st1 = StrOption('st', '') dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_raise)) od1 = OptionDescription('od', '', [dod]) cfg = await Config(od1) with pytest.raises(ConfigError): await cfg.value.dict() @pytest.mark.asyncio async def test_build_dyndescription_not_list(): st1 = StrOption('st', '') dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_str)) od1 = OptionDescription('od', '', [dod]) cfg = await Config(od1) with pytest.raises(ValueError): await cfg.value.dict() @pytest.mark.asyncio async def test_subpath_dyndescription(): st1 = StrOption('st', '') dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_list)) od1 = OptionDescription('od', '', [dod]) od2 = OptionDescription('od', '', [od1]) cfg = await Config(od2) assert await cfg.value.dict() == {'od.dodval1.stval1': None, 'od.dodval2.stval2': None} @pytest.mark.asyncio async def test_list_dyndescription(): st = StrOption('st', '') dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list)) od = OptionDescription('od', '', [dod]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) assert await cfg.option('od.dodval1.stval1').value.get() is None assert await cfg.option('od.dodval2.stval2').value.get() is None @pytest.mark.asyncio async def test_unknown_dyndescription(): st = StrOption('st', '') dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list)) od = OptionDescription('od', '', [dod]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) with pytest.raises(AttributeError): await cfg.option('od.dodval3').value.get() with pytest.raises(AttributeError): await cfg.option('od.dodval1.novalue').value.get() with pytest.raises(AttributeError): await cfg.option('od.dodval1.stnoval1').value.get() @pytest.mark.asyncio async def test_getdoc_dyndescription(): st1 = StrOption('st', 'doc1') dod = DynOptionDescription('dod', 'doc2', [st1], suffixes=Calculation(return_list)) od1 = OptionDescription('od', '', [dod]) od2 = OptionDescription('od', '', [od1]) cfg = await Config(od2) assert await cfg.option('od.dodval1.stval1').option.name() == 'stval1' assert await cfg.option('od.dodval2.stval2').option.name() == 'stval2' assert await cfg.option('od.dodval1').option.name() == 'dodval1' assert await cfg.option('od.dodval2').option.name() == 'dodval2' assert await cfg.option('od.dodval1.stval1').option.doc() == 'doc1' assert await cfg.option('od.dodval2.stval2').option.doc() == 'doc1' assert await cfg.option('od.dodval1').option.doc() == 'doc2val1' assert await cfg.option('od.dodval2').option.doc() == 'doc2val2' @pytest.mark.asyncio async def test_mod_dyndescription(): st = StrOption('st', '') dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list)) od = OptionDescription('od', '', [dod]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) owner = await cfg.owner.get() # assert await cfg.option('od.dodval1.stval1').value.get() is None assert await cfg.option('od.dodval2.stval2').value.get() is None assert await cfg.option('od.dodval1.stval1').owner.isdefault() assert await cfg.option('od.dodval2.stval2').owner.isdefault() # await cfg.option('od.dodval1.stval1').value.set('yes') assert await cfg.option('od.dodval1.stval1').value.get() == 'yes' assert await cfg.option('od.dodval2.stval2').value.get() is None assert await cfg.option('od.dodval1.stval1').owner.get() == owner assert await cfg.option('od.dodval2.stval2').owner.isdefault() # await cfg.option('od.dodval2.stval2').value.set('no') assert await cfg.option('od.dodval1.stval1').value.get() == 'yes' assert await cfg.option('od.dodval2.stval2').value.get() == 'no' assert await cfg.option('od.dodval1.stval1').owner.get() == owner assert await cfg.option('od.dodval2.stval2').owner.get() == owner @pytest.mark.asyncio async def test_del_dyndescription(): st = StrOption('st', '') dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list)) od = OptionDescription('od', '', [dod]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) owner = await cfg.owner.get() assert await cfg.option('od.dodval1.stval1').value.get() is None assert await cfg.option('od.dodval2.stval2').value.get() is None await cfg.option('od.dodval1.stval1').value.set('yes') assert await cfg.option('od.dodval1.stval1').owner.get() == owner await cfg.option('od.dodval1.stval1').value.reset() assert await cfg.option('od.dodval1.stval1').owner.isdefault() @pytest.mark.asyncio async def test_multi_dyndescription(): st = StrOption('st', '', multi=True) dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list)) od = OptionDescription('od', '', [dod]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) owner = await cfg.owner.get() assert await cfg.option('od.dodval1.stval1').value.get() == [] assert await cfg.option('od.dodval2.stval2').value.get() == [] assert await cfg.option('od.dodval1.stval1').owner.isdefault() assert await cfg.option('od.dodval2.stval2').owner.isdefault() await cfg.option('od.dodval1.stval1').value.set(['yes']) assert await cfg.option('od.dodval1.stval1').value.get() == ['yes'] assert await cfg.option('od.dodval2.stval2').value.get() == [] assert await cfg.option('od.dodval1.stval1').owner.get() == owner assert await cfg.option('od.dodval2.stval2').owner.isdefault() await cfg.option('od.dodval2.stval2').value.set(['no']) assert await cfg.option('od.dodval1.stval1').value.get() == ['yes'] assert await cfg.option('od.dodval2.stval2').value.get() == ['no'] assert await cfg.option('od.dodval1.stval1').owner.get() == owner assert await cfg.option('od.dodval2.stval2').owner.get() == owner await cfg.option('od.dodval1.stval1').value.set(['yes', 'no']) assert await cfg.option('od.dodval1.stval1').value.get() == ['yes', 'no'] await cfg.option('od.dodval1.stval1').value.set(['yes']) assert await cfg.option('od.dodval1.stval1').value.get() == ['yes'] @pytest.mark.asyncio async def test_prop_dyndescription(): st = StrOption('st', '', properties=('test',)) dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list)) od = OptionDescription('od', '', [dod]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) assert set(await cfg.option('od.dodval1.stval1').property.get()) == set(['test']) assert set(await cfg.option('od.dodval2.stval2').property.get()) == set(['test']) await cfg.option('od.dodval2.stval2').property.add('test2') assert set(await cfg.option('od.dodval1.stval1').property.get()) == set(['test']) assert set(await cfg.option('od.dodval2.stval2').property.get()) == set(['test', 'test2']) await cfg.option('od.dodval1.stval1').property.pop('test') assert set(await cfg.option('od.dodval1.stval1').property.get()) == set([]) # assert set(await cfg.option('od.dodval1').property.get()) == set([]) assert set(await cfg.option('od.dodval2').property.get()) == set([]) await cfg.option('od.dodval1').property.add('test1') assert set(await cfg.option('od.dodval1').property.get()) == set(['test1']) assert set(await cfg.option('od.dodval2').property.get()) == set([]) await cfg.option('od.dodval1').property.pop('test1') assert set(await cfg.option('od.dodval1').property.get()) == set([]) assert set(await cfg.option('od.dodval2').property.get()) == set([]) @pytest.mark.asyncio async def test_prop_dyndescription_force_store_value(): st = StrOption('st', '', properties=('force_store_value',)) dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list)) od = OptionDescription('od', '', [dod]) od2 = OptionDescription('od', '', [od]) with pytest.raises(ConfigError): await Config(od2) @pytest.mark.asyncio async def test_callback_dyndescription(): st = StrOption('st', '', Calculation(return_dynval)) dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list)) od = OptionDescription('od', '', [dod]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) owner = await cfg.owner.get() assert await cfg.option('od.dodval1.stval1').value.get() == 'val' assert await cfg.option('od.dodval2.stval2').value.get() == 'val' assert await cfg.option('od.dodval1.stval1').owner.isdefault() assert await cfg.option('od.dodval2.stval2').owner.isdefault() await cfg.option('od.dodval1.stval1').value.set('val2') assert await cfg.option('od.dodval1.stval1').value.get() == 'val2' assert await cfg.option('od.dodval2.stval2').value.get() == 'val' assert await cfg.option('od.dodval1.stval1').owner.get() == owner assert await cfg.option('od.dodval2.stval2').owner.isdefault() await cfg.option('od.dodval1.stval1').value.reset() assert await cfg.option('od.dodval1.stval1').value.get() == 'val' assert await cfg.option('od.dodval2.stval2').value.get() == 'val' assert await cfg.option('od.dodval1.stval1').owner.isdefault() assert await cfg.option('od.dodval2.stval2').owner.isdefault() @pytest.mark.asyncio async 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)) od = OptionDescription('od', '', [dod]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) owner = await cfg.owner.get() assert await cfg.option('od.dodval1.stval1').value.get() == ['val1', 'val2'] assert await cfg.option('od.dodval2.stval2').value.get() == ['val2', 'val2'] assert await cfg.option('od.dodval1.stval1').owner.isdefault() assert await cfg.option('od.dodval2.stval2').owner.isdefault() await cfg.option('od.dodval1.stval1').value.set(['val3', 'val2']) assert await cfg.option('od.dodval1.stval1').value.get() == ['val3', 'val2'] assert await cfg.option('od.dodval2.stval2').value.get() == ['val2', 'val2'] assert await cfg.option('od.dodval1.stval1').owner.get() == owner assert await cfg.option('od.dodval2.stval2').owner.isdefault() @pytest.mark.asyncio async def test_mandatory_dyndescription(): st = StrOption('st', '', properties=('mandatory',)) dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list)) od = OptionDescription('od', '', [dod]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) await cfg.property.read_only() with pytest.raises(PropertiesOptionError): await cfg.option('od.dodval1.stval1').value.get() with pytest.raises(PropertiesOptionError): await cfg.option('od.dodval2.stval2').value.get() await cfg.property.read_write() await cfg.option('od.dodval1.stval1').value.set('val') await cfg.property.read_only() assert await cfg.option('od.dodval1.stval1').value.get() == 'val' with pytest.raises(PropertiesOptionError): await cfg.option('od.dodval2.stval2').value.get() await cfg.property.read_write() await cfg.option('od.dodval1.stval1').value.reset() await cfg.property.read_only() with pytest.raises(PropertiesOptionError): await cfg.option('od.dodval1.stval1').value.get() assert list(await cfg.value.mandatory()) == ['od.dodval1.stval1', 'od.dodval2.stval2'] @pytest.mark.asyncio async 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)))) od1 = OptionDescription('od', '', [dod, val1]) cfg = await Config(od1) assert await cfg.value.dict() == {'dodval1.stval1': None, 'dodval2.stval2': None, 'val1': ['val1', 'val2']} @pytest.mark.asyncio async 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)))) od1 = OptionDescription('od', '', [dod, val1]) od2 = OptionDescription('od', '', [od1]) cfg = await Config(od2) assert await cfg.value.dict() == {'od.dodval1.stval1': None, 'od.dodval2.stval2': None, 'od.val1': ['val1', 'val2']} @pytest.mark.asyncio async 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)))) od = OptionDescription('od', '', [dod, val1]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) assert await cfg.option('od.dodval1.stval1').value.get() is None assert await cfg.option('od.dodval2.stval2').value.get() is None with pytest.raises(AttributeError): await cfg.option('od.dodval3').value.get() @pytest.mark.asyncio async 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)))) od = OptionDescription('od', '', [dod, val1]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) owner = await cfg.owner.get() assert await cfg.option('od.dodval1.stval1').value.get() is None assert await cfg.option('od.dodval2.stval2').value.get() is None assert await cfg.option('od.dodval1.stval1').owner.isdefault() assert await cfg.option('od.dodval2.stval2').owner.isdefault() await cfg.option('od.dodval1.stval1').value.set('yes') assert await cfg.option('od.dodval1.stval1').value.get() == 'yes' assert await cfg.option('od.dodval2.stval2').value.get() is None assert await cfg.option('od.dodval1.stval1').owner.get() == owner assert await cfg.option('od.dodval2.stval2').owner.isdefault() await cfg.option('od.dodval2.stval2').value.set('no') assert await cfg.option('od.dodval1.stval1').value.get() == 'yes' assert await cfg.option('od.dodval2.stval2').value.get() == 'no' assert await cfg.option('od.dodval1.stval1').owner.get() == owner assert await cfg.option('od.dodval2.stval2').owner.get() == owner @pytest.mark.asyncio async 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)))) od = OptionDescription('od', '', [dod, val1]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) owner = await cfg.owner.get() assert await cfg.option('od.dodval1.stval1').value.get() is None assert await cfg.option('od.dodval2.stval2').value.get() is None await cfg.option('od.dodval1.stval1').value.set('yes') assert await cfg.option('od.dodval1.stval1').owner.get() == owner await cfg.option('od.dodval1.stval1').value.reset() assert await cfg.option('od.dodval1.stval1').owner.isdefault() @pytest.mark.asyncio async 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)))) od = OptionDescription('od', '', [dod, val1]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) owner = await cfg.owner.get() assert await cfg.option('od.dodval1.stval1').value.get() == [] assert await cfg.option('od.dodval2.stval2').value.get() == [] assert await cfg.option('od.dodval1.stval1').owner.isdefault() assert await cfg.option('od.dodval2.stval2').owner.isdefault() await cfg.option('od.dodval1.stval1').value.set(['yes']) assert await cfg.option('od.dodval1.stval1').value.get() == ['yes'] assert await cfg.option('od.dodval2.stval2').value.get() == [] assert await cfg.option('od.dodval1.stval1').owner.get() == owner assert await cfg.option('od.dodval2.stval2').owner.isdefault() await cfg.option('od.dodval2.stval2').value.set(['no']) assert await cfg.option('od.dodval1.stval1').value.get() == ['yes'] assert await cfg.option('od.dodval2.stval2').value.get() == ['no'] assert await cfg.option('od.dodval1.stval1').owner.get() == owner assert await cfg.option('od.dodval2.stval2').owner.get() == owner await cfg.option('od.dodval1.stval1').value.set(['yes', 'yes']) assert await cfg.option('od.dodval1.stval1').value.get() == ['yes', 'yes'] await cfg.option('od.dodval1.stval1').value.set(['yes']) assert await cfg.option('od.dodval1.stval1').value.get() == ['yes'] @pytest.mark.asyncio async 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)))) od = OptionDescription('od', '', [dod, val1]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) assert set(await cfg.option('od.dodval1.stval1').property.get()) == set(['test']) assert set(await cfg.option('od.dodval2.stval2').property.get()) == set(['test']) await cfg.option('od.dodval2.stval2').property.add('test2') assert set(await cfg.option('od.dodval1.stval1').property.get()) == set(['test']) assert set(await cfg.option('od.dodval2.stval2').property.get()) == set(['test', 'test2']) await cfg.option('od.dodval1.stval1').property.pop('test') assert set(await cfg.option('od.dodval1.stval1').property.get()) == set([]) assert set(await cfg.option('od.dodval2.stval2').property.get()) == set(['test', 'test2']) @pytest.mark.asyncio async 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)) od = OptionDescription('od', '', [dod, val1]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) owner = await cfg.owner.get() assert await cfg.option('od.dodval1.stval1').value.get() == 'val' assert await cfg.option('od.dodval2.stval2').value.get() == 'val' assert await cfg.option('od.dodval1.stval1').owner.isdefault() assert await cfg.option('od.dodval2.stval2').owner.isdefault() await cfg.option('od.dodval1.stval1').value.set('val2') assert await cfg.option('od.dodval1.stval1').value.get() == 'val2' assert await cfg.option('od.dodval2.stval2').value.get() == 'val' assert await cfg.option('od.dodval1.stval1').owner.get() == owner assert await cfg.option('od.dodval2.stval2').owner.isdefault() await cfg.option('od.dodval1.stval1').value.reset() assert await cfg.option('od.dodval1.stval1').value.get() == 'val' assert await cfg.option('od.dodval2.stval2').value.get() == 'val' assert await cfg.option('od.dodval1.stval1').owner.isdefault() assert await cfg.option('od.dodval2.stval2').owner.isdefault() @pytest.mark.asyncio async 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)))) od = OptionDescription('od', '', [dod, val1]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) await cfg.property.read_only() with pytest.raises(PropertiesOptionError): await cfg.option('od.dodval1.stval1').value.get() with pytest.raises(PropertiesOptionError): await cfg.option('od.dodval2.stval2').value.get() await cfg.property.read_write() await cfg.option('od.dodval1.stval1').value.set('val') await cfg.property.read_only() assert await cfg.option('od.dodval1.stval1').value.get() == 'val' with pytest.raises(PropertiesOptionError): await cfg.option('od.dodval2.stval2').value.get() await cfg.property.read_write() await cfg.option('od.dodval1.stval1').value.reset() await cfg.property.read_only() with pytest.raises(PropertiesOptionError): await cfg.option('od.dodval1.stval1').value.get() assert list(await cfg.value.mandatory()) == ['od.dodval1.stval1', 'od.dodval2.stval2'] @pytest.mark.asyncio async 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)))) od = OptionDescription('od', '', [dod, val1]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) await cfg.property.read_write() assert await cfg.option('od.dodval1.stval1').value.get() is None assert await cfg.option('od.dodval2.stval2').value.get() is None with pytest.raises(AttributeError): await cfg.option('od.dodval3.stval3').value.get() await cfg.option('od.val1').value.set(['val1', 'val2', 'val3']) assert await cfg.option('od.dodval1.stval1').value.get() is None assert await cfg.option('od.dodval2.stval2').value.get() is None assert await cfg.option('od.dodval3.stval3').value.get() is None @pytest.mark.asyncio async 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)))) od = OptionDescription('od', '', [dod, val1]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) owner = await cfg.owner.get() await cfg.property.read_write() assert await cfg.option('od.dodval1.stval1').value.get() is None assert await cfg.option('od.dodval2.stval2').value.get() is None await cfg.option('od.dodval2.stval2').value.set('yes') assert await cfg.option('od.dodval1.stval1').value.get() is None assert await cfg.option('od.dodval2.stval2').value.get() == 'yes' assert await cfg.option('od.dodval1.stval1').owner.isdefault() assert await cfg.option('od.dodval2.stval2').owner.get() == owner with pytest.raises(AttributeError): await cfg.option('od.dodval3').value.get() await cfg.option('od.val1').value.set(['val1']) assert await cfg.option('od.dodval1.stval1').value.get() is None with pytest.raises(AttributeError): await cfg.option('od.dodval2').value.get() with pytest.raises(AttributeError): await cfg.option('od.dodval3').value.get() assert await cfg.option('od.dodval1.stval1').owner.isdefault() with pytest.raises(AttributeError): await cfg.option('od.dodval2.stval2').owner.get() with pytest.raises(AttributeError): await cfg.option('od.dodval2.stval2').value.get() @pytest.mark.asyncio async def test_dyndescription_root(): boolean = BoolOption('boolean', '', True) disabled_property = Calculation(calc_value, Params(ParamValue('disabled'), kwargs={'condition': ParamOption(boolean), 'expected': ParamValue(False), 'default': ParamValue(None)})) st1 = StrOption('st', '', properties=(disabled_property,)) dod = DynOptionDescription('dod', '', [boolean, st1], suffixes=Calculation(return_list)) with pytest.raises(ConfigError): await Config(dod) @pytest.mark.asyncio async def test_requires_dyndescription(): boolean = BoolOption('boolean', '', True) disabled_property = Calculation(calc_value, Params(ParamValue('disabled'), kwargs={'condition': ParamOption(boolean, raisepropertyerror=True), 'expected': ParamValue(False), 'default': ParamValue(None)})) st1 = StrOption('st', '', properties=(disabled_property,)) dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_list)) od1 = OptionDescription('od', '', [dod]) od2 = OptionDescription('od', '', [od1, boolean]) cfg = await Config(od2) await cfg.property.read_write() assert await cfg.option('od.dodval1.stval1').value.get() is None assert await cfg.option('od.dodval2.stval2').value.get() is None # await cfg.option('boolean').value.set(False) props = [] try: await cfg.option('od.dodval1.stval1').value.get() except PropertiesOptionError as err: props = err.proptype assert frozenset(props) == frozenset(['disabled']) props = [] try: await cfg.option('od.dodval2.stval2').value.get() except PropertiesOptionError as err: props = err.proptype assert frozenset(props) == frozenset(['disabled']) # await cfg.option('boolean').value.set(True) assert await cfg.option('od.dodval1.stval1').value.get() is None assert await cfg.option('od.dodval2.stval2').value.get() is None #transitive await cfg.option('boolean').property.add('disabled') props = [] try: await cfg.option('od.dodval1.stval1').value.get() except PropertiesOptionError as err: props = err.proptype assert frozenset(props) == frozenset(['disabled']) props = [] try: await cfg.option('od.dodval2.stval2').value.get() except PropertiesOptionError as err: props = err.proptype assert frozenset(props) == frozenset(['disabled']) @pytest.mark.asyncio async def test_requires_dyndescription_boolean(): boolean1 = BoolOption('boolean1', '', True) disabled_property = Calculation(calc_value, Params(ParamValue('disabled'), kwargs={'condition': ParamOption(boolean1, raisepropertyerror=True), 'expected': ParamValue(False), 'default': ParamValue(None)})) boolean = BoolOption('boolean', '', True, properties=(disabled_property,)) disabled_property = Calculation(calc_value, Params(ParamValue('disabled'), kwargs={'condition': ParamOption(boolean, raisepropertyerror=True), 'expected': ParamValue(False), 'default': ParamValue(None)})) st = StrOption('st', '', properties=(disabled_property,)) dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list)) od = OptionDescription('od', '', [dod]) od2 = OptionDescription('od', '', [od, boolean1, boolean]) cfg = await Config(od2) await cfg.property.read_write() assert await cfg.value.dict() == {'boolean1': True, 'boolean': True, 'od.dodval1.stval1': None, 'od.dodval2.stval2': None} # await cfg.option('boolean').value.set(False) assert await cfg.value.dict() == {'boolean1': True, 'boolean': False} # await cfg.option('boolean').value.set(True) assert await cfg.value.dict() == {'boolean1': True, 'boolean': True, 'od.dodval1.stval1': None, 'od.dodval2.stval2': None} # await cfg.option('boolean1').value.set(False) assert await cfg.value.dict() == {'boolean1': False} @pytest.mark.asyncio async def test_requires_dyndescription_in_dyn(): boolean = BoolOption('boolean', '', True) disabled_property = Calculation(calc_value, Params(ParamValue('disabled'), kwargs={'condition': ParamOption(boolean, raisepropertyerror=True), 'expected': ParamValue(False), 'default': ParamValue(None)})) st = StrOption('st', '', properties=(disabled_property,)) dod = DynOptionDescription('dod', '', [boolean, st], suffixes=Calculation(return_list)) od = OptionDescription('od', '', [dod]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) await cfg.property.read_write() assert await cfg.option('od.dodval1.stval1').value.get() is None assert await cfg.option('od.dodval2.stval2').value.get() is None # await cfg.option('od.dodval1.booleanval1').value.set(False) props = [] try: await cfg.option('od.dodval1.stval1').value.get() except PropertiesOptionError as err: props = err.proptype assert props == frozenset(['disabled']) props = [] await cfg.option('od.dodval2.stval2').value.get() # await cfg.option('od.dodval1.booleanval1').value.set(True) assert await cfg.option('od.dodval1.stval1').value.get() is None assert await cfg.option('od.dodval2.stval2').value.get() is None @pytest.mark.asyncio async def test_requires_dyndescription2(): boolean = BoolOption('boolean', '', True) st1 = StrOption('st', '') disabled_property = Calculation(calc_value, Params(ParamValue('disabled'), kwargs={'condition': ParamOption(boolean, raisepropertyerror=True), 'expected': ParamValue(False), 'default': ParamValue(None)})) dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_list), properties=(disabled_property,)) od1 = OptionDescription('od', '', [dod]) od2 = OptionDescription('od', '', [od1, boolean]) cfg = await Config(od2) await cfg.property.read_write() assert await cfg.option('od.dodval1.stval1').value.get() is None assert await cfg.option('od.dodval2.stval2').value.get() is None # await cfg.option('boolean').value.set(False) props = [] try: await cfg.option('od.dodval1.stval1').value.get() except PropertiesOptionError as err: props = err.proptype assert frozenset(props) == frozenset(['disabled']) props = [] try: await cfg.option('od.dodval2.stval2').value.get() except PropertiesOptionError as err: props = err.proptype assert frozenset(props) == frozenset(['disabled']) # await cfg.option('boolean').value.set(True) assert await cfg.option('od.dodval1.stval1').value.get() is None assert await cfg.option('od.dodval2.stval2').value.get() is None #transitive await cfg.option('boolean').property.add('disabled') props = [] try: await cfg.option('od.dodval1.stval1').value.get() except PropertiesOptionError as err: props = err.proptype assert frozenset(props) == frozenset(['disabled']) props = [] try: await cfg.option('od.dodval2.stval2').value.get() except PropertiesOptionError as err: props = err.proptype assert frozenset(props) == frozenset(['disabled']) @pytest.mark.asyncio async 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)) od = OptionDescription('od', '', [dod, val1]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) assert await cfg.option('od.dodval1.stval1').value.get() == 'val' with pytest.raises(ValueError): await cfg.option('od.dodval1.stval1').value.set('no') await cfg.option('od.dodval1.stval1').value.set('val') @pytest.mark.asyncio async def test_makedict_dyndescription_context(): val1 = StrOption('val1', '', ['val1', 'val2'], multi=True) st = StrOption('st', '') dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list)) od = OptionDescription('od', '', [dod, val1]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) await cfg.option('od.dodval1.stval1').value.set('yes') assert await cfg.value.dict() == {'od.val1': ['val1', 'val2'], 'od.dodval1.stval1': 'yes', 'od.dodval2.stval2': None} assert await cfg.value.dict(flatten=True) == {'val1': ['val1', 'val2'], 'stval1': 'yes', 'stval2': None} @pytest.mark.asyncio async def test_find_dyndescription_context(): val1 = StrOption('val1', '', ['val1', 'val2'], multi=True) st = StrOption('st', '') dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list)) od = OptionDescription('od', '', [dod, val1]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) await cfg.option('od.dodval1.stval1').value.set('yes') ret = await cfg.option.find('stval1', first=True) assert await ret.value.get() == "yes" ret = await cfg.option.find('stval1', first=True) assert isinstance(await ret.option.get(), SynDynOption) #assert await cfg.option.find(bytype=StrOption, type='path') == ['od.dodval1.stval1', 'od.dodval2.stval2', 'od.val1'] #opts = await cfg.option.find(byvalue='yes') #assert len(opts) == 1 #assert isinstance(opts[0], SynDynOption) #assert opts[0].impl_getname() == 'stval1' with pytest.raises(AttributeError): list(await cfg.option.find('strnotexists')) @pytest.mark.asyncio async def test_information_dyndescription_context(): val1 = StrOption('val1', '', ['val1', 'val2'], multi=True) st = StrOption('st', '') dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list)) od = OptionDescription('od', '', [dod, val1]) od2 = OptionDescription('od', '', [od]) dod.impl_set_information('testod', 'val1') st.impl_set_information('testst', 'val2') cfg = await Config(od2) await cfg.information.set('testcfgod', 'val3') assert await cfg.option('od.dodval1').information.get('testod') == 'val1' assert await cfg.option('od.dodval2').information.get('testod') == 'val1' assert await cfg.option('od.dodval1.stval1').information.get('testst') == 'val2' assert await cfg.option('od.dodval2.stval2').information.get('testst') == 'val2' assert await cfg.information.get('testcfgod') == 'val3' @pytest.mark.asyncio async def test_all_dyndescription(): st = StrOption('st', '') ip = IPOption('ip', '') network = NetworkOption('network', '') netmask = NetmaskOption('netmask', '') ch = ChoiceOption('ch', '', ('val1', 'val2', 'val3')) ch1 = ChoiceOption('ch1', '', Calculation(return_list)) boo = BoolOption('boo', '') intr = IntOption('intr', '') floa = FloatOption('floa', '') uni = StrOption('uni', '') port = PortOption('port', '') broad = BroadcastOption('broad', '') domain = DomainnameOption('domain', '') email = EmailOption('email', '') url = URLOption('url', '') username = UsernameOption('username', '') filename = FilenameOption('filename', '') dod = DynOptionDescription('dod', '', [st, ip, network, netmask, ch, ch1, boo, intr, floa, uni, port, broad, domain, email, url, username, filename], suffixes=Calculation(return_list)) od = OptionDescription('od', '', [dod]) cfg = await Config(od) assert await cfg.option('dodval1.stval1').value.get() is None assert await cfg.option('dodval1.ipval1').value.get() is None assert await cfg.option('dodval1.networkval1').value.get() is None assert await cfg.option('dodval1.netmaskval1').value.get() is None assert await cfg.option('dodval1.chval1').value.get() is None assert await cfg.option('dodval1.ch1val1').value.get() is None assert await cfg.option('dodval1.booval1').value.get() is None assert await cfg.option('dodval1.intrval1').value.get() is None assert await cfg.option('dodval1.floaval1').value.get() is None assert await cfg.option('dodval1.unival1').value.get() is None assert await cfg.option('dodval1.portval1').value.get() is None assert await cfg.option('dodval1.broadval1').value.get() is None assert await cfg.option('dodval1.domainval1').value.get() is None assert await cfg.option('dodval1.emailval1').value.get() is None assert await cfg.option('dodval1.urlval1').value.get() is None assert await cfg.option('dodval1.usernameval1').value.get() is None assert await cfg.option('dodval1.filenameval1').value.get() is None # await cfg.option('dodval1.stval1').value.set("no") await cfg.option('dodval1.ipval1').value.set("1.1.1.1") await cfg.option('dodval1.networkval1').value.set("1.1.1.0") await cfg.option('dodval1.netmaskval1').value.set("255.255.255.0") await cfg.option('dodval1.chval1').value.set("val1") await cfg.option('dodval1.ch1val1').value.set("val2") await cfg.option('dodval1.booval1').value.set(True) await cfg.option('dodval1.intrval1').value.set(1) await cfg.option('dodval1.floaval1').value.set(0.1) await cfg.option('dodval1.unival1').value.set(u"no") await cfg.option('dodval1.portval1').value.set('80') await cfg.option('dodval1.broadval1').value.set("1.1.1.255") await cfg.option('dodval1.domainval1').value.set("test.com") await cfg.option('dodval1.emailval1').value.set("test@test.com") await cfg.option('dodval1.urlval1').value.set("http://test.com") await cfg.option('dodval1.usernameval1').value.set("user1") await cfg.option('dodval1.filenameval1').value.set("/tmp") assert await cfg.option('dodval1.stval1').value.get() == "no" assert await cfg.option('dodval1.ipval1').value.get() == "1.1.1.1" assert await cfg.option('dodval1.networkval1').value.get() == "1.1.1.0" assert await cfg.option('dodval1.netmaskval1').value.get() == "255.255.255.0" assert await cfg.option('dodval1.chval1').value.get() == "val1" assert await cfg.option('dodval1.ch1val1').value.get() == "val2" assert await cfg.option('dodval1.booval1').value.get() is True assert await cfg.option('dodval1.intrval1').value.get() == 1 assert await cfg.option('dodval1.floaval1').value.get() == 0.1 assert await cfg.option('dodval1.unival1').value.get() == u"no" assert await cfg.option('dodval1.portval1').value.get() == '80' assert await cfg.option('dodval1.broadval1').value.get() == "1.1.1.255" assert await cfg.option('dodval1.domainval1').value.get() == "test.com" assert await cfg.option('dodval1.emailval1').value.get() == "test@test.com" assert await cfg.option('dodval1.urlval1').value.get() == "http://test.com" assert await cfg.option('dodval1.usernameval1').value.get() == "user1" assert await cfg.option('dodval1.filenameval1').value.get() == "/tmp" assert await cfg.option('dodval2.stval2').value.get() is None assert await cfg.option('dodval2.ipval2').value.get() is None assert await cfg.option('dodval2.networkval2').value.get() is None assert await cfg.option('dodval2.netmaskval2').value.get() is None assert await cfg.option('dodval2.chval2').value.get() is None assert await cfg.option('dodval2.ch1val2').value.get() is None assert await cfg.option('dodval2.booval2').value.get() is None assert await cfg.option('dodval2.intrval2').value.get() is None assert await cfg.option('dodval2.floaval2').value.get() is None assert await cfg.option('dodval2.unival2').value.get() is None assert await cfg.option('dodval2.portval2').value.get() is None assert await cfg.option('dodval2.broadval2').value.get() is None assert await cfg.option('dodval2.domainval2').value.get() is None assert await cfg.option('dodval2.emailval2').value.get() is None assert await cfg.option('dodval2.urlval2').value.get() is None assert await cfg.option('dodval2.usernameval2').value.get() is None assert await cfg.option('dodval2.filenameval2').value.get() is None @pytest.mark.asyncio async 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)) od = OptionDescription('od', '', [st]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) owner = await cfg.owner.get() # assert await cfg.value.dict() == {'od.stval1.st1val1.st2val1': [], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st1val2': [], 'od.stval1.st1val1.st1val1': []} assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == [] assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.isdefault() assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() # await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes']) assert await cfg.value.dict() == {'od.stval1.st1val1.st2val1': [None], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st1val2': [], 'od.stval1.st1val1.st1val1': ['yes']} assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes'] assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == None assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.isdefault() assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() # await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('no') assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes'] assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == 'no' assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owner assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() # await cfg.option('od.stval1.st1val1.st1val1').value.pop(0) assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == [] assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() # await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes']) await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('yes') assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owner assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner await cfg.option('od.stval1.st1val1.st2val1', 0).value.reset() assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.isdefault() # await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes']) await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('yes') await cfg.option('od.stval1.st1val1.st1val1').value.reset() assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == [] assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.isdefault() assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() @pytest.mark.asyncio async def test_leadership_default_multi_dyndescription(): 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)) od = OptionDescription('od', '', [st]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) owner = await cfg.owner.get() # assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == [] assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.isdefault() assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() # await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes']) assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes'] assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == 'no' assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.isdefault() assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() @pytest.mark.asyncio async def test_leadership_dyndescription_param(): val1 = StrOption('val1', '', ['val1', 'val2'], multi=True) odval = OptionDescription('odval1', '', [val1]) 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)))) od = OptionDescription('od', '', [st, odval]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) owner = await cfg.owner.get() assert await cfg.value.dict() == {'od.stval1.st1val1.st2val1': [], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st1val2': [], 'od.stval1.st1val1.st1val1': [], 'od.odval1.val1': ['val1', 'val2']} assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == [] assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owners.default assert await cfg.option('od.stval2.st1val2.st1val2').owner.get() == owners.default # await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes']) assert await cfg.value.dict() == {'od.stval1.st1val1.st2val1': [None], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st1val2': [], 'od.stval1.st1val1.st1val1': ['yes'], 'od.odval1.val1': ['val1', 'val2']} assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes'] assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == None assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owners.default assert await cfg.option('od.stval2.st1val2.st1val2').owner.get() == owners.default # await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('no') assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes'] assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == 'no' assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owner assert await cfg.option('od.stval2.st1val2.st1val2').owner.get() == owners.default # await cfg.option('od.stval1.st1val1.st1val1').value.pop(0) assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == [] assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval2.st1val2.st1val2').owner.get() == owners.default # await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes']) await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('yes') assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owner assert await cfg.option('od.stval2.st1val2.st1val2').owner.get() == owners.default # await cfg.option('od.stval1.st1val1.st2val1', 0).value.reset() assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owners.default assert await cfg.option('od.stval2.st1val2.st1val2').owner.get() == owners.default # await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes']) await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('yes') await cfg.option('od.stval1.st1val1.st1val1').value.reset() assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == [] assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owners.default assert await cfg.option('od.stval2.st1val2.st1val2').owner.get() == owners.default @pytest.mark.asyncio async def test_leadership_default_multi_dyndescription(): 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)) od = OptionDescription('od', '', [st]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) owner = await cfg.owner.get() # assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == [] assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.isdefault() assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() # await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes']) assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes'] assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == 'no' assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.isdefault() assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() async def _test_leadership(cfg): owner = await cfg.owner.get() await cfg.option('od.val1.val1').value.set(['val1', 'val2']) await cfg.option('od.val1.val2', 0).value.set('val1') await cfg.option('od.val1.val2', 1).value.set('val2') assert await cfg.value.dict() == {'od.stval1.st1val1.st2val1': [], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st1val2': [], 'od.stval1.st1val1.st1val1': [], 'od.val1.val1': ['val1', 'val2'], 'od.val1.val2': ['val1', 'val2']} assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == [] assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owners.default assert await cfg.option('od.stval2.st1val2.st1val2').owner.get() == owners.default # await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes']) assert await cfg.value.dict() == {'od.stval1.st1val1.st2val1': [None], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st1val2': [], 'od.stval1.st1val1.st1val1': ['yes'], 'od.val1.val1': ['val1', 'val2'], 'od.val1.val2': ['val1', 'val2']} assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes'] assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == None assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owners.default assert await cfg.option('od.stval2.st1val2.st1val2').owner.get() == owners.default # await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('no') assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes'] assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == 'no' assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owner assert await cfg.option('od.stval2.st1val2.st1val2').owner.get() == owners.default # await cfg.option('od.stval1.st1val1.st1val1').value.pop(0) assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == [] assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval2.st1val2.st1val2').owner.get() == owners.default # await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes']) await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('yes') assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owner assert await cfg.option('od.stval2.st1val2.st1val2').owner.get() == owners.default # await cfg.option('od.stval1.st1val1.st2val1', 0).value.reset() assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owners.default assert await cfg.option('od.stval2.st1val2.st1val2').owner.get() == owners.default # await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes']) await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('yes') await cfg.option('od.stval1.st1val1.st1val1').value.reset() assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == [] assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owners.default assert await cfg.option('od.stval2.st1val2.st1val2').owner.get() == owners.default @pytest.mark.asyncio async def test_leadership_dyndescription_param_leader(): val1 = StrOption('val1', "", multi=True) val2 = StrOption('val2', "", multi=True) odval = Leadership('val1', '', [val1, val2]) 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)))) od = OptionDescription('od', '', [st, odval]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) await _test_leadership(cfg) @pytest.mark.asyncio async def test_leadership_default_multi_dyndescription(): 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)) od = OptionDescription('od', '', [st]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) owner = await cfg.owner.get() # assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == [] assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.isdefault() assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() # await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes']) assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes'] assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == 'no' assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.isdefault() assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() @pytest.mark.asyncio async def test_leadership_dyndescription_param_follower(): val1 = StrOption('val1', "", multi=True) val2 = StrOption('val2', "", multi=True) odval = Leadership('val1', '', [val1, val2]) 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)))) od = OptionDescription('od', '', [st, odval]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) await _test_leadership(cfg) @pytest.mark.asyncio async def test_leadership_default_multi_dyndescription(): 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)) od = OptionDescription('od', '', [st]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) owner = await cfg.owner.get() # assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == [] assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.isdefault() assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() # await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes']) assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes'] assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == 'no' assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.isdefault() assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() @pytest.mark.asyncio async 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)) od1 = OptionDescription('od', '', [std]) od2 = OptionDescription('od', '', [od1]) cfg = await Config(od2) owner = await cfg.owner.get() # assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == [] assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.isdefault() assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() # await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes']) assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes'] assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == [] assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.isdefault() assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() # await cfg.option('od.stval1.st1val1.st2val1', 0).value.set(['no']) assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes'] assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == ['no'] assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owner assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() @pytest.mark.asyncio async 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)) od1 = OptionDescription('od', '', [st1]) od2 = OptionDescription('od', '', [od1]) cfg = await Config(od2) owner = await cfg.owner.get() assert await cfg.value.dict() == {'od.stval1.st1val1.st2val1': [], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st1val2': [], 'od.stval1.st1val1.st1val1': []} assert await cfg.option('od.stval1.st1val1.st1val1').value.get() ==[] assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.isdefault() assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() # await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes']) assert await cfg.value.dict() == {'od.stval1.st1val1.st2val1': ['yes'], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st1val2': [], 'od.stval1.st1val1.st1val1': ['yes']} assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes'] assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == 'yes' assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.isdefault() assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() # await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('no') assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes'] assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == 'no' assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owner assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() # await cfg.option('od.stval1.st1val1.st1val1').value.pop(0) assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == [] assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() # await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes']) await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('yes') assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owner assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() await cfg.option('od.stval1.st1val1.st2val1', 0).value.reset() assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.isdefault() assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() # await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes']) await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('yes') await cfg.option('od.stval1.st1val1.st1val1').value.reset() assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == [] assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.isdefault() assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() # await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes']) assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == 'yes' @pytest.mark.asyncio async 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)) od = OptionDescription('od', '', [st]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == [] await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes']) assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes'] await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('val') assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == 'val' @pytest.mark.asyncio async def test_leadership_callback_nomulti_dyndescription(): v11 = StrOption('v1', '', "val") 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)) od1 = OptionDescription('od', '', [stt]) od2 = OptionDescription('od', '', [od1, v11]) cfg = await Config(od2) assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == [] await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes']) assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes'] assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == 'val' @pytest.mark.asyncio async def test_leadership_callback_samegroup_dyndescription(): st1 = StrOption('st1', "", multi=True) 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)) od1 = OptionDescription('od', '', [stt]) od2 = OptionDescription('od', '', [od1]) cfg = await Config(od2) owner = await cfg.owner.get() assert await cfg.value.dict() == {'od.stval1.st1val1.st1val1': [], 'od.stval1.st1val1.st2val1': [], 'od.stval1.st1val1.st3val1': [], 'od.stval2.st1val2.st1val2': [], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st3val2': []} assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == [] assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.isdefault() assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() # await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes']) assert await cfg.value.dict() == {'od.stval1.st1val1.st1val1': ['yes'], 'od.stval1.st1val1.st2val1': [None], 'od.stval1.st1val1.st3val1': [None], 'od.stval2.st1val2.st1val2': [], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st3val2': []} assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.isdefault() assert await cfg.option('od.stval1.st1val1.st3val1', 0).owner.isdefault() assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() # await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('yes') assert await cfg.value.dict() == {'od.stval1.st1val1.st1val1': ['yes'], 'od.stval1.st1val1.st2val1': ['yes'], 'od.stval1.st1val1.st3val1': ['yes'], 'od.stval2.st1val2.st1val2': [], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st3val2': []} assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owner assert await cfg.option('od.stval1.st1val1.st3val1', 0).owner.isdefault() assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() @pytest.mark.asyncio async def test_invalid_conflict_dyndescription(): st = StrOption('st', '') dod = DynOptionDescription('dod', '', [st], suffixes=Calculation(return_list)) dodinvalid = StrOption('dodinvalid', '') dod, dodinvalid with pytest.raises(ConflictError): OptionDescription('od', '', [dod, dodinvalid]) @pytest.mark.asyncio async def test_invalid_subod_dyndescription(): st2 = StrOption('st2', '') od1 = OptionDescription('od1', '', [st2]) od1 with pytest.raises(ConfigError): DynOptionDescription('dod', '', [od1], suffixes=Calculation(return_list)) @pytest.mark.asyncio async def test_invalid_subdynod_dyndescription(): st2 = StrOption('st2', '') od1 = DynOptionDescription('od1', '', [st2], suffixes=Calculation(return_list)) od1 with pytest.raises(ConfigError): DynOptionDescription('dod', '', [od1], suffixes=Calculation(return_list)) @pytest.mark.asyncio async def test_invalid_symlink_dyndescription(): st = StrOption('st', '') st2 = SymLinkOption('st2', st) st2 with pytest.raises(ConfigError): DynOptionDescription('dod', '', [st, st2], suffixes=Calculation(return_list)) @pytest.mark.asyncio async def test_nocallback_dyndescription(): st = StrOption('st', '') st2 = StrOption('st2', '') st, st2 with pytest.raises(TypeError): DynOptionDescription('dod', '', [st, st2]) @pytest.mark.asyncio async def test_invalid_samevalue_dyndescription(): st1 = StrOption('st', '') dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_same_list)) od1 = OptionDescription('od', '', [dod]) cfg = await Config(od1) with pytest.raises(ValueError): await cfg.value.dict() @pytest.mark.asyncio async def test_invalid_name_dyndescription(): st1 = StrOption('st', '') dod = DynOptionDescription('dod', '', [st1], suffixes=Calculation(return_wrong_list)) od1 = OptionDescription('od', '', [dod]) cfg = await Config(od1) with pytest.raises(ValueError): await cfg.value.dict() @pytest.mark.asyncio async 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)) od = OptionDescription('od', '', [st]) od2 = OptionDescription('od', '', [od]) cfg = await Config(od2) owner = await cfg.owner.get() # assert await cfg.value.dict() == {'od.stval1.st1val1.st2val1': [], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st1val2': [], 'od.stval1.st1val1.st1val1': []} assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == [] assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.isdefault() assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() # await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes']) assert await cfg.value.dict() == {'od.stval1.st1val1.st2val1': [None], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st1val2': [], 'od.stval1.st1val1.st1val1': ['yes']} assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes'] assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == None assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.isdefault() assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() # await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('no') assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == ['yes'] assert await cfg.option('od.stval1.st1val1.st2val1', 0).value.get() == 'no' assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owner assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() # await cfg.option('od.stval1.st1val1.st1val1').value.pop(0) assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == [] assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() # await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes']) await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('yes') assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owner assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner await cfg.option('od.stval1.st1val1.st2val1', 0).value.reset() assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.isdefault() # await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes']) await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('yes') await cfg.option('od.stval1.st1val1.st1val1').value.reset() assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == [] assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.isdefault() assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() @pytest.mark.asyncio async def test_leadership_callback_samegroup_dyndescription_convert(): st1 = StrOption('st1', "", multi=True) 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)) od1 = OptionDescription('od', '', [stt]) od2 = OptionDescription('od', '', [od1]) cfg = await Config(od2) owner = await cfg.owner.get() assert await cfg.value.dict() == {'od.stval1.st1val1.st1val1': [], 'od.stval1.st1val1.st2val1': [], 'od.stval1.st1val1.st3val1': [], 'od.stval2.st1val2.st1val2': [], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st3val2': []} assert await cfg.option('od.stval1.st1val1.st1val1').value.get() == [] assert await cfg.option('od.stval2.st1val2.st1val2').value.get() == [] assert await cfg.option('od.stval1.st1val1.st1val1').owner.isdefault() assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() # await cfg.option('od.stval1.st1val1.st1val1').value.set(['yes']) assert await cfg.value.dict() == {'od.stval1.st1val1.st1val1': ['yes'], 'od.stval1.st1val1.st2val1': [None], 'od.stval1.st1val1.st3val1': [None], 'od.stval2.st1val2.st1val2': [], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st3val2': []} assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.isdefault() assert await cfg.option('od.stval1.st1val1.st3val1', 0).owner.isdefault() assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() # await cfg.option('od.stval1.st1val1.st2val1', 0).value.set('yes') assert await cfg.value.dict() == {'od.stval1.st1val1.st1val1': ['yes'], 'od.stval1.st1val1.st2val1': ['yes'], 'od.stval1.st1val1.st3val1': ['yes'], 'od.stval2.st1val2.st1val2': [], 'od.stval2.st1val2.st2val2': [], 'od.stval2.st1val2.st3val2': []} assert await cfg.option('od.stval1.st1val1.st1val1').owner.get() == owner assert await cfg.option('od.stval1.st1val1.st2val1', 0).owner.get() == owner assert await cfg.option('od.stval1.st1val1.st3val1', 0).owner.isdefault() assert await cfg.option('od.stval2.st1val2.st1val2').owner.isdefault() @pytest.mark.asyncio async 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)) od = OptionDescription('root', '', [dyn]) cfg = await Config(od) await cfg.property.read_write() await cfg.permissive.add('hidden') assert await cfg.forcepermissive.option('leaderval1.ip_admin_eth0val1.ip_admin_eth0val1').value.get() == [] await cfg.forcepermissive.option('leaderval1.ip_admin_eth0val1.ip_admin_eth0val1').value.set(['192.168.1.1']) assert await cfg.forcepermissive.option('leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1', 0).value.get() is None with pytest.raises(PropertiesOptionError): await cfg.option('leaderval1.ip_admin_eth0val1.ip_admin_eth0val1').value.get() with pytest.raises(PropertiesOptionError): await cfg.option('leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1', 0).value.get() await cfg.value.dict(leader_to_list=True) == {'leaderval1.ip_admin_eth0val1.ip_admin_eth0val1': [{'leaderval1.ip_admin_eth0val1.ip_admin_eth0val1': '192.168.1.1'}], 'leaderval2.ip_admin_eth0val2.ip_admin_eth0val2': [{'leaderval2.ip_admin_eth0val2.ip_admin_eth0val2': '192.168.1.1'}]} @pytest.mark.asyncio async def test_dyn_leadership_requires(): ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True, properties=('notunique',)) disabled_property = Calculation(calc_value, Params(ParamValue('disabled'), kwargs={'condition': ParamOption(ip_admin_eth0, notraisepropertyerror=True), 'expected': ParamValue('192.168.1.1'), 'no_condition_is_invalid': ParamValue(True), '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)) od = OptionDescription('toto', '', [dyn]) cfg = await Config(od) await cfg.property.read_write() assert await cfg.option('leaderval1.ip_admin_eth0val1.ip_admin_eth0val1').value.get() == [] await cfg.option('leaderval1.ip_admin_eth0val1.ip_admin_eth0val1').value.set(['192.168.1.2']) assert await cfg.option('leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1', 0).value.get() is None assert await cfg.option('leaderval1.ip_admin_eth0val1.ip_admin_eth0val1').value.get() == ['192.168.1.2'] # await cfg.option('leaderval1.ip_admin_eth0val1.ip_admin_eth0val1').value.set(['192.168.1.2', '192.168.1.1']) assert await cfg.option('leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1', 0).value.get() is None with pytest.raises(PropertiesOptionError): await cfg.option('leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1', 1).value.get() # await cfg.option('leaderval1.ip_admin_eth0val1.ip_admin_eth0val1').value.set(['192.168.1.2', '192.168.1.2']) assert await cfg.option('leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1', 0).value.get() is None assert await cfg.option('leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1', 1).value.get() is None await cfg.option('leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1', 1).value.set('255.255.255.255') assert await cfg.option('leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1', 1).value.get() == '255.255.255.255' assert await cfg.value.dict() == {'leaderval1.ip_admin_eth0val1.ip_admin_eth0val1': ['192.168.1.2', '192.168.1.2'], 'leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1': [None, '255.255.255.255'], 'leaderval2.ip_admin_eth0val2.ip_admin_eth0val2': [], 'leaderval2.ip_admin_eth0val2.netmask_admin_eth0val2': []} ret = await cfg.value.dict(leader_to_list=True) assert ret == {'leaderval1.ip_admin_eth0val1.ip_admin_eth0val1': [{'leaderval1.ip_admin_eth0val1.ip_admin_eth0val1': '192.168.1.2', 'leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1': None}, {'leaderval1.ip_admin_eth0val1.ip_admin_eth0val1': '192.168.1.2', 'leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1': '255.255.255.255'}], 'leaderval2.ip_admin_eth0val2.ip_admin_eth0val2': []} # await cfg.option('leaderval1.ip_admin_eth0val1.ip_admin_eth0val1').value.set(['192.168.1.2', '192.168.1.1']) assert await cfg.option('leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1', 0).value.get() is None with pytest.raises(PropertiesOptionError): await cfg.option('leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1', 1).value.get() ret = await cfg.value.dict() assert set(ret.keys()) == set(['leaderval1.ip_admin_eth0val1.ip_admin_eth0val1', 'leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1', 'leaderval2.ip_admin_eth0val2.ip_admin_eth0val2', 'leaderval2.ip_admin_eth0val2.netmask_admin_eth0val2']) assert ret['leaderval1.ip_admin_eth0val1.ip_admin_eth0val1'] == ['192.168.1.2', '192.168.1.1'] assert len(ret['leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1']) == 2 assert ret['leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1'][0] is None assert isinstance(ret['leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1'][1], PropertiesOptionError) del ret['leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1'][1] del ret['leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1'][0] del ret['leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1'] assert await cfg.value.dict(leader_to_list=True) == {'leaderval1.ip_admin_eth0val1.ip_admin_eth0val1': [{'leaderval1.ip_admin_eth0val1.ip_admin_eth0val1': '192.168.1.2', 'leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1': None}, {'leaderval1.ip_admin_eth0val1.ip_admin_eth0val1': '192.168.1.1'}], 'leaderval2.ip_admin_eth0val2.ip_admin_eth0val2': []} # assert await cfg.value.dict(leader_to_list=True) == {'leaderval1.ip_admin_eth0val1.ip_admin_eth0val1': [{'leaderval1.ip_admin_eth0val1.ip_admin_eth0val1': '192.168.1.2', 'leaderval1.ip_admin_eth0val1.netmask_admin_eth0val1': None}, {'leaderval1.ip_admin_eth0val1.ip_admin_eth0val1': '192.168.1.1'}], 'leaderval2.ip_admin_eth0val2.ip_admin_eth0val2': []}