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

Also truncate negative milisecond fractions #71

Merged
merged 23 commits into from
Jul 3, 2024
Merged

Conversation

sydney-runkle
Copy link
Member

@sydney-runkle sydney-runkle commented Jun 26, 2024

This started as a fix for how we handle negative timestamps in the case of milliseconds, but I realized we were mishandling them in a couple of cases, so I expanded the scope of the fix and added corresponding tests.

Took a bit longer than expected, as I forgot how to do basic subtraction for a bit.

Copy link
Contributor

@davidhewitt davidhewitt left a comment

Choose a reason for hiding this comment

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

I also think before we call from_timestamp_with_config we might need to adjust negative timestamps further by subtracting another [milli]second and then doing 1000[000] - fraction

src/datetime.rs Outdated Show resolved Hide resolved
@sydney-runkle
Copy link
Member Author

I'll note, this is still a WIP, working on a better solution

@sydney-runkle
Copy link
Member Author

The above change is also not right, just working through some ideas

@sydney-runkle
Copy link
Member Author

Other notes:

It's challenging that we always use positive microseconds, but can have either negative or positive second values, resulting in ops like this:

pub(crate) fn timestamp_watershed(timestamp: i64) -> Result<(i64, u32), ParseError> {
        let ts_abs = timestamp.checked_abs().ok_or(ParseError::DateTooSmall)?;
        if ts_abs <= MS_WATERSHED {
            return Ok((timestamp, 0));
        }
        // if the timestamp is in milliseconds, then we need to convert it to seconds
        let mut seconds = timestamp / 1_000;
        let mut microseconds = ((timestamp % 1_000) * 1000) as i32;
        if microseconds < 0 {
            seconds -= 1;
            microseconds += 1_000_000;
        }
        Ok((seconds, microseconds as u32))
    }

@sydney-runkle
Copy link
Member Author

It seems as though we have lots of bugs in our numeric timestamp processing...

@sydney-runkle
Copy link
Member Author

This is ready for review - @samuelcolvin or @dmontagu, could you please take a look, given that @davidhewitt is out for a bit?

Copy link

@latk latk left a comment

Choose a reason for hiding this comment

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

Thank you for your work to handle timestamps correctly! The code looks very readable.

I did some tests that systematically searched for roundtrip problems. There are some scenarios where using floats as the intermediate representation leads to actual failures.

The function that I'm using to search for problems is the following, which formats a timestamp as a string and then parses it:

fn roundtrip_us(us: i64) -> Result<i64, ParseError> {
    let formatted_us = us.to_string();
    let formatted_s = reformat_us_to_s(&formatted_us); // insert decimal point
    let dt = DateTime::parse_str(&formatted_s)?;
    Ok(dt.timestamp() * 1_000_000 + i64::from(dt.time.microsecond))
}

fn reformat_us_to_s(us: &str) -> String {
    let (integral, fractional) = us.split_at(us.len() - 6);
    format!("{integral}.{fractional}")
}

Then I used tests like the following to systematically search for problematic examples (so basically a brute-force property-based test):

#[test]
fn can_accurately_parse_recent_timestamps() {
    let recently_us = 1719776043_000000;
    for delta in 0..1_000_000 {
        let us = recently_us - delta;
        assert_eq!(roundtrip_us(us), Ok(us));
    }
}

src/datetime.rs Show resolved Hide resolved
src/datetime.rs Outdated Show resolved Hide resolved
@sydney-runkle
Copy link
Member Author

I did some tests that systematically searched for roundtrip problems. There are some scenarios where using floats as the intermediate representation leads to actual failures.

Thanks for sharing these tests! I've added them to the repo so that we can wait on merging until these are fixed.

@sydney-runkle
Copy link
Member Author

I suppose we can wait to merge this into pydantic until v2.8.1, given that all of the changes in this most recent speedate release could arguably be categorized as fixes.

src/numbers.rs Outdated Show resolved Hide resolved
@sydney-runkle
Copy link
Member Author

I've added an extra benchmark here, and here are some stats about the corresponding improvements:

on main

