From d360203bf8a63d596ba2b81288cad8c70049bce6 Mon Sep 17 00:00:00 2001 From: Emmanuel Garette Date: Mon, 2 Sep 2024 15:47:33 +0200 Subject: [PATCH] feat: use suffix in property calculation --- src/rougail/config.py | 13 ++++----- src/rougail/object_model.py | 58 ++++++++++++++++++++++++++++++++----- 2 files changed, 56 insertions(+), 15 deletions(-) diff --git a/src/rougail/config.py b/src/rougail/config.py index 50a72bc13..8b01b1462 100644 --- a/src/rougail/config.py +++ b/src/rougail/config.py @@ -216,19 +216,16 @@ extra_dictionaries: description: Extra namespaces type: leadership disabled: - type: jinja - jinja: | - {% if not main_namespace %} - main_namespace not available - {% endif %} + variable: main_namespace + when: null names: description: 'Extra namespace name' - alternative_name: x + alternative_name: xn multi: true mandatory: false directories: description: Directories where extra dictionary files are placed - alternative_name: d + alternative_name: xd type: unix_filename params: allow_relative: true @@ -238,7 +235,7 @@ extra_dictionaries: multi: true functions_files: description: File with functions - alternative_name: f + alternative_name: c type: unix_filename params: allow_relative: true diff --git a/src/rougail/object_model.py b/src/rougail/object_model.py index 493f4064a..333a028fe 100644 --- a/src/rougail/object_model.py +++ b/src/rougail/object_model.py @@ -102,6 +102,7 @@ CONVERT_OPTION = { example="644", ), "choice": dict(opttype="ChoiceOption", example="a_choice"), + "regexp": dict(opttype="RegexpOption"), # "symlink": dict(opttype="SymLinkOption"), } @@ -588,20 +589,61 @@ class InformationCalculation(Calculation): } -class SuffixCalculation(Calculation): - attribute_name: Literal["default", "choice", "dynamic"] +class _SuffixCalculation(Calculation): suffix: Optional[int] = None + def get_suffix(self) -> dict: + suffix = {"type": "suffix"} + if self.suffix is not None: + suffix["suffix"] = self.suffix + return suffix + + +class SuffixCalculation(_SuffixCalculation): + attribute_name: Literal["default", "choice", "dynamic"] + def to_function( self, objectspace, ) -> dict: - suffix = {"type": "suffix"} - if self.suffix is not None: - suffix["suffix"] = self.suffix return { "function": "calc_value", - "params": {None: [suffix]}, + "params": {None: [self.get_suffix()]}, + } + + +class SuffixPropertyCalculation(_SuffixCalculation): + attribute_name: Literal[*PROPERTY_ATTRIBUTE] + when: Any = undefined + when_not: Any = undefined + + def to_function( + self, + objectspace, + ) -> dict: + if self.version == "1.0": + msg = f'when is not allowed in format version 1.0 for attribute "{self.attribute_name}"' + raise DictConsistencyError(msg, 105, variable.xmlfiles) + if self.when is not undefined: + if self.when_not is not undefined: + msg = f'the suffix has an invalid attribute "{self.attribute_name}", when and when_not cannot set together' + raise DictConsistencyError(msg, 35, variable.xmlfiles) + when = self.when + inverse = False + elif self.when_not is not undefined: + when = self.when_not + inverse = True + else: + msg = f'the suffix has an invalid attribute "{self.attribute_name}", when and when_not cannot set together' + raise DictConsistencyError + params = {None: [self.attribute_name, self.get_suffix()], + "when": when, + "inverse": inverse, + } + return { + "function": "variable_to_property", + "params": params, + "help": "variable_to_property", } @@ -632,7 +674,7 @@ CALCULATION_PROPERTY_TYPES = { "jinja": JinjaCalculation, "variable": VariablePropertyCalculation, "information": InformationCalculation, - "suffix": SuffixCalculation, + "suffix": SuffixPropertyCalculation, "index": IndexCalculation, } BASETYPE_CALC = Union[StrictBool, StrictInt, StrictFloat, StrictStr, Calculation, None] @@ -667,6 +709,7 @@ class Variable(BaseModel): description: Optional[str] = None default: Union[List[BASETYPE_CALC], BASETYPE_CALC] = None choices: Optional[Union[List[BASETYPE_CALC], Calculation]] = None + regexp: Optional[str] = None params: Optional[List[Param]] = None validators: Optional[List[Calculation]] = None multi: Optional[bool] = None @@ -678,6 +721,7 @@ class Variable(BaseModel): auto_save: bool = False mode: Optional[str] = None test: Optional[list] = None + examples: Optional[list] = None path: str namespace: Optional[str] version: str