diff --git a/src/rougail/annotator.py b/src/rougail/annotator.py
index 4455b6b3..d329e457 100644
--- a/src/rougail/annotator.py
+++ b/src/rougail/annotator.py
@@ -101,44 +101,41 @@ class ServiceAnnotator:
self.grouplist_conditions = {}
self.convert_services()
+ def gen_family(self,
+ name,
+ ):
+ family = self.objectspace.family()
+ family.name = name
+ family.doc = name
+ family.mode = None
+ return family
+
def convert_services(self):
if not hasattr(self.space, 'services'):
return
if not hasattr(self.space.services, 'service'):
del self.space.services
return
- for idx, service in enumerate(self.space.services.service.values()):
- service_name = f'service{idx}'
- family = self.objectspace.family()
- family.name = service_name
- family.doc = service.name
- family.mode = None
- family.family = self.convert_service_to_family(f'services.{service_name}',
- service,
- )
- setattr(self.space.services, family.name, family)
- del self.space.services.service
-
- def convert_service_to_family(self,
- subpath,
- service,
- ):
- services = {}
- for elttype, values in vars(service).items():
- if elttype == 'name' or elttype in ERASED_ATTRIBUTES:
- continue
- eltname = elttype + 's'
- family = self.objectspace.family()
- family.name = eltname
- family.mode = None
- if isinstance(values, dict):
- values = list(values.values())
- family.family = self.make_group_from_elts(elttype,
- values,
- f'{subpath}.{eltname}',
- )
- services[family.name] = family
- return services
+ self.space.services.hidden = True
+ families = {}
+ for idx, service_name in enumerate(self.space.services.service.keys()):
+ service = self.space.services.service[service_name]
+ new_service = self.objectspace.service()
+ for elttype, values in vars(service).items():
+ if elttype == 'name' or elttype in ERASED_ATTRIBUTES:
+ setattr(new_service, elttype, values)
+ continue
+ eltname = elttype + 's'
+ family = self.gen_family(eltname)
+ if isinstance(values, dict):
+ values = list(values.values())
+ family.family = self.make_group_from_elts(elttype,
+ values,
+ f'services.{service_name}.{eltname}',
+ )
+ setattr(new_service, elttype, family)
+ families[service_name] = new_service
+ self.space.services.service = families
def make_group_from_elts(self,
name,
@@ -160,8 +157,14 @@ class ServiceAnnotator:
update_elt = '_update_' + elt_name
if hasattr(self, update_elt):
getattr(self, update_elt)(elt, index, path)
- variables = []
- subpath = '{}.{}{}'.format(path, name, index)
+
+ if hasattr(elt, 'source'):
+ c_name = elt.source
+ else:
+ c_name = elt.name
+ family = self.gen_family(c_name)
+ family.variable = []
+ subpath = '{}.{}'.format(path, c_name)
listname = '{}list'.format(name)
activate_path = '.'.join([subpath, 'activate'])
if elt in self.grouplist_conditions:
@@ -179,75 +182,54 @@ class ServiceAnnotator:
value,
[]).append(activate_path)
continue
- if key == 'name':
- true_key = elt_name
- else:
- true_key = key
- if key in self.objectspace.booleans_attributs:
- type_ = 'boolean'
- else:
- type_ = 'string'
- dtd_key_type = true_key + '_type'
- if hasattr(elt, dtd_key_type):
- type_ = KEY_TYPE[getattr(elt, dtd_key_type)]
- multi = isinstance(value, list)
- variables.append(self._generate_element(key,
- value,
- type_,
- subpath,
- multi,
- ))
+ family.variable.append(self._generate_element(elt_name,
+ key,
+ value,
+ elt,
+ f'{subpath}.{key}'
+ ))
# FIXME ne devrait pas etre True par défaut
# devrait etre un calcule
- variables.append(self._generate_element('activate',
- True,
- 'boolean',
- subpath,
- ))
- family = self.objectspace.family()
- family.name = '{}{}'.format(name, index)
- family.variable = variables
- family.mode = None
- self.paths.add_family('services',
- subpath,
- family,
- )
+ family.variable.append(self._generate_element(elt_name,
+ 'activate',
+ True,
+ elt,
+ activate_path,
+ ))
families.append(family)
return families
def _generate_element(self,
+ elt_name,
key,
value,
- type_,
- subpath,
- multi=False,
+ elt,
+ path,
):
variable = self.objectspace.variable()
variable.name = key
- if type_ != 'symlink':
- variable.doc = key
- variable.multi = multi
variable.mode = None
- variable.hidden = True
+ if key == 'name':
+ true_key = elt_name
+ else:
+ true_key = key
+ dtd_key_type = true_key + '_type'
+ if key == 'activate':
+ type_ = 'boolean'
+ elif hasattr(elt, dtd_key_type):
+ type_ = KEY_TYPE[getattr(elt, dtd_key_type)]
+ elif key in self.objectspace.booleans_attributs:
+ type_ = 'boolean'
+ else:
+ type_ = 'string'
variable.type = type_
- if value is not None:
- if type_ == 'symlink':
- variable.opt = value
- else:
- if not multi:
- val = self.objectspace.value()
- val.name = value
- value = [val]
- else:
- # value is a list of objects
- value_list = []
- for val_iter in value:
- val = self.objectspace.value()
- val.name = val_iter.name
- value_list.append(val)
- value = value_list
- variable.value = value
- path = f'{subpath}.{key}'
+ if type_ == 'symlink':
+ variable.opt = value
+ else:
+ variable.doc = key
+ val = self.objectspace.value()
+ val.name = value
+ variable.value = [val]
self.paths.add_variable('services',
path,
'service',
@@ -264,8 +246,8 @@ class ServiceAnnotator:
"""
new_elts = {}
# reorder elts by index
- for elt in elts:
- new_elts.setdefault(elt.index, []).append(elt)
+ for idx, elt in enumerate(elts):
+ new_elts.setdefault(idx, []).append(elt)
idxes = list(new_elts.keys())
idxes.sort()
result_elts = []
@@ -330,12 +312,15 @@ class SpaceAnnotator(object):
def absolute_path_for_symlink_in_services(self):
if not hasattr(self.space, 'services'):
return
- families = vars(self.space.services).values()
- for family in families:
- if hasattr(family, 'family'):
- for fam in family.family.values():
- for fam1 in fam.family:
- for variable in fam1.variable:
+ for family_name, family in vars(self.space.services).items():
+ if not isinstance(family, dict):
+ continue
+ for fam in family.values():
+ for fam1_name, fam1 in vars(fam).items():
+ if fam1_name == 'name' or fam1_name in ERASED_ATTRIBUTES:
+ continue
+ for fam2 in fam1.family:
+ for variable in fam2.variable:
if variable.type == 'symlink' and '.' not in variable.name:
variable.opt = self.paths.get_variable_path(variable.opt,
VARIABLE_NAMESPACE,
@@ -767,8 +752,8 @@ class SpaceAnnotator(object):
raise CreoleDictConsistencyError(_('Cannot load {}').format(param.text))
elif param.type == 'python':
try:
+ #values = eval(param.text, {'eosfunc': self.eosfunc, '__builtins__': {'range': range, 'str': str}})
values = eval(param.text, {'eosfunc': self.eosfunc, '__builtins__': {'range': range, 'str': str}})
- #FIXME : eval('[str(i) for i in range(3, 13)]', {'eosfunc': eosfunc, '__builtins__': {'range': range, 'str': str}})
except NameError:
raise CreoleDictConsistencyError(_('The function {} is unknown').format(param.text))
if not isinstance(values, list):
@@ -794,12 +779,7 @@ class SpaceAnnotator(object):
for idx, param in enumerate(check.param):
if param.type not in TYPE_PARAM_CHECK:
raise CreoleDictConsistencyError(_('cannot use {} type as a param in check for {}').format(param.type, check.target))
- if param.type == 'eole':
- param.type = 'variable'
if param.type == 'variable':
- # if HIGH_COMPATIBILITY and param.text.startswith('container_ip'):
- # if param.optional is True:
- # param_option_indexes.append(idx)
try:
param.text = self.paths.get_variable_path(param.text, namespace)
except CreoleDictConsistencyError as err:
@@ -1093,8 +1073,6 @@ class SpaceAnnotator(object):
if param.type not in TYPE_PARAM_CONDITION:
raise CreoleDictConsistencyError(_('cannot use {} type as a param '
'in a condition').format(param.type))
- if param.type == 'eole':
- param.type = 'variable'
def check_choice_option_condition(self, force_remove_targets):
# remove condition for ChoiceOption that don't have param
diff --git a/src/rougail/data/rougail.dtd b/src/rougail/data/rougail.dtd
index 778a84ec..927e3543 100644
--- a/src/rougail/data/rougail.dtd
+++ b/src/rougail/data/rougail.dtd
@@ -43,33 +43,10 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -114,7 +91,6 @@
-
@@ -140,7 +116,6 @@
-
diff --git a/src/rougail/error.py b/src/rougail/error.py
index a0891e71..f9f06150 100644
--- a/src/rougail/error.py
+++ b/src/rougail/error.py
@@ -34,3 +34,7 @@ class CreoleDictConsistencyError(Exception):
"""It's not only that the Creole XML is valid against the Creole DTD
it's that it is not consistent.
"""
+
+
+class CreoleLoaderError(Exception):
+ pass
diff --git a/src/rougail/loader.py b/src/rougail/loader.py
index d9f91ca7..d24732ea 100644
--- a/src/rougail/loader.py
+++ b/src/rougail/loader.py
@@ -1,32 +1,26 @@
"""loader
flattened XML specific
"""
-from os.path import join, isfile, isdir
-from os import listdir
-#from ast import literal_eval
-from lxml.etree import parse, DTD
+from os.path import join, isfile
+from lxml.etree import DTD
+import imp
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, ParamDynOption, ParamValue, Calculation, calc_value,
- groups, owners)
-from tiramisu.error import ConfigError
+ Params, ParamSelfOption, ParamOption, ParamDynOption, ParamValue, Calculation, calc_value)
from .config import dtdfilename
from .i18n import _
-#For compatibility
-from .xmlreflector import HIGH_COMPATIBILITY
-#from . import eosfunc
-from .objspace import CreoleObjSpace
from .utils import normalize_family
from .annotator import VARIABLE_NAMESPACE
-import imp
+from .error import CreoleLoaderError
FUNC_TO_DICT = ['valid_not_equal']
+KNOWN_TAGS = ['family', 'variable', 'separators', 'leader', 'property']
class ConvertDynOptionDescription(DynOptionDescription):
@@ -37,19 +31,11 @@ class ConvertDynOptionDescription(DynOptionDescription):
check_name=False)
-class CreoleLoaderError(Exception):
- pass
-
-
def convert_tiramisu_value(value, obj):
"""
convertit les variables dans le bon type si nécessaire
"""
- if value is None:
- return value
def _convert_boolean(value):
- if isinstance(value, bool):
- return value
prop = {'True': True,
'False': False,
'None': None}
@@ -57,10 +43,9 @@ def convert_tiramisu_value(value, obj):
raise Exception('unknown value {} while trying to cast {} to boolean'.format(value, obj))
return prop[value]
- func = {IntOption: int, StrOption: str, PortOption: str,
- DomainnameOption: str, EmailOption: str, URLOption: str,
- IPOption: str, NetmaskOption: str, NetworkOption: str,
- BroadcastOption: str, FilenameOption: str,
+ if value is None:
+ return value
+ func = {IntOption: int,
BoolOption: _convert_boolean}.get(obj, None)
if func is None:
return value
@@ -98,18 +83,15 @@ CONVERT_OPTION = {'number': dict(opttype=IntOption),
}
-class Elt(object):
+class Elt:
def __init__(self, attrib):
self.attrib = attrib
-class PopulateTiramisuObjects(object):
+class PopulateTiramisuObjects:
def __init__(self):
self.storage = ElementStorage()
self.booleans = []
- self.force_store_values = set()
- self.separators = {}
- self.groups = {}
def parse_dtd(self, dtdfilename):
"""Loads the Creole DTD
@@ -128,129 +110,111 @@ class PopulateTiramisuObjects(object):
if set(attr.itervalues()) == set(['True', 'False']):
self.booleans.append(attr.name)
- def make_tiramisu_objects(self, xmlroot, eosfunc):
- elt = Elt({'name': 'baseoption'})
- if eosfunc is None:
- self.eosfunc = None
- else:
- self.eosfunc = imp.load_source('eosfunc', eosfunc)
- family = Family(elt, self.booleans, self.storage, self.eosfunc)
+ def get_root_family(self):
+ family = Family(Elt({'name': 'baseoption',
+ 'doc': 'baseoption'}),
+ self.booleans,
+ self.storage,
+ self.eosfunc,
+ )
self.storage.add('.', family)
-
- elts = {}
- for elt in xmlroot:
- elts.setdefault(elt.tag, []).append(elt)
- list_elts = list(elts.keys())
- if 'family' in list_elts:
- list_elts.remove('family')
- list_elts.insert(0, 'family')
- for elt in list_elts:
- xmlelts_ = elts[elt]
- if elt == 'family':
- xmlelts = []
- actions = None
- # VARIABLE_NAMESPACE family has to be loaded before any other family
- # because `extra` family could use `VARIABLE_NAMESPACE` variables.
- # `actions` family has to be loaded at the very end
- # because it may use `VARIABLE_NAMESPACE` or `extra` variables
- for xml in xmlelts_:
- if xml.attrib['name'] == VARIABLE_NAMESPACE:
- xmlelts.insert(0, xml)
- elif xml.attrib['name'] == 'actions':
- actions = xml
- else:
- xmlelts.append(xml)
- if actions is not None:
- xmlelts.append(actions)
- else:
- xmlelts = xmlelts_
- for xmlelt in xmlelts:
- if xmlelt.tag != 'family':
- raise CreoleLoaderError(_('unknown tag {}').format(xmlelt.tag))
- self._iter_family(xmlelt, family)
-
- def _populate_variable(self, elt, subpath, is_follower, is_leader):
- variable = Variable(elt, self.booleans, self.storage, is_follower, is_leader, self.eosfunc)
- path = self._build_path(subpath, elt)
- properties = variable.attrib.get('properties', [])
- if 'force_store_value' in properties or "auto_freeze" in properties:
- self.force_store_values.add(path)
- self.storage.add(path, variable)
- return variable
-
- def _populate_family(self, elt, subpath):
- if subpath is None:
- force_icon = False
- else:
- force_icon = not subpath.startswith('containers') and not subpath.startswith('actions')
- family = Family(elt, self.booleans, self.storage, self.eosfunc, force_icon)
- path = self._build_path(subpath, elt)
- self.storage.add(path, family)
return family
- def _build_path(self, subpath, elt):
- if subpath is None:
- subpath = elt.attrib['name']
- else:
- subpath += '.' + elt.attrib['name']
- return subpath
-
- def _iter_leader(self, leader, subpath):
- subpath = self._build_path(subpath, leader)
- family = Family(leader, self.booleans, self.storage, self.eosfunc)
- family.set_leader()
- self.storage.add(subpath, family)
- leader_name = None
- for var in leader:
- if var.tag == 'property':
- self._parse_properties(family, var)
- elif var.tag == 'variable':
- if leader_name is None:
- leader_name = var.attrib['name']
- self.groups[leader_name] = []
- else:
- self.groups[leader_name].append(var.attrib['name'])
- self._iter_family(var, family, subpath=subpath)
+ def reorder_family(self, xmlroot):
+ xmlelts = []
+ for xmlelt in xmlroot:
+ # VARIABLE_NAMESPACE family has to be loaded before any other family
+ # because `extra` family could use `VARIABLE_NAMESPACE` variables.
+ if xmlelt.attrib['name'] == VARIABLE_NAMESPACE:
+ xmlelts.insert(0, xmlelt)
else:
- raise CreoleLoaderError(_('unknown tag {}').format(var.tag))
- return family
+ xmlelts.append(xmlelt)
+ return xmlelts
- def _iter_family(self, child, family, subpath=None):
- if child.tag not in ['family', 'variable', 'separators', 'leader', 'property']:
+ def make_tiramisu_objects(self, xmlroot, eosfunc):
+ self.eosfunc = imp.load_source('eosfunc', eosfunc)
+
+ family = self.get_root_family()
+ for xmlelt in self.reorder_family(xmlroot):
+ self.iter_family(xmlelt,
+ family,
+ None,
+ )
+
+ def iter_family(self,
+ child,
+ family,
+ subpath,
+ ):
+ if child.tag not in KNOWN_TAGS:
raise CreoleLoaderError(_('unknown tag {}').format(child.tag))
- if child.tag == 'family':
- old_family = family
- family = self._populate_family(child, subpath)
- if old_family is not None:
- old_family.add(family)
- if len(child) != 0:
- subpath = self._build_path(subpath, child)
- for c in child:
- self._iter_family(c, family, subpath=subpath)
- elif child.tag == 'leader':
- leader = self._iter_leader(child, subpath)
- family.add(leader)
+ if child.tag in ['family', 'leader']:
+ self.populate_family(family,
+ child,
+ subpath,
+ )
elif child.tag == 'separators':
- self._parse_separators(child)
+ self.parse_separators(child)
elif child.tag == 'variable':
- if family is None:
- raise CreoleLoaderError(_('variable without family'))
-
- is_follower = False
- is_leader = False
- if family.is_leader:
- if child.attrib['name'] != family.attrib['name']:
- is_follower = True
- else:
- is_leader = True
- variable = self._populate_variable(child, subpath, is_follower, is_leader)
- family.add(variable)
+ self.populate_variable(child, subpath, family)
elif child.tag == 'property':
- self._parse_properties(family, child)
+ self.parse_properties(family, child)
else:
raise Exception('unknown tag {}'.format(child.tag))
- def _parse_properties(self, family, child):
+ def populate_family(self,
+ parent_family,
+ elt,
+ subpath,
+ ):
+ path = self.build_path(subpath,
+ elt,
+ )
+ family = Family(elt,
+ self.booleans,
+ self.storage,
+ self.eosfunc,
+ )
+ self.storage.add(path, family)
+ if elt.tag == 'leader':
+ family.set_leader()
+ parent_family.add(family)
+ if len(elt) != 0:
+ for child in elt:
+ self.iter_family(child,
+ family,
+ path,
+ )
+
+ def parse_separators(self,
+ separators,
+ ):
+ for separator in separators:
+ elt = self.storage.get(separator.attrib['name'])
+ elt.add_information('separator', separator.text)
+
+ def populate_variable(self, elt, subpath, family):
+ is_follower = False
+ is_leader = False
+ if family.is_leader:
+ if elt.attrib['name'] != family.attrib['name']:
+ is_follower = True
+ else:
+ is_leader = True
+ path = self.build_path(subpath,
+ elt,
+ )
+ variable = Variable(elt,
+ self.booleans,
+ self.storage,
+ is_follower,
+ is_leader,
+ self.eosfunc,
+ )
+ self.storage.add(path, variable)
+ family.add(variable)
+
+ def parse_properties(self, family, child):
if child.get('type') == 'calculation':
kwargs = {'condition': child.attrib['source'],
'expected': ParamValue(child.attrib.get('expected'))}
@@ -260,17 +224,13 @@ class PopulateTiramisuObjects(object):
else:
family.attrib['properties'].append(child.text)
- def _parse_separators(self, separators):
- for separator in separators:
- elt = self.storage.get(separator.attrib['name'])
- never_hidden = separator.attrib.get('never_hidden')
- if never_hidden == 'True':
- never_hidden = True
- else:
- never_hidden = None
- info = (separator.text, never_hidden)
- self.separators[separator.attrib['name']] = info
- elt.add_information('separator', info)
+ def build_path(self,
+ subpath,
+ elt,
+ ):
+ if subpath is None:
+ return elt.attrib['name']
+ return subpath + '.' + elt.attrib['name']
class ElementStorage:
@@ -282,10 +242,6 @@ class ElementStorage:
raise CreoleLoaderError(_('path already loaded {}').format(path))
self.paths[path] = elt
- def add_information(self, path, name, information):
- elt = self.get(path)
- elt.add_information(name, information)
-
def get(self, path):
if path not in self.paths:
raise CreoleLoaderError(_('there is no element for path {}').format(path))
@@ -313,115 +269,124 @@ class Variable(Common):
self.option = None
self.informations = {}
self.attrib = {}
- self.attrib['properties'] = []
+ if elt.attrib['type'] != 'symlink':
+ self.attrib['properties'] = []
self.attrib['validators'] = []
self.eosfunc = eosfunc
self.storage = storage
- is_submulti = False
+ self.booleans = booleans
+ self.populate_attrib(elt)
+ self.is_follower = is_follower
+ self.is_leader = is_leader
+ convert_option = CONVERT_OPTION[elt.attrib['type']]
+ self.object_type = convert_option['opttype']
+ self.populate_choice(elt)
+ for child in elt:
+ self.populate_property(child)
+ self.populate_value(child)
+ self.populate_check(child)
+ if 'initkwargs' in convert_option:
+ self.attrib.update(convert_option['initkwargs'])
+ if elt.attrib['type'] == 'symlink':
+ self.attrib['opt'] = storage.get(self.attrib['opt'])
+
+ def populate_attrib(self,
+ elt,
+ ):
for key, value in elt.attrib.items():
- if key in booleans:
+ if key == 'multi' and elt.attrib['type'] == 'symlink':
+ continue
+ if key == 'multi' and value == 'submulti':
+ value = submulti
+ elif key in self.booleans:
if value == 'True':
value = True
elif value == 'False':
value = False
- elif key == 'multi' and value == 'submulti':
- is_submulti = True
- value = submulti
else:
raise CreoleLoaderError(_('unknown value {} for {}').format(value, key))
if key in ['help', 'test']:
self.add_information(key, value)
- elif key == 'type':
- pass
- else:
+ elif key != 'type':
self.attrib[key] = value
- convert_option = CONVERT_OPTION[elt.attrib['type']]
- self.object_type = convert_option['opttype']
+
+ def populate_choice(self,
+ elt,
+ ):
if elt.attrib['type'] == 'choice':
- if self.attrib.get('choice'):
- self.attrib['values'] = getattr(self.eosfunc, self.attrib.get('choice'))
+ values = []
+ for child in elt:
+ if child.tag == 'choice':
+ value = child.text
+ if child.attrib['type'] == 'number':
+ value = int(value)
+ values.append(value)
+ self.attrib['values'] = tuple(values)
+
+ def populate_property(self, child):
+ if child.tag == 'property':
+ if child.get('type') == 'calculation':
+ kwargs = {'condition': child.attrib['source'],
+ 'expected': ParamValue(child.attrib.get('expected'))}
+ if child.attrib['inverse'] == 'True':
+ kwargs['reverse_condition'] = ParamValue(True)
+ self.attrib['properties'].append((ParamValue(child.text), kwargs))
else:
- self.attrib['values'] = []
- for child in elt:
- if child.tag == 'choice':
- value = child.text
- if 'type' in child.attrib and child.attrib['type'] == 'number':
- value = int(value)
- if value is None:
- value = u''
- self.attrib['values'].append(value)
- self.attrib['values'] = tuple(self.attrib['values'])
- for child in elt:
- if child.tag == 'property':
- if child.get('type') == 'calculation':
- kwargs = {'condition': child.attrib['source'],
- 'expected': ParamValue(child.attrib.get('expected'))}
- if child.attrib['inverse'] == 'True':
- kwargs['reverse_condition'] = ParamValue(True)
- self.attrib['properties'].append((ParamValue(child.text), kwargs))
+ self.attrib['properties'].append(child.text)
+
+ def populate_value(self, child):
+ if child.tag == 'value':
+ if child.attrib.get('type') == 'calculation':
+ if child.text is not None and child.text.strip():
+ self.attrib['default'] = (child.text.strip(),)
else:
- self.attrib['properties'].append(child.text)
- elif child.tag == 'value':
- if child.attrib.get('type') == 'calculation':
- if child.text is not None and child.text.strip():
- self.attrib['default'] = (child.text.strip(),)
- else:
- params = []
- for param in child:
- params.append(self.parse_param(param))
- self.attrib['default'] = (child.attrib['name'], params, False)
+ params = []
+ for param in child:
+ params.append(self.parse_param(param))
+ self.attrib['default'] = (child.attrib['name'], params, False)
+ else:
+ if "type" in child.attrib:
+ type_ = CONVERT_OPTION[child.attrib['type']]['opttype']
else:
- if "type" in child.attrib:
- type_ = CONVERT_OPTION[child.attrib['type']]['opttype']
- else:
- type_ = self.object_type
- if self.attrib['multi'] is True and not is_follower:
- if 'default' not in self.attrib:
- self.attrib['default'] = []
- value = convert_tiramisu_value(child.text, type_)
- self.attrib['default'].append(value)
- if 'default_multi' not in self.attrib and not is_leader:
- self.attrib['default_multi'] = value
- elif self.attrib['multi'] == submulti:
- if 'default' not in self.attrib:
- self.attrib['default'] = []
- value = convert_tiramisu_value(child.text, type_)
- if not is_follower:
- if not isinstance(value, list):
- dvalue = [value]
- else:
- dvalue = value
- self.attrib['default'].append(dvalue)
- if value and 'default_multi' not in self.attrib and not is_leader:
- self.attrib['default_multi'] = []
- if not is_leader:
- self.attrib['default_multi'].append(value)
- else:
- if 'default' in self.attrib:
- raise CreoleLoaderError(_('default value already set for {}'
- '').format(self.attrib['path']))
- value = convert_tiramisu_value(child.text, type_)
- if is_follower:
- self.attrib['default_multi'] = value
+ type_ = self.object_type
+ if self.attrib['multi'] is True and not self.is_follower:
+ if 'default' not in self.attrib:
+ self.attrib['default'] = []
+ value = convert_tiramisu_value(child.text, type_)
+ self.attrib['default'].append(value)
+ if 'default_multi' not in self.attrib and not self.is_leader:
+ self.attrib['default_multi'] = value
+ elif self.attrib['multi'] == submulti:
+ if 'default' not in self.attrib:
+ self.attrib['default'] = []
+ value = convert_tiramisu_value(child.text, type_)
+ if not self.is_follower:
+ if not isinstance(value, list):
+ dvalue = [value]
else:
- self.attrib['default'] = value
- elif child.tag == 'choice':
- # already load
- pass
- elif child.tag == 'check':
- params = []
- for param in child:
- params.append(self.parse_param(param))
- #check.params = params
- self.attrib['validators'].append((child.attrib['name'], params, child.attrib['warnings_only']))
- else:
- raise Exception('unknown tag {}'.format(child.tag))
- if 'initkwargs' in convert_option:
- self.attrib.update(convert_option['initkwargs'])
- if elt.attrib['type'] == 'symlink':
- del self.attrib['properties']
- del self.attrib['multi']
- self.attrib['opt'] = storage.get(self.attrib['opt'])
+ dvalue = value
+ self.attrib['default'].append(dvalue)
+ if value and 'default_multi' not in self.attrib and not self.is_leader:
+ self.attrib['default_multi'] = []
+ if not self.is_leader:
+ self.attrib['default_multi'].append(value)
+ else:
+ if 'default' in self.attrib:
+ raise CreoleLoaderError(_('default value already set for {}'
+ '').format(self.attrib['path']))
+ value = convert_tiramisu_value(child.text, type_)
+ if self.is_follower:
+ self.attrib['default_multi'] = value
+ else:
+ self.attrib['default'] = value
+
+ def populate_check(self, child):
+ if child.tag == 'check':
+ params = []
+ for param in child:
+ params.append(self.parse_param(param))
+ #check.params = params
+ self.attrib['validators'].append((child.attrib['name'], params, child.attrib['warnings_only']))
def parse_param(self, param):
name = param.attrib.get('name', '')
@@ -515,7 +480,7 @@ class Variable(Common):
import traceback
traceback.print_exc()
name = self.attrib['name']
- raise CreoleLoaderError(_('cannot create option {}: {}').format(name, err))
+ raise CreoleLoaderError(_('cannot create option "{}": {}').format(name, err))
for key, value in self.informations.items():
option.impl_set_information(key, value)
self.option = option
@@ -523,42 +488,25 @@ class Variable(Common):
class Family(Common):
- def __init__(self, elt, booleans, storage, eosfunc, force_icon=False):
+ def __init__(self,
+ elt,
+ booleans,
+ storage,
+ eosfunc,
+ ):
self.option = None
self.attrib = {}
self.is_leader = False
- if force_icon:
- self.informations = {'icon': None}
- else:
- self.informations = {}
+ self.informations = {}
self.children = []
self.storage = storage
self.eosfunc = eosfunc
self.attrib['properties'] = []
for key, value in elt.attrib.items():
- if key in booleans:
- if value == 'True':
- value = True
- elif value == 'False':
- value = False
- else:
- raise CreoleLoaderError(_('unknown value {} for {}').format(value, key))
- if key == 'icon':
- self.add_information('icon', value)
- continue
- elif key == 'hidden':
- if value:
- self.attrib['properties'].append(key)
- elif key == 'mode':
- self.attrib['properties'].append(value)
- elif key == 'help':
+ if key == 'help':
self.add_information(key, value)
- elif key == 'type':
- pass
else:
self.attrib[key] = value
- if 'doc' not in self.attrib:
- self.attrib['doc'] = u''
def add(self, child):
self.children.append(child)
@@ -589,13 +537,11 @@ class Family(Common):
else:
option = Leadership(**self.attrib)
except Exception as err:
- raise CreoleLoaderError(_('cannot create optiondescription {}: {}').format(self.attrib['name'], err))
+ print(self.attrib)
+ raise CreoleLoaderError(_('cannot create optiondescription "{}": {}').format(self.attrib['name'], err))
for key, value in self.informations.items():
option.impl_set_information(key, value)
self.option = option
- #if self.is_leader:
- # self.option.impl_set_group_type(groups.leader)
-
return self.option
diff --git a/src/rougail/objspace.py b/src/rougail/objspace.py
index e93a58f2..cabefb75 100644
--- a/src/rougail/objspace.py
+++ b/src/rougail/objspace.py
@@ -36,7 +36,7 @@ from .path import Path
# CreoleObjSpace's elements like 'family' or 'follower', that shall be forced to the Redefinable type
FORCE_REDEFINABLES = ('family', 'follower', 'service', 'disknod', 'variables')
# CreoleObjSpace's elements that shall be forced to the UnRedefinable type
-FORCE_UNREDEFINABLES = ('value', 'input', 'profile', 'ewtapp', 'tag', 'saltaction')
+FORCE_UNREDEFINABLES = ('value',)
# CreoleObjSpace's elements that shall be set to the UnRedefinable type
UNREDEFINABLE = ('submulti', 'multi', 'type')
@@ -47,9 +47,18 @@ CONVERT_PROPERTIES = {'auto_save': ['force_store_value'], 'auto_freeze': ['force
RENAME_ATTIBUTES = {'description': 'doc'}
INCOMPATIBLE_ATTRIBUTES = [['multi', 'submulti']]
-FORCED_TEXT_ELTS_AS_NAME = ('choice', 'property')
+FORCED_TEXT_ELTS_AS_NAME = ('choice', 'property', 'value', 'target')
-#TYPE_TARGET_CONDITION = ('variable', 'family')
+CONVERT_EXPORT = {'Leadership': 'leader',
+ 'Separators': 'separators',
+ 'Variable': 'variable',
+ 'Value': 'value',
+ 'Property': 'property',
+ 'Choice': 'choice',
+ 'Param': 'param',
+ 'Separator': 'separator',
+ 'Check': 'check',
+ }
# _____________________________________________________________________________
# special types definitions for the Object Space's internal representation
@@ -474,7 +483,7 @@ class CreoleObjSpace:
variableobj.redefine = child.attrib['target'] in self.redefine_variables
if not hasattr(variableobj, 'index'):
variableobj.index = self.index
- if child.tag in ['fill', 'condition', 'check', 'action']:
+ if child.tag in ['fill', 'condition', 'check']:
variableobj.namespace = namespace
def fill_variableobj_path_attribute(self,
@@ -537,60 +546,47 @@ class CreoleObjSpace:
space = list(space.values())
if isinstance(space, list):
for subspace in space:
- if isinstance(subspace, self.Leadership):
- _name = 'leader'
- else:
- _name = name
- if name in ['services', 'variables', 'actions']:
- _name = 'family'
- if HIGH_COMPATIBILITY and not hasattr(subspace, 'doc'):
- subspace.doc = ''
- if _name == 'value' and (not hasattr(subspace, 'name') or subspace.name is None):
+ if name == 'value' and (not hasattr(subspace, 'name') or subspace.name is None):
+ raise Exception('pfff')
continue
+ _name = CONVERT_EXPORT.get(subspace.__class__.__name__, 'family')
child_node = SubElement(node, _name)
self._xml_export(child_node, subspace, _name)
- elif isinstance(space, self.Atom):
- if name == 'services':
- child_node = SubElement(node, 'family')
+ elif isinstance(space, (self.Atom, (self.Redefinable, self.UnRedefinable))):
+ _name = CONVERT_EXPORT.get(space.__class__.__name__, 'family')
+ child_node = SubElement(node, _name)
+ if _name != name:
child_node.attrib['name'] = name
+ if 'doc' not in child_node.attrib.keys():
+ child_node.attrib['doc'] = name
+ for subname in self.get_attributes(space):
+ subspace = getattr(space, subname)
+ self._sub_xml_export(subname, child_node, name, subspace, space)
+ elif name not in ERASED_ATTRIBUTES:
+ # # FIXME plutot dans annotator ...
+ if node.tag in ['variable', 'family', 'leader']:
+ if name in PROPERTIES:
+ if space is True:
+ for prop in CONVERT_PROPERTIES.get(name, [name]):
+ SubElement(node, 'property').text = prop
+ return
+ if name == 'mode' and space:
+ SubElement(node, 'property').text = space
+ return
+ # Not param for calculation ...
+ if name == 'name' and node_name in FORCED_TEXT_ELTS_AS_NAME and not hasattr(current_space, 'param'):
+ node.text = str(space)
+ elif name == 'text' and node_name in self.forced_text_elts:
+ node.text = space
+ elif node.tag == 'family' and name == 'name':
+ if 'doc' not in node.attrib.keys():
+ node.attrib['doc'] = space
+ node.attrib['name'] = normalize_family(space, check_name=False)
else:
- child_node = SubElement(node, name)
- for subname in self.get_attributes(space):
- subspace = getattr(space, subname)
- self._sub_xml_export(subname, child_node, name, subspace, space)
- elif isinstance(space, self.Redefinable):
- child_node = SubElement(node, 'family')
- child_node.attrib['name'] = name
- for subname in self.get_attributes(space):
- subspace = getattr(space, subname)
- self._sub_xml_export(subname, child_node, name, subspace, space)
- else:
- # FIXME plutot dans annotator ...
- if name in PROPERTIES and node.tag in ['variable', 'family', 'leader']:
- if space is True:
- for prop in CONVERT_PROPERTIES.get(name, [name]):
- SubElement(node, 'property').text = prop
-
- elif name not in ERASED_ATTRIBUTES:
- if name == 'name' and node_name in self.forced_text_elts_as_name and not hasattr(current_space, 'param'):
- if isinstance(space, str):
- node.text = space
- else:
- node.text = str(space)
- elif name == 'text' and node_name in self.forced_text_elts:
- node.text = space
- elif node.tag == 'family' and name == 'name':
- if 'doc' not in node.attrib.keys():
- node.attrib['doc'] = space
- node.attrib['name'] = normalize_family(space, check_name=False)
- elif node.tag in ['variable', 'family', 'leader'] and name == 'mode':
- if space is not None:
- SubElement(node, 'property').text = space
- else:
- if name in RENAME_ATTIBUTES:
- name = RENAME_ATTIBUTES[name]
- if space is not None:
- node.attrib[name] = str(space)
+ if name in RENAME_ATTIBUTES:
+ name = RENAME_ATTIBUTES[name]
+ if space is not None:
+ node.attrib[name] = str(space)
def _xml_export(self,
node,
@@ -599,4 +595,9 @@ class CreoleObjSpace:
):
for name in self.get_attributes(space):
subspace = getattr(space, name)
- self._sub_xml_export(name, node, node_name, subspace, space)
+ self._sub_xml_export(name,
+ node,
+ node_name,
+ subspace,
+ space,
+ )
diff --git a/src/rougail/path.py b/src/rougail/path.py
index 88215e94..12119c12 100644
--- a/src/rougail/path.py
+++ b/src/rougail/path.py
@@ -115,15 +115,6 @@ class Path:
) -> str: # pylint: disable=C0111
return self._get_variable(name)['family']
- def get_variable_family_path(self,
- name: str,
- ) -> str: # pylint: disable=C0111
- dico = self._get_variable(name)
- list_path = [dico['namespace'], dico['family']]
- if dico['leader'] is not None:
- list_path.append(dico['leader'])
- return '.'.join(list_path)
-
def get_variable_namespace(self,
name: str,
) -> str: # pylint: disable=C0111
diff --git a/tests/flattener_dicos/00empty/result/00-base.xml b/tests/flattener_dicos/00empty/result/00-base.xml
index 944cc083..91a556bc 100644
--- a/tests/flattener_dicos/00empty/result/00-base.xml
+++ b/tests/flattener_dicos/00empty/result/00-base.xml
@@ -1,6 +1,7 @@
-
-
+
+ hidden
+
diff --git a/tests/flattener_dicos/00load_autofreeze/00-base.xml b/tests/flattener_dicos/00load_autofreeze/00-base.xml
index eb4c54c2..63563a7e 100644
--- a/tests/flattener_dicos/00load_autofreeze/00-base.xml
+++ b/tests/flattener_dicos/00load_autofreeze/00-base.xml
@@ -1,8 +1,6 @@
-
-
diff --git a/tests/flattener_dicos/00load_autofreeze/result/00-base.xml b/tests/flattener_dicos/00load_autofreeze/result/00-base.xml
index 81ab03d4..d1b67266 100644
--- a/tests/flattener_dicos/00load_autofreeze/result/00-base.xml
+++ b/tests/flattener_dicos/00load_autofreeze/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
basic
diff --git a/tests/flattener_dicos/00load_autofreezeexpert/result/00-base.xml b/tests/flattener_dicos/00load_autofreezeexpert/result/00-base.xml
index f66da60c..519f4a26 100644
--- a/tests/flattener_dicos/00load_autofreezeexpert/result/00-base.xml
+++ b/tests/flattener_dicos/00load_autofreezeexpert/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/00load_autosave/result/00-base.xml b/tests/flattener_dicos/00load_autosave/result/00-base.xml
index 3549c7a1..7fe1d9d3 100644
--- a/tests/flattener_dicos/00load_autosave/result/00-base.xml
+++ b/tests/flattener_dicos/00load_autosave/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
basic
diff --git a/tests/flattener_dicos/00load_autosaveexpert/result/00-base.xml b/tests/flattener_dicos/00load_autosaveexpert/result/00-base.xml
index 1397f9bd..37e2ae13 100644
--- a/tests/flattener_dicos/00load_autosaveexpert/result/00-base.xml
+++ b/tests/flattener_dicos/00load_autosaveexpert/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
expert
diff --git a/tests/flattener_dicos/00load_comment/result/00-base.xml b/tests/flattener_dicos/00load_comment/result/00-base.xml
index f6b2bc8d..3edfdc1b 100644
--- a/tests/flattener_dicos/00load_comment/result/00-base.xml
+++ b/tests/flattener_dicos/00load_comment/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/00load_notype/result/00-base.xml b/tests/flattener_dicos/00load_notype/result/00-base.xml
index 35d6e59f..2d6a3dfe 100644
--- a/tests/flattener_dicos/00load_notype/result/00-base.xml
+++ b/tests/flattener_dicos/00load_notype/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/00load_save/result/00-base.xml b/tests/flattener_dicos/00load_save/result/00-base.xml
index f6b2bc8d..3edfdc1b 100644
--- a/tests/flattener_dicos/00load_save/result/00-base.xml
+++ b/tests/flattener_dicos/00load_save/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/00load_subfolder/result/00-base.xml b/tests/flattener_dicos/00load_subfolder/result/00-base.xml
index 684ba2ea..884404d2 100644
--- a/tests/flattener_dicos/00load_subfolder/result/00-base.xml
+++ b/tests/flattener_dicos/00load_subfolder/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/01auto_base/result/00-base.xml b/tests/flattener_dicos/01auto_base/result/00-base.xml
index 0bb18d0b..b3c10f27 100644
--- a/tests/flattener_dicos/01auto_base/result/00-base.xml
+++ b/tests/flattener_dicos/01auto_base/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/01auto_withoutparam/result/00-base.xml b/tests/flattener_dicos/01auto_withoutparam/result/00-base.xml
index 67e65176..28597e3b 100644
--- a/tests/flattener_dicos/01auto_withoutparam/result/00-base.xml
+++ b/tests/flattener_dicos/01auto_withoutparam/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/01base_multi/result/00-base.xml b/tests/flattener_dicos/01base_multi/result/00-base.xml
index 4f0fe326..10e2c3e8 100644
--- a/tests/flattener_dicos/01base_multi/result/00-base.xml
+++ b/tests/flattener_dicos/01base_multi/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/01base_submulti/result/00-base.xml b/tests/flattener_dicos/01base_submulti/result/00-base.xml
index 6287f508..fb143afe 100644
--- a/tests/flattener_dicos/01base_submulti/result/00-base.xml
+++ b/tests/flattener_dicos/01base_submulti/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/01fill_autofreeze/result/00-base.xml b/tests/flattener_dicos/01fill_autofreeze/result/00-base.xml
index 7c06b41c..952d6c0b 100644
--- a/tests/flattener_dicos/01fill_autofreeze/result/00-base.xml
+++ b/tests/flattener_dicos/01fill_autofreeze/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
basic
diff --git a/tests/flattener_dicos/01fill_autosave/result/00-base.xml b/tests/flattener_dicos/01fill_autosave/result/00-base.xml
index ca2e6af4..15d3dae7 100644
--- a/tests/flattener_dicos/01fill_autosave/result/00-base.xml
+++ b/tests/flattener_dicos/01fill_autosave/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
basic
diff --git a/tests/flattener_dicos/01fill_base/result/00-base.xml b/tests/flattener_dicos/01fill_base/result/00-base.xml
index 0bb18d0b..b3c10f27 100644
--- a/tests/flattener_dicos/01fill_base/result/00-base.xml
+++ b/tests/flattener_dicos/01fill_base/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/01fill_baseaccent/result/00-base.xml b/tests/flattener_dicos/01fill_baseaccent/result/00-base.xml
index dffdeca9..29705f43 100644
--- a/tests/flattener_dicos/01fill_baseaccent/result/00-base.xml
+++ b/tests/flattener_dicos/01fill_baseaccent/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/01fill_mandatory/result/00-base.xml b/tests/flattener_dicos/01fill_mandatory/result/00-base.xml
index 33ab0598..5cfedcb0 100644
--- a/tests/flattener_dicos/01fill_mandatory/result/00-base.xml
+++ b/tests/flattener_dicos/01fill_mandatory/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/01fill_number/result/00-base.xml b/tests/flattener_dicos/01fill_number/result/00-base.xml
index f5cee6a4..40d21e31 100644
--- a/tests/flattener_dicos/01fill_number/result/00-base.xml
+++ b/tests/flattener_dicos/01fill_number/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/01fill_optional/result/00-base.xml b/tests/flattener_dicos/01fill_optional/result/00-base.xml
index 0bb18d0b..b3c10f27 100644
--- a/tests/flattener_dicos/01fill_optional/result/00-base.xml
+++ b/tests/flattener_dicos/01fill_optional/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/01separator_base/result/00-base.xml b/tests/flattener_dicos/01separator_base/result/00-base.xml
index 01849b18..87cfeb7a 100644
--- a/tests/flattener_dicos/01separator_base/result/00-base.xml
+++ b/tests/flattener_dicos/01separator_base/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/01separator_neverhidden/00-base.xml b/tests/flattener_dicos/01separator_neverhidden/00-base.xml
index 8be43ca0..cd4b3228 100644
--- a/tests/flattener_dicos/01separator_neverhidden/00-base.xml
+++ b/tests/flattener_dicos/01separator_neverhidden/00-base.xml
@@ -10,7 +10,7 @@
- Établissement
+ Établissement
diff --git a/tests/flattener_dicos/01separator_neverhidden/result/00-base.xml b/tests/flattener_dicos/01separator_neverhidden/result/00-base.xml
index 385282dd..87cfeb7a 100644
--- a/tests/flattener_dicos/01separator_neverhidden/result/00-base.xml
+++ b/tests/flattener_dicos/01separator_neverhidden/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
@@ -15,7 +15,7 @@
- Établissement
+ Établissement
diff --git a/tests/flattener_dicos/10autosave_hidden/result/00-base.xml b/tests/flattener_dicos/10autosave_hidden/result/00-base.xml
index 200c4b01..ed9c9aed 100644
--- a/tests/flattener_dicos/10autosave_hidden/result/00-base.xml
+++ b/tests/flattener_dicos/10autosave_hidden/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
basic
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 c7708ec4..6c311da8 100644
--- a/tests/flattener_dicos/10autosave_hidden_frozenifin/result/00-base.xml
+++ b/tests/flattener_dicos/10autosave_hidden_frozenifin/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
basic
diff --git a/tests/flattener_dicos/10check_base/result/00-base.xml b/tests/flattener_dicos/10check_base/result/00-base.xml
index 05c8edac..f26bd8b5 100644
--- a/tests/flattener_dicos/10check_base/result/00-base.xml
+++ b/tests/flattener_dicos/10check_base/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10check_option/result/00-base.xml b/tests/flattener_dicos/10check_option/result/00-base.xml
index 3fe50ff7..cbf1f6d5 100644
--- a/tests/flattener_dicos/10check_option/result/00-base.xml
+++ b/tests/flattener_dicos/10check_option/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10check_optional/result/00-base.xml b/tests/flattener_dicos/10check_optional/result/00-base.xml
index ddabcb9a..e7857bcd 100644
--- a/tests/flattener_dicos/10check_optional/result/00-base.xml
+++ b/tests/flattener_dicos/10check_optional/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10check_valid_differ/result/00-base.xml b/tests/flattener_dicos/10check_valid_differ/result/00-base.xml
index 3067b49e..ed822306 100644
--- a/tests/flattener_dicos/10check_valid_differ/result/00-base.xml
+++ b/tests/flattener_dicos/10check_valid_differ/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10check_valid_differ_add/result/00-base.xml b/tests/flattener_dicos/10check_valid_differ_add/result/00-base.xml
index 9ae0cecd..42454274 100644
--- a/tests/flattener_dicos/10check_valid_differ_add/result/00-base.xml
+++ b/tests/flattener_dicos/10check_valid_differ_add/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10check_valid_differ_removecheck/result/00-base.xml b/tests/flattener_dicos/10check_valid_differ_removecheck/result/00-base.xml
index 3e442b48..0b4374d4 100644
--- a/tests/flattener_dicos/10check_valid_differ_removecheck/result/00-base.xml
+++ b/tests/flattener_dicos/10check_valid_differ_removecheck/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10check_valid_ipnetmask/result/00-base.xml b/tests/flattener_dicos/10check_valid_ipnetmask/result/00-base.xml
index ee6c8533..835a5304 100644
--- a/tests/flattener_dicos/10check_valid_ipnetmask/result/00-base.xml
+++ b/tests/flattener_dicos/10check_valid_ipnetmask/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
basic
diff --git a/tests/flattener_dicos/10leadership_append/result/00-base.xml b/tests/flattener_dicos/10leadership_append/result/00-base.xml
index 2d519e4a..860d7d5c 100644
--- a/tests/flattener_dicos/10leadership_append/result/00-base.xml
+++ b/tests/flattener_dicos/10leadership_append/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10leadership_auto/result/00-base.xml b/tests/flattener_dicos/10leadership_auto/result/00-base.xml
index f1bee238..c042013c 100644
--- a/tests/flattener_dicos/10leadership_auto/result/00-base.xml
+++ b/tests/flattener_dicos/10leadership_auto/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10leadership_autoleader/result/00-base.xml b/tests/flattener_dicos/10leadership_autoleader/result/00-base.xml
index c4752b18..0701bc06 100644
--- a/tests/flattener_dicos/10leadership_autoleader/result/00-base.xml
+++ b/tests/flattener_dicos/10leadership_autoleader/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
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 6ca4885a..c6955873 100644
--- a/tests/flattener_dicos/10leadership_autoleader_expert/result/00-base.xml
+++ b/tests/flattener_dicos/10leadership_autoleader_expert/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
expert
diff --git a/tests/flattener_dicos/10leadership_autosaveexpert/result/00-base.xml b/tests/flattener_dicos/10leadership_autosaveexpert/result/00-base.xml
index 8d235df7..7e9ced48 100644
--- a/tests/flattener_dicos/10leadership_autosaveexpert/result/00-base.xml
+++ b/tests/flattener_dicos/10leadership_autosaveexpert/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10leadership_familyaccent/result/00-base.xml b/tests/flattener_dicos/10leadership_familyaccent/result/00-base.xml
index 73166207..2fb903bc 100644
--- a/tests/flattener_dicos/10leadership_familyaccent/result/00-base.xml
+++ b/tests/flattener_dicos/10leadership_familyaccent/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10leadership_leadermandatory/result/00-base.xml b/tests/flattener_dicos/10leadership_leadermandatory/result/00-base.xml
index b5a99075..e53d60ac 100644
--- a/tests/flattener_dicos/10leadership_leadermandatory/result/00-base.xml
+++ b/tests/flattener_dicos/10leadership_leadermandatory/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
basic
diff --git a/tests/flattener_dicos/10leadership_mandatory/result/00-base.xml b/tests/flattener_dicos/10leadership_mandatory/result/00-base.xml
index f5f20e6f..e4d185fc 100644
--- a/tests/flattener_dicos/10leadership_mandatory/result/00-base.xml
+++ b/tests/flattener_dicos/10leadership_mandatory/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10leadership_mandatoryfollower/result/00-base.xml b/tests/flattener_dicos/10leadership_mandatoryfollower/result/00-base.xml
index d04ebb09..d37f859e 100644
--- a/tests/flattener_dicos/10leadership_mandatoryfollower/result/00-base.xml
+++ b/tests/flattener_dicos/10leadership_mandatoryfollower/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10leadership_multi/result/00-base.xml b/tests/flattener_dicos/10leadership_multi/result/00-base.xml
index 99360f4d..314496cb 100644
--- a/tests/flattener_dicos/10leadership_multi/result/00-base.xml
+++ b/tests/flattener_dicos/10leadership_multi/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10load_disabled_if_in/result/00-base.xml b/tests/flattener_dicos/10load_disabled_if_in/result/00-base.xml
index 04e5f22e..8774f654 100644
--- a/tests/flattener_dicos/10load_disabled_if_in/result/00-base.xml
+++ b/tests/flattener_dicos/10load_disabled_if_in/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10load_disabled_if_in_none/result/00-base.xml b/tests/flattener_dicos/10load_disabled_if_in_none/result/00-base.xml
index bfc5daef..e9fc00dc 100644
--- a/tests/flattener_dicos/10load_disabled_if_in_none/result/00-base.xml
+++ b/tests/flattener_dicos/10load_disabled_if_in_none/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10load_disabled_if_inaccent/result/00-base.xml b/tests/flattener_dicos/10load_disabled_if_inaccent/result/00-base.xml
index 9c97fbff..c089ee67 100644
--- a/tests/flattener_dicos/10load_disabled_if_inaccent/result/00-base.xml
+++ b/tests/flattener_dicos/10load_disabled_if_inaccent/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10load_disabledifin_fallback/result/00-base.xml b/tests/flattener_dicos/10load_disabledifin_fallback/result/00-base.xml
index 02c80297..2b55d499 100644
--- a/tests/flattener_dicos/10load_disabledifin_fallback/result/00-base.xml
+++ b/tests/flattener_dicos/10load_disabledifin_fallback/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10load_disabledifin_whithouttype/result/00-base.xml b/tests/flattener_dicos/10load_disabledifin_whithouttype/result/00-base.xml
index 17bf29a3..330cda91 100644
--- a/tests/flattener_dicos/10load_disabledifin_whithouttype/result/00-base.xml
+++ b/tests/flattener_dicos/10load_disabledifin_whithouttype/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10load_emptyvalue/result/00-base.xml b/tests/flattener_dicos/10load_emptyvalue/result/00-base.xml
index 2c327b82..4cd3f823 100644
--- a/tests/flattener_dicos/10load_emptyvalue/result/00-base.xml
+++ b/tests/flattener_dicos/10load_emptyvalue/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10load_frozenifin/result/00-base.xml b/tests/flattener_dicos/10load_frozenifin/result/00-base.xml
index b4030dc1..f1d10196 100644
--- a/tests/flattener_dicos/10load_frozenifin/result/00-base.xml
+++ b/tests/flattener_dicos/10load_frozenifin/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10load_frozenifin_auto/result/00-base.xml b/tests/flattener_dicos/10load_frozenifin_auto/result/00-base.xml
index d3b33c68..fa35c438 100644
--- a/tests/flattener_dicos/10load_frozenifin_auto/result/00-base.xml
+++ b/tests/flattener_dicos/10load_frozenifin_auto/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10load_frozenifin_multiparam/result/00-base.xml b/tests/flattener_dicos/10load_frozenifin_multiparam/result/00-base.xml
index 7d43ce14..c2ab17dd 100644
--- a/tests/flattener_dicos/10load_frozenifin_multiparam/result/00-base.xml
+++ b/tests/flattener_dicos/10load_frozenifin_multiparam/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10load_frozenifin_noexist/result/00-base.xml b/tests/flattener_dicos/10load_frozenifin_noexist/result/00-base.xml
index 8d1d185a..86067c37 100644
--- a/tests/flattener_dicos/10load_frozenifin_noexist/result/00-base.xml
+++ b/tests/flattener_dicos/10load_frozenifin_noexist/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10load_leadership/result/00-base.xml b/tests/flattener_dicos/10load_leadership/result/00-base.xml
index 33cbdd10..0c3d2fe9 100644
--- a/tests/flattener_dicos/10load_leadership/result/00-base.xml
+++ b/tests/flattener_dicos/10load_leadership/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10load_leadership_default_multi/result/00-base.xml b/tests/flattener_dicos/10load_leadership_default_multi/result/00-base.xml
index b6f8d146..71d71383 100644
--- a/tests/flattener_dicos/10load_leadership_default_multi/result/00-base.xml
+++ b/tests/flattener_dicos/10load_leadership_default_multi/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10load_leadership_default_submulti/result/00-base.xml b/tests/flattener_dicos/10load_leadership_default_submulti/result/00-base.xml
index 4b6e403c..a8cdde56 100644
--- a/tests/flattener_dicos/10load_leadership_default_submulti/result/00-base.xml
+++ b/tests/flattener_dicos/10load_leadership_default_submulti/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10load_leadership_defaultmulti_leader/result/00-base.xml b/tests/flattener_dicos/10load_leadership_defaultmulti_leader/result/00-base.xml
index 7d38f6ab..fd2d428d 100644
--- a/tests/flattener_dicos/10load_leadership_defaultmulti_leader/result/00-base.xml
+++ b/tests/flattener_dicos/10load_leadership_defaultmulti_leader/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
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 1a137963..c416667f 100644
--- a/tests/flattener_dicos/10load_leadership_description/result/00-base.xml
+++ b/tests/flattener_dicos/10load_leadership_description/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10load_leadership_normalize_family/result/00-base.xml b/tests/flattener_dicos/10load_leadership_normalize_family/result/00-base.xml
index 4b218f72..a1bb16b8 100644
--- a/tests/flattener_dicos/10load_leadership_normalize_family/result/00-base.xml
+++ b/tests/flattener_dicos/10load_leadership_normalize_family/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
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 b1a3d46b..b0b9dd9f 100644
--- a/tests/flattener_dicos/10load_leadership_submulti/result/00-base.xml
+++ b/tests/flattener_dicos/10load_leadership_submulti/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10load_mandatoryifin/result/00-base.xml b/tests/flattener_dicos/10load_mandatoryifin/result/00-base.xml
index 1530f04f..461a3692 100644
--- a/tests/flattener_dicos/10load_mandatoryifin/result/00-base.xml
+++ b/tests/flattener_dicos/10load_mandatoryifin/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10load_multivalue/result/00-base.xml b/tests/flattener_dicos/10load_multivalue/result/00-base.xml
index 5ffd0ba9..809e4016 100644
--- a/tests/flattener_dicos/10load_multivalue/result/00-base.xml
+++ b/tests/flattener_dicos/10load_multivalue/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10load_submulti_two_value/result/00-base.xml b/tests/flattener_dicos/10load_submulti_two_value/result/00-base.xml
index 0fb67117..21c23f0d 100644
--- a/tests/flattener_dicos/10load_submulti_two_value/result/00-base.xml
+++ b/tests/flattener_dicos/10load_submulti_two_value/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10valid_enum_accent/result/00-base.xml b/tests/flattener_dicos/10valid_enum_accent/result/00-base.xml
index 84004a44..97502511 100644
--- a/tests/flattener_dicos/10valid_enum_accent/result/00-base.xml
+++ b/tests/flattener_dicos/10valid_enum_accent/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
expert
diff --git a/tests/flattener_dicos/10valid_enum_base/result/00-base.xml b/tests/flattener_dicos/10valid_enum_base/result/00-base.xml
index 051f0a99..5ca0ffee 100644
--- a/tests/flattener_dicos/10valid_enum_base/result/00-base.xml
+++ b/tests/flattener_dicos/10valid_enum_base/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
expert
diff --git a/tests/flattener_dicos/10valid_enum_base_redefine/result/00-base.xml b/tests/flattener_dicos/10valid_enum_base_redefine/result/00-base.xml
index ac327a72..0060d6d2 100644
--- a/tests/flattener_dicos/10valid_enum_base_redefine/result/00-base.xml
+++ b/tests/flattener_dicos/10valid_enum_base_redefine/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
expert
diff --git a/tests/flattener_dicos/10valid_enum_checkval_true/result/00-base.xml b/tests/flattener_dicos/10valid_enum_checkval_true/result/00-base.xml
index b0b707f2..59953b0c 100644
--- a/tests/flattener_dicos/10valid_enum_checkval_true/result/00-base.xml
+++ b/tests/flattener_dicos/10valid_enum_checkval_true/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10valid_enum_eosfunc/result/00-base.xml b/tests/flattener_dicos/10valid_enum_eosfunc/result/00-base.xml
index 75f3caf6..23644283 100644
--- a/tests/flattener_dicos/10valid_enum_eosfunc/result/00-base.xml
+++ b/tests/flattener_dicos/10valid_enum_eosfunc/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10valid_enum_leader/result/00-base.xml b/tests/flattener_dicos/10valid_enum_leader/result/00-base.xml
index 1e6774ae..a6ba906d 100644
--- a/tests/flattener_dicos/10valid_enum_leader/result/00-base.xml
+++ b/tests/flattener_dicos/10valid_enum_leader/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10valid_enum_mandatory/result/00-base.xml b/tests/flattener_dicos/10valid_enum_mandatory/result/00-base.xml
index 3a222912..62985e16 100644
--- a/tests/flattener_dicos/10valid_enum_mandatory/result/00-base.xml
+++ b/tests/flattener_dicos/10valid_enum_mandatory/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
expert
diff --git a/tests/flattener_dicos/10valid_enum_multi/result/00-base.xml b/tests/flattener_dicos/10valid_enum_multi/result/00-base.xml
index a62a4a74..9be1903b 100644
--- a/tests/flattener_dicos/10valid_enum_multi/result/00-base.xml
+++ b/tests/flattener_dicos/10valid_enum_multi/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
normal
diff --git a/tests/flattener_dicos/10valid_enum_none/00-base.xml b/tests/flattener_dicos/10valid_enum_none/00-base.xml
new file mode 100644
index 00000000..fcff2f28
--- /dev/null
+++ b/tests/flattener_dicos/10valid_enum_none/00-base.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+ non
+
+
+
+
+ b
+
+
+
+
+
+
+
+ ['a','b','']
+
+
+
+
+ bla bla bla
+
+
+
+
diff --git a/tests/flattener_dicos/10valid_enum_none/makedict/base.json b/tests/flattener_dicos/10valid_enum_none/makedict/base.json
new file mode 100644
index 00000000..0a000772
--- /dev/null
+++ b/tests/flattener_dicos/10valid_enum_none/makedict/base.json
@@ -0,0 +1 @@
+{"rougail.general.mode_conteneur_actif": "non", "rougail.enumfam.enumvar": "b"}
diff --git a/tests/flattener_dicos/10valid_enum_none/result/00-base.xml b/tests/flattener_dicos/10valid_enum_none/result/00-base.xml
new file mode 100644
index 00000000..e5369c82
--- /dev/null
+++ b/tests/flattener_dicos/10valid_enum_none/result/00-base.xml
@@ -0,0 +1,27 @@
+
+
+
+
+ expert
+
+ oui
+ non
+ mandatory
+ expert
+ non
+
+
+
+ expert
+
+ a
+ b
+
+ mandatory
+ expert
+ b
+
+
+
+
+
diff --git a/tests/flattener_dicos/10valid_enum_number/result/00-base.xml b/tests/flattener_dicos/10valid_enum_number/result/00-base.xml
index 951e5114..fe2d16d9 100644
--- a/tests/flattener_dicos/10valid_enum_number/result/00-base.xml
+++ b/tests/flattener_dicos/10valid_enum_number/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
expert
diff --git a/tests/flattener_dicos/10valid_enum_numberdefault/result/00-base.xml b/tests/flattener_dicos/10valid_enum_numberdefault/result/00-base.xml
index 56aaf16e..66d9af12 100644
--- a/tests/flattener_dicos/10valid_enum_numberdefault/result/00-base.xml
+++ b/tests/flattener_dicos/10valid_enum_numberdefault/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
expert
diff --git a/tests/flattener_dicos/10valid_enum_python/result/00-base.xml b/tests/flattener_dicos/10valid_enum_python/result/00-base.xml
index c3cd706d..af473e92 100644
--- a/tests/flattener_dicos/10valid_enum_python/result/00-base.xml
+++ b/tests/flattener_dicos/10valid_enum_python/result/00-base.xml
@@ -1,6 +1,6 @@
-
+
expert
diff --git a/tests/flattener_dicos/10valid_enum_value/result/00-base.xml b/tests/flattener_dicos/10valid_enum_value/result/00-base.xml
index 8fc279e5..5eaec710 100644
--- a/tests/flattener_dicos/10valid_enum_value/result/00-base.xml
+++ b/tests/flattener_dicos/10valid_enum_value/result/00-base.xml
@@ -1,6 +1,6 @@
-
+