diff --git a/README.fr.md b/README.fr.md
new file mode 100644
index 000000000..d40b8c90b
--- /dev/null
+++ b/README.fr.md
@@ -0,0 +1,210 @@
+---
+gitea: none
+include_toc: true
+---
+[🇬🇧 (EN)](README.md) - [🇫🇷 (FR)](README.fr.md)
+
+| Variable | Description | Valeur par défaut | Type | Contrôle des accès | Validateur |
+|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------|----------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|
+| **default_structural_format_version**
**Ligne de commande** : -v, --default_structural_format_version
**Variable d'environnement** : DEFAULT_STRUCTURAL_FORMAT_VERSION | Version par défaut du format des fichiers de structure.
Cette valeur n'est utilisée que si la version n'est pas définie dans le fichier de structure. | | [`choice`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | **Choix** :
• 1.0
• 1.1
• null |
+| **functions_files**
**Ligne de commande** : -c, --functions_files
**Variable d'environnement** : FUNCTIONS_FILES | Fichier avec les fonctions.
Ce fichier contient des filtres et des fonctions Jinja2 supplémentaires utilisables dans les fichiers de structure. | | [`UNIX filename`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) `multiple` | `standard` | `unique`
• le nom de fichier peut être une chemin relatif
• le fichier doit exister
• type de fichier autorisé: "file". |
+| **modes_level**
**Ligne de commande** : --modes_level
**Variable d'environnement** : MODES_LEVEL | Tous les niveaux de modes valides. | | [`string`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) `multiple` | `standard` | `unique` |
+| **default_family_mode**
**Variable d'environnement** : DEFAULT_FAMILY_MODE | Mode par défaut pour une famille. | le premier défini dans "[Tous les niveaux de modes valides](#modes_level)" | [`string`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | Ce mode doit être disponible dans "[Tous les niveaux de modes valides](#modes_level)". |
+| **default_variable_mode**
**Variable d'environnement** : DEFAULT_VARIABLE_MODE | Mode par défaut pour une variable. | si la variable "[Tous les niveaux de modes valides](#modes_level)" est définit, la valeur par défaut est le second élément disponible, sinon, le premier | [`string`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | Ce mode doit être disponible dans "[Tous les niveaux de modes valides](#modes_level)". |
+| **base_option_name**
**Variable d'environnement** : BASE_OPTION_NAME | Nom de l'option pour l'option de base. | baseoption | [`string`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **export_with_import**
**Variable d'environnement** : EXPORT_WITH_IMPORT | Dans le fichier de cache, ne pas importer Tiramisu et autres dépendances. | true | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **tiramisu_cache**
**Ligne de commande** : -t, --tiramisu_cache
**Variable d'environnement** : TIRAMISU_CACHE | Store Tiramisu cache filename.
Ce fichier contient les instructions Tiramisu utilisé en interne pour charger les variables.
Ce fichier peut être utilisé pour le débogage. | | [`UNIX filename`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | • le nom de fichier peut être une chemin relatif
• type de fichier autorisé: "file". |
+| **internal_functions**
**Variable d'environnement** : INTERNAL_FUNCTIONS | Nom des fonctions internes qu'il est possible d'utiliser comme fonction. | | [`string`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) `multiple` | `standard` | |
+| ****
**Variable d'environnement** : EXTRA_ANNOTATORS | Nom des annotators supplémentaires. | | [`string`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) `multiple` | `standard` | |
+| **suffix**
**Variable d'environnement** : SUFFIX | Suffix ajouté pour généré le nom des options. | | [`string`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **force_optional**
**Ligne de commande** :
• --force_optional
• --no-force_optional
**Variable d'environnement** : FORCE_OPTIONAL | Toutes les variables dans un calcul sont optionnelles. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) `obligatoire` | `standard` | |
+| **load_unexist_redefine**
**Variable d'environnement** : LOAD_UNEXIST_REDEFINE | Charger les variables redéfinis même si elles n'existe pas. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+
+## Le gestionnaire de secret
+
+> [!NOTE]
+>
+> **Chemin** : secret_manager\
+> `standard`
+
+| Variable | Description | Valeur par défaut | Type | Contrôle des accès |
+|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------|--------------------------------------------------------------------------------------------------|----------------------|
+| **secret_manager.pattern**
**Ligne de commande** : --secret_manager.pattern
**Variable d'environnement** : SECRET_MANAGER.PATTERN | Le modèle de secret permettant de construire le nom de l'élément recherché dans le gestionnaire de secrets.
Le modèle est au format Jinja2. | {{ project }} - {{ environment }} - {{ service }} - {{ user }} | [`string`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) `obligatoire` | `standard` |
+
+## Load and exporter steps
+
+> [!NOTE]
+>
+> **Chemin** : step\
+> `standard`
+
+| Variable | Description | Valeur par défaut | Type | Contrôle des accès | Validateur |
+|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------|---------------------|--------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| **step.structural**
**Variable d'environnement** : STEP.STRUCTURAL | Sélection pour structure. | • directory | [`choice`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) `multiple` | `standard` | **Choix** :
• directory
• string
• commandline
• risotto
• bitwarden |
+| **step.user_data**
**Ligne de commande** : -u, --step.user_data
**Variable d'environnement** : STEP.USER_DATA | Sélection pour données utilisateur. | | [`choice`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) `multiple` | `standard` *`désactivé`*
**Désactivé** : _('cannot load user data for doc output') | `unique`
**Choix** :
• yaml
• environment
• commandline
• ansible
• questionary
• risotto
• bitwarden |
+| **step.output**
**Ligne de commande** : -o, --step.output
**Variable d'environnement** : STEP.OUTPUT | Sélection pour sortie. | display | [`choice`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) `obligatoire` | `standard` | **Choix** :
• display
• json
• doc
• table
• ansible |
+
+| Variable | Description | Valeur par défaut | Type | Contrôle des accès |
+|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------|---------------------|---------------------------------------------------------------------------------------------------|----------------------|
+| **define_default_params**
**Ligne de commande** :
• --define_default_params
• --no-define_default_params
**Variable d'environnement** : DEFINE_DEFAULT_PARAMS | Sur charger les paramètre par défaut pour le type d'option. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) `obligatoire` | `standard` |
+
+## Paramètre par défaut pour le type d'option
+
+> [!NOTE]
+>
+> **Chemin** : default_params\
+> `standard` *`désactivé`*\
+> **Désactivé** : lorsque la variable "[Sur charger les paramètre par défaut pour le type d'option](#define_default_params)" a la valeur "false"
+
+### UNIX filename
+
+> [!NOTE]
+>
+> **Chemin** : default_params.unix_filename\
+> `standard`
+
+| Variable | Description | Valeur par défaut | Type | Contrôle des accès | Validateur |
+|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------|----------------------------------|-----------------------------------------------------------------------------------------------|----------------------|----------------------------------------------------------------|
+| **default_params.unix_filename.allow_relative**
**Ligne de commande** :
• --default_params.unix_filename.allow_relative
• --default_params.unix_filename.no-allow_relative
**Variable d'environnement** : DEFAULT_PARAMS.UNIX_FILENAME.ALLOW_RELATIVE | Le nom de fichier peut être une chemin relatif. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.unix_filename.test_existence**
**Ligne de commande** :
• --default_params.unix_filename.test_existence
• --default_params.unix_filename.no-test_existence
**Variable d'environnement** : DEFAULT_PARAMS.UNIX_FILENAME.TEST_EXISTENCE | Le fichier doit exister. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.unix_filename.types**
**Ligne de commande** : --default_params.unix_filename.types
**Variable d'environnement** : DEFAULT_PARAMS.UNIX_FILENAME.TYPES | Type de fichier autorisé. | • file
• directory | [`choice`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) `multiple` | `standard` | `unique`
**Choix** :
• file
• directory |
+
+### IP
+
+> [!NOTE]
+>
+> **Chemin** : default_params.ip\
+> `standard`
+
+| Variable | Description | Valeur par défaut | Type | Contrôle des accès |
+|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------|---------------------|-------------------------------------------------------------------------------------|----------------------|
+| **default_params.ip.private_only**
**Ligne de commande** :
• --default_params.ip.private_only
• --default_params.ip.no-private_only
**Variable d'environnement** : DEFAULT_PARAMS.IP.PRIVATE_ONLY | Les IP privées sont autorisées. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+| **default_params.ip.allow_reserved**
**Ligne de commande** :
• --default_params.ip.allow_reserved
• --default_params.ip.no-allow_reserved
**Variable d'environnement** : DEFAULT_PARAMS.IP.ALLOW_RESERVED | Les IP réservées sont autorisés. | true | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+| **default_params.ip.cidr**
**Ligne de commande** :
• --default_params.ip.cidr
• --default_params.ip.no-cidr
**Variable d'environnement** : DEFAULT_PARAMS.IP.CIDR | L'IP doit être au format CIDR. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+
+### CIDR
+
+> [!NOTE]
+>
+> **Chemin** : default_params.cidr\
+> `standard`
+
+| Variable | Description | Valeur par défaut | Type | Contrôle des accès |
+|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------|---------------------|-------------------------------------------------------------------------------------|----------------------|
+| **default_params.cidr.private_only**
**Ligne de commande** :
• --default_params.cidr.private_only
• --default_params.cidr.no-private_only
**Variable d'environnement** : DEFAULT_PARAMS.CIDR.PRIVATE_ONLY | Les IP privées sont autorisées. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+| **default_params.cidr.allow_reserved**
**Ligne de commande** :
• --default_params.cidr.allow_reserved
• --default_params.cidr.no-allow_reserved
**Variable d'environnement** : DEFAULT_PARAMS.CIDR.ALLOW_RESERVED | Les IP réservées sont autorisés. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+| **default_params.cidr.cidr**
**Ligne de commande** :
• --default_params.cidr.cidr
• --default_params.cidr.no-cidr
**Variable d'environnement** : DEFAULT_PARAMS.CIDR.CIDR | L'IP doit être au format CIDR. | true | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+
+### Network
+
+> [!NOTE]
+>
+> **Chemin** : default_params.network\
+> `standard`
+
+| Variable | Description | Valeur par défaut | Type | Contrôle des accès |
+|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------|---------------------|-------------------------------------------------------------------------------------|----------------------|
+| **default_params.network.private_only**
**Ligne de commande** :
• --default_params.network.private_only
• --default_params.network.no-private_only
**Variable d'environnement** : DEFAULT_PARAMS.NETWORK.PRIVATE_ONLY | Les réseaux privés sont autorisés. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+| **default_params.network.allow_reserved**
**Ligne de commande** :
• --default_params.network.allow_reserved
• --default_params.network.no-allow_reserved
**Variable d'environnement** : DEFAULT_PARAMS.NETWORK.ALLOW_RESERVED | Les réseaux réservés sont autorisés. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+| **default_params.network.cidr**
**Ligne de commande** :
• --default_params.network.cidr
• --default_params.network.no-cidr
**Variable d'environnement** : DEFAULT_PARAMS.NETWORK.CIDR | Le réseau doit être au format CIDR. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+
+### Network CIDR
+
+> [!NOTE]
+>
+> **Chemin** : default_params.network_cidr\
+> `standard`
+
+| Variable | Description | Valeur par défaut | Type | Contrôle des accès |
+|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------|---------------------|-------------------------------------------------------------------------------------|----------------------|
+| **default_params.network_cidr.private_only**
**Ligne de commande** :
• --default_params.network_cidr.private_only
• --default_params.network_cidr.no-private_only
**Variable d'environnement** : DEFAULT_PARAMS.NETWORK_CIDR.PRIVATE_ONLY | Les réseaux privés sont autorisés. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+| **default_params.network_cidr.allow_reserved**
**Ligne de commande** :
• --default_params.network_cidr.allow_reserved
• --default_params.network_cidr.no-allow_reserved
**Variable d'environnement** : DEFAULT_PARAMS.NETWORK_CIDR.ALLOW_RESERVED | Les réseaux réservés sont autorisés. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+| **default_params.network_cidr.cidr**
**Ligne de commande** :
• --default_params.network_cidr.cidr
• --default_params.network_cidr.no-cidr
**Variable d'environnement** : DEFAULT_PARAMS.NETWORK_CIDR.CIDR | Le réseau doit être au format CIDR. | true | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+
+### Netbios
+
+> [!NOTE]
+>
+> **Chemin** : default_params.netbios\
+> `standard`
+
+| Variable | Description | Valeur par défaut | Type | Contrôle des accès | Validateur |
+|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------|---------------------|-------------------------------------------------------------------------------------|----------------------|-------------------------------------------------------------------------------------------|
+| **default_params.netbios.type**
**Ligne de commande** : --default_params.netbios.type
**Variable d'environnement** : DEFAULT_PARAMS.NETBIOS.TYPE | Type de nom de domaine. | netbios | [`choice`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | **Choix** :
• domainname
• netbios
• hostname
• null |
+| **default_params.netbios.allow_without_dot**
**Ligne de commande** :
• --default_params.netbios.allow_without_dot
• --default_params.netbios.no-allow_without_dot
**Variable d'environnement** : DEFAULT_PARAMS.NETBIOS.ALLOW_WITHOUT_DOT | Le nom de domaine peut être un nom d'hôte. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.netbios.test_existence**
**Ligne de commande** :
• --default_params.netbios.test_existence
• --default_params.netbios.no-test_existence
**Variable d'environnement** : DEFAULT_PARAMS.NETBIOS.TEST_EXISTENCE | Le nom de domaine doit exister. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.netbios.allow_ip**
**Ligne de commande** :
• --default_params.netbios.allow_ip
• --default_params.netbios.no-allow_ip
**Variable d'environnement** : DEFAULT_PARAMS.NETBIOS.ALLOW_IP | Le nom de domaine peut être une IP. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.netbios.allow_cidr_network**
**Ligne de commande** :
• --default_params.netbios.allow_cidr_network
• --default_params.netbios.no-allow_cidr_network
**Variable d'environnement** : DEFAULT_PARAMS.NETBIOS.ALLOW_CIDR_NETWORK | Le nom de domaine peut être un réseau au format CIDR. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.netbios.allow_startswith_dot**
**Ligne de commande** :
• --default_params.netbios.allow_startswith_dot
• --default_params.netbios.no-allow_startswith_dot
**Variable d'environnement** : DEFAULT_PARAMS.NETBIOS.ALLOW_STARTSWITH_DOT | Le nom de domaine peut démarré par un point. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+
+### Domainname
+
+> [!NOTE]
+>
+> **Chemin** : default_params.domainname\
+> `standard`
+
+| Variable | Description | Valeur par défaut | Type | Contrôle des accès | Validateur |
+|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------|---------------------|-------------------------------------------------------------------------------------|----------------------|-------------------------------------------------------------------------------------------|
+| **default_params.domainname.type**
**Ligne de commande** : --default_params.domainname.type
**Variable d'environnement** : DEFAULT_PARAMS.DOMAINNAME.TYPE | Type de nom de domaine. | domainname | [`choice`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | **Choix** :
• domainname
• netbios
• hostname
• null |
+| **default_params.domainname.allow_without_dot**
**Ligne de commande** :
• --default_params.domainname.allow_without_dot
• --default_params.domainname.no-allow_without_dot
**Variable d'environnement** : DEFAULT_PARAMS.DOMAINNAME.ALLOW_WITHOUT_DOT | Le nom de domaine peut être un nom d'hôte. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.domainname.test_existence**
**Ligne de commande** :
• --default_params.domainname.test_existence
• --default_params.domainname.no-test_existence
**Variable d'environnement** : DEFAULT_PARAMS.DOMAINNAME.TEST_EXISTENCE | Le nom de domaine doit exister. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.domainname.allow_ip**
**Ligne de commande** :
• --default_params.domainname.allow_ip
• --default_params.domainname.no-allow_ip
**Variable d'environnement** : DEFAULT_PARAMS.DOMAINNAME.ALLOW_IP | Le nom de domaine peut être une IP. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.domainname.allow_cidr_network**
**Ligne de commande** :
• --default_params.domainname.allow_cidr_network
• --default_params.domainname.no-allow_cidr_network
**Variable d'environnement** : DEFAULT_PARAMS.DOMAINNAME.ALLOW_CIDR_NETWORK | Le nom de domaine peut être un réseau au format CIDR. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.domainname.allow_startswith_dot**
**Ligne de commande** :
• --default_params.domainname.allow_startswith_dot
• --default_params.domainname.no-allow_startswith_dot
**Variable d'environnement** : DEFAULT_PARAMS.DOMAINNAME.ALLOW_STARTSWITH_DOT | Le nom de domaine peut démarré par un point. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+
+### Hostname
+
+> [!NOTE]
+>
+> **Chemin** : default_params.hostname\
+> `standard`
+
+| Variable | Description | Valeur par défaut | Type | Contrôle des accès | Validateur |
+|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------|---------------------|-------------------------------------------------------------------------------------|----------------------|-------------------------------------------------------------------------------------------|
+| **default_params.hostname.type**
**Ligne de commande** : --default_params.hostname.type
**Variable d'environnement** : DEFAULT_PARAMS.HOSTNAME.TYPE | Type de nom de domaine. | hostname | [`choice`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | **Choix** :
• domainname
• netbios
• hostname
• null |
+| **default_params.hostname.allow_without_dot**
**Ligne de commande** :
• --default_params.hostname.allow_without_dot
• --default_params.hostname.no-allow_without_dot
**Variable d'environnement** : DEFAULT_PARAMS.HOSTNAME.ALLOW_WITHOUT_DOT | Le nom de domaine peut être un nom d'hôte. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.hostname.test_existence**
**Ligne de commande** :
• --default_params.hostname.test_existence
• --default_params.hostname.no-test_existence
**Variable d'environnement** : DEFAULT_PARAMS.HOSTNAME.TEST_EXISTENCE | Le nom de domaine doit exister. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.hostname.allow_ip**
**Ligne de commande** :
• --default_params.hostname.allow_ip
• --default_params.hostname.no-allow_ip
**Variable d'environnement** : DEFAULT_PARAMS.HOSTNAME.ALLOW_IP | Le nom de domaine peut être une IP. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.hostname.allow_cidr_network**
**Ligne de commande** :
• --default_params.hostname.allow_cidr_network
• --default_params.hostname.no-allow_cidr_network
**Variable d'environnement** : DEFAULT_PARAMS.HOSTNAME.ALLOW_CIDR_NETWORK | Le nom de domaine peut être un réseau au format CIDR. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.hostname.allow_startswith_dot**
**Ligne de commande** :
• --default_params.hostname.allow_startswith_dot
• --default_params.hostname.no-allow_startswith_dot
**Variable d'environnement** : DEFAULT_PARAMS.HOSTNAME.ALLOW_STARTSWITH_DOT | Le nom de domaine peut démarré par un point. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+
+### Web address
+
+> [!NOTE]
+>
+> **Chemin** : default_params.web_address\
+> `standard`
+
+| Variable | Description | Valeur par défaut | Type | Contrôle des accès | Validateur |
+|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------|---------------------|-------------------------------------------------------------------------------------|----------------------|-------------------------------------------------------------------------------------------|
+| **default_params.web_address.type**
**Ligne de commande** : --default_params.web_address.type
**Variable d'environnement** : DEFAULT_PARAMS.WEB_ADDRESS.TYPE | Type de nom de domaine. | domainname | [`choice`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | **Choix** :
• domainname
• netbios
• hostname
• null |
+| **default_params.web_address.allow_without_dot**
**Ligne de commande** :
• --default_params.web_address.allow_without_dot
• --default_params.web_address.no-allow_without_dot
**Variable d'environnement** : DEFAULT_PARAMS.WEB_ADDRESS.ALLOW_WITHOUT_DOT | Le nom de domaine peut être un nom d'hôte. | true | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.web_address.test_existence**
**Ligne de commande** :
• --default_params.web_address.test_existence
• --default_params.web_address.no-test_existence
**Variable d'environnement** : DEFAULT_PARAMS.WEB_ADDRESS.TEST_EXISTENCE | Le nom de domaine doit exister. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.web_address.allow_ip**
**Ligne de commande** :
• --default_params.web_address.allow_ip
• --default_params.web_address.no-allow_ip
**Variable d'environnement** : DEFAULT_PARAMS.WEB_ADDRESS.ALLOW_IP | Le nom de domaine peut être une IP. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.web_address.allow_cidr_network**
**Ligne de commande** :
• --default_params.web_address.allow_cidr_network
• --default_params.web_address.no-allow_cidr_network
**Variable d'environnement** : DEFAULT_PARAMS.WEB_ADDRESS.ALLOW_CIDR_NETWORK | Le nom de domaine peut être un réseau au format CIDR. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.web_address.allow_startswith_dot**
**Ligne de commande** :
• --default_params.web_address.allow_startswith_dot
• --default_params.web_address.no-allow_startswith_dot
**Variable d'environnement** : DEFAULT_PARAMS.WEB_ADDRESS.ALLOW_STARTSWITH_DOT | Le nom de domaine peut démarré par un point. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.web_address.allow_range**
**Ligne de commande** :
• --default_params.web_address.allow_range
• --default_params.web_address.no-allow_range
**Variable d'environnement** : DEFAULT_PARAMS.WEB_ADDRESS.ALLOW_RANGE | Peut être une plage de port. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.web_address.allow_protocol**
**Ligne de commande** :
• --default_params.web_address.allow_protocol
• --default_params.web_address.no-allow_protocol
**Variable d'environnement** : DEFAULT_PARAMS.WEB_ADDRESS.ALLOW_PROTOCOL | Peut avoir le protocole. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.web_address.allow_zero**
**Ligne de commande** :
• --default_params.web_address.allow_zero
• --default_params.web_address.no-allow_zero
**Variable d'environnement** : DEFAULT_PARAMS.WEB_ADDRESS.ALLOW_ZERO | Port 0 est autorisé. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.web_address.allow_wellknown**
**Ligne de commande** :
• --default_params.web_address.allow_wellknown
• --default_params.web_address.no-allow_wellknown
**Variable d'environnement** : DEFAULT_PARAMS.WEB_ADDRESS.ALLOW_WELLKNOWN | Les ports connus (1 à 1023) sont autorisés. | true | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.web_address.allow_registred**
**Ligne de commande** :
• --default_params.web_address.allow_registred
• --default_params.web_address.no-allow_registred
**Variable d'environnement** : DEFAULT_PARAMS.WEB_ADDRESS.ALLOW_REGISTRED | Les ports enregistrés (1024 à 49151) sont autorisés. | true | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.web_address.allow_private**
**Ligne de commande** :
• --default_params.web_address.allow_private
• --default_params.web_address.no-allow_private
**Variable d'environnement** : DEFAULT_PARAMS.WEB_ADDRESS.ALLOW_PRIVATE | Les ports privés (supérieur à 49152) sont autorisés. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+
+### Port
+
+> [!NOTE]
+>
+> **Chemin** : default_params.port\
+> `standard`
+
+| Variable | Description | Valeur par défaut | Type | Contrôle des accès |
+|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------|---------------------|-------------------------------------------------------------------------------------|----------------------|
+| **default_params.port.allow_range**
**Ligne de commande** :
• --default_params.port.allow_range
• --default_params.port.no-allow_range
**Variable d'environnement** : DEFAULT_PARAMS.PORT.ALLOW_RANGE | Peut être une plage de port. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+| **default_params.port.allow_protocol**
**Ligne de commande** :
• --default_params.port.allow_protocol
• --default_params.port.no-allow_protocol
**Variable d'environnement** : DEFAULT_PARAMS.PORT.ALLOW_PROTOCOL | Peut avoir le protocole. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+| **default_params.port.allow_zero**
**Ligne de commande** :
• --default_params.port.allow_zero
• --default_params.port.no-allow_zero
**Variable d'environnement** : DEFAULT_PARAMS.PORT.ALLOW_ZERO | Port 0 est autorisé. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+| **default_params.port.allow_wellknown**
**Ligne de commande** :
• --default_params.port.allow_wellknown
• --default_params.port.no-allow_wellknown
**Variable d'environnement** : DEFAULT_PARAMS.PORT.ALLOW_WELLKNOWN | Les ports connus (1 à 1023) sont autorisés. | true | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+| **default_params.port.allow_registred**
**Ligne de commande** :
• --default_params.port.allow_registred
• --default_params.port.no-allow_registred
**Variable d'environnement** : DEFAULT_PARAMS.PORT.ALLOW_REGISTRED | Les ports enregistrés (1024 à 49151) sont autorisés. | true | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+| **default_params.port.allow_private**
**Ligne de commande** :
• --default_params.port.allow_private
• --default_params.port.no-allow_private
**Variable d'environnement** : DEFAULT_PARAMS.PORT.ALLOW_PRIVATE | Les ports privés (supérieur à 49152) sont autorisés. | true | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+
+
diff --git a/README.md b/README.md
index debc1d8ae..1e528dd42 100644
--- a/README.md
+++ b/README.md
@@ -1,105 +1,210 @@
-
-
-# Rougail
-
-## Description
-
-Rougail is a free full-featured configuration manager library written in python3.
-
-The configuration is describe in YAML dictionary files.
-
-Those dictionaries are converted into [Tiramisu](https://framagit.org/tiramisu/tiramisu) objects.
-
-Rougail can be incorporated with other technologies and stacks regardless of whether they’re written in Python or not.
-
-## Simple example
-
-Create a directory:
-
-```bash
-# mkdir dict
-```
-
-## Dictionary
-
-A dictionary is a variables description file.
-
-Create the file `dict/dictionary.yml`:
-
-```yml
---
-version: 1.1
-# describe a variable my_first_variable
-# and a family with a variable my_second_variable
-my_first_variable: my_value
-my_family:
- my_second_variable: 1
-```
+gitea: none
+include_toc: true
+---
+[🇬🇧 (EN)](README.md) - [🇫🇷 (FR)](README.fr.md)
-## Generate variable
+| Variable | Description | Default value | Type | Access control | Validator |
+|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------|------------------|----------------------------------------------------------------------------------------------------------------------------------|
+| **default_structural_format_version**
**Command line**: -v, --default_structural_format_version
**Environment variable**: DEFAULT_STRUCTURAL_FORMAT_VERSION | Default version of the structural file format.
This value is only used if the version is not set in the structural file. | | [`choice`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | **Choices**:
• 1.0
• 1.1
• null |
+| **functions_files**
**Command line**: -c, --functions_files
**Environment variable**: FUNCTIONS_FILES | File with functions.
This file contains filters and additional Jinja2 functions usable in structure files. | | [`UNIX filename`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) `multiple` | `standard` | `unique`
• this filename could be a relative path
• this file must exist
• file type allowed: "file". |
+| **modes_level**
**Command line**: --modes_level
**Environment variable**: MODES_LEVEL | All modes level available. | | [`string`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) `multiple` | `standard` | `unique` |
+| **default_family_mode**
**Environment variable**: DEFAULT_FAMILY_MODE | Default mode for a family. | the first one defined in "[All modes level available](#modes_level)" | [`string`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | This mode must be available in "[All modes level available](#modes_level)". |
+| **default_variable_mode**
**Environment variable**: DEFAULT_VARIABLE_MODE | Default mode for a variable. | if the variable "[All modes level available](#modes_level)" is defined, the default value is the second available element, otherwise, the first | [`string`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | This mode must be available in "[All modes level available](#modes_level)". |
+| **base_option_name**
**Environment variable**: BASE_OPTION_NAME | Option name for the base option. | baseoption | [`string`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **export_with_import**
**Environment variable**: EXPORT_WITH_IMPORT | In cache file, do not importation of Tiramisu and other dependencies. | true | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **tiramisu_cache**
**Command line**: -t, --tiramisu_cache
**Environment variable**: TIRAMISU_CACHE | Store Tiramisu cache filename.
This file contains the Tiramisu instructions used internally to load the variables.
This file can be used for debugging. | | [`UNIX filename`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | • this filename could be a relative path
• file type allowed: "file". |
+| **internal_functions**
**Environment variable**: INTERNAL_FUNCTIONS | Name of internal functions that we can use as a function. | | [`string`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) `multiple` | `standard` | |
+| ****
**Environment variable**: EXTRA_ANNOTATORS | Name of extra annotators. | | [`string`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) `multiple` | `standard` | |
+| **suffix**
**Environment variable**: SUFFIX | Suffix add to generated options name. | | [`string`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **force_optional**
**Command line**:
• --force_optional
• --no-force_optional
**Environment variable**: FORCE_OPTIONAL | Every variables in calculation are optionals. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) `mandatory` | `standard` | |
+| **load_unexist_redefine**
**Environment variable**: LOAD_UNEXIST_REDEFINE | Loads redefine variables even if there don't already exists. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
-### With commandline:
+## The secret manager
-```bash
-# rougail -m dict
-Variables:
-┣━━ 📓 my_first_variable: my_value
-┗━━ 📂 my_family
- ┗━━ 📓 my_second_variable: 1
+> [!NOTE]
+>
+> **Path**: secret_manager\
+> `standard`
-```
+| Variable | Description | Default value | Type | Access control |
+|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------|------------------------------------------------------------------------------------------------|------------------|
+| **secret_manager.pattern**
**Command line**: --secret_manager.pattern
**Environment variable**: SECRET_MANAGER.PATTERN | The secret pattern to constructing the name of the item searched for in the secret manager.
The pattern is in Jinja2 format. | {{ project }} - {{ environment }} - {{ service }} - {{ user }} | [`string`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) `mandatory` | `standard` |
-### With default value:
+## Load and exporter steps
-Here is a python3 example file:
+> [!NOTE]
+>
+> **Path**: step\
+> `standard`
-```python
-from rougail import Rougail, RougailConfig
-from pprint import pprint
+| Variable | Description | Default value | Type | Access control | Validator |
+|-------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------|------------------|------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| **step.structural**
**Environment variable**: STEP.STRUCTURAL | Select for structural. | • directory | [`choice`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) `multiple` | `standard` | **Choices**:
• directory
• string
• commandline
• risotto
• bitwarden |
+| **step.user_data**
**Command line**: -u, --step.user_data
**Environment variable**: STEP.USER_DATA | Select for user datas. | | [`choice`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) `multiple` | `standard` *`disabled`*
**Disabled**: _('cannot load user data for doc output') | `unique`
**Choices**:
• yaml
• environment
• commandline
• ansible
• questionary
• risotto
• bitwarden |
+| **step.output**
**Command line**: -o, --step.output
**Environment variable**: STEP.OUTPUT | Select for output. | display | [`choice`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) `mandatory` | `standard` | **Choices**:
• display
• json
• doc
• table
• ansible |
-RougailConfig['dictionaries_dir'] = ['dict']
-rougail = Rougail()
-config = rougail.run()
-pprint(config.value.get(), sort_dicts=False)
-```
+| Variable | Description | Default value | Type | Access control |
+|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------|-----------------|-------------------------------------------------------------------------------------------------|------------------|
+| **define_default_params**
**Command line**:
• --define_default_params
• --no-define_default_params
**Environment variable**: DEFINE_DEFAULT_PARAMS | Override default parameters for option type. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) `mandatory` | `standard` |
-The result is:
+## Default parameters for option type
-```json
-{: {: 'my_value',
- : {: 1}}}
-```
+> [!NOTE]
+>
+> **Path**: default_params\
+> `standard` *`disabled`*\
+> **Disabled**: when the variable "[Override default parameters for option type](#define_default_params)" has the value "false"
-### With modified value
+### UNIX filename
+
+> [!NOTE]
+>
+> **Path**: default_params.unix_filename\
+> `standard`
+
+| Variable | Description | Default value | Type | Access control | Validator |
+|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------|----------------------------------|-----------------------------------------------------------------------------------------------|------------------|-----------------------------------------------------------------|
+| **default_params.unix_filename.allow_relative**
**Command line**:
• --default_params.unix_filename.allow_relative
• --default_params.unix_filename.no-allow_relative
**Environment variable**: DEFAULT_PARAMS.UNIX_FILENAME.ALLOW_RELATIVE | This filename could be a relative path. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.unix_filename.test_existence**
**Command line**:
• --default_params.unix_filename.test_existence
• --default_params.unix_filename.no-test_existence
**Environment variable**: DEFAULT_PARAMS.UNIX_FILENAME.TEST_EXISTENCE | This file must exist. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.unix_filename.types**
**Command line**: --default_params.unix_filename.types
**Environment variable**: DEFAULT_PARAMS.UNIX_FILENAME.TYPES | File type allowed. | • file
• directory | [`choice`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) `multiple` | `standard` | `unique`
**Choices**:
• file
• directory |
+
+### IP
+
+> [!NOTE]
+>
+> **Path**: default_params.ip\
+> `standard`
+
+| Variable | Description | Default value | Type | Access control |
+|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------|-----------------|-------------------------------------------------------------------------------------|------------------|
+| **default_params.ip.private_only**
**Command line**:
• --default_params.ip.private_only
• --default_params.ip.no-private_only
**Environment variable**: DEFAULT_PARAMS.IP.PRIVATE_ONLY | Private IP are allowed. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+| **default_params.ip.allow_reserved**
**Command line**:
• --default_params.ip.allow_reserved
• --default_params.ip.no-allow_reserved
**Environment variable**: DEFAULT_PARAMS.IP.ALLOW_RESERVED | Reserved IP are allowed. | true | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+| **default_params.ip.cidr**
**Command line**:
• --default_params.ip.cidr
• --default_params.ip.no-cidr
**Environment variable**: DEFAULT_PARAMS.IP.CIDR | IP must be in CIDR format. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+
+### CIDR
+
+> [!NOTE]
+>
+> **Path**: default_params.cidr\
+> `standard`
+
+| Variable | Description | Default value | Type | Access control |
+|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------|-----------------|-------------------------------------------------------------------------------------|------------------|
+| **default_params.cidr.private_only**
**Command line**:
• --default_params.cidr.private_only
• --default_params.cidr.no-private_only
**Environment variable**: DEFAULT_PARAMS.CIDR.PRIVATE_ONLY | Private IP are allowed. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+| **default_params.cidr.allow_reserved**
**Command line**:
• --default_params.cidr.allow_reserved
• --default_params.cidr.no-allow_reserved
**Environment variable**: DEFAULT_PARAMS.CIDR.ALLOW_RESERVED | Reserved IP are allowed. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+| **default_params.cidr.cidr**
**Command line**:
• --default_params.cidr.cidr
• --default_params.cidr.no-cidr
**Environment variable**: DEFAULT_PARAMS.CIDR.CIDR | IP must be in CIDR format. | true | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+
+### Network
+
+> [!NOTE]
+>
+> **Path**: default_params.network\
+> `standard`
+
+| Variable | Description | Default value | Type | Access control |
+|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------|-----------------|-------------------------------------------------------------------------------------|------------------|
+| **default_params.network.private_only**
**Command line**:
• --default_params.network.private_only
• --default_params.network.no-private_only
**Environment variable**: DEFAULT_PARAMS.NETWORK.PRIVATE_ONLY | Private network are allowed. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+| **default_params.network.allow_reserved**
**Command line**:
• --default_params.network.allow_reserved
• --default_params.network.no-allow_reserved
**Environment variable**: DEFAULT_PARAMS.NETWORK.ALLOW_RESERVED | Reserved network are allowed. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+| **default_params.network.cidr**
**Command line**:
• --default_params.network.cidr
• --default_params.network.no-cidr
**Environment variable**: DEFAULT_PARAMS.NETWORK.CIDR | Network must be in CIDR format. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+
+### Network CIDR
+
+> [!NOTE]
+>
+> **Path**: default_params.network_cidr\
+> `standard`
+
+| Variable | Description | Default value | Type | Access control |
+|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------|-----------------|-------------------------------------------------------------------------------------|------------------|
+| **default_params.network_cidr.private_only**
**Command line**:
• --default_params.network_cidr.private_only
• --default_params.network_cidr.no-private_only
**Environment variable**: DEFAULT_PARAMS.NETWORK_CIDR.PRIVATE_ONLY | Private network are allowed. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+| **default_params.network_cidr.allow_reserved**
**Command line**:
• --default_params.network_cidr.allow_reserved
• --default_params.network_cidr.no-allow_reserved
**Environment variable**: DEFAULT_PARAMS.NETWORK_CIDR.ALLOW_RESERVED | Reserved network are allowed. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+| **default_params.network_cidr.cidr**
**Command line**:
• --default_params.network_cidr.cidr
• --default_params.network_cidr.no-cidr
**Environment variable**: DEFAULT_PARAMS.NETWORK_CIDR.CIDR | Network must be in CIDR format. | true | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+
+### Netbios
+
+> [!NOTE]
+>
+> **Path**: default_params.netbios\
+> `standard`
+
+| Variable | Description | Default value | Type | Access control | Validator |
+|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------|-----------------|-------------------------------------------------------------------------------------|------------------|--------------------------------------------------------------------------------------------|
+| **default_params.netbios.type**
**Command line**: --default_params.netbios.type
**Environment variable**: DEFAULT_PARAMS.NETBIOS.TYPE | Type of domainname. | netbios | [`choice`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | **Choices**:
• domainname
• netbios
• hostname
• null |
+| **default_params.netbios.allow_without_dot**
**Command line**:
• --default_params.netbios.allow_without_dot
• --default_params.netbios.no-allow_without_dot
**Environment variable**: DEFAULT_PARAMS.NETBIOS.ALLOW_WITHOUT_DOT | The domain name can be a hostname. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.netbios.test_existence**
**Command line**:
• --default_params.netbios.test_existence
• --default_params.netbios.no-test_existence
**Environment variable**: DEFAULT_PARAMS.NETBIOS.TEST_EXISTENCE | The domain name must exist. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.netbios.allow_ip**
**Command line**:
• --default_params.netbios.allow_ip
• --default_params.netbios.no-allow_ip
**Environment variable**: DEFAULT_PARAMS.NETBIOS.ALLOW_IP | The domain name can be an IP. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.netbios.allow_cidr_network**
**Command line**:
• --default_params.netbios.allow_cidr_network
• --default_params.netbios.no-allow_cidr_network
**Environment variable**: DEFAULT_PARAMS.NETBIOS.ALLOW_CIDR_NETWORK | The domain name can be network in CIDR format. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.netbios.allow_startswith_dot**
**Command line**:
• --default_params.netbios.allow_startswith_dot
• --default_params.netbios.no-allow_startswith_dot
**Environment variable**: DEFAULT_PARAMS.NETBIOS.ALLOW_STARTSWITH_DOT | The domain name can starts by a dot. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+
+### Domainname
+
+> [!NOTE]
+>
+> **Path**: default_params.domainname\
+> `standard`
+
+| Variable | Description | Default value | Type | Access control | Validator |
+|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------|-----------------|-------------------------------------------------------------------------------------|------------------|--------------------------------------------------------------------------------------------|
+| **default_params.domainname.type**
**Command line**: --default_params.domainname.type
**Environment variable**: DEFAULT_PARAMS.DOMAINNAME.TYPE | Type of domainname. | domainname | [`choice`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | **Choices**:
• domainname
• netbios
• hostname
• null |
+| **default_params.domainname.allow_without_dot**
**Command line**:
• --default_params.domainname.allow_without_dot
• --default_params.domainname.no-allow_without_dot
**Environment variable**: DEFAULT_PARAMS.DOMAINNAME.ALLOW_WITHOUT_DOT | The domain name can be a hostname. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.domainname.test_existence**
**Command line**:
• --default_params.domainname.test_existence
• --default_params.domainname.no-test_existence
**Environment variable**: DEFAULT_PARAMS.DOMAINNAME.TEST_EXISTENCE | The domain name must exist. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.domainname.allow_ip**
**Command line**:
• --default_params.domainname.allow_ip
• --default_params.domainname.no-allow_ip
**Environment variable**: DEFAULT_PARAMS.DOMAINNAME.ALLOW_IP | The domain name can be an IP. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.domainname.allow_cidr_network**
**Command line**:
• --default_params.domainname.allow_cidr_network
• --default_params.domainname.no-allow_cidr_network
**Environment variable**: DEFAULT_PARAMS.DOMAINNAME.ALLOW_CIDR_NETWORK | The domain name can be network in CIDR format. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.domainname.allow_startswith_dot**
**Command line**:
• --default_params.domainname.allow_startswith_dot
• --default_params.domainname.no-allow_startswith_dot
**Environment variable**: DEFAULT_PARAMS.DOMAINNAME.ALLOW_STARTSWITH_DOT | The domain name can starts by a dot. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+
+### Hostname
+
+> [!NOTE]
+>
+> **Path**: default_params.hostname\
+> `standard`
+
+| Variable | Description | Default value | Type | Access control | Validator |
+|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------|-----------------|-------------------------------------------------------------------------------------|------------------|--------------------------------------------------------------------------------------------|
+| **default_params.hostname.type**
**Command line**: --default_params.hostname.type
**Environment variable**: DEFAULT_PARAMS.HOSTNAME.TYPE | Type of domainname. | hostname | [`choice`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | **Choices**:
• domainname
• netbios
• hostname
• null |
+| **default_params.hostname.allow_without_dot**
**Command line**:
• --default_params.hostname.allow_without_dot
• --default_params.hostname.no-allow_without_dot
**Environment variable**: DEFAULT_PARAMS.HOSTNAME.ALLOW_WITHOUT_DOT | The domain name can be a hostname. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.hostname.test_existence**
**Command line**:
• --default_params.hostname.test_existence
• --default_params.hostname.no-test_existence
**Environment variable**: DEFAULT_PARAMS.HOSTNAME.TEST_EXISTENCE | The domain name must exist. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.hostname.allow_ip**
**Command line**:
• --default_params.hostname.allow_ip
• --default_params.hostname.no-allow_ip
**Environment variable**: DEFAULT_PARAMS.HOSTNAME.ALLOW_IP | The domain name can be an IP. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.hostname.allow_cidr_network**
**Command line**:
• --default_params.hostname.allow_cidr_network
• --default_params.hostname.no-allow_cidr_network
**Environment variable**: DEFAULT_PARAMS.HOSTNAME.ALLOW_CIDR_NETWORK | The domain name can be network in CIDR format. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.hostname.allow_startswith_dot**
**Command line**:
• --default_params.hostname.allow_startswith_dot
• --default_params.hostname.no-allow_startswith_dot
**Environment variable**: DEFAULT_PARAMS.HOSTNAME.ALLOW_STARTSWITH_DOT | The domain name can starts by a dot. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+
+### Web address
+
+> [!NOTE]
+>
+> **Path**: default_params.web_address\
+> `standard`
+
+| Variable | Description | Default value | Type | Access control | Validator |
+|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------|-----------------|-------------------------------------------------------------------------------------|------------------|--------------------------------------------------------------------------------------------|
+| **default_params.web_address.type**
**Command line**: --default_params.web_address.type
**Environment variable**: DEFAULT_PARAMS.WEB_ADDRESS.TYPE | Type of domainname. | domainname | [`choice`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | **Choices**:
• domainname
• netbios
• hostname
• null |
+| **default_params.web_address.allow_without_dot**
**Command line**:
• --default_params.web_address.allow_without_dot
• --default_params.web_address.no-allow_without_dot
**Environment variable**: DEFAULT_PARAMS.WEB_ADDRESS.ALLOW_WITHOUT_DOT | The domain name can be a hostname. | true | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.web_address.test_existence**
**Command line**:
• --default_params.web_address.test_existence
• --default_params.web_address.no-test_existence
**Environment variable**: DEFAULT_PARAMS.WEB_ADDRESS.TEST_EXISTENCE | The domain name must exist. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.web_address.allow_ip**
**Command line**:
• --default_params.web_address.allow_ip
• --default_params.web_address.no-allow_ip
**Environment variable**: DEFAULT_PARAMS.WEB_ADDRESS.ALLOW_IP | The domain name can be an IP. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.web_address.allow_cidr_network**
**Command line**:
• --default_params.web_address.allow_cidr_network
• --default_params.web_address.no-allow_cidr_network
**Environment variable**: DEFAULT_PARAMS.WEB_ADDRESS.ALLOW_CIDR_NETWORK | The domain name can be network in CIDR format. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.web_address.allow_startswith_dot**
**Command line**:
• --default_params.web_address.allow_startswith_dot
• --default_params.web_address.no-allow_startswith_dot
**Environment variable**: DEFAULT_PARAMS.WEB_ADDRESS.ALLOW_STARTSWITH_DOT | The domain name can starts by a dot. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.web_address.allow_range**
**Command line**:
• --default_params.web_address.allow_range
• --default_params.web_address.no-allow_range
**Environment variable**: DEFAULT_PARAMS.WEB_ADDRESS.ALLOW_RANGE | Can be range of port. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.web_address.allow_protocol**
**Command line**:
• --default_params.web_address.allow_protocol
• --default_params.web_address.no-allow_protocol
**Environment variable**: DEFAULT_PARAMS.WEB_ADDRESS.ALLOW_PROTOCOL | Can have the protocol. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.web_address.allow_zero**
**Command line**:
• --default_params.web_address.allow_zero
• --default_params.web_address.no-allow_zero
**Environment variable**: DEFAULT_PARAMS.WEB_ADDRESS.ALLOW_ZERO | Port 0 is allowed. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.web_address.allow_wellknown**
**Command line**:
• --default_params.web_address.allow_wellknown
• --default_params.web_address.no-allow_wellknown
**Environment variable**: DEFAULT_PARAMS.WEB_ADDRESS.ALLOW_WELLKNOWN | Well-known ports (1 to 1023) are allowed. | true | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.web_address.allow_registred**
**Command line**:
• --default_params.web_address.allow_registred
• --default_params.web_address.no-allow_registred
**Environment variable**: DEFAULT_PARAMS.WEB_ADDRESS.ALLOW_REGISTRED | Registred ports (1024 to 49151) are allowed. | true | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+| **default_params.web_address.allow_private**
**Command line**:
• --default_params.web_address.allow_private
• --default_params.web_address.no-allow_private
**Environment variable**: DEFAULT_PARAMS.WEB_ADDRESS.ALLOW_PRIVATE | Private ports (greater than 49152) are allowed. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` | |
+
+### Port
+
+> [!NOTE]
+>
+> **Path**: default_params.port\
+> `standard`
+
+| Variable | Description | Default value | Type | Access control |
+|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------|-----------------|-------------------------------------------------------------------------------------|------------------|
+| **default_params.port.allow_range**
**Command line**:
• --default_params.port.allow_range
• --default_params.port.no-allow_range
**Environment variable**: DEFAULT_PARAMS.PORT.ALLOW_RANGE | Can be range of port. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+| **default_params.port.allow_protocol**
**Command line**:
• --default_params.port.allow_protocol
• --default_params.port.no-allow_protocol
**Environment variable**: DEFAULT_PARAMS.PORT.ALLOW_PROTOCOL | Can have the protocol. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+| **default_params.port.allow_zero**
**Command line**:
• --default_params.port.allow_zero
• --default_params.port.no-allow_zero
**Environment variable**: DEFAULT_PARAMS.PORT.ALLOW_ZERO | Port 0 is allowed. | false | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+| **default_params.port.allow_wellknown**
**Command line**:
• --default_params.port.allow_wellknown
• --default_params.port.no-allow_wellknown
**Environment variable**: DEFAULT_PARAMS.PORT.ALLOW_WELLKNOWN | Well-known ports (1 to 1023) are allowed. | true | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+| **default_params.port.allow_registred**
**Command line**:
• --default_params.port.allow_registred
• --default_params.port.no-allow_registred
**Environment variable**: DEFAULT_PARAMS.PORT.ALLOW_REGISTRED | Registred ports (1024 to 49151) are allowed. | true | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
+| **default_params.port.allow_private**
**Command line**:
• --default_params.port.allow_private
• --default_params.port.no-allow_private
**Environment variable**: DEFAULT_PARAMS.PORT.ALLOW_PRIVATE | Private ports (greater than 49152) are allowed. | true | [`boolean`](https://rougail.readthedocs.io/en/latest/variable.html#variables-types) | `standard` |
-Use [Tiramisu](https://framagit.org/tiramisu/tiramisu) API to change values:
-
-```python
-from rougail import Rougail, RougailConfig
-from pprint import pprint
-
-RougailConfig['dictionaries_dir'] = ['dict']
-rougail = Rougail()
-config = rougail.get_config()
-config.option('rougail.my_first_variable').value.set('modified_value')
-config.option('rougail.my_family.my_second_variable').value.set(2)
-pprint(config.value.get(), sort_dicts=False)
-```
-
-The destination file is generated with new values:
-
-```json
-{: {: 'modified_value',
- : {: 2}}}
-```
-
-# Link
-
-* [Documentation](https://rougail.readthedocs.io/en/latest/)
-* [Licence ](LICENSE)
-
-# Related projects
-
-* [Tiramisu](https://forge.cloud.silique.fr/gnunux/tiramisu)
-* [Risotto](https://cloud.silique.fr/gitea/risotto/risotto)
diff --git a/locale/fr/LC_MESSAGES/rougail.po b/locale/fr/LC_MESSAGES/rougail.po
index d753b707b..19449893d 100644
--- a/locale/fr/LC_MESSAGES/rougail.po
+++ b/locale/fr/LC_MESSAGES/rougail.po
@@ -5,8 +5,8 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"POT-Creation-Date: 2025-11-21 08:31+0100\n"
-"PO-Revision-Date: 2025-11-21 08:31+0100\n"
+"POT-Creation-Date: 2025-12-22 08:45+0100\n"
+"PO-Revision-Date: 2025-12-22 08:46+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: fr\n"
@@ -185,79 +185,146 @@ msgid ""
msgstr ""
"la variable \"{0}\" a la valeur par défaut invalide \"{1}\" devrait être {2}"
-#: src/rougail/config/__init__.py:276
-msgid "Structure format version by default, if not specified in structure file"
+#: src/rougail/config/__init__.py:271
+msgid "Default version of the structural file format"
+msgstr "Version par défaut du format des fichiers de structure"
+
+#: src/rougail/config/__init__.py:272
+msgid ""
+"This value is only used if the version is not set in the structural file"
msgstr ""
-"La version du format de la structure par défaut, si non spécifier dans le "
+"Cette valeur n'est utilisée que si la version n'est pas définie dans le "
"fichier de structure"
-#: src/rougail/config/__init__.py:284
+#: src/rougail/config/__init__.py:280
msgid "File with functions"
msgstr "Fichier avec les fonctions"
-#: src/rougail/config/__init__.py:296
+#: src/rougail/config/__init__.py:281
+msgid ""
+"This file contains filters and additional Jinja2 functions usable in "
+"structure files"
+msgstr ""
+"Ce fichier contient des filtres et des fonctions Jinja2 supplémentaires "
+"utilisables dans les fichiers de structure"
+
+#: src/rougail/config/__init__.py:293
msgid "All modes level available"
msgstr "Tous les niveaux de modes valides"
-#: src/rougail/config/__init__.py:308
+#: src/rougail/config/__init__.py:305
msgid "Default mode for a family"
msgstr "Mode par défaut pour une famille"
+#: src/rougail/config/__init__.py:311
+msgid "the first one defined in \"modes_level\""
+msgstr "le premier défini dans \"modes_level\""
+
+#: src/rougail/config/__init__.py:317 src/rougail/config/__init__.py:344
+msgid "when no mode is defined in \"modes_level\""
+msgstr "si aucun mode n'est défini dans \"modes_level\""
+
+#: src/rougail/config/__init__.py:324 src/rougail/config/__init__.py:351
+msgid "this mode must be available in \"modes_level\""
+msgstr "ce mode doit être disponible dans \"modes_level\""
+
#: src/rougail/config/__init__.py:328
msgid "Default mode for a variable"
msgstr "Mode par défaut pour une variable"
-#: src/rougail/config/__init__.py:352
+#: src/rougail/config/__init__.py:338
+msgid ""
+"if the variable \"modes_level\" is defined, the default value is the second "
+"available element, otherwise, the first"
+msgstr ""
+"si la variable \"modes_level\" est définit, la valeur par défaut est le "
+"second élément disponible, sinon, le premier"
+
+#: src/rougail/config/__init__.py:355
msgid "Option name for the base option"
msgstr "Nom de l'option pour l'option de base"
-#: src/rougail/config/__init__.py:357
+#: src/rougail/config/__init__.py:360
msgid "In cache file, do not importation of Tiramisu and other dependencies"
msgstr ""
"Dans le fichier de cache, ne pas importer Tiramisu et autres dépendances"
-#: src/rougail/config/__init__.py:362
-msgid "Tiramisu cache filename"
-msgstr "Nom du fichier du cache Tiramisu"
+#: src/rougail/config/__init__.py:365
+#, fuzzy
+#| msgid "Store tiramisu cache filename"
+msgid "Store Tiramisu cache filename"
+msgstr "Enregistrer le cache Tiramisu dans le fichier"
-#: src/rougail/config/__init__.py:370
+#: src/rougail/config/__init__.py:366
+msgid ""
+"This file contains the Tiramisu instructions used internally to load the "
+"variables.\n"
+"\n"
+"This file can be used for debugging"
+msgstr ""
+"Ce fichier contient les instructions Tiramisu utilisé en interne pour "
+"charger les variables.\n"
+"\n"
+"Ce fichier peut être utilisé pour le débogage."
+
+#: src/rougail/config/__init__.py:376
msgid "Name of internal functions that we can use as a function"
msgstr ""
"Nom des fonctions internes qu'il est possible d'utiliser comme fonction"
-#: src/rougail/config/__init__.py:376
+#: src/rougail/config/__init__.py:382
msgid "Name of extra annotators"
msgstr "Nom des annotators supplémentaires"
-#: src/rougail/config/__init__.py:382
+#: src/rougail/config/__init__.py:388
msgid "Suffix add to generated options name"
msgstr "Suffix ajouté pour généré le nom des options"
-#: src/rougail/config/__init__.py:388
+#: src/rougail/config/__init__.py:394
msgid "Every variables in calculation are optionals"
msgstr "Toutes les variables dans un calcul sont optionnelles"
-#: src/rougail/config/__init__.py:392
+#: src/rougail/config/__init__.py:398
msgid "Loads redefine variables even if there don't already exists"
msgstr "Charger les variables redéfinis même si elles n'existe pas"
-#: src/rougail/config/__init__.py:399
-msgid "The secret pattern to build item name in Bitwarden"
-msgstr "Le patron de secret pour construire le nom de l'élément dans Bitwarden"
+#: src/rougail/config/__init__.py:402
+msgid "The secret manager"
+msgstr "Le gestionnaire de secret"
-#: src/rougail/config/__init__.py:400
-msgid "The pattern is in Jinja format"
-msgstr "Le patron est au format Jinja"
+#: src/rougail/config/__init__.py:405
+msgid ""
+"The secret pattern to constructing the name of the item searched for in the "
+"secret manager"
+msgstr ""
+"Le modèle de secret permettant de construire le nom de l'élément recherché "
+"dans le gestionnaire de secrets"
-#: src/rougail/config/__init__.py:428
+#: src/rougail/config/__init__.py:406
+msgid "The pattern is in Jinja2 format"
+msgstr "Le modèle est au format Jinja2"
+
+#: src/rougail/config/__init__.py:415
+msgid "structural"
+msgstr "structure"
+
+#: src/rougail/config/__init__.py:416
+msgid "user datas"
+msgstr "données utilisateur"
+
+#: src/rougail/config/__init__.py:417
+msgid "output"
+msgstr "sortie"
+
+#: src/rougail/config/__init__.py:438
msgid "Select for {0}"
msgstr "Sélection pour {0}"
-#: src/rougail/config/__init__.py:508
+#: src/rougail/config/__init__.py:500
msgid "Override default parameters for option type"
msgstr "Sur charger les paramètre par défaut pour le type d'option"
-#: src/rougail/config/__init__.py:511
+#: src/rougail/config/__init__.py:503
msgid "Default parameters for option type"
msgstr "Paramètre par défaut pour le type d'option"
@@ -296,42 +363,42 @@ msgstr ""
"définition invalide pour la définition des \"structures\" ({0}), aucun "
"fichier de structure ne peut être chargé !"
-#: src/rougail/convert/object_model.py:121
+#: src/rougail/convert/object_model.py:132
msgid "cannot find variable \"{0}\" defined in attribute \"{1}\" for \"{2}\""
msgstr ""
"ne peut trouver la variable \"{0}\" défini dans l'attribut \"{1}\" pour "
"\"{2}\""
-#: src/rougail/convert/object_model.py:127
+#: src/rougail/convert/object_model.py:138
msgid ""
"the variable \"{0}\" is in fact a family in attribute \"{1}\" for \"{2}\""
msgstr ""
"la variable \"{0}\" est en faite une famille dans l'attribut \"{1}\" pour "
"\"{2}\""
-#: src/rougail/convert/object_model.py:132
-#: src/rougail/convert/object_model.py:513
+#: src/rougail/convert/object_model.py:143
+#: src/rougail/convert/object_model.py:527
msgid "unknown object \"{0}\" in attribute \"{1}\" for \"{2}\""
msgstr "objet inconnu \"{0}\" dans l'attribut \"{1}\" pour \"{2}\""
-#: src/rougail/convert/object_model.py:151
+#: src/rougail/convert/object_model.py:162
msgid ""
"identifier parameter for \"{0}\" in \"{1}\" cannot be set none dynamic family"
msgstr ""
"le paramètre identifier pour \"{0}\" dans \"{1}\" ne peut être placé pour "
"une famille non dynamique"
-#: src/rougail/convert/object_model.py:180
+#: src/rougail/convert/object_model.py:191
msgid "cannot find variable \"{0}\" defined in \"{1}\" for \"{2}\""
msgstr "ne peut trouver la variable \"{0}\" défini dans \"{1}\" pour \"{2}\""
-#: src/rougail/convert/object_model.py:185
+#: src/rougail/convert/object_model.py:196
msgid "variable \"{0}\" defined in \"{1}\" for \"{2}\" is a dynamic variable"
msgstr ""
"la variable \"{0}\" défini dans \"{1}\" pour \"{2}\" est une variable "
"dynamique"
-#: src/rougail/convert/object_model.py:202
+#: src/rougail/convert/object_model.py:213
msgid ""
"the variable \"{0}\" is not a follower, so cannot have index type for param "
"in \"{1}\""
@@ -339,7 +406,7 @@ msgstr ""
"la variable \"{0}\" n'est pas suiveuse, donc ne peut avoir de type index "
"comme paramètre dans \"{1}\""
-#: src/rougail/convert/object_model.py:252
+#: src/rougail/convert/object_model.py:263
msgid ""
"\"warnings\" are only available with attribute \"{self.attribute_name}\" for "
"variable \"{self.ori_path}\""
@@ -347,16 +414,16 @@ msgstr ""
"\"warnings\" est seulement utilisable avec l'attribut \"{self.attribute_name}"
"\" pour la variable \"{self.ori_path}\""
-#: src/rougail/convert/object_model.py:314
+#: src/rougail/convert/object_model.py:325
msgid ""
"the variable \"{0}\" has a depreciated return_type \"{1}\", please use "
-"\"{2}\" instead in \"{3}\""
+"\"{2}\" instead in {3}"
msgstr ""
"la variable \"{0}\" a un attribut return_type déprécié \"{1}\", veuillez "
-"utiliser\"{2}\" au lieu de \"{3}\""
+"utiliser \"{2}\" au lieu de \"{3}\""
-#: src/rougail/convert/object_model.py:404
-#: src/rougail/convert/object_model.py:435
+#: src/rougail/convert/object_model.py:415
+#: src/rougail/convert/object_model.py:446
msgid ""
"variable \"{0}\" has a calculating \"{1}\" with an invalid return_type, "
"should be boolean or string, not \"{2}\""
@@ -364,7 +431,7 @@ msgstr ""
"la variable \"{0}\" a un calcul \"{1}\" avec un return_type invalide, "
"devrait être un booléen ou une chaîne de caractère, et pas \"{2}\""
-#: src/rougail/convert/object_model.py:411
+#: src/rougail/convert/object_model.py:422
msgid ""
"the variable \"{0}\" has a return_type \"{1}\", for attribute \"{2}\" but "
"has not description in {3}"
@@ -372,11 +439,11 @@ msgstr ""
"la variable \"{0}\" a un return_type \"{1}\", pour l'attribut \"{2}\" mais "
"n'a pas de description dans {3}"
-#: src/rougail/convert/object_model.py:416
+#: src/rougail/convert/object_model.py:427
msgid "value is invalid"
msgstr "la valeur est invalide"
-#: src/rougail/convert/object_model.py:508
+#: src/rougail/convert/object_model.py:522
msgid ""
"a variable \"{0}\" is needs in attribute \"{1}\" for \"{2}\" but it's a "
"family"
@@ -384,7 +451,7 @@ msgstr ""
"une variable \"{0}\" est nécessaire pour l'attribut \"{1}\" pour \"{2}\" "
"mais c'est une famille"
-#: src/rougail/convert/object_model.py:533
+#: src/rougail/convert/object_model.py:547
msgid ""
"variable \"{0}\" has an attribute \"{1}\" calculated with the unknown "
"variable \"{2}\""
@@ -392,7 +459,7 @@ msgstr ""
"la variable \"{0}\" a un attribut invalide \"{1}\" calculé avec la variable "
"inconnue \"{2}\""
-#: src/rougail/convert/object_model.py:585
+#: src/rougail/convert/object_model.py:599
msgid ""
"the variable \"{0}\" has an invalid \"{1}\" the variable \"{2}\" is in a sub "
"dynamic option"
@@ -400,14 +467,14 @@ msgstr ""
"la variable \"{0}\" a un attribut invalide \"{1}\", la variable \"{2}\" est "
"dans une sous option dynamique"
-#: src/rougail/convert/object_model.py:594
+#: src/rougail/convert/object_model.py:608
msgid ""
"the leader \"{0}\" has an invalid \"{1}\" the follower \"{2}\" is a multi"
msgstr ""
"la variable meneuse \"{0}\" a un attribut invalide \"{1}\", la variable "
"suiveuse \"{2}\" est multiple"
-#: src/rougail/convert/object_model.py:636
+#: src/rougail/convert/object_model.py:650
msgid ""
"the variable \"{0}\" has an invalid attribute \"{1}\", the variable \"{2}\" "
"must not be multi"
@@ -415,7 +482,7 @@ msgstr ""
"la variable \"{0}\" a un attribut invalide \"{1}\", la variable \"{2}\" ne "
"doit pas être multiple"
-#: src/rougail/convert/object_model.py:650
+#: src/rougail/convert/object_model.py:664
msgid ""
"the variable \"{0}\" has an invalid attribute \"{1}\", the variable must not "
"be a multi or the variable \"{2}\" must be multi"
@@ -423,7 +490,7 @@ msgstr ""
"la variable \"{0}\" a un attribut invalide \"{1}\", la variable ne doit pas "
"être multiple ou la variable \"{2}\" doit être multiple"
-#: src/rougail/convert/object_model.py:664
+#: src/rougail/convert/object_model.py:678
msgid ""
"the variable \"{0}\" has an invalid attribute \"{1}\", the variable must be "
"a multi or the variable \"{2}\" must not be multi"
@@ -431,7 +498,7 @@ msgstr ""
"la variable \"{0}\" a un attribut invalide \"{1}\", la variable doit être "
"multiple ou la variable \"{2}\" ne doit pas être multiple"
-#: src/rougail/convert/object_model.py:678
+#: src/rougail/convert/object_model.py:692
msgid ""
"the variable \"{0}\" has an invalid attribute \"{1}\", the variable \"{2}\" "
"is multi but is inside a list"
@@ -439,7 +506,7 @@ msgstr ""
"la variable \"{0}\" a un attribut invalide \"{1}\", la variable \"{2}\" est "
"multiple mais est dans une liste"
-#: src/rougail/convert/object_model.py:700
+#: src/rougail/convert/object_model.py:714
msgid ""
"the variable \"{0}\" is waiting for a list as \"{1}\" but the attribute "
"\"default\" is not a list (\"{2}\")"
@@ -447,7 +514,7 @@ msgstr ""
"la variable \"{0}\" attend une liste comme \"{1}\" mais l'attribut "
"\"default\" n'est pas une liste \"{2}\""
-#: src/rougail/convert/object_model.py:704
+#: src/rougail/convert/object_model.py:718
msgid ""
"the variable \"{0}\" is not waiting for a list as \"{1}\" but the attribute "
"\"default\" is a list (\"{2}\")"
@@ -455,7 +522,7 @@ msgstr ""
"la variable \"{0}\" n'attend pas une liste comme \"{1}\" mais l'attribut "
"\"default\" est une liste \"{2}\""
-#: src/rougail/convert/object_model.py:726
+#: src/rougail/convert/object_model.py:740
msgid ""
"\"{0}\" attribut shall not have an \"optional\" attribute without the "
"\"default\" attribute for variable \"{1}\""
@@ -463,7 +530,7 @@ msgstr ""
"l'attribut \"{0}\" ne devrait pas avoir d'attribut \"optional\" sans "
"l'attribut \"default\" pour la variable \"{1}\""
-#: src/rougail/convert/object_model.py:748
+#: src/rougail/convert/object_model.py:762
msgid ""
"variable \"{0}\" has a default value calculated with \"{1}\" which has "
"incompatible type"
@@ -471,7 +538,7 @@ msgstr ""
"la variable \"{0}\" a une valeur par défaut calculé a partir de \"{1}\" "
"laquelle a un type incompatible"
-#: src/rougail/convert/object_model.py:790
+#: src/rougail/convert/object_model.py:804
msgid ""
"the variable \"{0}\" is waiting for a boolean as \"{1}\" but the attribute "
"\"default\" is not a boolean (\"{2}\")"
@@ -479,7 +546,7 @@ msgstr ""
"la variable \"{0}\" attend un booléan comme \"{1}\" mais l'attribut "
"\"default\" n'est pas une booléan (\"{2}\")"
-#: src/rougail/convert/object_model.py:812
+#: src/rougail/convert/object_model.py:826
msgid ""
"\"when\" is not allowed in format version 1.0 for attribute \"{0}\" for "
"variable \"{1}\""
@@ -487,7 +554,7 @@ msgstr ""
"\"when\" n'est pas autorisé avec le format en version 1.0 pour l'attribut "
"\"{0}\" pour la variable \"{1}\""
-#: src/rougail/convert/object_model.py:817
+#: src/rougail/convert/object_model.py:831
msgid ""
"the variable \"{0}\" has an invalid attribute \"{1}\", \"when\" and "
"\"when_not\" cannot set together"
@@ -495,7 +562,7 @@ msgstr ""
"la variable \"{0}\" a un attribut invalide \"{1}\", \"when\" et \"when_not\" "
"ne peuvent pas être défini ensemble"
-#: src/rougail/convert/object_model.py:825
+#: src/rougail/convert/object_model.py:839
msgid ""
"\"when_not\" is not allowed in format version 1.0 for attribute \"{0}\" for "
"variable \"{1}\""
@@ -503,7 +570,15 @@ msgstr ""
"\"when_not\" n'est pas autorisé au format 1.0 pour l'attribut \"{0}\" pour "
"la variable variable \"{1}\""
-#: src/rougail/convert/object_model.py:881
+#: src/rougail/convert/object_model.py:850
+msgid ""
+"\"when\" or \"when_not\" is mandatory for the not boolean variable \"{0}\" "
+"in attribute \"{1}\""
+msgstr ""
+"\"when\" ou \"when_not\" est obligatoire pour la variable non booléenne "
+"\"{0}\" dans l'attribut \"{1}\""
+
+#: src/rougail/convert/object_model.py:898
msgid ""
"cannot find variable \"{0}\" for the information \"{1}\" when calculating "
"\"{2}\""
@@ -511,19 +586,19 @@ msgstr ""
"ne peut trouver la variable \"{0}\" pour l'information \"{1}\" lors du "
"calcul de \"{2}\""
-#: src/rougail/convert/object_model.py:886
+#: src/rougail/convert/object_model.py:903
msgid ""
"identifier not allowed for the information \"{0}\" when calculating \"{1}\""
msgstr ""
"identifier n'est pas autorisé pour l'information \"{0}\" lors du calcul de "
"\"{1}\""
-#: src/rougail/convert/object_model.py:938
+#: src/rougail/convert/object_model.py:955
msgid "\"when\" is not allowed in format version 1.0 for attribute \"{0}\""
msgstr "\"when\" n'est pas autorisé au format 1.0 pour l'attribut \"{0}\""
-#: src/rougail/convert/object_model.py:944
-#: src/rougail/convert/object_model.py:954
+#: src/rougail/convert/object_model.py:961
+#: src/rougail/convert/object_model.py:971
msgid ""
"the identifier has an invalid attribute \"{0}\", \"when\" and \"when_not\" "
"cannot set together"
@@ -531,7 +606,7 @@ msgstr ""
"l'identifiant a un attribut invalide \"{0}\", \"when\" et \"when_not\" ne "
"peuvent pas être défini ensemble"
-#: src/rougail/convert/object_model.py:980
+#: src/rougail/convert/object_model.py:997
msgid ""
"the variable \"{0}\" is not a follower, so cannot have index type for \"{1}\""
msgstr ""
@@ -546,20 +621,36 @@ msgstr ""
"Une variable ou une famille localisé dans l'espace de nom \"{0}\" ne devrait "
"pas être utilisé dans l'espace de nom \"{1}\""
-#: src/rougail/convert/tiramisureflector.py:353
+#: src/rougail/convert/tiramisureflector.py:348
+msgid ""
+"variable param \"{0}\" has whole attribute but it's not allowed for external "
+"variable"
+msgstr ""
+"le paramètre de la variable \"{0}\" a un attribut whole mais ce n'est pas "
+"autorisé pour une variable externe"
+
+#: src/rougail/convert/tiramisureflector.py:351
+msgid ""
+"variable param \"{0}\" has dynamic attribute but it's not allowed for "
+"external variable"
+msgstr ""
+"le paramètre de la variable \"{0}\" a un attribut dynamique mais ce n'est "
+"pas autorisé pour une variable externe"
+
+#: src/rougail/convert/tiramisureflector.py:360
msgid "internal error, {0} is not a dynamic variable"
msgstr "erreur interne, \"{0}\" n'est pas une variable dynamique"
-#: src/rougail/error.py:61 src/rougail/tiramisu.py:162
-#: src/rougail/user_datas.py:412 src/rougail/user_datas.py:415
+#: src/rougail/error.py:61 src/rougail/tiramisu.py:235
+#: src/rougail/user_data.py:452 src/rougail/user_data.py:455
msgid "{0} in {1}"
msgstr "{0} dans {1}"
-#: src/rougail/structural_commandline/annotator.py:66
+#: src/rougail/structural_commandline/annotator.py:67
msgid "alternative_name \"{0}\" conflict with \"--help\""
msgstr "alternative_name \"{0}\" est en conflit avec \"--help\""
-#: src/rougail/structural_commandline/annotator.py:71
+#: src/rougail/structural_commandline/annotator.py:72
msgid "conflict alternative_name \"{0}\": \"{1}\" and \"{2}\""
msgstr "conflit dans les \"alternative_name\" \"{0}\": \"{1}\" et \"{2}\""
@@ -568,21 +659,33 @@ msgid "duplicate structural file name {0}"
msgstr "nom de fichier {0} de structure dupliqué"
#: src/rougail/structural_directory/config.py:32
+msgid "Main namespace name"
+msgstr "Nom de l'espace de nom principal"
+
+#: src/rougail/structural_directory/config.py:40
+msgid "directory or string is not in \"_.step.structural\""
+msgstr "directory ou string n'est pas dans \"_.step.structural\""
+
+#: src/rougail/structural_directory/config.py:43
msgid "Directories where structural files are placed"
msgstr "Répertoires où sont placés les fichiers de structure"
-#: src/rougail/structural_directory/config.py:49
+#: src/rougail/structural_directory/config.py:60
msgid "Sort structural from differents directories"
msgstr "Trier les fichiers de structure à partir de différents répertoires"
-#: src/rougail/structural_directory/config.py:58
-msgid "Main namespace name"
-msgstr "Nom de l'espace de nom principal"
-
#: src/rougail/structural_directory/config.py:69
msgid "Namespaces are isolated"
msgstr "Les espaces de noms sont isolés"
+#: src/rougail/structural_directory/config.py:75
+msgid ""
+"directory or string is not in \"_.step.structural\" or \"_.main_namespace\" "
+"is not set"
+msgstr ""
+"directory ou string n'est pas dans \"_.step.structural\" ou "
+"\"_.main_namespace\" n'est pas défini"
+
#: src/rougail/structural_directory/config.py:78
msgid "Extra namespaces"
msgstr "Espaces de nom supplémentaires"
@@ -597,48 +700,234 @@ msgstr ""
"Répertoires où sont placés les fichiers de structure de l'espace de nom "
"supplémentaire"
+#: src/rougail/structural_directory/config.py:106
+msgid "directory is not in \"__.step.structural\""
+msgstr "directory n'est pas dans \"__.step.structural\""
+
+#: src/rougail/structural_string/config.py:32
+msgid "Structural files contents"
+msgstr "Contenu des fichiers de structure"
+
+#: src/rougail/structural_string/config.py:33
+#: src/rougail/structural_string/config.py:51
+msgid "This variable is a list of string with YAML file format"
+msgstr ""
+"Cette variable est une liste de chaîne de caractère avec le format d'un "
+"fichier YAML"
+
+#: src/rougail/structural_string/config.py:45
+msgid "string is not in \"_.step.structural\""
+msgstr "string n'est pas dans \"_.step.structural\""
+
+#: src/rougail/structural_string/config.py:50
+msgid "Extra structural contents"
+msgstr "Contenu de structure supplémentaire"
+
+#: src/rougail/structural_string/config.py:58
+msgid "string is not in \"__.step.structural\""
+msgstr "string n'est pas dans \"__.step.structural\""
+
#: src/rougail/tiramisu.py:83
msgid "unknown boolean value \"{0}\""
msgstr "valeur du booléen inconnue \"{0}\""
-#: src/rougail/tiramisu.py:335
-msgid ""
-"cannot calculating \"{0}\" attribute for variable \"{1}\" in {2} with "
-"parameters \"{3}\": {4}"
-msgstr ""
-"ne peut calculer l'attribut \"{0}\" pour la variable \"{1}\" dans {2} avec "
-"les paramètres \"{3}\" : {4}"
+#: src/rougail/tiramisu.py:86
+msgid "IP must be in CIDR format"
+msgstr "l'IP doit être au format CIDR"
-#: src/rougail/user_datas.py:145
+#: src/rougail/tiramisu.py:87
+msgid "private IP are allowed"
+msgstr "les IP privées sont autorisées"
+
+#: src/rougail/tiramisu.py:88
+msgid "reserved IP are allowed"
+msgstr "les IP réservées sont autorisés"
+
+#: src/rougail/tiramisu.py:91
+msgid "network must be in CIDR format"
+msgstr "le réseau doit être au format CIDR"
+
+#: src/rougail/tiramisu.py:92
+msgid "private network are allowed"
+msgstr "les réseaux privés sont autorisés"
+
+#: src/rougail/tiramisu.py:93
+msgid "reserved network are allowed"
+msgstr "les réseaux réservés sont autorisés"
+
+#: src/rougail/tiramisu.py:96
+msgid "can be range of port"
+msgstr "peut être une plage de port"
+
+#: src/rougail/tiramisu.py:97
+msgid "can have the protocol"
+msgstr "peut avoir le protocole"
+
+#: src/rougail/tiramisu.py:98
+msgid "port 0 is allowed"
+msgstr "port 0 est autorisé"
+
+#: src/rougail/tiramisu.py:99
+msgid "well-known ports (1 to 1023) are allowed"
+msgstr "les ports connus (1 à 1023) sont autorisés"
+
+#: src/rougail/tiramisu.py:100
+msgid "registred ports (1024 to 49151) are allowed"
+msgstr "les ports enregistrés (1024 à 49151) sont autorisés"
+
+#: src/rougail/tiramisu.py:101
+msgid "private ports (greater than 49152) are allowed"
+msgstr "les ports privés (supérieur à 49152) sont autorisés"
+
+#: src/rougail/tiramisu.py:104
+msgid "type of domainname"
+msgstr "type de nom de domaine"
+
+#: src/rougail/tiramisu.py:104
+msgid "type {0}"
+msgstr "type de {0}"
+
+#: src/rougail/tiramisu.py:105
+msgid "the domain name can starts by a dot"
+msgstr "le nom de domaine peut démarré par un point"
+
+#: src/rougail/tiramisu.py:106
+msgid "the domain name can be a hostname"
+msgstr "le nom de domaine peut être un nom d'hôte"
+
+#: src/rougail/tiramisu.py:107
+msgid "the domain name can be an IP"
+msgstr "le nom de domaine peut être une IP"
+
+#: src/rougail/tiramisu.py:108
+msgid "the domain name can be network in CIDR format"
+msgstr "le nom de domaine peut être un réseau au format CIDR"
+
+#: src/rougail/tiramisu.py:109
+msgid "the domain name must exist"
+msgstr "le nom de domaine doit exister"
+
+#: src/rougail/tiramisu.py:119 src/rougail/tiramisu.py:125
+msgid "the minimum value"
+msgstr "la valeur minimale"
+
+#: src/rougail/tiramisu.py:119 src/rougail/tiramisu.py:125
+msgid "the minimum value is {0}"
+msgstr "la valeur minimale est {0}"
+
+#: src/rougail/tiramisu.py:120 src/rougail/tiramisu.py:126
+msgid "the maximum value"
+msgstr "la valeur maximale"
+
+#: src/rougail/tiramisu.py:120 src/rougail/tiramisu.py:126
+msgid "the maximum value is {0}"
+msgstr "la valeur maximale est {0}"
+
+#: src/rougail/tiramisu.py:135
+msgid "minimum characters length for the secret"
+msgstr "longueur minimum de caractère pour un secret"
+
+#: src/rougail/tiramisu.py:135
+msgid "minimum length for the secret is {0} characters"
+msgstr "longueur minimum pour un secret est de {0} caractères"
+
+#: src/rougail/tiramisu.py:136
+msgid "maximum characters length for the secret"
+msgstr "longueur maximum de caractère pour un secret"
+
+#: src/rougail/tiramisu.py:136
+msgid "maximum length for the secret is {0} characters"
+msgstr "longueur maximum pour un secret est de {0} caractères"
+
+#: src/rougail/tiramisu.py:137
+msgid "forbidden characters"
+msgstr "caractères interdits"
+
+#: src/rougail/tiramisu.py:137
+msgid "forbidden characters: {0}"
+msgstr "caractères interdits: {0}"
+
+#: src/rougail/tiramisu.py:144
+msgid "this filename could be a relative path"
+msgstr "le nom de fichier peut être une chemin relatif"
+
+#: src/rougail/tiramisu.py:145
+msgid "this file must exist"
+msgstr "le fichier doit exister"
+
+#: src/rougail/tiramisu.py:146
+msgid "file type allowed"
+msgstr "type de fichier autorisé"
+
+#: src/rougail/tiramisu.py:146
+msgid "file type allowed: {0}"
+msgstr "type de fichier autorisé: {0}"
+
+#: src/rougail/tiramisu.py:436
+msgid "cannot calculate the variable \"{0}\""
+msgstr "ne peut calculer la variable \"{0}\""
+
+#: src/rougail/tiramisu.py:437
+msgid ""
+"the attribute \"{0}\" in {1} with the parameters \"{2}\" causes the error: "
+"{3}"
+msgstr ""
+"l'attribut \"{0}\" dans {1} avec les paramètres \"{2}\" provoque l'erreur : "
+"{3}"
+
+#: src/rougail/tiramisu.py:455
+msgid "cannot converting the variable \"{0}\""
+msgstr "ne peut convertir la variable \"{0}\""
+
+#: src/rougail/tiramisu.py:456
+msgid "\"{0}\" is an invalid {1}"
+msgstr "\"{0}\" est un {1} invalide"
+
+#: src/rougail/tiramisu.py:458
+msgid "the attribute \"{0}\" in {1} causes the error: {2}"
+msgstr "l'attribut \"{0}\" dans {1} provoque l'erreur : {2}"
+
+#: src/rougail/user_data.py:146
msgid ""
"cannot load variable path \"{0}\", the identifier \"{1}\" is not valid in {2}"
msgstr ""
"ne peut charger la variable \"{0}\", l'identifiant \"{1}\" n'est pas valide "
"dans {2}"
-#: src/rougail/user_datas.py:229
-msgid "the variable \"{0}\" contains secrets and should not be defined in {1}"
+#: src/rougail/user_data.py:230
+msgid "the variable contains secrets and should not be defined in {0}"
msgstr ""
-"la variable \"{0}\" contient des secrets et ne devrait pas être défini dans "
-"{1}"
+"la variable contient des secrets et ne devrait pas être défini dans {0}"
-#: src/rougail/user_datas.py:269
+#: src/rougail/user_data.py:269
msgid "loaded from {0}"
msgstr "chargée depuis {0}"
-#: src/rougail/user_datas.py:311
+#: src/rougail/user_data.py:311
msgid ""
-"cannot set the value \"{0}\" to the family {1}, it will be ignored when "
-"loading from {2}"
+"is a family so we cannot set the value \"{0}\", it has been loading from {1}"
msgstr ""
-"impossible de définir la valeur \"{0}\" à la famille {1}, elle sera ignorée "
-"lors du chargement depuis {2}"
+"est une famille donc il n'est pas possible de définir la valeur \"{0}\", "
+"elle a été chargée depuis {1}"
-#: src/rougail/user_datas.py:322 src/rougail/user_datas.py:339
-msgid "{0} loaded from {1}"
-msgstr "{0} chargée depuis {1}"
+#: src/rougail/user_data.py:315
+msgid ""
+"is a family so we cannot set the value \"{0}\", it will be ignored when "
+"loading from {1}"
+msgstr ""
+"est une famille donc il n'est pas possible de définir la valeur \"{0}\", "
+"elle sera ignorée lors du chargement depuis {1}"
-#: src/rougail/user_datas.py:327
+#: src/rougail/user_data.py:326
+msgid "{0}, it has been loaded from {1}"
+msgstr "{0}, elle a été chargée depuis {1}"
+
+#: src/rougail/user_data.py:332
+msgid "variable or family \"{0}\" does not exist, it has been loading from {1}"
+msgstr ""
+"la variable ou la famille \"{0}\" n'existe pas, elle a été chargée depuis {1}"
+
+#: src/rougail/user_data.py:336
msgid ""
"variable or family \"{0}\" does not exist, it will be ignored when loading "
"from {1}"
@@ -646,7 +935,12 @@ msgstr ""
"la variable ou la famille \"{0}\" n'existe pas, elle sera ignorée lors du "
"chargement depuis {1}"
-#: src/rougail/user_datas.py:333
+#: src/rougail/user_data.py:342
+msgid "\"{0}\" is the name of a dynamic family, it has been loading from {1}"
+msgstr ""
+"\"{0}\" est le nom d'une famille dynamique, elle a été chargée depuis {1}"
+
+#: src/rougail/user_data.py:346
msgid ""
"\"{0}\" is the name of a dynamic family, it will be ignored when loading "
"from {1}"
@@ -654,7 +948,16 @@ msgstr ""
"\"{0}\" est le nom d'une famille dynamique, il sera ignoré lors du "
"chargement depuis {1}"
-#: src/rougail/user_datas.py:369
+#: src/rougail/user_data.py:354
+msgid "{0} loaded from {1}"
+msgstr "{0} chargée depuis {1}"
+
+#: src/rougail/user_data.py:385
+msgid "variable {0} at index \"{1}\" is {2}, it has been loading from {3}"
+msgstr ""
+"la variable {0} à l'index \"{1}\" est {2}, elle a été chargée depuis {3}"
+
+#: src/rougail/user_data.py:389
msgid ""
"variable {0} at index \"{1}\" is {2}, it will be ignored when loading from "
"{3}"
@@ -662,23 +965,50 @@ msgstr ""
"la variable {0} à l'index \"{1}\" est {2}, elle sera ignorée lors du "
"chargement depuis {3}"
-#: src/rougail/user_datas.py:380
+#: src/rougail/user_data.py:402
+msgid "family {0} is {1}, {2} at index \"{3}\", it has been loading from {4}"
+msgstr ""
+"la famille {0} est {1}, {2} à l'index \"{3}\", elle a été chargée depuis {4}"
+
+#: src/rougail/user_data.py:406
msgid ""
-"family {0} is {1}, {2} at index \"{3}\" will be ignored when loading from {4}"
+"family {0} is {1}, {2} at index \"{3}\", it will be ignored when loading "
+"from {4}"
msgstr ""
-"la famille {0} est {1}, {2} à l'index \"{3}\" sera ignorée lors du "
-"chargement depuis {4}"
+"la famille {0} est {1}, {2} à l'index \"{3}\", elle a été chargée depuis {4}"
-#: src/rougail/user_datas.py:393
-msgid "variable {0} is {1}, it will be ignored when loading from {2}"
+#: src/rougail/user_data.py:421
+msgid "variable is {0}, it has been loading from {1}"
+msgstr "la variable est {0}, elle a été chargée depuis {1}"
+
+#: src/rougail/user_data.py:425
+msgid "variable is {0}, it will be ignored when loading from {1}"
+msgstr "la variable est {0}, elle sera ignorée lors du chargement depuis {1}"
+
+#: src/rougail/user_data.py:435
+msgid ""
+"family {0} is {1}, so cannot access to {2}, it has been loading from {3}"
msgstr ""
-"la variable {0} est {1}, elle sera ignorée lors du chargement depuis {2}"
+"la famille {0} est {1}, donc ne peut accéder à {2}, elle a été chargée "
+"depuis {3}"
-#: src/rougail/user_datas.py:401
-msgid "family {0} is {1}, {2} will be ignored when loading from {3}"
-msgstr "la famille {0} est {1}, {2} sera ignorée lors du chargement depuis {3}"
+#: src/rougail/user_data.py:439
+msgid ""
+"family {0} is {1}, so cannot access to {2}, it will be ignored when loading "
+"from {3}"
+msgstr ""
+"la famille {0} est {1}, donc ne peut accéder à {2}, sera ignorée lors du "
+"chargement depuis {3}"
-#: src/rougail/user_datas.py:421
+#: src/rougail/user_data.py:461
+msgid ""
+"the value \"{0}\" is an invalid {1} for {2} at index \"{3}\", {4}, it has "
+"been loading from {5}"
+msgstr ""
+"la valeur \"{0}\" est un {1} invalide pour {2} à l'index \"{3}\", {4}, elle "
+"a été chargée depuis {5}"
+
+#: src/rougail/user_data.py:465
msgid ""
"the value \"{0}\" is an invalid {1} for {2} at index \"{3}\", {4}, it will "
"be ignored when loading from {5}"
@@ -686,13 +1016,18 @@ msgstr ""
"la valeur \"{0}\" est un {1} invalide pour {2} à l'index \"{3}\", {4}, elle "
"sera ignorée lors du chargement depuis {5}"
-#: src/rougail/user_datas.py:435
-msgid ""
-"the value \"{0}\" is an invalid {1} for {2}, {3}, it will be ignored when "
-"loading from {4}"
+#: src/rougail/user_data.py:481
+msgid "the value \"{0}\" is an invalid {1}, {2}, it has been loading from {3}"
msgstr ""
-"la valeur \"{0}\" est un {1} invalide pour {2}, {3}, elle sera ignorée lors "
-"du chargement depuis {4}"
+"la valeur \"{0}\" est un {1} invalide pour {2}, elle a été chargée depuis {3}"
+
+#: src/rougail/user_data.py:485
+msgid ""
+"the value \"{0}\" is an invalid {1}, {2}, it will be ignored when loading "
+"from {3}"
+msgstr ""
+"la valeur \"{0}\" est un {1} invalide pour {2}, elle sera ignorée lors du "
+"chargement depuis {4}"
#: src/rougail/utils.py:56
msgid ""
@@ -702,30 +1037,41 @@ msgstr ""
"nom invalide pour la variable ou famille \"{0}\" doit seulement contenir des "
"caractères ascii minuscule, nombre or _"
-#: src/rougail/utils.py:103
-msgid "error in jinja \"{0}\" for the variable \"{1}\": {2}"
-msgstr "erreur dans Jinja \"{0}\" pour la variable \"{1}\": {2}"
+#: src/rougail/utils.py:104
+msgid "error for the variable \"{1}\" in jinja \"{0}\": {2}"
+msgstr "erreur pour la variable \"{1}\" dans le jinja \"{0}\": {2}"
-#: src/rougail/utils.py:212
+#: src/rougail/utils.py:213
msgid "mandatory"
msgstr "obligatoire"
-#: src/rougail/utils.py:213
+#: src/rougail/utils.py:214
msgid "hidden"
msgstr "cachée"
-#: src/rougail/utils.py:214
+#: src/rougail/utils.py:215
msgid "disabled"
msgstr "désactivé"
-#: src/rougail/utils.py:215
+#: src/rougail/utils.py:216
msgid "unique"
msgstr "unique"
-#: src/rougail/utils.py:216
+#: src/rougail/utils.py:217
msgid "auto modified"
msgstr "auto modifiée"
+#~ msgid "The secret pattern to build item name in Bitwarden"
+#~ msgstr ""
+#~ "Le patron de secret pour construire le nom de l'élément dans Bitwarden"
+
+#~ msgid ""
+#~ "cannot calculating \"{0}\" attribute for variable \"{1}\" in {2} with "
+#~ "parameters \"{3}\": {4}"
+#~ msgstr ""
+#~ "ne peut calculer l'attribut \"{0}\" pour la variable \"{1}\" dans {2} "
+#~ "avec les paramètres \"{3}\" : {4}"
+
#, fuzzy
#~| msgid ""
#~| "we need {0} values when there are {{{{ var | length }}}} ({{{{ var | "
@@ -793,9 +1139,6 @@ msgstr "auto modifiée"
#~ msgid "error in {0}: {1}"
#~ msgstr "erreur dans {0} : {1}"
-#~ msgid "cannot find variable \"{0}\" from {1}: {2}"
-#~ msgstr "ne peut trouver la variable \"{0}\" depuis {1} : {2}"
-
#~ msgid "the option \"{0}\" is an option description"
#~ msgstr "l'option \"{0}\" est une option description"
diff --git a/locale/rougail.pot b/locale/rougail.pot
index 80f552d81..6aae804f1 100644
--- a/locale/rougail.pot
+++ b/locale/rougail.pot
@@ -5,7 +5,7 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2025-11-21 08:31+0100\n"
+"POT-Creation-Date: 2025-12-22 08:46+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -127,75 +127,122 @@ msgstr ""
msgid "the variable \"{0}\" has an unvalid default value \"{1}\" should be in {2}"
msgstr ""
-#: src/rougail/config/__init__.py:276
-msgid "Structure format version by default, if not specified in structure file"
+#: src/rougail/config/__init__.py:271
+msgid "Default version of the structural file format"
msgstr ""
-#: src/rougail/config/__init__.py:284
+#: src/rougail/config/__init__.py:272
+msgid "This value is only used if the version is not set in the structural file"
+msgstr ""
+
+#: src/rougail/config/__init__.py:280
msgid "File with functions"
msgstr ""
-#: src/rougail/config/__init__.py:296
+#: src/rougail/config/__init__.py:281
+msgid "This file contains filters and additional Jinja2 functions usable in structure files"
+msgstr ""
+
+#: src/rougail/config/__init__.py:293
msgid "All modes level available"
msgstr ""
-#: src/rougail/config/__init__.py:308
+#: src/rougail/config/__init__.py:305
msgid "Default mode for a family"
msgstr ""
+#: src/rougail/config/__init__.py:311
+msgid "the first one defined in \"modes_level\""
+msgstr ""
+
+#: src/rougail/config/__init__.py:317 src/rougail/config/__init__.py:344
+msgid "when no mode is defined in \"modes_level\""
+msgstr ""
+
+#: src/rougail/config/__init__.py:324 src/rougail/config/__init__.py:351
+msgid "this mode must be available in \"modes_level\""
+msgstr ""
+
#: src/rougail/config/__init__.py:328
msgid "Default mode for a variable"
msgstr ""
-#: src/rougail/config/__init__.py:352
+#: src/rougail/config/__init__.py:338
+msgid "if the variable \"modes_level\" is defined, the default value is the second available element, otherwise, the first"
+msgstr ""
+
+#: src/rougail/config/__init__.py:355
msgid "Option name for the base option"
msgstr ""
-#: src/rougail/config/__init__.py:357
+#: src/rougail/config/__init__.py:360
msgid "In cache file, do not importation of Tiramisu and other dependencies"
msgstr ""
-#: src/rougail/config/__init__.py:362
-msgid "Tiramisu cache filename"
+#: src/rougail/config/__init__.py:365
+msgid "Store Tiramisu cache filename"
msgstr ""
-#: src/rougail/config/__init__.py:370
-msgid "Name of internal functions that we can use as a function"
+#: src/rougail/config/__init__.py:366
+msgid ""
+"This file contains the Tiramisu instructions used internally to load the variables.\n"
+"\n"
+"This file can be used for debugging"
msgstr ""
#: src/rougail/config/__init__.py:376
-msgid "Name of extra annotators"
+msgid "Name of internal functions that we can use as a function"
msgstr ""
#: src/rougail/config/__init__.py:382
-msgid "Suffix add to generated options name"
+msgid "Name of extra annotators"
msgstr ""
#: src/rougail/config/__init__.py:388
+msgid "Suffix add to generated options name"
+msgstr ""
+
+#: src/rougail/config/__init__.py:394
msgid "Every variables in calculation are optionals"
msgstr ""
-#: src/rougail/config/__init__.py:392
+#: src/rougail/config/__init__.py:398
msgid "Loads redefine variables even if there don't already exists"
msgstr ""
-#: src/rougail/config/__init__.py:399
-msgid "The secret pattern to build item name in Bitwarden"
+#: src/rougail/config/__init__.py:402
+msgid "The secret manager"
msgstr ""
-#: src/rougail/config/__init__.py:400
-msgid "The pattern is in Jinja format"
+#: src/rougail/config/__init__.py:405
+msgid "The secret pattern to constructing the name of the item searched for in the secret manager"
msgstr ""
-#: src/rougail/config/__init__.py:428
+#: src/rougail/config/__init__.py:406
+msgid "The pattern is in Jinja2 format"
+msgstr ""
+
+#: src/rougail/config/__init__.py:415
+msgid "structural"
+msgstr ""
+
+#: src/rougail/config/__init__.py:416
+msgid "user datas"
+msgstr ""
+
+#: src/rougail/config/__init__.py:417
+msgid "output"
+msgstr ""
+
+#: src/rougail/config/__init__.py:438
msgid "Select for {0}"
msgstr ""
-#: src/rougail/config/__init__.py:508
+#: src/rougail/config/__init__.py:500
msgid "Override default parameters for option type"
msgstr ""
-#: src/rougail/config/__init__.py:511
+#: src/rougail/config/__init__.py:503
msgid "Default parameters for option type"
msgstr ""
@@ -231,138 +278,142 @@ msgstr ""
msgid "invalid \"structural\" definition ({0}), we cannot load any structural file!"
msgstr ""
-#: src/rougail/convert/object_model.py:121
+#: src/rougail/convert/object_model.py:132
msgid "cannot find variable \"{0}\" defined in attribute \"{1}\" for \"{2}\""
msgstr ""
-#: src/rougail/convert/object_model.py:127
+#: src/rougail/convert/object_model.py:138
msgid "the variable \"{0}\" is in fact a family in attribute \"{1}\" for \"{2}\""
msgstr ""
-#: src/rougail/convert/object_model.py:132
-#: src/rougail/convert/object_model.py:513
+#: src/rougail/convert/object_model.py:143
+#: src/rougail/convert/object_model.py:527
msgid "unknown object \"{0}\" in attribute \"{1}\" for \"{2}\""
msgstr ""
-#: src/rougail/convert/object_model.py:151
+#: src/rougail/convert/object_model.py:162
msgid "identifier parameter for \"{0}\" in \"{1}\" cannot be set none dynamic family"
msgstr ""
-#: src/rougail/convert/object_model.py:180
+#: src/rougail/convert/object_model.py:191
msgid "cannot find variable \"{0}\" defined in \"{1}\" for \"{2}\""
msgstr ""
-#: src/rougail/convert/object_model.py:185
+#: src/rougail/convert/object_model.py:196
msgid "variable \"{0}\" defined in \"{1}\" for \"{2}\" is a dynamic variable"
msgstr ""
-#: src/rougail/convert/object_model.py:202
+#: src/rougail/convert/object_model.py:213
msgid "the variable \"{0}\" is not a follower, so cannot have index type for param in \"{1}\""
msgstr ""
-#: src/rougail/convert/object_model.py:252
+#: src/rougail/convert/object_model.py:263
msgid "\"warnings\" are only available with attribute \"{self.attribute_name}\" for variable \"{self.ori_path}\""
msgstr ""
-#: src/rougail/convert/object_model.py:314
-msgid "the variable \"{0}\" has a depreciated return_type \"{1}\", please use \"{2}\" instead in \"{3}\""
+#: src/rougail/convert/object_model.py:325
+msgid "the variable \"{0}\" has a depreciated return_type \"{1}\", please use \"{2}\" instead in {3}"
msgstr ""
-#: src/rougail/convert/object_model.py:404
-#: src/rougail/convert/object_model.py:435
+#: src/rougail/convert/object_model.py:415
+#: src/rougail/convert/object_model.py:446
msgid "variable \"{0}\" has a calculating \"{1}\" with an invalid return_type, should be boolean or string, not \"{2}\""
msgstr ""
-#: src/rougail/convert/object_model.py:411
+#: src/rougail/convert/object_model.py:422
msgid "the variable \"{0}\" has a return_type \"{1}\", for attribute \"{2}\" but has not description in {3}"
msgstr ""
-#: src/rougail/convert/object_model.py:416
+#: src/rougail/convert/object_model.py:427
msgid "value is invalid"
msgstr ""
-#: src/rougail/convert/object_model.py:508
+#: src/rougail/convert/object_model.py:522
msgid "a variable \"{0}\" is needs in attribute \"{1}\" for \"{2}\" but it's a family"
msgstr ""
-#: src/rougail/convert/object_model.py:533
+#: src/rougail/convert/object_model.py:547
msgid "variable \"{0}\" has an attribute \"{1}\" calculated with the unknown variable \"{2}\""
msgstr ""
-#: src/rougail/convert/object_model.py:585
+#: src/rougail/convert/object_model.py:599
msgid "the variable \"{0}\" has an invalid \"{1}\" the variable \"{2}\" is in a sub dynamic option"
msgstr ""
-#: src/rougail/convert/object_model.py:594
+#: src/rougail/convert/object_model.py:608
msgid "the leader \"{0}\" has an invalid \"{1}\" the follower \"{2}\" is a multi"
msgstr ""
-#: src/rougail/convert/object_model.py:636
+#: src/rougail/convert/object_model.py:650
msgid "the variable \"{0}\" has an invalid attribute \"{1}\", the variable \"{2}\" must not be multi"
msgstr ""
-#: src/rougail/convert/object_model.py:650
+#: src/rougail/convert/object_model.py:664
msgid "the variable \"{0}\" has an invalid attribute \"{1}\", the variable must not be a multi or the variable \"{2}\" must be multi"
msgstr ""
-#: src/rougail/convert/object_model.py:664
+#: src/rougail/convert/object_model.py:678
msgid "the variable \"{0}\" has an invalid attribute \"{1}\", the variable must be a multi or the variable \"{2}\" must not be multi"
msgstr ""
-#: src/rougail/convert/object_model.py:678
+#: src/rougail/convert/object_model.py:692
msgid "the variable \"{0}\" has an invalid attribute \"{1}\", the variable \"{2}\" is multi but is inside a list"
msgstr ""
-#: src/rougail/convert/object_model.py:700
+#: src/rougail/convert/object_model.py:714
msgid "the variable \"{0}\" is waiting for a list as \"{1}\" but the attribute \"default\" is not a list (\"{2}\")"
msgstr ""
-#: src/rougail/convert/object_model.py:704
+#: src/rougail/convert/object_model.py:718
msgid "the variable \"{0}\" is not waiting for a list as \"{1}\" but the attribute \"default\" is a list (\"{2}\")"
msgstr ""
-#: src/rougail/convert/object_model.py:726
+#: src/rougail/convert/object_model.py:740
msgid "\"{0}\" attribut shall not have an \"optional\" attribute without the \"default\" attribute for variable \"{1}\""
msgstr ""
-#: src/rougail/convert/object_model.py:748
+#: src/rougail/convert/object_model.py:762
msgid "variable \"{0}\" has a default value calculated with \"{1}\" which has incompatible type"
msgstr ""
-#: src/rougail/convert/object_model.py:790
+#: src/rougail/convert/object_model.py:804
msgid "the variable \"{0}\" is waiting for a boolean as \"{1}\" but the attribute \"default\" is not a boolean (\"{2}\")"
msgstr ""
-#: src/rougail/convert/object_model.py:812
+#: src/rougail/convert/object_model.py:826
msgid "\"when\" is not allowed in format version 1.0 for attribute \"{0}\" for variable \"{1}\""
msgstr ""
-#: src/rougail/convert/object_model.py:817
+#: src/rougail/convert/object_model.py:831
msgid "the variable \"{0}\" has an invalid attribute \"{1}\", \"when\" and \"when_not\" cannot set together"
msgstr ""
-#: src/rougail/convert/object_model.py:825
+#: src/rougail/convert/object_model.py:839
msgid "\"when_not\" is not allowed in format version 1.0 for attribute \"{0}\" for variable \"{1}\""
msgstr ""
-#: src/rougail/convert/object_model.py:881
+#: src/rougail/convert/object_model.py:850
+msgid "\"when\" or \"when_not\" is mandatory for the not boolean variable \"{0}\" in attribute \"{1}\""
+msgstr ""
+
+#: src/rougail/convert/object_model.py:898
msgid "cannot find variable \"{0}\" for the information \"{1}\" when calculating \"{2}\""
msgstr ""
-#: src/rougail/convert/object_model.py:886
+#: src/rougail/convert/object_model.py:903
msgid "identifier not allowed for the information \"{0}\" when calculating \"{1}\""
msgstr ""
-#: src/rougail/convert/object_model.py:938
+#: src/rougail/convert/object_model.py:955
msgid "\"when\" is not allowed in format version 1.0 for attribute \"{0}\""
msgstr ""
-#: src/rougail/convert/object_model.py:944
-#: src/rougail/convert/object_model.py:954
+#: src/rougail/convert/object_model.py:961
+#: src/rougail/convert/object_model.py:971
msgid "the identifier has an invalid attribute \"{0}\", \"when\" and \"when_not\" cannot set together"
msgstr ""
-#: src/rougail/convert/object_model.py:980
+#: src/rougail/convert/object_model.py:997
msgid "the variable \"{0}\" is not a follower, so cannot have index type for \"{1}\""
msgstr ""
@@ -370,20 +421,28 @@ msgstr ""
msgid "A variable or a family located in the \"{0}\" namespace shall not be used in the \"{1}\" namespace"
msgstr ""
-#: src/rougail/convert/tiramisureflector.py:353
+#: src/rougail/convert/tiramisureflector.py:348
+msgid "variable param \"{0}\" has whole attribute but it's not allowed for external variable"
+msgstr ""
+
+#: src/rougail/convert/tiramisureflector.py:351
+msgid "variable param \"{0}\" has dynamic attribute but it's not allowed for external variable"
+msgstr ""
+
+#: src/rougail/convert/tiramisureflector.py:360
msgid "internal error, {0} is not a dynamic variable"
msgstr ""
-#: src/rougail/error.py:61 src/rougail/tiramisu.py:162
-#: src/rougail/user_datas.py:412 src/rougail/user_datas.py:415
+#: src/rougail/error.py:61 src/rougail/tiramisu.py:235
+#: src/rougail/user_data.py:452 src/rougail/user_data.py:455
msgid "{0} in {1}"
msgstr ""
-#: src/rougail/structural_commandline/annotator.py:66
+#: src/rougail/structural_commandline/annotator.py:67
msgid "alternative_name \"{0}\" conflict with \"--help\""
msgstr ""
-#: src/rougail/structural_commandline/annotator.py:71
+#: src/rougail/structural_commandline/annotator.py:72
msgid "conflict alternative_name \"{0}\": \"{1}\" and \"{2}\""
msgstr ""
@@ -392,21 +451,29 @@ msgid "duplicate structural file name {0}"
msgstr ""
#: src/rougail/structural_directory/config.py:32
+msgid "Main namespace name"
+msgstr ""
+
+#: src/rougail/structural_directory/config.py:40
+msgid "directory or string is not in \"_.step.structural\""
+msgstr ""
+
+#: src/rougail/structural_directory/config.py:43
msgid "Directories where structural files are placed"
msgstr ""
-#: src/rougail/structural_directory/config.py:49
+#: src/rougail/structural_directory/config.py:60
msgid "Sort structural from differents directories"
msgstr ""
-#: src/rougail/structural_directory/config.py:58
-msgid "Main namespace name"
-msgstr ""
-
#: src/rougail/structural_directory/config.py:69
msgid "Namespaces are isolated"
msgstr ""
+#: src/rougail/structural_directory/config.py:75
+msgid "directory or string is not in \"_.step.structural\" or \"_.main_namespace\" is not set"
+msgstr ""
+
#: src/rougail/structural_directory/config.py:78
msgid "Extra namespaces"
msgstr ""
@@ -419,91 +486,304 @@ msgstr ""
msgid "Directories where extra structural files are placed"
msgstr ""
+#: src/rougail/structural_directory/config.py:106
+msgid "directory is not in \"__.step.structural\""
+msgstr ""
+
+#: src/rougail/structural_string/config.py:32
+msgid "Structural files contents"
+msgstr ""
+
+#: src/rougail/structural_string/config.py:33
+#: src/rougail/structural_string/config.py:51
+msgid "This variable is a list of string with YAML file format"
+msgstr ""
+
+#: src/rougail/structural_string/config.py:45
+msgid "string is not in \"_.step.structural\""
+msgstr ""
+
+#: src/rougail/structural_string/config.py:50
+msgid "Extra structural contents"
+msgstr ""
+
+#: src/rougail/structural_string/config.py:58
+msgid "string is not in \"__.step.structural\""
+msgstr ""
+
#: src/rougail/tiramisu.py:83
msgid "unknown boolean value \"{0}\""
msgstr ""
-#: src/rougail/tiramisu.py:335
-msgid "cannot calculating \"{0}\" attribute for variable \"{1}\" in {2} with parameters \"{3}\": {4}"
+#: src/rougail/tiramisu.py:86
+msgid "IP must be in CIDR format"
msgstr ""
-#: src/rougail/user_datas.py:145
+#: src/rougail/tiramisu.py:87
+msgid "private IP are allowed"
+msgstr ""
+
+#: src/rougail/tiramisu.py:88
+msgid "reserved IP are allowed"
+msgstr ""
+
+#: src/rougail/tiramisu.py:91
+msgid "network must be in CIDR format"
+msgstr ""
+
+#: src/rougail/tiramisu.py:92
+msgid "private network are allowed"
+msgstr ""
+
+#: src/rougail/tiramisu.py:93
+msgid "reserved network are allowed"
+msgstr ""
+
+#: src/rougail/tiramisu.py:96
+msgid "can be range of port"
+msgstr ""
+
+#: src/rougail/tiramisu.py:97
+msgid "can have the protocol"
+msgstr ""
+
+#: src/rougail/tiramisu.py:98
+msgid "port 0 is allowed"
+msgstr ""
+
+#: src/rougail/tiramisu.py:99
+msgid "well-known ports (1 to 1023) are allowed"
+msgstr ""
+
+#: src/rougail/tiramisu.py:100
+msgid "registred ports (1024 to 49151) are allowed"
+msgstr ""
+
+#: src/rougail/tiramisu.py:101
+msgid "private ports (greater than 49152) are allowed"
+msgstr ""
+
+#: src/rougail/tiramisu.py:104
+msgid "type of domainname"
+msgstr ""
+
+#: src/rougail/tiramisu.py:104
+msgid "type {0}"
+msgstr ""
+
+#: src/rougail/tiramisu.py:105
+msgid "the domain name can starts by a dot"
+msgstr ""
+
+#: src/rougail/tiramisu.py:106
+msgid "the domain name can be a hostname"
+msgstr ""
+
+#: src/rougail/tiramisu.py:107
+msgid "the domain name can be an IP"
+msgstr ""
+
+#: src/rougail/tiramisu.py:108
+msgid "the domain name can be network in CIDR format"
+msgstr ""
+
+#: src/rougail/tiramisu.py:109
+msgid "the domain name must exist"
+msgstr ""
+
+#: src/rougail/tiramisu.py:119 src/rougail/tiramisu.py:125
+msgid "the minimum value"
+msgstr ""
+
+#: src/rougail/tiramisu.py:119 src/rougail/tiramisu.py:125
+msgid "the minimum value is {0}"
+msgstr ""
+
+#: src/rougail/tiramisu.py:120 src/rougail/tiramisu.py:126
+msgid "the maximum value"
+msgstr ""
+
+#: src/rougail/tiramisu.py:120 src/rougail/tiramisu.py:126
+msgid "the maximum value is {0}"
+msgstr ""
+
+#: src/rougail/tiramisu.py:135
+msgid "minimum characters length for the secret"
+msgstr ""
+
+#: src/rougail/tiramisu.py:135
+msgid "minimum length for the secret is {0} characters"
+msgstr ""
+
+#: src/rougail/tiramisu.py:136
+msgid "maximum characters length for the secret"
+msgstr ""
+
+#: src/rougail/tiramisu.py:136
+msgid "maximum length for the secret is {0} characters"
+msgstr ""
+
+#: src/rougail/tiramisu.py:137
+msgid "forbidden characters"
+msgstr ""
+
+#: src/rougail/tiramisu.py:137
+msgid "forbidden characters: {0}"
+msgstr ""
+
+#: src/rougail/tiramisu.py:144
+msgid "this filename could be a relative path"
+msgstr ""
+
+#: src/rougail/tiramisu.py:145
+msgid "this file must exist"
+msgstr ""
+
+#: src/rougail/tiramisu.py:146
+msgid "file type allowed"
+msgstr ""
+
+#: src/rougail/tiramisu.py:146
+msgid "file type allowed: {0}"
+msgstr ""
+
+#: src/rougail/tiramisu.py:436
+msgid "cannot calculate the variable \"{0}\""
+msgstr ""
+
+#: src/rougail/tiramisu.py:437
+msgid "the attribute \"{0}\" in {1} with the parameters \"{2}\" causes the error: {3}"
+msgstr ""
+
+#: src/rougail/tiramisu.py:455
+msgid "cannot converting the variable \"{0}\""
+msgstr ""
+
+#: src/rougail/tiramisu.py:456
+msgid "\"{0}\" is an invalid {1}"
+msgstr ""
+
+#: src/rougail/tiramisu.py:458
+msgid "the attribute \"{0}\" in {1} causes the error: {2}"
+msgstr ""
+
+#: src/rougail/user_data.py:146
msgid "cannot load variable path \"{0}\", the identifier \"{1}\" is not valid in {2}"
msgstr ""
-#: src/rougail/user_datas.py:229
-msgid "the variable \"{0}\" contains secrets and should not be defined in {1}"
+#: src/rougail/user_data.py:230
+msgid "the variable contains secrets and should not be defined in {0}"
msgstr ""
-#: src/rougail/user_datas.py:269
+#: src/rougail/user_data.py:269
msgid "loaded from {0}"
msgstr ""
-#: src/rougail/user_datas.py:311
-msgid "cannot set the value \"{0}\" to the family {1}, it will be ignored when loading from {2}"
+#: src/rougail/user_data.py:311
+msgid "is a family so we cannot set the value \"{0}\", it has been loading from {1}"
msgstr ""
-#: src/rougail/user_datas.py:322 src/rougail/user_datas.py:339
-msgid "{0} loaded from {1}"
+#: src/rougail/user_data.py:315
+msgid "is a family so we cannot set the value \"{0}\", it will be ignored when loading from {1}"
msgstr ""
-#: src/rougail/user_datas.py:327
+#: src/rougail/user_data.py:326
+msgid "{0}, it has been loaded from {1}"
+msgstr ""
+
+#: src/rougail/user_data.py:332
+msgid "variable or family \"{0}\" does not exist, it has been loading from {1}"
+msgstr ""
+
+#: src/rougail/user_data.py:336
msgid "variable or family \"{0}\" does not exist, it will be ignored when loading from {1}"
msgstr ""
-#: src/rougail/user_datas.py:333
+#: src/rougail/user_data.py:342
+msgid "\"{0}\" is the name of a dynamic family, it has been loading from {1}"
+msgstr ""
+
+#: src/rougail/user_data.py:346
msgid "\"{0}\" is the name of a dynamic family, it will be ignored when loading from {1}"
msgstr ""
-#: src/rougail/user_datas.py:369
+#: src/rougail/user_data.py:354
+msgid "{0} loaded from {1}"
+msgstr ""
+
+#: src/rougail/user_data.py:385
+msgid "variable {0} at index \"{1}\" is {2}, it has been loading from {3}"
+msgstr ""
+
+#: src/rougail/user_data.py:389
msgid "variable {0} at index \"{1}\" is {2}, it will be ignored when loading from {3}"
msgstr ""
-#: src/rougail/user_datas.py:380
-msgid "family {0} is {1}, {2} at index \"{3}\" will be ignored when loading from {4}"
+#: src/rougail/user_data.py:402
+msgid "family {0} is {1}, {2} at index \"{3}\", it has been loading from {4}"
msgstr ""
-#: src/rougail/user_datas.py:393
-msgid "variable {0} is {1}, it will be ignored when loading from {2}"
+#: src/rougail/user_data.py:406
+msgid "family {0} is {1}, {2} at index \"{3}\", it will be ignored when loading from {4}"
msgstr ""
-#: src/rougail/user_datas.py:401
-msgid "family {0} is {1}, {2} will be ignored when loading from {3}"
+#: src/rougail/user_data.py:421
+msgid "variable is {0}, it has been loading from {1}"
msgstr ""
-#: src/rougail/user_datas.py:421
+#: src/rougail/user_data.py:425
+msgid "variable is {0}, it will be ignored when loading from {1}"
+msgstr ""
+
+#: src/rougail/user_data.py:435
+msgid "family {0} is {1}, so cannot access to {2}, it has been loading from {3}"
+msgstr ""
+
+#: src/rougail/user_data.py:439
+msgid "family {0} is {1}, so cannot access to {2}, it will be ignored when loading from {3}"
+msgstr ""
+
+#: src/rougail/user_data.py:461
+msgid "the value \"{0}\" is an invalid {1} for {2} at index \"{3}\", {4}, it has been loading from {5}"
+msgstr ""
+
+#: src/rougail/user_data.py:465
msgid "the value \"{0}\" is an invalid {1} for {2} at index \"{3}\", {4}, it will be ignored when loading from {5}"
msgstr ""
-#: src/rougail/user_datas.py:435
-msgid "the value \"{0}\" is an invalid {1} for {2}, {3}, it will be ignored when loading from {4}"
+#: src/rougail/user_data.py:481
+msgid "the value \"{0}\" is an invalid {1}, {2}, it has been loading from {3}"
+msgstr ""
+
+#: src/rougail/user_data.py:485
+msgid "the value \"{0}\" is an invalid {1}, {2}, it will be ignored when loading from {3}"
msgstr ""
#: src/rougail/utils.py:56
msgid "invalid variable or family name \"{0}\" must only contains lowercase ascii character, number or _"
msgstr ""
-#: src/rougail/utils.py:103
-msgid "error in jinja \"{0}\" for the variable \"{1}\": {2}"
-msgstr ""
-
-#: src/rougail/utils.py:212
-msgid "mandatory"
+#: src/rougail/utils.py:104
+msgid "error for the variable \"{1}\" in jinja \"{0}\": {2}"
msgstr ""
#: src/rougail/utils.py:213
-msgid "hidden"
+msgid "mandatory"
msgstr ""
#: src/rougail/utils.py:214
-msgid "disabled"
+msgid "hidden"
msgstr ""
#: src/rougail/utils.py:215
-msgid "unique"
+msgid "disabled"
msgstr ""
#: src/rougail/utils.py:216
+msgid "unique"
+msgstr ""
+
+#: src/rougail/utils.py:217
msgid "auto modified"
msgstr ""
diff --git a/src/rougail/config/__init__.py b/src/rougail/config/__init__.py
index d388cc635..62458d5ab 100644
--- a/src/rougail/config/__init__.py
+++ b/src/rougail/config/__init__.py
@@ -76,31 +76,33 @@ class _RougailConfig:
self.add_extra_options = add_extra_options
self.root = None
- def copy(self):
- rougailconfig = _RougailConfig(
- self.backward_compatibility,
- self.add_extra_options,
+ def copy(self, backward_compatibility=None):
+ if not self.root:
+ self.generate_config()
+ config = self.config.config.copy()
+ config.value.importation(self.config.value.exportation())
+ config.property.importation(
+ self.config.property.exportation()
)
- if self.root:
- rougailconfig.generate_config()
- rougailconfig.config.value.importation(self.config.value.exportation())
- rougailconfig.config.property.importation(
- self.config.property.exportation()
- )
- rougailconfig.config.property.read_only()
- rougailconfig.extra_vars = self.extra_vars.copy()
- for variable in self.not_in_tiramisu:
- value = getattr(self, variable)
- if not isinstance(value, str):
- value = value.copy()
- setattr(rougailconfig, variable, value)
+ config.property.read_only()
+ if backward_compatibility is None:
+ backward_compatibility = self.backward_compatibility
+ rougailconfig = _RougailConfig(backward_compatibility, self.add_extra_options)
+ rougailconfig.root = self.root
+ rougailconfig.config = config
+ rougailconfig.extra_vars = self.extra_vars.copy()
+ rougailconfig.not_in_tiramisu = NOT_IN_TIRAMISU | rougailconfig.extra_vars
+ for variable in self.not_in_tiramisu:
+ value = getattr(self, variable)
+ if not isinstance(value, str):
+ value = value.copy()
+ setattr(rougailconfig, variable, value)
return rougailconfig
def generate_config(self):
- root, extra_vars = _rougail_config(
+ self.root, extra_vars = _rougail_config(
self.backward_compatibility, self.add_extra_options
)
- self.root = root
self.config = Config(
self.root,
)
@@ -123,8 +125,6 @@ class _RougailConfig:
setattr(self, key, value)
else:
self.config.property.read_write()
- if key == "export_with_import":
- key = "not_export_with_import"
key = RENAMED.get(key, key)
option = self.config.option(key)
if option.isoptiondescription() and option.isleadership():
@@ -139,8 +139,6 @@ class _RougailConfig:
follower = option.followers()[0]
for idx, val in enumerate(followers):
self.config.option(follower.path(), idx).value.set(val)
- elif key == "not_export_with_import":
- option.value.set(not value)
else:
option.value.set(value)
self.config.property.read_only()
@@ -153,14 +151,10 @@ class _RougailConfig:
self.generate_config()
if key in self.not_in_tiramisu:
return getattr(self, key)
- if key == "export_with_import":
- key = "not_export_with_import"
option = self.config.option(key)
if option.isoptiondescription() and option.isleadership():
return self.get_leadership(option)
ret = self.config.option(key).value.get()
- if key == "not_export_with_import":
- return not ret
return ret
def __contains__(
@@ -261,19 +255,21 @@ class FakeRougailConvert(RougailConvert):
self.internal_functions = []
self.force_optional = False
self.structurals = ["commandline"]
- self.user_datas = []
+ self.user_data = []
self.output = None
self.add_extra_options = self.add_extra_options
self.tiramisu_cache = False
+ # self.tiramisu_cache = "a.py"
self.load_unexist_redefine = False
-def _rougail_config(
- backward_compatibility: bool = True,
- add_extra_options: bool = True,
-) -> "OptionDescription":
+def get_common_rougail_config(
+ *,
+ backward_compatibility=True,
+) -> str:
rougail_options = f"""default_structural_format_version:
- description: {_('Structure format version by default, if not specified in structure file')}
+ description: {_('Default version of the structural file format')}
+ help: {_('This value is only used if the version is not set in the structural file')}
alternative_name: v
choices:
- '1.0'
@@ -282,6 +278,7 @@ def _rougail_config(
functions_files:
description: {_("File with functions")}
+ help: {_("This file contains filters and additional Jinja2 functions usable in structure files")}
alternative_name: c
type: unix_filename
params:
@@ -311,17 +308,20 @@ default_family_mode:
{{% if modes_level %}}
{{{{ modes_level[0] }}}}
{{% endif %}}
+ description: {_('the first one defined in "modes_level"')}
disabled:
jinja: |
{{% if not modes_level %}}
No mode
{{% endif %}}
+ description: {_('when no mode is defined in "modes_level"')}
validators:
- type: jinja
jinja: |
{{% if default_family_mode not in modes_level %}}
not in modes_level ({{modes_level}})
{{% endif %}}
+ description: {_('this mode must be available in "modes_level"')}
commandline: false
default_variable_mode:
@@ -335,17 +335,20 @@ default_variable_mode:
{{{{ modes_level[1] }}}}
{{% endif %}}
{{% endif %}}
+ description: {_('if the variable "modes_level" is defined, the default value is the second available element, otherwise, the first')}
disabled:
jinja: |
{{% if not modes_level %}}
No mode
{{% endif %}}
+ description: {_('when no mode is defined in "modes_level"')}
validators:
- type: jinja
jinja: |
{{% if default_variable_mode not in modes_level %}}
not in modes_level ({{modes_level}})
{{% endif %}}
+ description: {_('this mode must be available in "modes_level"')}
commandline: false
base_option_name:
@@ -353,18 +356,21 @@ base_option_name:
default: baseoption
commandline: false
-not_export_with_import:
+export_with_import:
description: {_("In cache file, do not importation of Tiramisu and other dependencies")}
- default: false
+ default: true
commandline: false
tiramisu_cache:
- description: {_("Tiramisu cache filename")}
+ description: {_("Store Tiramisu cache filename")}
+ help: "{_("This file contains the Tiramisu instructions used internally to load the variables.\n\nThis file can be used for debugging")}"
alternative_name: t
type: unix_filename
mandatory: false
params:
allow_relative: true
+ types:
+ - file
internal_functions:
description: {_("Name of internal functions that we can use as a function")}
@@ -393,11 +399,11 @@ load_unexist_redefine:
commandline: false
default: False
-secret_manager:
+secret_manager: # {_("The secret manager")}
pattern:
- description: {_("The secret pattern to build item name in Bitwarden")}
- help: {_("The pattern is in Jinja format")}
+ description: {_("The secret pattern to constructing the name of the item searched for in the secret manager")}
+ help: {_("The pattern is in Jinja2 format")}
default: "{{{{ project }}}} - {{{{ environment }}}} - {{{{ service }}}} - {{{{ user }}}}"
"""
@@ -406,6 +412,10 @@ secret_manager:
"user data": [],
"output": [],
}
+ processes_tr = {"structural": _("structural"),
+ "user data": _("user datas"),
+ "output": _("output"),
+ }
processes_empty = []
for module in get_sub_modules().values():
data = module.get_rougail_config(backward_compatibility=backward_compatibility)
@@ -421,20 +431,18 @@ secret_manager:
if processes[process]:
objects = processes[process]
process_name = normalize_family(process)
- tr_process_name = _(process_name)
+ tr_process_name = processes_tr[process]
rougail_process += f"""
{process_name}:
description: {_('Select for {0}').format(tr_process_name)}
"""
if process != "structural":
- rougail_process += """
- alternative_name: {NAME[0]}
+ rougail_process += """ alternative_name: {NAME[0]}
""".format(
NAME=normalize_family(process),
)
- rougail_process += """
- choices:
+ rougail_process += """ choices:
"""
for obj in objects:
rougail_process += f" - {obj['name']}\n"
@@ -444,24 +452,6 @@ secret_manager:
default:
- directory
"""
- hidden_outputs = [
- process["name"]
- for process in processes["output"]
- if process.get("allow_user_data", True)
- ]
- if hidden_outputs:
- rougail_process += """
- hidden:
- type: jinja
- jinja: |
-"""
- for hidden_output in hidden_outputs:
- rougail_process += """ {% if _.output is not propertyerror and _.output == 'NAME' %}
- Cannot load structural for NAME output
- {% endif %}
-""".replace(
- "NAME", hidden_output
- )
elif process == "user data":
rougail_process += """ multi: true
mandatory: false"""
@@ -479,7 +469,8 @@ secret_manager:
for hidden_output in hidden_outputs:
rougail_process += """ {% if _.output is not propertyerror and _.output == 'NAME' %}
Cannot load user data for NAME output
- {% endif %}""".replace(
+ {% endif %}
+ description: _('cannot load user data for NAME output')""".replace(
"NAME", hidden_output
)
elif objects:
@@ -505,6 +496,7 @@ secret_manager:
PROP=prop,
)
rougail_process += f"""
+
define_default_params: false # {_('Override default parameters for option type')}
default_params:
@@ -514,20 +506,35 @@ default_params:
when: false
"""
- for typ, params in get_convert_option_types():
+ for typ, typ_description, params in get_convert_option_types():
rougail_process += f"""
- {typ}:
+ {typ}: # {typ_description}
"""
- for key, key_type, multi, value in params:
+ for key, key_type, description, multi, value, choices in params:
rougail_process += f"""
{key}:
- type: {key_type}
+"""
+ if description:
+ rougail_process += f""" description: "{description}"
+"""
+ rougail_process += f""" type: {key_type}
multi: {multi}
mandatory: false
default: {value}
"""
- # print(rougail_process)
+ if choices:
+ rougail_process += " choices:\n"
+ for choice in choices:
+ rougail_process += f" - {choice}\n"
rougail_options += rougail_process
+ return processes, processes_empty, rougail_options
+
+
+def _rougail_config(
+ backward_compatibility: bool = True,
+ add_extra_options: bool = True,
+) -> "OptionDescription":
+ processes, processes_empty, rougail_options = get_common_rougail_config(backward_compatibility=backward_compatibility)
convert = FakeRougailConvert(add_extra_options)
convert.init()
convert.namespace = None
diff --git a/src/rougail/convert/object_model.py b/src/rougail/convert/object_model.py
index f24a972c6..88488f2c5 100644
--- a/src/rougail/convert/object_model.py
+++ b/src/rougail/convert/object_model.py
@@ -43,6 +43,7 @@ BASETYPE = Union[StrictBool, StrictInt, StrictFloat, StrictStr, None]
def get_convert_option_types():
for typ, datas in CONVERT_OPTION.items():
+ typ_description = datas.get("msg", typ)
obj = getattr(tiramisu, datas["opttype"])
initkwargs = datas.get("initkwargs", {})
if obj == tiramisu.SymLinkOption:
@@ -58,16 +59,25 @@ def get_convert_option_types():
for key, value in extra.items():
if key.startswith("_"):
continue
- multi = False
- if isinstance(value, bool):
+ if "params" in datas and key in datas["params"]:
+ multi = datas["params"][key].get('multi', False)
+ description = datas["params"][key]["description"]
+ choices = datas["params"][key].get("choices")
+ else:
+ description = None
+ choices = None
+ multi = False
+ if choices:
+ key_type = "choice"
+ elif isinstance(value, bool):
key_type = "boolean"
elif isinstance(value, str):
key_type = "string"
elif isinstance(value, list):
key_type = "string"
multi = True
- params.append((key, key_type, multi, value))
- yield typ, params
+ params.append((key, key_type, description, multi, value, choices))
+ yield typ, typ_description, params
class Param(BaseModel):
@@ -101,6 +111,7 @@ class VariableParam(Param):
variable: str
propertyerror: bool = True
whole: bool = False
+ dynamic: bool = True
optional: bool = False
def to_param(
@@ -311,7 +322,7 @@ class JinjaCalculation(Calculation):
idx += 1
objectspace.jinja[jinja_path] = self.jinja
if return_type in RENAME_TYPE:
- warning = _('the variable "{0}" has a depreciated return_type "{1}", please use "{2}" instead in "{3}"')
+ warning = _('the variable "{0}" has a depreciated return_type "{1}", please use "{2}" instead in {3}')
warn(
warning.format(self.path, return_type, RENAME_TYPE[return_type], display_xmlfiles(self.xmlfiles)),
DeprecationWarning,
@@ -460,9 +471,12 @@ class JinjaCalculation(Calculation):
objectspace,
)
elif self.attribute_name == "dynamic":
+ return_type = self.return_type
+ if return_type is None:
+ return_type = "string"
return self._jinja_to_function(
"jinja_to_function",
- "string",
+ return_type,
True,
objectspace,
)
@@ -833,7 +847,10 @@ class VariablePropertyCalculation(_VariableCalculation):
when = []
else:
if variable.type != "boolean":
- raise Exception("only boolean!")
+ msg = _(
+ '"when" or "when_not" is mandatory for the not boolean variable "{0}" in attribute "{1}"'
+ ).format(self.path, self.attribute_name)
+ raise DictConsistencyError(msg, 106, variable.xmlfiles)
when = True
inverse = False
params["when"] = when
@@ -1076,6 +1093,7 @@ class Variable(BaseModel):
unique: Optional[bool] = None
hidden: Union[bool, Calculation] = False
disabled: Union[bool, Calculation] = False
+ frozen: Union[bool, Calculation] = False
# others
path: str
namespace: Optional[str]
diff --git a/src/rougail/convert/tiramisureflector.py b/src/rougail/convert/tiramisureflector.py
index d95b90b0a..0fe6e6935 100644
--- a/src/rougail/convert/tiramisureflector.py
+++ b/src/rougail/convert/tiramisureflector.py
@@ -82,15 +82,15 @@ class TiramisuReflector:
continue
self.text["header"].append(f"load_functions('{funcs_path}')")
if self.objectspace.export_with_import:
- if self.objectspace.has_namespace:
- self.text["header"].extend(
- [
- "try:",
- " groups.namespace",
- "except:",
- " groups.addgroup('namespace')",
- ]
- )
+# if self.objectspace.has_namespace:
+ self.text["header"].extend(
+ [
+ "try:",
+ " groups.namespace",
+ "except:",
+ " groups.addgroup('namespace')",
+ ]
+ )
for mode in self.objectspace.modes_level:
self.text["header"].append(f'ALLOWED_LEADER_PROPERTIES.add("{mode}")')
self.make_tiramisu_objects()
@@ -338,11 +338,18 @@ class Common:
"""build variable parameters"""
variable = param["variable"]
whole = param.get("whole", False)
+ dynamic = param.get("dynamic", True)
if variable.path == self.elt.path:
- return f"ParamSelfOption(whole={whole})"
+ ret = f"ParamSelfOption(whole={whole}"
+ if not dynamic:
+ ret += ", dynamic=False"
+ return ret + ')'
if whole:
- msg = f'variable param "{variable.path}" has whole attribute but it\'s not allowed for external variable'
- raise DictConsistencyError(msg, 34, self.elt.xmlfiles)
+ msg = _('variable param "{0}" has whole attribute but it\'s not allowed for external variable')
+ raise DictConsistencyError(msg.format(variable.path), 34, self.elt.xmlfiles)
+ if not dynamic:
+ msg = _('variable param "{0}" has dynamic attribute but it\'s not allowed for external variable')
+ raise DictConsistencyError(msg.format(variable.path), 34, self.elt.xmlfiles)
option_name = self.tiramisu.reflector_objects[variable.path].get(
self.calls, self.elt.path
)
diff --git a/src/rougail/locale/fr/LC_MESSAGES/rougail.mo b/src/rougail/locale/fr/LC_MESSAGES/rougail.mo
index 403a3f487..bd475d13c 100644
Binary files a/src/rougail/locale/fr/LC_MESSAGES/rougail.mo and b/src/rougail/locale/fr/LC_MESSAGES/rougail.mo differ
diff --git a/src/rougail/structural_commandline/annotator.py b/src/rougail/structural_commandline/annotator.py
index 543f6e011..0e35035b6 100644
--- a/src/rougail/structural_commandline/annotator.py
+++ b/src/rougail/structural_commandline/annotator.py
@@ -59,6 +59,7 @@ class Annotator(Walk):
return
alternative_name = variable.alternative_name
variable_path = variable.path
+ self.objectspace.informations.add(variable_path, "alternative_name", alternative_name)
all_letters = ""
for letter in alternative_name:
all_letters += letter
diff --git a/src/rougail/structural_commandline/config.py b/src/rougail/structural_commandline/config.py
index 99aa6506b..263ba7b3c 100644
--- a/src/rougail/structural_commandline/config.py
+++ b/src/rougail/structural_commandline/config.py
@@ -33,7 +33,7 @@ structural_commandline:
default: true
"""
return {
- "name": "cmdline",
+ "name": "commandline",
"process": "structural",
"options": options,
"level": 20,
diff --git a/src/rougail/structural_directory/__init__.py b/src/rougail/structural_directory/__init__.py
index a7c62b156..61f858225 100644
--- a/src/rougail/structural_directory/__init__.py
+++ b/src/rougail/structural_directory/__init__.py
@@ -141,12 +141,12 @@ class Walker:
"""Parse file"""
with open(filename, encoding="utf8") as file_fh:
objects = self.yaml.load(file_fh)
+ if objects is None:
+ return
version = self.convert.validate_file_version(
objects,
filename,
)
- if objects is None:
- return
self.convert.parse_root_file(
filename,
path,
diff --git a/src/rougail/structural_directory/config.py b/src/rougail/structural_directory/config.py
index 6398f9c51..d7f3a53b7 100644
--- a/src/rougail/structural_directory/config.py
+++ b/src/rougail/structural_directory/config.py
@@ -28,6 +28,17 @@ def get_rougail_config(
else:
main_namespace_default = "null"
options = f"""
+main_namespace:
+ description: {_("Main namespace name")}
+ default: {main_namespace_default}
+ alternative_name: s
+ mandatory: false
+ disabled:
+ jinja: >-
+ {{{{ 'directory' not in _.step.structural and 'string' not in _.step.structural }}}}
+ return_type: boolean
+ description: {_('directory or string is not in "_.step.structural"')}
+
main_structural_directories:
description: {_("Directories where structural files are placed")}
type: unix_filename
@@ -54,32 +65,21 @@ sort_structural_files_all:
directory is not in _.step.structural
{{% endif %}}
-main_namespace:
- description: {_("Main namespace name")}
- default: {main_namespace_default}
- alternative_name: s
- mandatory: false
- disabled:
- jinja: >-
- {{{{ 'directory' not in _.step.structural }}}}
- return_type: boolean
- description: directory is not in _.step.structural
-
isolated_namespace:
description: {_("Namespaces are isolated")}
default: true
disabled:
jinja: >-
- {{{{ 'directory' not in _.step.structural or not _.main_namespace }}}}
+ {{{{ 'directory' not in _.step.structural and 'string' not in _.step.structural }}}}
return_type: boolean
- description: directory is not in _.step.structural or main_namespace is not set
+ description: {_('directory or string is not in "_.step.structural" or "_.main_namespace" is not set')}
extra_namespaces:
description: {_("Extra namespaces")}
type: leadership
disabled:
jinja: >-
- {{{{ 'directory' not in _.step.structural or not _.main_namespace }}}}
+ {{{{ ('directory' not in _.step.structural and 'string' not in _.step.structural) or not _.main_namespace }}}}
return_type: boolean
description: directory is not in _.step.structural or main_namespace is not set
@@ -99,6 +99,11 @@ extra_namespaces:
types:
- directory
multi: true
+ disabled:
+ jinja: >-
+ {{{{ 'directory' not in __.step.structural }}}}
+ return_type: boolean
+ description: {_('directory is not in "__.step.structural"')}
"""
return {
"name": "directory",
diff --git a/src/rougail/tiramisu.py b/src/rougail/tiramisu.py
index db43ad524..25a6cf8f7 100644
--- a/src/rougail/tiramisu.py
+++ b/src/rougail/tiramisu.py
@@ -82,54 +82,127 @@ def convert_boolean(value: str) -> bool:
return None
raise Exception(_('unknown boolean value "{0}"').format(value))
+_ip_params = {
+ "cidr": {"description": _("IP must be in CIDR format")},
+ "private_only": {"description": _("private IP are allowed")},
+ "allow_reserved": {"description": _("reserved IP are allowed")},
+ }
+_network_params = {
+ "cidr": {"description": _("network must be in CIDR format")},
+ "private_only": {"description": _("private network are allowed")},
+ "allow_reserved": {"description": _("reserved network are allowed")},
+ }
+_port_params = {
+ "allow_range": {"description": _("can be range of port")},
+ "allow_protocol": {"description": _("can have the protocol")},
+ "allow_zero": {"description": _("port 0 is allowed")},
+ "allow_wellknown": {"description": _("well-known ports (1 to 1023) are allowed")},
+ "allow_registred": {"description": _("registred ports (1024 to 49151) are allowed")},
+ "allow_private": {"description": _("private ports (greater than 49152) are allowed")},
+ }
+_domain_params = {
+ "type": {"description": _("type of domainname"), "choices": ('domainname', 'netbios', 'hostname'), 'doc': _("type {0}")},
+ "allow_startswith_dot": {"description": _("the domain name can starts by a dot")},
+ "allow_without_dot": {"description": _("the domain name can be a hostname")},
+ "allow_ip": {"description": _("the domain name can be an IP")},
+ "allow_cidr_network": {"description": _("the domain name can be network in CIDR format")},
+ "test_existence": {"description": _("the domain name must exist")},
+ }
+_web_params = _port_params | _domain_params
+
CONVERT_OPTION = {
"string": dict(opttype="StrOption", example="example"),
- "number": dict(opttype="IntOption", func=int, example=42),
- "integer": dict(opttype="IntOption", func=int, example=42),
+ "number": dict(opttype="IntOption",
+ func=int,
+ params={
+ "min_number": {"description": _("the minimum value"), 'doc': _("the minimum value is {0}")},
+ "max_number": {"description": _("the maximum value"), 'doc': _("the maximum value is {0}")},
+ },
+ example=42),
+ "integer": dict(opttype="IntOption",
+ params={
+ "min_integer": {"description": _("the minimum value"), 'doc': _("the minimum value is {0}")},
+ "max_integer": {"description": _("the maximum value"), 'doc': _("the maximum value is {0}")},
+ },
+ func=int,
+ example=42,
+ ),
"float": dict(opttype="FloatOption", func=float, example=1.42),
"boolean": dict(opttype="BoolOption", func=convert_boolean),
- "secret": dict(opttype="PasswordOption", example="secrets"),
+ "secret": dict(opttype="PasswordOption",
+ params={
+ "min_len": {"description": _("minimum characters length for the secret"), "doc": _("minimum length for the secret is {0} characters")},
+ "max_len": {"description": _("maximum characters length for the secret"), "doc": _("maximum length for the secret is {0} characters")},
+ "forbidden_char": {"description": _("forbidden characters"), "doc": _("forbidden characters: {0}")},
+ },
+ example="secrets"),
"mail": dict(opttype="EmailOption", example="user@example.net"),
- "unix_filename": dict(opttype="FilenameOption", example="/tmp/myfile.txt"),
+ "unix_filename": dict(opttype="FilenameOption",
+ msg="UNIX filename",
+ params={
+ "allow_relative": {"description": _("this filename could be a relative path")},
+ "test_existence": {"description": _("this file must exist")},
+ "types": {"description": _("file type allowed"), "doc": _("file type allowed: {0}"), "choices": ("file", "directory"), "multi": True},
+ },
+ example="/tmp/myfile.txt"),
"date": dict(opttype="DateOption", example="2000-01-01"),
- "unix_user": dict(opttype="UsernameOption", example="username"),
+ "unix_user": dict(opttype="UsernameOption", example="username",
+ msg="UNIX user"
+ ),
"ip": dict(
- opttype="IPOption", initkwargs={"allow_reserved": True}, example="1.1.1.1"
+ opttype="IPOption", initkwargs={"allow_reserved": True},
+ msg="IP",
+ params=_ip_params,
+ example="1.1.1.1"
),
- "cidr": dict(opttype="IPOption", initkwargs={"cidr": True}, example="1.1.1.0/24"),
+ "cidr": dict(opttype="IPOption", msg="CIDR", initkwargs={"cidr": True},
+ params=_ip_params,
+ example="1.1.1.0/24"),
"netmask": dict(opttype="NetmaskOption", example="255.255.255.0"),
- "network": dict(opttype="NetworkOption", example="1.1.1.0"),
+ "network": dict(opttype="NetworkOption",
+ params=_network_params,
+ example="1.1.1.0"),
"network_cidr": dict(
- opttype="NetworkOption", initkwargs={"cidr": True}, example="1.1.1.0/24"
+ opttype="NetworkOption", initkwargs={"cidr": True}, example="1.1.1.0/24",
+ params=_network_params,
+ msg="network CIDR",
),
"broadcast": dict(opttype="BroadcastOption", example="1.1.1.255"),
"netbios": dict(
opttype="DomainnameOption",
initkwargs={"type": "netbios", "warnings_only": True},
+ params=_domain_params,
example="example",
),
"domainname": dict(
opttype="DomainnameOption",
initkwargs={"type": "domainname", "allow_ip": False},
+ params=_domain_params,
example="example.net",
),
"hostname": dict(
opttype="DomainnameOption",
initkwargs={"type": "hostname", "allow_ip": False},
+ params=_domain_params,
example="example",
),
"web_address": dict(
opttype="URLOption",
initkwargs={"allow_ip": False, "allow_without_dot": True},
+ msg="web address",
+ params=_web_params,
example="https://example.net",
),
"port": dict(
- opttype="PortOption", initkwargs={"allow_private": True}, example="111", func=str,
+ opttype="PortOption", initkwargs={"allow_private": True},
+ params=_port_params,
+ example="111", func=str,
),
"mac": dict(opttype="MACOption", example="00:00:00:00:00"),
"unix_permissions": dict(
opttype="PermissionsOption",
+ msg="UNIX permissions",
initkwargs={"warnings_only": True},
func=int,
example="644",
@@ -159,7 +232,7 @@ def raise_carry_out_calculation_error(subconfig, *args, **kwargs):
ymlfiles = subconfig.config_bag.context.get_values().get_information(
subconfig, "ymlfiles", []
)
- raise ConfigError(_("{0} in {1}").format(err, display_xmlfiles(ymlfiles)))
+ raise ConfigError(_("{0} in {1}").format(err, display_xmlfiles(ymlfiles)), subconfig=subconfig)
errors.raise_carry_out_calculation_error = raise_carry_out_calculation_error
@@ -168,6 +241,7 @@ errors.raise_carry_out_calculation_error = raise_carry_out_calculation_error
global func
dict_env = {}
ENV = SandboxedEnvironment(loader=DictLoader(dict_env), undefined=StrictUndefined)
+ENV.add_extension('jinja2.ext.do')
func = ENV.filters
ENV.compile_templates("jinja_caches", zip=None)
@@ -241,20 +315,8 @@ def tiramisu_display_name(
with_quote: bool = False,
) -> str:
"""Replace the Tiramisu display_name function to display path + description"""
- config_bag = subconfig.config_bag
- context = config_bag.context
- values = context.get_values()
- context_subconfig = context.get_root(config_bag)
- doc = values.get_information(subconfig, "doc", None)
- comment = doc if doc and doc != kls.impl_getname() else ""
- if "{{ identifier }}" in comment and subconfig.identifiers:
- comment = comment.replace("{{ identifier }}", str(subconfig.identifiers[-1]))
- path_in_description = values.get_information(
- context_subconfig, "path_in_description", True
- )
- if path_in_description or not comment:
- comment = f" ({comment})" if comment else ""
- if path_in_description is False:
+ def get_path():
+ if description_type in ["description", "name", "name_and_description"]:
path = kls.impl_getname()
else:
path = kls.impl_getpath()
@@ -262,12 +324,40 @@ def tiramisu_display_name(
path = path.replace(
"{{ identifier }}", normalize_family(str(subconfig.identifiers[-1]))
)
+ return path
+ config_bag = subconfig.config_bag
+ context = config_bag.context
+ values = context.get_values()
+ context_subconfig = context.get_root(config_bag)
+ description_type = values.get_information(
+ context_subconfig, "description_type", "name_and_description"
+ )
+ if description_type in ["description", "name_and_description"]:
+ doc = values.get_information(subconfig, "doc", None)
+ description = doc if doc and doc != kls.impl_getname() else ""
+ if "{{ identifier }}" in description and subconfig.identifiers:
+ description = description.replace("{{ identifier }}", str(subconfig.identifiers[-1]))
+ if description_type in ["name", "path", "name_and_description"]:
+ path = get_path()
+ if description_type == "name_and_description":
+ if description:
+ if with_quote:
+ description = f'"{path}" ({description})'
+ else:
+ description = f"{path} ({description})"
+ else:
+ if with_quote:
+ description = f'"{path}"'
+ else:
+ description = path
else:
- path = comment
- comment = ""
- if with_quote:
- return f'"{path}"{comment}'
- return f"{path}{comment}"
+ if description_type in ["name", "path"]:
+ description = path
+ elif not description:
+ description = get_path()
+ if with_quote:
+ description = f'"{description}"'
+ return description
def rougail_calc_value(*args, __default_value=None, __internal_multi=False, **kwargs):
@@ -307,8 +397,20 @@ def jinja_to_function(
global ENV, CONVERT_OPTION
kw = {}
for key, value in kwargs.items():
- if isinstance(value, PropertiesOptionError):
- value = JinjaError(value)
+ if isinstance(value, list):
+ val = []
+ for v in value:
+ if isinstance(v, PropertiesOptionError):
+ v = JinjaError(v)
+ if v is None:
+ v = ''
+ val.append(v)
+ value = val
+ else:
+ if isinstance(value, PropertiesOptionError):
+ value = JinjaError(value)
+ if value is None:
+ value = ''
if "." in key:
c_kw = kw
path, var = key.rsplit(".", 1)
@@ -331,17 +433,14 @@ def jinja_to_function(
values = ENV.get_template(__internal_jinja).render(kw, **func).strip()
except Exception as err:
kw_str = ", ".join(kw_to_string(kw))
- raise ConfigError(
- _(
- 'cannot calculating "{0}" attribute for variable "{1}" in {2} with parameters "{3}": {4}'
- ).format(
+ prefix = _('cannot calculate the variable "{0}"').format(__internal_variable)
+ msg = _('the attribute "{0}" in {1} with the parameters "{2}" causes the error: {3}').format(
__internal_attribute,
- __internal_variable,
display_xmlfiles(__internal_files),
kw_str,
err,
)
- ) from err
+ raise ConfigError(msg, prefix=prefix) from err
convert = CONVERT_OPTION[__internal_type].get("func", str)
if __internal_multi:
values = [
@@ -353,9 +452,15 @@ def jinja_to_function(
try:
values = convert(values)
except Exception as err:
- raise ConfigError(
- f'cannot converting "{__internal_attribute}" attribute for variable "{__internal_variable}" in {display_xmlfiles(__internal_files)}: {err}'
- ) from err
+ prefix = _('cannot converting the variable "{0}"').format(__internal_variable)
+ msg = _('"{0}" is an invalid {1}').format(values, __internal_type)
+ if __internal_attribute != "default":
+ msg = _('the attribute "{0}" in {1} causes the error: {2}').format(
+ __internal_attribute,
+ display_xmlfiles(__internal_files),
+ msg,
+ )
+ raise ConfigError(msg, prefix=prefix) from err
values = values if values != "" and values != "None" else None
if values is None and __default_value is not None:
return __default_value