diff --git a/doc/README.md b/doc/README.md index b96b0edc..ff8a82f4 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 f293f633..016164c2 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 45e977f7..f667072e 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 00000000..4fea90c9 --- /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 00000000..1fa0c4f4 --- /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 7ee4072e..5c3f8a1c 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 e78cd14b..e81e2686 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 978b61eb..bd9b6a9f 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 f8a98c2b..90033c67 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 d74eaf15..c539e422 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 382cf0bc..c3f48826 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 267fb9c4..4cf20e99 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 b56edb7c..a6b07c67 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 787d3b3c..08aceeb9 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 86bba15b..9ce69f57 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 19e5a39b..749d64d3 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 c00f0ca0..592ba86e 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 3fbfe19c..40b8b2fa 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 eb372de0..e858dd47 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 8ebe8866..89b2bf09 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 8ebe8866..89b2bf09 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 a87dc7e6..87c374e9 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 347a0f49..fe044f84 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 7ed14637..d8cab151 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 734dc45f..30dfb031 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 bc55708a..f55b64f6 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 5a75fe4a..a8938849 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 1b452337..14afbd68 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