Accueil du site > Documentation > Je suis fan de YAML

Je suis fan de YAML

dimanche 13 septembre 2009, par Fil

YAML. Son nom est l’acronyme de la phrase auto-référente « YAML Ain’t Markup Language ». Truc de geeks, donc. Mais il ne faut pas s’arrêter à ça !

Définition

YAML se définit comme « un standard de sérialisation de données pour tous les langages, facile à utiliser pour les humains ».
— standard : signifie qu’il n’y a pas d’approximation ou d’hésitation à avoir sur le contenu écrit en YAML.
— sérialisation de données : consiste à transformer une structure de données simple ou complexe en un fichier texte. Qu’il s’agisse d’une chaîne de caractères, d’un tableau, d’une liste de tableaux, d’un objet... toute variable peut être écrite sous forme d’un document YAML.
— tous les langages : YAML existe déjà en C, Java, Python, Ruby, Perl, Javascript, etc. Son implémentation en PHP est cependant encore relativement faible.
— human-friendly : c’est le plus important à mes yeux. Une structure de données transposée en YAML est très agréable à lire, facile à comprendre, et surtout facile à éditer.

Comparaison sur un exemple

Grâce à son incomparable API, le site per.sonn.es propose plusieurs affichages possibles du profil de ses membres, ce qui va nous permettre de les comparer :

- XML est la reine des formats de sérialisation. Un fichier XML, ça fait pro. Mais ses désavantages sont nombreux : c’est verbeux (chaque bloc ouvert doit être fermé), fragile (si on l’édite à la main, on a toutes les chances de le rendre invalide), complexe (ajouter un élément relève de la pratique divinatoire). Voici le profil de Jean Valjean dans la syntaxe XML/RDF : http://per.sonn.es/Jean+Valjean.rdf

- JSON est la représentation des données sous forme de variable javascript. Elle est beaucoup plus légère que XML, et a l’avantage de se traiter de façon très simple en... javascript, ce qui en a fait la star des mashups du Web 2.0. Inconvénients : les commentaires sont formellement interdits ; les caractères accentués se codent sous la forme \u00e9 ; un array transcodé en JSON puis décodé peut devenir un object. http://per.sonn.es/Jean+Valjean.json

- YAML pour sa part est lisible, voire même esthétique, tout en étant concis et facile à éditer à la main. Un bon dessin valant mieux qu’un long discours, voici : http://per.sonn.es/Jean+Valjean.yaml

Utilisations possibles

YAML est parfois présenté comme un format de choix pour enregistrer des fichiers de configuration. Par exemple, pour configurer deux connexions à des serveurs SQL, on peut écrire le YAML suivant :

# dev server
development:
 adapter: mysql
 database: 125moz
 username: root
 password: x0089
 socket: /tmp/mysql.sock
# prod server
production:
 adapter: mysql
 database: 178moz
 username: root
 password: x672323
 socket: /var/run/mysqld/mysqld.sock

