-
-
Notifications
You must be signed in to change notification settings - Fork 18
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
fix millisecond fraction being handled with wrong scale #65
Conversation
f39bff5
to
a624253
Compare
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.
Does this result in any broken tests in either pydantic
or pydantic-core
?
I didn't try, but I wouldn't be concerned if it did. The behaviour is currently wrong and corrupting data 😬 |
Well, I guess you could make the argument that even if the timestamp is a millisecond timestamp the fraction is always treated as seconds fraction, but I think that's just extremely non intuitive and likely to trip everyone up. |
Agreed, I think this fix makes sense. |
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.
A few questions / comments, but looks great overall!
src/datetime.rs
Outdated
// FIXME should we error if the fraction is too long? | ||
// We have TimeConfig truncate / error option. | ||
(fract_integers as f64 * multiple).round() as u32, | ||
config, |
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.
I would say if we use a max_digits
pattern above, it seems intuitive to then error if the number of decimal digits violates that standard.
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.
It's a behavioural change but I think correct given the spirit of the config.
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.
Nice, I feel particularly good about the new MilisecondFractionTooLong
given the existence of SecondFractionTooLong
already!
Truncation note looks great! Thanks. |
let Some(fract_integers) = int_parse_bytes(fract) else { | ||
return Err(e); | ||
}; |
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.
Thank you for fixing my issue (#61). But I wonder about this strategy here, reusing an integer parsing function for a fractional part:
- does this handle leading zeros correctly? (I think yes, thanks to the
$10^d$ scaling trick.) - does this handle other aspects of integer notation correctly, e.g. signs? (I think not.)
- does this handle long fractions if the "precision overflow" check isn't used? (I think yes, thanks to the
$10^d$ scaling trick.)
As an example, consider an input like 1711445175.+07186
which should probably be invalid, not parsed as if the +
were a zero.
Perhaps the i = int_parse_bytes(fract)
function could be copied as a (i, magnitude) = fract_parse_bytes(fract)
function, where the magnitude
would be safer than relying on fract.len()
?
v2.8.2 (2024-07-03) * Fix issue with assertion caused by pluggable schema validator by @dmontagu in #9838 v2.8.1 (2024-07-03) * Bump ruff to v0.5.0 and pyright to v1.1.369 by @sydney-runkle in #9801 * Bump pydantic-core to v2.20.1, pydantic-extra-types to v2.9.0 by @sydney-runkle in #9832 * Fix breaking change in to_snake from v2.7 -> v2.8 by @sydney-runkle in #9812 * Fix list constraint json schema application by @sydney-runkle in #9818 * Support time duration more than 23 by @nix010 in pydantic/speedate#64 * Fix millisecond fraction being handled with the wrong scale by @davidhewitt in pydantic/speedate#65 * Handle negative fractional durations correctly by @sydney-runkle in pydantic/speedate#71 v2.8.0 (2024-07-01) See: - https://docs.pydantic.dev/latest/changelog/#v280-2024-07-01 - https://pydantic.dev/articles/pydantic-v2-8-release Full changelog: pydantic/pydantic@v2.7.4...v2.8.2 Signed-off-by: Tim Orling <tim.orling@konsulko.com>
This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [pydantic](https://togithub.com/pydantic/pydantic) ([changelog](https://docs.pydantic.dev/latest/changelog/)) | project.dependencies | minor | `==2.7.4` -> `==2.8.2` | --- ### Release Notes <details> <summary>pydantic/pydantic (pydantic)</summary> ### [`v2.8.2`](https://togithub.com/pydantic/pydantic/blob/HEAD/HISTORY.md#v282-2024-07-03) [Compare Source](https://togithub.com/pydantic/pydantic/compare/v2.8.1...v2.8.2) [GitHub release](https://togithub.com/pydantic/pydantic/releases/tag/v2.8.2) ##### What's Changed ##### Fixes - Fix issue with assertion caused by pluggable schema validator by [@​dmontagu](https://togithub.com/dmontagu) in [#​9838](https://togithub.com/pydantic/pydantic/pull/9838) ### [`v2.8.1`](https://togithub.com/pydantic/pydantic/blob/HEAD/HISTORY.md#v281-2024-07-03) [Compare Source](https://togithub.com/pydantic/pydantic/compare/v2.8.0...v2.8.1) [GitHub release](https://togithub.com/pydantic/pydantic/releases/tag/v2.8.1) ##### What's Changed ##### Packaging - Bump `ruff` to `v0.5.0` and `pyright` to `v1.1.369` by [@​sydney-runkle](https://togithub.com/sydney-runkle) in [#​9801](https://togithub.com/pydantic/pydantic/pull/9801) - Bump `pydantic-core` to `v2.20.1`, `pydantic-extra-types` to `v2.9.0` by [@​sydney-runkle](https://togithub.com/sydney-runkle) in [#​9832](https://togithub.com/pydantic/pydantic/pull/9832) ##### Fixes - Fix breaking change in `to_snake` from v2.7 -> v2.8 by [@​sydney-runkle](https://togithub.com/sydney-runkle) in [#​9812](https://togithub.com/pydantic/pydantic/pull/9812) - Fix list constraint json schema application by [@​sydney-runkle](https://togithub.com/sydney-runkle) in [#​9818](https://togithub.com/pydantic/pydantic/pull/9818) - Support time duration more than 23 by [@​nix010](https://togithub.com/nix010) in [pydantic/speedate#64](https://togithub.com/pydantic/speedate/pull/64) - Fix millisecond fraction being handled with the wrong scale by [@​davidhewitt](https://togithub.com/davidhewitt) in [pydantic/speedate#65](https://togithub.com/pydantic/speedate/pull/65) - Handle negative fractional durations correctly by [@​sydney-runkle](https://togithub.com/sydney-runkle) in [pydantic/speedate#71](https://togithub.com/pydantic/speedate/pull/71) ### [`v2.8.0`](https://togithub.com/pydantic/pydantic/blob/HEAD/HISTORY.md#v280-2024-07-01) [Compare Source](https://togithub.com/pydantic/pydantic/compare/v2.7.4...v2.8.0) [GitHub release](https://togithub.com/pydantic/pydantic/releases/tag/v2.8.0) The code released in v2.8.0 is functionally identical to that of v2.8.0b1. ##### What's Changed ##### Packaging - Update citation version automatically with new releases by [@​sydney-runkle](https://togithub.com/sydney-runkle) in [#​9673](https://togithub.com/pydantic/pydantic/pull/9673) - Bump pyright to `v1.1.367` and add type checking tests for pipeline API by [@​adriangb](https://togithub.com/adriangb) in [#​9674](https://togithub.com/pydantic/pydantic/pull/9674) - Update `pydantic.v1` stub to `v1.10.17` by [@​sydney-runkle](https://togithub.com/sydney-runkle) in [#​9707](https://togithub.com/pydantic/pydantic/pull/9707) - General package updates to prep for `v2.8.0b1` by [@​sydney-runkle](https://togithub.com/sydney-runkle) in [#​9741](https://togithub.com/pydantic/pydantic/pull/9741) - Bump `pydantic-core` to `v2.20.0` by [@​sydney-runkle](https://togithub.com/sydney-runkle) in [#​9745](https://togithub.com/pydantic/pydantic/pull/9745) - Add support for Python 3.13 by [@​sydney-runkle](https://togithub.com/sydney-runkle) in [#​9743](https://togithub.com/pydantic/pydantic/pull/9743) - Update `pdm` version used for `pdm.lock` to v2.16.1 by [@​sydney-runkle](https://togithub.com/sydney-runkle) in [#​9761](https://togithub.com/pydantic/pydantic/pull/9761) - Update to `ruff` `v0.4.8` by [@​Viicos](https://togithub.com/Viicos) in [#​9585](https://togithub.com/pydantic/pydantic/pull/9585) ##### New Features - Experimental: support `defer_build` for `TypeAdapter` by [@​MarkusSintonen](https://togithub.com/MarkusSintonen) in [#​8939](https://togithub.com/pydantic/pydantic/pull/8939) - Implement `deprecated` field in json schema by [@​NeevCohen](https://togithub.com/NeevCohen) in [#​9298](https://togithub.com/pydantic/pydantic/pull/9298) - Experimental: Add pipeline API by [@​adriangb](https://togithub.com/adriangb) in [#​9459](https://togithub.com/pydantic/pydantic/pull/9459) - Add support for programmatic title generation by [@​NeevCohen](https://togithub.com/NeevCohen) in [#​9183](https://togithub.com/pydantic/pydantic/pull/9183) - Implement `fail_fast` feature by [@​uriyyo](https://togithub.com/uriyyo) in [#​9708](https://togithub.com/pydantic/pydantic/pull/9708) - Add `ser_json_inf_nan='strings'` mode to produce valid JSON by [@​josh-newman](https://togithub.com/josh-newman) in [pydantic/pydantic-core#1307](https://togithub.com/pydantic/pydantic-core/pull/1307) ##### Changes - Add warning when "alias" is set in ignored `Annotated` field by [@​nix010](https://togithub.com/nix010) in [#​9170](https://togithub.com/pydantic/pydantic/pull/9170) - Support serialization of some serializable defaults in JSON schema by [@​sydney-runkle](https://togithub.com/sydney-runkle) in [#​9624](https://togithub.com/pydantic/pydantic/pull/9624) - Relax type specification for `__validators__` values in `create_model` by [@​sydney-runkle](https://togithub.com/sydney-runkle) in [#​9697](https://togithub.com/pydantic/pydantic/pull/9697) - **Breaking Change:** Improve `smart` union matching logic by [@​sydney-runkle](https://togithub.com/sydney-runkle) in [pydantic/pydantic-core#1322](https://togithub.com/pydantic/pydantic-core/pull/1322) You can read more about our `smart` union matching logic [here](https://docs.pydantic.dev/dev/concepts/unions/#smart-mode). In some cases, if the old behavior is desired, you can switch to `left-to-right` mode and change the order of your `Union` members. ##### Performance ##### Internal Improvements - ⚡️ Speed up `_display_error_loc()` by 25% in `pydantic/v1/error_wrappers.py` by [@​misrasaurabh1](https://togithub.com/misrasaurabh1) in [#​9653](https://togithub.com/pydantic/pydantic/pull/9653) - ⚡️ Speed up `_get_all_json_refs()` by 34% in `pydantic/json_schema.py` by [@​misrasaurabh1](https://togithub.com/misrasaurabh1) in [#​9650](https://togithub.com/pydantic/pydantic/pull/9650) - ⚡️ Speed up `is_pydantic_dataclass()` by 41% in `pydantic/dataclasses.py` by [@​misrasaurabh1](https://togithub.com/misrasaurabh1) in [#​9652](https://togithub.com/pydantic/pydantic/pull/9652) - ⚡️ Speed up `to_snake()` by 27% in `pydantic/alias_generators.py` by [@​misrasaurabh1](https://togithub.com/misrasaurabh1) in [#​9747](https://togithub.com/pydantic/pydantic/pull/9747) - ⚡️ Speed up `unwrap_wrapped_function()` by 93% in `pydantic/_internal/_decorators.py` by [@​misrasaurabh1](https://togithub.com/misrasaurabh1) in [#​9727](https://togithub.com/pydantic/pydantic/pull/9727) ##### Fixes - Replace `__spec__.parent` with `__package__` by [@​hramezani](https://togithub.com/hramezani) in [#​9331](https://togithub.com/pydantic/pydantic/pull/9331) - Fix Outputted Model JSON Schema for `Sequence` type by [@​anesmemisevic](https://togithub.com/anesmemisevic) in [#​9303](https://togithub.com/pydantic/pydantic/pull/9303) - Fix typing of `_frame_depth` by [@​Viicos](https://togithub.com/Viicos) in [#​9353](https://togithub.com/pydantic/pydantic/pull/9353) - Make `ImportString` json schema compatible by [@​amitschang](https://togithub.com/amitschang) in [#​9344](https://togithub.com/pydantic/pydantic/pull/9344) - Hide private attributes (`PrivateAttr`) from `__init__` signature in type checkers by [@​idan22moral](https://togithub.com/idan22moral) in [#​9293](https://togithub.com/pydantic/pydantic/pull/9293) - Make detection of `TypeVar` defaults robust to the CPython `PEP-696` implementation by [@​AlexWaygood](https://togithub.com/AlexWaygood) in [#​9426](https://togithub.com/pydantic/pydantic/pull/9426) - Fix usage of `PlainSerializer` with builtin types by [@​Viicos](https://togithub.com/Viicos) in [#​9450](https://togithub.com/pydantic/pydantic/pull/9450) - Add more robust custom validation examples by [@​ChrisPappalardo](https://togithub.com/ChrisPappalardo) in [#​9468](https://togithub.com/pydantic/pydantic/pull/9468) - Fix ignored `strict` specification for `StringConstraint(strict=False)` by [@​vbmendes](https://togithub.com/vbmendes) in [#​9476](https://togithub.com/pydantic/pydantic/pull/9476) - Use `Self` where possible by [@​Viicos](https://togithub.com/Viicos) in [#​9479](https://togithub.com/pydantic/pydantic/pull/9479) - Do not alter `RootModel.model_construct` signature in the `mypy` plugin by [@​Viicos](https://togithub.com/Viicos) in [#​9480](https://togithub.com/pydantic/pydantic/pull/9480) - Fixed type hint of `validation_context` by [@​OhioDschungel6](https://togithub.com/OhioDschungel6) in [#​9508](https://togithub.com/pydantic/pydantic/pull/9508) - Support context being passed to TypeAdapter's `dump_json`/`dump_python` by [@​alexcouper](https://togithub.com/alexcouper) in [#​9495](https://togithub.com/pydantic/pydantic/pull/9495) - Updates type signature for `Field()` constructor by [@​bjmc](https://togithub.com/bjmc) in [#​9484](https://togithub.com/pydantic/pydantic/pull/9484) - Improve builtin alias generators by [@​sydney-runkle](https://togithub.com/sydney-runkle) in [#​9561](https://togithub.com/pydantic/pydantic/pull/9561) - Fix typing of `TypeAdapter` by [@​Viicos](https://togithub.com/Viicos) in [#​9570](https://togithub.com/pydantic/pydantic/pull/9570) - Add fallback default value for private fields in `__setstate__` of BaseModel by [@​anhpham1509](https://togithub.com/anhpham1509) in [#​9584](https://togithub.com/pydantic/pydantic/pull/9584) - Support `PEP 746` by [@​adriangb](https://togithub.com/adriangb) in [#​9587](https://togithub.com/pydantic/pydantic/pull/9587) - Allow validator and serializer functions to have default values by [@​Viicos](https://togithub.com/Viicos) in [#​9478](https://togithub.com/pydantic/pydantic/pull/9478) - Fix bug with mypy plugin's handling of covariant `TypeVar` fields by [@​dmontagu](https://togithub.com/dmontagu) in [#​9606](https://togithub.com/pydantic/pydantic/pull/9606) - Fix multiple annotation / constraint application logic by [@​sydney-runkle](https://togithub.com/sydney-runkle) in [#​9623](https://togithub.com/pydantic/pydantic/pull/9623) - Respect `regex` flags in validation and json schema by [@​sydney-runkle](https://togithub.com/sydney-runkle) in [#​9591](https://togithub.com/pydantic/pydantic/pull/9591) - Fix type hint on `IpvAnyAddress` by [@​sydney-runkle](https://togithub.com/sydney-runkle) in [#​9640](https://togithub.com/pydantic/pydantic/pull/9640) - Allow a field specifier on `__pydantic_extra__` by [@​dmontagu](https://togithub.com/dmontagu) in [#​9659](https://togithub.com/pydantic/pydantic/pull/9659) - Use normalized case for file path comparison by [@​sydney-runkle](https://togithub.com/sydney-runkle) in [#​9737](https://togithub.com/pydantic/pydantic/pull/9737) - Modify constraint application logic to allow field constraints on `Optional[Decimal]` by [@​lazyhope](https://togithub.com/lazyhope) in [#​9754](https://togithub.com/pydantic/pydantic/pull/9754) - `validate_call` type params fix by [@​sydney-runkle](https://togithub.com/sydney-runkle) in [#​9760](https://togithub.com/pydantic/pydantic/pull/9760) - Check all warnings returned by pytest.warns() by [@​s-t-e-v-e-n-k](https://togithub.com/s-t-e-v-e-n-k) in [#​9702](https://togithub.com/pydantic/pydantic/pull/9702) - Reuse `re.Pattern` object in regex patterns to allow for regex flags by [@​sydney-runkle](https://togithub.com/sydney-runkle) in [pydantic/pydantic-core#1318](https://togithub.com/pydantic/pydantic-core/pull/1318) ##### New Contributors - [@​idan22moral](https://togithub.com/idan22moral) made their first contribution in [#​9294](https://togithub.com/pydantic/pydantic/pull/9294) - [@​anesmemisevic](https://togithub.com/anesmemisevic) made their first contribution in [#​9303](https://togithub.com/pydantic/pydantic/pull/9303) - [@​max-muoto](https://togithub.com/max-muoto) made their first contribution in [#​9338](https://togithub.com/pydantic/pydantic/pull/9338) - [@​amitschang](https://togithub.com/amitschang) made their first contribution in [#​9344](https://togithub.com/pydantic/pydantic/pull/9344) - [@​paulmartin91](https://togithub.com/paulmartin91) made their first contribution in [#​9410](https://togithub.com/pydantic/pydantic/pull/9410) - [@​OhioDschungel6](https://togithub.com/OhioDschungel6) made their first contribution in [#​9405](https://togithub.com/pydantic/pydantic/pull/9405) - [@​AlexWaygood](https://togithub.com/AlexWaygood) made their first contribution in [#​9426](https://togithub.com/pydantic/pydantic/pull/9426) - [@​kinuax](https://togithub.com/kinuax) made their first contribution in [#​9433](https://togithub.com/pydantic/pydantic/pull/9433) - [@​antoni-jamiolkowski](https://togithub.com/antoni-jamiolkowski) made their first contribution in [#​9431](https://togithub.com/pydantic/pydantic/pull/9431) - [@​candleindark](https://togithub.com/candleindark) made their first contribution in [#​9448](https://togithub.com/pydantic/pydantic/pull/9448) - [@​nix010](https://togithub.com/nix010) made their first contribution in [#​9170](https://togithub.com/pydantic/pydantic/pull/9170) - [@​tomy0000000](https://togithub.com/tomy0000000) made their first contribution in [#​9457](https://togithub.com/pydantic/pydantic/pull/9457) - [@​vbmendes](https://togithub.com/vbmendes) made their first contribution in [#​9470](https://togithub.com/pydantic/pydantic/pull/9470) - [@​micheleAlberto](https://togithub.com/micheleAlberto) made their first contribution in [#​9471](https://togithub.com/pydantic/pydantic/pull/9471) - [@​ChrisPappalardo](https://togithub.com/ChrisPappalardo) made their first contribution in [#​9468](https://togithub.com/pydantic/pydantic/pull/9468) - [@​blueTurtz](https://togithub.com/blueTurtz) made their first contribution in [#​9475](https://togithub.com/pydantic/pydantic/pull/9475) - [@​WinterBlue16](https://togithub.com/WinterBlue16) made their first contribution in [#​9477](https://togithub.com/pydantic/pydantic/pull/9477) - [@​bittner](https://togithub.com/bittner) made their first contribution in [#​9500](https://togithub.com/pydantic/pydantic/pull/9500) - [@​alexcouper](https://togithub.com/alexcouper) made their first contribution in [#​9495](https://togithub.com/pydantic/pydantic/pull/9495) - [@​bjmc](https://togithub.com/bjmc) made their first contribution in [#​9484](https://togithub.com/pydantic/pydantic/pull/9484) - [@​pjvv](https://togithub.com/pjvv) made their first contribution in [#​9529](https://togithub.com/pydantic/pydantic/pull/9529) - [@​nedbat](https://togithub.com/nedbat) made their first contribution in [#​9530](https://togithub.com/pydantic/pydantic/pull/9530) - [@​gunnellEvan](https://togithub.com/gunnellEvan) made their first contribution in [#​9469](https://togithub.com/pydantic/pydantic/pull/9469) - [@​jaymbans](https://togithub.com/jaymbans) made their first contribution in [#​9531](https://togithub.com/pydantic/pydantic/pull/9531) - [@​MarcBresson](https://togithub.com/MarcBresson) made their first contribution in [#​9534](https://togithub.com/pydantic/pydantic/pull/9534) - [@​anhpham1509](https://togithub.com/anhpham1509) made their first contribution in [#​9584](https://togithub.com/pydantic/pydantic/pull/9584) - [@​K-dash](https://togithub.com/K-dash) made their first contribution in [#​9595](https://togithub.com/pydantic/pydantic/pull/9595) - [@​s-t-e-v-e-n-k](https://togithub.com/s-t-e-v-e-n-k) made their first contribution in [#​9527](https://togithub.com/pydantic/pydantic/pull/9527) - [@​airwoodix](https://togithub.com/airwoodix) made their first contribution in [#​9506](https://togithub.com/pydantic/pydantic/pull/9506) - [@​misrasaurabh1](https://togithub.com/misrasaurabh1) made their first contribution in [#​9653](https://togithub.com/pydantic/pydantic/pull/9653) - [@​AlessandroMiola](https://togithub.com/AlessandroMiola) made their first contribution in [#​9740](https://togithub.com/pydantic/pydantic/pull/9740) - [@​mylapallilavanyaa](https://togithub.com/mylapallilavanyaa) made their first contribution in [#​9746](https://togithub.com/pydantic/pydantic/pull/9746) - [@​lazyhope](https://togithub.com/lazyhope) made their first contribution in [#​9754](https://togithub.com/pydantic/pydantic/pull/9754) - [@​YassinNouh21](https://togithub.com/YassinNouh21) made their first contribution in [#​9759](https://togithub.com/pydantic/pydantic/pull/9759) </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://togithub.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MjguMSIsInVwZGF0ZWRJblZlciI6IjM3LjQyOC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> Co-authored-by: erichesse <hessee@rki.de>
v2.8.2 (2024-07-03) * Fix issue with assertion caused by pluggable schema validator by @dmontagu in #9838 v2.8.1 (2024-07-03) * Bump ruff to v0.5.0 and pyright to v1.1.369 by @sydney-runkle in #9801 * Bump pydantic-core to v2.20.1, pydantic-extra-types to v2.9.0 by @sydney-runkle in #9832 * Fix breaking change in to_snake from v2.7 -> v2.8 by @sydney-runkle in #9812 * Fix list constraint json schema application by @sydney-runkle in #9818 * Support time duration more than 23 by @nix010 in pydantic/speedate#64 * Fix millisecond fraction being handled with the wrong scale by @davidhewitt in pydantic/speedate#65 * Handle negative fractional durations correctly by @sydney-runkle in pydantic/speedate#71 v2.8.0 (2024-07-01) See: - https://docs.pydantic.dev/latest/changelog/#v280-2024-07-01 - https://pydantic.dev/articles/pydantic-v2-8-release Full changelog: pydantic/pydantic@v2.7.4...v2.8.2 Signed-off-by: Tim Orling <tim.orling@konsulko.com>
Fixes #61