From af6d11f4570dfd16711ed265575b93f376a526be Mon Sep 17 00:00:00 2001 From: Emmanuel Garette Date: Sun, 28 Sep 2025 15:50:26 +0200 Subject: [PATCH] feat: default value for a calculated variable with an unknown optional variable --- src/rougail/output_formatter/__init__.py | 10 ++++++ .../rougail/00-base.yml | 16 +++++++++ tests/results/00_6ip/rougail/00-base.yml | 25 +++++++++++++ tests/results/00_6network/rougail/00-base.yml | 23 ++++++++++++ .../rougail/00-base.yml | 13 +++++++ .../rougail/00-base.yml | 1 - .../rougail/00-base.yml | 15 ++++++++ .../rougail/00-base.yml | 36 +++++++++++++++++++ .../rougail/00-base.yml | 1 - .../rougail/00-base.yml | 18 ++++++++++ .../rougail/00-base.yml | 1 - .../rougail/00-base.yml | 15 ++++++++ .../rougail/00-base.yml | 1 - .../rougail/00-base.yml | 1 - .../rougail/00-base.yml | 1 - .../rougail/00-base.yml | 1 - .../rougail/00-base.yml | 1 - tests/test_load.py | 2 +- 18 files changed, 172 insertions(+), 9 deletions(-) create mode 100644 tests/results/00_2default_calculated_variable/rougail/00-base.yml create mode 100644 tests/results/00_6ip/rougail/00-base.yml create mode 100644 tests/results/00_6network/rougail/00-base.yml create mode 100644 tests/results/00_9default_calculation_multi_optional_default/rougail/00-base.yml create mode 100644 tests/results/01_9choice_variable_optional/rougail/00-base.yml create mode 100644 tests/results/04_5disabled_calculation_optional_default/rougail/00-base.yml create mode 100644 tests/results/40_2leadership_calculation_index_2/rougail/00-base.yml create mode 100644 tests/results/60_0family_dynamic_variable_optional/rougail/00-base.yml diff --git a/src/rougail/output_formatter/__init__.py b/src/rougail/output_formatter/__init__.py index 555c178..7778850 100644 --- a/src/rougail/output_formatter/__init__.py +++ b/src/rougail/output_formatter/__init__.py @@ -323,6 +323,16 @@ class RougailOutputFormatter: ): del variable["mandatory"] if "default" in variable: + if isinstance(obj.default, VariableCalculation): + is_multi = "multi" in variable and variable["multi"] is True + if "type" in variable or is_multi: + other_path = self.rougail.paths.get_full_path(obj.default.variable, path) + if other_path in self.rougail.paths: + other_obj = self.rougail.paths[other_path] + if "type" in variable and variable["type"] == other_obj.type: + del variable["type"] + if is_multi and obj.multi: + del variable["multi"] if "type" in variable and variable["type"] in [ "string", "boolean", diff --git a/tests/results/00_2default_calculated_variable/rougail/00-base.yml b/tests/results/00_2default_calculated_variable/rougail/00-base.yml new file mode 100644 index 0000000..1a5cf06 --- /dev/null +++ b/tests/results/00_2default_calculated_variable/rougail/00-base.yml @@ -0,0 +1,16 @@ +%YAML 1.2 +--- +version: 1.1 + +var1: + description: a first variable + type: domainname + params: + allow_ip: true + multi: true + +var2: + description: a second variable + default: + variable: _.var1 +... diff --git a/tests/results/00_6ip/rougail/00-base.yml b/tests/results/00_6ip/rougail/00-base.yml new file mode 100644 index 0000000..3322b58 --- /dev/null +++ b/tests/results/00_6ip/rougail/00-base.yml @@ -0,0 +1,25 @@ +%YAML 1.2 +--- +version: 1.1 + +var1: + description: an IP + type: ip + default: 1.1.1.1 + +var2: + description: an IP in CIDR format + examples: + - 192.168.0.128/25 + type: ip + params: + cidr: true + default: 1.1.1.1/24 + +var3: + description: an IP in CIDR format with obsolete CIDR type + type: ip + params: + cidr: true + default: 1.1.1.1/24 +... diff --git a/tests/results/00_6network/rougail/00-base.yml b/tests/results/00_6network/rougail/00-base.yml new file mode 100644 index 0000000..bcf1074 --- /dev/null +++ b/tests/results/00_6network/rougail/00-base.yml @@ -0,0 +1,23 @@ +%YAML 1.2 +--- +version: 1.1 + +var1: + description: an network + type: network + default: 1.1.1.0 + +var2: + description: an network in CIDR format + type: network + params: + cidr: true + default: 1.1.1.0/24 + +var3: + description: an network in CIDR format with obsolete CIDR type + type: network + params: + cidr: true + default: 1.1.1.0/24 +... diff --git a/tests/results/00_9default_calculation_multi_optional_default/rougail/00-base.yml b/tests/results/00_9default_calculation_multi_optional_default/rougail/00-base.yml new file mode 100644 index 0000000..0ae6c0c --- /dev/null +++ b/tests/results/00_9default_calculation_multi_optional_default/rougail/00-base.yml @@ -0,0 +1,13 @@ +%YAML 1.2 +--- +version: 1.1 + +my_variable: val1 + +my_calculated_variable: + - variable: _.my_variable + optional: true + - variable: _.my_variable_unexists + optional: true + default: value +... diff --git a/tests/results/00_9default_calculation_optional_exists/rougail/00-base.yml b/tests/results/00_9default_calculation_optional_exists/rougail/00-base.yml index 1afa927..0faf25d 100644 --- a/tests/results/00_9default_calculation_optional_exists/rougail/00-base.yml +++ b/tests/results/00_9default_calculation_optional_exists/rougail/00-base.yml @@ -7,7 +7,6 @@ my_variable: - val2 my_calculated_variable: - multi: true default: variable: _.my_variable optional: true diff --git a/tests/results/01_9choice_variable_optional/rougail/00-base.yml b/tests/results/01_9choice_variable_optional/rougail/00-base.yml new file mode 100644 index 0000000..5a88782 --- /dev/null +++ b/tests/results/01_9choice_variable_optional/rougail/00-base.yml @@ -0,0 +1,15 @@ +%YAML 1.2 +--- +version: 1.1 + +variable: + description: a variable + choices: + variable: _.unknown_variable + optional: true + default: + - a + - b + - c + default: c +... diff --git a/tests/results/04_5disabled_calculation_optional_default/rougail/00-base.yml b/tests/results/04_5disabled_calculation_optional_default/rougail/00-base.yml new file mode 100644 index 0000000..463aa7d --- /dev/null +++ b/tests/results/04_5disabled_calculation_optional_default/rougail/00-base.yml @@ -0,0 +1,36 @@ +%YAML 1.2 +--- +version: 1.1 + +condition: false # a condition + +var1: + description: a first variable + mandatory: false + hidden: + variable: _.unknown + optional: true + +var2: + description: a first variable + mandatory: false + hidden: + variable: _.unknown + optional: true + default: true + +var3: + description: a second variable + mandatory: false + hidden: + variable: _.condition + optional: true + default: true + +var4: + description: a forth variable + mandatory: false + hidden: + variable: _.condition + optional: true +... diff --git a/tests/results/40_0leadership_follower_default_submulti_calculation/rougail/00-base.yml b/tests/results/40_0leadership_follower_default_submulti_calculation/rougail/00-base.yml index 3da0bed..7cde7f8 100644 --- a/tests/results/40_0leadership_follower_default_submulti_calculation/rougail/00-base.yml +++ b/tests/results/40_0leadership_follower_default_submulti_calculation/rougail/00-base.yml @@ -14,7 +14,6 @@ leader: follower2: description: the follower2 - multi: true default: variable: _.follower1 ... diff --git a/tests/results/40_2leadership_calculation_index_2/rougail/00-base.yml b/tests/results/40_2leadership_calculation_index_2/rougail/00-base.yml new file mode 100644 index 0000000..5bfbc58 --- /dev/null +++ b/tests/results/40_2leadership_calculation_index_2/rougail/00-base.yml @@ -0,0 +1,18 @@ +%YAML 1.2 +--- +version: 1.1 + +leader: + description: a leadership + type: leadership + + leader: # a leader + - a + - b + - c + + follower1: + description: a follower + default: + type: index +... diff --git a/tests/results/40_9leadership-calculation-outside-follower/rougail/00-base.yml b/tests/results/40_9leadership-calculation-outside-follower/rougail/00-base.yml index db36ec8..a6426d9 100644 --- a/tests/results/40_9leadership-calculation-outside-follower/rougail/00-base.yml +++ b/tests/results/40_9leadership-calculation-outside-follower/rougail/00-base.yml @@ -16,7 +16,6 @@ leader: calculate: description: a calculated variable - multi: true default: variable: _.leader.follower1 unique: false diff --git a/tests/results/60_0family_dynamic_variable_optional/rougail/00-base.yml b/tests/results/60_0family_dynamic_variable_optional/rougail/00-base.yml new file mode 100644 index 0000000..b4f2a6b --- /dev/null +++ b/tests/results/60_0family_dynamic_variable_optional/rougail/00-base.yml @@ -0,0 +1,15 @@ +%YAML 1.2 +--- +version: 1.1 + +dyn{{ identifier }}: + description: a dynamic family + dynamic: + variable: _.unknown_var + optional: true + default: + - a + - b + + var: val # a variable inside dynamic family +... diff --git a/tests/results/60_5family_dynamic_variable_outside/rougail/00-base.yml b/tests/results/60_5family_dynamic_variable_outside/rougail/00-base.yml index bfec94f..0ddf449 100644 --- a/tests/results/60_5family_dynamic_variable_outside/rougail/00-base.yml +++ b/tests/results/60_5family_dynamic_variable_outside/rougail/00-base.yml @@ -19,7 +19,6 @@ my_dyn_family_{{ identifier }}: var2: description: a variable - multi: true default: variable: _.my_dyn_family_{{ identifier }}.var ... diff --git a/tests/results/60_5family_dynamic_variable_outside2/rougail/00-base.yml b/tests/results/60_5family_dynamic_variable_outside2/rougail/00-base.yml index c6a9038..cfe6738 100644 --- a/tests/results/60_5family_dynamic_variable_outside2/rougail/00-base.yml +++ b/tests/results/60_5family_dynamic_variable_outside2/rougail/00-base.yml @@ -4,7 +4,6 @@ version: 1.1 var2: description: a variable - multi: true default: variable: _.my_dyn_family_{{ identifier }}.var diff --git a/tests/results/60_5family_dynamic_variable_outside2_empty/rougail/00-base.yml b/tests/results/60_5family_dynamic_variable_outside2_empty/rougail/00-base.yml index 6724bdc..3509e00 100644 --- a/tests/results/60_5family_dynamic_variable_outside2_empty/rougail/00-base.yml +++ b/tests/results/60_5family_dynamic_variable_outside2_empty/rougail/00-base.yml @@ -4,7 +4,6 @@ version: 1.1 var2: description: a variable - multi: true default: variable: _.my_dyn_family_{{ identifier }}.var diff --git a/tests/results/60_5family_dynamic_variable_outside_1_0/rougail/00-base.yml b/tests/results/60_5family_dynamic_variable_outside_1_0/rougail/00-base.yml index bfe80df..b237cf1 100644 --- a/tests/results/60_5family_dynamic_variable_outside_1_0/rougail/00-base.yml +++ b/tests/results/60_5family_dynamic_variable_outside_1_0/rougail/00-base.yml @@ -20,7 +20,6 @@ my_dyn_family_{{ identifier }}: var2: description: a variable - multi: true default: variable: _.my_dyn_family_{{ identifier }}.var ... diff --git a/tests/results/60_5family_dynamic_variable_outside_empty/rougail/00-base.yml b/tests/results/60_5family_dynamic_variable_outside_empty/rougail/00-base.yml index 007e8d7..4609575 100644 --- a/tests/results/60_5family_dynamic_variable_outside_empty/rougail/00-base.yml +++ b/tests/results/60_5family_dynamic_variable_outside_empty/rougail/00-base.yml @@ -23,7 +23,6 @@ my_dyn_family_{{ identifier }}: var2: description: a variable - multi: true default: variable: _.my_dyn_family_{{ identifier }}.var ... diff --git a/tests/test_load.py b/tests/test_load.py index a16b655..03f7201 100644 --- a/tests/test_load.py +++ b/tests/test_load.py @@ -15,7 +15,7 @@ excludes = [ ] test_ok = get_structures_list(excludes) -test_ok = [Path('../rougail-tests/structures/00_2default_calculated_variable')] +# test_ok = [Path('../rougail-tests/structures/00_2default_calculated_variable')] def idfn(fixture_value):