From 1c5dd865b99166e4b9e200560f6ec66804e02db2 Mon Sep 17 00:00:00 2001 From: Emmanuel Garette Date: Tue, 16 Jun 2026 08:06:20 +0200 Subject: [PATCH] fix: we can redefine type of a types child --- src/rougail/convert/collect.py | 6 +++--- tests/test_types.py | 8 ++++++++ .../family_redefine_type/namespace_tiramisu.py | 14 ++++++++++++++ .../family_redefine_type/namespace_variables.json | 3 +++ .../namespace_variables_rw.json | 3 +++ .../types/result/family_redefine_type/tiramisu.py | 15 +++++++++++++++ .../result/family_redefine_type/variables.json | 3 +++ .../result/family_redefine_type/variables_rw.json | 3 +++ .../family_redefine_type/00_structure.yml | 11 +++++++++++ .../types/types/family_redefine_type/00_type.yml | 13 +++++++++++++ 10 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 tests/types/result/family_redefine_type/namespace_tiramisu.py create mode 100644 tests/types/result/family_redefine_type/namespace_variables.json create mode 100644 tests/types/result/family_redefine_type/namespace_variables_rw.json create mode 100644 tests/types/result/family_redefine_type/tiramisu.py create mode 100644 tests/types/result/family_redefine_type/variables.json create mode 100644 tests/types/result/family_redefine_type/variables_rw.json create mode 100644 tests/types/structures/family_redefine_type/00_structure.yml create mode 100644 tests/types/types/family_redefine_type/00_type.yml diff --git a/src/rougail/convert/collect.py b/src/rougail/convert/collect.py index 27145e715..2e135090f 100644 --- a/src/rougail/convert/collect.py +++ b/src/rougail/convert/collect.py @@ -286,7 +286,7 @@ class CollectType: raise DictConsistencyError(msg, 43, self.sources) break - def set_custom_type(self, custom: dict) -> None: + def set_custom_type(self, custom: dict, from_parent: bool=False) -> None: if self.raises and self.test_exists and self.path in self.objectspace.paths: msg = f'cannot redefine "{self.path}" object to a custom type' raise DictConsistencyError(msg, 64, self.sources) @@ -298,7 +298,7 @@ class CollectType: self.user_type = self.types.user_type self.sources = self.types.sources + self.sources self.object = self.types.object - if self.option_type == "variable" and "type" in self.parameters: + if not from_parent and self.option_type == "variable" and "type" in self.parameters: self.parameters.pop("type") def set_object_user_type_family(self): @@ -461,7 +461,7 @@ class Collect(CollectType, CollectFamily, CollectVariable): self.user_type = None self.option_type = None if parent_option is not None and parent_option.types is not None and self.name in parent_option.types.children: - self.set_custom_type(parent_option.types.children[self.name]) + self.set_custom_type(parent_option.types.children[self.name], from_parent=True) self.check_no_extra_keys = False if self.test_exists and path in objectspace.paths: for source in reversed(self.objectspace.paths[path].xmlfiles): diff --git a/tests/test_types.py b/tests/test_types.py index e5f49c7d7..a93cfb554 100644 --- a/tests/test_types.py +++ b/tests/test_types.py @@ -173,3 +173,11 @@ def test_type_family_secret(): def test_type_family_secret_namespace(): type_variable("family_secret_manager", namespace=True) + + +def test_type_family_redefine_type(): + type_variable("family_redefine_type") + + +def test_type_family_redefine_type_namespace(): + type_variable("family_redefine_type", namespace=True) diff --git a/tests/types/result/family_redefine_type/namespace_tiramisu.py b/tests/types/result/family_redefine_type/namespace_tiramisu.py new file mode 100644 index 000000000..223c0e321 --- /dev/null +++ b/tests/types/result/family_redefine_type/namespace_tiramisu.py @@ -0,0 +1,14 @@ +from tiramisu import * +from tiramisu.setting import ALLOWED_LEADER_PROPERTIES +from re import compile as re_compile +from rougail.tiramisu import func, dict_env, load_functions, ConvertDynOptionDescription +try: + groups.namespace +except: + groups.addgroup('namespace') +ALLOWED_LEADER_PROPERTIES.add("basic") +ALLOWED_LEADER_PROPERTIES.add("standard") +ALLOWED_LEADER_PROPERTIES.add("advanced") +option_2 = PasswordOption(name="my_type", doc="My type", default="a value", properties=frozenset({"mandatory", "one_tag", "standard"}), informations={'ymlfiles': ['tests/types/types/family_redefine_type/00_type.yml', 'tests/types/structures/family_redefine_type/00_structure.yml'], 'type': 'secret', 'tags': ('one_tag',)}) +optiondescription_1 = OptionDescription(name="my_family", doc="My family type", children=[option_2], properties=frozenset({"standard"}), informations={'ymlfiles': ['tests/types/types/family_redefine_type/00_type.yml', 'tests/types/structures/family_redefine_type/00_structure.yml']}) +option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[optiondescription_1]) diff --git a/tests/types/result/family_redefine_type/namespace_variables.json b/tests/types/result/family_redefine_type/namespace_variables.json new file mode 100644 index 000000000..cc45aa4fc --- /dev/null +++ b/tests/types/result/family_redefine_type/namespace_variables.json @@ -0,0 +1,3 @@ +{ + "my_family.my_type": "a value" +} \ No newline at end of file diff --git a/tests/types/result/family_redefine_type/namespace_variables_rw.json b/tests/types/result/family_redefine_type/namespace_variables_rw.json new file mode 100644 index 000000000..cc45aa4fc --- /dev/null +++ b/tests/types/result/family_redefine_type/namespace_variables_rw.json @@ -0,0 +1,3 @@ +{ + "my_family.my_type": "a value" +} \ No newline at end of file diff --git a/tests/types/result/family_redefine_type/tiramisu.py b/tests/types/result/family_redefine_type/tiramisu.py new file mode 100644 index 000000000..1099349ab --- /dev/null +++ b/tests/types/result/family_redefine_type/tiramisu.py @@ -0,0 +1,15 @@ +from tiramisu import * +from tiramisu.setting import ALLOWED_LEADER_PROPERTIES +from re import compile as re_compile +from rougail.tiramisu import func, dict_env, load_functions, ConvertDynOptionDescription +try: + groups.namespace +except: + groups.addgroup('namespace') +ALLOWED_LEADER_PROPERTIES.add("basic") +ALLOWED_LEADER_PROPERTIES.add("standard") +ALLOWED_LEADER_PROPERTIES.add("advanced") +option_4 = PasswordOption(name="my_type", doc="My type", default="a value", properties=frozenset({"mandatory", "one_tag", "standard"}), informations={'ymlfiles': ['tests/types/types/family_redefine_type/00_type.yml', 'tests/types/structures/family_redefine_type/00_structure.yml'], 'type': 'secret', 'tags': ('one_tag',)}) +optiondescription_3 = OptionDescription(name="my_family", doc="My family type", children=[option_4], properties=frozenset({"standard"}), informations={'ymlfiles': ['tests/types/types/family_redefine_type/00_type.yml', 'tests/types/structures/family_redefine_type/00_structure.yml']}) +optiondescription_2 = OptionDescription(name="ns2", doc="NS2", group_type=groups.namespace, children=[optiondescription_3], properties=frozenset({"standard"})) +option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[optiondescription_2]) diff --git a/tests/types/result/family_redefine_type/variables.json b/tests/types/result/family_redefine_type/variables.json new file mode 100644 index 000000000..36946fb4c --- /dev/null +++ b/tests/types/result/family_redefine_type/variables.json @@ -0,0 +1,3 @@ +{ + "ns2.my_family.my_type": "a value" +} \ No newline at end of file diff --git a/tests/types/result/family_redefine_type/variables_rw.json b/tests/types/result/family_redefine_type/variables_rw.json new file mode 100644 index 000000000..36946fb4c --- /dev/null +++ b/tests/types/result/family_redefine_type/variables_rw.json @@ -0,0 +1,3 @@ +{ + "ns2.my_family.my_type": "a value" +} \ No newline at end of file diff --git a/tests/types/structures/family_redefine_type/00_structure.yml b/tests/types/structures/family_redefine_type/00_structure.yml new file mode 100644 index 000000000..58e07649a --- /dev/null +++ b/tests/types/structures/family_redefine_type/00_structure.yml @@ -0,0 +1,11 @@ +%YAML 1.2 +--- +version: 1.1 + +my_family: + type: my_family_type + + my_type: + redefine: true + type: secret +... diff --git a/tests/types/types/family_redefine_type/00_type.yml b/tests/types/types/family_redefine_type/00_type.yml new file mode 100644 index 000000000..a30ed8123 --- /dev/null +++ b/tests/types/types/family_redefine_type/00_type.yml @@ -0,0 +1,13 @@ +%YAML 1.2 +--- +version: 1.1 + +my_family_type: + description: My family type + + my_type: + description: My type + default: a value + tags: + - one_tag +...