Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Validateur NeTEx : quelques metadata #4160

Merged
merged 4 commits into from
Sep 5, 2024
Merged

Conversation

ptitfred
Copy link
Contributor

@ptitfred ptitfred commented Sep 3, 2024

Sur une suggestion d'Antoine, cette PR garde trace du temps passé et du nombre de retries pour une validation NeTEx.

Voir #4153.

@ptitfred ptitfred requested a review from a team as a code owner September 3, 2024 13:51
@thbar thbar self-assigned this Sep 4, 2024
Copy link
Contributor

@thbar thbar left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bien joué !

J'ai fait des suggestions sur le style ; sur le fond rien à redire !

J'aurais eu un peu plus de temps ce matin, j'aurais fait tourner le coverage (https://github.com/etalab/transport-site?tab=readme-ov-file#measuring-test-coverage), pour avoir une idée plus précise ce qui est couvert par les tests ; si jamais ça te tente ça peut être intéressant !

| :failed
| {:successful, binary(), integer()}
| {:warning, integer()}
| {:failed, integer()}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je me suis demandé initialement si ce tuple où on ajoute un entier en bout de chaîne ne commençait pas à devenir trop long, ne risquait pas de poser de problème quand on fait évoluer cette structure etc.

Mais au final ma compréhension du code actuel est que c'est une structure éphémère non persistée en base et qui pourra donc être revue sans souci (ex: besoin de passer à une map avec des clés plus explicites).

Je consigne juste cette note pour ma compréhension !

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

En effet, c'est bien ça.

Disons que c'est une manifestation de mon habitude de manipuler des types algébriques en entrée ou sortie de toute fonction et d'apprécier d'avoir une documentation implicite via les types des embranchements possibles.

Le fait que l'entier que je rajoute dans cette PR ne soit pas identifié comme une durée en seconde est une limite de cette syntaxe, et on pourrait arguer que le spec ainsi obtenu devient dangereusement verbeux.

(I miss my algebraic types.)


"failed" ->
:failed
{:failed, get_elapsed(response)}

_ ->
:unexpected_validation_status
end
end

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pour ci-dessous : j'ai tendance à préférer des appels en bang "!" qui lèvent une erreur, pour réduire le code, et du coup réduire les potentialités de bug dans le code qui analyse les retours.

Par exemple ici j'aurais opté pour quelque chose comme:

defp get_elapsed!(response) do
  created_at = get_datetime!(response, "created_at")
  updated_at = get_datetime!(response, "updated_at")
  DateTime.diff(updated_at, created_at)
end

Et (voir https://hexdocs.pm/elixir/1.17.2/Date.html#from_iso8601!/2)

defp get_datetime!(map, key) do
  map 
  |> Map.fetch!(key)
  |> DateTime.from_iso8601!()
end

C'est d'ailleurs en phase avec le fait que Map.fetch! va de toute façon lever une exception en cas de clé manquante, et adopte donc plutôt un style "fail fast" aussi.

(Et du coup, gérer l'erreur dans l'appelant de get_elapsed!)

Après ça reste aussi une opinion, mais perso je trouve que ça fait au final beaucoup moins de code sur une codebase quand c'est applicable (il faut que l'appelant puisse intercepter l'erreur, par contre !)

Copy link
Contributor Author

@ptitfred ptitfred Sep 5, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

il faut que l'appelant puisse intercepter l'erreur, par contre !

Oui, et tu peux avoir des cas où la clef est manquante/invalide sans que ça soit grave, pas forcément la responsabilité du code appelant.

En effet si j'étais cohérent j'aurais pas utilisé Map.fetch!. En pratique je peux faire confiance au fait que le datetime est bien formatté. Ce cas d'erreur spécifique m'ennuie.

Je dois revoir cette partie de toute façon, j'ai identifié un problème en retestant avec la validation OnDemand.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Et (voir https://hexdocs.pm/elixir/1.17.2/Date.html#from_iso8601!/2)

Ce helper est fourni pour Date mais pas pour DateTime ; je vais l'émuler.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

J'imagine que c'est lié au fait que DateTime.from_iso8601 renvoie et le datetime et l'offset, et donc qu'il faudrait l'interpréter également (ce que je ne fais pas, je fais l'hypothèse que l'offset est constant).

@ptitfred
Copy link
Contributor Author

ptitfred commented Sep 5, 2024

J'aurais eu un peu plus de temps ce matin, j'aurais fait tourner le coverage (https://github.com/etalab/transport-site?tab=readme-ov-file#measuring-test-coverage), pour avoir une idée plus précise ce qui est couvert par les tests ; si jamais ça te tente ça peut être intéressant !

Une utilisation naïve des commandes listées dans le readme échoue par un "Process killed" chez moi. Cela dit je suis relativement confiant quant à la couverture des tests.

Le plus gros souci à mon goût est surtout que malgrè la présence des typespec, et à cause de l'utilisation d'un mock sur ce wrapper dans les tests du code appelant, un changement du client peut casser le code appelant sans que ça saute aux yeux dans la CI.

@ptitfred
Copy link
Contributor Author

ptitfred commented Sep 5, 2024

⚠️ Je dois corriger le comportement. Je ne lis pas les bonnes dates pour les validations terminées (success, warning ou error), et je dois vérifier le comportement de l'API pour le cas pending.

Il est possible que le timeout implémenté dans #4157 ne fonctionne pas non plus en pratique à cause de ça.

Ne pas merger donc.

La mesure du temps passé ne fonctionnait pas comme prévu : le champs updated_at
n'est en effet pas actualisé chez enRoute.

Pour mesurer le temps passé à valider un fichier NeTEx il faut plutôt considérer
started_at et ended_at. Ce dernier n'est pas naturellement pas renseigné pour le
cas :pending.

Le timeout est désormais implémenté par le nombre de retries => 100 retries est
donc désormais la limite haute.
@ptitfred
Copy link
Contributor Author

ptitfred commented Sep 5, 2024

⚠️ Je dois corriger le comportement. Je ne lis pas les bonnes dates pour les validations terminées (success, warning ou error), et je dois vérifier le comportement de l'API pour le cas pending.

Il est possible que le timeout implémenté dans #4157 ne fonctionne pas non plus en pratique à cause de ça.

Ne pas merger donc.

C'est fait.

@ptitfred ptitfred requested a review from thbar September 5, 2024 10:34
Copy link
Member

@AntoineAugusti AntoineAugusti left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Merci pour ces ajouts très utiles pour le suivi de l'exploitation et de la performance

@ptitfred ptitfred added this pull request to the merge queue Sep 5, 2024
Merged via the queue into master with commit aa0f0e1 Sep 5, 2024
4 checks passed
@ptitfred ptitfred deleted the netex-validator/metadata branch September 5, 2024 12:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants