From 2742774aa97521ee77d4de9a994fa3e0cd749108 Mon Sep 17 00:00:00 2001 From: Emmanuel Garette Date: Sat, 1 Aug 2020 20:55:15 +0200 Subject: [PATCH] valid_entier (with mini or maxi parameter) configure min_number or max_number for IntOption --- src/rougail/annotator.py | 75 ++++++++++++------- src/rougail/tiramisureflector.py | 2 + tests/eosfunc/test.py | 4 - .../10check_base/tiramisu/base.py | 2 +- .../10check_no_param/00-base.xml | 2 +- .../10check_no_param/tiramisu/base.py | 2 +- .../10check_option/00-base.xml | 2 +- .../10check_option/tiramisu/base.py | 2 +- 8 files changed, 54 insertions(+), 37 deletions(-) diff --git a/src/rougail/annotator.py b/src/rougail/annotator.py index 255dd78d..f02bd556 100644 --- a/src/rougail/annotator.py +++ b/src/rougail/annotator.py @@ -68,6 +68,7 @@ PROPERTIES = ('hidden', 'frozen', 'auto_freeze', 'auto_save', 'force_default_on_ CONVERT_PROPERTIES = {'auto_save': ['force_store_value'], 'auto_freeze': ['force_store_value', 'auto_freeze']} RENAME_ATTIBUTES = {'description': 'doc'} +INTERNAL_FUNCTIONS = ['valid_enum', 'valid_in_network', 'valid_differ', 'valid_entier'] class SpaceAnnotator: """Transformations applied on a CreoleObjSpace instance @@ -498,6 +499,10 @@ class VariableAnnotator: families.doc = families.name for family in families.family.values(): family.doc = family.name + for key, value in RENAME_ATTIBUTES.items(): + if hasattr(family, key): + setattr(family, value, getattr(family, key)) + setattr(family, key, None) family.name = normalize_family(family.name) if hasattr(family, 'variable'): for variable in family.variable.values(): @@ -621,7 +626,7 @@ class ConstraintAnnotator: def check_check(self): remove_indexes = [] functions = dir(self.eosfunc) - functions.extend(['valid_enum', 'valid_in_network', 'valid_differ']) + functions.extend(INTERNAL_FUNCTIONS) for check_idx, check in enumerate(self.objectspace.space.constraints.check): if not check.name in functions: raise DictConsistencyError(_('cannot find check function {}').format(check.name)) @@ -959,34 +964,48 @@ class ConstraintAnnotator: def convert_check(self): for check in self.objectspace.space.constraints.check: variable = self.objectspace.paths.get_variable_obj(check.target) - check_ = self.objectspace.check() name = check.name - if name == 'valid_differ': - name = 'valid_not_equal' - elif name == 'valid_network_netmask': - params_len = 1 - if len(check.param) != params_len: - raise DictConsistencyError(_('{} must have {} param').format(name, params_len)) - elif name == 'valid_ipnetmask': - params_len = 1 - if len(check.param) != params_len: - raise DictConsistencyError(_('{} must have {} param').format(name, params_len)) - name = 'valid_ip_netmask' - elif name == 'valid_broadcast': - params_len = 2 - if len(check.param) != params_len: - raise DictConsistencyError(_('{} must have {} param').format(name, params_len)) - elif name == 'valid_in_network': - params_len = 2 - if len(check.param) != params_len: - raise DictConsistencyError(_('{} must have {} param').format(name, params_len)) - check_.name = name - check_.warnings_only = check.warnings_only - if hasattr(check, 'param'): - check_.param = check.param - if not hasattr(variable, 'check'): - variable.check = [] - variable.check.append(check_) + if name == 'valid_entier': + if not hasattr(check, 'param'): + raise DictConsistencyError(_('{} must have, at least, 1 param').format(name)) + for param in check.param: + if param.type not in ['string', 'number']: + raise DictConsistencyError(_(f'param in "valid_entier" must not be a "{param.type}"')) + if param.name == 'mini': + variable.min_number = int(param.text) + elif param.name == 'maxi': + print('pppp', param.text) + variable.max_number = int(param.text) + else: + raise DictConsistencyError(_(f'unknown parameter {param.text} in check "valid_entier" for variable {check.target}')) + else: + check_ = self.objectspace.check() + if name == 'valid_differ': + name = 'valid_not_equal' + elif name == 'valid_network_netmask': + params_len = 1 + if len(check.param) != params_len: + raise DictConsistencyError(_('{} must have {} param').format(name, params_len)) + elif name == 'valid_ipnetmask': + params_len = 1 + if len(check.param) != params_len: + raise DictConsistencyError(_('{} must have {} param').format(name, params_len)) + name = 'valid_ip_netmask' + elif name == 'valid_broadcast': + params_len = 2 + if len(check.param) != params_len: + raise DictConsistencyError(_('{} must have {} param').format(name, params_len)) + elif name == 'valid_in_network': + params_len = 2 + if len(check.param) != params_len: + raise DictConsistencyError(_('{} must have {} param').format(name, params_len)) + check_.name = name + check_.warnings_only = check.warnings_only + if hasattr(check, 'param'): + check_.param = check.param + if not hasattr(variable, 'check'): + variable.check = [] + variable.check.append(check_) del self.objectspace.space.constraints.check def convert_fill(self): # pylint: disable=C0111,R0912 diff --git a/src/rougail/tiramisureflector.py b/src/rougail/tiramisureflector.py index a7c4a8c9..f408aff2 100644 --- a/src/rougail/tiramisureflector.py +++ b/src/rougail/tiramisureflector.py @@ -337,6 +337,8 @@ class Variable(Common): for key in self.get_attributes(self.elt): value = getattr(self.elt, key) if key in FORCE_INFORMATIONS: + if key == 'test' and self.object_type == 'IntOption': + value = int(value) self.informations[key] = value else: self.attrib[key] = value diff --git a/tests/eosfunc/test.py b/tests/eosfunc/test.py index 210a332e..a0cb0f5a 100644 --- a/tests/eosfunc/test.py +++ b/tests/eosfunc/test.py @@ -24,10 +24,6 @@ def get_mount_point_device(*args, **kwargs): pass -def valid_entier(*args, **kwargs): - pass - - def valid_differ(*args, **kwargs): pass diff --git a/tests/flattener_dicos/10check_base/tiramisu/base.py b/tests/flattener_dicos/10check_base/tiramisu/base.py index d31491c7..51c4777a 100644 --- a/tests/flattener_dicos/10check_base/tiramisu/base.py +++ b/tests/flattener_dicos/10check_base/tiramisu/base.py @@ -3,7 +3,7 @@ from rougail.tiramisu import ConvertDynOptionDescription import imp func = imp.load_source('func', 'tests/flattener_dicos/../eosfunc/test.py') option_3 = StrOption(properties=frozenset({'mandatory', 'normal'}), name='mode_conteneur_actif', doc='No change', multi=False, default='b') -option_4 = IntOption(properties=frozenset({'normal'}), validators=[Calculation(func.valid_entier, Params((ParamSelfOption()), kwargs={'mini': ParamValue("0"), 'maxi': ParamValue("100")}), warnings_only=False)], name='int', doc='No change', multi=False) +option_4 = IntOption(properties=frozenset({'normal'}), name='int', doc='No change', multi=False, max_number=100, min_number=0) option_2 = OptionDescription(name='general', doc='general', properties=frozenset({'normal'}), children=[option_3, option_4]) option_1 = OptionDescription(name='rougail', doc='rougail', children=[option_2]) option_0 = OptionDescription(name='baseoption', doc='baseoption', children=[option_1]) diff --git a/tests/flattener_dicos/10check_no_param/00-base.xml b/tests/flattener_dicos/10check_no_param/00-base.xml index f26ecf5c..45688bf4 100644 --- a/tests/flattener_dicos/10check_no_param/00-base.xml +++ b/tests/flattener_dicos/10check_no_param/00-base.xml @@ -14,7 +14,7 @@ - + diff --git a/tests/flattener_dicos/10check_no_param/tiramisu/base.py b/tests/flattener_dicos/10check_no_param/tiramisu/base.py index 0a8d1d57..f0fade69 100644 --- a/tests/flattener_dicos/10check_no_param/tiramisu/base.py +++ b/tests/flattener_dicos/10check_no_param/tiramisu/base.py @@ -3,7 +3,7 @@ from rougail.tiramisu import ConvertDynOptionDescription import imp func = imp.load_source('func', 'tests/flattener_dicos/../eosfunc/test.py') option_3 = StrOption(properties=frozenset({'mandatory', 'normal'}), name='mode_conteneur_actif', doc='No change', multi=False, default='b') -option_4 = IntOption(properties=frozenset({'normal'}), validators=[Calculation(func.valid_entier, Params((ParamSelfOption()), kwargs={}), warnings_only=False)], name='int', doc='No change', multi=False) +option_4 = IntOption(properties=frozenset({'normal'}), validators=[Calculation(func.valid_lower, Params((ParamSelfOption()), kwargs={}), warnings_only=False)], name='int', doc='No change', multi=False) option_2 = OptionDescription(name='general', doc='general', properties=frozenset({'normal'}), children=[option_3, option_4]) option_1 = OptionDescription(name='rougail', doc='rougail', children=[option_2]) option_0 = OptionDescription(name='baseoption', doc='baseoption', children=[option_1]) diff --git a/tests/flattener_dicos/10check_option/00-base.xml b/tests/flattener_dicos/10check_option/00-base.xml index 9663d5c1..5abff47b 100644 --- a/tests/flattener_dicos/10check_option/00-base.xml +++ b/tests/flattener_dicos/10check_option/00-base.xml @@ -17,7 +17,7 @@ - + 0 int2 diff --git a/tests/flattener_dicos/10check_option/tiramisu/base.py b/tests/flattener_dicos/10check_option/tiramisu/base.py index 34beec3b..4856560b 100644 --- a/tests/flattener_dicos/10check_option/tiramisu/base.py +++ b/tests/flattener_dicos/10check_option/tiramisu/base.py @@ -4,7 +4,7 @@ import imp func = imp.load_source('func', 'tests/flattener_dicos/../eosfunc/test.py') option_3 = StrOption(properties=frozenset({'mandatory', 'normal'}), name='mode_conteneur_actif', doc='No change', multi=False, default='b') option_4 = IntOption(properties=frozenset({'mandatory', 'normal'}), name='int2', doc='No change', multi=False, default=100) -option_5 = IntOption(properties=frozenset({'normal'}), validators=[Calculation(func.valid_entier, Params((ParamSelfOption()), kwargs={'mini': ParamValue("0"), 'maxi': ParamOption(option_4, notraisepropertyerror=False, todict=False)}), warnings_only=False)], name='int', doc='No change', multi=False) +option_5 = IntOption(properties=frozenset({'normal'}), validators=[Calculation(func.valid_lower, Params((ParamSelfOption()), kwargs={'mini': ParamValue("0"), 'maxi': ParamOption(option_4, notraisepropertyerror=False, todict=False)}), warnings_only=False)], name='int', doc='No change', multi=False) option_2 = OptionDescription(name='general', doc='general', properties=frozenset({'normal'}), children=[option_3, option_4, option_5]) option_1 = OptionDescription(name='rougail', doc='rougail', children=[option_2]) option_0 = OptionDescription(name='baseoption', doc='baseoption', children=[option_1])