rougail/doc/dev/README.md

192 lines
4.5 KiB
Markdown
Raw Normal View History

2022-11-10 22:58:24 +01:00
# La bibliothèque Rougail
2021-02-14 10:12:42 +01:00
2022-11-10 22:58:24 +01:00
Rougail est une bibliothèque qui permet de charger simplement des dictionnaires et de générer des templates.
2021-02-14 10:12:42 +01:00
2022-11-10 22:58:24 +01:00
Dans les exemples suivant, nous utiliserons une configuration particulière de Rougail.
Vous retrouverez toutes les options pour [personnaliser les répertoires utilisés](config.md).
2021-02-14 10:12:42 +01:00
2022-11-10 22:58:24 +01:00
Le script contiendra donc les éléments de configuration suivant :
2021-02-14 10:12:42 +01:00
2022-11-10 22:58:24 +01:00
```python
from rougail import RougailConfig
2021-02-14 10:12:42 +01:00
2022-11-10 22:58:24 +01:00
RougailConfig['dictionaries_dir'] = ['dict']
RougailConfig['templates_dir'] = ['tmpl']
RougailConfig['tmp_dir'] = 'tmp'
RougailConfig['destinations_dir'] = 'dest'
RougailConfig['functions_file'] = 'funcs/functions.py'
2021-02-14 10:12:42 +01:00
```
2022-11-10 22:58:24 +01:00
Penser a créer les répertoires :
2021-02-14 10:12:42 +01:00
2022-11-10 22:58:24 +01:00
```bash
mkdir dest dict tmp tmpl extras
2021-02-14 10:12:42 +01:00
```
2022-11-10 22:58:24 +01:00
## Convertisons un dictionnaire
Un dictionnaire est un ensemble d'instruction qui vont permettre de créer des variables.
2021-02-14 10:12:42 +01:00
2022-11-10 22:58:24 +01:00
Commençons par créer un [dictionnaire](../dictionary/rougail.md) simple.
2021-02-14 10:12:42 +01:00
2022-11-10 22:58:24 +01:00
Voici un premier dictionnaire dict/00-base.yml :
2021-02-14 10:12:42 +01:00
2022-11-03 22:17:43 +01:00
```xml
2022-11-10 22:58:24 +01:00
version: '0.10'
variables:
- variable:
- name: my_variable
value:
- text: my_value
2021-02-14 10:12:42 +01:00
```
2022-11-10 22:58:24 +01:00
Puis, créons les objets [Tiramisu](https://framagit.org/tiramisu/tiramisu) :
2021-02-14 10:12:42 +01:00
2021-02-14 18:03:15 +01:00
```python
2022-11-10 22:58:24 +01:00
from rougail import Rougail, RougailConfig
from asyncio import run
2021-02-14 10:12:42 +01:00
2022-11-10 22:58:24 +01:00
async def main():
RougailConfig['dictionaries_dir'] = ['dict']
rougail = Rougail()
config = await rougail.get_config()
print(await config.value.dict())
2021-02-14 10:12:42 +01:00
2022-11-10 22:58:24 +01:00
run(main())
2021-02-14 10:12:42 +01:00
```
2022-11-10 22:58:24 +01:00
Exécution le script :
2021-02-14 10:12:42 +01:00
2022-11-10 22:58:24 +01:00
```python
$ python3 script.py
{'rougail.my_variable': 'my_value'}
2021-02-14 10:12:42 +01:00
```
2022-11-10 22:58:24 +01:00
## Convertisons un dictionnaire extra
L'espace de nommage par défaut des variables et familles est "rougail". Il est possible de définir d'autres espaces de nom.
Ces espaces de nom additionnels s'appelle des "[extras](../dictionary/extra.md)".
Les espaces de nom additionnels se définissent lors de la configuration.
Par exemple, voici comment ajouter une espace de nom "example" :
2021-02-14 10:12:42 +01:00
2022-11-10 22:58:24 +01:00
```python
RougailConfig['extra_dictionaries']['example'] = ['extras/']
2021-02-14 10:12:42 +01:00
```
2022-11-10 22:58:24 +01:00
Ensuite créons un dictionnaire extra extras/00-base.yml :
```xml
version: '0.10'
variables:
- variable:
- name: my_variable_extra
value:
- text: my_value_extra
2021-02-14 10:12:42 +01:00
```
2022-11-10 22:58:24 +01:00
Construisons les objets Tiramisu :
2021-02-14 10:12:42 +01:00
2021-02-14 18:03:15 +01:00
```python
2022-11-10 22:58:24 +01:00
from rougail import Rougail, RougailConfig
from asyncio import run
2021-02-14 10:12:42 +01:00
2022-11-10 22:58:24 +01:00
async def main():
RougailConfig['dictionaries_dir'] = ['dict']
RougailConfig['extra_dictionaries']['example'] = ['extras/']
rougail = Rougail()
config = await rougail.get_config()
print(await config.value.dict())
2021-02-14 10:12:42 +01:00
2022-11-10 22:58:24 +01:00
run(main())
2021-02-14 10:12:42 +01:00
```
2022-11-10 22:58:24 +01:00
Exécution le script :
2021-02-14 18:03:15 +01:00
2022-11-10 22:58:24 +01:00
```python
$ python3 script.py
{'rougail.my_variable': 'my_value', 'example.my_variable_extra': 'my_value_extra'}
2021-02-14 18:03:15 +01:00
```
2021-02-14 10:12:42 +01:00
2022-11-10 22:58:24 +01:00
## Templatisons un fichier
2021-02-14 10:12:42 +01:00
2022-11-10 22:58:24 +01:00
Un template est un fichier dans laquelle on va remplacer les valeurs attendus par le nom des variables.
2021-02-14 10:12:42 +01:00
2022-11-10 22:58:24 +01:00
Premièrement déclarons dans un dictionnaire complémentaire notre template dict/00-template.yml :
2021-02-14 10:12:42 +01:00
2022-11-10 22:58:24 +01:00
```xml
version: '0.10'
services:
- service:
- name: test
file:
- text: /etc/example.conf
2021-02-14 10:12:42 +01:00
```
2022-11-11 15:20:07 +01:00
Et un template tmpl/example.conf (par défaut il est généré via une configuration particulière de [Cheetah](https://cheetahtemplate.org/) :
2021-02-14 10:12:42 +01:00
```
2022-11-10 22:58:24 +01:00
The value: %%my_variable
2021-02-14 10:12:42 +01:00
2022-11-10 22:58:24 +01:00
The extra value: %%example.my_variable_extra
2021-02-14 10:12:42 +01:00
```
2022-11-10 22:58:24 +01:00
Générons le template :
2021-02-14 10:12:42 +01:00
2022-11-10 22:58:24 +01:00
```python
from rougail import Rougail, RougailConfig
from asyncio import run
2021-02-14 10:12:42 +01:00
2022-11-10 22:58:24 +01:00
async def main():
RougailConfig['dictionaries_dir'] = ['dict']
RougailConfig['templates_dir'] = ['tmpl']
RougailConfig['tmp_dir'] = 'tmp'
RougailConfig['destinations_dir'] = 'dest'
RougailConfig['extra_dictionaries']['example'] = ['extras/']
RougailConfig['functions_file'] = 'funcs/functions.py'
rougail = Rougail()
config = await rougail.get_config()
await rougail.template()
2021-02-14 10:12:42 +01:00
2022-11-10 22:58:24 +01:00
run(main())
2021-02-14 10:12:42 +01:00
```
2022-11-10 22:58:24 +01:00
Le fichier dest/etc/example.conf est maintenant créé avec le contenu attendu suivant :
2021-02-14 10:12:42 +01:00
```
The value: my_value
The extra value: my_value_extra
```
## Créons une fonction personnalisé
2022-11-10 22:58:24 +01:00
Nous créons un dictionnaire complémentaire pour ajouter un calcul à la variable "my_variable" dans dict/00-fill.yml :
2021-02-14 10:12:42 +01:00
2022-11-10 22:58:24 +01:00
```yml
version: '0.10'
constraints:
- fill:
- name: return_no
target:
- text: my_variable
2021-02-14 10:12:42 +01:00
```
2022-11-10 22:58:24 +01:00
Puis créons la fonction "return_no" dans functions.py :
2021-02-14 10:12:42 +01:00
2021-02-14 18:03:15 +01:00
```python
2021-02-14 10:12:42 +01:00
def return_no():
return 'no'
```
2022-11-10 22:58:24 +01:00
Après avoir reconverti les dictionnaires et regénérer le template nous avons donc le contenu du fichier dest/etc/example.conf :
2021-02-14 10:12:42 +01:00
```
The value: no
The extra value: my_value_extra
```
2021-02-14 18:03:15 +01:00
La valeur de la variable "my_variable" est bien calculé à partir de la fonction "return_no".