From 47c84895f79b6433387d42bb61f666cd6ffccd2d Mon Sep 17 00:00:00 2001 From: Emmanuel Garette Date: Sun, 19 Oct 2025 21:44:29 +0200 Subject: [PATCH] feat: .identifiers can return convert value --- tests/test_dyn_optiondescription.py | 23 +++++++++++++++++++++++ tiramisu/api.py | 17 ++++++++++++++++- tiramisu/option/dynoptiondescription.py | 3 +++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/tests/test_dyn_optiondescription.py b/tests/test_dyn_optiondescription.py index 7b74349..f39473d 100644 --- a/tests/test_dyn_optiondescription.py +++ b/tests/test_dyn_optiondescription.py @@ -28,6 +28,8 @@ def display_name(kls, subconfig, with_quote=False) -> str: class ConvertDynOptionDescription(DynOptionDescription): def convert_identifier_to_path(self, identifier): # remove dot with is illegal + if not identifier: + return identifier return identifier.replace('.', '') @@ -2140,6 +2142,10 @@ def test_leadership_dyndescription_convert(): assert cfg.option('od.stval2.st1.st1').value.get() == [] assert cfg.option('od.stval1.st1.st1').owner.isdefault() assert cfg.option('od.stval2.st1.st1').owner.isdefault() + assert cfg.option('od.stval2.st1.st1').identifiers() == ["val.2"] + assert cfg.option('od.stval2.st1.st1').identifiers(convert=True) == ["val2"] + assert cfg.option('od.stval2').identifiers(only_self=True) == ["val.1", "val.2"] + assert cfg.option('od.stval2').identifiers(only_self=True, convert=True) == ["val1", "val2"] # cfg.option('od.stval1.st1.st1').value.set(['yes']) assert parse_od_get(cfg.value.get()) == {'od.stval1.st1.st1': [{'od.stval1.st1.st1': 'yes', 'od.stval1.st1.st2': None}], 'od.stval2.st1.st1': []} @@ -2184,6 +2190,23 @@ def test_leadership_dyndescription_convert(): # assert not list_sessions() +def test_leadership_dyndescription_convert_2(): + identifier = StrOption("identifier", "", ['val.1', 'val.2', None], multi=True) + st1 = StrOption('st1', "", multi=True) + st2 = StrOption('st2', "", multi=True) + stm = Leadership('st1', '', [st1, st2]) + st = ConvertDynOptionDescription('st', '', [stm], identifiers=Calculation(calc_value, Params((ParamOption(identifier),)))) + od = OptionDescription('od', '', [st]) + od1 = OptionDescription('od', '', [od, identifier]) + cfg = Config(od1) + owner = cfg.owner.get() + # + assert cfg.option('od.stval2.st1.st1').identifiers() == ["val.2"] + assert cfg.option('od.stval2.st1.st1').identifiers(convert=True) == ["val2"] + assert cfg.option('od.stval2').identifiers(only_self=True) == ["val.1", "val.2"] + assert cfg.option('od.stval2').identifiers(only_self=True, convert=True) == ["val1", "val2"] + + def test_leadership_callback_samegroup_dyndescription_convert(): st1 = StrOption('st1', "", multi=True) st2 = StrOption('st2', "", multi=True) diff --git a/tiramisu/api.py b/tiramisu/api.py index 7717ebe..a8a19ac 100644 --- a/tiramisu/api.py +++ b/tiramisu/api.py @@ -569,12 +569,26 @@ class _TiramisuOptionOptionDescription: self, only_self: bool = False, uncalculated: bool = False, + convert: bool = False, ): """Get identifiers for dynamic option""" if not only_self: if self._subconfig.is_dynamic_without_identifiers and not uncalculated: raise AttributeOptionError(self._subconfig.path, "option-dynamic") - return self._subconfig.identifiers + if not convert: + return self._subconfig.identifiers + identifiers = [] + dynconfig = None + subconfig = self._subconfig + while not dynconfig: + if subconfig.option.impl_is_optiondescription() and subconfig.option.impl_is_dynoptiondescription(): + dynconfig = subconfig + subconfig = subconfig.parent + for identifier in self._subconfig.identifiers: + if identifier is None: + continue + identifiers.append(dynconfig.option.convert_identifier_to_path(identifier)) + return identifiers if ( not self._subconfig.option.impl_is_optiondescription() or not self._subconfig.option.impl_is_dynoptiondescription() @@ -587,6 +601,7 @@ class _TiramisuOptionOptionDescription: return self._subconfig.option.get_identifiers( self._subconfig.parent, uncalculated=uncalculated, + convert=convert, ) diff --git a/tiramisu/option/dynoptiondescription.py b/tiramisu/option/dynoptiondescription.py index 9db9a37..691a691 100644 --- a/tiramisu/option/dynoptiondescription.py +++ b/tiramisu/option/dynoptiondescription.py @@ -108,6 +108,7 @@ class DynOptionDescription(OptionDescription): *, uncalculated: bool = False, from_display_name: bool = False, + convert: bool = False, ) -> List[str]: """get dynamic identifiers""" subconfig = parent.get_child( @@ -150,6 +151,8 @@ class DynOptionDescription(OptionDescription): cval, self.impl_get_display_name(subconfig, with_quote=True) ) ) + elif convert: + values_.append(cval) else: values_.append(val) if (