fix(datable): lire une borne jour comme la journée entière - #28
Open
Memli-Sheremeti wants to merge 3 commits into
Open
fix(datable): lire une borne jour comme la journée entière#28Memli-Sheremeti wants to merge 3 commits into
Memli-Sheremeti wants to merge 3 commits into
Conversation
…tetime Sur une colonne qui porte un instant, une borne donnée en jour nu était lue comme le minuit qui ouvre ce jour : `since=2026-03-01` laissait tomber les enregistrements de 09:00 et de 17:30, et ne gardait qu'un éventuel minuit. - `since` admet le jour entier, `after` l'exclut entier, `from`/`to` bornent du premier au dernier instant du jour nommé - une borne portant une heure reste honorée à la seconde - une colonne `date` garde exactement le comportement qu'elle avait - les journées sont bornées à minuit dans `Time.zone` quand l'application en définit un, et par jour suivant plutôt qu'en ajoutant 24 h, qu'un changement d'heure rendrait faux
La détection par expression régulière et introspection du type de colonne ne voyait pas le filtre before, ne reconnaissait que le format ISO, et coupait la journée dans le fuseau du serveur alors que les bornes horaires étaient lues dans celui de l'application. parse rend désormais une Date pour un jour et un Time pour un instant, via Date._parse. Chaque filtre porte un prédicat nommé d'après sa sémantique.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Une borne sans heure était lue comme un instant : le minuit qui ouvre le jour, dans le fuseau du serveur. Sur une colonne
t.datetime, elle écartait donc toutes les lignes enregistrées pendant la journée qu'elle nomme, alors qu'un appelant qui envoie un jour parle du jour. Et commeTime.parselit dans le fuseau système, la coupure se déplaçait d'un serveur à l'autre.Découvert en passant
clones_navs.datededateàdatetimedans mosaic. Le symptôme le plus net : une specbeforeverte en local sous CEST et rouge en CI sous UTC, sur la même donnée.Changes
parsedistingue le jour de l'instant avecDate._parseet rend uneDateou unTimeon_or_before,strictly_before,on_or_after,strictly_afterTime.zonequand l'application en fixe un, et par jour suivant plutôt qu'en ajoutant 24 hTime.zoneImpact
Change la sémantique des quatre filtres date pour tout consommateur dont l'attribut
datableporte une colonnedatetime. Sur une colonnedate, les bornes restent équivalentes (< jour + 1vaut<= jour) et deux exemples le vérifient. Aucun autre projet n'a d'attributdatablesur une colonnedatetimeaujourd'hui.How to Test
bundle exec rspec— 209 exemples, 0 échecTZ=UTC bundle exec rspecpuisTZ=America/New_York bundle exec rspec— même résultat, c'est le point du correctifbundle exec rspec spec/datable_datetime_spec.rbsur lalibdemain— 5 des 13 exemples échouentbundle exec rubocop— aucune offense