Projet

Général

Profil

Development #37482

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

Ajouté par Benjamin Dauvergne il y a plus de 4 ans. Mis à jour il y a plus de 4 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
06 novembre 2019
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

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

Bloque Passerelle - Development #37488: utils: pouvoir convertir un schéma XSD en schéma JSONFermé06 novembre 2019

Actions
Bloque Passerelle - Development #37490: ajouter des transformations à la validation de schéma JSONFermé06 novembre 2019

Actions

Révisions associées

Révision d4d3e59e (diff)
Ajouté par Benjamin Dauvergne il y a plus de 4 ans

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)

Historique

#1

Mis à jour par Benjamin Dauvergne il y a plus de 4 ans

#2

Mis à jour par Benjamin Dauvergne il y a plus de 4 ans

#3

Mis à jour par Benjamin Dauvergne il y a plus de 4 ans

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

#4

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é
#6

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 ?

#7

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.

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

#9

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.

#10

Mis à jour par Benjamin Dauvergne il y a plus de 4 ans

#11

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é
#12

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

#14

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

#15

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

#16

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.

#17

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)

#18

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.

#19

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

#20

Mis à jour par Benjamin Dauvergne il y a plus de 4 ans

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

Mis à jour par Benjamin Dauvergne il y a plus de 4 ans

  • prise en compte du nouveau champ description dans les tests
#22

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.

#23

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)
#24

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

Formats disponibles : Atom PDF