From 666fdf7497e6c65f840ea6c6e20f3e3501771398 Mon Sep 17 00:00:00 2001 From: David Hewitt <1939362+davidhewitt@users.noreply.github.com> Date: Thu, 10 Aug 2023 16:42:09 +0100 Subject: [PATCH 1/4] bump pydantic-core to 2.5.0 --- pdm.lock | 212 +++++++++++++++++++++++++------------------------ pyproject.toml | 2 +- 2 files changed, 108 insertions(+), 106 deletions(-) diff --git a/pdm.lock b/pdm.lock index 394daa2f6d..e9bd2298df 100644 --- a/pdm.lock +++ b/pdm.lock @@ -6,7 +6,7 @@ groups = ["default", "docs", "email", "linting", "memray", "mypy", "testing", "t cross_platform = true static_urls = false lock_version = "4.3" -content_hash = "sha256:80c96fd92ae5526f6bec3b05f891f499ce7277bb7724d579cab2c2b234841049" +content_hash = "sha256:dd5056a4d643010163ea7e6c0a5dba2ec187ae9a2463b61c9b27f6001b2b6150" [[package]] name = "annotated-types" @@ -1025,114 +1025,116 @@ files = [ [[package]] name = "pydantic-core" -version = "2.4.0" +version = "2.5.0" requires_python = ">=3.7" summary = "" dependencies = [ "typing-extensions!=4.7.0,>=4.6.0", ] files = [ - {file = "pydantic_core-2.4.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:2ca4687dd996bde7f3c420def450797feeb20dcee2b9687023e3323c73fc14a2"}, - {file = "pydantic_core-2.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:782fced7d61469fd1231b184a80e4f2fa7ad54cd7173834651a453f96f29d673"}, - {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6213b471b68146af97b8551294e59e7392c2117e28ffad9c557c65087f4baee3"}, - {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63797499a219d8e81eb4e0c42222d0a4c8ec896f5c76751d4258af95de41fdf1"}, - {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_24_armv7l.whl", hash = "sha256:0455876d575a35defc4da7e0a199596d6c773e20d3d42fa1fc29f6aa640369ed"}, - {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_24_ppc64le.whl", hash = "sha256:8c938c96294d983dcf419b54dba2d21056959c22911d41788efbf949a29ae30d"}, - {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_24_s390x.whl", hash = "sha256:878a5017d93e776c379af4e7b20f173c82594d94fa073059bcc546789ad50bf8"}, - {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:69159afc2f2dc43285725f16143bc5df3c853bc1cb7df6021fce7ef1c69e8171"}, - {file = "pydantic_core-2.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54df7df399b777c1fd144f541c95d351b3aa110535a6810a6a569905d106b6f3"}, - {file = "pydantic_core-2.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e412607ca89a0ced10758dfb8f9adcc365ce4c1c377e637c01989a75e9a9ec8a"}, - {file = "pydantic_core-2.4.0-cp310-none-win32.whl", hash = "sha256:853f103e2b9a58832fdd08a587a51de8b552ae90e1a5d167f316b7eabf8d7dde"}, - {file = "pydantic_core-2.4.0-cp310-none-win_amd64.whl", hash = "sha256:3ba2c9c94a9176f6321a879c8b864d7c5b12d34f549a4c216c72ce213d7d953c"}, - {file = "pydantic_core-2.4.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:a8b7acd04896e8f161e1500dc5f218017db05c1d322f054e89cbd089ce5d0071"}, - {file = "pydantic_core-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:16468bd074fa4567592d3255bf25528ed41e6b616d69bf07096bdb5b66f947d1"}, - {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cba5ad5eef02c86a1f3da00544cbc59a510d596b27566479a7cd4d91c6187a11"}, - {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7206e41e04b443016e930e01685bab7a308113c0b251b3f906942c8d4b48fcb"}, - {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_24_armv7l.whl", hash = "sha256:c1375025f0bfc9155286ebae8eecc65e33e494c90025cda69e247c3ccd2bab00"}, - {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_24_ppc64le.whl", hash = "sha256:3534118289e33130ed3f1cc487002e8d09b9f359be48b02e9cd3de58ce58fba9"}, - {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_24_s390x.whl", hash = "sha256:94d2b36a74623caab262bf95f0e365c2c058396082bd9d6a9e825657d0c1e7fa"}, - {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:af24ad4fbaa5e4a2000beae0c3b7fd1c78d7819ab90f9370a1cfd8998e3f8a3c"}, - {file = "pydantic_core-2.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bf10963d8aed8bbe0165b41797c9463d4c5c8788ae6a77c68427569be6bead41"}, - {file = "pydantic_core-2.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:68199ada7c310ddb8c76efbb606a0de656b40899388a7498954f423e03fc38be"}, - {file = "pydantic_core-2.4.0-cp311-none-win32.whl", hash = "sha256:6f855bcc96ed3dd56da7373cfcc9dcbabbc2073cac7f65c185772d08884790ce"}, - {file = "pydantic_core-2.4.0-cp311-none-win_amd64.whl", hash = "sha256:de39eb3bab93a99ddda1ac1b9aa331b944d8bcc4aa9141148f7fd8ee0299dafc"}, - {file = "pydantic_core-2.4.0-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:f773b39780323a0499b53ebd91a28ad11cde6705605d98d999dfa08624caf064"}, - {file = "pydantic_core-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a297c0d6c61963c5c3726840677b798ca5b7dfc71bc9c02b9a4af11d23236008"}, - {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:546064c55264156b973b5e65e5fafbe5e62390902ce3cf6b4005765505e8ff56"}, - {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36ba9e728588588f0196deaf6751b9222492331b5552f865a8ff120869d372e0"}, - {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_24_armv7l.whl", hash = "sha256:57a53a75010c635b3ad6499e7721eaa3b450e03f6862afe2dbef9c8f66e46ec8"}, - {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_24_ppc64le.whl", hash = "sha256:4b262bbc13022f2097c48a21adcc360a81d83dc1d854c11b94953cd46d7d3c07"}, - {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_24_s390x.whl", hash = "sha256:01947ad728f426fa07fcb26457ebf90ce29320259938414bc0edd1476e75addb"}, - {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b2799c2eaf182769889761d4fb4d78b82bc47dae833799fedbf69fc7de306faa"}, - {file = "pydantic_core-2.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a08fd490ba36d1fbb2cd5dcdcfb9f3892deb93bd53456724389135712b5fc735"}, - {file = "pydantic_core-2.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1e8a7c62d15a5c4b307271e4252d76ebb981d6251c6ecea4daf203ef0179ea4f"}, - {file = "pydantic_core-2.4.0-cp312-none-win32.whl", hash = "sha256:9206c14a67c38de7b916e486ae280017cf394fa4b1aa95cfe88621a4e1d79725"}, - {file = "pydantic_core-2.4.0-cp312-none-win_amd64.whl", hash = "sha256:884235507549a6b2d3c4113fb1877ae263109e787d9e0eb25c35982ab28d0399"}, - {file = "pydantic_core-2.4.0-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:4cbe929efa77a806e8f1a97793f2dc3ea3475ae21a9ed0f37c21320fe93f6f50"}, - {file = "pydantic_core-2.4.0-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:9137289de8fe845c246a8c3482dd0cb40338846ba683756d8f489a4bd8fddcae"}, - {file = "pydantic_core-2.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5d8e764b5646623e57575f624f8ebb8f7a9f7fd1fae682ef87869ca5fec8dcf"}, - {file = "pydantic_core-2.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fba0aff4c407d0274e43697e785bcac155ad962be57518d1c711f45e72da70f"}, - {file = "pydantic_core-2.4.0-cp37-cp37m-manylinux_2_24_armv7l.whl", hash = "sha256:30527d173e826f2f7651f91c821e337073df1555e3b5a0b7b1e2c39e26e50678"}, - {file = "pydantic_core-2.4.0-cp37-cp37m-manylinux_2_24_ppc64le.whl", hash = "sha256:bd7d1dde70ff3e09e4bc7a1cbb91a7a538add291bfd5b3e70ef1e7b45192440f"}, - {file = "pydantic_core-2.4.0-cp37-cp37m-manylinux_2_24_s390x.whl", hash = "sha256:72f1216ca8cef7b8adacd4c4c6b89c3b0c4f97503197f5284c80f36d6e4edd30"}, - {file = "pydantic_core-2.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b013c7861a7c7bfcec48fd709513fea6f9f31727e7a0a93ca0dd12e056740717"}, - {file = "pydantic_core-2.4.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:478f5f6d7e32bd4a04d102160efb2d389432ecf095fe87c555c0a6fc4adfc1a4"}, - {file = "pydantic_core-2.4.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d9610b47b5fe4aacbbba6a9cb5f12cbe864eec99dbfed5710bd32ef5dd8a5d5b"}, - {file = "pydantic_core-2.4.0-cp37-none-win32.whl", hash = "sha256:ff246c0111076c8022f9ba325c294f2cb5983403506989253e04dbae565e019b"}, - {file = "pydantic_core-2.4.0-cp37-none-win_amd64.whl", hash = "sha256:d0c2b713464a8e263a243ae7980d81ce2de5ac59a9f798a282e44350b42dc516"}, - {file = "pydantic_core-2.4.0-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:12ef6838245569fd60a179fade81ca4b90ae2fa0ef355d616f519f7bb27582db"}, - {file = "pydantic_core-2.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:49db206eb8fdc4b4f30e6e3e410584146d813c151928f94ec0db06c4f2595538"}, - {file = "pydantic_core-2.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a507d7fa44688bbac76af6521e488b3da93de155b9cba6f2c9b7833ce243d59"}, - {file = "pydantic_core-2.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffe18407a4d000c568182ce5388bbbedeb099896904e43fc14eee76cfae6dec5"}, - {file = "pydantic_core-2.4.0-cp38-cp38-manylinux_2_24_armv7l.whl", hash = "sha256:fa8e48001b39d54d97d7b380a0669fa99fc0feeb972e35a2d677ba59164a9a22"}, - {file = "pydantic_core-2.4.0-cp38-cp38-manylinux_2_24_ppc64le.whl", hash = "sha256:394f12a2671ff8c4dfa2e85be6c08be0651ad85bc1e6aa9c77c21671baaf28cd"}, - {file = "pydantic_core-2.4.0-cp38-cp38-manylinux_2_24_s390x.whl", hash = "sha256:2f9ea0355f90db2a76af530245fa42f04d98f752a1236ed7c6809ec484560d5b"}, - {file = "pydantic_core-2.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:61d4e713f467abcdd59b47665d488bb898ad3dd47ce7446522a50e0cbd8e8279"}, - {file = "pydantic_core-2.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:453862ab268f6326b01f067ed89cb3a527d34dc46f6f4eeec46a15bbc706d0da"}, - {file = "pydantic_core-2.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:56a85fa0dab1567bd0cac10f0c3837b03e8a0d939e6a8061a3a420acd97e9421"}, - {file = "pydantic_core-2.4.0-cp38-none-win32.whl", hash = "sha256:0d726108c1c0380b88b6dd4db559f0280e0ceda9e077f46ff90bc85cd4d03e77"}, - {file = "pydantic_core-2.4.0-cp38-none-win_amd64.whl", hash = "sha256:047580388644c473b934d27849f8ed8dbe45df0adb72104e78b543e13bf69762"}, - {file = "pydantic_core-2.4.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:867d3eea954bea807cabba83cfc939c889a18576d66d197c60025b15269d7cc0"}, - {file = "pydantic_core-2.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:664402ef0c238a7f8a46efb101789d5f2275600fb18114446efec83cfadb5b66"}, - {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64e8012ad60a5f0da09ed48725e6e923d1be25f2f091a640af6079f874663813"}, - {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac2b680de398f293b68183317432b3d67ab3faeba216aec18de0c395cb5e3060"}, - {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_24_armv7l.whl", hash = "sha256:8efc1be43b036c2b6bcfb1451df24ee0ddcf69c31351003daf2699ed93f5687b"}, - {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_24_ppc64le.whl", hash = "sha256:d93aedbc4614cc21b9ab0d0c4ccd7143354c1f7cffbbe96ae5216ad21d1b21b5"}, - {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_24_s390x.whl", hash = "sha256:af788b64e13d52fc3600a68b16d31fa8d8573e3ff2fc9a38f8a60b8d94d1f012"}, - {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:97c6349c81cee2e69ef59eba6e6c08c5936e6b01c2d50b9e4ac152217845ae09"}, - {file = "pydantic_core-2.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cc086ddb6dc654a15deeed1d1f2bcb1cb924ebd70df9dca738af19f64229b06c"}, - {file = "pydantic_core-2.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e953353180bec330c3b830891d260b6f8e576e2d18db3c78d314e56bb2276066"}, - {file = "pydantic_core-2.4.0-cp39-none-win32.whl", hash = "sha256:6feb4b64d11d5420e517910d60a907d08d846cacaf4e029668725cd21d16743c"}, - {file = "pydantic_core-2.4.0-cp39-none-win_amd64.whl", hash = "sha256:153a61ac4030fa019b70b31fb7986461119230d3ba0ab661c757cfea652f4332"}, - {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:3fcf529382b282a30b466bd7af05be28e22aa620e016135ac414f14e1ee6b9e1"}, - {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2edef05b63d82568b877002dc4cb5cc18f8929b59077120192df1e03e0c633f8"}, - {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da055a1b0bfa8041bb2ff586b2cb0353ed03944a3472186a02cc44a557a0e661"}, - {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:77dadc764cf7c5405e04866181c5bd94a447372a9763e473abb63d1dfe9b7387"}, - {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:a4ea23b07f29487a7bef2a869f68c7ee0e05424d81375ce3d3de829314c6b5ec"}, - {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:382f0baa044d674ad59455a5eff83d7965572b745cc72df35c52c2ce8c731d37"}, - {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:08f89697625e453421401c7f661b9d1eb4c9e4c0a12fd256eeb55b06994ac6af"}, - {file = "pydantic_core-2.4.0-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:43a405ce520b45941df9ff55d0cd09762017756a7b413bbad3a6e8178e64a2c2"}, - {file = "pydantic_core-2.4.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:584a7a818c84767af16ce8bda5d4f7fedb37d3d231fc89928a192f567e4ef685"}, - {file = "pydantic_core-2.4.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04922fea7b13cd480586fa106345fe06e43220b8327358873c22d8dfa7a711c7"}, - {file = "pydantic_core-2.4.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17156abac20a9feed10feec867fddd91a80819a485b0107fe61f09f2117fe5f3"}, - {file = "pydantic_core-2.4.0-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4e562cc63b04636cde361fd47569162f1daa94c759220ff202a8129902229114"}, - {file = "pydantic_core-2.4.0-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:90f3785146f701e053bb6b9e8f53acce2c919aca91df88bd4975be0cb926eb41"}, - {file = "pydantic_core-2.4.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:e40b1e97edd3dc127aa53d8a5e539a3d0c227d71574d3f9ac1af02d58218a122"}, - {file = "pydantic_core-2.4.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:b27f3e67f6e031f6620655741b7d0d6bebea8b25d415924b3e8bfef2dd7bd841"}, - {file = "pydantic_core-2.4.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be86c2eb12fb0f846262ace9d8f032dc6978b8cb26a058920ecb723dbcb87d05"}, - {file = "pydantic_core-2.4.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4665f7ed345012a8d2eddf4203ef145f5f56a291d010382d235b94e91813f88a"}, - {file = "pydantic_core-2.4.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:79262be5a292d1df060f29b9a7cdd66934801f987a817632d7552534a172709a"}, - {file = "pydantic_core-2.4.0-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:5fd905a69ac74eaba5041e21a1e8b1a479dab2b41c93bdcc4c1cede3c12a8d86"}, - {file = "pydantic_core-2.4.0-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:2ad538b7e07343001934417cdc8584623b4d8823c5b8b258e75ec8d327cec969"}, - {file = "pydantic_core-2.4.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:dd2429f7635ad4857b5881503f9c310be7761dc681c467a9d27787b674d1250a"}, - {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:efff8b6761a1f6e45cebd1b7a6406eb2723d2d5710ff0d1b624fe11313693989"}, - {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32a1e0352558cd7ccc014ffe818c7d87b15ec6145875e2cc5fa4bb7351a1033d"}, - {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a027f41c5008571314861744d83aff75a34cf3a07022e0be32b214a5bc93f7f1"}, - {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1927f0e15d190f11f0b8344373731e28fd774c6d676d8a6cfadc95c77214a48b"}, - {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:7aa82d483d5fb867d4fb10a138ffd57b0f1644e99f2f4f336e48790ada9ada5e"}, - {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b85778308bf945e9b33ac604e6793df9b07933108d20bdf53811bc7c2798a4af"}, - {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3ded19dcaefe2f6706d81e0db787b59095f4ad0fbadce1edffdf092294c8a23f"}, - {file = "pydantic_core-2.4.0.tar.gz", hash = "sha256:ec3473c9789cc00c7260d840c3db2c16dbfc816ca70ec87a00cddfa3e1a1cdd5"}, + {file = "pydantic_core-2.5.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:8e9a5816dd0608454fbf55e67494c7c9418e110f55c4f31c111550dba435cb42"}, + {file = "pydantic_core-2.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3df387f7bdc186e99816d8c5b128548f4f2f8b08f3e20d813d17f649954f643e"}, + {file = "pydantic_core-2.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bf31cb9563bc7958d8ce95d0dfc9c3540b730fbba2d0e07546f6ce7db845ca3"}, + {file = "pydantic_core-2.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa0e9cdd1a02e3934db730a49434d7d3fa8474b409ab9cb420dd8bad40cb02d5"}, + {file = "pydantic_core-2.5.0-cp310-cp310-manylinux_2_24_armv7l.whl", hash = "sha256:1112ace240bdf19b1ce633d1ef27687d81a45caf362c0faad48584f357a8e8d3"}, + {file = "pydantic_core-2.5.0-cp310-cp310-manylinux_2_24_ppc64le.whl", hash = "sha256:971b46b4c592d449d652e10ae25b7bfc93606998a2d1fe7e3079e13558d87560"}, + {file = "pydantic_core-2.5.0-cp310-cp310-manylinux_2_24_s390x.whl", hash = "sha256:dde9cce9cabbc367449befc997e6c85ec067d4c7f594e03799128c2310e2b008"}, + {file = "pydantic_core-2.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:38083af9002ff9fda8c9576c1e816095eb3838249607d30174e47a224d9b0a9d"}, + {file = "pydantic_core-2.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6f628e15761e8826c07bd8b36c10b052d9cbf24214f805ffc6ee59617435c212"}, + {file = "pydantic_core-2.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7914963a6de4d42062b72ad829794870a78146363616b31ec92139d237add6b3"}, + {file = "pydantic_core-2.5.0-cp310-none-win32.whl", hash = "sha256:4439cb8263ad9c80762018d516f0360ef751411a2787e77563232fd1bda08e82"}, + {file = "pydantic_core-2.5.0-cp310-none-win_amd64.whl", hash = "sha256:90cc76846975ef3910b7921c730a96a52e0fcbee0f6a1f1ab610b415ed731f88"}, + {file = "pydantic_core-2.5.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:4b38b49dac37f75b7ac07fe33f10b5cb78316fb8ceff0f2f122d7a60f4cdbee1"}, + {file = "pydantic_core-2.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:01b3c53ee1e5f2ab72cd23c8fbf803abeb322521822d722e0dbcb0717f17ee34"}, + {file = "pydantic_core-2.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67b169ddcb6e1b1bf3a05ff28c2cd734b1b201319d52b34a4bc91196d90d9a89"}, + {file = "pydantic_core-2.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:943a4cc2fa14c46544b3ba80cb918434bf68fff65843e42deed75dc6b1e38fec"}, + {file = "pydantic_core-2.5.0-cp311-cp311-manylinux_2_24_armv7l.whl", hash = "sha256:d2067edc02c34554b63beb5523044f899ad19447ac2804909bdb691a50e8c0d6"}, + {file = "pydantic_core-2.5.0-cp311-cp311-manylinux_2_24_ppc64le.whl", hash = "sha256:b7e08e5ebfe69f9763a9a5d046f34304acad7859fe43741eff4e0a0211b68b7b"}, + {file = "pydantic_core-2.5.0-cp311-cp311-manylinux_2_24_s390x.whl", hash = "sha256:0f3a6deda373e1d8441a9923ca706cf6b1ff7d1b7c6d6ceef4ba40fe79452b4b"}, + {file = "pydantic_core-2.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:50a62db6030faad97cde733518828279dd3f70df6e2e28b672105524bcdc9d5d"}, + {file = "pydantic_core-2.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:551fdfb76648fb87b33bb24296b265581c2a00a6ae59d937bbda72db5aa469f1"}, + {file = "pydantic_core-2.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b019b2d328911fb423a4f0f7d3c1819cc41a20a166c05352ee2980d8a1ea5f5"}, + {file = "pydantic_core-2.5.0-cp311-none-win32.whl", hash = "sha256:b9ab6d078f8096a6a8396ffbccb34aa24cc4082d58c1ed2a65e3bc7c9e70cf98"}, + {file = "pydantic_core-2.5.0-cp311-none-win_amd64.whl", hash = "sha256:3ac8bd24ddfab484951d0139fb7b4ed4012e4c07bf3f725a38e9ab8a53a4c39e"}, + {file = "pydantic_core-2.5.0-cp311-none-win_arm64.whl", hash = "sha256:a9e22b00c131477e50ec2c8c348c21855b4b151a04278635ed7c12b295917ccd"}, + {file = "pydantic_core-2.5.0-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:bd8abcb45436b75bf8d343314f6e73798d3de048b23bbb54c58c32019be21d62"}, + {file = "pydantic_core-2.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8ab23c49d46473938bb8c01dee6378fd1f6c49bf43b75d5537af3e8135e55488"}, + {file = "pydantic_core-2.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:830c5a3a9d544cb15100e92834e6b3a486aca4a2f18462d436bb9a6462494414"}, + {file = "pydantic_core-2.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50889cac349db83da45c238e81c09124cd50e5545448e7a167fedc0ebf763b10"}, + {file = "pydantic_core-2.5.0-cp312-cp312-manylinux_2_24_armv7l.whl", hash = "sha256:b9b215122b346126b22a8835c4ed86ccc56bca748a14b368aab7c60701c000b3"}, + {file = "pydantic_core-2.5.0-cp312-cp312-manylinux_2_24_ppc64le.whl", hash = "sha256:eedcbbebb77df9f3ff1e71d317026961bd08998af0adcca327e5701965e1c31a"}, + {file = "pydantic_core-2.5.0-cp312-cp312-manylinux_2_24_s390x.whl", hash = "sha256:3a1cbc56fe2e339a978fcfd9d07abb488b2e7ca120fd8307ac28a38558641830"}, + {file = "pydantic_core-2.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2bf9407379b57862904fc290bed3009b595b5226992c9a8cc2566f9618bac80b"}, + {file = "pydantic_core-2.5.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:cd2a85c1549872f1a9fb54dbfe9ca7dc810784ea1f96fd2dcee1620fa01b0cd3"}, + {file = "pydantic_core-2.5.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9498623c10fee26badda012d681e325e2375bafef785d8018979336656e008ac"}, + {file = "pydantic_core-2.5.0-cp312-none-win32.whl", hash = "sha256:2a59bde3f22d1a0845990f29d54a4dc666bab5f35c1d2d775e7d2cdab36957eb"}, + {file = "pydantic_core-2.5.0-cp312-none-win_amd64.whl", hash = "sha256:d49f7855fce1a6f7f2f7617355ed9e30799c0cd18fe3fe9add9a32d0738ede88"}, + {file = "pydantic_core-2.5.0-cp312-none-win_arm64.whl", hash = "sha256:eca442586f65603961ba524bb81d899d054f88deea87a96d0bf521b56e584b0e"}, + {file = "pydantic_core-2.5.0-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:5219aebe5a016bacdfeb204db76d0b6b86d9e86439263d5a3b23f61931a6d2a2"}, + {file = "pydantic_core-2.5.0-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:0290c26027808f8c80925388603b6051a89375922d680a5df44727693161289d"}, + {file = "pydantic_core-2.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b4c00748d1a0b84afec4b3399057b55519839aa83d4ed527ebe3c6c3309e8b7"}, + {file = "pydantic_core-2.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:947495b23bad203076e41acd6b0a448ece2b8373aa310535b2fbee81dbf65a8e"}, + {file = "pydantic_core-2.5.0-cp37-cp37m-manylinux_2_24_armv7l.whl", hash = "sha256:a5a5ac7e8dee8a1edcce9b8290f0c65a7b4647d5cee5460db0e00281d966ef09"}, + {file = "pydantic_core-2.5.0-cp37-cp37m-manylinux_2_24_ppc64le.whl", hash = "sha256:a3641adaad909bfc75dcd380f1e0e6777914710c4c0f4e41b33ef782e48239b3"}, + {file = "pydantic_core-2.5.0-cp37-cp37m-manylinux_2_24_s390x.whl", hash = "sha256:7bfdef66ebab71e844ed6f6fe068bf3404c8218a9c1a916fb0ae5291d7cf3ad1"}, + {file = "pydantic_core-2.5.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0212a8fd5a4dbc809da859d01ecb27c581dd9bf6c11ca750ce38c30acaff94f"}, + {file = "pydantic_core-2.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ab0f427047107d81c5df421e5cf6f8e6cb7826f2c51d5d09ac2595a8d28c6851"}, + {file = "pydantic_core-2.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2eb68f7910108be4d7db1d426786d6073eee9b5b71e031c20e1316bb057646df"}, + {file = "pydantic_core-2.5.0-cp37-none-win32.whl", hash = "sha256:b8fb1c436c612942257b8de1f5ffaba85cdb356b3c349d6a1ea17880bf253c50"}, + {file = "pydantic_core-2.5.0-cp37-none-win_amd64.whl", hash = "sha256:ada0200dbe009ea6ad8c1312c869cfa92bef7babfcec2d5a6b2947b25e3e72e3"}, + {file = "pydantic_core-2.5.0-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:e1e2729453233619f2f984a8b3ea1bd072c4b11dc98084f10968450fafe405b3"}, + {file = "pydantic_core-2.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:876517c39aaace4d86235d0bb27873e96096de7f59695661af3735f0569c7ac3"}, + {file = "pydantic_core-2.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ba6dcf59b1c8df0e60e58b47c863e534ca1255c91d287604e3af039f7529602"}, + {file = "pydantic_core-2.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b22151a6db609696a617bd0dbe65bef3b882db6371f5717560a94678f31c00c"}, + {file = "pydantic_core-2.5.0-cp38-cp38-manylinux_2_24_armv7l.whl", hash = "sha256:224a102c694003aa510ab1b922ae311999f2cffbb5be6968ba6fa549817ba702"}, + {file = "pydantic_core-2.5.0-cp38-cp38-manylinux_2_24_ppc64le.whl", hash = "sha256:8ecb4e591fdf374cd3234660132d2a540f45ddfa946998bc8f1552d7cac9a1af"}, + {file = "pydantic_core-2.5.0-cp38-cp38-manylinux_2_24_s390x.whl", hash = "sha256:f0506b3aca0a4575fbab8602d5223337b4a048c7f0babd5e7adbf4f9e9bd3737"}, + {file = "pydantic_core-2.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8370898618a1a1304e99cdc4a0cdfca0d645bb1b0cc6f1f2e80677ff6d25a1b4"}, + {file = "pydantic_core-2.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e58d45cd248ba28f93c490c3054b2978b8f0a841639399653976211bef65ad08"}, + {file = "pydantic_core-2.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:002125901a4c735d06f4d5209ba6d7c355b88b49f8dfdda49ad14bd83898dd06"}, + {file = "pydantic_core-2.5.0-cp38-none-win32.whl", hash = "sha256:30218817661d815a5062c640074ae6329c51ee53c2796cce4be78bc1b0a40a15"}, + {file = "pydantic_core-2.5.0-cp38-none-win_amd64.whl", hash = "sha256:8f4a987849e608114444b0de5facf37cfcaf98fdfe90ac84793043d16580a500"}, + {file = "pydantic_core-2.5.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:d5a8520eb7bc4431b086407ed9f4fbefc91f00704d7923fff3247906b65eb12a"}, + {file = "pydantic_core-2.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:08bcc84daa4eab2b3014145bced7137335ada522d00417a6ce3d991733dbdf5e"}, + {file = "pydantic_core-2.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:020a2f19a9b9354e9a5e482dd471e835a2389dbf604dae7725cc0eb551906286"}, + {file = "pydantic_core-2.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68ab5a4e714930b08517c28ec31760b70e6b2362e78459de4b99c932b71f2038"}, + {file = "pydantic_core-2.5.0-cp39-cp39-manylinux_2_24_armv7l.whl", hash = "sha256:69ff9699033da77aae17a9ee13c604d8591227a16902a954ed9799604f7e9496"}, + {file = "pydantic_core-2.5.0-cp39-cp39-manylinux_2_24_ppc64le.whl", hash = "sha256:900309272068ed8733f70373308b18146982ba1db2ef2b591674364d5eb7b723"}, + {file = "pydantic_core-2.5.0-cp39-cp39-manylinux_2_24_s390x.whl", hash = "sha256:56ea72c1c4d496fd37a454b6733006609736fbf075e5a99962d73527e044a69f"}, + {file = "pydantic_core-2.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7038b427994fe2fa2ed5d70f8c3fd14ead630e7d6f0a808c6ba3a2cb310fe661"}, + {file = "pydantic_core-2.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d93fc619b2886098ed3d1732434b680d4137305f14b47476c0ba7f9a31c21889"}, + {file = "pydantic_core-2.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f275d05229ec580cea7aff556036a2f3ad8df31f8d7a0a431cad579f0c7313c1"}, + {file = "pydantic_core-2.5.0-cp39-none-win32.whl", hash = "sha256:1680509a8d9e01312ae108cf653746b491e3a97bd52afab1eb5e48e8b4fc89cf"}, + {file = "pydantic_core-2.5.0-cp39-none-win_amd64.whl", hash = "sha256:872815f3d574cca652c3b4bceebc979e4d64e023f91e4d5610e13de91c6aa640"}, + {file = "pydantic_core-2.5.0-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:f48e3d4f3f9d08a8b1b0f6893f8d5ac71c5ad9d520c76eefe761128f0b90c1eb"}, + {file = "pydantic_core-2.5.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b20e4ef433e9be2aa923b3b3b9c9f89b5fa8ce164b9e1feef941632e53214f04"}, + {file = "pydantic_core-2.5.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c32cbafbe8a28b4ed6fbd20bae7e8256bfccf18d2cbe4bcb360cd4e82f39576e"}, + {file = "pydantic_core-2.5.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c7662077323f6e03ca16792a3072faea50ac38c3bac4b4b7a5041aa62addedc4"}, + {file = "pydantic_core-2.5.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:29070426a823d0351bd50728a8d7780e139ff708ddd079a7dd49babf38f5e16e"}, + {file = "pydantic_core-2.5.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d6f00c644a032397d298518f67f95cfd2ca951d7ff211d3f96cea8e82ca1e49c"}, + {file = "pydantic_core-2.5.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8b66072de046149a465a45cff45922dd38bca86384d9cc17c9a9c0fc7b0e4fab"}, + {file = "pydantic_core-2.5.0-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:bd2c38832f092e4fac25dc706069659661c63769d4acb0f130fb091e37feb3ba"}, + {file = "pydantic_core-2.5.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8fc23609b7ac2938fd20fc2b786cd87250261a1377f48c873fbc54734d7ca3d0"}, + {file = "pydantic_core-2.5.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0044cf5e20e25da4896a58089ef0cd05aaae0e5782215fa7e7930d5ff9d6404a"}, + {file = "pydantic_core-2.5.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:330216c894f224011523918cef0d7764573737afcef2e3868acc9b904cb1164e"}, + {file = "pydantic_core-2.5.0-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:6212520dba592addcaa1b8e26179065508ca0dec246ee2f8e23f3bfcf3ebd9b4"}, + {file = "pydantic_core-2.5.0-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:bb56edcf901db2a6ff024094e83fec1246223dbd1ddf2877c5d21c14e4026de0"}, + {file = "pydantic_core-2.5.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:5d8af448b4e244a1cd2c5d3bc717dd41df106d7153176767f540a4adc97106ae"}, + {file = "pydantic_core-2.5.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:091df4921153271e4adf7402dfa3c5f911e6a19202daf3cff24d5c47fa4f9f24"}, + {file = "pydantic_core-2.5.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3564e8ea902716b0aab190a799ac71345ff60bc6236b8dd19554007ffc8e3897"}, + {file = "pydantic_core-2.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc8cb2c3ee7549368963fb0f29c66ad12af1dd661ba2701447fffb54686ebc1d"}, + {file = "pydantic_core-2.5.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1fad68017370558148ce5d0cbed9316a689b774e5ef7026f5a27ce1d92e86c75"}, + {file = "pydantic_core-2.5.0-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c9bb62f038c8ccf1759da2c793ba276c8c44ce9cd2b34a6918c06c880666e3cb"}, + {file = "pydantic_core-2.5.0-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1ac24bc1de6ca15efa73757b1ba5fffd430f6e479b67733813ef8698a77ed0ad"}, + {file = "pydantic_core-2.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:27983962c34c055a334f8cd350837f4158cc17903bbd9202bc1b2e715c549e52"}, + {file = "pydantic_core-2.5.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:b154f86e0d608e4889d4d4c3b0188cca88885957fd035958325907fb93162bfe"}, + {file = "pydantic_core-2.5.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3d666d2a1114aab3138545b6de1338c4c87d52f9af342b83e05af0f667e65f0"}, + {file = "pydantic_core-2.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0d7f92c2fef5e2e550db8e3cf934fde3b16b1d751f189d4371e107b9bdd498f"}, + {file = "pydantic_core-2.5.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d99cb5aa42fb0699c4fcf6210b7ff0caabae2d805832bdf8b8b706aa90e06719"}, + {file = "pydantic_core-2.5.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d4dd43c6185df4beedc0c63decaf9b059c3dbd789f282a55989f57eaa39fb82f"}, + {file = "pydantic_core-2.5.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:240abf6580b1108e60c3a2a52f0703a8106f317da95b2b50ba15705888eaded9"}, + {file = "pydantic_core-2.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e48ccd1fef7c503ed1280edb47d57206dbdf13068e75f95dc678667e650d781"}, + {file = "pydantic_core-2.5.0.tar.gz", hash = "sha256:0b2f24ceec2ef97b4cc7beac17bc02a5262a3b0aa2c2772ca054b75878047bf5"}, ] [[package]] @@ -1141,10 +1143,10 @@ version = "2.0.0" requires_python = ">=3.7" git = "https://github.com/pydantic/pydantic-extra-types.git" ref = "main" -revision = "b7cdcc1fe8ec982cb4feb6111201462f7bc66b16" +revision = "e779d19a026429547ba6201085cf6757f130d505" summary = "Extra Pydantic types." dependencies = [ - "pydantic>=2.0b3", + "pydantic>=2.0.3", ] [[package]] diff --git a/pyproject.toml b/pyproject.toml index a22fd79507..de0081d86e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -61,7 +61,7 @@ requires-python = '>=3.7' dependencies = [ 'typing-extensions>=4.6.1', 'annotated-types>=0.4.0', - "pydantic-core==2.4.0", + "pydantic-core==2.5.0", ] dynamic = ['version', 'readme'] From 0508f3a0d77fe2d4cc624748e0925622770b7857 Mon Sep 17 00:00:00 2001 From: David Hewitt <1939362+davidhewitt@users.noreply.github.com> Date: Tue, 25 Jul 2023 20:07:18 +0100 Subject: [PATCH 2/4] use pydantic-core decimal --- docs/errors/validation_errors.md | 109 +++++++++++++ pydantic/_internal/_std_types_schema.py | 197 ++---------------------- pydantic/json_schema.py | 33 ++++ tests/test_edge_cases.py | 26 +--- tests/test_types.py | 28 ++-- 5 files changed, 172 insertions(+), 221 deletions(-) diff --git a/docs/errors/validation_errors.md b/docs/errors/validation_errors.md index 320ebb4349..ad2fd1e963 100644 --- a/docs/errors/validation_errors.md +++ b/docs/errors/validation_errors.md @@ -479,6 +479,115 @@ except ValidationError as exc: This error is also raised for strict fields when the input value is not an instance of `datetime`. +## `decimal_max_digits` + +This error is raised when the value provided for a `Decimal` has too many digits: + +```py +from decimal import Decimal + +from pydantic import BaseModel, Field, ValidationError + + +class Model(BaseModel): + x: Decimal = Field(max_digits=3) + + +try: + Model(x='42.1234') +except ValidationError as exc: + print(repr(exc.errors()[0]['type'])) + #> 'decimal_max_digits' +``` + +## `decimal_max_places` + +This error is raised when the value provided for a `Decimal` has too many digits after the decimal point: + +```py +from decimal import Decimal + +from pydantic import BaseModel, Field, ValidationError + + +class Model(BaseModel): + x: Decimal = Field(decimal_places=3) + + +try: + Model(x='42.1234') +except ValidationError as exc: + print(repr(exc.errors()[0]['type'])) + #> 'decimal_max_places' +``` + +## `decimal_parsing` + +This error is raised when the value provided for a `Decimal` could not be parsed as a decimal number: + +```py +from decimal import Decimal + +from pydantic import BaseModel, Field, ValidationError + + +class Model(BaseModel): + x: Decimal = Field(decimal_places=3) + + +try: + Model(x='test') +except ValidationError as exc: + print(repr(exc.errors()[0]['type'])) + #> 'decimal_parsing' +``` + +## `decimal_type` + +This error is raised when the value provided for a `Decimal` is of the wrong type: + +```py +from decimal import Decimal + +from pydantic import BaseModel, Field, ValidationError + + +class Model(BaseModel): + x: Decimal = Field(decimal_places=3) + + +try: + Model(x=[1, 2, 3]) +except ValidationError as exc: + print(repr(exc.errors()[0]['type'])) + #> 'decimal_type' +``` + +This error is also raised for strict fields when the input value is not an instance of `Decimal`. + +## `decimal_whole_digits` + +This error is raised when the value provided for a `Decimal` has more digits before the decimal point than `max_digits` - `decimal_places` (as long as both are specified): + +```py +from decimal import Decimal + +from pydantic import BaseModel, Field, ValidationError + + +class Model(BaseModel): + x: Decimal = Field(max_digits=6, decimal_places=3) + + +try: + Model(x='12345.6') +except ValidationError as exc: + print(repr(exc.errors()[0]['type'])) + #> 'decimal_whole_digits' +``` + +This error is also raised for strict fields when the input value is not an instance of `Decimal`. + ## `dict_type` This error is raised when the input value's type is not `dict` for a `dict` field: diff --git a/pydantic/_internal/_std_types_schema.py b/pydantic/_internal/_std_types_schema.py index 7728ef93c2..0b60b0f355 100644 --- a/pydantic/_internal/_std_types_schema.py +++ b/pydantic/_internal/_std_types_schema.py @@ -21,7 +21,6 @@ CoreSchema, MultiHostUrl, PydanticCustomError, - PydanticKnownError, PydanticOmit, Url, core_schema, @@ -137,170 +136,24 @@ def get_json_schema(_, handler: GetJsonSchemaHandler) -> JsonSchemaValue: @dataclasses.dataclass(**slots_true) -class DecimalValidator: - gt: decimal.Decimal | None = None - ge: decimal.Decimal | None = None - lt: decimal.Decimal | None = None - le: decimal.Decimal | None = None - max_digits: int | None = None - decimal_places: int | None = None - multiple_of: decimal.Decimal | None = None - allow_inf_nan: bool = False - check_digits: bool = False - strict: bool = False +class InnerSchemaValidator: + """Use a fixed CoreSchema, avoiding interference from outward annotations.""" - def __post_init__(self) -> None: - self.check_digits = self.max_digits is not None or self.decimal_places is not None - self.gt = decimal.Decimal(self.gt) if self.gt is not None else None - self.ge = decimal.Decimal(self.ge) if self.ge is not None else None - self.lt = decimal.Decimal(self.lt) if self.lt is not None else None - self.le = decimal.Decimal(self.le) if self.le is not None else None - self.multiple_of = decimal.Decimal(self.multiple_of) if self.multiple_of is not None else None - if self.check_digits and self.allow_inf_nan: - raise ValueError('allow_inf_nan=True cannot be used with max_digits or decimal_places') + core_schema: CoreSchema + js_schema: JsonSchemaValue | None = None + js_core_schema: CoreSchema | None = None + js_schema_update: JsonSchemaValue | None = None def __get_pydantic_json_schema__(self, _schema: CoreSchema, handler: GetJsonSchemaHandler) -> JsonSchemaValue: - string_schema = handler(core_schema.str_schema()) - - if handler.mode == 'validation': - float_schema = handler( - core_schema.float_schema( - allow_inf_nan=self.allow_inf_nan, - multiple_of=None if self.multiple_of is None else float(self.multiple_of), - le=None if self.le is None else float(self.le), - ge=None if self.ge is None else float(self.ge), - lt=None if self.lt is None else float(self.lt), - gt=None if self.gt is None else float(self.gt), - ) - ) - return {'anyOf': [float_schema, string_schema]} - else: - return string_schema + if self.js_schema is not None: + return self.js_schema + js_schema = handler(self.js_core_schema or self.core_schema) + if self.js_schema_update is not None: + js_schema.update(self.js_schema_update) + return js_schema def __get_pydantic_core_schema__(self, _source_type: Any, _handler: GetCoreSchemaHandler) -> CoreSchema: - Decimal = decimal.Decimal - - def to_decimal(v: str) -> decimal.Decimal: - try: - return Decimal(v) - except decimal.DecimalException as e: - raise PydanticCustomError('decimal_parsing', 'Input should be a valid decimal') from e - - primitive_schema = core_schema.union_schema( - [ - # if it's an int keep it like that and pass it straight to Decimal - # but if it's not make it a string - # we don't use JSON -> float because parsing to any float will cause - # loss of precision - core_schema.int_schema(strict=True), - core_schema.str_schema(strict=True, strip_whitespace=True), - core_schema.no_info_plain_validator_function(str), - ], - ) - json_schema = core_schema.no_info_after_validator_function(to_decimal, primitive_schema) - schema = core_schema.json_or_python_schema( - json_schema=json_schema, - python_schema=core_schema.lax_or_strict_schema( - lax_schema=core_schema.union_schema([core_schema.is_instance_schema(decimal.Decimal), json_schema]), - strict_schema=core_schema.is_instance_schema(decimal.Decimal), - ), - serialization=core_schema.to_string_ser_schema(when_used='json'), - ) - - if not self.allow_inf_nan or self.check_digits: - schema = core_schema.no_info_after_validator_function( - self.check_digits_validator, - schema, - ) - - if self.multiple_of is not None: - schema = core_schema.no_info_after_validator_function( - partial(_validators.multiple_of_validator, multiple_of=self.multiple_of), - schema, - ) - - if self.gt is not None: - schema = core_schema.no_info_after_validator_function( - partial(_validators.greater_than_validator, gt=self.gt), - schema, - ) - - if self.ge is not None: - schema = core_schema.no_info_after_validator_function( - partial(_validators.greater_than_or_equal_validator, ge=self.ge), - schema, - ) - - if self.lt is not None: - schema = core_schema.no_info_after_validator_function( - partial(_validators.less_than_validator, lt=self.lt), - schema, - ) - - if self.le is not None: - schema = core_schema.no_info_after_validator_function( - partial(_validators.less_than_or_equal_validator, le=self.le), - schema, - ) - - return schema - - def check_digits_validator(self, value: decimal.Decimal) -> decimal.Decimal: - if not value.is_finite(): - # Either check_digits is true or allow_inf_nan is False, - # either way we cannot allow nan / infinity - raise PydanticKnownError('finite_number') - - if self.check_digits: - try: - normalized_value = value.normalize() - except decimal.InvalidOperation: - normalized_value = value - _1, digit_tuple, exponent = normalized_value.as_tuple() - - # Already checked for finite value above - assert isinstance(exponent, int) - - if exponent >= 0: - # A positive exponent adds that many trailing zeros. - digits = len(digit_tuple) + exponent - decimals = 0 - else: - # If the absolute value of the negative exponent is larger than the - # number of digits, then it's the same as the number of digits, - # because it'll consume all the digits in digit_tuple and then - # add abs(exponent) - len(digit_tuple) leading zeros after the - # decimal point. - if abs(exponent) > len(digit_tuple): - digits = decimals = abs(exponent) - else: - digits = len(digit_tuple) - decimals = abs(exponent) - - if self.max_digits is not None and digits > self.max_digits: - raise PydanticCustomError( - 'decimal_max_digits', - 'ensure that there are no more than {max_digits} digits in total', - {'max_digits': self.max_digits}, - ) - - if self.decimal_places is not None and decimals > self.decimal_places: - raise PydanticCustomError( - 'decimal_max_places', - 'ensure that there are no more than {decimal_places} decimal places', - {'decimal_places': self.decimal_places}, - ) - - if self.max_digits is not None and self.decimal_places is not None: - whole_digits = digits - decimals - expected = self.max_digits - self.decimal_places - if whole_digits > expected: - raise PydanticCustomError( - 'decimal_whole_digits', - 'ensure that there are no more than {whole_digits} digits before the decimal point', - {'whole_digits': expected}, - ) - return value + return self.core_schema def decimal_prepare_pydantic_annotations( @@ -311,6 +164,7 @@ def decimal_prepare_pydantic_annotations( metadata, remaining_annotations = _known_annotated_metadata.collect_known_metadata(annotations) + # FIXME: think pydantic-core already checks the config? config_allow_inf_nan = config.get('allow_inf_nan') if config_allow_inf_nan is not None: metadata.setdefault('allow_inf_nan', config_allow_inf_nan) @@ -318,28 +172,7 @@ def decimal_prepare_pydantic_annotations( _known_annotated_metadata.check_metadata( metadata, {*_known_annotated_metadata.FLOAT_CONSTRAINTS, 'max_digits', 'decimal_places'}, decimal.Decimal ) - return source, [DecimalValidator(**metadata), *remaining_annotations] - - -@dataclasses.dataclass(**slots_true) -class InnerSchemaValidator: - """Use a fixed CoreSchema, avoiding interference from outward annotations.""" - - core_schema: CoreSchema - js_schema: JsonSchemaValue | None = None - js_core_schema: CoreSchema | None = None - js_schema_update: JsonSchemaValue | None = None - - def __get_pydantic_json_schema__(self, _schema: CoreSchema, handler: GetJsonSchemaHandler) -> JsonSchemaValue: - if self.js_schema is not None: - return self.js_schema - js_schema = handler(self.js_core_schema or self.core_schema) - if self.js_schema_update is not None: - js_schema.update(self.js_schema_update) - return js_schema - - def __get_pydantic_core_schema__(self, _source_type: Any, _handler: GetCoreSchemaHandler) -> CoreSchema: - return self.core_schema + return source, [InnerSchemaValidator(core_schema.decimal_schema(**metadata)), *remaining_annotations] def datetime_prepare_pydantic_annotations( diff --git a/pydantic/json_schema.py b/pydantic/json_schema.py index 650fca1496..26e75ae355 100644 --- a/pydantic/json_schema.py +++ b/pydantic/json_schema.py @@ -594,6 +594,39 @@ def float_schema(self, schema: core_schema.FloatSchema) -> JsonSchemaValue: json_schema = {k: v for k, v in json_schema.items() if v not in {math.inf, -math.inf}} return json_schema + def decimal_schema(self, schema: core_schema.DecimalSchema) -> JsonSchemaValue: + """Generates a JSON schema that matches a decimal value. + + Args: + schema: The core schema. + + Returns: + The generated JSON schema. + """ + json_schema = self.str_schema(core_schema.str_schema()) + if self.mode == 'validation': + multiple_of = schema.get('multiple_of') + le = schema.get('le') + ge = schema.get('ge') + lt = schema.get('lt') + gt = schema.get('gt') + json_schema = { + 'anyOf': [ + self.float_schema( + core_schema.float_schema( + allow_inf_nan=schema.get('allow_inf_nan'), + multiple_of=None if multiple_of is None else float(multiple_of), + le=None if le is None else float(le), + ge=None if ge is None else float(ge), + lt=None if lt is None else float(lt), + gt=None if gt is None else float(gt), + ) + ), + json_schema, + ], + } + return json_schema + def str_schema(self, schema: core_schema.StringSchema) -> JsonSchemaValue: """Generates a JSON schema that matches a string value. diff --git a/tests/test_edge_cases.py b/tests/test_edge_cases.py index 13ac462fd0..6dffeb9ca8 100644 --- a/tests/test_edge_cases.py +++ b/tests/test_edge_cases.py @@ -437,16 +437,9 @@ class Model(BaseModel): 'msg': 'Input should be a valid number, unable to parse string as a number', 'input': 'y', }, - { - 'type': 'is_instance_of', - 'loc': ('v', 2, 'is-instance[Decimal]'), - 'msg': 'Input should be an instance of Decimal', - 'input': 'x', - 'ctx': {'class': 'Decimal'}, - }, { 'type': 'decimal_parsing', - 'loc': ('v', 2, 'function-after[to_decimal(), union[int,constrained-str,function-plain[str()]]]'), + 'loc': ('v', 2), 'msg': 'Input should be a valid decimal', 'input': 'x', }, @@ -1233,24 +1226,9 @@ class Model(BaseModel): 'msg': 'Input should be a valid number, unable to parse string as a number', 'input': 'foobar', }, - { - 'type': 'is_instance_of', - 'loc': ( - 'a', - 'function-after[check_digits_validator(), json-or-python[json=function-after[to_decimal(), union[int,constrained-str,function-plain[str()]]],python=lax-or-strict[lax=union[is-instance[Decimal],function-after[to_decimal(), union[int,constrained-str,function-plain[str()]]]],strict=is-instance[Decimal]]]]', - 'is-instance[Decimal]', - ), - 'msg': 'Input should be an instance of Decimal', - 'input': 'foobar', - 'ctx': {'class': 'Decimal'}, - }, { 'type': 'decimal_parsing', - 'loc': ( - 'a', - 'function-after[check_digits_validator(), json-or-python[json=function-after[to_decimal(), union[int,constrained-str,function-plain[str()]]],python=lax-or-strict[lax=union[is-instance[Decimal],function-after[to_decimal(), union[int,constrained-str,function-plain[str()]]]],strict=is-instance[Decimal]]]]', - 'function-after[to_decimal(), union[int,constrained-str,function-plain[str()]]]', - ), + 'loc': ('a', 'decimal'), 'msg': 'Input should be a valid decimal', 'input': 'foobar', }, diff --git a/tests/test_types.py b/tests/test_types.py index be2683a30f..29901ad810 100644 --- a/tests/test_types.py +++ b/tests/test_types.py @@ -2894,7 +2894,7 @@ class Model(BaseModel): 'loc': ('foo',), 'msg': 'Input should be greater than 42.24', 'input': Decimal('42'), - 'ctx': {'gt': '42.24'}, + 'ctx': {'gt': Decimal('42.24')}, } ], ), @@ -2909,7 +2909,7 @@ class Model(BaseModel): 'msg': 'Input should be less than 42.24', 'input': Decimal('43'), 'ctx': { - 'lt': '42.24', + 'lt': Decimal('42.24'), }, }, ], @@ -2926,7 +2926,7 @@ class Model(BaseModel): 'msg': 'Input should be greater than or equal to 42.24', 'input': Decimal('42'), 'ctx': { - 'ge': '42.24', + 'ge': Decimal('42.24'), }, } ], @@ -2943,7 +2943,7 @@ class Model(BaseModel): 'msg': 'Input should be less than or equal to 42.24', 'input': Decimal('43'), 'ctx': { - 'le': '42.24', + 'le': Decimal('42.24'), }, } ], @@ -2956,7 +2956,7 @@ class Model(BaseModel): { 'type': 'decimal_max_places', 'loc': ('foo',), - 'msg': 'ensure that there are no more than 1 decimal places', + 'msg': 'Decimal input should have no more than 1 decimal places', 'input': Decimal('0.99'), 'ctx': { 'decimal_places': 1, @@ -2970,7 +2970,7 @@ class Model(BaseModel): [ { 'loc': ('foo',), - 'msg': 'ensure that there are no more than 2 digits before the decimal point', + 'msg': 'Decimal input should have no more than 2 digits before the decimal point', 'type': 'decimal_whole_digits', 'input': Decimal('999'), 'ctx': {'whole_digits': 2}, @@ -2988,7 +2988,7 @@ class Model(BaseModel): { 'type': 'decimal_whole_digits', 'loc': ('foo',), - 'msg': 'ensure that there are no more than 4 digits before the decimal point', + 'msg': 'Decimal input should have no more than 4 digits before the decimal point', 'input': Decimal('11111.700000'), 'ctx': {'whole_digits': 4}, } @@ -3001,7 +3001,7 @@ class Model(BaseModel): { 'type': 'decimal_max_digits', 'loc': ('foo',), - 'msg': 'ensure that there are no more than 20 digits in total', + 'msg': 'Decimal input should have no more than 20 digits in total', 'input': Decimal('7424742403889818000000'), 'ctx': { 'max_digits': 20, @@ -3017,7 +3017,7 @@ class Model(BaseModel): { 'type': 'decimal_max_places', 'loc': ('foo',), - 'msg': 'ensure that there are no more than 2 decimal places', + 'msg': 'Decimal input should have no more than 2 decimal places', 'input': Decimal('7.304'), 'ctx': {'decimal_places': 2}, } @@ -3030,7 +3030,7 @@ class Model(BaseModel): [ { 'loc': ('foo',), - 'msg': 'ensure that there are no more than 4 digits in total', + 'msg': 'Decimal input should have no more than 4 digits in total', 'type': 'decimal_max_digits', 'input': Decimal('0.00007'), 'ctx': {'max_digits': 4}, @@ -3076,9 +3076,7 @@ class Model(BaseModel): 'loc': ('foo',), 'msg': 'Input should be a multiple of 5', 'input': Decimal('42'), - 'ctx': { - 'multiple_of': Decimal('5'), - }, + 'ctx': {'multiple_of': Decimal('5')}, } ], ), @@ -3143,7 +3141,7 @@ def test_decimal_not_finite(value, result, AllowInfModel): def test_decimal_invalid(): - with pytest.raises(ValueError, match='allow_inf_nan=True cannot be used with max_digits or decimal_places'): + with pytest.raises(SchemaError, match='allow_inf_nan=True cannot be used with max_digits or decimal_places'): class Model(BaseModel): v: condecimal(allow_inf_nan=True, max_digits=4) @@ -5119,7 +5117,7 @@ class Model(BaseModel): 'loc': ('x',), 'msg': 'Input should be greater than 0', 'input': -1, - 'ctx': {'gt': '0'}, + 'ctx': {'gt': Decimal('0')}, } ] From 0f596a40cb06ddbc7fe37615a9df526fb6c9c670 Mon Sep 17 00:00:00 2001 From: David Hewitt <1939362+davidhewitt@users.noreply.github.com> Date: Thu, 10 Aug 2023 17:06:44 +0100 Subject: [PATCH 3/4] exclude some fastapi tests dependent on decimal error messages --- tests/test_fastapi.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_fastapi.sh b/tests/test_fastapi.sh index f79de5661c..ff5a0abe88 100755 --- a/tests/test_fastapi.sh +++ b/tests/test_fastapi.sh @@ -27,3 +27,5 @@ cd .. && pip install . && cd fastapi --deselect tests/test_tutorial/test_path_operation_configurations/test_tutorial005.py \ --deselect tests/test_tutorial/test_path_operation_configurations/test_tutorial005_py310.py \ --deselect tests/test_tutorial/test_path_operation_configurations/test_tutorial005_py39.py \ + --deselect tests/test_multi_body_errors.py::test_jsonable_encoder_requiring_error \ + --deselect tests/test_multi_body_errors.py::test_put_incorrect_body_multiple \ From 3811044c955952ac9810245abddb2f0f8f2b06d2 Mon Sep 17 00:00:00 2001 From: David Hewitt <1939362+davidhewitt@users.noreply.github.com> Date: Thu, 10 Aug 2023 21:16:25 +0100 Subject: [PATCH 4/4] Update pydantic/_internal/_std_types_schema.py --- pydantic/_internal/_std_types_schema.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pydantic/_internal/_std_types_schema.py b/pydantic/_internal/_std_types_schema.py index 0b60b0f355..9305e0c0a6 100644 --- a/pydantic/_internal/_std_types_schema.py +++ b/pydantic/_internal/_std_types_schema.py @@ -164,7 +164,6 @@ def decimal_prepare_pydantic_annotations( metadata, remaining_annotations = _known_annotated_metadata.collect_known_metadata(annotations) - # FIXME: think pydantic-core already checks the config? config_allow_inf_nan = config.get('allow_inf_nan') if config_allow_inf_nan is not None: metadata.setdefault('allow_inf_nan', config_allow_inf_nan)