10 étapes vers YAML Zen

Nous aimons tous Ansible, mais Ansible est YAML. Il existe de nombreux formats de fichiers de configuration : listes de valeurs, paires paramètre-valeur, fichiers INI, YAML, JSON, XML et bien d'autres. Cependant, pour plusieurs raisons parmi toutes, YAML est souvent considéré comme particulièrement difficile. En particulier, malgré son minimalisme rafraîchissant et ses capacités impressionnantes pour travailler avec des valeurs hiérarchiques, la syntaxe YAML peut être ennuyeuse avec son approche de l'indentation de type Python.

10 étapes vers YAML Zen

Si YAML vous fait chier, vous pouvez et vous devriez ! – suivez les 10 étapes suivantes pour réduire votre frustration à un niveau acceptable et tomber amoureux de YAML. Comme il sied à cette liste, nos dix conseils seront numérotés de zéro, nous ajouterons à volonté méditations et pratiques spirituelles 😉

0. Faites travailler votre éditeur

Quel que soit l’éditeur de texte dont vous disposez, il existe probablement au moins un plugin pour travailler avec YAML. Si vous n'en avez pas, recherchez-le et installez-le immédiatement. Le temps passé à rechercher et à configurer sera récompensé plusieurs fois à chaque fois que vous devrez modifier YAML.

Par exemple, éditeur Atom prend en charge YAML par défaut, mais pour GNU Emacs, vous devrez installer des packages supplémentaires, par exemple, mode yaml.

10 étapes vers YAML Zen

Emacs en mode YAML et affichant des espaces.

Si votre éditeur préféré ne dispose pas de mode YAML, certains problèmes peuvent être résolus en travaillant avec les paramètres. Par exemple, l'éditeur de texte standard GNOME Gedit n'a pas de mode YAML, mais par défaut il met en évidence la syntaxe YAML et permet de configurer le travail avec les indentations :

10 étapes vers YAML Zen

Définition des retraits dans Gedit.

Un plugin espaces de dessin pour Gedit, affiche les espaces sous forme de points, éliminant les ambiguïtés avec les niveaux d'indentation.

En d’autres termes, passez du temps à découvrir votre éditeur préféré. Découvrez ce que lui ou sa communauté de développement a à offrir pour travailler avec YAML et utilisez ces fonctionnalités. Vous ne le regretterez certainement pas.

1. Utilisez un linter

Idéalement, les langages de programmation et les langages de balisage utilisent une syntaxe prévisible. Les ordinateurs sont doués en matière de prévisibilité, c'est pourquoi le concept de lintera. Si au cours de ses 40 années d’existence, il vous a échappé et que vous n’utilisez toujours pas de linter YAML, alors il est temps d’essayer yamllint.

Installer yamlint Vous pouvez utiliser le gestionnaire de packages Linux standard. Par exemple, dans Red Hat Enterprise Linux 8 ou Fedora c'est fait comme ça:

$ sudo dnf install yamllint

Ensuite, vous exécutez simplement yamllint, en lui transmettant le fichier YAML à vérifier. Voici à quoi cela ressemble si vous transmettez un fichier avec une erreur au linter :

$ yamllint errorprone.yaml
errorprone.yaml
23:10     error    syntax error: mapping values are not allowed here
23:11     error    trailing spaces  (trailing-spaces)

Les chiffres à gauche ne sont pas l'heure, mais les coordonnées de l'erreur : numéro de ligne et de colonne. La description de l’erreur ne vous dit peut-être rien, mais vous savez exactement où elle se trouve. Il suffit de regarder cet endroit dans le code et tout deviendra probablement clair.

Lorsque yamllint ne trouve aucune erreur dans un fichier, rien n'est imprimé à l'écran. Si un tel silence vous fait peur et que vous souhaitez un peu plus de feedback, alors vous pouvez exécuter le linter avec la commande d'écho conditionnel via une double esperluette (&&), comme ceci :

$ yamllint perfect.yaml && echo "OK"
OK

Dans POSIX, une double esperluette se déclenche si et seulement si la commande précédente renvoie 0. Et yamllint renvoie simplement le nombre d'erreurs trouvées, c'est pourquoi toute cette construction conditionnelle fonctionne.

2. Écrivez en Python, pas en YAML

Si YAML vous énerve vraiment, n'écrivez pas dedans, littéralement. Il arrive que YAML soit le seul format compris par l'application. Mais même dans ce cas, il n’est pas nécessaire de créer un fichier YAML. Écrivez sur ce que vous aimez puis convertissez. Par exemple, il existe une excellente bibliothèque pour Python pyyaml et deux méthodes de conversion : l'autoconversion et la conversion via des scripts.

Auto-conversion

Dans ce cas, le fichier de données est également un script Python qui génère YAML. Cette méthode est la mieux adaptée aux petits ensembles de données. Vous écrivez simplement les données JSON dans une variable Python, faites-la précéder d'une directive d'importation et, à la fin du fichier, ajoutez trois lignes pour implémenter la sortie.

#!/usr/bin/python3	
import yaml 

