From 656df6068f1dd5fa18ac1bba83c8d7e70e1adbfa Mon Sep 17 00:00:00 2001 From: Emmanuel Garette Date: Sat, 1 Nov 2025 10:48:07 +0100 Subject: [PATCH] feat: active warnings for validators --- src/rougail/convert/object_model.py | 7 +++++++ src/rougail/convert/tiramisureflector.py | 6 ++++-- .../makedict/after.json | 6 ++++++ .../makedict/base.json | 3 +++ .../makedict/before.json | 6 ++++++ .../makedict/mandatory.json | 1 + .../makedict/read_write.json | 3 +++ .../04_5validators_warnings/tiramisu/base.py | 16 ++++++++++++++++ .../tiramisu/no_namespace.py | 11 +++++++++++ .../makedict/after.json | 6 ++++++ .../makedict/base.json | 3 +++ .../makedict/before.json | 6 ++++++ .../makedict/mandatory.json | 1 + .../makedict/read_write.json | 3 +++ .../tiramisu/base.py | 15 +++++++++++++++ .../tiramisu/no_namespace.py | 10 ++++++++++ .../tiramisu/no_namespace.py | 11 +++++++++++ .../makedict/after.json | 18 ++++++++++++++++++ .../makedict/base.json | 6 ++++++ .../makedict/before.json | 18 ++++++++++++++++++ .../makedict/mandatory.json | 1 + .../makedict/read_write.json | 6 ++++++ .../tiramisu/base.py | 17 +++++++++++++++++ .../tiramisu/no_namespace.py | 12 ++++++++++++ .../makedict/after.json | 14 ++++++++++++++ .../makedict/base.json | 5 +++++ .../makedict/before.json | 14 ++++++++++++++ .../makedict/mandatory.json | 1 + .../makedict/read_write.json | 5 +++++ .../tiramisu/base.py | 17 +++++++++++++++++ .../tiramisu/no_namespace.py | 12 ++++++++++++ .../errno_23 | 0 .../rougail/00-base.yml | 19 +++++++++++++++++++ tests/test_1_flattener.py | 2 +- 34 files changed, 278 insertions(+), 3 deletions(-) create mode 100644 tests/dictionaries/04_5validators_warnings/makedict/after.json create mode 100644 tests/dictionaries/04_5validators_warnings/makedict/base.json create mode 100644 tests/dictionaries/04_5validators_warnings/makedict/before.json create mode 100644 tests/dictionaries/04_5validators_warnings/makedict/mandatory.json create mode 100644 tests/dictionaries/04_5validators_warnings/makedict/read_write.json create mode 100644 tests/dictionaries/04_5validators_warnings/tiramisu/base.py create mode 100644 tests/dictionaries/04_5validators_warnings/tiramisu/no_namespace.py create mode 100644 tests/dictionaries/04_5validators_warnings_all/makedict/after.json create mode 100644 tests/dictionaries/04_5validators_warnings_all/makedict/base.json create mode 100644 tests/dictionaries/04_5validators_warnings_all/makedict/before.json create mode 100644 tests/dictionaries/04_5validators_warnings_all/makedict/mandatory.json create mode 100644 tests/dictionaries/04_5validators_warnings_all/makedict/read_write.json create mode 100644 tests/dictionaries/04_5validators_warnings_all/tiramisu/base.py create mode 100644 tests/dictionaries/04_5validators_warnings_all/tiramisu/no_namespace.py create mode 100644 tests/dictionaries/60_5family_dynamic_calc_suffix_disabled/tiramisu/no_namespace.py create mode 100644 tests/dictionaries/60_5family_dynamic_calc_variable_disabled/makedict/after.json create mode 100644 tests/dictionaries/60_5family_dynamic_calc_variable_disabled/makedict/base.json create mode 100644 tests/dictionaries/60_5family_dynamic_calc_variable_disabled/makedict/before.json create mode 100644 tests/dictionaries/60_5family_dynamic_calc_variable_disabled/makedict/mandatory.json create mode 100644 tests/dictionaries/60_5family_dynamic_calc_variable_disabled/makedict/read_write.json create mode 100644 tests/dictionaries/60_5family_dynamic_calc_variable_disabled/tiramisu/base.py create mode 100644 tests/dictionaries/60_5family_dynamic_calc_variable_disabled/tiramisu/no_namespace.py create mode 100644 tests/dictionaries/60_5family_dynamic_calc_variable_disabled_outside/makedict/after.json create mode 100644 tests/dictionaries/60_5family_dynamic_calc_variable_disabled_outside/makedict/base.json create mode 100644 tests/dictionaries/60_5family_dynamic_calc_variable_disabled_outside/makedict/before.json create mode 100644 tests/dictionaries/60_5family_dynamic_calc_variable_disabled_outside/makedict/mandatory.json create mode 100644 tests/dictionaries/60_5family_dynamic_calc_variable_disabled_outside/makedict/read_write.json create mode 100644 tests/dictionaries/60_5family_dynamic_calc_variable_disabled_outside/tiramisu/base.py create mode 100644 tests/dictionaries/60_5family_dynamic_calc_variable_disabled_outside/tiramisu/no_namespace.py create mode 100644 tests/errors/60_5family_dynamic_calc_variable_disabled_outside/errno_23 create mode 100644 tests/errors/60_5family_dynamic_calc_variable_disabled_outside/rougail/00-base.yml diff --git a/src/rougail/convert/object_model.py b/src/rougail/convert/object_model.py index 1feb2e9b4..63d43ee01 100644 --- a/src/rougail/convert/object_model.py +++ b/src/rougail/convert/object_model.py @@ -242,11 +242,15 @@ class Calculation(BaseModel): ori_path: Optional[str] = None default_values: Any = None namespace: Optional[str] + warnings: Optional[bool] = None xmlfiles: List[str] model_config = ConfigDict(extra="forbid") def get_params(self, objectspace): + if self.warnings is not None and self.attribute_name != "validators": + msg = _('"warnings" are only available with attribute "{self.attribute_name}" for variable "{self.ori_path}"') + raise DictConsistencyError(msg, 83, xmlfiles) if not self.params: return {} if self.ori_path is None: @@ -334,6 +338,8 @@ class JinjaCalculation(Calculation): path = self.path else: path = self.ori_path + if self.warnings: + default["warnings_only"] = True for sub_variable, identifier, true_path in get_jinja_variable_to_param( path, self.jinja, @@ -1023,6 +1029,7 @@ class Variable(BaseModel): choices: Optional[Union[List[BASETYPE_CALC], Calculation]] = None multi: Optional[bool] = None validators: Optional[List[Calculation]] = None + warnings: bool = False # value default: Union[List[BASETYPE_CALC], BASETYPE_CALC] = None secret_manager: Optional[JinjaCalculation] = None diff --git a/src/rougail/convert/tiramisureflector.py b/src/rougail/convert/tiramisureflector.py index f80846def..cc7bbb895 100644 --- a/src/rougail/convert/tiramisureflector.py +++ b/src/rougail/convert/tiramisureflector.py @@ -395,8 +395,8 @@ class Common: if kwargs: ret += ", kwargs={" + ", ".join(kwargs) + "}" ret += ")" - if hasattr(child, "warnings_only"): - ret += f", warnings_only={child.warnings_only}" + if "warnings_only" in child: + ret += f", warnings_only={child['warnings_only']}" if "help" in child: ret += f", help_function=func['{child['help']}']" ret = ret + ")" @@ -497,6 +497,8 @@ class Variable(Common): pass if self.elt.validators: keys["validators"] = self.populate_calculation(self.elt.validators) + if self.elt.warnings: + keys["warnings_only"] = True for key, value in ( CONVERT_OPTION.get(self.elt.type, {}).get("initkwargs", {}).items() ): diff --git a/tests/dictionaries/04_5validators_warnings/makedict/after.json b/tests/dictionaries/04_5validators_warnings/makedict/after.json new file mode 100644 index 000000000..4022d1f41 --- /dev/null +++ b/tests/dictionaries/04_5validators_warnings/makedict/after.json @@ -0,0 +1,6 @@ +{ + "rougail.int": { + "owner": "default", + "value": 1000 + } +} diff --git a/tests/dictionaries/04_5validators_warnings/makedict/base.json b/tests/dictionaries/04_5validators_warnings/makedict/base.json new file mode 100644 index 000000000..ffcb744d0 --- /dev/null +++ b/tests/dictionaries/04_5validators_warnings/makedict/base.json @@ -0,0 +1,3 @@ +{ + "rougail.int": 1000 +} diff --git a/tests/dictionaries/04_5validators_warnings/makedict/before.json b/tests/dictionaries/04_5validators_warnings/makedict/before.json new file mode 100644 index 000000000..4022d1f41 --- /dev/null +++ b/tests/dictionaries/04_5validators_warnings/makedict/before.json @@ -0,0 +1,6 @@ +{ + "rougail.int": { + "owner": "default", + "value": 1000 + } +} diff --git a/tests/dictionaries/04_5validators_warnings/makedict/mandatory.json b/tests/dictionaries/04_5validators_warnings/makedict/mandatory.json new file mode 100644 index 000000000..0637a088a --- /dev/null +++ b/tests/dictionaries/04_5validators_warnings/makedict/mandatory.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/tests/dictionaries/04_5validators_warnings/makedict/read_write.json b/tests/dictionaries/04_5validators_warnings/makedict/read_write.json new file mode 100644 index 000000000..ffcb744d0 --- /dev/null +++ b/tests/dictionaries/04_5validators_warnings/makedict/read_write.json @@ -0,0 +1,3 @@ +{ + "rougail.int": 1000 +} diff --git a/tests/dictionaries/04_5validators_warnings/tiramisu/base.py b/tests/dictionaries/04_5validators_warnings/tiramisu/base.py new file mode 100644 index 000000000..60d93b880 --- /dev/null +++ b/tests/dictionaries/04_5validators_warnings/tiramisu/base.py @@ -0,0 +1,16 @@ +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 +load_functions('../rougail-tests/funcs/test.py') +try: + groups.namespace +except: + groups.addgroup('namespace') +ALLOWED_LEADER_PROPERTIES.add("basic") +ALLOWED_LEADER_PROPERTIES.add("standard") +ALLOWED_LEADER_PROPERTIES.add("advanced") +dict_env['validators_rougail.int'] = "{% if _.int > 100 %}\n value is too high\n{% endif %}" +option_2 = IntOption(name="int", doc="An integer", default=1000, validators=[Calculation(func['valid_with_jinja'], Params((), kwargs={'__internal_jinja': ParamValue("validators_rougail.int"), '__internal_type': ParamValue("string"), '__internal_multi': ParamValue(False), '__internal_files': ParamValue(['../rougail-tests/structures/04_5validators_warnings/rougail/00-base.yml']), '__internal_attribute': ParamValue("validators"), '__internal_variable': ParamValue("rougail.int"), '_.int': ParamSelfOption(whole=False)}), warnings_only=True)], properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['../rougail-tests/structures/04_5validators_warnings/rougail/00-base.yml'], 'type': 'integer'}) +optiondescription_1 = OptionDescription(name="rougail", doc="Rougail", group_type=groups.namespace, children=[option_2], properties=frozenset({"standard"}), informations={'ymlfiles': ['']}) +option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[optiondescription_1]) diff --git a/tests/dictionaries/04_5validators_warnings/tiramisu/no_namespace.py b/tests/dictionaries/04_5validators_warnings/tiramisu/no_namespace.py new file mode 100644 index 000000000..8b0efce89 --- /dev/null +++ b/tests/dictionaries/04_5validators_warnings/tiramisu/no_namespace.py @@ -0,0 +1,11 @@ +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 +load_functions('../rougail-tests/funcs/test.py') +ALLOWED_LEADER_PROPERTIES.add("basic") +ALLOWED_LEADER_PROPERTIES.add("standard") +ALLOWED_LEADER_PROPERTIES.add("advanced") +dict_env['validators_int'] = "{% if _.int > 100 %}\n value is too high\n{% endif %}" +option_1 = IntOption(name="int", doc="An integer", default=1000, validators=[Calculation(func['valid_with_jinja'], Params((), kwargs={'__internal_jinja': ParamValue("validators_int"), '__internal_type': ParamValue("string"), '__internal_multi': ParamValue(False), '__internal_files': ParamValue(['../rougail-tests/structures/04_5validators_warnings/rougail/00-base.yml']), '__internal_attribute': ParamValue("validators"), '__internal_variable': ParamValue("int"), '_.int': ParamSelfOption(whole=False)}), warnings_only=True)], properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['../rougail-tests/structures/04_5validators_warnings/rougail/00-base.yml'], 'type': 'integer'}) +option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[option_1]) diff --git a/tests/dictionaries/04_5validators_warnings_all/makedict/after.json b/tests/dictionaries/04_5validators_warnings_all/makedict/after.json new file mode 100644 index 000000000..4022d1f41 --- /dev/null +++ b/tests/dictionaries/04_5validators_warnings_all/makedict/after.json @@ -0,0 +1,6 @@ +{ + "rougail.int": { + "owner": "default", + "value": 1000 + } +} diff --git a/tests/dictionaries/04_5validators_warnings_all/makedict/base.json b/tests/dictionaries/04_5validators_warnings_all/makedict/base.json new file mode 100644 index 000000000..ffcb744d0 --- /dev/null +++ b/tests/dictionaries/04_5validators_warnings_all/makedict/base.json @@ -0,0 +1,3 @@ +{ + "rougail.int": 1000 +} diff --git a/tests/dictionaries/04_5validators_warnings_all/makedict/before.json b/tests/dictionaries/04_5validators_warnings_all/makedict/before.json new file mode 100644 index 000000000..4022d1f41 --- /dev/null +++ b/tests/dictionaries/04_5validators_warnings_all/makedict/before.json @@ -0,0 +1,6 @@ +{ + "rougail.int": { + "owner": "default", + "value": 1000 + } +} diff --git a/tests/dictionaries/04_5validators_warnings_all/makedict/mandatory.json b/tests/dictionaries/04_5validators_warnings_all/makedict/mandatory.json new file mode 100644 index 000000000..0637a088a --- /dev/null +++ b/tests/dictionaries/04_5validators_warnings_all/makedict/mandatory.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/tests/dictionaries/04_5validators_warnings_all/makedict/read_write.json b/tests/dictionaries/04_5validators_warnings_all/makedict/read_write.json new file mode 100644 index 000000000..ffcb744d0 --- /dev/null +++ b/tests/dictionaries/04_5validators_warnings_all/makedict/read_write.json @@ -0,0 +1,3 @@ +{ + "rougail.int": 1000 +} diff --git a/tests/dictionaries/04_5validators_warnings_all/tiramisu/base.py b/tests/dictionaries/04_5validators_warnings_all/tiramisu/base.py new file mode 100644 index 000000000..dae9ab34b --- /dev/null +++ b/tests/dictionaries/04_5validators_warnings_all/tiramisu/base.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 +load_functions('../rougail-tests/funcs/test.py') +try: + groups.namespace +except: + groups.addgroup('namespace') +ALLOWED_LEADER_PROPERTIES.add("basic") +ALLOWED_LEADER_PROPERTIES.add("standard") +ALLOWED_LEADER_PROPERTIES.add("advanced") +option_2 = IntOption(name="int", doc="An integer", default=1000, warnings_only=True, min_integer=10, max_integer=100, properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['../rougail-tests/structures/04_5validators_warnings_all/rougail/00-base.yml'], 'type': 'integer'}) +optiondescription_1 = OptionDescription(name="rougail", doc="Rougail", group_type=groups.namespace, children=[option_2], properties=frozenset({"standard"}), informations={'ymlfiles': ['']}) +option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[optiondescription_1]) diff --git a/tests/dictionaries/04_5validators_warnings_all/tiramisu/no_namespace.py b/tests/dictionaries/04_5validators_warnings_all/tiramisu/no_namespace.py new file mode 100644 index 000000000..6f0fe5379 --- /dev/null +++ b/tests/dictionaries/04_5validators_warnings_all/tiramisu/no_namespace.py @@ -0,0 +1,10 @@ +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 +load_functions('../rougail-tests/funcs/test.py') +ALLOWED_LEADER_PROPERTIES.add("basic") +ALLOWED_LEADER_PROPERTIES.add("standard") +ALLOWED_LEADER_PROPERTIES.add("advanced") +option_1 = IntOption(name="int", doc="An integer", default=1000, warnings_only=True, min_integer=10, max_integer=100, properties=frozenset({"mandatory", "standard"}), informations={'ymlfiles': ['../rougail-tests/structures/04_5validators_warnings_all/rougail/00-base.yml'], 'type': 'integer'}) +option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[option_1]) diff --git a/tests/dictionaries/60_5family_dynamic_calc_suffix_disabled/tiramisu/no_namespace.py b/tests/dictionaries/60_5family_dynamic_calc_suffix_disabled/tiramisu/no_namespace.py new file mode 100644 index 000000000..1c708e7b6 --- /dev/null +++ b/tests/dictionaries/60_5family_dynamic_calc_suffix_disabled/tiramisu/no_namespace.py @@ -0,0 +1,11 @@ +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 +load_functions('../rougail-tests/funcs/test.py') +ALLOWED_LEADER_PROPERTIES.add("basic") +ALLOWED_LEADER_PROPERTIES.add("standard") +ALLOWED_LEADER_PROPERTIES.add("advanced") +option_2 = StrOption(name="var", doc="A dynamic variable", properties=frozenset({"basic", "mandatory", Calculation(func['variable_to_property'], Params((), kwargs={'prop': ParamValue("disabled"), 'value': ParamIdentifier(), 'when': ParamValue("val1"), 'inverse': ParamValue(False)}), help_function=func['variable_to_property'])}), informations={'ymlfiles': ['../rougail-tests/structures/60_5family_dynamic_calc_suffix_disabled/rougail/00-base.yml'], 'type': 'string'}) +optiondescription_1 = ConvertDynOptionDescription(name="dyn{{ identifier }}", doc="dyn{{ identifier }}", identifiers=["val1", "val2"], children=[option_2], properties=frozenset({"basic"}), informations={'ymlfiles': ['../rougail-tests/structures/60_5family_dynamic_calc_suffix_disabled/rougail/00-base.yml']}) +option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[optiondescription_1]) diff --git a/tests/dictionaries/60_5family_dynamic_calc_variable_disabled/makedict/after.json b/tests/dictionaries/60_5family_dynamic_calc_variable_disabled/makedict/after.json new file mode 100644 index 000000000..58d432b40 --- /dev/null +++ b/tests/dictionaries/60_5family_dynamic_calc_variable_disabled/makedict/after.json @@ -0,0 +1,18 @@ +{ + "rougail.dynval1.var1": { + "owner": "default", + "value": null + }, + "rougail.dynval1.var2": { + "owner": "default", + "value": null + }, + "rougail.dynval2.var1": { + "owner": "default", + "value": null + }, + "rougail.dynval2.var2": { + "owner": "default", + "value": null + } +} diff --git a/tests/dictionaries/60_5family_dynamic_calc_variable_disabled/makedict/base.json b/tests/dictionaries/60_5family_dynamic_calc_variable_disabled/makedict/base.json new file mode 100644 index 000000000..f45c8b079 --- /dev/null +++ b/tests/dictionaries/60_5family_dynamic_calc_variable_disabled/makedict/base.json @@ -0,0 +1,6 @@ +{ + "rougail.dynval1.var1": null, + "rougail.dynval1.var2": null, + "rougail.dynval2.var1": null, + "rougail.dynval2.var2": null +} diff --git a/tests/dictionaries/60_5family_dynamic_calc_variable_disabled/makedict/before.json b/tests/dictionaries/60_5family_dynamic_calc_variable_disabled/makedict/before.json new file mode 100644 index 000000000..58d432b40 --- /dev/null +++ b/tests/dictionaries/60_5family_dynamic_calc_variable_disabled/makedict/before.json @@ -0,0 +1,18 @@ +{ + "rougail.dynval1.var1": { + "owner": "default", + "value": null + }, + "rougail.dynval1.var2": { + "owner": "default", + "value": null + }, + "rougail.dynval2.var1": { + "owner": "default", + "value": null + }, + "rougail.dynval2.var2": { + "owner": "default", + "value": null + } +} diff --git a/tests/dictionaries/60_5family_dynamic_calc_variable_disabled/makedict/mandatory.json b/tests/dictionaries/60_5family_dynamic_calc_variable_disabled/makedict/mandatory.json new file mode 100644 index 000000000..37f1de8a8 --- /dev/null +++ b/tests/dictionaries/60_5family_dynamic_calc_variable_disabled/makedict/mandatory.json @@ -0,0 +1 @@ +["rougail.dynval1.var1", "rougail.dynval1.var2", "rougail.dynval2.var1", "rougail.dynval2.var2"] \ No newline at end of file diff --git a/tests/dictionaries/60_5family_dynamic_calc_variable_disabled/makedict/read_write.json b/tests/dictionaries/60_5family_dynamic_calc_variable_disabled/makedict/read_write.json new file mode 100644 index 000000000..f45c8b079 --- /dev/null +++ b/tests/dictionaries/60_5family_dynamic_calc_variable_disabled/makedict/read_write.json @@ -0,0 +1,6 @@ +{ + "rougail.dynval1.var1": null, + "rougail.dynval1.var2": null, + "rougail.dynval2.var1": null, + "rougail.dynval2.var2": null +} diff --git a/tests/dictionaries/60_5family_dynamic_calc_variable_disabled/tiramisu/base.py b/tests/dictionaries/60_5family_dynamic_calc_variable_disabled/tiramisu/base.py new file mode 100644 index 000000000..94c19e610 --- /dev/null +++ b/tests/dictionaries/60_5family_dynamic_calc_variable_disabled/tiramisu/base.py @@ -0,0 +1,17 @@ +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 +load_functions('../rougail-tests/funcs/test.py') +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="var1", doc="A dynamic variable", properties=frozenset({"basic", "mandatory"}), informations={'ymlfiles': ['../rougail-tests/structures/60_5family_dynamic_calc_variable_disabled/rougail/00-base.yml'], 'type': 'string'}) +option_4 = StrOption(name="var2", doc="A new variable", properties=frozenset({"basic", "mandatory", Calculation(func['variable_to_property'], Params((), kwargs={'value': ParamOption(option_3), 'prop': ParamValue("disabled"), 'when': ParamValue("val1"), 'inverse': ParamValue(False)}), help_function=func['variable_to_property'])}), informations={'ymlfiles': ['../rougail-tests/structures/60_5family_dynamic_calc_variable_disabled/rougail/00-base.yml'], 'type': 'string'}) +optiondescription_2 = ConvertDynOptionDescription(name="dyn{{ identifier }}", doc="A dynamic famify for {{ identifier }}", identifiers=["val1", "val2"], children=[option_3, option_4], properties=frozenset({"basic"}), informations={'ymlfiles': ['../rougail-tests/structures/60_5family_dynamic_calc_variable_disabled/rougail/00-base.yml']}) +optiondescription_1 = OptionDescription(name="rougail", doc="Rougail", group_type=groups.namespace, children=[optiondescription_2], properties=frozenset({"basic"}), informations={'ymlfiles': ['']}) +option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[optiondescription_1]) diff --git a/tests/dictionaries/60_5family_dynamic_calc_variable_disabled/tiramisu/no_namespace.py b/tests/dictionaries/60_5family_dynamic_calc_variable_disabled/tiramisu/no_namespace.py new file mode 100644 index 000000000..4344d4473 --- /dev/null +++ b/tests/dictionaries/60_5family_dynamic_calc_variable_disabled/tiramisu/no_namespace.py @@ -0,0 +1,12 @@ +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 +load_functions('../rougail-tests/funcs/test.py') +ALLOWED_LEADER_PROPERTIES.add("basic") +ALLOWED_LEADER_PROPERTIES.add("standard") +ALLOWED_LEADER_PROPERTIES.add("advanced") +option_2 = StrOption(name="var1", doc="A dynamic variable", properties=frozenset({"basic", "mandatory"}), informations={'ymlfiles': ['../rougail-tests/structures/60_5family_dynamic_calc_variable_disabled/rougail/00-base.yml'], 'type': 'string'}) +option_3 = StrOption(name="var2", doc="A new variable", properties=frozenset({"basic", "mandatory", Calculation(func['variable_to_property'], Params((), kwargs={'value': ParamOption(option_2), 'prop': ParamValue("disabled"), 'when': ParamValue("val1"), 'inverse': ParamValue(False)}), help_function=func['variable_to_property'])}), informations={'ymlfiles': ['../rougail-tests/structures/60_5family_dynamic_calc_variable_disabled/rougail/00-base.yml'], 'type': 'string'}) +optiondescription_1 = ConvertDynOptionDescription(name="dyn{{ identifier }}", doc="A dynamic famify for {{ identifier }}", identifiers=["val1", "val2"], children=[option_2, option_3], properties=frozenset({"basic"}), informations={'ymlfiles': ['../rougail-tests/structures/60_5family_dynamic_calc_variable_disabled/rougail/00-base.yml']}) +option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[optiondescription_1]) diff --git a/tests/dictionaries/60_5family_dynamic_calc_variable_disabled_outside/makedict/after.json b/tests/dictionaries/60_5family_dynamic_calc_variable_disabled_outside/makedict/after.json new file mode 100644 index 000000000..ab8829fef --- /dev/null +++ b/tests/dictionaries/60_5family_dynamic_calc_variable_disabled_outside/makedict/after.json @@ -0,0 +1,14 @@ +{ + "rougail.dynval1.var1": { + "owner": "default", + "value": null + }, + "rougail.dynval2.var1": { + "owner": "default", + "value": null + }, + "rougail.var2": { + "owner": "default", + "value": null + } +} diff --git a/tests/dictionaries/60_5family_dynamic_calc_variable_disabled_outside/makedict/base.json b/tests/dictionaries/60_5family_dynamic_calc_variable_disabled_outside/makedict/base.json new file mode 100644 index 000000000..7090b383d --- /dev/null +++ b/tests/dictionaries/60_5family_dynamic_calc_variable_disabled_outside/makedict/base.json @@ -0,0 +1,5 @@ +{ + "rougail.dynval1.var1": null, + "rougail.dynval2.var1": null, + "rougail.var2": null +} diff --git a/tests/dictionaries/60_5family_dynamic_calc_variable_disabled_outside/makedict/before.json b/tests/dictionaries/60_5family_dynamic_calc_variable_disabled_outside/makedict/before.json new file mode 100644 index 000000000..ab8829fef --- /dev/null +++ b/tests/dictionaries/60_5family_dynamic_calc_variable_disabled_outside/makedict/before.json @@ -0,0 +1,14 @@ +{ + "rougail.dynval1.var1": { + "owner": "default", + "value": null + }, + "rougail.dynval2.var1": { + "owner": "default", + "value": null + }, + "rougail.var2": { + "owner": "default", + "value": null + } +} diff --git a/tests/dictionaries/60_5family_dynamic_calc_variable_disabled_outside/makedict/mandatory.json b/tests/dictionaries/60_5family_dynamic_calc_variable_disabled_outside/makedict/mandatory.json new file mode 100644 index 000000000..de5374be1 --- /dev/null +++ b/tests/dictionaries/60_5family_dynamic_calc_variable_disabled_outside/makedict/mandatory.json @@ -0,0 +1 @@ +["rougail.dynval1.var1", "rougail.dynval2.var1", "rougail.var2"] \ No newline at end of file diff --git a/tests/dictionaries/60_5family_dynamic_calc_variable_disabled_outside/makedict/read_write.json b/tests/dictionaries/60_5family_dynamic_calc_variable_disabled_outside/makedict/read_write.json new file mode 100644 index 000000000..7090b383d --- /dev/null +++ b/tests/dictionaries/60_5family_dynamic_calc_variable_disabled_outside/makedict/read_write.json @@ -0,0 +1,5 @@ +{ + "rougail.dynval1.var1": null, + "rougail.dynval2.var1": null, + "rougail.var2": null +} diff --git a/tests/dictionaries/60_5family_dynamic_calc_variable_disabled_outside/tiramisu/base.py b/tests/dictionaries/60_5family_dynamic_calc_variable_disabled_outside/tiramisu/base.py new file mode 100644 index 000000000..0f5f3bc40 --- /dev/null +++ b/tests/dictionaries/60_5family_dynamic_calc_variable_disabled_outside/tiramisu/base.py @@ -0,0 +1,17 @@ +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 +load_functions('../rougail-tests/funcs/test.py') +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="var1", doc="A dynamic variable", properties=frozenset({"basic", "mandatory"}), informations={'ymlfiles': ['../rougail-tests/structures/60_5family_dynamic_calc_variable_disabled_outside/rougail/00-base.yml'], 'type': 'string'}) +optiondescription_2 = ConvertDynOptionDescription(name="dyn{{ identifier }}", doc="A dynamic famify for {{ identifier }}", identifiers=["val1", "val2"], children=[option_3], properties=frozenset({"basic"}), informations={'ymlfiles': ['../rougail-tests/structures/60_5family_dynamic_calc_variable_disabled_outside/rougail/00-base.yml']}) +option_4 = StrOption(name="var2", doc="A new variable", properties=frozenset({"basic", "mandatory", Calculation(func['variable_to_property'], Params((), kwargs={'value': ParamDynOption(option_3, ["val1"]), 'prop': ParamValue("disabled"), 'when': ParamValue("val1"), 'inverse': ParamValue(False)}), help_function=func['variable_to_property'])}), informations={'ymlfiles': ['../rougail-tests/structures/60_5family_dynamic_calc_variable_disabled_outside/rougail/00-base.yml'], 'type': 'string'}) +optiondescription_1 = OptionDescription(name="rougail", doc="Rougail", group_type=groups.namespace, children=[optiondescription_2, option_4], properties=frozenset({"basic"}), informations={'ymlfiles': ['']}) +option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[optiondescription_1]) diff --git a/tests/dictionaries/60_5family_dynamic_calc_variable_disabled_outside/tiramisu/no_namespace.py b/tests/dictionaries/60_5family_dynamic_calc_variable_disabled_outside/tiramisu/no_namespace.py new file mode 100644 index 000000000..6f24f5ead --- /dev/null +++ b/tests/dictionaries/60_5family_dynamic_calc_variable_disabled_outside/tiramisu/no_namespace.py @@ -0,0 +1,12 @@ +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 +load_functions('../rougail-tests/funcs/test.py') +ALLOWED_LEADER_PROPERTIES.add("basic") +ALLOWED_LEADER_PROPERTIES.add("standard") +ALLOWED_LEADER_PROPERTIES.add("advanced") +option_2 = StrOption(name="var1", doc="A dynamic variable", properties=frozenset({"basic", "mandatory"}), informations={'ymlfiles': ['../rougail-tests/structures/60_5family_dynamic_calc_variable_disabled_outside/rougail/00-base.yml'], 'type': 'string'}) +optiondescription_1 = ConvertDynOptionDescription(name="dyn{{ identifier }}", doc="A dynamic famify for {{ identifier }}", identifiers=["val1", "val2"], children=[option_2], properties=frozenset({"basic"}), informations={'ymlfiles': ['../rougail-tests/structures/60_5family_dynamic_calc_variable_disabled_outside/rougail/00-base.yml']}) +option_3 = StrOption(name="var2", doc="A new variable", properties=frozenset({"basic", "mandatory", Calculation(func['variable_to_property'], Params((), kwargs={'value': ParamDynOption(option_2, ["val1"]), 'prop': ParamValue("disabled"), 'when': ParamValue("val1"), 'inverse': ParamValue(False)}), help_function=func['variable_to_property'])}), informations={'ymlfiles': ['../rougail-tests/structures/60_5family_dynamic_calc_variable_disabled_outside/rougail/00-base.yml'], 'type': 'string'}) +option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[optiondescription_1, option_3]) diff --git a/tests/errors/60_5family_dynamic_calc_variable_disabled_outside/errno_23 b/tests/errors/60_5family_dynamic_calc_variable_disabled_outside/errno_23 new file mode 100644 index 000000000..e69de29bb diff --git a/tests/errors/60_5family_dynamic_calc_variable_disabled_outside/rougail/00-base.yml b/tests/errors/60_5family_dynamic_calc_variable_disabled_outside/rougail/00-base.yml new file mode 100644 index 000000000..418db2132 --- /dev/null +++ b/tests/errors/60_5family_dynamic_calc_variable_disabled_outside/rougail/00-base.yml @@ -0,0 +1,19 @@ +%YAML 1.2 +--- +version: 1.1 + +dyn{{ identifier }}: + description: A dynamic famify for {{ identifier }} + dynamic: + - val1 + - val2 + + var1: + description: A dynamic variable + +var4: + description: A new variable + disabled: + variable: _.dyn{{ identifier }}.var1 + when: 'val1' +... diff --git a/tests/test_1_flattener.py b/tests/test_1_flattener.py index 0dae1b4d9..e5b458820 100644 --- a/tests/test_1_flattener.py +++ b/tests/test_1_flattener.py @@ -47,7 +47,7 @@ excludes = set([ ]) test_ok -= excludes test_raise -= excludes -# test_ok = ['02_0tags'] +#test_ok = ['04_5validators_warnings_all'] #test_ok = [] # test_raise = ['80unknown_default_variable_inside_dynamic_family'] #test_raise = []