diff --git a/doc/README.md b/doc/README.md
index b96b0edc2..ff8a82f45 100644
--- a/doc/README.md
+++ b/doc/README.md
@@ -9,17 +9,8 @@ Rougail est un bibliothèque python3 qui permet de charger des dictionnaires (fi
## Les dictionnaires
-Un dictionnaire est un fichier XML donc la structure est expliqué ci-dessous.
-
-Un dictionnaire contient en ensemble de variable, utilisable à tout moment, notamment dans des templates.
-
-Il est possible d'avoir plusieurs espace de nom pour classer les variables (appeler aussi "extra") mais il est aussi possible, à l'interieur de ce espace de nom de mettre des familles pour classer les variables.
-
-Les familles et les variables peuvent être défini dans plusieurs dictionnaires. Ces dictionnaires s'aggrège alors. Il est possible de rajouter des familles des variables, des services, des éléments à un service et des contraintes.
-
-Il est également possible de redéfinir des éléments pour changer les comportement d'une variable ou d'un service.
-
-FIXME expliquer les noms des variables dans les extras
+ - [Les dictionnaires](dictionary/rougail.md)
+ - [Les dictionnaires extra](dictionary/extra.md)
### Les variables
@@ -43,7 +34,3 @@ FIXME expliquer les noms des variables dans les extras
## Les templates
- Type creole
-
-
-FIXME :
-- une variable avec nom unique sauf pour extra
diff --git a/doc/check/function.md b/doc/check/function.md
index f293f633e..016164c2b 100644
--- a/doc/check/function.md
+++ b/doc/check/function.md
@@ -38,6 +38,8 @@ Une fonction de vérification doit prendre en compte 2 aspects important :
À partir de maintenant seule None et des valeurs en minuscule seront autorisés.
+Il est possible de définir des [paramètres](../param/README.md) à cette fonction.
+
## Vérification des valeurs avec avertissement
Dans la contrainte, il est possible de spécifier le niveau d'erreur et le mettre en avertissement :
@@ -49,5 +51,3 @@ Dans la contrainte, il est possible de spécifier le niveau d'erreur et le mettr
```
Dans ce cas une valeur avec une majuscule sera accepté, mais un message d'avertissement apparaitra.
-
-Il est possible de définir des [paramètres](../param/README.md) à cette fonction.
diff --git a/doc/condition/condition.md b/doc/condition/condition.md
index 45e977f77..f667072eb 100644
--- a/doc/condition/condition.md
+++ b/doc/condition/condition.md
@@ -1,5 +1,7 @@
# Les conditions
+## Un condition
+
Les conditions permettent d'ajouter ou de supprimer des propriétés à une [variable](../variable/README.md), une [famille](../family/README.md), un [fichier](../service/file.md), un [port](../service/port.md) ou une [ip](../service/ip.md) suivant le contexte.
Nous allons nous concentrer ici sur la condition hidden_if_in, mais [il existe d'autre conditions](conditions.md).
@@ -26,6 +28,8 @@ La [cible](../target/README.md) de la condition est ici "my_variable".
Donc ici la variable est caché à l'utilisateur si la variable "condition" est à True (le paramètre).
+## Un condition avec plusieurs paramètres
+
Il est également possible de mettre plusieurs paramètre :
```
@@ -43,8 +47,30 @@ Il est également possible de mettre plusieurs paramètre :
```
-FIXME
-
-
-
-
+## Une condition optionnelle
+
+Il est possible de définir une condition avec une variable source qui n'existe pas dans toutes les contextes.
+
+Dans ce cas, on met la condition en "optionnelle".
+
+Si la variable source existe, la condition s'applique.
+
+Si la variable source n'existe pas :
+
+- si le nom fini en _if_in (par exemple hidden_if_in), l'action est forcée sans condition (les cibles sont hidden)
+- si le nom fini en _if_not_in (par exemple hidden_if_not_in), la condition est totalement ignorée
+
+Ces deux comportements peuvent être changé à tout moment avec l'attribut "apply_on_fallback". Dans ce cas :
+
+- si la valeur de "apply_on_fallback" est "True", l'action est forcée sans condition
+- si la valeur de "apply_on_fallback" est "False", la condition est totalement ignorée
+
+Exemple :
+
+```
+
+ yes
+ maybe
+ my_variable
+
+```
diff --git a/doc/dictionary/extra.md b/doc/dictionary/extra.md
new file mode 100644
index 000000000..4fea90c97
--- /dev/null
+++ b/doc/dictionary/extra.md
@@ -0,0 +1,12 @@
+# Les dictionnaires extra
+
+Un extra est un espace de nom différent. L'idée et de pouvoir classer les variables par thématique.
+
+Les espaces de nom extra doivent être déclaré au moment [de la configuration de Rougail](../dev/config.md).
+
+Dans cet espace de nom :
+
+- des variables et des familles peuvent avoir le même nom dans différentes familles
+- la valeur d'un cible, source, leader ou follower des contraintes doivent être avec un chemin complet
+- on ne peut pas déclarer des services dans cet espace de nom
+- dans un template il faut utiliser des chemins complet (%%my_extra.my_family.my_variable ou %%my_extra.my_family.leader.follower pour une variable suiveuse)
diff --git a/doc/dictionary/rougail.md b/doc/dictionary/rougail.md
new file mode 100644
index 000000000..1fa0c4f4a
--- /dev/null
+++ b/doc/dictionary/rougail.md
@@ -0,0 +1,22 @@
+# Les dictionnaires
+
+## Un dictionnaire ?
+
+Un dictionnaire est un fichier XML donc la structure est décrite dans cette documentation.
+
+Un dictionnaire contient en ensemble de variable chargé dans Tiramisu, utilisable à tout moment, notamment dans des templates.
+
+Les familles, les variables et les contraintes peuvent être défini dans plusieurs dictionnaires. Ces dictionnaires s'aggrège alors.
+
+Il est également possible de redéfinir des éléments pour changer les comportement d'une variable ou d'un service.
+
+## L'espace de nom par défaut
+
+L'espace de nom par défaut s'appelle "rougail" ([ce nom est personnalisable](../dev/config.md)).
+
+Cet espace de nom est un peu particulier :
+
+- le nom des variables et des familles doivent être unique pour l'ensemble de cet espace (même si ces variables ou familles sont dans des familles différentes)
+- la valeur d'un cible, source, leader ou follower des contraintes peuvent être avec nom de la variable ou de la famille ou leurs chemins complet
+- on peut déclarer des services dans cet espace de nom
+- dans un template on peut utiliser cette variable sans le chemin complet (%%my_variable) ou avec (%%rougail.my_family.my_variable)
diff --git a/doc/service/file.md b/doc/service/file.md
index 7ee4072e5..5c3f8a1c0 100644
--- a/doc/service/file.md
+++ b/doc/service/file.md
@@ -112,9 +112,7 @@ Il est possible de définir une [condition](../condition/README.md) de type "dis
-
-
-
+
diff --git a/doc/service/ip.md b/doc/service/ip.md
index e78cd14bc..e81e26862 100644
--- a/doc/service/ip.md
+++ b/doc/service/ip.md
@@ -1,15 +1,72 @@
# La gestion d'une IP
-## La balise ip
+## La balise IP
La gestion des IP se fait dans un conteneur de [service](service.md).
-FIXME
+La déclaration de l'attribut permet d'associer une IP autorisé à accéder au service.
-
-
-
-
-
-
-
+Il est nécessaire, au minimum, de spécifier son adresse IP et l'interface :
+
+```
+192.168.0.1
+```
+
+L'IP peut être un variable :
+
+```
+variable_ip
+```
+
+## La gestion d'un réseau
+
+L'adresse IP peut être un réseau :
+
+```
+192.168.0.0
+```
+
+Le masque de réseau peut être un variable :
+
+```
+variable_ip
+```
+
+## L'interface
+
+Il est possible de spécifier le nom de l'interface si on la connait :
+
+```
+192.168.0.1
+```
+
+Mais il est possible de calculer automatiquement cette valeur :
+
+```
+192.168.0.1
+```
+
+Dans ce cas l'interface est déduite à partir de la table de routage.
+
+## Désactiver la génération d'une IP
+
+Il est possible de définir une [condition](../condition/README.md) de type "disabled_if_in" ou "disabled_if_not_in" sur une balise IP :
+
+```
+
+
+ 192.168.0.1
+
+
+
+
+
+
+
+ False
+ test_ip
+
+
+```
+
+Dans ce cas, tous les IP avec un attribut iplist à "test_ip" seront désactivé si la variable "condition" est False.
diff --git a/doc/target/README.md b/doc/target/README.md
index 978b61eb6..bd9b6a9f7 100644
--- a/doc/target/README.md
+++ b/doc/target/README.md
@@ -1,5 +1,5 @@
# La cible
- - [De type variable)](../target/variable.md)
- - [De type famille)](../target/family.md)
+ - [De type variable](../target/variable.md)
+ - [De type famille](../target/family.md)
- [De type \*list](../target/list.md)
diff --git a/doc/variable/leadership.md b/doc/variable/leadership.md
index f8a98c2bb..90033c679 100644
--- a/doc/variable/leadership.md
+++ b/doc/variable/leadership.md
@@ -58,6 +58,30 @@ Il est possible d'en définit d'autres :
```
+## Définition des variables meneuse et suiveuse dans un dictionnaire extra
+
+Voici un exemple de définition d'une variable meneuse et de deux variables meneuses dans un espace de nom "example" :
+
+```
+
+
+
+
+
+
+
+
+
+ example.family.follower1
+ example.family.follower2
+
+
+```
+
+Le chemin de la variable meneuse est traditionnel, par contre le chemin des variables suiveuses n'est pas le chemin définitif de la variable.
+
+Le chemin d'une variable suiveuse est normalement "example.family.leader.follower1" mais la variable n'est pas encore une variable suiveuse à ce moment là du traitement. C'est pour cela qu'il ne faut, uniquement dans les groupes, mettre le nom de la variable meneuse dans le chemin.
+
## Ajout d'une nouvelle variable suiveuse
Pour ajouter, dans un nouveau dictionnaire, une variable suiveuse à notre groupe, rien de plus simple, il suffit de redéfinir un groupe avec cette (ou ces) nouvelle variable :
diff --git a/doc/variable/simple.md b/doc/variable/simple.md
index d74eaf151..c539e422b 100644
--- a/doc/variable/simple.md
+++ b/doc/variable/simple.md
@@ -219,4 +219,20 @@ Ces variables sont généralement des variables obligatoires. En effet ces varia
Une [variable meneuse ou suiveuse](leadership.md) ne peut pas avoir la propriété auto_freeze.
-FIXME
+## Information "test"
+
+L'attribut "test" est un attribut spécial qui permet aux concepteurs d'un dictionnaire d'influancer le robot de test en précisant de valeurs utile à tester.
+
+Concrêtement, le contenu de cet attribut est enregister dans une "information" de l'option Tiramisu correspondante.
+
+Exemple :
+
+```
+
+```
+
+Il est possible de préciser plusieurs valeurs avec le séparateur "|" :
+
+```
+
+```
diff --git a/src/rougail/annotator/condition.py b/src/rougail/annotator/condition.py
index 382cf0bc2..c3f48826c 100644
--- a/src/rougail/annotator/condition.py
+++ b/src/rougail/annotator/condition.py
@@ -52,7 +52,7 @@ class ConditionAnnotator(TargetAnnotator, ParamAnnotator, Walk):
self.target_is_uniq = False
self.only_variable = False
self.convert_target(self.objectspace.space.constraints.condition)
- self.check_condition_fallback()
+ self.check_condition_optional()
self.convert_condition_source()
self.convert_param(self.objectspace.space.constraints.condition)
self.check_source_target()
@@ -106,19 +106,18 @@ class ConditionAnnotator(TargetAnnotator, ParamAnnotator, Walk):
f'{condition.source.path}')
raise DictConsistencyError(msg, 11, condition.xmlfiles)
- def check_condition_fallback(self):
- """a condition with a fallback **and** the source variable doesn't exist
+ def check_condition_optional(self):
+ """a condition with a optional **and** the source variable doesn't exist
"""
remove_conditions = []
for idx, condition in enumerate(self.objectspace.space.constraints.condition):
- # fallback
- if condition.fallback is False or \
+ if condition.optional is False or \
self.objectspace.paths.path_is_defined(condition.source):
continue
- if condition.name in ['disabled_if_in', 'mandatory_if_in', 'hidden_if_in']:
- apply_action = not condition.force_condition_on_fallback
+ if hasattr(condition, 'apply_on_fallback'):
+ apply_action = condition.apply_on_fallback
else:
- apply_action = condition.force_inverse_condition_on_fallback
+ apply_on_fallback = condition.name.endswith('_if_in'):
remove_conditions.append(idx)
if apply_action:
self.force_actions_to_variable(condition)
diff --git a/src/rougail/annotator/service.py b/src/rougail/annotator/service.py
index 267fb9c41..4cf20e99a 100644
--- a/src/rougail/annotator/service.py
+++ b/src/rougail/annotator/service.py
@@ -32,7 +32,7 @@ from ..utils import normalize_family
from ..error import DictConsistencyError
# a CreoleObjSpace's attribute has some annotations
# that shall not be present in the exported (flatened) XML
-ERASED_ATTRIBUTES = ('redefine', 'exists', 'fallback', 'optional', 'remove_check', 'namespace',
+ERASED_ATTRIBUTES = ('redefine', 'exists', 'optional', 'remove_check', 'namespace',
'remove_condition', 'path', 'instance_mode', 'index',
'level', 'remove_fill', 'xmlfiles', 'type', 'reflector_name',
'reflector_object',)
diff --git a/src/rougail/annotator/variable.py b/src/rougail/annotator/variable.py
index b56edb7cb..a6b07c675 100644
--- a/src/rougail/annotator/variable.py
+++ b/src/rougail/annotator/variable.py
@@ -197,15 +197,11 @@ class VariableAnnotator(Walk): # pylint: disable=R0903
"""Convert variable tests value
"""
for variable in self.get_variables():
- self._convert_test(variable)
-
- def _convert_test(self,
- variable,
- ) -> None:
- if not hasattr(variable, 'information'):
- variable.information = self.objectspace.information(variable.xmlfiles)
- if hasattr(variable, 'test'):
+ if not hasattr(variable, 'test'):
+ continue
if variable.test:
+ if not hasattr(variable, 'information'):
+ variable.information = self.objectspace.information(variable.xmlfiles)
values = variable.test.split('|')
new_values = []
for value in values:
@@ -221,6 +217,8 @@ class VariableAnnotator(Walk): # pylint: disable=R0903
"""Convert variable help
"""
for variable in self.get_variables():
+ if not hasattr(variable, 'information'):
+ variable.information = self.objectspace.information(variable.xmlfiles)
self._convert_help(variable)
@staticmethod
diff --git a/src/rougail/data/rougail.dtd b/src/rougail/data/rougail.dtd
index 787d3b3c9..08aceeb9b 100644
--- a/src/rougail/data/rougail.dtd
+++ b/src/rougail/data/rougail.dtd
@@ -121,9 +121,8 @@
-
-
-
+
+
diff --git a/tests/dictionaries/10load_disabled_if_not_in_fallback/00-base.xml b/tests/dictionaries/10load_disabled_if_not_in_fallback/00-base.xml
index 86bba15b3..9ce69f575 100644
--- a/tests/dictionaries/10load_disabled_if_not_in_fallback/00-base.xml
+++ b/tests/dictionaries/10load_disabled_if_not_in_fallback/00-base.xml
@@ -16,7 +16,7 @@
-
+
no
disable_variable
afilllist
diff --git a/tests/dictionaries/10load_disabled_if_not_in_fallback_force/00-base.xml b/tests/dictionaries/10load_disabled_if_not_in_fallback_force/00-base.xml
index 19e5a39bb..749d64d3c 100644
--- a/tests/dictionaries/10load_disabled_if_not_in_fallback_force/00-base.xml
+++ b/tests/dictionaries/10load_disabled_if_not_in_fallback_force/00-base.xml
@@ -15,13 +15,13 @@
-
+
oui
mode_conteneur_actif
mode_conteneur_actif2
afilllist
-
+
non
mode_conteneur_actif
diff --git a/tests/dictionaries/10load_disabledifin_fallback/00-base.xml b/tests/dictionaries/10load_disabledifin_fallback/00-base.xml
index c00f0ca05..592ba86ed 100644
--- a/tests/dictionaries/10load_disabledifin_fallback/00-base.xml
+++ b/tests/dictionaries/10load_disabledifin_fallback/00-base.xml
@@ -20,7 +20,7 @@
mode_conteneur_actif
mode_conteneur_actif2
-
+
non
mode_conteneur_actif
diff --git a/tests/dictionaries/10load_disabledifin_fallback_force/00-base.xml b/tests/dictionaries/10load_disabledifin_fallback_force/00-base.xml
index 3fbfe19cd..40b8b2fa6 100644
--- a/tests/dictionaries/10load_disabledifin_fallback_force/00-base.xml
+++ b/tests/dictionaries/10load_disabledifin_fallback_force/00-base.xml
@@ -20,7 +20,7 @@
mode_conteneur_actif
mode_conteneur_actif2
-
+
non
mode_conteneur_actif
diff --git a/tests/dictionaries/11multi_disabled_if_in_filelist/00-base.xml b/tests/dictionaries/11multi_disabled_if_in_filelist/00-base.xml
index eb372de01..e858dd47e 100644
--- a/tests/dictionaries/11multi_disabled_if_in_filelist/00-base.xml
+++ b/tests/dictionaries/11multi_disabled_if_in_filelist/00-base.xml
@@ -19,7 +19,7 @@
-
+
non
afilllist
diff --git a/tests/dictionaries/40condition_base/00-base.xml b/tests/dictionaries/40condition_base/00-base.xml
index 8ebe88661..89b2bf092 100644
--- a/tests/dictionaries/40condition_base/00-base.xml
+++ b/tests/dictionaries/40condition_base/00-base.xml
@@ -18,7 +18,7 @@
-
+
oui
mode_conteneur_actif1
mode_conteneur_actif2
diff --git a/tests/dictionaries/40condition_base_add/00-base.xml b/tests/dictionaries/40condition_base_add/00-base.xml
index 8ebe88661..89b2bf092 100644
--- a/tests/dictionaries/40condition_base_add/00-base.xml
+++ b/tests/dictionaries/40condition_base_add/00-base.xml
@@ -18,7 +18,7 @@
-
+
oui
mode_conteneur_actif1
mode_conteneur_actif2
diff --git a/tests/dictionaries/40condition_base_add/01-base.xml b/tests/dictionaries/40condition_base_add/01-base.xml
index a87dc7e61..87c374e9f 100644
--- a/tests/dictionaries/40condition_base_add/01-base.xml
+++ b/tests/dictionaries/40condition_base_add/01-base.xml
@@ -7,7 +7,7 @@
-
+
oui
mode_conteneur_actif1
mode_conteneur_actif2
diff --git a/tests/dictionaries/40condition_fallback/00-base.xml b/tests/dictionaries/40condition_fallback/00-base.xml
index 347a0f493..fe044f844 100644
--- a/tests/dictionaries/40condition_fallback/00-base.xml
+++ b/tests/dictionaries/40condition_fallback/00-base.xml
@@ -20,7 +20,7 @@
-
+
oui
mode_conteneur_actif1
mode_conteneur_actif2
diff --git a/tests/dictionaries/40condition_optional/00-base.xml b/tests/dictionaries/40condition_optional/00-base.xml
index 7ed146376..d8cab151b 100644
--- a/tests/dictionaries/40condition_optional/00-base.xml
+++ b/tests/dictionaries/40condition_optional/00-base.xml
@@ -15,7 +15,7 @@
-
+
oui
mode_conteneur_actif1
mode_conteneur_actif2
diff --git a/tests/dictionaries/40condition_optional_empty/00-base.xml b/tests/dictionaries/40condition_optional_empty/00-base.xml
index 734dc45fe..30dfb0319 100644
--- a/tests/dictionaries/40condition_optional_empty/00-base.xml
+++ b/tests/dictionaries/40condition_optional_empty/00-base.xml
@@ -15,7 +15,7 @@
-
+
oui
mode_conteneur_actif2
diff --git a/tests/dictionaries/40hidden_if_in_group_fallback/00-base.xml b/tests/dictionaries/40hidden_if_in_group_fallback/00-base.xml
index bc55708ad..f55b64f64 100644
--- a/tests/dictionaries/40hidden_if_in_group_fallback/00-base.xml
+++ b/tests/dictionaries/40hidden_if_in_group_fallback/00-base.xml
@@ -15,7 +15,7 @@
-
+
oui
mode_conteneur_actif1
diff --git a/tests/dictionaries/80condition_without_target/00-base.xml b/tests/dictionaries/80condition_without_target/00-base.xml
index 5a75fe4ad..a89388491 100644
--- a/tests/dictionaries/80condition_without_target/00-base.xml
+++ b/tests/dictionaries/80condition_without_target/00-base.xml
@@ -18,7 +18,7 @@
-
+
oui
diff --git a/tests/dictionaries/80hidden_if_in_filelist/00-base.xml b/tests/dictionaries/80hidden_if_in_filelist/00-base.xml
index 1b452337a..14afbd68c 100644
--- a/tests/dictionaries/80hidden_if_in_filelist/00-base.xml
+++ b/tests/dictionaries/80hidden_if_in_filelist/00-base.xml
@@ -16,7 +16,7 @@
-
+
non
afilllist