fix: calculation with leader

This commit is contained in:
egarette@silique.fr 2025-12-22 19:01:43 +01:00
parent 01e0d1de5c
commit 636aa721dc
2 changed files with 18 additions and 1 deletions

View file

@ -1128,3 +1128,15 @@ def test_default_calc():
od2 = OptionDescription('root', '', [od1]) od2 = OptionDescription('root', '', [od1])
cfg = Config(od2) cfg = Config(od2)
assert parse_od_get(cfg.value.get()) == {'od.interface0.var1': [{'od.interface0.var1': 'leader1', 'od.interface0.var2': ['leader1']}, {'od.interface0.var1': 'leader2', 'od.interface0.var2': ['leader2']}]} assert parse_od_get(cfg.value.get()) == {'od.interface0.var1': [{'od.interface0.var1': 'leader1', 'od.interface0.var2': ['leader1']}, {'od.interface0.var1': 'leader2', 'od.interface0.var2': ['leader2']}]}
def test_default_set_calc():
var1 = StrOption('var1', "", multi=True, properties=frozenset({"mandatory", "novalidator", "force_store_value"}))
var2 = StrOption('var2', "", default_multi=[Calculation(calc_value, Params((ParamOption(var1))))], multi=submulti, properties=frozenset({"mandatory",}))
leader = Leadership('interface0', '', [var1, var2])
od1 = OptionDescription('od', '', [leader])
od2 = OptionDescription('root', '', [od1])
cfg = Config(od2)
cfg.property.read_write()
cfg.option('od.interface0.var1').value.set(Calculation(calc_value, Params(ParamValue(['leader1', 'leader2']))))
assert parse_od_get(cfg.value.get()) == {'od.interface0.var1': [{'od.interface0.var1': 'leader1', 'od.interface0.var2': ['leader1']}, {'od.interface0.var1': 'leader2', 'od.interface0.var2': ['leader2']}]}

View file

@ -318,13 +318,18 @@ class Values:
elif isinstance(value, list): elif isinstance(value, list):
# copy # copy
value = value.copy() value = value.copy()
elif isinstance(value, Calculation):
value, _has_calculation = get_calculated_value(
subconfig,
value,
)
self._setvalue( self._setvalue(
subconfig, subconfig,
ori_value, ori_value,
owner, owner,
) )
if ( if (
"force_store_value" in setting_properties "force_store_value" in self_properties
and subconfig.option.impl_is_leader() and subconfig.option.impl_is_leader()
): ):
leader = subconfig.option.impl_get_leadership() leader = subconfig.option.impl_get_leadership()