diff --git a/doc/README.md b/doc/README.md
index 0faf2312..c606f47c 100644
--- a/doc/README.md
+++ b/doc/README.md
@@ -28,7 +28,6 @@ Rougail est un bibliothèque python3 qui permet de charger des dictionnaires (fi
- [Les calcules automatiques](fill/README.md)
- [Les vérifications des valeurs](check/README.md)
- [Les conditions](condition/README.md)
- - [Les variables meneuses ou suiveuses](variable/leadership.md)
## Les templates
diff --git a/doc/family/README.md b/doc/family/README.md
index 1aff0572..85da5368 100644
--- a/doc/family/README.md
+++ b/doc/family/README.md
@@ -2,4 +2,5 @@
- [Une famille](simple.md)
- [Famille crée dynamiquement](auto.md)
+ - [Les variables meneuses ou suiveuses](leadership.md)
diff --git a/doc/family/leadership.md b/doc/family/leadership.md
new file mode 100644
index 00000000..8d135021
--- /dev/null
+++ b/doc/family/leadership.md
@@ -0,0 +1,56 @@
+# Variable meneuse ou suiveuse
+
+## Variable meneuse
+
+Une variable meneuse est une variable qui va guider la longueur d'autre variables (appelé variables suiveuse).
+
+Une variable meneuse est une [variable](../variable/README.md) qui est obligatoirement de type multiple.
+
+Une variable meneuse peut être obligatoire.
+
+Le [mode](../mode.md) par défaut correspond au plus petit mode définit par l'utilisateur des variables suiveuses.
+
+## Variable suiveuse
+
+Une variable suiveuse est une variable donc la longueur n'est pas déterminé par elle-même, mais est identique à celle de la variable meneuse dont elle dépend.
+
+Une variable suiveuse est une variable placer juste derrière une variable meneuse ou une autre variable suiveuse.
+
+L'ordre de définition des variables suiveuses est important.
+
+Cette variable peut être de type multiple. Dans ce cas, pour un index determiné, il est possible de mettre plusieurs valeurs à une même variable.
+
+Une variable suiveuse peut être obligatoire. Cela signifie que lorsqu'une variable meneuse est renseigné, il faut obligatoirement que la variable suiveuse est également une valeur à l'index considéré.
+Si aucune valeur n'est définit pour la variable meneuse, aucune valeur n'est a spécifié pour la variable suiveuse.
+
+Le [mode](../mode.md) par défaut d'une variable suiveuse correspond au [mode](../mode.md) de la variable meneuse.
+
+Si une variable meneuse est caché ou désactivé, les variables suiveuses le seront également.
+
+## Définition des variables meneuse et suiveuse
+
+Les variables meneuses et suiveuses doivent dans une famille de type "leadership".
+
+Voici un exemple de définition d'une variable meneuse et de deux variables meneuses :
+
+```
+
+
+
+
+
+
+
+```
+
+## Ajout d'une nouvelle variable suiveuse
+
+Pour ajouter, dans un nouveau dictionnaire, une variable suiveuse à notre groupe, rien de plus simple, il suffit définir une ou des nouvelles variables dans la famille :
+
+```
+
+
+
+
+
+```
diff --git a/doc/fill/value.md b/doc/fill/value.md
index d1efaa72..4702d11e 100644
--- a/doc/fill/value.md
+++ b/doc/fill/value.md
@@ -49,8 +49,8 @@ Si une condition "hidden_if_in" est spécifié à la variable, la valeur sera mo
## Variable meneuse ou suiveuse avec valeur calculé
-Une [variable suiveuse](../variable/leadership.md) ne peut pas être calculé automatiquement.
-Une [variable meneuse](../variable/leadership.md) peut être calculé automatiquement.
+Une [variable suiveuse](../family/leadership.md) ne peut pas être calculé automatiquement.
+Une [variable meneuse](../family/leadership.md) peut être calculé automatiquement.
Si la variable n'est pas multiple, il ne faut pas que le calcule retourne une liste.
## Variable dynamique avec une valeur calculée
diff --git a/doc/param/variable.md b/doc/param/variable.md
index 1b4062fe..2fe100b6 100644
--- a/doc/param/variable.md
+++ b/doc/param/variable.md
@@ -6,7 +6,7 @@ Imaginons que la variable "my_variable" pré-existe. La valeur de la variable se
my_variable
```
-[Les variables meneuses ou suiveuses](../variable/leadership.md) peuvent être utilisé sans soucis comme paramètre.
+[Les variables meneuses ou suiveuses](../family/leadership.md) peuvent être utilisé sans soucis comme paramètre.
## Paramètre avec variable potentiellement non existante
diff --git a/doc/variable/README.md b/doc/variable/README.md
index af87388f..f3a1ea3a 100644
--- a/doc/variable/README.md
+++ b/doc/variable/README.md
@@ -1,4 +1,255 @@
# Variable
- - [Une variable](simple.md)
- - [Variable meneuse ou suiveuse](leadership.md)
+## Un variable
+
+Une variable est forcement dans [variables](../variables.md) ou dans une [famille](../family/README.md).
+
+Une variable est déjà un nom. C'est à dire qu'on pourra utiliser plus tard la variable via ce nom.
+
+```
+
+
+
+
+
+
+```
+
+## Description et aide sur la variable
+
+En plus d'un nom, il est possible de mettre une "description" à la variable. C'est une information "utilisateur" qui nous permettra d'avoir des informations complémentaires sur le contenu de cette variable :
+
+```
+
+```
+
+En plus de la description, il est possible de préciser une aide complémentaire :
+
+```
+
+```
+
+Cette aide peut être utilisé à tout moment comme valeur [d'un paramètre](../param/information.md).
+
+## Le type de la variable
+
+Une variable a un type. Ce type permet de définir les valeurs acceptées par cette variable :
+
+- string : chaine de caractère (type par défaut)
+- number : un nombre
+- float : un chiffre flottant
+- boolean : "True" ou "False", si aucune valeur n'est défini la valeur par défaut de cette variable sera "True", ces variables sont également obligatoire par défaut
+- password : un mot de passe
+- mail : une adresse mail
+- filename : nom de fichier au sens Unix (exemple : "/etc/passwd")
+- date : une date au format "%Y-%m-%d" (exemple : "2021-01-30")
+- unix_user : nom d'utilisateur au sens Unix
+- ip : n'importe quelle adresse IPv4
+- cidr : n'importe quelle adresse IPv4 au format CIDR
+- local_ip : adresse IPv4 sur un réseau local, si l'adresse IPv4 n'est pas local, un warning sera afficher mais la valeur sera accepté tout de même
+- netmask : masque d'une adresse IPv4
+- network : adresse réseau
+- network_cidr : adresse réseau au format CIDR
+- broadcast : adresse de diffusion
+- netbios : nom netbios
+- domain : nom de domaine
+- hostname : nom d'hôte
+- web_address : adresse web (http://www.cadoles.com/)
+- port : port
+- mac : adresse MAC
+- schedule : périodicité du schedule, les valeurs possibles sont "none", "daily", "weekly" ou "monthly"
+- schedulemod : type de schedule, les valeurs possibles sont "pre" ou "post"
+
+Pour définir le type d'une variable :
+
+```
+
+```
+
+## Variable à valeur multiple
+
+Par défaut une variable ne peut acceuillir qu'une seule valeur. Il peut être utile de pouvoir spécifier plusieurs valeurs à une même variable.
+
+Pour définir une variable à valeur multiple :
+
+```
+
+```
+
+## Variable invisible
+
+Il est possible de cacher une variable.
+
+Cacher une variable signifie qu'elle ne sera pas visible lorsqu'on modifie la configuration du service.
+Par contre cette variable sera accessibles lorsqu'on va l'utiliser.
+
+Pour cacher une variable :
+
+```
+
+```
+
+## Variable désactive
+
+Il est possible de désactiver une variable.
+
+Désactiver une variable signifie qu'elle ne sera pas visible lorsqu'on modifie la configuration du service mais également lorsqu'on va l'utiliser.
+
+Pour désactiver une variable :
+
+```
+
+```
+
+## Variable obligatoire
+
+Variable dont une valeur est requise :
+
+```
+
+```
+
+Les variables booléans sont par défaut obligatoire. Pour qu'une variable booléan ne soit pas obligatoire il faut le préciser explicitement :
+
+```
+
+```
+
+Les variables avec une valeur par défaut (non calculée) sont également automatiquement obligatoire.
+[Les variables à choix](../check/valid_enum.md) sans choix "None" sont également automatiquement obligatoire.
+
+## Valeur par défaut d'une variable
+
+Il est possible de fixer les valeurs par défaut d'une variable :
+
+```
+
+ value
+
+```
+
+Pour une variable multiple, il est possible de préciser plusieurs valeurs :
+
+```
+
+ value 1
+ value 2
+
+```
+
+Si la variable n'est pas pas une [variable meneuse](../family/leadership.md), la première valeur défini dans cette liste sera également la valeur par défaut proposé si on ajoute une nouvelle valeur à cette variable.
+
+Une valeur par défaut peut également être [une valeur calculer](../fill/README.md).
+
+## Redéfinir une variable
+
+Il est possible de définir une variable dans un dictionnaire et de changer son comportement dans une second dictionnaire.
+
+Attention trois attributs ne sont redéfinisable :
+
+- name
+- type
+- multi
+
+Créons notre variable :
+
+
+
+Et redéfinisons là :
+
+```
+
+```
+
+## Créer une variable inexistante
+
+Il est parfois utile de créer une variable si elle n'existe pas dans un autre dictionnaire :
+
+```
+
+```
+
+Si cette variable existe dans un autre dictionnaire, elle ne sera pas modifié ni recréé
+
+## Redéfinir une variable si elle existe
+
+Parfois on veut pouvoir redéfinir une variable mais seulement dans le cas où elle existe déjà :
+
+```
+
+```
+
+## Variable à valeur automatiquement modifiée
+
+Une variable avec valeur automatiquement modifiée est une variable dont la valeur sera considéré comme modifié quand la propriété global "force_store_value" de Tiramisu est mise.
+
+Voici une variable a valeur automatiquement modifiée :
+
+```
+
+ my_value
+
+```
+
+Dans ce cas la valeur est fixée à la valeur actuelle.
+Par exemple, si la valeur de cette variable est issue d'un calcul, la valeur ne sera plus recalculée.
+
+Ces variables sont généralement des variables obligatoires. En effet ces variable ne sont automatiquement modifiées que si elles ont une valeurs.
+
+Une [variable meneuse ou suiveuse](../family/leadership.md) ne peut pas avoir la propriété auto_save.
+
+## Variable à valeur en lecture seule automatique
+
+Une variable avec valeur en lecture seule automatique est une variable dont la valeur ne sera plus modifiable par l'utilisateur quand la [variable "server_deployed" passe à "True"](../dev/config.md).
+
+Voici un variable à valeur en lecture seule automatique :
+
+```
+
+ False
+
+
+```
+
+Dans ce cas la valeur est fixée à la valeur actuelle et elle ne sera plus modifiable par l'utilisateur.
+Par exemple, si la valeur de cette variable est issue d'un calcul, la valeur ne sera plus recalculée.
+
+Ces variables sont généralement des variables obligatoires. En effet ces variable ne sont en lecteur seul que si elles ont une valeurs.
+
+Une [variable meneuse ou suiveuse](../family/leadership.md) ne peut pas avoir la propriété auto_freeze.
+
+## 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 "|" :
+
+```
+
+```
+
+Cette valeur peut être utilisé à tout moment comme valeur [d'un paramètre](../param/information.md).
+
+## Mode de la variable
+
+Le [mode](../mode.md) par défaut d'une variable correspond au [mode](../mode.md) de la [famille](../family/README.md).
+
+Cas particuliers :
+
+- une variable à valeur automatiquement modifiée ou une variable en lecture seule automatique est par défaut en mode "basic".
+- si la variable n'est pas dans une famille, la variable aura le mode "normal" par défaut.
+- une variable obligatoire sans valeur par défaut (calculer ou non) aura le mode "basic".
+
+Pour définir le [mode](../mode.md) :
+
+```
+
+```
diff --git a/doc/variable/simple.md b/doc/variable/simple.md
deleted file mode 100644
index 86a231b9..00000000
--- a/doc/variable/simple.md
+++ /dev/null
@@ -1,255 +0,0 @@
-# Variable
-
-## Un variable
-
-Une variable est forcement dans [variables](../variables.md) ou dans une [famille](../family/README.md).
-
-Une variable est déjà un nom. C'est à dire qu'on pourra utiliser plus tard la variable via ce nom.
-
-```
-
-
-
-
-
-
-```
-
-## Description et aide sur la variable
-
-En plus d'un nom, il est possible de mettre une "description" à la variable. C'est une information "utilisateur" qui nous permettra d'avoir des informations complémentaires sur le contenu de cette variable :
-
-```
-
-```
-
-En plus de la description, il est possible de préciser une aide complémentaire :
-
-```
-
-```
-
-Cette aide peut être utilisé à tout moment comme valeur [d'un paramètre](../param/information.md).
-
-## Le type de la variable
-
-Une variable a un type. Ce type permet de définir les valeurs acceptées par cette variable :
-
-- string : chaine de caractère (type par défaut)
-- number : un nombre
-- float : un chiffre flottant
-- boolean : "True" ou "False", si aucune valeur n'est défini la valeur par défaut de cette variable sera "True", ces variables sont également obligatoire par défaut
-- password : un mot de passe
-- mail : une adresse mail
-- filename : nom de fichier au sens Unix (exemple : "/etc/passwd")
-- date : une date au format "%Y-%m-%d" (exemple : "2021-01-30")
-- unix_user : nom d'utilisateur au sens Unix
-- ip : n'importe quelle adresse IPv4
-- cidr : n'importe quelle adresse IPv4 au format CIDR
-- local_ip : adresse IPv4 sur un réseau local, si l'adresse IPv4 n'est pas local, un warning sera afficher mais la valeur sera accepté tout de même
-- netmask : masque d'une adresse IPv4
-- network : adresse réseau
-- network_cidr : adresse réseau au format CIDR
-- broadcast : adresse de diffusion
-- netbios : nom netbios
-- domain : nom de domaine
-- hostname : nom d'hôte
-- web_address : adresse web (http://www.cadoles.com/)
-- port : port
-- mac : adresse MAC
-- schedule : périodicité du schedule, les valeurs possibles sont "none", "daily", "weekly" ou "monthly"
-- schedulemod : type de schedule, les valeurs possibles sont "pre" ou "post"
-
-Pour définir le type d'une variable :
-
-```
-
-```
-
-## Variable à valeur multiple
-
-Par défaut une variable ne peut acceuillir qu'une seule valeur. Il peut être utile de pouvoir spécifier plusieurs valeurs à une même variable.
-
-Pour définir une variable à valeur multiple :
-
-```
-
-```
-
-## Variable invisible
-
-Il est possible de cacher une variable.
-
-Cacher une variable signifie qu'elle ne sera pas visible lorsqu'on modifie la configuration du service.
-Par contre cette variable sera accessibles lorsqu'on va l'utiliser.
-
-Pour cacher une variable :
-
-```
-
-```
-
-## Variable désactive
-
-Il est possible de désactiver une variable.
-
-Désactiver une variable signifie qu'elle ne sera pas visible lorsqu'on modifie la configuration du service mais également lorsqu'on va l'utiliser.
-
-Pour désactiver une variable :
-
-```
-
-```
-
-## Variable obligatoire
-
-Variable dont une valeur est requise :
-
-```
-
-```
-
-Les variables booléans sont par défaut obligatoire. Pour qu'une variable booléan ne soit pas obligatoire il faut le préciser explicitement :
-
-```
-
-```
-
-Les variables avec une valeur par défaut (non calculée) sont également automatiquement obligatoire.
-[Les variables à choix](../check/valid_enum.md) sans choix "None" sont également automatiquement obligatoire.
-
-## Valeur par défaut d'une variable
-
-Il est possible de fixer les valeurs par défaut d'une variable :
-
-```
-
- value
-
-```
-
-Pour une variable multiple, il est possible de préciser plusieurs valeurs :
-
-```
-
- value 1
- value 2
-
-```
-
-Si la variable n'est pas pas une [variable meneuse](leadership.md), la première valeur défini dans cette liste sera également la valeur par défaut proposé si on ajoute une nouvelle valeur à cette variable.
-
-Une valeur par défaut peut également être [une valeur calculer](../fill/README.md).
-
-## Redéfinir une variable
-
-Il est possible de définir une variable dans un dictionnaire et de changer son comportement dans une second dictionnaire.
-
-Attention trois attributs ne sont redéfinisable :
-
-- name
-- type
-- multi
-
-Créons notre variable :
-
-
-
-Et redéfinisons là :
-
-```
-
-```
-
-## Créer une variable inexistante
-
-Il est parfois utile de créer une variable si elle n'existe pas dans un autre dictionnaire :
-
-```
-
-```
-
-Si cette variable existe dans un autre dictionnaire, elle ne sera pas modifié ni recréé
-
-## Redéfinir une variable si elle existe
-
-Parfois on veut pouvoir redéfinir une variable mais seulement dans le cas où elle existe déjà :
-
-```
-
-```
-
-## Variable à valeur automatiquement modifiée
-
-Une variable avec valeur automatiquement modifiée est une variable dont la valeur sera considéré comme modifié quand la propriété global "force_store_value" de Tiramisu est mise.
-
-Voici une variable a valeur automatiquement modifiée :
-
-```
-
- my_value
-
-```
-
-Dans ce cas la valeur est fixée à la valeur actuelle.
-Par exemple, si la valeur de cette variable est issue d'un calcul, la valeur ne sera plus recalculée.
-
-Ces variables sont généralement des variables obligatoires. En effet ces variable ne sont automatiquement modifiées que si elles ont une valeurs.
-
-Une [variable meneuse ou suiveuse](leadership.md) ne peut pas avoir la propriété auto_save.
-
-## Variable à valeur en lecture seule automatique
-
-Une variable avec valeur en lecture seule automatique est une variable dont la valeur ne sera plus modifiable par l'utilisateur quand la [variable "server_deployed" passe à "True"](../dev/config.md).
-
-Voici un variable à valeur en lecture seule automatique :
-
-```
-
- False
-
-
-```
-
-Dans ce cas la valeur est fixée à la valeur actuelle et elle ne sera plus modifiable par l'utilisateur.
-Par exemple, si la valeur de cette variable est issue d'un calcul, la valeur ne sera plus recalculée.
-
-Ces variables sont généralement des variables obligatoires. En effet ces variable ne sont en lecteur seul que si elles ont une valeurs.
-
-Une [variable meneuse ou suiveuse](leadership.md) ne peut pas avoir la propriété auto_freeze.
-
-## 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 "|" :
-
-```
-
-```
-
-Cette valeur peut être utilisé à tout moment comme valeur [d'un paramètre](../param/information.md).
-
-## Mode de la variable
-
-Le [mode](../mode.md) par défaut d'une variable correspond au [mode](../mode.md) de la [famille](../family/README.md).
-
-Cas particuliers :
-
-- une variable à valeur automatiquement modifiée ou une variable en lecture seule automatique est par défaut en mode "basic".
-- si la variable n'est pas dans une famille, la variable aura le mode "normal" par défaut.
-- une variable obligatoire sans valeur par défaut (calculer ou non) aura le mode "basic".
-
-Pour définir le [mode](../mode.md) :
-
-```
-
-```
diff --git a/src/rougail/annotator/condition.py b/src/rougail/annotator/condition.py
index b31d8183..ebfacbb1 100644
--- a/src/rougail/annotator/condition.py
+++ b/src/rougail/annotator/condition.py
@@ -164,13 +164,12 @@ class Annotator(TargetAnnotator, ParamAnnotator, Walk):
return target.name, [target.name]
# it's a leader, so apply property to leadership
family_name = self.objectspace.paths.get_variable_family_path(target.name.path)
- family = self.objectspace.paths.get_family(family_name,
- target.name.namespace,
- )
- return family, family.variable
- # it's a family
- variable = self.objectspace.paths.get_family(target.name.path,
- target.namespace,
+ namespace = target.name.namespace
+ else:
+ family_name = target.name.path
+ namespace = target.namespace
+ variable = self.objectspace.paths.get_family(family_name,
+ namespace,
)
if hasattr(variable, 'variable'):
return variable, list(variable.variable.values())
diff --git a/src/rougail/annotator/family.py b/src/rougail/annotator/family.py
index 3006b7b9..f30802b7 100644
--- a/src/rougail/annotator/family.py
+++ b/src/rougail/annotator/family.py
@@ -137,10 +137,10 @@ class Annotator(Walk):
for variable in family.variable.values():
self.valid_mode(variable)
if isinstance(variable, self.objectspace.family):
- if family_mode and not self._has_mode(variable):
- self._set_auto_mode(variable, family_mode)
- continue
- if isinstance(variable, self.objectspace.leadership):
+ if not variable.leadership:
+ if family_mode and not self._has_mode(variable):
+ self._set_auto_mode(variable, family_mode)
+ continue
func = self._set_default_mode_leader
else:
func = self._set_default_mode_variable
@@ -174,11 +174,12 @@ class Annotator(Walk):
obj.mode_auto = True
def _set_default_mode_leader(self,
- leadership: 'self.objectspace.leadership',
+ leadership: 'self.objectspace.family',
family_mode: str,
) -> None:
leader_mode = None
- for follower in leadership.variable:
+ leader = next(iter(leadership.variable.values()))
+ for follower in leadership.variable.values():
self.valid_mode(follower)
if follower.auto_save is True:
msg = _(f'leader/followers "{follower.name}" could not be auto_save')
@@ -192,9 +193,9 @@ class Annotator(Walk):
else:
follower_mode = self.objectspace.rougailconfig['default_variable_mode']
if self.modes[leader_mode] > self.modes[follower_mode]:
- if self._has_mode(follower) and not self._has_mode(leadership.variable[0]):
+ if self._has_mode(follower) and not self._has_mode(leader):
# if follower has mode but not the leader
- self._set_auto_mode(leadership.variable[0], follower_mode)
+ self._set_auto_mode(leader, follower_mode)
else:
# leader's mode is minimum level
if self._has_mode(follower):
@@ -206,12 +207,12 @@ class Annotator(Walk):
family_mode,
)
if leader_mode is None:
- if hasattr(leadership.variable[0], 'mode'):
- leader_mode = leadership.variable[0].mode
+ if hasattr(leader, 'mode'):
+ leader_mode = leader.mode
else:
leader_mode = self.objectspace.rougailconfig['default_variable_mode']
- if hasattr(leadership.variable[0], 'mode'):
- leader_mode = leadership.variable[0].mode
+ if hasattr(leader, 'mode'):
+ leader_mode = leader.mode
self._set_auto_mode(leadership, leader_mode)
def _change_family_mode(self,
@@ -225,11 +226,14 @@ class Annotator(Walk):
# change variable mode, but not if variables are not in a family
if hasattr(family, 'variable'):
for variable in family.variable.values():
- if not isinstance(variable, self.objectspace.family):
- if isinstance(variable, self.objectspace.leadership):
+ if isinstance(variable, self.objectspace.family):
+ if variable.leadership:
func = self._change_variable_mode_leader
else:
- func = self._change_variable_mode
+ func = None
+ else:
+ func = self._change_variable_mode
+ if func:
func(variable,
family_mode,
)
@@ -268,11 +272,13 @@ class Annotator(Walk):
leadership,
family_mode: str,
) -> None:
- for follower in leadership.variable:
+ for idx, follower in enumerate(leadership.variable.values()):
+ if idx == 0:
+ leader = follower
self._change_variable_mode(follower,
family_mode,
)
- leadership.variable[0].mode = None
+ leader.mode = None
def dynamic_families(self):
"""link dynamic families to object
diff --git a/src/rougail/annotator/group.py b/src/rougail/annotator/group.py
index 884dce32..a79160c7 100644
--- a/src/rougail/annotator/group.py
+++ b/src/rougail/annotator/group.py
@@ -27,9 +27,10 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
from rougail.i18n import _
from rougail.error import DictConsistencyError
from rougail.utils import normalize_family
+from rougail.annotator.variable import Walk
-class Annotator:
+class Annotator(Walk):
"""Annotate group
"""
level = 10
@@ -37,126 +38,37 @@ class Annotator:
objectspace,
*args,
):
- self.objectspace = objectspace
- if not hasattr(self.objectspace.space, 'constraints') or \
- not hasattr(self.objectspace.space.constraints, 'group'):
+ if not hasattr(objectspace.space, 'variables'):
return
+ self.objectspace = objectspace
self.convert_groups()
def convert_groups(self): # pylint: disable=C0111
"""convert groups
"""
# store old leaders family name
- cache_paths = {}
- for group in self.objectspace.space.constraints.group:
- if group.leader in cache_paths:
- leader_fam_path = cache_paths[group.leader]
- else:
- leader_fam_path = self.objectspace.paths.get_variable_family_path(group.leader, group.xmlfiles)
- cache_paths[group.leader] = leader_fam_path
- follower_names = list(group.follower.keys())
- leader = self.objectspace.paths.get_variable(group.leader)
- if '.' not in leader_fam_path:
- # it's a namespace
- ori_leader_family = self.objectspace.space.variables[leader_fam_path]
- else:
- # it's a sub family
- ori_leader_family = self.objectspace.paths.get_family(leader_fam_path,
- leader.namespace,
- )
- has_a_leader = False
- for variable in list(ori_leader_family.variable.values()):
- if isinstance(variable, self.objectspace.leadership) and \
- variable.variable[0].name == leader.name:
- # append follower to an existed leadership
- leader_space = variable
- has_a_leader = True
- elif variable.name == leader.name:
+ for family in self.get_families(with_leadership=True):
+ if not isinstance(family, self.objectspace.family):
+ continue
+ if not family.leadership:
+ continue
+ if hasattr(family, 'dynamic'):
+ msg = _(f'the family "{family.name}" cannot be leadership and dynamic together')
+ raise DictConsistencyError(msg, 31, family.xmlfiles)
+ family.doc = family.description
+ for idx, variable in enumerate(family.variable.values()):
+ if idx == 0:
# it's a leader
- leader_space = self.manage_leader(variable,
- group,
- ori_leader_family,
- )
- has_a_leader = True
- elif has_a_leader:
- # it's should be a follower
- self.manage_follower(follower_names.pop(0),
- leader_fam_path,
- variable,
- leader_space,
- )
- # this variable is not more in ori_leader_family
- ori_leader_family.variable.pop(normalize_family(variable.name))
- if follower_names == []:
- # no more follower
- break
- else:
- joined = '", "'.join(follower_names)
- msg = _(f'when parsing leadership, we espect to find those followers "{joined}"')
- raise DictConsistencyError(msg, 31, variable.xmlfiles)
- del self.objectspace.space.constraints.group
-
- def manage_leader(self,
- variable: 'Variable',
- group: 'Group',
- ori_leader_family,
- ) -> 'Leadership':
- """manage leader's variable
- """
- if variable.multi is not True:
- msg = _(f'the variable "{variable.name}" in a group must be multi')
- raise DictConsistencyError(msg, 32, variable.xmlfiles)
- if hasattr(group, 'name'):
- ori_leadership_name = group.name
- else:
- ori_leadership_name = variable.name
- leadership_name = normalize_family(ori_leadership_name)
- leader_space = self.objectspace.leadership(variable.xmlfiles)
- leader_space.variable = []
- leader_space.name = leadership_name
- leader_space.hidden = variable.hidden
- if variable.hidden:
- variable.frozen = True
- variable.force_default_on_freeze = True
- variable.hidden = None
- if hasattr(group, 'description'):
- leader_space.doc = group.description
- elif variable.name == leadership_name and hasattr(variable, 'description'):
- leader_space.doc = variable.description
- else:
- leader_space.doc = ori_leadership_name
- leadership_path = ori_leader_family.path + '.' + leadership_name
- self.objectspace.paths.add_leadership(variable.namespace,
- leadership_path,
- leader_space,
- )
- ori_leader_family.variable[normalize_family(variable.name)] = leader_space
- leader_space.variable.append(variable)
- self.objectspace.paths.set_leader(variable.namespace,
- ori_leader_family.path,
- leadership_name,
- normalize_family(variable.name),
- )
- return leader_space
-
- def manage_follower(self,
- follower_name: str,
- leader_family_name: str,
- variable: 'Variable',
- leader_space: 'Leadership',
- ) -> None:
- """manage follower
- """
- if variable.name != follower_name:
- msg = _('when parsing leadership, we expect to find the follower '
- f'"{follower_name}" but we found "{variable.name}"')
- raise DictConsistencyError(msg, 33, variable.xmlfiles)
- self.objectspace.paths.set_leader(variable.namespace,
- leader_family_name,
- leader_space.name,
- normalize_family(variable.name),
- )
- if leader_space.hidden:
- variable.frozen = True
- variable.force_default_on_freeze = True
- leader_space.variable.append(variable)
+ if variable.multi is not True:
+ msg = _(f'the variable "{variable.name}" in a leadership must be multi')
+ raise DictConsistencyError(msg, 32, variable.xmlfiles)
+ family.hidden = variable.hidden
+ if variable.hidden:
+ variable.frozen = True
+ variable.force_default_on_freeze = True
+ variable.hidden = None
+ else:
+ # it's a follower
+ if family.hidden:
+ variable.frozen = True
+ variable.force_default_on_freeze = True
diff --git a/src/rougail/annotator/property.py b/src/rougail/annotator/property.py
index 24feadc9..afd4d8a6 100644
--- a/src/rougail/annotator/property.py
+++ b/src/rougail/annotator/property.py
@@ -107,7 +107,7 @@ class Annotator(Walk):
"""convert variables
"""
for variable in self.get_variables(with_leadership=True):
- if isinstance(variable, self.objectspace.leadership):
- for follower in variable.variable:
+ if isinstance(variable, self.objectspace.family):
+ for follower in variable.variable.values():
self.convert_property(follower)
self.convert_property(variable)
diff --git a/src/rougail/annotator/value.py b/src/rougail/annotator/value.py
index 3697fd29..7d30d9d8 100644
--- a/src/rougail/annotator/value.py
+++ b/src/rougail/annotator/value.py
@@ -46,9 +46,9 @@ class Annotator(Walk): # pylint: disable=R0903
"""convert value
"""
for variable in self.get_variables(with_leadership=True):
- if isinstance(variable, self.objectspace.leadership):
+ if isinstance(variable, self.objectspace.family):
variable_type = 'leader'
- for follower in variable.variable:
+ for follower in variable.variable.values():
self._convert_value(follower,
variable_type,
)
@@ -82,19 +82,18 @@ class Annotator(Walk): # pylint: disable=R0903
return
if variable.value[0].type == 'calculation':
variable.default = variable.value[0]
+ elif variable.multi:
+ if variable_type != 'follower':
+ variable.default = [value.name for value in variable.value]
+ if variable_type != 'leader':
+ if variable.multi == 'submulti':
+ variable.default_multi = [value.name for value in variable.value]
+ else:
+ variable.default_multi = variable.value[0].name
else:
- if variable.multi:
- if variable_type != 'follower':
- variable.default = [value.name for value in variable.value]
- if variable_type != 'leader':
- if variable.multi == 'submulti':
- variable.default_multi = [value.name for value in variable.value]
- else:
- variable.default_multi = variable.value[0].name
- else:
- if len(variable.value) > 1:
- msg = _(f'the non multi variable "{variable.name}" cannot have '
- 'more than one value')
- raise DictConsistencyError(msg, 68, variable.xmlfiles)
- variable.default = variable.value[0].name
+ if len(variable.value) > 1:
+ msg = _(f'the non multi variable "{variable.name}" cannot have '
+ 'more than one value')
+ raise DictConsistencyError(msg, 68, variable.xmlfiles)
+ variable.default = variable.value[0].name
del variable.value
diff --git a/src/rougail/annotator/variable.py b/src/rougail/annotator/variable.py
index e52783fb..15c06ecd 100644
--- a/src/rougail/annotator/variable.py
+++ b/src/rougail/annotator/variable.py
@@ -87,28 +87,30 @@ class Walk:
if hasattr(family, 'variable'):
for variable in family.variable.values():
if isinstance(variable, self.objectspace.family):
- yield from self._get_variables(variable, with_leadership)
- continue
- if not with_leadership and isinstance(variable, self.objectspace.leadership):
- for follower in variable.variable:
- yield follower
- continue
+ if variable.leadership is False:
+ yield from self._get_variables(variable, with_leadership)
+ continue
+ if not with_leadership:
+ for follower in variable.variable.values():
+ yield follower
+ continue
yield variable
- def get_families(self):
+ def get_families(self, with_leadership=False):
"""Iter all families from the objectspace
"""
for family in self.objectspace.space.variables.values():
- yield from self._get_families(family)
+ yield from self._get_families(family, with_leadership)
def _get_families(self,
family: 'self.objectspace.family',
+ with_leadership: bool,
):
yield family
if hasattr(family, 'variable'):
for fam in family.variable.values():
- if isinstance(fam, self.objectspace.family):
- yield from self._get_families(fam)
+ if isinstance(fam, self.objectspace.family) and (with_leadership or not fam.leadership):
+ yield from self._get_families(fam, with_leadership)
class Annotator(Walk): # pylint: disable=R0903
@@ -133,10 +135,10 @@ class Annotator(Walk): # pylint: disable=R0903
"""convert variable
"""
for variable in self.get_variables(with_leadership=True):
- if isinstance(variable, self.objectspace.leadership):
+ if isinstance(variable, self.objectspace.family):
# first variable is a leader, others are follower
variable_type = 'leader'
- for follower in variable.variable:
+ for follower in variable.variable.values():
self._convert_variable(follower,
variable_type,
)
diff --git a/src/rougail/data/rougail.dtd b/src/rougail/data/rougail.dtd
index d22f6f98..df58c72e 100644
--- a/src/rougail/data/rougail.dtd
+++ b/src/rougail/data/rougail.dtd
@@ -132,5 +132,3 @@
-
-
diff --git a/src/rougail/objspace.py b/src/rougail/objspace.py
index 191cf007..eb77cf0d 100644
--- a/src/rougail/objspace.py
+++ b/src/rougail/objspace.py
@@ -38,9 +38,9 @@ FORCE_REDEFINABLES = ('family', 'follower', 'service', 'disknod', 'variables')
# RougailObjSpace's elements that shall be forced to the UnRedefinable type
FORCE_UNREDEFINABLES = ('value',)
# RougailObjSpace's elements that shall not be modify
-UNREDEFINABLE = ('multi', 'type')
+UNREDEFINABLE = ('multi', 'type', 'leadership')
# RougailObjSpace's elements that did not created automaticly
-FORCE_ELEMENTS = ('choice', 'property_', 'leadership', 'information')
+FORCE_ELEMENTS = ('choice', 'property_', 'information')
# XML text are convert has name
FORCED_TEXT_ELTS_AS_NAME = ('choice', 'property', 'value',)
@@ -474,11 +474,16 @@ class RougailObjSpace:
else:
family_name = namespace
+ if isinstance(space, self.family) and space.leadership:
+ leader = space.path
+ else:
+ leader = None
self.paths.add_variable(namespace,
variableobj.name,
space.path,
document.attrib.get('dynamic') is not None,
variableobj,
+ leader,
)
elif isinstance(variableobj, self.family): # pylint: disable=E1101
family_name = variableobj.name
diff --git a/src/rougail/path.py b/src/rougail/path.py
index bf5daf3b..3a44e720 100644
--- a/src/rougail/path.py
+++ b/src/rougail/path.py
@@ -77,19 +77,6 @@ class Path:
)
variableobj.path = full_name
- def add_leadership(self,
- namespace: str,
- path: str,
- variableobj: str,
- ) -> str: # pylint: disable=C0111
- """add a new leadership
- """
- self.families[path] = dict(name=path,
- namespace=namespace,
- variableobj=variableobj,
- )
- variableobj.path = path
-
def get_family(self,
name: str,
current_namespace: str,
@@ -109,26 +96,6 @@ class Path:
raise DictConsistencyError(msg, 38, [])
return dico['variableobj']
- # Leadership
- def set_leader(self,
- namespace: str,
- leader_family_name: str,
- leadership_name: str,
- name: str,
- ) -> None: # pylint: disable=C0111
- """set a variable a leadership member
- """
- # need rebuild path and move object in new path
- old_path = leader_family_name + '.' + name
- leadership_path = leader_family_name + '.' + leadership_name
- new_path = leadership_path + '.' + name
- self.variables[new_path] = self.variables.pop(old_path)
- self.variables[new_path]['leader'] = leadership_path
- self.variables[new_path]['variableobj'].path = new_path
- self.variables[new_path]['family'] = leadership_path
- if namespace == self.variable_namespace:
- self.full_paths_variables[name] = new_path
-
def is_leader(self, path): # pylint: disable=C0111
"""Is the variable is a leader
"""
@@ -136,7 +103,7 @@ class Path:
if not variable['leader']:
return False
leadership = self.get_family(variable['leader'], variable['variableobj'].namespace)
- return leadership.variable[0].path == path
+ return next(iter(leadership.variable.values())).path == path
def is_follower(self, path):
"""Is the variable is a follower
@@ -145,7 +112,7 @@ class Path:
if not variable['leader']:
return False
leadership = self.get_family(variable['leader'], variable['variableobj'].namespace)
- return leadership.variable[0].path != path
+ return next(iter(leadership.variable.values())).path != path
# Variable
def add_variable(self, # pylint: disable=R0913
@@ -154,6 +121,7 @@ class Path:
family: str,
is_dynamic: bool,
variableobj,
+ leader: 'self.objectspace.family'=None,
) -> str: # pylint: disable=C0111
"""Add a new variable (with path)
"""
@@ -169,7 +137,7 @@ class Path:
raise DictConsistencyError(msg, 57, variableobj.xmlfiles)
self.variables[full_path] = dict(name=name,
family=family,
- leader=None,
+ leader=leader,
is_dynamic=is_dynamic,
variableobj=variableobj,
)
diff --git a/src/rougail/tiramisureflector.py b/src/rougail/tiramisureflector.py
index 318e6dd3..7d823fa6 100644
--- a/src/rougail/tiramisureflector.py
+++ b/src/rougail/tiramisureflector.py
@@ -371,7 +371,7 @@ class Family(Common):
if hasattr(self.elt, 'suffixes'):
self.objectspace.has_dyn_option = True
self.object_type = 'ConvertDynOptionDescription'
- elif isinstance(self.elt, self.objectspace.leadership):
+ elif hasattr(self.elt, 'leadership') and self.elt.leadership:
self.object_type = 'Leadership'
else:
self.object_type = 'OptionDescription'
diff --git a/src/rougail/update.py b/src/rougail/update.py
index 63c0f511..dd9cddf9 100644
--- a/src/rougail/update.py
+++ b/src/rougail/update.py
@@ -31,10 +31,11 @@ from .i18n import _
from .error import UpgradeError
from .utils import normalize_family
+from .config import RougailConfig
VERSIONS = {'creole': ['1'],
- 'rougail': ['0.9'],
+ 'rougail': ['0.9', '0.10'],
}
@@ -47,16 +48,24 @@ FUNCTION_VERSIONS = [(root, version, get_function_name(root, version)) for root,
class RougailUpgrade:
- def __init__(self, test=False, upgrade_help=None):
+ def __init__(self,
+ test=False,
+ upgrade_help=None,
+ rougailconfig: RougailConfig=None,
+ ) -> None:
self.test = test
if upgrade_help is None:
upgrade_help = {}
self.upgrade_help = upgrade_help
+ if rougailconfig is None:
+ rougailconfig = RougailConfig
+ self.rougailconfig = rougailconfig
def load_xml_from_folders(self,
srcfolder: str,
dstfolder: str,
namespace: str,
+ display: bool=True,
):
"""Loads all the XML files located in the xmlfolders' list
@@ -77,7 +86,8 @@ class RougailUpgrade:
function_found = False
for root_name, version, function_version in FUNCTION_VERSIONS:
if function_found and hasattr(self, function_version):
- print(f' - convert {filename} to version {version}')
+ if display:
+ print(f' - convert {filename} to version {version}')
upgrade_help = self.upgrade_help.get(function_version, {}).get(filename, {})
if upgrade_help.get('remove') is True:
continue
@@ -95,6 +105,90 @@ class RougailUpgrade:
# yield xmlfile, document.getroot()
+ def update_rougail_0_10(self,
+ root: 'Element',
+ upgrade_help: dict,
+ namespace: str,
+ ) -> 'Element':
+ variables = root.find('variables')
+ if variables is None:
+ return root
+ constraints = root.find('constraints')
+ if constraints is None:
+ return root
+ groups = []
+ for constraint in constraints:
+ if constraint.tag == 'group':
+ constraints.remove(constraint)
+ groups.append(constraint)
+ if not groups:
+ return root
+ paths = self._get_path_variables(variables,
+ namespace == self.rougailconfig['variable_namespace'],
+ namespace,
+ )
+ for group in groups:
+ if group.attrib['leader'] in paths:
+ leader_obj = paths[group.attrib['leader']]
+ #FIXME name peut avoir "." il faut le virer
+ #FIXME si extra c'est un follower !
+ if 'name' in group.attrib:
+ name = group.attrib['name']
+ if 'description' in group.attrib:
+ description = group.attrib['description']
+ else:
+ description = name
+ else:
+ name = leader_obj['variable'].attrib['name']
+ if '.' in name:
+ name = name.rsplit('.', 1)[-1]
+ if 'description' in group.attrib:
+ description = group.attrib['description']
+ elif 'description' in leader_obj['variable'].attrib:
+ description = leader_obj['variable'].attrib['description']
+ else:
+ description = name
+ family = SubElement(leader_obj['parent'], 'family', name=name, description=description, leadership="True")
+ leader_obj['parent'].remove(leader_obj['variable'])
+ family.append(leader_obj['variable'])
+ else:
+ # append in group
+ follower = next(iter(group))
+ leader_name = group.attrib['leader']
+ if '.' in leader_name:
+ leader_path = leader_name.rsplit('.', 1)[0]
+ follower_path = leader_path + '.' + follower.text
+ else:
+ follower_path = follower.text
+ obj = paths[follower_path]
+ family = SubElement(obj['parent'], 'family', name=leader_name, leadership="True")
+ for follower in group:
+ leader_name = group.attrib['leader']
+ if '.' in leader_name:
+ leader_path = leader_name.rsplit('.', 1)[0]
+ follower_path = leader_path + '.' + follower.text
+ else:
+ follower_path = follower.text
+ follower_obj = paths[follower_path]
+ follower_obj['parent'].remove(follower_obj['variable'])
+ family.append(follower_obj['variable'])
+ return root
+
+ def _get_path_variables(self, variables, is_variable_namespace, path, dico=None):
+ if dico is None:
+ dico = {}
+ for variable in variables:
+ if not is_variable_namespace and path:
+ subpath = path + '.'
+ else:
+ subpath = ''
+ subpath += variable.attrib['name']
+ if variable.tag == 'family':
+ self._get_path_variables(variable, is_variable_namespace, subpath, dico)
+ elif variable.tag == 'variable':
+ dico[subpath] = {'variable': variable, 'parent': variables}
+ return dico
+
def update_rougail_0_9(self,
root: 'Element',
upgrade_help: dict,
@@ -146,7 +240,7 @@ class RougailUpgrade:
subsubsubelement.attrib['mandatory'] = 'True'
if subsubsubelement.attrib['name'] in upgrade_help.get('variables', {}).get('type', {}):
subsubsubelement.attrib['type'] = upgrade_help.get('variables', {}).get('type', {})[subsubsubelement.attrib['name']]
- if namespace == 'configuration':
+ if namespace == self.rougailconfig['variable_namespace']:
path = subsubsubelement.attrib['name']
npath = normalize_family(subsubsubelement.attrib['name'])
else:
diff --git a/tests/dictionaries/00empty/00_base.xml b/tests/dictionaries/00empty/00_base.xml
index 78227d6f..ef9ac4b4 100644
--- a/tests/dictionaries/00empty/00_base.xml
+++ b/tests/dictionaries/00empty/00_base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/00load_autofreeze/00-base.xml b/tests/dictionaries/00load_autofreeze/00-base.xml
index 92f639a1..96d54553 100644
--- a/tests/dictionaries/00load_autofreeze/00-base.xml
+++ b/tests/dictionaries/00load_autofreeze/00-base.xml
@@ -1,5 +1,5 @@
-
+
no
diff --git a/tests/dictionaries/00load_autofreezeexpert/00-base.xml b/tests/dictionaries/00load_autofreezeexpert/00-base.xml
index 5c1546e2..7b8fbc53 100644
--- a/tests/dictionaries/00load_autofreezeexpert/00-base.xml
+++ b/tests/dictionaries/00load_autofreezeexpert/00-base.xml
@@ -1,5 +1,5 @@
-
+
no
diff --git a/tests/dictionaries/00load_autosave/00-base.xml b/tests/dictionaries/00load_autosave/00-base.xml
index 647c823d..731c00e5 100644
--- a/tests/dictionaries/00load_autosave/00-base.xml
+++ b/tests/dictionaries/00load_autosave/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/00load_autosaveexpert/00-base.xml b/tests/dictionaries/00load_autosaveexpert/00-base.xml
index 2959c5c3..a4e833da 100644
--- a/tests/dictionaries/00load_autosaveexpert/00-base.xml
+++ b/tests/dictionaries/00load_autosaveexpert/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/00load_comment/00-base.xml b/tests/dictionaries/00load_comment/00-base.xml
index 7ff4428f..6ac1ab45 100644
--- a/tests/dictionaries/00load_comment/00-base.xml
+++ b/tests/dictionaries/00load_comment/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/00load_notype/00-base.xml b/tests/dictionaries/00load_notype/00-base.xml
index 14c82f1c..6594e939 100644
--- a/tests/dictionaries/00load_notype/00-base.xml
+++ b/tests/dictionaries/00load_notype/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/00load_save/00-base.xml b/tests/dictionaries/00load_save/00-base.xml
index 84913090..f0576995 100644
--- a/tests/dictionaries/00load_save/00-base.xml
+++ b/tests/dictionaries/00load_save/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/00load_subfolder/99-base.xml b/tests/dictionaries/00load_subfolder/99-base.xml
index 84913090..f0576995 100644
--- a/tests/dictionaries/00load_subfolder/99-base.xml
+++ b/tests/dictionaries/00load_subfolder/99-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/00load_subfolder/subfolder/00-base.xml b/tests/dictionaries/00load_subfolder/subfolder/00-base.xml
index 27c7f0b7..b06fb689 100644
--- a/tests/dictionaries/00load_subfolder/subfolder/00-base.xml
+++ b/tests/dictionaries/00load_subfolder/subfolder/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01auto_autofreeze/00-base.xml b/tests/dictionaries/01auto_autofreeze/00-base.xml
index db10997f..fcfc4feb 100644
--- a/tests/dictionaries/01auto_autofreeze/00-base.xml
+++ b/tests/dictionaries/01auto_autofreeze/00-base.xml
@@ -1,5 +1,5 @@
-
+
no
diff --git a/tests/dictionaries/01auto_base/00-base.xml b/tests/dictionaries/01auto_base/00-base.xml
index 4db9eed3..fe101284 100644
--- a/tests/dictionaries/01auto_base/00-base.xml
+++ b/tests/dictionaries/01auto_base/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01auto_withoutparam/00-base.xml b/tests/dictionaries/01auto_withoutparam/00-base.xml
index 7c346837..cab468eb 100644
--- a/tests/dictionaries/01auto_withoutparam/00-base.xml
+++ b/tests/dictionaries/01auto_withoutparam/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01base_domainname/00-base.xml b/tests/dictionaries/01base_domainname/00-base.xml
index 1376bc79..0bad0a27 100644
--- a/tests/dictionaries/01base_domainname/00-base.xml
+++ b/tests/dictionaries/01base_domainname/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01base_file/00-base.xml b/tests/dictionaries/01base_file/00-base.xml
index 2bc1f68d..8cb2c47b 100644
--- a/tests/dictionaries/01base_file/00-base.xml
+++ b/tests/dictionaries/01base_file/00-base.xml
@@ -1,5 +1,5 @@
-
+
/etc/file
diff --git a/tests/dictionaries/01base_file_include/00-base.xml b/tests/dictionaries/01base_file_include/00-base.xml
index 2bc1f68d..8cb2c47b 100644
--- a/tests/dictionaries/01base_file_include/00-base.xml
+++ b/tests/dictionaries/01base_file_include/00-base.xml
@@ -1,5 +1,5 @@
-
+
/etc/file
diff --git a/tests/dictionaries/01base_file_include_content/00-base.xml b/tests/dictionaries/01base_file_include_content/00-base.xml
index 6632ee17..2a038b2e 100644
--- a/tests/dictionaries/01base_file_include_content/00-base.xml
+++ b/tests/dictionaries/01base_file_include_content/00-base.xml
@@ -1,5 +1,5 @@
-
+
/etc/file
diff --git a/tests/dictionaries/01base_file_include_name/00-base.xml b/tests/dictionaries/01base_file_include_name/00-base.xml
index eff8650e..1bc14b59 100644
--- a/tests/dictionaries/01base_file_include_name/00-base.xml
+++ b/tests/dictionaries/01base_file_include_name/00-base.xml
@@ -1,5 +1,5 @@
-
+
/etc/file
diff --git a/tests/dictionaries/01base_file_patch/00-base.xml b/tests/dictionaries/01base_file_patch/00-base.xml
index 2bc1f68d..8cb2c47b 100644
--- a/tests/dictionaries/01base_file_patch/00-base.xml
+++ b/tests/dictionaries/01base_file_patch/00-base.xml
@@ -1,5 +1,5 @@
-
+
/etc/file
diff --git a/tests/dictionaries/01base_file_utfchar/00-base.xml b/tests/dictionaries/01base_file_utfchar/00-base.xml
index 5954ca3b..15d4233e 100644
--- a/tests/dictionaries/01base_file_utfchar/00-base.xml
+++ b/tests/dictionaries/01base_file_utfchar/00-base.xml
@@ -1,5 +1,5 @@
-
+
/etc/systemd-makefs@dev-disk-by\x2dpartlabel
diff --git a/tests/dictionaries/01base_float/00-base.xml b/tests/dictionaries/01base_float/00-base.xml
index e775553e..95547048 100644
--- a/tests/dictionaries/01base_float/00-base.xml
+++ b/tests/dictionaries/01base_float/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01base_help_quote/00-base.xml b/tests/dictionaries/01base_help_quote/00-base.xml
index 43c3fdae..dacddfcf 100644
--- a/tests/dictionaries/01base_help_quote/00-base.xml
+++ b/tests/dictionaries/01base_help_quote/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01base_multi/00-base.xml b/tests/dictionaries/01base_multi/00-base.xml
index 67ec9b79..c6c0f607 100644
--- a/tests/dictionaries/01base_multi/00-base.xml
+++ b/tests/dictionaries/01base_multi/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01base_value_doublequote/00-base.xml b/tests/dictionaries/01base_value_doublequote/00-base.xml
index df1c54f3..f9e31773 100644
--- a/tests/dictionaries/01base_value_doublequote/00-base.xml
+++ b/tests/dictionaries/01base_value_doublequote/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01base_value_doublequote2/00-base.xml b/tests/dictionaries/01base_value_doublequote2/00-base.xml
index 8f2faae9..dc3f9393 100644
--- a/tests/dictionaries/01base_value_doublequote2/00-base.xml
+++ b/tests/dictionaries/01base_value_doublequote2/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01base_value_doublequote3/00-base.xml b/tests/dictionaries/01base_value_doublequote3/00-base.xml
index 97070d9f..fb2e6e0b 100644
--- a/tests/dictionaries/01base_value_doublequote3/00-base.xml
+++ b/tests/dictionaries/01base_value_doublequote3/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01base_value_multi_doublequote/00-base.xml b/tests/dictionaries/01base_value_multi_doublequote/00-base.xml
index 6f8b0f9b..da0614e0 100644
--- a/tests/dictionaries/01base_value_multi_doublequote/00-base.xml
+++ b/tests/dictionaries/01base_value_multi_doublequote/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01base_value_multi_doublequote2/00-base.xml b/tests/dictionaries/01base_value_multi_doublequote2/00-base.xml
index cc6ed95e..35851b77 100644
--- a/tests/dictionaries/01base_value_multi_doublequote2/00-base.xml
+++ b/tests/dictionaries/01base_value_multi_doublequote2/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01base_value_multi_quote/00-base.xml b/tests/dictionaries/01base_value_multi_quote/00-base.xml
index a2a33d6d..e61e305c 100644
--- a/tests/dictionaries/01base_value_multi_quote/00-base.xml
+++ b/tests/dictionaries/01base_value_multi_quote/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01base_value_quote/00-base.xml b/tests/dictionaries/01base_value_quote/00-base.xml
index 1b8d7272..17be4883 100644
--- a/tests/dictionaries/01base_value_quote/00-base.xml
+++ b/tests/dictionaries/01base_value_quote/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01base_var_name_same_family/00-base.xml b/tests/dictionaries/01base_var_name_same_family/00-base.xml
index 7d8e62da..da0749bb 100644
--- a/tests/dictionaries/01base_var_name_same_family/00-base.xml
+++ b/tests/dictionaries/01base_var_name_same_family/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01boolean_no_mandatory/00-base.xml b/tests/dictionaries/01boolean_no_mandatory/00-base.xml
index f17d73cd..ec14adb9 100644
--- a/tests/dictionaries/01boolean_no_mandatory/00-base.xml
+++ b/tests/dictionaries/01boolean_no_mandatory/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01family_description/00-base.xml b/tests/dictionaries/01family_description/00-base.xml
index d4389823..bb32a55a 100644
--- a/tests/dictionaries/01family_description/00-base.xml
+++ b/tests/dictionaries/01family_description/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01fill_autofreeze/00-base.xml b/tests/dictionaries/01fill_autofreeze/00-base.xml
index a1f99cde..16602912 100644
--- a/tests/dictionaries/01fill_autofreeze/00-base.xml
+++ b/tests/dictionaries/01fill_autofreeze/00-base.xml
@@ -1,5 +1,5 @@
-
+
no
diff --git a/tests/dictionaries/01fill_autosave/00-base.xml b/tests/dictionaries/01fill_autosave/00-base.xml
index b5bbda90..fe9c791e 100644
--- a/tests/dictionaries/01fill_autosave/00-base.xml
+++ b/tests/dictionaries/01fill_autosave/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01fill_base/00-base.xml b/tests/dictionaries/01fill_base/00-base.xml
index a8241336..ab755989 100644
--- a/tests/dictionaries/01fill_base/00-base.xml
+++ b/tests/dictionaries/01fill_base/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01fill_mandatory/00-base.xml b/tests/dictionaries/01fill_mandatory/00-base.xml
index ac83f20e..40c178d2 100644
--- a/tests/dictionaries/01fill_mandatory/00-base.xml
+++ b/tests/dictionaries/01fill_mandatory/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01fill_number/00-base.xml b/tests/dictionaries/01fill_number/00-base.xml
index ee2e4094..3054d582 100644
--- a/tests/dictionaries/01fill_number/00-base.xml
+++ b/tests/dictionaries/01fill_number/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01fill_only_optional/00-base.xml b/tests/dictionaries/01fill_only_optional/00-base.xml
index 10fef306..fd9f67b1 100644
--- a/tests/dictionaries/01fill_only_optional/00-base.xml
+++ b/tests/dictionaries/01fill_only_optional/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01fill_optional/00-base.xml b/tests/dictionaries/01fill_optional/00-base.xml
index 6382ce45..4fd16348 100644
--- a/tests/dictionaries/01fill_optional/00-base.xml
+++ b/tests/dictionaries/01fill_optional/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01fill_quote/00-base.xml b/tests/dictionaries/01fill_quote/00-base.xml
index 155af270..058554ac 100644
--- a/tests/dictionaries/01fill_quote/00-base.xml
+++ b/tests/dictionaries/01fill_quote/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01fill_target_optional/00-base.xml b/tests/dictionaries/01fill_target_optional/00-base.xml
index d2421162..7dbd36d9 100644
--- a/tests/dictionaries/01fill_target_optional/00-base.xml
+++ b/tests/dictionaries/01fill_target_optional/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01hidden_if_in_autofreeze/00-base.xml b/tests/dictionaries/01hidden_if_in_autofreeze/00-base.xml
index 2626d61c..7876bac3 100644
--- a/tests/dictionaries/01hidden_if_in_autofreeze/00-base.xml
+++ b/tests/dictionaries/01hidden_if_in_autofreeze/00-base.xml
@@ -1,5 +1,5 @@
-
+
False
diff --git a/tests/dictionaries/01test/00-base.xml b/tests/dictionaries/01test/00-base.xml
index a3d9a16c..4c938a14 100644
--- a/tests/dictionaries/01test/00-base.xml
+++ b/tests/dictionaries/01test/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01test_multi/00-base.xml b/tests/dictionaries/01test_multi/00-base.xml
index 3fbe4b85..971cd514 100644
--- a/tests/dictionaries/01test_multi/00-base.xml
+++ b/tests/dictionaries/01test_multi/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01test_multi_none/00-base.xml b/tests/dictionaries/01test_multi_none/00-base.xml
index eef0cf6e..9afd80f7 100644
--- a/tests/dictionaries/01test_multi_none/00-base.xml
+++ b/tests/dictionaries/01test_multi_none/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01test_redefine/00-base.xml b/tests/dictionaries/01test_redefine/00-base.xml
index a3d9a16c..4c938a14 100644
--- a/tests/dictionaries/01test_redefine/00-base.xml
+++ b/tests/dictionaries/01test_redefine/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01test_redefine/10-base.xml b/tests/dictionaries/01test_redefine/10-base.xml
index 131db74e..dd8ef751 100644
--- a/tests/dictionaries/01test_redefine/10-base.xml
+++ b/tests/dictionaries/01test_redefine/10-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01test_redefine_base/00-base.xml b/tests/dictionaries/01test_redefine_base/00-base.xml
index 51e932bf..e8b9ea61 100644
--- a/tests/dictionaries/01test_redefine_base/00-base.xml
+++ b/tests/dictionaries/01test_redefine_base/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01test_redefine_base/10-base.xml b/tests/dictionaries/01test_redefine_base/10-base.xml
index ca929f57..2446a70e 100644
--- a/tests/dictionaries/01test_redefine_base/10-base.xml
+++ b/tests/dictionaries/01test_redefine_base/10-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01test_redefine_remove/00-base.xml b/tests/dictionaries/01test_redefine_remove/00-base.xml
index a3d9a16c..4c938a14 100644
--- a/tests/dictionaries/01test_redefine_remove/00-base.xml
+++ b/tests/dictionaries/01test_redefine_remove/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/01test_redefine_remove/10-base.xml b/tests/dictionaries/01test_redefine_remove/10-base.xml
index b1c12995..3a1e3e60 100644
--- a/tests/dictionaries/01test_redefine_remove/10-base.xml
+++ b/tests/dictionaries/01test_redefine_remove/10-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/02autosave_hidden_frozenifin/00-base.xml b/tests/dictionaries/02autosave_hidden_frozenifin/00-base.xml
index 6f811c34..99fb291e 100644
--- a/tests/dictionaries/02autosave_hidden_frozenifin/00-base.xml
+++ b/tests/dictionaries/02autosave_hidden_frozenifin/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/02fill_multi_calc_val/00-base.xml b/tests/dictionaries/02fill_multi_calc_val/00-base.xml
index 66876828..1f15a122 100644
--- a/tests/dictionaries/02fill_multi_calc_val/00-base.xml
+++ b/tests/dictionaries/02fill_multi_calc_val/00-base.xml
@@ -1,5 +1,5 @@
-
+
no
diff --git a/tests/dictionaries/02fill_multi_calc_val_multi/00-base.xml b/tests/dictionaries/02fill_multi_calc_val_multi/00-base.xml
index f260758a..889202bf 100644
--- a/tests/dictionaries/02fill_multi_calc_val_multi/00-base.xml
+++ b/tests/dictionaries/02fill_multi_calc_val_multi/00-base.xml
@@ -1,5 +1,5 @@
-
+
no
diff --git a/tests/dictionaries/10autosave_hidden/00-base.xml b/tests/dictionaries/10autosave_hidden/00-base.xml
index f3248ec3..23d47d40 100644
--- a/tests/dictionaries/10autosave_hidden/00-base.xml
+++ b/tests/dictionaries/10autosave_hidden/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/10check_base/00-base.xml b/tests/dictionaries/10check_base/00-base.xml
index ca0c8803..a163cee3 100644
--- a/tests/dictionaries/10check_base/00-base.xml
+++ b/tests/dictionaries/10check_base/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/10check_base_target_optional/00-base.xml b/tests/dictionaries/10check_base_target_optional/00-base.xml
index ff050721..723d1f30 100644
--- a/tests/dictionaries/10check_base_target_optional/00-base.xml
+++ b/tests/dictionaries/10check_base_target_optional/00-base.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/tests/dictionaries/10check_no_param/00-base.xml b/tests/dictionaries/10check_no_param/00-base.xml
index dbc7ff3d..1def8eb4 100644
--- a/tests/dictionaries/10check_no_param/00-base.xml
+++ b/tests/dictionaries/10check_no_param/00-base.xml
@@ -1,5 +1,5 @@
-
+