{"action":"created","issue":{"url":"https://api.github.com/repos/patacrep/patacrep/issues/182","labels_url":"https://api.github.com/repos/patacrep/patacrep/issues/182/labels{/name}","comments_url":"https://api.github.com/repos/patacrep/patacrep/issues/182/comments","events_url":"https://api.github.com/repos/patacrep/patacrep/issues/182/events","html_url":"https://github.com/patacrep/patacrep/issues/182","id":118255649,"number":182,"title":"Remplacer json par yaml","user":{"login":"paternal","id":6587757,"avatar_url":"https://avatars.githubusercontent.com/u/6587757?v=3","gravatar_id":"","url":"https://api.github.com/users/paternal","html_url":"https://github.com/paternal","followers_url":"https://api.github.com/users/paternal/followers","following_url":"https://api.github.com/users/paternal/following{/other_user}","gists_url":"https://api.github.com/users/paternal/gists{/gist_id}","starred_url":"https://api.github.com/users/paternal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/paternal/subscriptions","organizations_url":"https://api.github.com/users/paternal/orgs","repos_url":"https://api.github.com/users/paternal/repos","events_url":"https://api.github.com/users/paternal/events{/privacy}","received_events_url":"https://api.github.com/users/paternal/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/patacrep/patacrep/labels/backward%20incompatible","name":"backward incompatible","color":"eb6420"},{"url":"https://api.github.com/repos/patacrep/patacrep/labels/update-doc-when-merged","name":"update-doc-when-merged","color":"5319e7"}],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":3,"created_at":"2015-11-22T10:44:10Z","updated_at":"2015-12-03T19:21:01Z","closed_at":null,"body":"Dans : \r\n- le fichier .sb\r\n- le [`include`](https://github.com/patacrep/patacrep/blob/72e3c202b976be47026d8016f48b27ebc3c69166/patacrep/content/include.py)\r\n- les [templates](https://github.com/patacrep/patacrep/blob/master/patacrep/data/templates/songs.tex#L22-L65).\r\n\r\nPour tout ça, le mieux est d'attendre #111.\r\n\r\nDébut de la discussion : https://github.com/patacrep/patacrep/pull/179#issuecomment-158706487"},"comment":{"url":"https://api.github.com/repos/patacrep/patacrep/issues/comments/161752979","html_url":"https://github.com/patacrep/patacrep/issues/182#issuecomment-161752979","issue_url":"https://api.github.com/repos/patacrep/patacrep/issues/182","id":161752979,"user":{"login":"paternal","id":6587757,"avatar_url":"https://avatars.githubusercontent.com/u/6587757?v=3","gravatar_id":"","url":"https://api.github.com/users/paternal","html_url":"https://github.com/paternal","followers_url":"https://api.github.com/users/paternal/followers","following_url":"https://api.github.com/users/paternal/following{/other_user}","gists_url":"https://api.github.com/users/paternal/gists{/gist_id}","starred_url":"https://api.github.com/users/paternal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/paternal/subscriptions","organizations_url":"https://api.github.com/users/paternal/orgs","repos_url":"https://api.github.com/users/paternal/repos","events_url":"https://api.github.com/users/paternal/events{/privacy}","received_events_url":"https://api.github.com/users/paternal/received_events","type":"User","site_admin":false},"created_at":"2015-12-03T19:21:01Z","updated_at":"2015-12-03T19:21:01Z","body":"Dans la proposition de structure, tu as mis `  instruments: LISTE[guitar, ukulele]` ; est-ce que ça ne devrait pas être `  instruments: ENUM[guitar, ukulele]` ?\r\n\r\n---\r\n\r\nVu que c'est dans ma tête depuis pas mal de temps, j'ai quand même quelques idées à propos de l'implémentation. Ces idées ne sont pas testées, donc il y en a sûrement des mauvaises.\r\n\r\nJe ne l'ai pas fait moi-même pour ne pas alourdir le style, mais ajoutez « Je pense que ... » dans votre tête avant chaque point.\r\n\r\n- Pour ne pas avoir une pull-request énorme, je pense qu'il faut faire ce travail en deux voire trois fois :\r\n  1. Utiliser yaml pour le carnet de chant, sauf pour `content` qui reste du json, et oublier les traductions (gettext)\r\n  2. Mettre en place gettext\r\n  3. Utiliser yaml pour `content` aussi.\r\n- La structure globale est bonne et peut-être conservée, à savoir : analyse du fichier dans [songbook/__main__.py](https://github.com/patacrep/patacrep/blob/d654dbf2b2c67ca76227bcb9032fe8723f353f07/patacrep/songbook/__main__.py), et fusion avec les options du template dans [build.py](https://github.com/patacrep/patacrep/blob/d654dbf2b2c67ca76227bcb9032fe8723f353f07/patacrep/build.py#L72).\r\n- Ne pas interpréter trop tôt les valeurs des options. On pourrait être tenté, dans `songbook/__main__.py`, dés la lecture des options, de les interpréter (par exemple s'assurer que `color['songnumber']` représente bien une couleur). Par exepérience, en faisant ça, on se retrouve avec plein de code hétéroclite dans `songbook/__main__.py`, dont on ne comprend pas forcément la raison. Alors qu'on interprétant/vérifiant les valeurs au moment de les utiliser, on regroupe cette interprétation avec le code qui l'utilise, donc c'est bien plus clair à la lecture.\r\n- Pour lire les options du template, il faut [interpréter le template Jinja comme un module](http://jinja.pocoo.org/docs/dev/api/#jinja2.Template.module). On définit dans le contexte que la variable `options` est un [`DictOfDict`](https://github.com/patacrep/patacrep/blob/d654dbf2b2c67ca76227bcb9032fe8723f353f07/patacrep/utils.py#L5), et chaque template peut ajouter des options avec l'[extension jinja2 `do`](http://jinja.pocoo.org/docs/dev/extensions/#expression-statement).\r\n- J'avais parlé d'utiliser gettext pour gérer des options par défaut différentes selon la langue. Je pense toujours que c'est une bonne chose, mais il ne faut surtout pas définir de manière globale le `_()` comme étant la fonction de gettext (comme on fait d'habitude quand on utilise gettext en Python). En effet, on peut tout à fait vouloir générer un carnet en anglais dans une application en français, et faire cette erreur rendrait les choses plus compliquées. Il faut simplement dire *à Jinja2* que le `_()` est la fonction de gettext.\r\n- On a des listes qui sont différentes selon la langue. Par exemple, `titles['prefix']` contiendra `The` en anglais, et `Le, La, Les` en français. On ne peut donc pas traduire séparément chacun des éléments. Je pense que pour ces cas-là, on peut gérer ces listes (dans le template) comme des chaînes de caractères, qui seront ensuite interprétée par [shlex](https://docs.python.org/3/library/shlex.html#shlex.split) (qui prend en compte les espaces et les guillemets). Ça donnerait donc, en anglais `_(\"The\")` et en français `_(\"Le La Les\")`.\r\n- Proposition de structure pour les templates. Actuellement, on a :\r\n    ~~~json\r\n    {\r\n    \"author\": {\"description\": {\"en\": \"Author\", \"fr\": \"Auteur\"},\r\n                \"default\": {\"en\": \"The Patacrep Team\", \"fr\": \"L'équipe Patacrep\"},\r\n                \"mandatory\":true\r\n             }\r\n    }\r\n    ~~~\r\n\r\n    Ça donnerait :\r\n\r\n    ~~~python\r\n    {\r\n      \"author\": {\r\n        \"description\": _(\"Author\"),\r\n        \"default\": _(\"The Patacrep Team\"),\r\n        \"type\": \"string\",\r\n       }\r\n    }\r\n    ~~~\r\n\r\n    Je ne sais pas à quoi sert l'attribut `mandatory`, donc je l'ai viré. Est-ce qu'on en a besoin dans patagui ?\r\n    Et pour les listes :\r\n\r\n    ~~~pyhon\r\n    {\r\n      \"notation\": {\r\n        \"description\": _(\"Chord notation\"),\r\n        \"default\": _(\"alphascale\"),\r\n        \"type\": \"enum\",\r\n        \"values\": \"alphascale solfedge\",\r\n      }\r\n    }\r\n    ~~~\r\n\r\n    La valeur de `values` est, pour les listes des propositions/exemples de valeurs, et pour les « enum », la liste des valeurs possibles, dans les deux cas sous la forme d'une chaîne de caractères interprétée par `shlex` pour pouvoir être traduite par gettext. Pour les strings, ça peut aussi être une liste d'exemples.\r\n\r\n    On aurait les types suivants :\r\n\r\n    - bool : booléen (type `boolean` dans les templates, peut-être chaîne interprétée par [yesno()](https://github.com/patacrep/patacrep/blob/d654dbf2b2c67ca76227bcb9032fe8723f353f07/patacrep/utils.py#L63) dans le fichier .yaml) ;\r\n    - string : chaîne de caractères, type `str`\r\n    - choice (actuellement enum, que je trouve peu clair) : chaîne de caractère, à choisir parmi une liste fermée\r\n    - list : liste, ouverte (n'importe quelles valeurs acceptées).\r\n\r\n\r\n---\r\n\r\nBon courage !\r\n"}}