-
Notifications
You must be signed in to change notification settings - Fork 31
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
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -6,12 +6,11 @@ defmodule Transport.EnRouteChouetteValidClient.Wrapper do | |
|
||
@callback create_a_validation(Path.t()) :: binary() | ||
@callback get_a_validation(binary()) :: | ||
{:pending, integer()} | ||
| {:successful, binary()} | ||
| :warning | ||
| :failed | ||
:pending | ||
| {:successful, binary(), integer()} | ||
| {:warning, integer()} | ||
| {:failed, integer()} | ||
| :unexpected_validation_status | ||
| :unexpected_datetime_format | ||
@callback get_messages(binary()) :: {binary(), map()} | ||
|
||
def impl, do: Application.get_env(:transport, :enroute_validator_client) | ||
|
@@ -48,28 +47,40 @@ defmodule Transport.EnRouteChouetteValidClient do | |
|
||
case response |> Map.fetch!("user_status") do | ||
"pending" -> | ||
case {get_datetime(response, "created_at"), get_datetime(response, "updated_at")} do | ||
{{:ok, created_at, _}, {:ok, updated_at, _}} -> | ||
{:pending, DateTime.diff(updated_at, created_at)} | ||
|
||
_ -> | ||
:unexpected_datetime_format | ||
end | ||
:pending | ||
|
||
"successful" -> | ||
{:successful, url} | ||
{:successful, url, get_elapsed!(response)} | ||
|
||
"warning" -> | ||
:warning | ||
{:warning, get_elapsed!(response)} | ||
|
||
"failed" -> | ||
:failed | ||
{:failed, get_elapsed!(response)} | ||
|
||
_ -> | ||
:unexpected_validation_status | ||
end | ||
end | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 (Et du coup, gérer l'erreur dans l'appelant de 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 !) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
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é Je dois revoir cette partie de toute façon, j'ai identifié un problème en retestant avec la validation OnDemand. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Ce helper est fourni pour Date mais pas pour DateTime ; je vais l'émuler. There was a problem hiding this comment. Choose a reason for hiding this commentThe 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). |
||
defp get_elapsed!(response) do | ||
created_at = get_datetime!(response, "started_at") | ||
updated_at = get_datetime!(response, "ended_at") | ||
DateTime.diff(updated_at, created_at) | ||
end | ||
|
||
defp get_datetime!(map, key) do | ||
raw_date = Map.fetch!(map, key) | ||
|
||
case DateTime.from_iso8601(raw_date) do | ||
{:ok, value, _offset} -> | ||
value | ||
|
||
{:error, reason} -> | ||
raise ArgumentError, "cannot parse #{inspect(raw_date)} as datetime, reasaon: #{inspect(reason)}" | ||
end | ||
end | ||
|
||
@impl Transport.EnRouteChouetteValidClient.Wrapper | ||
def get_messages(validation_id) do | ||
url = Path.join([validation_url(validation_id), "messages"]) | ||
|
@@ -78,10 +89,6 @@ defmodule Transport.EnRouteChouetteValidClient do | |
{url, body |> Jason.decode!()} | ||
end | ||
|
||
defp get_datetime(map, key) do | ||
map |> Map.fetch!(key) |> DateTime.from_iso8601() | ||
end | ||
|
||
defp make_file_part(field_name, filepath) do | ||
{:file, filepath, {"form-data", [{:name, field_name}, {:filename, Path.basename(filepath)}]}, []} | ||
end | ||
|
There was a problem hiding this comment.
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 !
There was a problem hiding this comment.
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.)