d={
"glossary": {
  "title": "example glossary",
  "GlossDiv": {
	"title": "S",
	"GlossList": {
	  "GlossEntry": {
		"ID": "SGML",
		"SortAs": "SGML",
		"GlossTerm": "Standard Generalized Markup Language",
		"Acronym": "SGML",
		"Abbrev": "ISO 8879:1986",
		"GlossDef": {
		  "para": "A meta-markup language, used to create markup languages such as DocBook.",
		  "GlossSeeAlso": ["GML", "XML"]
		  },
		"GlossSee": "markup"
		}
	  }
	}
  }
}

f=open('output.yaml','w')
f.write(yaml.dump(d))
f.close

Maintenant, nous exécutons ce fichier en Python et obtenons le fichier output.yaml :

$ python3 ./example.json
$ cat output.yaml
glossary:
  GlossDiv:
	GlossList:
	  GlossEntry:
		Abbrev: ISO 8879:1986
		Acronym: SGML
		GlossDef:
		  GlossSeeAlso: [GML, XML]
		  para: A meta-markup language, used to create markup languages such as DocBook.
		GlossSee: markup
		GlossTerm: Standard Generalized Markup Language
		ID: SGML
		SortAs: SGML
	title: S
  title: example glossary

C'est un YAML parfaitement valide, mais yamllint vous avertira qu'il ne commence pas par -. Eh bien, cela peut être facilement corrigé manuellement ou légèrement modifié dans le script Python.

Conversion via des scripts

Dans ce cas, nous écrivons d'abord en JSON, puis exécutons le convertisseur en tant que script Python distinct, qui produit YAML en sortie. Par rapport à la méthode précédente, cette méthode évolue mieux, puisque la conversion est distincte des données.

Tout d'abord, créons un fichier JSON example.json, par exemple, vous pouvez le prendre depuis json.org:

{
	"glossary": {
	  "title": "example glossary",
	  "GlossDiv": {
		"title": "S",
		"GlossList": {
		  "GlossEntry": {
			"ID": "SGML",
			"SortAs": "SGML",
			"GlossTerm": "Standard Generalized Markup Language",
			"Acronym": "SGML",
			"Abbrev": "ISO 8879:1986",
			"GlossDef": {
			  "para": "A meta-markup language, used to create markup languages such as DocBook.",
			  "GlossSeeAlso": ["GML", "XML"]
			  },
			"GlossSee": "markup"
			}
		  }
		}
	  }
	}

Ensuite, nous allons créer un simple script de convertisseur et l'enregistrer sous le nom json2yaml.py. Ce script importe les modules Python YAML et JSON, charge un fichier JSON spécifié par l'utilisateur, effectue la conversion et écrit les données dans le fichier output.yaml.

#!/usr/bin/python3
import yaml
import sys
import json

OUT=open('output.yaml','w')
IN=open(sys.argv[1], 'r')

JSON = json.load(IN)
IN.close()
yaml.dump(JSON, OUT)
OUT.close()

Enregistrez ce script dans le chemin système et exécutez-le si nécessaire :

$ ~/bin/json2yaml.py example.json

3. Analysez beaucoup et souvent

Il est parfois utile d’aborder un problème sous un angle différent. Si vous rencontrez des difficultés pour représenter les relations entre vos données dans YAML, vous pouvez les transformer temporairement en quelque chose de plus familier.

Par exemple, si vous êtes à l'aise avec les listes de dictionnaires ou JSON, vous pouvez convertir YAML en JSON avec seulement deux commandes dans le shell Python interactif. Supposons que vous ayez un fichier YAML mydata.yaml, voici à quoi il ressemblerait :

$ python3
>>> f=open('mydata.yaml','r')
>>> yaml.load(f)
{'document': 34843, 'date': datetime.date(2019, 5, 23), 'bill-to': {'given': 'Seth', 'family': 'Kenlon', 'address': {'street': '51b Mornington Roadn', 'city': 'Brooklyn', 'state': 'Wellington', 'postal': 6021, 'country': 'NZ'}}, 'words': 938, 'comments': 'Good article. Could be better.'}

Vous pouvez trouver de nombreux autres exemples sur ce sujet. De plus, de nombreux convertisseurs en ligne et analyseurs locaux sont disponibles. N'hésitez donc pas à reformater les données lorsque vous n'y voyez qu'un fouillis incompréhensible.

4. Lisez les spécifications

De retour sur YAML après une longue pause, il est utile de visiter yaml.org et relisez les spécifications (specs). Si vous rencontrez des difficultés avec YAML, mais que vous n’êtes pas parvenu à respecter la spécification, il est temps de corriger cette situation. Les spécifications sont étonnamment faciles à rédiger et les exigences syntaxiques sont illustrées par un grand nombre d'exemples dans Chapitre 6.

5. Pseudo-configurations

Lors de la rédaction d’un livre ou d’un article, il est toujours utile d’esquisser d’abord un aperçu préliminaire, au moins sous la forme d’une table des matières. C'est la même chose avec YAML. Très probablement, vous avez une idée des données qui doivent être écrites dans un fichier YAML, mais vous ne comprenez pas vraiment comment les connecter les unes aux autres. Par conséquent, avant de sculpter YAML, dessinez une pseudo-config.

