{"action":"created","issue":{"url":"https://api.github.com/repos/patacrep/patacrep/issues/111","labels_url":"https://api.github.com/repos/patacrep/patacrep/issues/111/labels{/name}","comments_url":"https://api.github.com/repos/patacrep/patacrep/issues/111/comments","events_url":"https://api.github.com/repos/patacrep/patacrep/issues/111/events","html_url":"https://github.com/patacrep/patacrep/issues/111","id":110338953,"number":111,"title":"Amélioration de la gestion des options","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/enhancement","name":"enhancement","color":"84b6eb"},{"url":"https://api.github.com/repos/patacrep/patacrep/labels/question","name":"question","color":"cc317c"}],"state":"open","locked":false,"assignee":null,"milestone":{"url":"https://api.github.com/repos/patacrep/patacrep/milestones/4","html_url":"https://github.com/patacrep/patacrep/milestones/Version%205","labels_url":"https://api.github.com/repos/patacrep/patacrep/milestones/4/labels","id":1357088,"number":4,"title":"Version 5","description":"","creator":{"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},"open_issues":8,"closed_issues":0,"state":"open","created_at":"2015-10-15T10:51:38Z","updated_at":"2015-10-15T10:55:27Z","due_on":null,"closed_at":null},"comments":10,"created_at":"2015-10-07T23:22:57Z","updated_at":"2015-10-15T15:03:31Z","closed_at":null,"body":"Pour différentes raisons (ordonner les options, proposer un fichier `.sb` plus clair, définir de manière plus robuste des options dans les templates), je propose la chose suivante. Ce ticket reprend les idées de #107 et #106.\r\n\r\n# Nature de la variable d'options\r\n\r\nActuellement, les options sont un dictionnaire, où les clefs sont la référence de l'option, et la valeur sa valeur. C'est le bazar… Je propose de trier les options par section : dans `option['authors']`, on aurait le dictionnaire d'options relatives aux auteurs, etc. Aucun intérêt au niveau du code, mais je pense que le résultat sera plus lisible pour l'utilisateur (voir pour les développeurs).\r\n\r\n## Ficher `.sb`\r\n\r\nLe format de fichier est analysé par la bibliothèque [`configparser`](https://docs.python.org/3.4/library/configparser.html) (#106). Cela permet, d'une part, de faire un format de fichier plus agréable à écrire pour l'utilisateur (bien moins verbeux que le json, par exemple), et d'autre part, cela permet de trier les options par sections (voir l'exemple en fin de ce commentaire https://github.com/patacrep/patacrep/issues/106#issuecomment-145357963). À l'arrivée, l'objet récupéré est, à peu de choses près, un dictionnaire de dictionnaires.\r\n\r\n## Templates\r\n\r\nLes templates sont analysés par jinja2 (#107). Cela permet d'avoir quelque chose de plus robuste (actuellement, c'est une série de regexp qui s'en chargent). J'hésite encore entre deux formats de données pour les variables manipulées par jinja2 : soit un dictionnaire de dictionnaire, avec une méthode update intelligente (voir plus bas), ce qui nécessite d'écrire une nouvelle classe ; soit un simple dictionnaire avec des clefs au format `section.option`, qui est ensuite analysé et converti en dictionnaire de dictionnaires. Cela donnerait l'un des formats suivants.\r\n\r\n~~~python\r\n(* do options.update({\r\n    'authors.separators': 'and et',\r\n    'book.language': 'french',\r\n  }) *)\r\n~~~\r\n\r\n~~~python\r\n(* do options.update({\r\n    'authors': {\r\n      'separators': 'and et',\r\n    },\r\n    'book': {\r\n      'language': 'french',\r\n    },\r\n  }) *)\r\n~~~\r\n\r\nOn peut aussi imaginer (toujours avec une classe maison ressemblant à un dictionnaire.\r\n\r\n~~~python\r\n(* do options.set('authors', 'separators', 'and et') *)\r\n(* do options.set('book', 'language', 'french') *)\r\n~~~\r\n\r\nLa différence entre les deux formats dépend aussi de la manière dont patagui va gérer cela : dans la première version (un simple dictionnaire), si patagui appelle une fonction python et récupère son résultat, elle récupère un bête dictionnaire de chaînes de caractères, donc c'est simple. S'il s'agit de la deuxième option, elle récupère un objet maison, donc c'est peut-être plus compliqué (rappel : on parle de C++ ici).\r\nSi en revanche, on écrit un petit binaire (comme proposé ici https://github.com/patacrep/patacrep/issues/106#issuecomment-145387807) qui lit les templates et affiche sur la sortie standard un dictionnaire en json, alors on fait ce qu'on veut : patagui n'aura qu'à faire un appel système et lire la sortie, on fait comme on veut à l'intérieur.\r\n\r\n### Intérêt d'une méthode `update` plus fine\r\n\r\nSi notre dictionnaire de dictionnaires utilise le type `dict` de python, alors on se retrouve avec le problème suivant.\r\n\r\n~~~python\r\nd = {\r\n  'foo': {\r\n    'un': 1,\r\n    'deux': 2,\r\n  }\r\n}\r\n\r\nd.update({\r\n  'foo': {\r\n    'deux': 22,\r\n    'trois': 3,\r\n  }\r\n})\r\n\r\n# Maintenant, d vaut :\r\n# {\r\n#   'foo': {\r\n#     'deux': 22,\r\n#     'trois': 3,\r\n#   }\r\n# }\r\n# alors qu'on voudrait qu'il vaille :\r\n# {\r\n#   'foo': {\r\n#     'un': 1,\r\n#     'deux': 22,\r\n#     'trois': 3,\r\n#   }\r\n# }\r\n~~~\r\n\r\nD'où l'intérêt, si c'est pertinent vue l'option choisie pour les templates, d'écrire une version « récursive » de `update()`.\r\n\r\n## Assemblage\r\n\r\nCes deux objets (options du fichier `.sb` et des templates) sont ensuite mergées pour obtenir les options du carnet de chant, qui sont ensuite utilisées dans l'ensemble du carnet.\r\n\r\n# Traduction des noms de section\r\n\r\nSi je me souviens bien, les options des templates sont utilisées par patagui pour construire de manière dynamique des menus de configuration. C'est la raison pour laquelle nous avons, dans les templates, traduit les descriptions des options, et les valeurs par défaut (pour certaines valeurs). Je propose en plus d'ajouter, dans chaque section, de manière optionnelle, la clef `_meta`, qui contient un dictionnaire de la forme : \r\n\r\n~~~python\r\n{\r\n  'title': {\r\n    'french': 'Options des auteurs',\r\n    'english': 'Author options',\r\n  },\r\n  'description': {\r\n    'french: 'Options permettant de définir la manière dont les auteurs sont analysés et triés.',\r\n  },\r\n}\r\n~~~\r\n\r\nCela permet à Patagui de traduire les noms de section, comme elle le faisait avec le nom des options. Ce format est extensible (on peut ajouter des clefs), donc on pourra ajouter encore d'autres choses dans le futur.\r\n\r\n# Tri des options\r\n\r\nTout cela serait aussi l'occasion de faire un peu de tri dans les options, de les rassembler en section, voire de modifier le comportement de certaines (ar exemple, `importantdiagramonly` et `diagram` peuvent devenir `diagram=important`, `diagram=all`, `diagram=none`).\r\n\r\n---\r\n\r\n# À vous !\r\n"},"comment":{"url":"https://api.github.com/repos/patacrep/patacrep/issues/comments/148414452","html_url":"https://github.com/patacrep/patacrep/issues/111#issuecomment-148414452","issue_url":"https://api.github.com/repos/patacrep/patacrep/issues/111","id":148414452,"user":{"login":"oliverpool","id":3864879,"avatar_url":"https://avatars.githubusercontent.com/u/3864879?v=3","gravatar_id":"","url":"https://api.github.com/users/oliverpool","html_url":"https://github.com/oliverpool","followers_url":"https://api.github.com/users/oliverpool/followers","following_url":"https://api.github.com/users/oliverpool/following{/other_user}","gists_url":"https://api.github.com/users/oliverpool/gists{/gist_id}","starred_url":"https://api.github.com/users/oliverpool/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/oliverpool/subscriptions","organizations_url":"https://api.github.com/users/oliverpool/orgs","repos_url":"https://api.github.com/users/oliverpool/repos","events_url":"https://api.github.com/users/oliverpool/events{/privacy}","received_events_url":"https://api.github.com/users/oliverpool/received_events","type":"User","site_admin":false},"created_at":"2015-10-15T15:03:31Z","updated_at":"2015-10-15T15:03:31Z","body":"Ca serait parfait!"}}