feat: value modified in parent config is a default value for current config and can get default owner for an option

This commit is contained in:
egarette@silique.fr 2025-11-03 08:50:43 +01:00
parent 43d3046e4c
commit 585cda5ffc
4 changed files with 41 additions and 9 deletions

View file

@ -87,11 +87,14 @@ def test_none():
conf2 = meta.config('conf2')
assert meta.option('od1.i3').value.get() is conf1.option('od1.i3').value.get() is conf2.option('od1.i3').value.get() is None
assert meta.option('od1.i3').owner.get() is conf1.option('od1.i3').owner.get() is conf2.option('od1.i3').owner.get() is owners.default
assert meta.option('od1.i3').owner.isdefault() and conf1.option('od1.i3').owner.isdefault()
#
#assert meta.option('od1.i3').value.set(3) == []
meta.option('od1.i3').value.set(3)
assert meta.option('od1.i3').value.get() == conf1.option('od1.i3').value.get() == conf2.option('od1.i3').value.get() == 3
assert meta.option('od1.i3').owner.get() is conf1.option('od1.i3').owner.get() is conf2.option('od1.i3').owner.get() is owners.meta1
assert not meta.option('od1.i3').owner.isdefault()
assert conf1.option('od1.i3').owner.isdefault()
#
conf1.option('od1.i3').value.set(2)
assert meta.option('od1.i3').value.get() == conf2.option('od1.i3').value.get() == 3
@ -110,6 +113,8 @@ def test_none():
assert conf1.option('od1.i3').value.get() == 2
assert meta.option('od1.i3').owner.get() is conf2.option('od1.i3').owner.get() is owners.default
assert conf1.option('od1.i3').owner.get() is owners.user
assert meta.option("od1.i3").owner.default() is owners.default
assert conf1.option("od1.i3").owner.default() is owners.default
#
conf1.option('od1.i3').value.reset()
assert meta.option('od1.i3').value.get() is conf1.option('od1.i3').value.get() is conf2.option('od1.i3').value.get() is None

View file

@ -717,10 +717,27 @@ class TiramisuOptionOwner(CommonTiramisuOption):
self._subconfig, validate_meta=not only_self
)
@option_type(["symlink", "option", "with_index"])
def default(self):
values = self._config_bag.context.get_values()
return values.get_default_owner(self._subconfig)
@option_type(["symlink", "option", "with_index"])
def isdefault(self):
"""Is option has defaut value"""
return self._config_bag.context.get_owner(self._subconfig) == owners.default
subconfig = self._subconfig
s_properties = subconfig.properties
if (
"frozen" in s_properties
and "force_default_on_freeze" in s_properties
):
return True
context = self._config_bag.context
subconfig = context._get(
subconfig,
True,
)
return not context.get_values().hasvalue(subconfig.path, index=subconfig.index)
@option_type(["option", "with_index"])
def set(
@ -1775,7 +1792,7 @@ class TiramisuContextOption(TiramisuConfig, _TiramisuOptionWalk):
self,
):
"""Get option path"""
return None
return self._config_bag.context.get_config_path()
def has_dependency(
self,
@ -1840,6 +1857,9 @@ class TiramisuContextOption(TiramisuConfig, _TiramisuOptionWalk):
self._load_dict()
return self._tiramisu_dict.set_updates(body)
def __repr__(self):
return f'<{self.__class__.__name__} path="{self.path()}">'
class _TiramisuContextConfigReset:
def reset(self):
@ -2075,9 +2095,7 @@ class TiramisuAPI(TiramisuHelp):
class ConfigProp(TiramisuAPI, TiramisuContextOption):
def __repr__(self):
return f"<Config path=None>"
pass
class Config(TiramisuAPI, TiramisuContextOption):
"""Root config object that enables us to handle the configuration options"""
@ -2114,9 +2132,6 @@ class Config(TiramisuAPI, TiramisuContextOption):
except ConfigError:
pass
def __repr__(self):
return f"<Config path=None>"
class MetaConfig(TiramisuAPI, TiramisuContextOption):
"""MetaConfig object that enables us to handle the sub configuration's options

View file

@ -1881,5 +1881,5 @@ class KernelMetaConfig(KernelMixConfig):
config,
):
if self._impl_descr is not config.get_description():
raise ValueError(_("metaconfig must " "have the same optiondescription"))
raise ValueError(_("metaconfig must have the same optiondescription"))
super().add_config(config)

View file

@ -126,6 +126,18 @@ class Values:
)
return value, has_calculation
def get_default_owner(
self,
subconfig: "SubConfig",
) -> Any:
msubconfig = self._get_modified_parent(subconfig)
if msubconfig is not None:
# retrieved value from parent config
return msubconfig.config_bag.context.get_values().getowner(
msubconfig
)
return owners.default
def get_default_value(
self,
subconfig: "SubConfig",