From cbf107cbdcb8e259cdd566d9820952a06c251fa6 Mon Sep 17 00:00:00 2001 From: Emmanuel Garette Date: Sat, 21 Dec 2019 12:45:01 +0100 Subject: [PATCH] add submulti support --- data/creole.dtd | 1 + src/rougail/annotator.py | 27 +++++++++++++++++++-------- src/rougail/loader.py | 23 +++++++++++++---------- 3 files changed, 33 insertions(+), 18 deletions(-) diff --git a/data/creole.dtd b/data/creole.dtd index 1b5e96f58..8ca948f0a 100644 --- a/data/creole.dtd +++ b/data/creole.dtd @@ -176,6 +176,7 @@ + diff --git a/src/rougail/annotator.py b/src/rougail/annotator.py index 984aa3cf5..6980364ab 100644 --- a/src/rougail/annotator.py +++ b/src/rougail/annotator.py @@ -53,7 +53,7 @@ modes = mode_factory() # that shall not be present in the exported (flatened) XML ERASED_ATTRIBUTES = ('redefine', 'exists', 'fallback', 'optional', 'remove_check', 'namespace', 'remove_condition', 'path', 'instance_mode', 'index', 'is_in_leadership', - 'level') # , '_real_container') + 'level', 'submulti') # , '_real_container') ERASED_CONTAINER_ATTRIBUTES = ('id', 'container', 'group_id', 'group', 'container_group') NOT_NEED_ACTIVATE = ('disknod',) @@ -477,6 +477,7 @@ class SpaceAnnotator(object): self.default_has_no_value = [] self.has_frozen_if_in_condition = [] self.default_variable_options() + self.variable_submulti() self.convert_auto_freeze() self.convert_groups() self.filter_check() @@ -546,8 +547,8 @@ class SpaceAnnotator(object): if is_leader: if variable.name == follower_names[0]: # followers are multi - if not variable.multi is True: - raise CreoleDictConsistencyError(_('the variable {} in a group must be multi').format(variable.name)) + if not variable.multi: + raise CreoleDictConsistencyError(_('the variable {} in a group must be multi or submulti').format(variable.name)) follower_names.remove(variable.name) leader_family.variable.pop(variable.name) leader_space.variable.append(variable) # pylint: disable=E1101 @@ -667,6 +668,16 @@ class SpaceAnnotator(object): 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_auto_freeze(self): # pylint: disable=C0111 if hasattr(self.space, 'variables'): for variables in self.space.variables.values(): @@ -998,7 +1009,7 @@ class SpaceAnnotator(object): del space[idx] remove_indexes = [] functions = dir(self.eosfunc) - functions.append('valid_enum') + functions.extend(['valid_enum', 'valid_in_network', 'valid_differ']) for idx, check in enumerate(space): if not check.name in functions: raise CreoleDictConsistencyError(_('cannot find check function {}').format(check.name)) @@ -1077,20 +1088,20 @@ class SpaceAnnotator(object): elif name == 'valid_network_netmask': params_len = 1 if len(check.param) != params_len: - raise CreoleLoaderError(_('{} must have {} param').format(name, params_len)) + raise CreoleDictConsistencyError(_('{} must have {} param').format(name, params_len)) elif name == 'valid_ipnetmask': params_len = 1 if len(check.param) != params_len: - raise CreoleLoaderError(_('{} must have {} param').format(name, params_len)) + raise CreoleDictConsistencyError(_('{} 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 CreoleLoaderError(_('{} must have {} param').format(name, params_len)) + raise CreoleDictConsistencyError(_('{} must have {} param').format(name, params_len)) elif name == 'valid_in_network': params_len = 2 if len(check.param) != params_len: - raise CreoleLoaderError(_('{} must have {} param').format(name, params_len)) + raise CreoleDictConsistencyError(_('{} must have {} param').format(name, params_len)) check_.name = name check_.warnings_only = check.warnings_only if hasattr(check, 'param'): diff --git a/src/rougail/loader.py b/src/rougail/loader.py index 725094924..63ae26d10 100644 --- a/src/rougail/loader.py +++ b/src/rougail/loader.py @@ -6,16 +6,14 @@ from os import listdir #from ast import literal_eval from lxml.etree import parse, DTD -from tiramisu.option import (StrOption, OptionDescription, DynOptionDescription, PortOption, - IntOption, ChoiceOption, BoolOption, SymLinkOption, IPOption, - NetworkOption, NetmaskOption, DomainnameOption, BroadcastOption, - URLOption, EmailOption, FilenameOption, UsernameOption, DateOption, - PasswordOption, BoolOption, MACOption, Leadership) -from tiramisu import Config, MetaConfig, MixConfig -from tiramisu.setting import groups +from tiramisu import (StrOption, OptionDescription, DynOptionDescription, PortOption, + IntOption, ChoiceOption, BoolOption, SymLinkOption, IPOption, + NetworkOption, NetmaskOption, DomainnameOption, BroadcastOption, + URLOption, EmailOption, FilenameOption, UsernameOption, DateOption, + PasswordOption, BoolOption, MACOption, Leadership, submulti, + Params, ParamSelfOption, ParamOption, ParamValue, ParamContext, Calculation, calc_value, + groups, owners) from tiramisu.error import ConfigError -from tiramisu.setting import owners -from tiramisu import Params, ParamOption, ParamValue, ParamContext, Calculation, calc_value from .config import dtdfilename from .i18n import _ @@ -307,6 +305,8 @@ class Variable(Common): value = True elif value == 'False': value = False + elif key == 'multi' and value == 'submulti': + value = submulti else: raise CreoleLoaderError(_('unknown value {} for {}').format(value, key)) if key == 'help': @@ -426,7 +426,10 @@ class Variable(Common): ret = [] for value in values: if isinstance(value, tuple): - args = [] + if key == 'validators': + args = [ParamSelfOption()] + else: + args = [] kwargs = {} if len(value) == 3: for param in value[1]: