Development #37482
outils: fonction pour aplatir/désaplatir une structure JSON
0%
Description
Aussi une fonction pour aplatir un schéma, le schéma n'est pas équivalent niveau validation mais donne une idée.
Fichiers
Demandes liées
Révisions associées
Historique
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
- Fichier 0001-utils-add-JSON-flattening-helpers-35818.patch 0001-utils-add-JSON-flattening-helpers-35818.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
- Bloque Development #35818: mdel: démarche DDPACS ajouté
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
Le numéro de commit n'est pas bon je corrigerai.
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
- Bloque Development #37488: utils: pouvoir convertir un schéma XSD en schéma JSON ajouté
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
Mis à jour par Emmanuel Cazenave il y a plus de 4 ans
-# Copyright (C) 2018 Entr'ouvert +# Copyright (C) 2019 Entr'ouvert
Tu mettrais pas le code dans un utils/jsonhelpers.py ou utils/jsonflatten.py pour s'éviter les ajustements sur les imports ?
max_items = schema.get('maxItems', 3)
Il y en endroit où on pourra avoir la main là dessus ? Parce que j'imagine que ce ticket plus les autres vises quelque chose de très déclaratif où un xsd est déclaré et pouf génération d'un schéma json puis aplatissement, bref comment on fera sur un xsd qui ne déclare pas le nombre maximum d'éléments autorisés dans une séquence et qu'on voudra plus que 3 éléments ?
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
Emmanuel Cazenave a écrit :
[...]
Tu mettrais pas le code dans un utils/jsonhelpers.py ou utils/jsonflatten.py pour s'éviter les ajustements sur les imports ?
[...]
Il y en endroit où on pourra avoir la main là dessus ? Parce que j'imagine que ce ticket plus les autres vises quelque chose de très déclaratif où un xsd est déclaré et pouf génération d'un schéma json puis aplatissement, bref comment on fera sur un xsd qui ne déclare pas le nombre maximum d'éléments autorisés dans une séquence et qu'on voudra plus que 3 éléments ?
Les schémas aplatis sont simplement indicatifs, ils ne sont jamais utilisés pour valider parce qu'ils ne sont pas fidèles aux schéma d'origine (en vrai d'abord on dés-aplatit, voir l'autre ticket qui gère de désaplatissement avant la validation du schéma) puis on valide avec le vrai schéma), ça n'est pas vraiment possible mais ça donne une bonne indication à celui qui doit écrire l'appel w.c.s.
L'objectif à moyen terme pour cette fonction c'est de proposer deux onglets lorsqu'on présente un schéma, le schéma réel et la version aplatie comme aide à la configuration de w.c.s (mais n'ayant pas trouvé de CSS standard pour faire ça j'ai laissé pour plus tard).
À plus long terme avec le rayonnement on pourra prévoir un widget JSON coté w.c.s. pour pouvoir présenter directement un éditeur de contenu adapté dans le style de JSONeditor1 que j'ai déjà utilisé sur zoo par exemple, les version aplaties ne seront alors plus nécessaire du tout.
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
- Fichier 0001-utils-add-JSON-flattening-helpers-37482.patch 0001-utils-add-JSON-flattening-helpers-37482.patch ajouté
2018 -> 2019
Mis à jour par Thomas Noël il y a plus de 4 ans
Ma remarque principale serait qu'on devrait partir sur le séparateur ".", qui est plus classique dans ce qu'on fait aujourd'hui dans w.c.s. et ailleurs, parce que "syntaxe Django".
Et en lisant le code dans ce sens, je vois des « prefix = prefix + '__' if prefix else prefix
» et je pense qu'il faut y remplacer __
par separator
Ensuite, je n'arrive pas très bien à comprendre à quel moment sera utilisé flatten_json_schema.
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
- Bloque Development #35818: mdel: démarche DDPACS supprimé
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
- Bloque Development #37490: ajouter des transformations à la validation de schéma JSON ajouté
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
Thomas Noël a écrit :
Ma remarque principale serait qu'on devrait partir sur le séparateur ".", qui est plus classique dans ce qu'on fait aujourd'hui dans w.c.s. et ailleurs, parce que "syntaxe Django".
Ok.
Et en lisant le code dans ce sens, je vois des «
prefix = prefix + '__' if prefix else prefix
» et je pense qu'il faut y remplacer__
parseparator
Ok.
Ensuite, je n'arrive pas très bien à comprendre à quel moment sera utilisé flatten_json_schema.
C'est dit dans la remarque d'avant, j'attends d'avoir de la CSS pour afficher des onglets (voir chez bootstrap, https://getbootstrap.com/docs/4.3/components/navs/#javascript-behavior) pour pouvoir afficher les clés aplatie quand le endpoint supporte le désaplatissement (via 'unflatten': True, dans son schéma).
unflatten est ensuite utilisé dans #37490 dont dépend le nouveau connecteur DDPACS.
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
- Fichier 0001-utils-add-JSON-flattening-helpers-37482.patch 0001-utils-add-JSON-flattening-helpers-37482.patch ajouté
séparateur '__' remplacé par '.'
Mis à jour par Thomas Noël il y a plus de 4 ans
Benjamin Dauvergne a écrit :
séparateur '__' remplacé par '.'
À mon avis les tests ne vont pas passer ...?
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
Thomas Noël a écrit :
Benjamin Dauvergne a écrit :
séparateur '__' remplacé par '.'
À mon avis les tests ne vont pas passer ...?
Possible, je corrigerai donc :)
Mis à jour par Thomas Noël il y a plus de 4 ans
(Et donc corriger les tests, ie remplacer __
par . et ajouter/garder un test qui valide avec separator='__')
Au lieu du False dans le « 'additionalProperties': False, » final de flatten_json_schema, on pourrait avoir « schema.get('additionalProperties', False) »
Détail : Comme souligné par Emmanuel, mettre un commentaire sur le « schema.get('maxItems', 3) » pour dire qu'on fait au mieux, mais que flatten_json_schema ne donnera pas (ne pourra jamais) donner un schéma exact. Et peut-être rappeller ça au niveau du test test_flatten_array_schema, lors du « jsonschema.validate(schema=flattened_schema, instance=flattened_data) », dire que ça marche dans ce cas précis parce qu'il y a 3 items par liste.
Voilà je pense que j'ai rien d'autre à dire... acke-mais-presque, donc.
Mis à jour par Frédéric Péters il y a plus de 4 ans
(moi je me demandais si / ne serait pas super comme séparateur pour cet usage)
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
Thomas Noël a écrit :
(Et donc corriger les tests, ie remplacer
__
par . et ajouter/garder un test qui valide avec separator='__')Au lieu du False dans le « 'additionalProperties': False, » final de flatten_json_schema, on pourrait avoir « schema.get('additionalProperties', False) »
Come je le disais le schéma aplatit n'est qu'une approximation (il manque des clés) on ne peut pas le forcer à être fermer, par exemple pour les clés de liste on peut avoir "*__1/2/3/4/5//._*" je ne vais pas toutes les lister. L'idée c'est que le schéma soit vaguement utile et ne bloque pas quelqu'un qui l'utiliserait sans comprendre (mais il est juste là pour être lu pas pour être utilisé).
Détail : Comme souligné par Emmanuel, mettre un commentaire sur le « schema.get('maxItems', 3) » pour dire qu'on fait au mieux, mais que flatten_json_schema ne donnera pas (ne pourra jamais) donner un schéma exact. Et peut-être rappeller ça au niveau du test test_flatten_array_schema, lors du « jsonschema.validate(schema=flattened_schema, instance=flattened_data) », dire que ça marche dans ce cas précis parce qu'il y a 3 items par liste.
Ok, je vais générer un champ description pour dire que c'est un schéma approximatif.
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
Frédéric Péters a écrit :
(moi je me demandais si / ne serait pas super comme séparateur pour cet usage)
Si personne ne s'y oppose ça me va aussi (et c'est plus lisible).
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
- Fichier 0001-utils-add-JSON-flattening-helpers-37482.patch 0001-utils-add-JSON-flattening-helpers-37482.patch ajouté
- séparateur changé pour /
- description ajouté au schéma
- tests corrigés
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
- Fichier 0001-utils-add-JSON-flattening-helpers-37482.patch 0001-utils-add-JSON-flattening-helpers-37482.patch ajouté
- prise en compte du nouveau champ description dans les tests
Mis à jour par Thomas Noël il y a plus de 4 ans
- Statut changé de Solution proposée à Solution validée
Let's go.
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
- Statut changé de Solution validée à Résolu (à déployer)
commit d4d3e59e3dbc194cfafbaae57922c7c38cf5ba90 Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Tue Oct 15 12:00:08 2019 +0200 utils: add JSON flattening helpers (#37482) * flatten/unflatten JSON document * flatten JSON schema (to help users in producing flattened JSON documents, not to validate, validation must be done through unflattening then validating using the original JSON schema)
Mis à jour par Frédéric Péters il y a plus de 4 ans
- Statut changé de Résolu (à déployer) à Solution déployée
utils: add JSON flattening helpers (#37482)
documents, not to validate, validation must be done through
unflattening then validating using the original JSON schema)