diff --git a/src/rougail/annotator/constrainte.py b/src/rougail/annotator/constrainte.py
index a65f6a45..5821b31c 100644
--- a/src/rougail/annotator/constrainte.py
+++ b/src/rougail/annotator/constrainte.py
@@ -396,7 +396,7 @@ class ConstrainteAnnotator:
# build choice
variable.choice = []
if isinstance(values, str):
- choice = self.objectspace.choice()
+ choice = self.objectspace.choice(variable.xmlfiles)
choice.type = 'calculation'
choice.name = values
variable.choice.append(choice)
diff --git a/src/rougail/tiramisureflector.py b/src/rougail/tiramisureflector.py
index 1da99e17..0e3519ab 100644
--- a/src/rougail/tiramisureflector.py
+++ b/src/rougail/tiramisureflector.py
@@ -480,10 +480,10 @@ class Family(Common):
if 'properties' in self.attrib:
self.attrib['properties'] = "'" + "', '".join(sorted(list(self.attrib['properties']))) + "'"
if hasattr(self.elt, 'property'):
- #self.attrib['properties'] = ''
for child in self.elt.property:
self.populate_properties(child)
if not self.attrib['properties']:
+ # remove empty property
del self.attrib['properties']
def get_object_name(self):
diff --git a/tests/dictionaries/10valid_enum_eosfunc/tiramisu/base.py b/tests/dictionaries/10valid_enum_eosfunc/tiramisu/base.py
deleted file mode 100644
index 0f8b1858..00000000
--- a/tests/dictionaries/10valid_enum_eosfunc/tiramisu/base.py
+++ /dev/null
@@ -1,11 +0,0 @@
-from importlib.machinery import SourceFileLoader
-func = SourceFileLoader('func', 'tests/dictionaries/../eosfunc/test.py').load_module()
-for key, value in dict(locals()).items():
- if key != ['SourceFileLoader', 'func']:
- setattr(func, key, value)
-try:
- from tiramisu3 import *
-except:
- from tiramisu import *
-from rougail.tiramisu import ConvertDynOptionDescription
-option_0 = OptionDescription(name='baseoption', doc='baseoption', children=[])
diff --git a/tests/dictionaries/10valid_enum_python/__init__.py b/tests/dictionaries/10valid_enum_python/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/tests/dictionaries/10valid_enum_python/tiramisu/__init__.py b/tests/dictionaries/10valid_enum_python/tiramisu/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/tests/dictionaries/10valid_enum_python/tiramisu/base.py b/tests/dictionaries/10valid_enum_python/tiramisu/base.py
deleted file mode 100644
index 0f8b1858..00000000
--- a/tests/dictionaries/10valid_enum_python/tiramisu/base.py
+++ /dev/null
@@ -1,11 +0,0 @@
-from importlib.machinery import SourceFileLoader
-func = SourceFileLoader('func', 'tests/dictionaries/../eosfunc/test.py').load_module()
-for key, value in dict(locals()).items():
- if key != ['SourceFileLoader', 'func']:
- setattr(func, key, value)
-try:
- from tiramisu3 import *
-except:
- from tiramisu import *
-from rougail.tiramisu import ConvertDynOptionDescription
-option_0 = OptionDescription(name='baseoption', doc='baseoption', children=[])
diff --git a/tests/dictionaries/11disabledifnotin_filelist_notexist_validenum/00-base.xml b/tests/dictionaries/11disabledifnotin_filelist_notexist_validenum/00-base.xml
new file mode 100644
index 00000000..27eb9ad0
--- /dev/null
+++ b/tests/dictionaries/11disabledifnotin_filelist_notexist_validenum/00-base.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ non
+
+
+ non
+
+
+ non
+
+
+
+
+
+
+ non
+ statique
+
+
+ statique
+ afilllist
+
+
+
diff --git a/tests/dictionaries/11disabledifnotin_filelist_notexist_validenum/makedict/base.json b/tests/dictionaries/11disabledifnotin_filelist_notexist_validenum/makedict/base.json
new file mode 100644
index 00000000..1a2b116f
--- /dev/null
+++ b/tests/dictionaries/11disabledifnotin_filelist_notexist_validenum/makedict/base.json
@@ -0,0 +1 @@
+{"rougail.general.condition": "non", "rougail.general.mode_conteneur_actif": "non", "rougail.general.mode_conteneur_actif2": "non", "services.test.files.file.group": "root", "services.test.files.file.mode": "0644", "services.test.files.file.name": "/tmp/file", "services.test.files.file.owner": "root", "services.test.files.file.source": "file", "services.test.files.file.templating": true}
diff --git a/tests/dictionaries/11disabledifnotin_filelist_notexist_validenum/tiramisu/base.py b/tests/dictionaries/11disabledifnotin_filelist_notexist_validenum/tiramisu/base.py
index 0f8b1858..bb308145 100644
--- a/tests/dictionaries/11disabledifnotin_filelist_notexist_validenum/tiramisu/base.py
+++ b/tests/dictionaries/11disabledifnotin_filelist_notexist_validenum/tiramisu/base.py
@@ -8,4 +8,21 @@ try:
except:
from tiramisu import *
from rougail.tiramisu import ConvertDynOptionDescription
-option_0 = OptionDescription(name='baseoption', doc='baseoption', children=[])
+option_3 = ChoiceOption(properties=frozenset({'mandatory', 'normal'}), name='condition', doc='No change', multi=False, default='non', values=('non', 'statique'))
+option_4 = ChoiceOption(properties=frozenset({'force_default_on_freeze', 'frozen', 'hidden', 'mandatory', 'normal'}), name='mode_conteneur_actif', doc='No change', multi=False, default='non', values=('oui', 'non'))
+option_5 = ChoiceOption(properties=frozenset({'force_default_on_freeze', 'frozen', 'hidden', 'mandatory', 'normal'}), name='mode_conteneur_actif2', doc='No change', multi=False, default='non', values=('oui', 'non'))
+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_10 = StrOption(name='group', doc='group', multi=False, default='root')
+option_11 = StrOption(name='mode', doc='mode', multi=False, default='0644')
+option_12 = StrOption(name='name', doc='name', multi=False, default='/tmp/file')
+option_13 = StrOption(name='owner', doc='owner', multi=False, default='root')
+option_14 = StrOption(name='source', doc='source', multi=False, default='file')
+option_15 = BoolOption(name='templating', doc='templating', multi=False, default=True)
+option_16 = BoolOption(properties=frozenset({Calculation(calc_value, Params(ParamValue('disabled'), kwargs={'condition': ParamOption(option_3, todict=True), 'expected': ParamValue('statique'), 'reverse_condition': ParamValue(True)}))}), name='activate', doc='activate', multi=False, default=True)
+option_9 = OptionDescription(name='file', doc='file', children=[option_10, option_11, option_12, option_13, option_14, option_15, option_16])
+option_8 = OptionDescription(name='files', doc='files', children=[option_9])
+option_7 = OptionDescription(name='test', doc='test', children=[option_8])
+option_7.impl_set_information("manage", True)
+option_6 = OptionDescription(name='services', doc='services', properties=frozenset({'hidden'}), children=[option_7])
+option_0 = OptionDescription(name='baseoption', doc='baseoption', children=[option_1, option_6])
diff --git a/tests/dictionaries/11valid_enum_variable/00-base.xml b/tests/dictionaries/11valid_enum_variable/00-base.xml
new file mode 100644
index 00000000..0a63345c
--- /dev/null
+++ b/tests/dictionaries/11valid_enum_variable/00-base.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+ a
+
+
+ a
+ b
+ c
+
+
+
+
+
+ var
+
+
+
+
diff --git a/tests/dictionaries/10valid_enum_eosfunc/__init__.py b/tests/dictionaries/11valid_enum_variable/__init__.py
similarity index 100%
rename from tests/dictionaries/10valid_enum_eosfunc/__init__.py
rename to tests/dictionaries/11valid_enum_variable/__init__.py
diff --git a/tests/dictionaries/11valid_enum_variable/makedict/base.json b/tests/dictionaries/11valid_enum_variable/makedict/base.json
new file mode 100644
index 00000000..2c5c721d
--- /dev/null
+++ b/tests/dictionaries/11valid_enum_variable/makedict/base.json
@@ -0,0 +1 @@
+{"rougail.general.mode_conteneur_actif": "a", "rougail.general.var": ["a", "b", "c"]}
diff --git a/tests/dictionaries/10valid_enum_eosfunc/tiramisu/__init__.py b/tests/dictionaries/11valid_enum_variable/tiramisu/__init__.py
similarity index 100%
rename from tests/dictionaries/10valid_enum_eosfunc/tiramisu/__init__.py
rename to tests/dictionaries/11valid_enum_variable/tiramisu/__init__.py
diff --git a/tests/dictionaries/11valid_enum_variable/tiramisu/base.py b/tests/dictionaries/11valid_enum_variable/tiramisu/base.py
new file mode 100644
index 00000000..2d839033
--- /dev/null
+++ b/tests/dictionaries/11valid_enum_variable/tiramisu/base.py
@@ -0,0 +1,15 @@
+from importlib.machinery import SourceFileLoader
+func = SourceFileLoader('func', 'tests/dictionaries/../eosfunc/test.py').load_module()
+for key, value in dict(locals()).items():
+ if key != ['SourceFileLoader', 'func']:
+ setattr(func, key, value)
+try:
+ from tiramisu3 import *
+except:
+ from tiramisu import *
+from rougail.tiramisu import ConvertDynOptionDescription
+option_4 = StrOption(properties=frozenset({'mandatory', 'normal'}), name='var', doc='New variable', multi=True, default=['a', 'b', 'c'], default_multi='c')
+option_3 = ChoiceOption(properties=frozenset({'mandatory', 'normal'}), name='mode_conteneur_actif', doc='No change', multi=False, default='a', values=Calculation(func.calc_value, Params((ParamOption(option_4)))))
+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/dictionaries/20family_dynamic_calc/00-base.xml b/tests/dictionaries/20family_dynamic_calc/00-base.xml
new file mode 100644
index 00000000..7fa2ca78
--- /dev/null
+++ b/tests/dictionaries/20family_dynamic_calc/00-base.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+ val1
+ val2
+
+
+
+
+ val
+
+
+
+
+
+
+
+
+ vardynval1
+
+
+
diff --git a/tests/dictionaries/20family_dynamic_calc/makedict/base.json b/tests/dictionaries/20family_dynamic_calc/makedict/base.json
new file mode 100644
index 00000000..c26e3740
--- /dev/null
+++ b/tests/dictionaries/20family_dynamic_calc/makedict/base.json
@@ -0,0 +1 @@
+{"rougail.general.varname": ["val1", "val2"], "rougail.dynval1.vardynval1": "val", "rougail.dynval2.vardynval2": "val", "rougail.new.newvar": "val"}
diff --git a/tests/dictionaries/20family_dynamic_calc/tiramisu/base.py b/tests/dictionaries/20family_dynamic_calc/tiramisu/base.py
index 0f8b1858..97a2c397 100644
--- a/tests/dictionaries/20family_dynamic_calc/tiramisu/base.py
+++ b/tests/dictionaries/20family_dynamic_calc/tiramisu/base.py
@@ -8,4 +8,11 @@ try:
except:
from tiramisu import *
from rougail.tiramisu import ConvertDynOptionDescription
-option_0 = OptionDescription(name='baseoption', doc='baseoption', children=[])
+option_3 = StrOption(properties=frozenset({'mandatory', 'normal'}), name='varname', doc='No change', multi=True, default=['val1', 'val2'], default_multi='val2')
+option_2 = OptionDescription(name='general', doc='general', properties=frozenset({'normal'}), children=[option_3])
+option_5 = StrOption(properties=frozenset({'mandatory', 'normal'}), name='vardyn', doc='No change', multi=False, default='val')
+option_4 = ConvertDynOptionDescription(name='dyn', doc='dyn', suffixes=Calculation(func.calc_value, Params((ParamOption(option_3)))), properties=frozenset({'normal'}), children=[option_5])
+option_7 = StrOption(properties=frozenset({'normal'}), name='newvar', doc='No change', multi=False, default=Calculation(func.calc_val, Params((ParamDynOption(option_5, 'val1', option_4, notraisepropertyerror=False, todict=False)), kwargs={})))
+option_6 = OptionDescription(name='new', doc='new', properties=frozenset({'normal'}), children=[option_7])
+option_1 = OptionDescription(name='rougail', doc='rougail', children=[option_2, option_4, option_6])
+option_0 = OptionDescription(name='baseoption', doc='baseoption', children=[option_1])
diff --git a/tests/dictionaries/30mandatory_withoutvaluecalc/00-base.xml b/tests/dictionaries/30mandatory_withoutvaluecalc/00-base.xml
new file mode 100644
index 00000000..aec57606
--- /dev/null
+++ b/tests/dictionaries/30mandatory_withoutvaluecalc/00-base.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+ value
+
+
+
+
diff --git a/tests/dictionaries/30mandatory_withoutvaluecalc/makedict/base.json b/tests/dictionaries/30mandatory_withoutvaluecalc/makedict/base.json
new file mode 100644
index 00000000..5f62f349
--- /dev/null
+++ b/tests/dictionaries/30mandatory_withoutvaluecalc/makedict/base.json
@@ -0,0 +1 @@
+{"rougail.general.mode_conteneur_actif": "value"}
diff --git a/tests/dictionaries/30mandatory_withoutvaluecalc/tiramisu/base.py b/tests/dictionaries/30mandatory_withoutvaluecalc/tiramisu/base.py
index 0f8b1858..79ef128f 100644
--- a/tests/dictionaries/30mandatory_withoutvaluecalc/tiramisu/base.py
+++ b/tests/dictionaries/30mandatory_withoutvaluecalc/tiramisu/base.py
@@ -8,4 +8,7 @@ try:
except:
from tiramisu import *
from rougail.tiramisu import ConvertDynOptionDescription
-option_0 = OptionDescription(name='baseoption', doc='baseoption', children=[])
+option_3 = StrOption(properties=frozenset({'force_default_on_freeze', 'frozen', 'hidden', 'normal'}), name='mode_conteneur_actif', doc='No change', multi=False, default=Calculation(func.calc_val, Params((ParamValue("value")), kwargs={})))
+option_2 = OptionDescription(name='general', doc='general', properties=frozenset({'normal'}), children=[option_3])
+option_1 = OptionDescription(name='rougail', doc='rougail', children=[option_2])
+option_0 = OptionDescription(name='baseoption', doc='baseoption', children=[option_1])
diff --git a/tests/dictionaries/30mandatory_withvaluecalc/00-base.xml b/tests/dictionaries/30mandatory_withvaluecalc/00-base.xml
new file mode 100644
index 00000000..93ae7b1f
--- /dev/null
+++ b/tests/dictionaries/30mandatory_withvaluecalc/00-base.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+ value
+
+
+
diff --git a/tests/dictionaries/30mandatory_withvaluecalc/makedict/base.json b/tests/dictionaries/30mandatory_withvaluecalc/makedict/base.json
index 0967ef42..5f62f349 100644
--- a/tests/dictionaries/30mandatory_withvaluecalc/makedict/base.json
+++ b/tests/dictionaries/30mandatory_withvaluecalc/makedict/base.json
@@ -1 +1 @@
-{}
+{"rougail.general.mode_conteneur_actif": "value"}
diff --git a/tests/dictionaries/30mandatory_withvaluecalc/tiramisu/base.py b/tests/dictionaries/30mandatory_withvaluecalc/tiramisu/base.py
index 0f8b1858..6d9d1435 100644
--- a/tests/dictionaries/30mandatory_withvaluecalc/tiramisu/base.py
+++ b/tests/dictionaries/30mandatory_withvaluecalc/tiramisu/base.py
@@ -8,4 +8,7 @@ try:
except:
from tiramisu import *
from rougail.tiramisu import ConvertDynOptionDescription
-option_0 = OptionDescription(name='baseoption', doc='baseoption', children=[])
+option_3 = StrOption(properties=frozenset({'normal'}), name='mode_conteneur_actif', doc='No change', multi=False, default=Calculation(func.calc_val, Params((ParamValue("value")), kwargs={})))
+option_2 = OptionDescription(name='general', doc='general', properties=frozenset({'normal'}), children=[option_3])
+option_1 = OptionDescription(name='rougail', doc='rougail', children=[option_2])
+option_0 = OptionDescription(name='baseoption', doc='baseoption', children=[option_1])
diff --git a/tests/dictionaries/40ifin_validenum/00-base.xml b/tests/dictionaries/40ifin_validenum/00-base.xml
new file mode 100644
index 00000000..478637d5
--- /dev/null
+++ b/tests/dictionaries/40ifin_validenum/00-base.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+ non
+
+
+
+
+ non
+
+
+
+
+
+
+ a
+ b
+ c
+
+
+ d
+ mode_conteneur_actif
+
+
+ d
+ mode_conteneur_actif2
+
+
+
+
diff --git a/tests/dictionaries/40ifin_validenum/makedict/base.json b/tests/dictionaries/40ifin_validenum/makedict/base.json
new file mode 100644
index 00000000..6b1c9cf7
--- /dev/null
+++ b/tests/dictionaries/40ifin_validenum/makedict/base.json
@@ -0,0 +1 @@
+{"rougail.general.mode_conteneur_actif": "non", "rougail.general2.mode_conteneur_actif3": "a"}
diff --git a/tests/dictionaries/40ifin_validenum/tiramisu/base.py b/tests/dictionaries/40ifin_validenum/tiramisu/base.py
index 0f8b1858..dac6ba60 100644
--- a/tests/dictionaries/40ifin_validenum/tiramisu/base.py
+++ b/tests/dictionaries/40ifin_validenum/tiramisu/base.py
@@ -8,4 +8,10 @@ try:
except:
from tiramisu import *
from rougail.tiramisu import ConvertDynOptionDescription
-option_0 = OptionDescription(name='baseoption', doc='baseoption', children=[])
+option_3 = ChoiceOption(properties=frozenset({'mandatory', 'normal'}), name='mode_conteneur_actif', doc='No change', multi=False, default='non', values=('oui', 'non'))
+option_2 = OptionDescription(name='general', doc='general', properties=frozenset({'normal'}), children=[option_3])
+option_5 = ChoiceOption(properties=frozenset({'disabled', 'mandatory', 'normal'}), name='mode_conteneur_actif2', doc='No change', multi=False, default='non', values=('oui', 'non'))
+option_6 = ChoiceOption(properties=frozenset({'mandatory', 'normal'}), name='mode_conteneur_actif3', doc='No change', multi=False, default='a', values=('a', 'b', 'c'))
+option_4 = OptionDescription(name='general2', doc='general2', properties=frozenset({'hidden', 'normal'}), children=[option_5, option_6])
+option_1 = OptionDescription(name='rougail', doc='rougail', children=[option_2, option_4])
+option_0 = OptionDescription(name='baseoption', doc='baseoption', children=[option_1])
diff --git a/tests/dictionaries/51redefine_validenum/00-base.xml b/tests/dictionaries/51redefine_validenum/00-base.xml
new file mode 100644
index 00000000..a2ae1b83
--- /dev/null
+++ b/tests/dictionaries/51redefine_validenum/00-base.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+ a
+ b
+ c
+
+
+
+
diff --git a/tests/dictionaries/51redefine_validenum/01-redefine.xml b/tests/dictionaries/51redefine_validenum/01-redefine.xml
new file mode 100644
index 00000000..faf00307
--- /dev/null
+++ b/tests/dictionaries/51redefine_validenum/01-redefine.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+ a
+ b
+
+
+
+
diff --git a/tests/dictionaries/51redefine_validenum/makedict/base.json b/tests/dictionaries/51redefine_validenum/makedict/base.json
new file mode 100644
index 00000000..ef30ef31
--- /dev/null
+++ b/tests/dictionaries/51redefine_validenum/makedict/base.json
@@ -0,0 +1 @@
+{"rougail.general.mode_conteneur_actif": "a"}
diff --git a/tests/dictionaries/51redefine_validenum/tiramisu/base.py b/tests/dictionaries/51redefine_validenum/tiramisu/base.py
index 0f8b1858..4956fadb 100644
--- a/tests/dictionaries/51redefine_validenum/tiramisu/base.py
+++ b/tests/dictionaries/51redefine_validenum/tiramisu/base.py
@@ -8,4 +8,7 @@ try:
except:
from tiramisu import *
from rougail.tiramisu import ConvertDynOptionDescription
-option_0 = OptionDescription(name='baseoption', doc='baseoption', children=[])
+option_3 = ChoiceOption(properties=frozenset({'force_default_on_freeze', 'frozen', 'hidden', 'mandatory', 'normal'}), name='mode_conteneur_actif', doc='Redefine description', multi=False, default='a', values=('a', 'b'))
+option_2 = OptionDescription(name='general', doc='general', properties=frozenset({'normal'}), children=[option_3])
+option_1 = OptionDescription(name='rougail', doc='rougail', children=[option_2])
+option_0 = OptionDescription(name='baseoption', doc='baseoption', children=[option_1])
diff --git a/tests/test_1_flattener.py b/tests/test_1_flattener.py
index 5e112c69..8cf309c4 100644
--- a/tests/test_1_flattener.py
+++ b/tests/test_1_flattener.py
@@ -5,7 +5,7 @@ from pytest import fixture, raises
from os import listdir
from json import load
-from rougail import Rougail, annotator
+from rougail import Rougail
from rougail.error import DictConsistencyError
from rougail.config import Config
@@ -28,9 +28,10 @@ excludes = set([])
#excludes = set(['01base_file_utfchar'])
test_ok -= excludes
test_raise -= excludes
-#test_ok = ['40condition_base_add']
+#test_ok = ['10valid_enum_eosfunc']
#test_ok = []
#test_raise = ['80redefine_double_error']
+#test_raise = []
ORI_DIR = getcwd()
@@ -70,6 +71,8 @@ def launch_flattener(test_dir, test_ok=False):
Config['patch_dir'] = join(test_dir, 'patches')
eolobj.space_visitor(eosfunc)
tiramisu_objects = eolobj.save()
+ if 'children=[]' in tiramisu_objects.split('\n')[-2]:
+ raise Exception('empty tiramisu object?')
tiramisu_dir = join(test_dir, 'tiramisu')
if isdir(tiramisu_dir):
tiramisu_file = join(tiramisu_dir, 'base.py')
diff --git a/tests/test_2_makedict.py b/tests/test_2_makedict.py
index 05b48895..90e29de9 100644
--- a/tests/test_2_makedict.py
+++ b/tests/test_2_makedict.py
@@ -50,7 +50,7 @@ async def launch_flattener(test_dir):
if config_dict:
if not isdir(makedict_dir):
mkdir(makedict_dir)
- if debug:
+ if not isfile(makedict_file) or debug:
with open(makedict_file, 'w') as fh:
dump(config_dict, fh)
fh.write('\n')