test parse_timestamp_str             ... bench:         310.35 ns/iter (+/- 3.57)

on my branch, before any performance optimizations:

test parse_timestamp_str             ... bench:         282.57 ns/iter (+/- 3.25)

on my branch, after moving the decimal digit counting to the existing parse bytes function:

test parse_timestamp_str             ... bench:         263.51 ns/iter (+/- 14.42)

Also, I locally broke these tests up individually, to confirm that the improvements were across the board:

mine:

running 11 tests
test parse_timestamp_str                       ... bench:         273.08 ns/iter (+/- 17.28)
test parse_timestamp_str_1654646400            ... bench:          22.03 ns/iter (+/- 1.43)
test parse_timestamp_str_1654646404            ... bench:          21.59 ns/iter (+/- 0.70)
test parse_timestamp_str_1654646404000_5       ... bench:          29.94 ns/iter (+/- 0.63)
test parse_timestamp_str_1654646404123_456     ... bench:          32.13 ns/iter (+/- 3.49)
test parse_timestamp_str_1654646404_123456     ... bench:          28.52 ns/iter (+/- 0.26)
test parse_timestamp_str_1654646404_5          ... bench:          25.59 ns/iter (+/- 0.67)
test parse_timestamp_str_neg_1654646400        ... bench:          21.83 ns/iter (+/- 1.18)
test parse_timestamp_str_neg_1654646404        ... bench:          22.46 ns/iter (+/- 1.55)
test parse_timestamp_str_neg_1654646404000_123 ... bench:          32.34 ns/iter (+/- 0.76)
test parse_timestamp_str_neg_1654646404_123456 ... bench:          29.40 ns/iter (+/- 92.68

main

running 11 tests
test parse_timestamp_str                       ... bench:         328.65 ns/iter (+/- 32.11)
test parse_timestamp_str_1654646400            ... bench:          24.99 ns/iter (+/- 1.11)
test parse_timestamp_str_1654646404            ... bench:          25.72 ns/iter (+/- 0.69)
test parse_timestamp_str_1654646404000_5       ... bench:          32.49 ns/iter (+/- 3.58)
test parse_timestamp_str_1654646404123_456     ... bench:          36.48 ns/iter (+/- 5.00)
test parse_timestamp_str_1654646404_123456     ... bench:          34.91 ns/iter (+/- 3.60)
test parse_timestamp_str_1654646404_5          ... bench:          28.86 ns/iter (+/- 1.13)
test parse_timestamp_str_neg_1654646400        ... bench:          24.76 ns/iter (+/- 1.29)
test parse_timestamp_str_neg_1654646404        ... bench:          36.21 ns/iter (+/- 46.17)
test parse_timestamp_str_neg_1654646404000_123 ... bench:          34.36 ns/iter (+/- 2.41)
test parse_timestamp_str_neg_1654646404_123456 ... bench:          34.00 ns/iter (+/- 0.36)

@sydney-runkle
Copy link
Member Author

I guess the main question here is - is this a breaking change in terms of the API change for float_parse_bytes?

@sydney-runkle
Copy link
Member Author

I guess the main question here is - is this a breaking change in terms of the API change for float_parse_bytes?

If so that's fine, I can revert and do the slightly less performant, but also ok approach where we basically parse the bytes twice.

@latk
Copy link

latk commented Jul 1, 2024

is this a breaking change in terms of the API change for float_parse_bytes?

It's definitely changing the public API in an incompatible way, so incrementing the major version would be appropriate for SemVer.

However, it would be extremely easy to add a compatibility layer to get the best of both worlds, efficient single-pass parsing and API stability:

  1. rename the current float_parse_bytes() to something like float_parse_bytes_with_decimal_digit_length()

  2. add a "new" compatibility layer that discards the extra length, roughly:

    #[inline(always)]
    pub fn float_parse_bytes(...) -> ... {
      let (int_or_float, _) = float_parse_bytes_with_decimal_digit_length(...);
      int_or_float
    }

@samuelcolvin
Copy link
Member

It's definitely changing the public API in an incompatible way, so incrementing the major version would be appropriate for SemVer.

No. We haven't reach version 1, so there's no need to increment the major version.

Copy link
Member

@samuelcolvin samuelcolvin left a comment

Choose a reason for hiding this comment

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

Sorry, I fear there's more to change.

The issue with float parsing and the need to use lexical-parse-float has been weighing heavy on my conscience since we had to remove logic derived fro here in jiter and replace it with the crate.

benches/main.rs Outdated Show resolved Hide resolved
src/numbers.rs Outdated Show resolved Hide resolved
src/numbers.rs Outdated Show resolved Hide resolved
src/numbers.rs Outdated Show resolved Hide resolved
src/datetime.rs Show resolved Hide resolved
Co-authored-by: Samuel Colvin <s@muelcolvin.com>
@sydney-runkle
Copy link
Member Author

I'm going to revert the changes to float parsing here (no breaking API changes, no modification of float parsing), given that we'll want to address #53 in the future.

Copy link
Member

@samuelcolvin samuelcolvin left a comment

Choose a reason for hiding this comment

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

LGTM

@sydney-runkle sydney-runkle merged commit 27b17f7 into main Jul 3, 2024
7 checks passed
@sydney-runkle sydney-runkle deleted the neg-fix-truncation branch July 3, 2024 15:55
@latk
Copy link

latk commented Jul 6, 2024

I'm going to revert the changes to float parsing here (no breaking API changes, no modification of float parsing)

Bit disappointed that this got reverted. Yes, this had changed behavior, but in a good way.

I agree that parsing floats yourself is a fool's errand, which is why the decimal_integers idea was so good: parsing the timestamp as a decimal (fixed-point number that can be represented accurately as an integer), and then rescaling it once at the end. That avoided accumulating errors from repeatedly summing up small floats and helped to fix the bugs revealed by my roundtrip tests.

Because Speedate has a concept of a "precision overflow", it appears that the numbers being parsed here aren't really floats, but decimals with a limited number of significant base-10 digits. Ideally, this parsing code would just return an integer (to be interpreted on the ms or μs scale) rather than a float (to be interpreted on the s scale).

Switching to a fully-correct float parsing library (such as f64::from_str()) would of course also solve precision problems as long as Speedate has to use floats somewhere in its internal representation (which is acceptable for μs-precision timestamps), though in that case limiting the number of digits in the fractional part makes less sense (long float literals may round to short values).

I have a couple of hours I could throw at this problem. Would there be interest in me attempting to resurrect the decimal_integers approach, but without using floats as the intermediate representation? This should completely eliminate any concerns about precision or rounding modes during timestamp parsing (except for cases where the "precision overflow" error was disabled). My intention would be to write and test a hand-rolled parser function parse_decimal_timestamp_us(data: &[u8], watershed, config) -> Result<i64>.

@samuelcolvin
Copy link
Member

samuelcolvin commented Jul 6, 2024

It was my decision.

If we're parsing floats, we should use lexical-parse-float, in the mean time, I don't want to change our float parsing logic further. Happy to review a pr to use lexical-parse-float for float parsing.

If we can interpret decimals as integers, e.g. as microseconds, that's great, bit I don't think it's always possible without changing the internal presentation in speedate which I don't want to do unless it's absolutely necessary.

github-actions bot pushed a commit to Boeing/meta-openembedded-contrib that referenced this pull request Jul 10, 2024
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>
erichesse added a commit to robert-koch-institut/mex-extractors that referenced this pull request Jul 17, 2024
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
[@&#8203;dmontagu](https://togithub.com/dmontagu) in
[#&#8203;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
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;9801](https://togithub.com/pydantic/pydantic/pull/9801)
- Bump `pydantic-core` to `v2.20.1`, `pydantic-extra-types` to `v2.9.0`
by [@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;9832](https://togithub.com/pydantic/pydantic/pull/9832)

##### Fixes

- Fix breaking change in `to_snake` from v2.7 -> v2.8 by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;9812](https://togithub.com/pydantic/pydantic/pull/9812)
- Fix list constraint json schema application by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;9818](https://togithub.com/pydantic/pydantic/pull/9818)
- Support time duration more than 23 by
[@&#8203;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
[@&#8203;davidhewitt](https://togithub.com/davidhewitt) in
[pydantic/speedate#65](https://togithub.com/pydantic/speedate/pull/65)
- Handle negative fractional durations correctly by
[@&#8203;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
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;9673](https://togithub.com/pydantic/pydantic/pull/9673)
- Bump pyright to `v1.1.367` and add type checking tests for pipeline
API by [@&#8203;adriangb](https://togithub.com/adriangb) in
[#&#8203;9674](https://togithub.com/pydantic/pydantic/pull/9674)
- Update `pydantic.v1` stub to `v1.10.17` by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;9707](https://togithub.com/pydantic/pydantic/pull/9707)
- General package updates to prep for `v2.8.0b1` by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;9741](https://togithub.com/pydantic/pydantic/pull/9741)
- Bump `pydantic-core` to `v2.20.0` by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;9745](https://togithub.com/pydantic/pydantic/pull/9745)
- Add support for Python 3.13 by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;9743](https://togithub.com/pydantic/pydantic/pull/9743)
- Update `pdm` version used for `pdm.lock` to v2.16.1 by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;9761](https://togithub.com/pydantic/pydantic/pull/9761)
- Update to `ruff` `v0.4.8` by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[#&#8203;9585](https://togithub.com/pydantic/pydantic/pull/9585)

##### New Features

- Experimental: support `defer_build` for `TypeAdapter` by
[@&#8203;MarkusSintonen](https://togithub.com/MarkusSintonen) in
[#&#8203;8939](https://togithub.com/pydantic/pydantic/pull/8939)
- Implement `deprecated` field in json schema by
[@&#8203;NeevCohen](https://togithub.com/NeevCohen) in
[#&#8203;9298](https://togithub.com/pydantic/pydantic/pull/9298)
- Experimental: Add pipeline API by
[@&#8203;adriangb](https://togithub.com/adriangb) in
[#&#8203;9459](https://togithub.com/pydantic/pydantic/pull/9459)
- Add support for programmatic title generation by
[@&#8203;NeevCohen](https://togithub.com/NeevCohen) in
[#&#8203;9183](https://togithub.com/pydantic/pydantic/pull/9183)
- Implement `fail_fast` feature by
[@&#8203;uriyyo](https://togithub.com/uriyyo) in
[#&#8203;9708](https://togithub.com/pydantic/pydantic/pull/9708)
- Add `ser_json_inf_nan='strings'` mode to produce valid JSON by
[@&#8203;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
[@&#8203;nix010](https://togithub.com/nix010) in
[#&#8203;9170](https://togithub.com/pydantic/pydantic/pull/9170)
- Support serialization of some serializable defaults in JSON schema by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;9624](https://togithub.com/pydantic/pydantic/pull/9624)
- Relax type specification for `__validators__` values in `create_model`
by [@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;9697](https://togithub.com/pydantic/pydantic/pull/9697)
- **Breaking Change:** Improve `smart` union matching logic by
[@&#8203;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
[@&#8203;misrasaurabh1](https://togithub.com/misrasaurabh1) in
[#&#8203;9653](https://togithub.com/pydantic/pydantic/pull/9653)
- ⚡️ Speed up `_get_all_json_refs()` by 34% in `pydantic/json_schema.py`
by [@&#8203;misrasaurabh1](https://togithub.com/misrasaurabh1) in
[#&#8203;9650](https://togithub.com/pydantic/pydantic/pull/9650)
- ⚡️ Speed up `is_pydantic_dataclass()` by 41% in
`pydantic/dataclasses.py` by
[@&#8203;misrasaurabh1](https://togithub.com/misrasaurabh1) in
[#&#8203;9652](https://togithub.com/pydantic/pydantic/pull/9652)
- ⚡️ Speed up `to_snake()` by 27% in `pydantic/alias_generators.py` by
[@&#8203;misrasaurabh1](https://togithub.com/misrasaurabh1) in
[#&#8203;9747](https://togithub.com/pydantic/pydantic/pull/9747)
- ⚡️ Speed up `unwrap_wrapped_function()` by 93% in
`pydantic/_internal/_decorators.py` by
[@&#8203;misrasaurabh1](https://togithub.com/misrasaurabh1) in
[#&#8203;9727](https://togithub.com/pydantic/pydantic/pull/9727)

##### Fixes

- Replace `__spec__.parent` with `__package__` by
[@&#8203;hramezani](https://togithub.com/hramezani) in
[#&#8203;9331](https://togithub.com/pydantic/pydantic/pull/9331)
- Fix Outputted Model JSON Schema for `Sequence` type by
[@&#8203;anesmemisevic](https://togithub.com/anesmemisevic) in
[#&#8203;9303](https://togithub.com/pydantic/pydantic/pull/9303)
- Fix typing of `_frame_depth` by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[#&#8203;9353](https://togithub.com/pydantic/pydantic/pull/9353)
- Make `ImportString` json schema compatible by
[@&#8203;amitschang](https://togithub.com/amitschang) in
[#&#8203;9344](https://togithub.com/pydantic/pydantic/pull/9344)
- Hide private attributes (`PrivateAttr`) from `__init__` signature in
type checkers by [@&#8203;idan22moral](https://togithub.com/idan22moral)
in [#&#8203;9293](https://togithub.com/pydantic/pydantic/pull/9293)
- Make detection of `TypeVar` defaults robust to the CPython `PEP-696`
implementation by
[@&#8203;AlexWaygood](https://togithub.com/AlexWaygood) in
[#&#8203;9426](https://togithub.com/pydantic/pydantic/pull/9426)
- Fix usage of `PlainSerializer` with builtin types by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[#&#8203;9450](https://togithub.com/pydantic/pydantic/pull/9450)
- Add more robust custom validation examples by
[@&#8203;ChrisPappalardo](https://togithub.com/ChrisPappalardo) in
[#&#8203;9468](https://togithub.com/pydantic/pydantic/pull/9468)
- Fix ignored `strict` specification for
`StringConstraint(strict=False)` by
[@&#8203;vbmendes](https://togithub.com/vbmendes) in
[#&#8203;9476](https://togithub.com/pydantic/pydantic/pull/9476)
- Use `Self` where possible by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[#&#8203;9479](https://togithub.com/pydantic/pydantic/pull/9479)
- Do not alter `RootModel.model_construct` signature in the `mypy`
plugin by [@&#8203;Viicos](https://togithub.com/Viicos) in
[#&#8203;9480](https://togithub.com/pydantic/pydantic/pull/9480)
- Fixed type hint of `validation_context` by
[@&#8203;OhioDschungel6](https://togithub.com/OhioDschungel6) in
[#&#8203;9508](https://togithub.com/pydantic/pydantic/pull/9508)
- Support context being passed to TypeAdapter's
`dump_json`/`dump_python` by
[@&#8203;alexcouper](https://togithub.com/alexcouper) in
[#&#8203;9495](https://togithub.com/pydantic/pydantic/pull/9495)
- Updates type signature for `Field()` constructor by
[@&#8203;bjmc](https://togithub.com/bjmc) in
[#&#8203;9484](https://togithub.com/pydantic/pydantic/pull/9484)
- Improve builtin alias generators by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;9561](https://togithub.com/pydantic/pydantic/pull/9561)
- Fix typing of `TypeAdapter` by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[#&#8203;9570](https://togithub.com/pydantic/pydantic/pull/9570)
- Add fallback default value for private fields in `__setstate__` of
BaseModel by [@&#8203;anhpham1509](https://togithub.com/anhpham1509) in
[#&#8203;9584](https://togithub.com/pydantic/pydantic/pull/9584)
- Support `PEP 746` by [@&#8203;adriangb](https://togithub.com/adriangb)
in [#&#8203;9587](https://togithub.com/pydantic/pydantic/pull/9587)
- Allow validator and serializer functions to have default values by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[#&#8203;9478](https://togithub.com/pydantic/pydantic/pull/9478)
- Fix bug with mypy plugin's handling of covariant `TypeVar` fields by
[@&#8203;dmontagu](https://togithub.com/dmontagu) in
[#&#8203;9606](https://togithub.com/pydantic/pydantic/pull/9606)
- Fix multiple annotation / constraint application logic by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;9623](https://togithub.com/pydantic/pydantic/pull/9623)
- Respect `regex` flags in validation and json schema by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;9591](https://togithub.com/pydantic/pydantic/pull/9591)
- Fix type hint on `IpvAnyAddress` by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;9640](https://togithub.com/pydantic/pydantic/pull/9640)
- Allow a field specifier on `__pydantic_extra__` by
[@&#8203;dmontagu](https://togithub.com/dmontagu) in
[#&#8203;9659](https://togithub.com/pydantic/pydantic/pull/9659)
- Use normalized case for file path comparison by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;9737](https://togithub.com/pydantic/pydantic/pull/9737)
- Modify constraint application logic to allow field constraints on
`Optional[Decimal]` by [@&#8203;lazyhope](https://togithub.com/lazyhope)
in [#&#8203;9754](https://togithub.com/pydantic/pydantic/pull/9754)
- `validate_call` type params fix by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;9760](https://togithub.com/pydantic/pydantic/pull/9760)
- Check all warnings returned by pytest.warns() by
[@&#8203;s-t-e-v-e-n-k](https://togithub.com/s-t-e-v-e-n-k) in
[#&#8203;9702](https://togithub.com/pydantic/pydantic/pull/9702)
- Reuse `re.Pattern` object in regex patterns to allow for regex flags
by [@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[pydantic/pydantic-core#1318](https://togithub.com/pydantic/pydantic-core/pull/1318)

##### New Contributors

- [@&#8203;idan22moral](https://togithub.com/idan22moral) made their
first contribution in
[#&#8203;9294](https://togithub.com/pydantic/pydantic/pull/9294)
- [@&#8203;anesmemisevic](https://togithub.com/anesmemisevic) made their
first contribution in
[#&#8203;9303](https://togithub.com/pydantic/pydantic/pull/9303)
- [@&#8203;max-muoto](https://togithub.com/max-muoto) made their first
contribution in
[#&#8203;9338](https://togithub.com/pydantic/pydantic/pull/9338)
- [@&#8203;amitschang](https://togithub.com/amitschang) made their first
contribution in
[#&#8203;9344](https://togithub.com/pydantic/pydantic/pull/9344)
- [@&#8203;paulmartin91](https://togithub.com/paulmartin91) made their
first contribution in
[#&#8203;9410](https://togithub.com/pydantic/pydantic/pull/9410)
- [@&#8203;OhioDschungel6](https://togithub.com/OhioDschungel6) made
their first contribution in
[#&#8203;9405](https://togithub.com/pydantic/pydantic/pull/9405)
- [@&#8203;AlexWaygood](https://togithub.com/AlexWaygood) made their
first contribution in
[#&#8203;9426](https://togithub.com/pydantic/pydantic/pull/9426)
- [@&#8203;kinuax](https://togithub.com/kinuax) made their first
contribution in
[#&#8203;9433](https://togithub.com/pydantic/pydantic/pull/9433)
-
[@&#8203;antoni-jamiolkowski](https://togithub.com/antoni-jamiolkowski)
made their first contribution in
[#&#8203;9431](https://togithub.com/pydantic/pydantic/pull/9431)
- [@&#8203;candleindark](https://togithub.com/candleindark) made their
first contribution in
[#&#8203;9448](https://togithub.com/pydantic/pydantic/pull/9448)
- [@&#8203;nix010](https://togithub.com/nix010) made their first
contribution in
[#&#8203;9170](https://togithub.com/pydantic/pydantic/pull/9170)
- [@&#8203;tomy0000000](https://togithub.com/tomy0000000) made their
first contribution in
[#&#8203;9457](https://togithub.com/pydantic/pydantic/pull/9457)
- [@&#8203;vbmendes](https://togithub.com/vbmendes) made their first
contribution in
[#&#8203;9470](https://togithub.com/pydantic/pydantic/pull/9470)
- [@&#8203;micheleAlberto](https://togithub.com/micheleAlberto) made
their first contribution in
[#&#8203;9471](https://togithub.com/pydantic/pydantic/pull/9471)
- [@&#8203;ChrisPappalardo](https://togithub.com/ChrisPappalardo) made
their first contribution in
[#&#8203;9468](https://togithub.com/pydantic/pydantic/pull/9468)
- [@&#8203;blueTurtz](https://togithub.com/blueTurtz) made their first
contribution in
[#&#8203;9475](https://togithub.com/pydantic/pydantic/pull/9475)
- [@&#8203;WinterBlue16](https://togithub.com/WinterBlue16) made their
first contribution in
[#&#8203;9477](https://togithub.com/pydantic/pydantic/pull/9477)
- [@&#8203;bittner](https://togithub.com/bittner) made their first
contribution in
[#&#8203;9500](https://togithub.com/pydantic/pydantic/pull/9500)
- [@&#8203;alexcouper](https://togithub.com/alexcouper) made their first
contribution in
[#&#8203;9495](https://togithub.com/pydantic/pydantic/pull/9495)
- [@&#8203;bjmc](https://togithub.com/bjmc) made their first
contribution in
[#&#8203;9484](https://togithub.com/pydantic/pydantic/pull/9484)
- [@&#8203;pjvv](https://togithub.com/pjvv) made their first
contribution in
[#&#8203;9529](https://togithub.com/pydantic/pydantic/pull/9529)
- [@&#8203;nedbat](https://togithub.com/nedbat) made their first
contribution in
[#&#8203;9530](https://togithub.com/pydantic/pydantic/pull/9530)
- [@&#8203;gunnellEvan](https://togithub.com/gunnellEvan) made their
first contribution in
[#&#8203;9469](https://togithub.com/pydantic/pydantic/pull/9469)
- [@&#8203;jaymbans](https://togithub.com/jaymbans) made their first
contribution in
[#&#8203;9531](https://togithub.com/pydantic/pydantic/pull/9531)
- [@&#8203;MarcBresson](https://togithub.com/MarcBresson) made their
first contribution in
[#&#8203;9534](https://togithub.com/pydantic/pydantic/pull/9534)
- [@&#8203;anhpham1509](https://togithub.com/anhpham1509) made their
first contribution in
[#&#8203;9584](https://togithub.com/pydantic/pydantic/pull/9584)
- [@&#8203;K-dash](https://togithub.com/K-dash) made their first
contribution in
[#&#8203;9595](https://togithub.com/pydantic/pydantic/pull/9595)
- [@&#8203;s-t-e-v-e-n-k](https://togithub.com/s-t-e-v-e-n-k) made their
first contribution in
[#&#8203;9527](https://togithub.com/pydantic/pydantic/pull/9527)
- [@&#8203;airwoodix](https://togithub.com/airwoodix) made their first
contribution in
[#&#8203;9506](https://togithub.com/pydantic/pydantic/pull/9506)
- [@&#8203;misrasaurabh1](https://togithub.com/misrasaurabh1) made their
first contribution in
[#&#8203;9653](https://togithub.com/pydantic/pydantic/pull/9653)
- [@&#8203;AlessandroMiola](https://togithub.com/AlessandroMiola) made
their first contribution in
[#&#8203;9740](https://togithub.com/pydantic/pydantic/pull/9740)
- [@&#8203;mylapallilavanyaa](https://togithub.com/mylapallilavanyaa)
made their first contribution in
[#&#8203;9746](https://togithub.com/pydantic/pydantic/pull/9746)
- [@&#8203;lazyhope](https://togithub.com/lazyhope) made their first
contribution in
[#&#8203;9754](https://togithub.com/pydantic/pydantic/pull/9754)
- [@&#8203;YassinNouh21](https://togithub.com/YassinNouh21) made their
first contribution in
[#&#8203;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>
github-actions bot pushed a commit to Boeing/meta-openembedded-contrib that referenced this pull request Aug 8, 2024
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>
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.

None yet

5 participants