rougail/doc/dev/README.md

192 lines
4.4 KiB
Markdown
Raw Normal View History

2021-02-14 10:12:42 +01:00
# La bibliothèque rougail
Rougail est une bibliothèque simple a utiliser.
Dans les exemples suivant, nous utilisons la configuration par défaut de Rougail. Vous pouvez [personnaliser les répertoires utilisés](config.md).
## Convertisons un dictionnaire en objet tiramisu
Commençons par créer un dictionnaire simple.
Voici un premier dictionnaire /srv/rougail/dictionaries/00-base.xml :
```
<?xml version='1.0' encoding='UTF-8'?>
<rougail>
2021-12-11 16:33:55 +01:00
<variables>
<variable name="my_variable">
<value>my_value</value>
</variable>
</variables>
2021-02-14 10:12:42 +01:00
</rougail>
```
Construisons les objets tiramisu :
2021-02-14 18:03:15 +01:00
```python
2021-02-14 10:12:42 +01:00
from rougail import RougailConvert
rougail = RougailConvert()
2021-02-14 18:03:15 +01:00
rougail.save('example.py')
2021-02-14 10:12:42 +01:00
```
2021-02-14 18:03:15 +01:00
Un nouveau fichier 'example.py' va être créé dans le répertoire local
2021-02-14 10:12:42 +01:00
2021-02-14 18:03:15 +01:00
## Convertisons un dictionnaire extra en objet tiramisu
2021-02-14 10:12:42 +01:00
En plus du dictionnaire précédent, créons un dictionnaire extra /srv/rougail/extra_dictionaries/00-base.xml
```
<?xml version='1.0' encoding='UTF-8'?>
<rougail>
2021-12-11 16:33:55 +01:00
<variables>
<variable name="my_variable_extra">
<value>my_value_extra</value>
</variable>
</variables>
2021-02-14 10:12:42 +01:00
</rougail>
```
Construisons les objets tiramisu :
2021-02-14 18:03:15 +01:00
```python
2021-02-14 10:12:42 +01:00
from rougail import RougailConvert, RougailConfig
RougailConfig['extra_dictionaries']['example'] = ['/srv/rougail/extra_dictionaries/']
rougail = RougailConvert()
2021-02-14 18:03:15 +01:00
rougail.save('example.py')
2021-02-14 10:12:42 +01:00
```
## Templatisons un template
Nous créons un dictionnaire complémentaire pour ajouter notre template /srv/rougail/dictionaries/00-template.xml :
```
<?xml version='1.0' encoding='UTF-8'?>
<rougail>
2021-12-11 16:33:55 +01:00
<services>
<service name="example">
<file name="/etc/example.conf"/>
</service>
</services>
2021-02-14 10:12:42 +01:00
</rougail>
```
Et un template /srv/rougail/templates/example.conf :
```
The value: %%my_variable
The extra value: %%example.my_variable_extra
```
Générons le fichier tiramisu :
2021-02-14 18:03:15 +01:00
```python
2021-02-14 10:12:42 +01:00
from rougail import RougailConvert, RougailConfig
RougailConfig['extra_dictionaries']['example'] = ['/srv/rougail/extra_dictionaries/']
rougail = RougailConvert()
2021-02-14 18:03:15 +01:00
rougail.save('example.py')
2021-02-14 10:12:42 +01:00
```
2021-02-14 18:03:15 +01:00
Créer les répertoires utils pour la templatisation :
```bash
mkdir /srv/rougail/destinations /srv/rougail/tmp
```
2021-02-14 10:12:42 +01:00
Générons le template :
2021-02-14 18:03:15 +01:00
```python
2021-02-14 10:12:42 +01:00
import asyncio
2021-02-14 18:03:15 +01:00
from example import option_0
2021-02-14 10:12:42 +01:00
from tiramisu import Config
from rougail import RougailSystemdTemplate
2021-02-14 10:12:42 +01:00
async def template():
config = await Config(option_0)
engine = RougailSystemdTemplate(config)
2021-02-14 10:12:42 +01:00
await engine.instance_files()
loop = asyncio.get_event_loop()
loop.run_until_complete(template())
loop.close()
```
Le fichier /srv/rougail/destinations/etc/example.conf est maintenant créé avec le contenu attendu suivant :
```
The value: my_value
The extra value: my_value_extra
```
## Appliquons un patch au template
Il peut être intéressant de réaliser un patch à un template pour corriger un problème spécifique à notre environnement, sans attendre que le mainteneur du template n'est fait la correction.
Testons en créant le patch /srv/rougail/patches/example.conf.patch :
```
--- /srv/rougail/templates/example.conf 2021-02-13 19:41:38.677491087 +0100
+++ tmp/example.conf 2021-02-13 20:12:55.525089820 +0100
@@ -1,3 +1,5 @@
The value: %%my_variable
The extra value: %%example.my_variable_extra
+
+Add by a patch
```
Le patch est bien appliquer sur notre fichier /srv/rougail/destinations/etc/example.conf :
```
The value: my_value
The extra value: my_value_extra
Add by a patch
```
Deux choses importantes à savoir sur les patchs :
- le nom du patch est obligatoire le nom du template source + ".patch"
2021-02-14 18:03:15 +01:00
- la deuxième ligne doit toujours commencer par "+++ tmp/" + le nom du template source
2021-02-14 10:12:42 +01:00
## Créons une fonction personnalisé
2021-02-14 18:03:15 +01:00
Nous créons un dictionnaire complémentaire pour ajouter un calcul à la variable "my_variable" dans /srv/rougail/dictionaries/00-fill.xml :
2021-02-14 10:12:42 +01:00
```
<?xml version='1.0' encoding='UTF-8'?>
<rougail>
2021-12-11 16:33:55 +01:00
<constraints>
<fill name="return_no">
<target>my_variable</target>
</fill>
</constraints>
2021-02-14 10:12:42 +01:00
</rougail>
```
Puis créons la fonction "return_no" dans /srv/rougail/functions.py :
2021-02-14 18:03:15 +01:00
```python
2021-02-14 10:12:42 +01:00
def return_no():
return 'no'
```
Après avoir reconverti les dictionnaires et regénérer le template nous avons donc le contenu du fichier /srv/rougail/destinations/etc/example.conf :
```
The value: no
The extra value: my_value_extra
Add by a patch
```
2021-02-14 18:03:15 +01:00
La valeur de la variable "my_variable" est bien calculé à partir de la fonction "return_no".