Développement #41386
permettre de spécifier manuellement les paramètres d'un endpoint
0%
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
opengis: make case_insensitive parameter explicit (#41386)
History
Updated by Valentin Deniaud over 4 years ago
- File 0002-opengis-make-case_insensitive-parameter-explicit-413.patch 0002-opengis-make-case_insensitive-parameter-explicit-413.patch added
- File 0001-utils-allow-specifying-endpoint-parameters-manually-.patch 0001-utils-allow-specifying-endpoint-parameters-manually-.patch added
- Status changed from Nouveau to Solution proposée
- Patch proposed changed from No to Yes
(bon et je nettoie un peu la fonction, au passage)
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é.
Updated by Valentin Deniaud over 4 years ago
- File 0002-opengis-make-case_insensitive-parameter-explicit-413.patch 0002-opengis-make-case_insensitive-parameter-explicit-413.patch added
- File 0001-utils-allow-specifying-endpoint-parameters-manually-.patch 0001-utils-allow-specifying-endpoint-parameters-manually-.patch added
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.
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.
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.
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).
Updated by Valentin Deniaud over 4 years ago
- File 0002-opengis-make-case_insensitive-parameter-explicit-413.patch 0002-opengis-make-case_insensitive-parameter-explicit-413.patch added
- File 0001-utils-allow-specifying-endpoint-parameters-manually-.patch 0001-utils-allow-specifying-endpoint-parameters-manually-.patch added
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.
Updated by Benjamin Dauvergne over 4 years ago
- Status changed from Solution proposée to Solution validée
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)
Updated by Frédéric Péters over 4 years ago
- Status changed from Résolu (à déployer) to Solution déployée
utils: allow specifying endpoint parameters manually (#41386)