La pseudo-configuration est similaire au pseudo-code, où vous n'avez pas à vous soucier de la structure ou de l'indentation, des relations parent-enfant, de l'héritage et de l'imbrication. C'est la même chose ici : vous dessinez des itérations des données au fur et à mesure qu'elles surviennent dans votre tête.

10 étapes vers YAML Zen

Pseudo-config répertoriant les programmeurs (Martin et Tabitha) et leurs compétences (langages de programmation : Python, Perl, Pascal et Lisp, Fortran, Erlang, respectivement).

Après avoir dessiné une pseudo-config sur une feuille de papier, analysez-la soigneusement et, si tout est en ordre, formatez-la sous la forme d'un fichier YAML valide.

6. Le dilemme des onglets et des espaces

Vous devrez résoudre le dilemme "tabulations ou espaces?". Pas au sens global, mais uniquement au niveau de votre organisation, ou du moins d'un projet. Peu importe qu'il s'agisse d'utiliser un post-traitement avec un script sed, de mettre en place des éditeurs de texte sur les machines des programmeurs ou de prendre universellement des récépissés de strict respect des instructions du linter sous peine de licenciement, mais tous les membres de votre équipe qui, dans d'une manière ou d'une autre, se rapporter à YAML doit utiliser uniquement des espaces (comme l'exige la spécification YAML).

Dans n'importe quel éditeur de texte normal, vous pouvez configurer les onglets de correction automatique sur un nombre spécifié d'espaces, de sorte que la rébellion des principaux adhérents Languette vous n'avez pas à avoir peur.

Comme tous ceux qui détestent YAML le savent bien, vous ne pouvez pas voir la différence entre les onglets et les espaces à l'écran. Et quand quelque chose n’est pas visible, c’est généralement la dernière chose dont les gens se souviennent, après avoir trié, vérifié et éliminé tous les autres problèmes possibles. Une heure passée à chercher une courbe de tabulation ou un bloc d'espaces crie simplement qu'il faut de toute urgence créer une politique d'utilisation de l'un ou de l'autre, puis mettre en œuvre un contrôle de respect en béton armé (par exemple, via un hook Git pour le forcer à travers un linter).

7. Moins c'est plus (ou plus c'est moins)

Certaines personnes aiment écrire en YAML car cela met l'accent sur la structure. Dans le même temps, ils utilisent activement l’indentation pour mettre en évidence des blocs de données. C'est une sorte d'arnaque pour imiter les langages de balisage qui utilisent des délimiteurs explicites.

Voici un exemple d'une telle structure de Documentation Ansible:

# Employee records
-  martin:
        name: Martin D'vloper
        job: Developer
        skills:
            - python
            - perl
            - pascal
-  tabitha:
        name: Tabitha Bitumen
        job: Developer
        skills:
            - lisp
            - fortran
            - erlang

Pour certains, cette option les aide à comprendre la structure YAML dans leur tête, pour d'autres, au contraire, elle les irrite avec beaucoup d'indentations inutiles, à leur avis.

Mais si vous êtes le propriétaire du document YAML et que vous êtes responsable de sa maintenance, alors toi et seulement toi doit définir comment utiliser l’indentation. Si vous êtes gêné par un remplissage important, gardez-le au minimum possible selon la spécification YAML. Par exemple, le fichier ci-dessus de la documentation Ansible peut être réécrit comme ceci sans aucune perte :

---
- martin:
   name: Martin D'vloper
   job: Developer
   skills:
   - python
   - perl
   - pascal
- tabitha:
   name: Tabitha Bitumen
   job: Developer
   skills:
   - lisp
   - fortran
   - erlang

8. Utilisez des blancs

Si vous répétez constamment les mêmes erreurs lorsque vous remplissez un fichier YAML, il est logique d'y insérer un modèle en guise de commentaire. La prochaine fois, vous pourrez simplement copier ce modèle et y saisir des données réelles, par exemple :

---
# - <common name>:
#   name: Given Surname
#   job: JOB
#   skills:
#   - LANG
- martin:
  name: Martin D'vloper
  job: Developer
  skills:
  - python
  - perl
  - pascal
- tabitha:
  name: Tabitha Bitumen
  job: Developer
  skills:
  - lisp
  - fortran
  - erlang

9. Utilisez quelque chose de différent

Si l'application n'a pas la mainmise sur vous, cela vaut peut-être la peine de changer le YAML dans un format différent. Au fil du temps, les fichiers de configuration peuvent devenir trop grands et il est alors préférable de les convertir en simples scripts en Lua ou Python.

YAML est une excellente chose que beaucoup de gens aiment pour son minimalisme et sa simplicité, mais il est loin d'être le seul outil de votre arsenal. Alors parfois, vous pouvez le refuser. Les bibliothèques d'analyse sont faciles à trouver pour YAML, donc si vous proposez des options de migration simples, vos utilisateurs survivront à cet échec relativement sans douleur.

Si vous ne pouvez pas vous passer de YAML, suivez ces 10 conseils et surmontez votre aversion pour YAML une fois pour toutes !

Source: habr.com

Ajouter un commentaire