From 21f416b7b8eaaedc1cf16330d87047d3c5324daf Mon Sep 17 00:00:00 2001 From: Emmanuel Garette Date: Wed, 18 Mar 2026 20:48:37 +0100 Subject: [PATCH] feat: support leadership inside types --- src/rougail/types.py | 2 -- tests/test_types.py | 8 +++++ .../result/leadership/namespace_tiramisu.py | 33 +++++++++++++++++ .../leadership/namespace_variables.json | 36 +++++++++++++++++++ .../leadership/namespace_variables_rw.json | 36 +++++++++++++++++++ tests/types/result/leadership/tiramisu.py | 34 ++++++++++++++++++ tests/types/result/leadership/variables.json | 36 +++++++++++++++++++ .../types/result/leadership/variables_rw.json | 36 +++++++++++++++++++ .../structures/leadership/00_structure.yml | 30 ++++++++++++++++ tests/types/types/leadership/00_type.yml | 16 +++++++++ 10 files changed, 265 insertions(+), 2 deletions(-) create mode 100644 tests/types/result/leadership/namespace_tiramisu.py create mode 100644 tests/types/result/leadership/namespace_variables.json create mode 100644 tests/types/result/leadership/namespace_variables_rw.json create mode 100644 tests/types/result/leadership/tiramisu.py create mode 100644 tests/types/result/leadership/variables.json create mode 100644 tests/types/result/leadership/variables_rw.json create mode 100644 tests/types/structures/leadership/00_structure.yml create mode 100644 tests/types/types/leadership/00_type.yml diff --git a/src/rougail/types.py b/src/rougail/types.py index 474f29904..aa4111841 100644 --- a/src/rougail/types.py +++ b/src/rougail/types.py @@ -68,8 +68,6 @@ def to_dict_family(family_name, paths, parents, families, root=True): variable = paths[variable_path] variable_name = variable.name if variable_path in families: - if variable.type == "leadership": - raise DictConsistencyError(_("type is not compatible with leadership family"), 86, variable.xmlfiles) if variable_name in ret: ret["_" + variable_name] = ret.pop(variable_name) ret[variable_name] = to_dict_family(variable.path, paths, parents, families, False) diff --git a/tests/test_types.py b/tests/test_types.py index 0c7199168..a368339af 100644 --- a/tests/test_types.py +++ b/tests/test_types.py @@ -139,3 +139,11 @@ def test_type_error_version(): def test_type_family_name_description(): type_variable("family_name_description") + + +def test_type_leadership(): + type_variable("leadership") + + +def test_type_leadership_namespace(): + type_variable("leadership", namespace=True) diff --git a/tests/types/result/leadership/namespace_tiramisu.py b/tests/types/result/leadership/namespace_tiramisu.py new file mode 100644 index 000000000..72430909e --- /dev/null +++ b/tests/types/result/leadership/namespace_tiramisu.py @@ -0,0 +1,33 @@ +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_3 = StrOption(name="a_leader", doc="My first variable", multi=True, default=["a value"], properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml'], 'type': 'string'}) +option_4 = StrOption(name="a_first_follower", doc="My second variable", multi=True, default_multi="an other value", properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml'], 'type': 'string'}) +option_5 = StrOption(name="a_second_follower", doc="My third variable", multi=True, default_multi="again an other value", properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml'], 'type': 'string'}) +optiondescription_2 = Leadership(name="my_leadership", doc="my_leadership", children=[option_3, option_4, option_5], properties=frozenset({"standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml']}) +optiondescription_1 = OptionDescription(name="my_leadership_1", doc="My family type", children=[optiondescription_2], properties=frozenset({"standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml', 'tests/types/structures/leadership/00_structure.yml']}) +option_8 = StrOption(name="a_leader", doc="My first variable", multi=True, default=["a value"], properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml'], 'type': 'string'}) +option_9 = StrOption(name="a_first_follower", doc="My second variable", multi=True, default_multi="a modified value", properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml', 'tests/types/structures/leadership/00_structure.yml'], 'type': 'string'}) +option_10 = StrOption(name="a_second_follower", doc="My third variable", multi=True, default_multi="again an other value", properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml'], 'type': 'string'}) +optiondescription_7 = Leadership(name="my_leadership", doc="my_leadership", children=[option_8, option_9, option_10], properties=frozenset({"standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml', 'tests/types/structures/leadership/00_structure.yml']}) +optiondescription_6 = OptionDescription(name="my_leadership_2", doc="My family type", children=[optiondescription_7], properties=frozenset({"standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml', 'tests/types/structures/leadership/00_structure.yml']}) +option_13 = StrOption(name="a_leader", doc="My first variable", multi=True, default=["a value"], properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml'], 'type': 'string'}) +option_14 = StrOption(name="a_first_follower", doc="My second variable", multi=True, default_multi="an other value", properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml'], 'type': 'string'}) +option_15 = StrOption(name="a_second_follower", doc="My third variable", multi=True, default_multi="again an other value", properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml'], 'type': 'string'}) +option_16 = StrOption(name="a_new_follower", doc="a description", multi=True, default_multi="a value", properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['tests/types/structures/leadership/00_structure.yml'], 'type': 'string'}) +optiondescription_12 = Leadership(name="my_leadership", doc="my_leadership", children=[option_13, option_14, option_15, option_16], properties=frozenset({"standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml', 'tests/types/structures/leadership/00_structure.yml']}) +optiondescription_11 = OptionDescription(name="my_leadership_3", doc="My family type", children=[optiondescription_12], properties=frozenset({"standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml', 'tests/types/structures/leadership/00_structure.yml']}) +option_19 = StrOption(name="a_leader", doc="a description", multi=True, default=["a value leader", "a second leader"], properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml', 'tests/types/structures/leadership/00_structure.yml'], 'type': 'string'}) +option_20 = StrOption(name="a_first_follower", doc="My second variable", multi=True, default_multi="an other value", properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml'], 'type': 'string'}) +option_21 = StrOption(name="a_second_follower", doc="My third variable", multi=True, default_multi="again an other value", properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml'], 'type': 'string'}) +optiondescription_18 = Leadership(name="my_leadership", doc="my_leadership", children=[option_19, option_20, option_21], properties=frozenset({"standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml', 'tests/types/structures/leadership/00_structure.yml']}) +optiondescription_17 = OptionDescription(name="my_leadership_4", doc="My family type", children=[optiondescription_18], properties=frozenset({"standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml', 'tests/types/structures/leadership/00_structure.yml']}) +option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[optiondescription_1, optiondescription_6, optiondescription_11, optiondescription_17]) diff --git a/tests/types/result/leadership/namespace_variables.json b/tests/types/result/leadership/namespace_variables.json new file mode 100644 index 000000000..5731c61c4 --- /dev/null +++ b/tests/types/result/leadership/namespace_variables.json @@ -0,0 +1,36 @@ +{ + "my_leadership_1.my_leadership.a_leader": [ + { + "my_leadership_1.my_leadership.a_leader": "a value", + "my_leadership_1.my_leadership.a_first_follower": "an other value", + "my_leadership_1.my_leadership.a_second_follower": "again an other value" + } + ], + "my_leadership_2.my_leadership.a_leader": [ + { + "my_leadership_2.my_leadership.a_leader": "a value", + "my_leadership_2.my_leadership.a_first_follower": "a modified value", + "my_leadership_2.my_leadership.a_second_follower": "again an other value" + } + ], + "my_leadership_3.my_leadership.a_leader": [ + { + "my_leadership_3.my_leadership.a_leader": "a value", + "my_leadership_3.my_leadership.a_first_follower": "an other value", + "my_leadership_3.my_leadership.a_second_follower": "again an other value", + "my_leadership_3.my_leadership.a_new_follower": "a value" + } + ], + "my_leadership_4.my_leadership.a_leader": [ + { + "my_leadership_4.my_leadership.a_leader": "a value leader", + "my_leadership_4.my_leadership.a_first_follower": "an other value", + "my_leadership_4.my_leadership.a_second_follower": "again an other value" + }, + { + "my_leadership_4.my_leadership.a_leader": "a second leader", + "my_leadership_4.my_leadership.a_first_follower": "an other value", + "my_leadership_4.my_leadership.a_second_follower": "again an other value" + } + ] +} \ No newline at end of file diff --git a/tests/types/result/leadership/namespace_variables_rw.json b/tests/types/result/leadership/namespace_variables_rw.json new file mode 100644 index 000000000..5731c61c4 --- /dev/null +++ b/tests/types/result/leadership/namespace_variables_rw.json @@ -0,0 +1,36 @@ +{ + "my_leadership_1.my_leadership.a_leader": [ + { + "my_leadership_1.my_leadership.a_leader": "a value", + "my_leadership_1.my_leadership.a_first_follower": "an other value", + "my_leadership_1.my_leadership.a_second_follower": "again an other value" + } + ], + "my_leadership_2.my_leadership.a_leader": [ + { + "my_leadership_2.my_leadership.a_leader": "a value", + "my_leadership_2.my_leadership.a_first_follower": "a modified value", + "my_leadership_2.my_leadership.a_second_follower": "again an other value" + } + ], + "my_leadership_3.my_leadership.a_leader": [ + { + "my_leadership_3.my_leadership.a_leader": "a value", + "my_leadership_3.my_leadership.a_first_follower": "an other value", + "my_leadership_3.my_leadership.a_second_follower": "again an other value", + "my_leadership_3.my_leadership.a_new_follower": "a value" + } + ], + "my_leadership_4.my_leadership.a_leader": [ + { + "my_leadership_4.my_leadership.a_leader": "a value leader", + "my_leadership_4.my_leadership.a_first_follower": "an other value", + "my_leadership_4.my_leadership.a_second_follower": "again an other value" + }, + { + "my_leadership_4.my_leadership.a_leader": "a second leader", + "my_leadership_4.my_leadership.a_first_follower": "an other value", + "my_leadership_4.my_leadership.a_second_follower": "again an other value" + } + ] +} \ No newline at end of file diff --git a/tests/types/result/leadership/tiramisu.py b/tests/types/result/leadership/tiramisu.py new file mode 100644 index 000000000..3468af947 --- /dev/null +++ b/tests/types/result/leadership/tiramisu.py @@ -0,0 +1,34 @@ +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 = StrOption(name="a_leader", doc="My first variable", multi=True, default=["a value"], properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml'], 'type': 'string'}) +option_5 = StrOption(name="a_first_follower", doc="My second variable", multi=True, default_multi="an other value", properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml'], 'type': 'string'}) +option_6 = StrOption(name="a_second_follower", doc="My third variable", multi=True, default_multi="again an other value", properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml'], 'type': 'string'}) +optiondescription_3 = Leadership(name="my_leadership", doc="my_leadership", children=[option_4, option_5, option_6], properties=frozenset({"standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml']}) +optiondescription_2 = OptionDescription(name="my_leadership_1", doc="My family type", children=[optiondescription_3], properties=frozenset({"standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml', 'tests/types/structures/leadership/00_structure.yml']}) +option_9 = StrOption(name="a_leader", doc="My first variable", multi=True, default=["a value"], properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml'], 'type': 'string'}) +option_10 = StrOption(name="a_first_follower", doc="My second variable", multi=True, default_multi="a modified value", properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml', 'tests/types/structures/leadership/00_structure.yml'], 'type': 'string'}) +option_11 = StrOption(name="a_second_follower", doc="My third variable", multi=True, default_multi="again an other value", properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml'], 'type': 'string'}) +optiondescription_8 = Leadership(name="my_leadership", doc="my_leadership", children=[option_9, option_10, option_11], properties=frozenset({"standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml', 'tests/types/structures/leadership/00_structure.yml']}) +optiondescription_7 = OptionDescription(name="my_leadership_2", doc="My family type", children=[optiondescription_8], properties=frozenset({"standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml', 'tests/types/structures/leadership/00_structure.yml']}) +option_14 = StrOption(name="a_leader", doc="My first variable", multi=True, default=["a value"], properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml'], 'type': 'string'}) +option_15 = StrOption(name="a_first_follower", doc="My second variable", multi=True, default_multi="an other value", properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml'], 'type': 'string'}) +option_16 = StrOption(name="a_second_follower", doc="My third variable", multi=True, default_multi="again an other value", properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml'], 'type': 'string'}) +option_17 = StrOption(name="a_new_follower", doc="a description", multi=True, default_multi="a value", properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['tests/types/structures/leadership/00_structure.yml'], 'type': 'string'}) +optiondescription_13 = Leadership(name="my_leadership", doc="my_leadership", children=[option_14, option_15, option_16, option_17], properties=frozenset({"standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml', 'tests/types/structures/leadership/00_structure.yml']}) +optiondescription_12 = OptionDescription(name="my_leadership_3", doc="My family type", children=[optiondescription_13], properties=frozenset({"standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml', 'tests/types/structures/leadership/00_structure.yml']}) +option_20 = StrOption(name="a_leader", doc="a description", multi=True, default=["a value leader", "a second leader"], properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml', 'tests/types/structures/leadership/00_structure.yml'], 'type': 'string'}) +option_21 = StrOption(name="a_first_follower", doc="My second variable", multi=True, default_multi="an other value", properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml'], 'type': 'string'}) +option_22 = StrOption(name="a_second_follower", doc="My third variable", multi=True, default_multi="again an other value", properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml'], 'type': 'string'}) +optiondescription_19 = Leadership(name="my_leadership", doc="my_leadership", children=[option_20, option_21, option_22], properties=frozenset({"standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml', 'tests/types/structures/leadership/00_structure.yml']}) +optiondescription_18 = OptionDescription(name="my_leadership_4", doc="My family type", children=[optiondescription_19], properties=frozenset({"standard"}), informations={'ymlfiles': ['tests/types/types/leadership/00_type.yml', 'tests/types/structures/leadership/00_structure.yml']}) +optiondescription_1 = OptionDescription(name="ns2", doc="NS2", group_type=groups.namespace, children=[optiondescription_2, optiondescription_7, optiondescription_12, optiondescription_18], properties=frozenset({"standard"})) +option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[optiondescription_1]) diff --git a/tests/types/result/leadership/variables.json b/tests/types/result/leadership/variables.json new file mode 100644 index 000000000..f6bf4e498 --- /dev/null +++ b/tests/types/result/leadership/variables.json @@ -0,0 +1,36 @@ +{ + "ns2.my_leadership_1.my_leadership.a_leader": [ + { + "ns2.my_leadership_1.my_leadership.a_leader": "a value", + "ns2.my_leadership_1.my_leadership.a_first_follower": "an other value", + "ns2.my_leadership_1.my_leadership.a_second_follower": "again an other value" + } + ], + "ns2.my_leadership_2.my_leadership.a_leader": [ + { + "ns2.my_leadership_2.my_leadership.a_leader": "a value", + "ns2.my_leadership_2.my_leadership.a_first_follower": "a modified value", + "ns2.my_leadership_2.my_leadership.a_second_follower": "again an other value" + } + ], + "ns2.my_leadership_3.my_leadership.a_leader": [ + { + "ns2.my_leadership_3.my_leadership.a_leader": "a value", + "ns2.my_leadership_3.my_leadership.a_first_follower": "an other value", + "ns2.my_leadership_3.my_leadership.a_second_follower": "again an other value", + "ns2.my_leadership_3.my_leadership.a_new_follower": "a value" + } + ], + "ns2.my_leadership_4.my_leadership.a_leader": [ + { + "ns2.my_leadership_4.my_leadership.a_leader": "a value leader", + "ns2.my_leadership_4.my_leadership.a_first_follower": "an other value", + "ns2.my_leadership_4.my_leadership.a_second_follower": "again an other value" + }, + { + "ns2.my_leadership_4.my_leadership.a_leader": "a second leader", + "ns2.my_leadership_4.my_leadership.a_first_follower": "an other value", + "ns2.my_leadership_4.my_leadership.a_second_follower": "again an other value" + } + ] +} \ No newline at end of file diff --git a/tests/types/result/leadership/variables_rw.json b/tests/types/result/leadership/variables_rw.json new file mode 100644 index 000000000..f6bf4e498 --- /dev/null +++ b/tests/types/result/leadership/variables_rw.json @@ -0,0 +1,36 @@ +{ + "ns2.my_leadership_1.my_leadership.a_leader": [ + { + "ns2.my_leadership_1.my_leadership.a_leader": "a value", + "ns2.my_leadership_1.my_leadership.a_first_follower": "an other value", + "ns2.my_leadership_1.my_leadership.a_second_follower": "again an other value" + } + ], + "ns2.my_leadership_2.my_leadership.a_leader": [ + { + "ns2.my_leadership_2.my_leadership.a_leader": "a value", + "ns2.my_leadership_2.my_leadership.a_first_follower": "a modified value", + "ns2.my_leadership_2.my_leadership.a_second_follower": "again an other value" + } + ], + "ns2.my_leadership_3.my_leadership.a_leader": [ + { + "ns2.my_leadership_3.my_leadership.a_leader": "a value", + "ns2.my_leadership_3.my_leadership.a_first_follower": "an other value", + "ns2.my_leadership_3.my_leadership.a_second_follower": "again an other value", + "ns2.my_leadership_3.my_leadership.a_new_follower": "a value" + } + ], + "ns2.my_leadership_4.my_leadership.a_leader": [ + { + "ns2.my_leadership_4.my_leadership.a_leader": "a value leader", + "ns2.my_leadership_4.my_leadership.a_first_follower": "an other value", + "ns2.my_leadership_4.my_leadership.a_second_follower": "again an other value" + }, + { + "ns2.my_leadership_4.my_leadership.a_leader": "a second leader", + "ns2.my_leadership_4.my_leadership.a_first_follower": "an other value", + "ns2.my_leadership_4.my_leadership.a_second_follower": "again an other value" + } + ] +} \ No newline at end of file diff --git a/tests/types/structures/leadership/00_structure.yml b/tests/types/structures/leadership/00_structure.yml new file mode 100644 index 000000000..e0e02f29f --- /dev/null +++ b/tests/types/structures/leadership/00_structure.yml @@ -0,0 +1,30 @@ +%YAML 1.2 +--- +version: 1.1 + +my_leadership_1: + type: my_family_type_with_leadership + +my_leadership_2: + type: my_family_type_with_leadership + + my_leadership: + + a_first_follower: a modified value + +my_leadership_3: + type: my_family_type_with_leadership + + my_leadership: + + a_new_follower: a value # a description + +my_leadership_4: + type: my_family_type_with_leadership + + my_leadership: + + a_leader: # a description + - a value leader + - a second leader +... diff --git a/tests/types/types/leadership/00_type.yml b/tests/types/types/leadership/00_type.yml new file mode 100644 index 000000000..f972ba48a --- /dev/null +++ b/tests/types/types/leadership/00_type.yml @@ -0,0 +1,16 @@ +%YAML 1.2 +--- +version: 1.1 + +my_family_type_with_leadership: # My family type + + my_leadership: + type: leadership + + a_leader: # My first variable + - a value + + a_first_follower: an other value # My second variable + + a_second_follower: again an other value # My third variable +...