Project

General

Profile

Développement #41386

permettre de spécifier manuellement les paramètres d'un endpoint

Added by Valentin Deniaud over 4 years ago. Updated over 4 years ago.

Status:
Fermé
Priority:
Normal
Target version:
-
Start date:
06 April 2020
Due date:
% Done:

0%

Estimated time:
Patch proposed:
Yes
Planning:
No

Description

Dans utils.api.endpoint, il y a la méthode get_params() qui récupère les infos des paramètres de la fonction associée à l'endpoint, notamment pour les afficher dans les templates, à partir de sa signature.
Problème, si dans #20535 je veux créer des endpoints pas directement reliés à une fonction, c'est mission impossible, parce que la signature est immutable.
Or il y a l'attribut parameters qu'on remplit explicitement et qui contient aussi le nom des paramètres.
La logique actuelle c'est de prendre les paramètres de la signature, puis de choper leurs infos dans parameters.
Ici je propose de faire l'inverse, on prend les paramètres et leurs infos dans parameters puis on complète par les paramètres de la signature manquants (si l'endpoint est documenté correctement il n'y en a pas), avec une option pour désactiver ce second mécanisme.

Conséquence, parameters est un dictionnaire, on perd l'ordre par rapport à la solution basée sur la signature. On pourrait avec du code lourdingue en plus réparer ça, mais je me dis que les trier par nom, c'est pas beaucoup pire.

Et seul cas où ça pose vraiment problème, les bricoles, qu'il faudra corriger à la main et c'est tant mieux. Exemple dans le patch 2, ou un paramètre n'était pas flaggé comme optionnel et donc se retrouvait en haut de la liste.


Files

Associated revisions

Revision 3803d483 (diff)
Added by Valentin Deniaud over 4 years ago

utils: allow specifying endpoint parameters manually (#41386)

Revision cf2e6120 (diff)
Added by Valentin Deniaud over 4 years ago

opengis: make case_insensitive parameter explicit (#41386)

History

#2

Updated by Benjamin Dauvergne over 4 years ago

Pour ton histoire d'ordre, en python3 il n'y a plus de différence entre OrderedDict et dict (c'est officiel depuis une version tardive mais c'était déjà vrai avant je crois).

Donc tu peux simplement reconstruire parameters dans l'ordre des arguments dans argspec et tu es sûr que l'ordre sera conservé.

#3

Updated by Valentin Deniaud over 4 years ago

D'accord je ne savais pas.

Le patch 2 est inutile dans ce contexte mais je le laisse quand même, ça corrige toujours un problème de documentation.

#4

Updated by Valentin Deniaud over 4 years ago

Raté, ça casse les tests de manière aléatoire, comme il se doit dans ce genre de cas... Sinon une troisième voie pour conserver l'ordre tel qu'il est, par rapport à mon premier patch :

-        params.sort(key=lambda x: (x.get('optional', False), x['name']))
+        params.sort(key=lambda x: spec.args.index(x['name']))

Simple, mais lent.

#5

Updated by Frédéric Péters over 4 years ago

La conservation de l'ordre d'insertion c'est Python 3.6 en pratique (https://docs.python.org/3/whatsnew/3.6.html#new-dict-implementation) et officiellement 3.7.

#6

Updated by Benjamin Dauvergne over 4 years ago

Frédéric Péters a écrit :

La conservation de l'ordre d'insertion c'est Python 3.6 en pratique (https://docs.python.org/3/whatsnew/3.6.html#new-dict-implementation) et officiellement 3.7.

Ah my bad je pensais que c'était arrivé plus tôt.

Simple, mais lent.

Ça m'a l'air très bien, pourquoi lent ? Si la milliseconde de différence te chagrine tant, tu peux faire :

order = {name: i for i, name in enumerate(spec.args)}
params.sort(key=lambda x: (order.get(x['name'], 999), x['name']))

Trié par spec.args puis par ordre alphabétique (en plus il me semble que .index() va lever une ValueError en cas de valeur inconnue).

#7

Updated by Valentin Deniaud over 4 years ago

Benjamin Dauvergne a écrit :

en plus il me semble que .index() va lever une ValueError en cas de valeur inconnue

Oui donc je pars sur ta suggestion.

#8

Updated by Benjamin Dauvergne over 4 years ago

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

Updated by Valentin Deniaud over 4 years ago

  • Status changed from Solution validée to Résolu (à déployer)
commit 8ba86082c36b671450308d4e51216407825e56ab
Author: Valentin Deniaud <vdeniaud@entrouvert.com>
Date:   Mon Apr 6 17:53:53 2020 +0200

    opengis: make case_insensitive parameter explicit (#41386)

commit aa2e66d1001953a0bd8c1c439dcebb102719e7af
Author: Valentin Deniaud <vdeniaud@entrouvert.com>
Date:   Mon Apr 6 16:06:20 2020 +0200

    utils: allow specifying endpoint parameters manually (#41386)
#10

Updated by Frédéric Péters over 4 years ago

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

Also available in: Atom PDF