diff --git a/src/rougail/annotator/property.py b/src/rougail/annotator/property.py index bfdceb73..ec4767b1 100644 --- a/src/rougail/annotator/property.py +++ b/src/rougail/annotator/property.py @@ -36,7 +36,8 @@ class PropertyAnnotator: if hasattr(variable, 'mode') and variable.mode: properties.append(variable.mode) variable.mode = None - if 'force_store_value' in properties and 'force_default_on_freeze' in properties: + if 'force_store_value' in properties and 'force_default_on_freeze' in properties: # pragma: no cover + # should not appened xmlfiles = self.objectspace.display_xmlfiles(variable.xmlfiles) msg = _('cannot have auto_freeze or auto_store with the hidden ' f'variable "{variable.name}" in {xmlfiles}') diff --git a/src/rougail/path.py b/src/rougail/path.py index 49fbaea4..641be0c9 100644 --- a/src/rougail/path.py +++ b/src/rougail/path.py @@ -1,3 +1,5 @@ +"""Manage path to find objects +""" from .i18n import _ from .error import DictConsistencyError from .config import Config @@ -22,12 +24,15 @@ class Path: name: str, variableobj: str, ) -> str: # pylint: disable=C0111 + """Add a new family + """ if namespace == Config['variable_namespace']: full_name = '.'.join([namespace, name]) self.full_paths_families[name] = full_name else: - if '.' not in name: - raise DictConsistencyError(_(f'Variable "{name}" in namespace "{namespace}" must have dot'), 39) + if '.' not in name: # pragma: no cover + msg = _(f'Variable "{name}" in namespace "{namespace}" must have dot') + raise DictConsistencyError(msg, 39) full_name = name if full_name in self.families and \ self.families[full_name]['variableobj'] != variableobj: # pragma: no cover @@ -43,6 +48,8 @@ class Path: path: str, variableobj: str, ) -> str: # pylint: disable=C0111 + """add a new leadership + """ self.families[path] = dict(name=path, namespace=namespace, variableobj=variableobj, @@ -53,14 +60,19 @@ class Path: name: str, current_namespace: str, ) -> 'Family': # pylint: disable=C0111 + """Get a family + """ name = '.'.join([normalize_family(subname) for subname in name.split('.')]) if name not in self.families and name in self.full_paths_families: name = self.full_paths_families[name] if name not in self.families: raise DictConsistencyError(_('unknown option {}').format(name), 42) dico = self.families[name] - if current_namespace not in [Config['variable_namespace'], 'services'] and current_namespace != dico['namespace']: - raise DictConsistencyError(_(f'A family located in the "{dico["namespace"]}" namespace shall not be used in the "{current_namespace}" namespace'), 38) + if current_namespace not in [Config['variable_namespace'], 'services'] and \ + current_namespace != dico['namespace']: + msg = _(f'A family located in the "{dico["namespace"]}" namespace ' + f'shall not be used in the "{current_namespace}" namespace') + raise DictConsistencyError(msg, 38) return dico['variableobj'] # Leadership @@ -70,6 +82,8 @@ class Path: leadership_name: str, name: str, ) -> None: # pylint: disable=C0111 + """set a variable a leadership member + """ # need rebuild path and move object in new path old_path = leader_family_name + '.' + name leadership_path = leader_family_name + '.' + leadership_name @@ -82,9 +96,13 @@ class Path: self.full_paths_variables[name] = new_path def is_in_leadership(self, name): + """Is the variable is in a leadership + """ return self._get_variable(name)['leader'] is not None def is_leader(self, path): # pylint: disable=C0111 + """Is the variable is a leader + """ variable = self._get_variable(path) if not variable['leader']: return False @@ -99,6 +117,8 @@ class Path: is_dynamic: bool, variableobj, ) -> str: # pylint: disable=C0111 + """Add a new variable (with path) + """ if '.' not in name: full_path = '.'.join([family, name]) if namespace == Config['variable_namespace']: @@ -116,6 +136,8 @@ class Path: def get_variable(self, name: str, ) -> 'Variable': # pylint: disable=C0111 + """Get variable object from a path + """ variable, suffix = self._get_variable(name, with_suffix=True) if suffix: raise DictConsistencyError(_(f"{name} is a dynamic variable"), 36) @@ -124,30 +146,41 @@ class Path: def get_variable_family_path(self, name: str, ) -> str: # pylint: disable=C0111 + """Get the full path of a family + """ return self._get_variable(name)['family'] def get_variable_path(self, name: str, current_namespace: str, ) -> str: # pylint: disable=C0111 + """get full path of a variable + """ dico, suffix = self._get_variable(name, with_suffix=True, ) namespace = dico['variableobj'].namespace - if namespace not in [Config['variable_namespace'], 'services'] and current_namespace != namespace: - raise DictConsistencyError(_(f'A variable located in the "{namespace}" namespace shall not be used in the "{current_namespace}" namespace'), 41) + if namespace not in [Config['variable_namespace'], 'services'] and \ + current_namespace != namespace: + msg = _(f'A variable located in the "{namespace}" namespace shall not be used ' + f'in the "{current_namespace}" namespace') + raise DictConsistencyError(msg, 41) return dico['variableobj'].path, suffix def path_is_defined(self, - name: str, + path: str, ) -> str: # pylint: disable=C0111 - if '.' not in name and name not in self.variables and name in self.full_paths_variables: + """The path is a valid path + """ + if '.' not in path and path not in self.variables and path in self.full_paths_variables: return True - return name in self.variables + return path in self.variables def variable_is_dynamic(self, name: str, ) -> bool: + """This variable is in dynamic family + """ return self._get_variable(name)['is_dynamic'] def _get_variable(self, diff --git a/tests/dictionaries/60extra_externalspacecondition/extra_dirs/extra/00-base.xml b/tests/dictionaries/60extra_externalspacecondition/extra_dirs/extra/00-base.xml index 62370b9f..fbbd0da3 100644 --- a/tests/dictionaries/60extra_externalspacecondition/extra_dirs/extra/00-base.xml +++ b/tests/dictionaries/60extra_externalspacecondition/extra_dirs/extra/00-base.xml @@ -12,6 +12,4 @@ - - diff --git a/tests/dictionaries/60extra_no_condition/00-base.xml b/tests/dictionaries/60extra_no_condition/00-base.xml new file mode 100644 index 00000000..55a61c05 --- /dev/null +++ b/tests/dictionaries/60extra_no_condition/00-base.xml @@ -0,0 +1,18 @@ + + + + + + non + + + + + + + diff --git a/tests/dictionaries/60extra_no_condition/__init__.py b/tests/dictionaries/60extra_no_condition/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/dictionaries/60extra_no_condition/extra_dirs/extra/00-base.xml b/tests/dictionaries/60extra_no_condition/extra_dirs/extra/00-base.xml new file mode 100644 index 00000000..fbbd0da3 --- /dev/null +++ b/tests/dictionaries/60extra_no_condition/extra_dirs/extra/00-base.xml @@ -0,0 +1,15 @@ + + + + + + + Exportation de la base de ejabberd + + + + pre + + + + diff --git a/tests/dictionaries/60extra_no_condition/makedict/base.json b/tests/dictionaries/60extra_no_condition/makedict/base.json new file mode 100644 index 00000000..3e045bf4 --- /dev/null +++ b/tests/dictionaries/60extra_no_condition/makedict/base.json @@ -0,0 +1 @@ +{"rougail.general.mode_conteneur_actif": "non", "rougail.general.activer_ejabberd": "non", "rougail.general.module_instancie": "non", "extra.ejabberd.description": "Exportation de la base de ejabberd", "extra.ejabberd.day": "none", "extra.ejabberd.mode": "pre"} diff --git a/tests/dictionaries/60extra_no_condition/tiramisu/base.py b/tests/dictionaries/60extra_no_condition/tiramisu/base.py new file mode 100644 index 00000000..3bbd3d3a --- /dev/null +++ b/tests/dictionaries/60extra_no_condition/tiramisu/base.py @@ -0,0 +1,21 @@ +from importlib.machinery import SourceFileLoader +func = SourceFileLoader('func', 'tests/dictionaries/../eosfunc/test.py').load_module() +for key, value in dict(locals()).items(): + if key != ['SourceFileLoader', 'func']: + setattr(func, key, value) +try: + from tiramisu3 import * +except: + from tiramisu import * +from rougail.tiramisu import ConvertDynOptionDescription +option_5 = StrOption(properties=frozenset({'force_default_on_freeze', 'frozen', 'hidden', 'mandatory', 'normal'}), name='module_instancie', doc='No change', multi=False, default='non') +option_3 = StrOption(properties=frozenset({'auto_freeze', 'basic', 'force_store_value', 'mandatory', Calculation(calc_value, Params(ParamValue('auto_frozen'), kwargs={'condition': ParamOption(option_5, todict=True), 'expected': ParamValue('oui'), 'reverse_condition': ParamValue(True)}))}), name='mode_conteneur_actif', doc='No change', multi=False, default='non') +option_4 = StrOption(properties=frozenset({'force_default_on_freeze', 'frozen', 'hidden', 'mandatory', 'normal'}), name='activer_ejabberd', doc='No change', multi=False, default='non') +option_2 = OptionDescription(name='general', doc='général', properties=frozenset({'basic'}), children=[option_3, option_4, option_5]) +option_1 = OptionDescription(name='rougail', doc='rougail', children=[option_2]) +option_8 = StrOption(properties=frozenset({'mandatory', 'normal'}), name='description', doc='description', multi=False, default='Exportation de la base de ejabberd') +option_9 = ChoiceOption(properties=frozenset({'mandatory', 'normal'}), name='day', doc='day', multi=False, default='none', values=('none', 'daily', 'weekly', 'monthly')) +option_10 = ChoiceOption(properties=frozenset({'mandatory', 'normal'}), name='mode', doc='mode', multi=False, default='pre', values=('pre', 'post')) +option_7 = OptionDescription(name='ejabberd', doc='ejabberd', properties=frozenset({'normal'}), children=[option_8, option_9, option_10]) +option_6 = OptionDescription(name='extra', doc='extra', children=[option_7]) +option_0 = OptionDescription(name='baseoption', doc='baseoption', children=[option_1, option_6])