diff --git a/src/rougail/annotator.py b/src/rougail/annotator.py index 97719d60..4455b6b3 100644 --- a/src/rougail/annotator.py +++ b/src/rougail/annotator.py @@ -299,18 +299,14 @@ class SpaceAnnotator(object): self.objectspace = objectspace self.valid_enums = {} self.force_value = {} - self.has_calc = [] - self.force_no_value = [] self.force_not_mandatory = [] if eosfunc_file: self.eosfunc = imp.load_source('eosfunc', eosfunc_file) else: self.eosfunc = None if HIGH_COMPATIBILITY: - self.default_has_no_value = [] self.has_frozen_if_in_condition = [] - self.default_variable_options() - self.variable_submulti() + self.convert_variable() self.convert_auto_freeze() self.convert_groups() self.filter_check() @@ -519,53 +515,35 @@ class SpaceAnnotator(object): varpath = self.paths.get_variable_path(family.dynamic, namespace) family.dynamic = varpath - def _annotate_variable(self, variable, family_mode, path, is_follower=False): - if (HIGH_COMPATIBILITY and variable.type == 'choice' and variable.mode != modes_level[-1] and variable.mandatory is True and path in self.default_has_no_value): - variable.mode = modes_level[0] - if variable.type == 'choice' and is_follower and family_mode == modes_level[0] and variable.mandatory is True: - variable.mode = modes_level[0] + def annotate_variable(self, variable, family_mode, path, is_follower=False): # if the variable is mandatory and doesn't have any value # then the variable's mode is set to 'basic' - has_value = hasattr(variable, 'value') and variable.value != None - if (path not in self.has_calc and variable.mandatory is True and - (not has_value or is_follower) and variable.type != 'choice'): + has_value = hasattr(variable, 'value') + if variable.mandatory is True and (not has_value or is_follower): variable.mode = modes_level[0] - if has_value: - if not HIGH_COMPATIBILITY or (not path.startswith(f'{VARIABLE_NAMESPACE}.services.') \ - and path not in self.force_no_value and path not in self.force_not_mandatory): - variable.mandatory = True + if variable.mode != None and modes[variable.mode] < modes[family_mode] and (not is_follower or variable.mode != modes_level[0]): + variable.mode = family_mode + if has_value and path not in self.force_not_mandatory: + variable.mandatory = True if variable.hidden is True: variable.frozen = True if not variable.auto_save is True and 'force_default_on_freeze' not in vars(variable): variable.force_default_on_freeze = True - if variable.name == 'frozen' and not variable.auto_save is True: - variable.force_default_on_freeze = True - if variable.mode != None and not is_follower and modes[variable.mode] < modes[family_mode]: - variable.mode = family_mode - if variable.mode != None and variable.mode != modes_level[0] and modes[variable.mode] < modes[family_mode]: - variable.mode = family_mode - def default_variable_options(self): - if hasattr(self.space, 'variables'): - for families in self.space.variables.values(): - if hasattr(families, 'family'): - for family in families.family.values(): - if hasattr(family, 'variable'): - for variable in family.variable.values(): - if not hasattr(variable, 'type'): - variable.type = 'string' - if variable.type != 'symlink' and not hasattr(variable, 'description'): - variable.description = variable.name - - def variable_submulti(self): - if hasattr(self.space, 'variables'): - for families in self.space.variables.values(): - if hasattr(families, 'family'): - for family in families.family.values(): - if hasattr(family, 'variable'): - for variable in family.variable.values(): - if variable.submulti: - variable.multi = 'submulti' + def convert_variable(self): + if not hasattr(self.space, 'variables'): + return + for families in self.space.variables.values(): + if hasattr(families, 'family'): + for family in families.family.values(): + if hasattr(family, 'variable'): + for variable in family.variable.values(): + if not hasattr(variable, 'type'): + variable.type = 'string' + if variable.type != 'symlink' and not hasattr(variable, 'description'): + variable.description = variable.name + if variable.submulti: + variable.multi = 'submulti' def convert_auto_freeze(self): # pylint: disable=C0111 if hasattr(self.space, 'variables'): @@ -584,7 +562,6 @@ class SpaceAnnotator(object): new_condition.param = [new_param] new_target = self.objectspace.target() new_target.type = 'variable' - print(variables.name, VARIABLE_NAMESPACE) if variables.name == VARIABLE_NAMESPACE: path = variable.name else: @@ -596,41 +573,37 @@ class SpaceAnnotator(object): self.space.constraints.condition.append(new_condition) def _set_valid_enum(self, variable, values, type_): - if isinstance(values, list): - variable.mandatory = True - variable.choice = [] - choices = [] - for value in values: - choice = self.objectspace.choice() - try: - if type_ in CONVERSION: - choice.name = CONVERSION[type_](value) - else: - choice.name = str(value) - except: - raise CreoleDictConsistencyError(_(f'unable to change type of a valid_enum entry "{value}" is not a valid "{type_}" for "{variable.name}"')) - choices.append(choice.name) - choice.type = type_ - variable.choice.append(choice) - if not variable.choice: - raise CreoleDictConsistencyError(_('empty valid enum is not allowed for variable {}').format(variable.name)) - if hasattr(variable, 'value'): - for value in variable.value: - value.type = type_ - if type_ in CONVERSION: - cvalue = CONVERSION[type_](value.name) - else: - cvalue = value.name - if cvalue not in choices: - raise CreoleDictConsistencyError(_('value "{}" of variable "{}" is not in list of all expected values ({})').format(value.name, variable.name, choices)) - else: - new_value = self.objectspace.value() - new_value.name = values[0] - new_value.type = type_ - variable.value = [new_value] + variable.mandatory = True + variable.choice = [] + choices = [] + for value in values: + choice = self.objectspace.choice() + try: + if type_ in CONVERSION: + choice.name = CONVERSION[type_](value) + else: + choice.name = str(value) + except: + raise CreoleDictConsistencyError(_(f'unable to change type of a valid_enum entry "{value}" is not a valid "{type_}" for "{variable.name}"')) + choices.append(choice.name) + choice.type = type_ + variable.choice.append(choice) + if not variable.choice: + raise CreoleDictConsistencyError(_('empty valid enum is not allowed for variable {}').format(variable.name)) + if hasattr(variable, 'value'): + for value in variable.value: + value.type = type_ + if type_ in CONVERSION: + cvalue = CONVERSION[type_](value.name) + else: + cvalue = value.name + if cvalue not in choices: + raise CreoleDictConsistencyError(_('value "{}" of variable "{}" is not in list of all expected values ({})').format(value.name, variable.name, choices)) else: - # probe choice - variable.choice = values + new_value = self.objectspace.value() + new_value.name = values[0] + new_value.type = type_ + variable.value = [new_value] variable.type = 'choice' def _convert_valid_enum(self, variable, path): @@ -694,7 +667,7 @@ class SpaceAnnotator(object): else: is_follower = False path = '{}.{}.{}'.format(family.path, variable.name, follower.name) - self._annotate_variable(follower, family_mode, path, is_follower) + self.annotate_variable(follower, family_mode, path, is_follower) # leader's mode is minimum level if modes[variable.variable[0].mode] > modes[follower.mode]: follower.mode = variable.variable[0].mode @@ -707,7 +680,7 @@ class SpaceAnnotator(object): if variable.auto_freeze is True and variable.mode != modes_level[-1]: variable.mode = modes_level[0] path = '{}.{}'.format(family.path, variable.name) - self._annotate_variable(variable, family_mode, path) + self.annotate_variable(variable, family_mode, path) def convert_fill(self): # pylint: disable=C0111,R0912 if not hasattr(self.space, 'constraints') or not hasattr(self.space.constraints, 'fill'): @@ -764,8 +737,6 @@ class SpaceAnnotator(object): value.param = fill.param variable = self.paths.get_variable_obj(fill.target) variable.value = [value] - self.force_not_mandatory.append(fill.target) - self.has_calc.append(fill.target) del self.space.constraints.fill def filter_separators(self): # pylint: disable=C0111,R0201 diff --git a/tests/flattener_dicos/01fill_number/result/00-base.xml b/tests/flattener_dicos/01fill_number/result/00-base.xml index 54dbe833..f5cee6a4 100644 --- a/tests/flattener_dicos/01fill_number/result/00-base.xml +++ b/tests/flattener_dicos/01fill_number/result/00-base.xml @@ -7,6 +7,7 @@ force_default_on_freeze frozen hidden + mandatory normal 3 diff --git a/tests/flattener_dicos/10autosave_hidden/result/00-base.xml b/tests/flattener_dicos/10autosave_hidden/result/00-base.xml index d7603fff..200c4b01 100644 --- a/tests/flattener_dicos/10autosave_hidden/result/00-base.xml +++ b/tests/flattener_dicos/10autosave_hidden/result/00-base.xml @@ -17,6 +17,7 @@ force_store_value frozen hidden + mandatory basic oui diff --git a/tests/flattener_dicos/10autosave_hidden_frozenifin/result/00-base.xml b/tests/flattener_dicos/10autosave_hidden_frozenifin/result/00-base.xml index 35929cce..c7708ec4 100644 --- a/tests/flattener_dicos/10autosave_hidden_frozenifin/result/00-base.xml +++ b/tests/flattener_dicos/10autosave_hidden_frozenifin/result/00-base.xml @@ -15,6 +15,7 @@ force_store_value + mandatory basic frozen hidden diff --git a/tests/flattener_dicos/10leadership_append/result/00-base.xml b/tests/flattener_dicos/10leadership_append/result/00-base.xml index a760ca7d..2d519e4a 100644 --- a/tests/flattener_dicos/10leadership_append/result/00-base.xml +++ b/tests/flattener_dicos/10leadership_append/result/00-base.xml @@ -17,12 +17,14 @@ normal + mandatory normal valfill + mandatory normal rougail.general1.leader.follower1 diff --git a/tests/flattener_dicos/10leadership_auto/result/00-base.xml b/tests/flattener_dicos/10leadership_auto/result/00-base.xml index d4ec7ef4..f1bee238 100644 --- a/tests/flattener_dicos/10leadership_auto/result/00-base.xml +++ b/tests/flattener_dicos/10leadership_auto/result/00-base.xml @@ -17,6 +17,7 @@ force_default_on_freeze frozen hidden + mandatory normal valfill @@ -26,6 +27,7 @@ force_default_on_freeze frozen hidden + mandatory normal rougail.general.leader.follower1 @@ -35,6 +37,7 @@ force_default_on_freeze frozen hidden + mandatory normal rougail.general.leader.leader diff --git a/tests/flattener_dicos/10leadership_autoleader/result/00-base.xml b/tests/flattener_dicos/10leadership_autoleader/result/00-base.xml index e752e967..c4752b18 100644 --- a/tests/flattener_dicos/10leadership_autoleader/result/00-base.xml +++ b/tests/flattener_dicos/10leadership_autoleader/result/00-base.xml @@ -17,6 +17,7 @@ force_default_on_freeze frozen hidden + mandatory normal valfill @@ -26,6 +27,7 @@ force_default_on_freeze frozen hidden + mandatory normal rougail.general.leader.leader diff --git a/tests/flattener_dicos/10leadership_autoleader_expert/result/00-base.xml b/tests/flattener_dicos/10leadership_autoleader_expert/result/00-base.xml index 62ebc334..6ca4885a 100644 --- a/tests/flattener_dicos/10leadership_autoleader_expert/result/00-base.xml +++ b/tests/flattener_dicos/10leadership_autoleader_expert/result/00-base.xml @@ -19,6 +19,7 @@ force_default_on_freeze frozen + mandatory valfill diff --git a/tests/flattener_dicos/10leadership_autosaveexpert/result/00-base.xml b/tests/flattener_dicos/10leadership_autosaveexpert/result/00-base.xml index 25901650..8d235df7 100644 --- a/tests/flattener_dicos/10leadership_autosaveexpert/result/00-base.xml +++ b/tests/flattener_dicos/10leadership_autosaveexpert/result/00-base.xml @@ -14,12 +14,14 @@ normal + mandatory normal valfill + mandatory expert rougail.general.leader.follower1 diff --git a/tests/flattener_dicos/10leadership_familyaccent/result/00-base.xml b/tests/flattener_dicos/10leadership_familyaccent/result/00-base.xml index 123f4b34..73166207 100644 --- a/tests/flattener_dicos/10leadership_familyaccent/result/00-base.xml +++ b/tests/flattener_dicos/10leadership_familyaccent/result/00-base.xml @@ -14,12 +14,14 @@ normal + mandatory normal valfill + mandatory normal rougail.general.leader.follower1 diff --git a/tests/flattener_dicos/10leadership_leadermandatory/result/00-base.xml b/tests/flattener_dicos/10leadership_leadermandatory/result/00-base.xml index 111ee0dc..b5a99075 100644 --- a/tests/flattener_dicos/10leadership_leadermandatory/result/00-base.xml +++ b/tests/flattener_dicos/10leadership_leadermandatory/result/00-base.xml @@ -16,12 +16,14 @@ mandatory + mandatory normal valfill + mandatory normal rougail.general.leader.follower1 diff --git a/tests/flattener_dicos/10leadership_mandatory/result/00-base.xml b/tests/flattener_dicos/10leadership_mandatory/result/00-base.xml index 657e8c46..f5f20e6f 100644 --- a/tests/flattener_dicos/10leadership_mandatory/result/00-base.xml +++ b/tests/flattener_dicos/10leadership_mandatory/result/00-base.xml @@ -21,6 +21,7 @@ + mandatory normal rougail.general.leader.follower1 diff --git a/tests/flattener_dicos/10leadership_multi/result/00-base.xml b/tests/flattener_dicos/10leadership_multi/result/00-base.xml index c9cfb9c5..99360f4d 100644 --- a/tests/flattener_dicos/10leadership_multi/result/00-base.xml +++ b/tests/flattener_dicos/10leadership_multi/result/00-base.xml @@ -17,12 +17,14 @@ normal + mandatory normal valfill + mandatory normal rougail.general1.leader.follower1 diff --git a/tests/flattener_dicos/10load_leadership/result/00-base.xml b/tests/flattener_dicos/10load_leadership/result/00-base.xml index 529f2263..33cbdd10 100644 --- a/tests/flattener_dicos/10load_leadership/result/00-base.xml +++ b/tests/flattener_dicos/10load_leadership/result/00-base.xml @@ -17,12 +17,14 @@ normal + mandatory normal valfill + mandatory normal rougail.general1.leader.follower1 diff --git a/tests/flattener_dicos/10load_leadership_description/result/00-base.xml b/tests/flattener_dicos/10load_leadership_description/result/00-base.xml index a9f4468d..1a137963 100644 --- a/tests/flattener_dicos/10load_leadership_description/result/00-base.xml +++ b/tests/flattener_dicos/10load_leadership_description/result/00-base.xml @@ -17,12 +17,14 @@ normal + mandatory normal valfill + mandatory normal rougail.general1.leader.follower1 diff --git a/tests/flattener_dicos/10load_leadership_submulti/result/00-base.xml b/tests/flattener_dicos/10load_leadership_submulti/result/00-base.xml index db7f01ec..b1a3d46b 100644 --- a/tests/flattener_dicos/10load_leadership_submulti/result/00-base.xml +++ b/tests/flattener_dicos/10load_leadership_submulti/result/00-base.xml @@ -17,12 +17,14 @@ normal + mandatory normal valfill + mandatory normal rougail.general1.leader.follower1 diff --git a/tests/flattener_dicos/20family_dynamic_calc/result/00-base.xml b/tests/flattener_dicos/20family_dynamic_calc/result/00-base.xml index fe07045c..41519464 100644 --- a/tests/flattener_dicos/20family_dynamic_calc/result/00-base.xml +++ b/tests/flattener_dicos/20family_dynamic_calc/result/00-base.xml @@ -21,6 +21,7 @@ normal + mandatory normal rougail.dyn.vardyn diff --git a/tests/flattener_dicos/30mandatory_withoutvaluecalc/result/00-base.xml b/tests/flattener_dicos/30mandatory_withoutvaluecalc/result/00-base.xml index b9fb0424..e1f65fa9 100644 --- a/tests/flattener_dicos/30mandatory_withoutvaluecalc/result/00-base.xml +++ b/tests/flattener_dicos/30mandatory_withoutvaluecalc/result/00-base.xml @@ -7,6 +7,7 @@ force_default_on_freeze frozen hidden + mandatory normal value diff --git a/tests/flattener_dicos/30mandatory_withvaluecalc/result/00-base.xml b/tests/flattener_dicos/30mandatory_withvaluecalc/result/00-base.xml index 140532b8..6b482d0a 100644 --- a/tests/flattener_dicos/30mandatory_withvaluecalc/result/00-base.xml +++ b/tests/flattener_dicos/30mandatory_withvaluecalc/result/00-base.xml @@ -4,6 +4,7 @@ normal + mandatory normal value diff --git a/tests/flattener_dicos/40ifin_leadershipauto/result/00-base.xml b/tests/flattener_dicos/40ifin_leadershipauto/result/00-base.xml index aa18f6cb..0a5ba7b3 100644 --- a/tests/flattener_dicos/40ifin_leadershipauto/result/00-base.xml +++ b/tests/flattener_dicos/40ifin_leadershipauto/result/00-base.xml @@ -24,6 +24,7 @@ force_default_on_freeze frozen hidden + mandatory normal disabled diff --git a/tests/flattener_dicos/60action_external/result/00-base.xml b/tests/flattener_dicos/60action_external/result/00-base.xml index 7d87498d..796210be 100644 --- a/tests/flattener_dicos/60action_external/result/00-base.xml +++ b/tests/flattener_dicos/60action_external/result/00-base.xml @@ -28,6 +28,7 @@ force_default_on_freeze frozen hidden + mandatory normal http://localhost/