Project

General

Profile

Development #37482

outils: fonction pour aplatir/désaplatir une structure JSON

Added by Benjamin Dauvergne about 1 month ago. Updated 21 days ago.

Status:
Solution déployée
Priority:
Normal
Target version:
-
Start date:
06 Nov 2019
Due date:
% Done:

0%

Patch proposed:
Yes
Planning:
No

Description

Aussi une fonction pour aplatir un schéma, le schéma n'est pas équivalent niveau validation mais donne une idée.

0001-utils-add-JSON-flattening-helpers-35818.patch View (19.9 KB) Benjamin Dauvergne, 06 Nov 2019 11:07 AM

0001-utils-add-JSON-flattening-helpers-37482.patch View (19.9 KB) Benjamin Dauvergne, 06 Nov 2019 11:21 AM

0001-utils-add-JSON-flattening-helpers-37482.patch View (19.9 KB) Benjamin Dauvergne, 13 Nov 2019 10:20 AM

0001-utils-add-JSON-flattening-helpers-37482.patch View (20 KB) Benjamin Dauvergne, 15 Nov 2019 04:57 PM

0001-utils-add-JSON-flattening-helpers-37482.patch View (20.6 KB) Benjamin Dauvergne, 18 Nov 2019 03:54 PM

0001-utils-add-JSON-flattening-helpers-37482.patch View (20.8 KB) Benjamin Dauvergne, 19 Nov 2019 10:40 AM


Related issues

Blocks Passerelle - Development #37488: utils: pouvoir convertir un schéma XSD en schéma JSON Solution déployée 06 Nov 2019
Blocks Passerelle - Development #37490: ajouter des transformations à la validation de schéma JSON Solution déployée 06 Nov 2019

Associated revisions

Revision d4d3e59e (diff)
Added by Benjamin Dauvergne 27 days ago

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)

History

#1 Updated by Benjamin Dauvergne about 1 month ago

#2 Updated by Benjamin Dauvergne about 1 month ago

#3 Updated by Benjamin Dauvergne about 1 month ago

Le numéro de commit n'est pas bon je corrigerai.

#4 Updated by Benjamin Dauvergne about 1 month ago

  • Blocks Development #37488: utils: pouvoir convertir un schéma XSD en schéma JSON added

#6 Updated by Emmanuel Cazenave about 1 month ago

-# 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 ?

#7 Updated by Benjamin Dauvergne about 1 month ago

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.

1 https://github.com/josdejong/jsoneditor

#9 Updated by Thomas Noël about 1 month ago

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.

#10 Updated by Benjamin Dauvergne about 1 month ago

#11 Updated by Benjamin Dauvergne about 1 month ago

  • Blocks Development #37490: ajouter des transformations à la validation de schéma JSON added

#12 Updated by Benjamin Dauvergne about 1 month ago

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 __ par separator

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.

#13 Updated by Benjamin Dauvergne about 1 month ago

séparateur '__' remplacé par '.'

#14 Updated by Thomas Noël about 1 month ago

Benjamin Dauvergne a écrit :

séparateur '__' remplacé par '.'

À mon avis les tests ne vont pas passer ...?

#15 Updated by Benjamin Dauvergne about 1 month ago

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 :)

#16 Updated by Thomas Noël 28 days ago

(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.

#17 Updated by Frédéric Péters 28 days ago

(moi je me demandais si / ne serait pas super comme séparateur pour cet usage)

#18 Updated by Benjamin Dauvergne 28 days ago

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.

#19 Updated by Benjamin Dauvergne 28 days ago

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).

#20 Updated by Benjamin Dauvergne 28 days ago

  • séparateur changé pour /
  • description ajouté au schéma
  • tests corrigés

#21 Updated by Benjamin Dauvergne 27 days ago

  • prise en compte du nouveau champ description dans les tests

#22 Updated by Thomas Noël 27 days ago

  • Status changed from Solution proposée to Solution validée

Let's go.

#23 Updated by Benjamin Dauvergne 27 days ago

  • Status changed from Solution validée to 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)

#24 Updated by Frédéric Péters 21 days ago

  • Status changed from Résolu (à déployer) to Solution déployée

Also available in: Atom PDF