Il n’est pas besoin d’une expérience informatique très profonde pour voir tout de suite que ce texte comporte des commentaires (cachés derrière le symbole #), et deux listes de propriétés, l’une nommée development, l’autre nommée production.

 

YAML peut aussi servir de format d’échange de données entre deux programmes : l’API de per.sonn.es en montre un exemple.

 

YAML est aussi un format à envisager pour la sauvegarde de données, destinée par exemple à une édition hors-ligne. Si per.sonn.es proposait de modifier un profil, il suffirait à Jean Valjean d’enregistrer la page http://per.sonn.es/Jean+Valjean.yaml, de l’éditer, puis, une fois son C.V. peaufiné, de renvoyer le texte édité au format YAML vers le site, pour faire la mise à jour de son profil.

Expressivité

Bien que très simple à lire, YAML offre une expressivité très complète. Il est en effet possible d’exprimer, toujours avec la même simplicité, des choses qui sont souvent complexes, voire impossibles, à réaliser dans les autres formats :
- données « binaires » tels que des images (penser à l’horrible <![CDATA[ ... ]]> de XML) ;
- adressage d’une donnée par référence (voir l’écriture &id001 / *id001 sur le fichier http://pygments.org/demo/1513/ ;
- les objets se sérialisent aussi bien que les listes et tableaux.

Références Web

- Le site officiel : http://yaml.org/

- YAML 1.2, spécification complète (avec des exemples) : http://www.yaml.org/spec/1.2/spec.html

- tutoriel rapide : “Can You Learn YAML in Five Minutes ?” http://yaml.kwiki.org/?YamlInFiveMinutes

- Reference Card, tout YAML en une page (elle-même écrite en YAML) : http://yaml.org/refcard.html

Implémentation PHP

Utilisant beaucoup PHP je me suis tourné vers l’implémentation de YAML faite par Fabien Potencier pour Symfony : elle est facile à installer et, bien que n’implémentant pas toutes les spécifications, semble fonctionner raisonnablement bien pour des structures simples (des tableaux de chaînes de caractères, par exemple), à condition que le fichier ne soit pas trop gros.

Le site Symfony YAML permet de télécharger ce composant indépendamment du reste de Symfony : http://components.symfony-project.o....

Pour charger en mémoire une structure sérialisée dans un fichier il suffit de deux lignes de code :

require_once('/chemin/vers/lib/yaml/sfYaml.class.php');
$conf = sfYaml::load('conf.yaml');

Pour faire l’opération inverse (bien pratique pour convertir des données qu’on vient de lire depuis un autre format) :

require_once('/chemin/vers/lib/yaml/sfYaml.class.php');
$text = sfYaml::dump($conf);
fwrite(..., $text);

Je viens aussi de packager cette librairie sous la forme d’un plugin SPIP qui fournit deux fonctions : yaml_encode() et yaml_decode().

Conclusion

Avec tous ces avantages, YAML est désormais mon format de prédilection pour tout ce que je faisais alors avec des « petits fichiers texte ad hoc ».

Pour modérer cet enthousiasme, il faut toutefois reconnaître deux faiblesses : l’absence de documentation en français, et le support médiocre de YAML en PHP. Deux points qui pourraient être améliorés rapidement.

5 Messages de forum

  • Je suis fan de YAML Le 1er octobre 2009 à 16:25 , par Valéry

    Intéressant. Ce serait génial dans SPIP pour des informations type fichiers de langue.

  • Je suis fan de YAML Le 20 janvier 2010 à 09:48 , par Nicolas R

    Bonjour, les reproches que vous faites au format JSON sont erronés :

    - "les caractères accentués se codent sous la forme \u00e9" - Faux, vous pouvez vérifier la RFC, et le final Draft ECMA du format, JSON accepte tout les caractères unicodes.

    http://tools.ietf.org/html/rfc4627
    "All Unicode characters may be placed within the quotation marks except for the characters that must be escaped : quotation mark, reverse solidus, and the control characters (U+0000 through U+001F)"

    http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf
    5.1.5 - The JSON Grammar "SourceCharacter :: any Unicode code unit"

    Si vous avez eu besoin d’échapper vos caractères de cette manière, ce n’est pas à cause de JSON, mais à cause d’une autre partie de votre plateforme dont vous maîtriser mal les paramètres d’encodage (ex : php est particulièrement impotent face à une string unicode)

    - "un array transcodé en JSON puis décodé peut devenir un object."
    Je ne vois même pas comment cela pourrait être possible, la sérialisation des objets et des tableaux étant radicalement différente "[val,val,val]" et "(’key’:val,’key’:val)" (le blog n’accepte pas les accolades, d’où les parenthèses). Le parser que vous utilisez ne doit pas être au point.

    Concernant le débat JSON / YAML, pour ma part je n’aime pas trop avoir des espaces significatifs dans une structure, je trouve ça casse-gueule. J’imagine que c’est une histoire de background, tout depend si l’on vient d’un langage avec une syntaxe type C ou type script...

    • Je suis fan de YAML Le 22 janvier 2010 à 12:14 , par Fil

      En effet, c’est l’expérience de JSON avec PHP qui teinte ce commentaire de plus de critiques envers JSON qu’il ne le mérite ; j’ai commencé à jouer avec CouchDB qui parle JSON, et c’est très chouette.

  • Je suis fan de YAML Le 21 juin 2011 à 17:21 , par Akilo

    Pour info http://yaml.kwiki.org/?YamlInFiveMinutes
    n’est plus en ligne ...
    hum un jour un petit plugin qui checkera les lien dans les articles juste pour voir si ils sont encore actif :D

  • Je suis fan de YAML Le 21 juin 2011 à 21:51 , par Fil

    heureusement on en retrouve une copie ici http://yaml.codeplex.com/wikipage?title=Yaml%20in%205%20minutes