Update to Pydantic V2 (#588)

* Pydantic V2 support

* Support Python 3.8

* Mark as classmethod

* Remove max int validation

* Run poe format

* Merge develop

* Revert dataclasses import

* Fix revert
This commit is contained in:
Nicholas Gates 2024-07-23 14:43:31 +01:00 committed by GitHub
parent 8b59234856
commit 5fdd0bb24f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 345 additions and 155 deletions

191
poetry.lock generated
View File

@ -11,6 +11,20 @@ files = [
{file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"},
] ]
[[package]]
name = "annotated-types"
version = "0.5.0"
description = "Reusable constraint types to use with typing.Annotated"
optional = false
python-versions = ">=3.7"
files = [
{file = "annotated_types-0.5.0-py3-none-any.whl", hash = "sha256:58da39888f92c276ad970249761ebea80ba544b77acddaa1a4d6cf78287d45fd"},
{file = "annotated_types-0.5.0.tar.gz", hash = "sha256:47cdc3490d9ac1506ce92c7aaa76c579dc3509ff11e098fc867e5130ab7be802"},
]
[package.dependencies]
typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.9\""}
[[package]] [[package]]
name = "ansicon" name = "ansicon"
version = "1.89.0" version = "1.89.0"
@ -1298,62 +1312,140 @@ files = [
[[package]] [[package]]
name = "pydantic" name = "pydantic"
version = "1.10.17" version = "2.5.3"
description = "Data validation and settings management using python type hints" description = "Data validation using Python type hints"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "pydantic-1.10.17-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0fa51175313cc30097660b10eec8ca55ed08bfa07acbfe02f7a42f6c242e9a4b"}, {file = "pydantic-2.5.3-py3-none-any.whl", hash = "sha256:d0caf5954bee831b6bfe7e338c32b9e30c85dfe080c843680783ac2b631673b4"},
{file = "pydantic-1.10.17-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7e8988bb16988890c985bd2093df9dd731bfb9d5e0860db054c23034fab8f7a"}, {file = "pydantic-2.5.3.tar.gz", hash = "sha256:b3ef57c62535b0941697cce638c08900d87fcb67e29cfa99e8a68f747f393f7a"},
{file = "pydantic-1.10.17-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:371dcf1831f87c9e217e2b6a0c66842879a14873114ebb9d0861ab22e3b5bb1e"},
{file = "pydantic-1.10.17-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4866a1579c0c3ca2c40575398a24d805d4db6cb353ee74df75ddeee3c657f9a7"},
{file = "pydantic-1.10.17-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:543da3c6914795b37785703ffc74ba4d660418620cc273490d42c53949eeeca6"},
{file = "pydantic-1.10.17-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7623b59876f49e61c2e283551cc3647616d2fbdc0b4d36d3d638aae8547ea681"},
{file = "pydantic-1.10.17-cp310-cp310-win_amd64.whl", hash = "sha256:409b2b36d7d7d19cd8310b97a4ce6b1755ef8bd45b9a2ec5ec2b124db0a0d8f3"},
{file = "pydantic-1.10.17-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fa43f362b46741df8f201bf3e7dff3569fa92069bcc7b4a740dea3602e27ab7a"},
{file = "pydantic-1.10.17-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2a72d2a5ff86a3075ed81ca031eac86923d44bc5d42e719d585a8eb547bf0c9b"},
{file = "pydantic-1.10.17-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4ad32aed3bf5eea5ca5decc3d1bbc3d0ec5d4fbcd72a03cdad849458decbc63"},
{file = "pydantic-1.10.17-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aeb4e741782e236ee7dc1fb11ad94dc56aabaf02d21df0e79e0c21fe07c95741"},
{file = "pydantic-1.10.17-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d2f89a719411cb234105735a520b7c077158a81e0fe1cb05a79c01fc5eb59d3c"},
{file = "pydantic-1.10.17-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db3b48d9283d80a314f7a682f7acae8422386de659fffaba454b77a083c3937d"},
{file = "pydantic-1.10.17-cp311-cp311-win_amd64.whl", hash = "sha256:9c803a5113cfab7bbb912f75faa4fc1e4acff43e452c82560349fff64f852e1b"},
{file = "pydantic-1.10.17-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:820ae12a390c9cbb26bb44913c87fa2ff431a029a785642c1ff11fed0a095fcb"},
{file = "pydantic-1.10.17-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c1e51d1af306641b7d1574d6d3307eaa10a4991542ca324f0feb134fee259815"},
{file = "pydantic-1.10.17-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e53fb834aae96e7b0dadd6e92c66e7dd9cdf08965340ed04c16813102a47fab"},
{file = "pydantic-1.10.17-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e2495309b1266e81d259a570dd199916ff34f7f51f1b549a0d37a6d9b17b4dc"},
{file = "pydantic-1.10.17-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:098ad8de840c92ea586bf8efd9e2e90c6339d33ab5c1cfbb85be66e4ecf8213f"},
{file = "pydantic-1.10.17-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:525bbef620dac93c430d5d6bdbc91bdb5521698d434adf4434a7ef6ffd5c4b7f"},
{file = "pydantic-1.10.17-cp312-cp312-win_amd64.whl", hash = "sha256:6654028d1144df451e1da69a670083c27117d493f16cf83da81e1e50edce72ad"},
{file = "pydantic-1.10.17-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c87cedb4680d1614f1d59d13fea353faf3afd41ba5c906a266f3f2e8c245d655"},
{file = "pydantic-1.10.17-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11289fa895bcbc8f18704efa1d8020bb9a86314da435348f59745473eb042e6b"},
{file = "pydantic-1.10.17-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:94833612d6fd18b57c359a127cbfd932d9150c1b72fea7c86ab58c2a77edd7c7"},
{file = "pydantic-1.10.17-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d4ecb515fa7cb0e46e163ecd9d52f9147ba57bc3633dca0e586cdb7a232db9e3"},
{file = "pydantic-1.10.17-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7017971ffa7fd7808146880aa41b266e06c1e6e12261768a28b8b41ba55c8076"},
{file = "pydantic-1.10.17-cp37-cp37m-win_amd64.whl", hash = "sha256:e840e6b2026920fc3f250ea8ebfdedf6ea7a25b77bf04c6576178e681942ae0f"},
{file = "pydantic-1.10.17-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bfbb18b616abc4df70591b8c1ff1b3eabd234ddcddb86b7cac82657ab9017e33"},
{file = "pydantic-1.10.17-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ebb249096d873593e014535ab07145498957091aa6ae92759a32d40cb9998e2e"},
{file = "pydantic-1.10.17-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8c209af63ccd7b22fba94b9024e8b7fd07feffee0001efae50dd99316b27768"},
{file = "pydantic-1.10.17-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4b40c9e13a0b61583e5599e7950490c700297b4a375b55b2b592774332798b7"},
{file = "pydantic-1.10.17-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c31d281c7485223caf6474fc2b7cf21456289dbaa31401844069b77160cab9c7"},
{file = "pydantic-1.10.17-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ae5184e99a060a5c80010a2d53c99aee76a3b0ad683d493e5f0620b5d86eeb75"},
{file = "pydantic-1.10.17-cp38-cp38-win_amd64.whl", hash = "sha256:ad1e33dc6b9787a6f0f3fd132859aa75626528b49cc1f9e429cdacb2608ad5f0"},
{file = "pydantic-1.10.17-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e17c0ee7192e54a10943f245dc79e36d9fe282418ea05b886e1c666063a7b54"},
{file = "pydantic-1.10.17-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cafb9c938f61d1b182dfc7d44a7021326547b7b9cf695db5b68ec7b590214773"},
{file = "pydantic-1.10.17-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95ef534e3c22e5abbdbdd6f66b6ea9dac3ca3e34c5c632894f8625d13d084cbe"},
{file = "pydantic-1.10.17-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62d96b8799ae3d782df7ec9615cb59fc32c32e1ed6afa1b231b0595f6516e8ab"},
{file = "pydantic-1.10.17-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ab2f976336808fd5d539fdc26eb51f9aafc1f4b638e212ef6b6f05e753c8011d"},
{file = "pydantic-1.10.17-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b8ad363330557beac73159acfbeed220d5f1bfcd6b930302a987a375e02f74fd"},
{file = "pydantic-1.10.17-cp39-cp39-win_amd64.whl", hash = "sha256:48db882e48575ce4b39659558b2f9f37c25b8d348e37a2b4e32971dd5a7d6227"},
{file = "pydantic-1.10.17-py3-none-any.whl", hash = "sha256:e41b5b973e5c64f674b3b4720286ded184dcc26a691dd55f34391c62c6934688"},
{file = "pydantic-1.10.17.tar.gz", hash = "sha256:f434160fb14b353caf634149baaf847206406471ba70e64657c1e8330277a991"},
] ]
[package.dependencies] [package.dependencies]
typing-extensions = ">=4.2.0" annotated-types = ">=0.4.0"
importlib-metadata = {version = "*", markers = "python_version == \"3.7\""}
pydantic-core = "2.14.6"
typing-extensions = ">=4.6.1"
[package.extras] [package.extras]
dotenv = ["python-dotenv (>=0.10.4)"] email = ["email-validator (>=2.0.0)"]
email = ["email-validator (>=1.0.3)"]
[[package]]
name = "pydantic-core"
version = "2.14.6"
description = ""
optional = false
python-versions = ">=3.7"
files = [
{file = "pydantic_core-2.14.6-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:72f9a942d739f09cd42fffe5dc759928217649f070056f03c70df14f5770acf9"},
{file = "pydantic_core-2.14.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6a31d98c0d69776c2576dda4b77b8e0c69ad08e8b539c25c7d0ca0dc19a50d6c"},
{file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5aa90562bc079c6c290f0512b21768967f9968e4cfea84ea4ff5af5d917016e4"},
{file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:370ffecb5316ed23b667d99ce4debe53ea664b99cc37bfa2af47bc769056d534"},
{file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f85f3843bdb1fe80e8c206fe6eed7a1caeae897e496542cee499c374a85c6e08"},
{file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9862bf828112e19685b76ca499b379338fd4c5c269d897e218b2ae8fcb80139d"},
{file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:036137b5ad0cb0004c75b579445a1efccd072387a36c7f217bb8efd1afbe5245"},
{file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:92879bce89f91f4b2416eba4429c7b5ca22c45ef4a499c39f0c5c69257522c7c"},
{file = "pydantic_core-2.14.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0c08de15d50fa190d577e8591f0329a643eeaed696d7771760295998aca6bc66"},
{file = "pydantic_core-2.14.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:36099c69f6b14fc2c49d7996cbf4f87ec4f0e66d1c74aa05228583225a07b590"},
{file = "pydantic_core-2.14.6-cp310-none-win32.whl", hash = "sha256:7be719e4d2ae6c314f72844ba9d69e38dff342bc360379f7c8537c48e23034b7"},
{file = "pydantic_core-2.14.6-cp310-none-win_amd64.whl", hash = "sha256:36fa402dcdc8ea7f1b0ddcf0df4254cc6b2e08f8cd80e7010d4c4ae6e86b2a87"},
{file = "pydantic_core-2.14.6-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:dea7fcd62915fb150cdc373212141a30037e11b761fbced340e9db3379b892d4"},
{file = "pydantic_core-2.14.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ffff855100bc066ff2cd3aa4a60bc9534661816b110f0243e59503ec2df38421"},
{file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b027c86c66b8627eb90e57aee1f526df77dc6d8b354ec498be9a757d513b92b"},
{file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:00b1087dabcee0b0ffd104f9f53d7d3eaddfaa314cdd6726143af6bc713aa27e"},
{file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:75ec284328b60a4e91010c1acade0c30584f28a1f345bc8f72fe8b9e46ec6a96"},
{file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e1f4744eea1501404b20b0ac059ff7e3f96a97d3e3f48ce27a139e053bb370b"},
{file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2602177668f89b38b9f84b7b3435d0a72511ddef45dc14446811759b82235a1"},
{file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6c8edaea3089bf908dd27da8f5d9e395c5b4dc092dbcce9b65e7156099b4b937"},
{file = "pydantic_core-2.14.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:478e9e7b360dfec451daafe286998d4a1eeaecf6d69c427b834ae771cad4b622"},
{file = "pydantic_core-2.14.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b6ca36c12a5120bad343eef193cc0122928c5c7466121da7c20f41160ba00ba2"},
{file = "pydantic_core-2.14.6-cp311-none-win32.whl", hash = "sha256:2b8719037e570639e6b665a4050add43134d80b687288ba3ade18b22bbb29dd2"},
{file = "pydantic_core-2.14.6-cp311-none-win_amd64.whl", hash = "sha256:78ee52ecc088c61cce32b2d30a826f929e1708f7b9247dc3b921aec367dc1b23"},
{file = "pydantic_core-2.14.6-cp311-none-win_arm64.whl", hash = "sha256:a19b794f8fe6569472ff77602437ec4430f9b2b9ec7a1105cfd2232f9ba355e6"},
{file = "pydantic_core-2.14.6-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:667aa2eac9cd0700af1ddb38b7b1ef246d8cf94c85637cbb03d7757ca4c3fdec"},
{file = "pydantic_core-2.14.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cdee837710ef6b56ebd20245b83799fce40b265b3b406e51e8ccc5b85b9099b7"},
{file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c5bcf3414367e29f83fd66f7de64509a8fd2368b1edf4351e862910727d3e51"},
{file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:26a92ae76f75d1915806b77cf459811e772d8f71fd1e4339c99750f0e7f6324f"},
{file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a983cca5ed1dd9a35e9e42ebf9f278d344603bfcb174ff99a5815f953925140a"},
{file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cb92f9061657287eded380d7dc455bbf115430b3aa4741bdc662d02977e7d0af"},
{file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4ace1e220b078c8e48e82c081e35002038657e4b37d403ce940fa679e57113b"},
{file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef633add81832f4b56d3b4c9408b43d530dfca29e68fb1b797dcb861a2c734cd"},
{file = "pydantic_core-2.14.6-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7e90d6cc4aad2cc1f5e16ed56e46cebf4877c62403a311af20459c15da76fd91"},
{file = "pydantic_core-2.14.6-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e8a5ac97ea521d7bde7621d86c30e86b798cdecd985723c4ed737a2aa9e77d0c"},
{file = "pydantic_core-2.14.6-cp312-none-win32.whl", hash = "sha256:f27207e8ca3e5e021e2402ba942e5b4c629718e665c81b8b306f3c8b1ddbb786"},
{file = "pydantic_core-2.14.6-cp312-none-win_amd64.whl", hash = "sha256:b3e5fe4538001bb82e2295b8d2a39356a84694c97cb73a566dc36328b9f83b40"},
{file = "pydantic_core-2.14.6-cp312-none-win_arm64.whl", hash = "sha256:64634ccf9d671c6be242a664a33c4acf12882670b09b3f163cd00a24cffbd74e"},
{file = "pydantic_core-2.14.6-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:24368e31be2c88bd69340fbfe741b405302993242ccb476c5c3ff48aeee1afe0"},
{file = "pydantic_core-2.14.6-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:e33b0834f1cf779aa839975f9d8755a7c2420510c0fa1e9fa0497de77cd35d2c"},
{file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6af4b3f52cc65f8a0bc8b1cd9676f8c21ef3e9132f21fed250f6958bd7223bed"},
{file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d15687d7d7f40333bd8266f3814c591c2e2cd263fa2116e314f60d82086e353a"},
{file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:095b707bb287bfd534044166ab767bec70a9bba3175dcdc3371782175c14e43c"},
{file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94fc0e6621e07d1e91c44e016cc0b189b48db053061cc22d6298a611de8071bb"},
{file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ce830e480f6774608dedfd4a90c42aac4a7af0a711f1b52f807130c2e434c06"},
{file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a306cdd2ad3a7d795d8e617a58c3a2ed0f76c8496fb7621b6cd514eb1532cae8"},
{file = "pydantic_core-2.14.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:2f5fa187bde8524b1e37ba894db13aadd64faa884657473b03a019f625cee9a8"},
{file = "pydantic_core-2.14.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:438027a975cc213a47c5d70672e0d29776082155cfae540c4e225716586be75e"},
{file = "pydantic_core-2.14.6-cp37-none-win32.whl", hash = "sha256:f96ae96a060a8072ceff4cfde89d261837b4294a4f28b84a28765470d502ccc6"},
{file = "pydantic_core-2.14.6-cp37-none-win_amd64.whl", hash = "sha256:e646c0e282e960345314f42f2cea5e0b5f56938c093541ea6dbf11aec2862391"},
{file = "pydantic_core-2.14.6-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:db453f2da3f59a348f514cfbfeb042393b68720787bbef2b4c6068ea362c8149"},
{file = "pydantic_core-2.14.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3860c62057acd95cc84044e758e47b18dcd8871a328ebc8ccdefd18b0d26a21b"},
{file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36026d8f99c58d7044413e1b819a67ca0e0b8ebe0f25e775e6c3d1fabb3c38fb"},
{file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8ed1af8692bd8d2a29d702f1a2e6065416d76897d726e45a1775b1444f5928a7"},
{file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:314ccc4264ce7d854941231cf71b592e30d8d368a71e50197c905874feacc8a8"},
{file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:982487f8931067a32e72d40ab6b47b1628a9c5d344be7f1a4e668fb462d2da42"},
{file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dbe357bc4ddda078f79d2a36fc1dd0494a7f2fad83a0a684465b6f24b46fe80"},
{file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2f6ffc6701a0eb28648c845f4945a194dc7ab3c651f535b81793251e1185ac3d"},
{file = "pydantic_core-2.14.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7f5025db12fc6de7bc1104d826d5aee1d172f9ba6ca936bf6474c2148ac336c1"},
{file = "pydantic_core-2.14.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dab03ed811ed1c71d700ed08bde8431cf429bbe59e423394f0f4055f1ca0ea60"},
{file = "pydantic_core-2.14.6-cp38-none-win32.whl", hash = "sha256:dfcbebdb3c4b6f739a91769aea5ed615023f3c88cb70df812849aef634c25fbe"},
{file = "pydantic_core-2.14.6-cp38-none-win_amd64.whl", hash = "sha256:99b14dbea2fdb563d8b5a57c9badfcd72083f6006caf8e126b491519c7d64ca8"},
{file = "pydantic_core-2.14.6-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:4ce8299b481bcb68e5c82002b96e411796b844d72b3e92a3fbedfe8e19813eab"},
{file = "pydantic_core-2.14.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b9a9d92f10772d2a181b5ca339dee066ab7d1c9a34ae2421b2a52556e719756f"},
{file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd9e98b408384989ea4ab60206b8e100d8687da18b5c813c11e92fd8212a98e0"},
{file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4f86f1f318e56f5cbb282fe61eb84767aee743ebe32c7c0834690ebea50c0a6b"},
{file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86ce5fcfc3accf3a07a729779d0b86c5d0309a4764c897d86c11089be61da160"},
{file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dcf1978be02153c6a31692d4fbcc2a3f1db9da36039ead23173bc256ee3b91b"},
{file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eedf97be7bc3dbc8addcef4142f4b4164066df0c6f36397ae4aaed3eb187d8ab"},
{file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d5f916acf8afbcab6bacbb376ba7dc61f845367901ecd5e328fc4d4aef2fcab0"},
{file = "pydantic_core-2.14.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8a14c192c1d724c3acbfb3f10a958c55a2638391319ce8078cb36c02283959b9"},
{file = "pydantic_core-2.14.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0348b1dc6b76041516e8a854ff95b21c55f5a411c3297d2ca52f5528e49d8411"},
{file = "pydantic_core-2.14.6-cp39-none-win32.whl", hash = "sha256:de2a0645a923ba57c5527497daf8ec5df69c6eadf869e9cd46e86349146e5975"},
{file = "pydantic_core-2.14.6-cp39-none-win_amd64.whl", hash = "sha256:aca48506a9c20f68ee61c87f2008f81f8ee99f8d7f0104bff3c47e2d148f89d9"},
{file = "pydantic_core-2.14.6-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:d5c28525c19f5bb1e09511669bb57353d22b94cf8b65f3a8d141c389a55dec95"},
{file = "pydantic_core-2.14.6-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:78d0768ee59baa3de0f4adac9e3748b4b1fffc52143caebddfd5ea2961595277"},
{file = "pydantic_core-2.14.6-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b93785eadaef932e4fe9c6e12ba67beb1b3f1e5495631419c784ab87e975670"},
{file = "pydantic_core-2.14.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a874f21f87c485310944b2b2734cd6d318765bcbb7515eead33af9641816506e"},
{file = "pydantic_core-2.14.6-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b89f4477d915ea43b4ceea6756f63f0288941b6443a2b28c69004fe07fde0d0d"},
{file = "pydantic_core-2.14.6-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:172de779e2a153d36ee690dbc49c6db568d7b33b18dc56b69a7514aecbcf380d"},
{file = "pydantic_core-2.14.6-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:dfcebb950aa7e667ec226a442722134539e77c575f6cfaa423f24371bb8d2e94"},
{file = "pydantic_core-2.14.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:55a23dcd98c858c0db44fc5c04fc7ed81c4b4d33c653a7c45ddaebf6563a2f66"},
{file = "pydantic_core-2.14.6-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:4241204e4b36ab5ae466ecec5c4c16527a054c69f99bba20f6f75232a6a534e2"},
{file = "pydantic_core-2.14.6-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e574de99d735b3fc8364cba9912c2bec2da78775eba95cbb225ef7dda6acea24"},
{file = "pydantic_core-2.14.6-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1302a54f87b5cd8528e4d6d1bf2133b6aa7c6122ff8e9dc5220fbc1e07bffebd"},
{file = "pydantic_core-2.14.6-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8e81e4b55930e5ffab4a68db1af431629cf2e4066dbdbfef65348b8ab804ea8"},
{file = "pydantic_core-2.14.6-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c99462ffc538717b3e60151dfaf91125f637e801f5ab008f81c402f1dff0cd0f"},
{file = "pydantic_core-2.14.6-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e4cf2d5829f6963a5483ec01578ee76d329eb5caf330ecd05b3edd697e7d768a"},
{file = "pydantic_core-2.14.6-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:cf10b7d58ae4a1f07fccbf4a0a956d705356fea05fb4c70608bb6fa81d103cda"},
{file = "pydantic_core-2.14.6-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:399ac0891c284fa8eb998bcfa323f2234858f5d2efca3950ae58c8f88830f145"},
{file = "pydantic_core-2.14.6-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c6a5c79b28003543db3ba67d1df336f253a87d3112dac3a51b94f7d48e4c0e1"},
{file = "pydantic_core-2.14.6-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:599c87d79cab2a6a2a9df4aefe0455e61e7d2aeede2f8577c1b7c0aec643ee8e"},
{file = "pydantic_core-2.14.6-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43e166ad47ba900f2542a80d83f9fc65fe99eb63ceec4debec160ae729824052"},
{file = "pydantic_core-2.14.6-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3a0b5db001b98e1c649dd55afa928e75aa4087e587b9524a4992316fa23c9fba"},
{file = "pydantic_core-2.14.6-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:747265448cb57a9f37572a488a57d873fd96bf51e5bb7edb52cfb37124516da4"},
{file = "pydantic_core-2.14.6-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7ebe3416785f65c28f4f9441e916bfc8a54179c8dea73c23023f7086fa601c5d"},
{file = "pydantic_core-2.14.6-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:86c963186ca5e50d5c8287b1d1c9d3f8f024cbe343d048c5bd282aec2d8641f2"},
{file = "pydantic_core-2.14.6-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:e0641b506486f0b4cd1500a2a65740243e8670a2549bb02bc4556a83af84ae03"},
{file = "pydantic_core-2.14.6-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71d72ca5eaaa8d38c8df16b7deb1a2da4f650c41b58bb142f3fb75d5ad4a611f"},
{file = "pydantic_core-2.14.6-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27e524624eace5c59af499cd97dc18bb201dc6a7a2da24bfc66ef151c69a5f2a"},
{file = "pydantic_core-2.14.6-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a3dde6cac75e0b0902778978d3b1646ca9f438654395a362cb21d9ad34b24acf"},
{file = "pydantic_core-2.14.6-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:00646784f6cd993b1e1c0e7b0fdcbccc375d539db95555477771c27555e3c556"},
{file = "pydantic_core-2.14.6-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:23598acb8ccaa3d1d875ef3b35cb6376535095e9405d91a3d57a8c7db5d29341"},
{file = "pydantic_core-2.14.6-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7f41533d7e3cf9520065f610b41ac1c76bc2161415955fbcead4981b22c7611e"},
{file = "pydantic_core-2.14.6.tar.gz", hash = "sha256:1fd0c1d395372843fba13a51c28e3bb9d59bd7aebfeb17358ffaaa1e4dbbe948"},
]
[package.dependencies]
typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0"
[[package]] [[package]]
name = "pygments" name = "pygments"
@ -1516,7 +1608,6 @@ files = [
{file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"},
{file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"},
{file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"},
{file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"},
{file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"},
{file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"},
{file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"},
@ -1945,4 +2036,4 @@ rust-codec = ["betterproto-rust-codec"]
[metadata] [metadata]
lock-version = "2.0" lock-version = "2.0"
python-versions = "^3.7" python-versions = "^3.7"
content-hash = "d4476f1e6af8e388103870e1a0488314102dd98ebd965f52c81593fe9e463ae5" content-hash = "7c52c491d83c7aeed97e15accef2e094b23dc1847c94b5f3c13e5000af8e7d5c"

View File

@ -39,7 +39,7 @@ pytest = "^6.2.5"
pytest-asyncio = "^0.12.0" pytest-asyncio = "^0.12.0"
pytest-cov = "^2.9.0" pytest-cov = "^2.9.0"
pytest-mock = "^3.1.1" pytest-mock = "^3.1.1"
pydantic = ">=1.10.16,<2" pydantic = ">=2.0,<3"
protobuf = "^4" protobuf = "^4"
cachelib = "^0.10.2" cachelib = "^0.10.2"
tomlkit = ">=0.7.0" tomlkit = ">=0.7.0"

View File

@ -1852,7 +1852,9 @@ class Message(ABC):
continue continue
set_fields = [ set_fields = [
field.name for field in field_set if values[field.name] is not None field.name
for field in field_set
if getattr(values, field.name, None) is not None
] ]
if not set_fields: if not set_fields:

View File

@ -1,9 +1,16 @@
# Generated by the protocol buffer compiler. DO NOT EDIT! # Generated by the protocol buffer compiler. DO NOT EDIT!
# sources: google/protobuf/any.proto, google/protobuf/api.proto, google/protobuf/descriptor.proto, google/protobuf/duration.proto, google/protobuf/empty.proto, google/protobuf/field_mask.proto, google/protobuf/source_context.proto, google/protobuf/struct.proto, google/protobuf/timestamp.proto, google/protobuf/type.proto, google/protobuf/wrappers.proto # sources: google/protobuf/any.proto, google/protobuf/api.proto, google/protobuf/descriptor.proto, google/protobuf/duration.proto, google/protobuf/empty.proto, google/protobuf/field_mask.proto, google/protobuf/source_context.proto, google/protobuf/struct.proto, google/protobuf/timestamp.proto, google/protobuf/type.proto, google/protobuf/wrappers.proto
# plugin: python-betterproto # plugin: python-betterproto
# This file has been @generated
import warnings import warnings
from typing import TYPE_CHECKING from typing import (
TYPE_CHECKING,
Mapping,
)
from typing_extensions import Self
from betterproto import hybridmethod
if TYPE_CHECKING: if TYPE_CHECKING:
@ -14,15 +21,13 @@ else:
from typing import ( from typing import (
Dict, Dict,
List, List,
Mapping,
Optional, Optional,
) )
from pydantic import root_validator from pydantic import model_validator
from typing_extensions import Self from pydantic.dataclasses import rebuild_dataclass
import betterproto import betterproto
from betterproto.utils import hybridmethod
class Syntax(betterproto.Enum): class Syntax(betterproto.Enum):
@ -37,6 +42,12 @@ class Syntax(betterproto.Enum):
EDITIONS = 2 EDITIONS = 2
"""Syntax `editions`.""" """Syntax `editions`."""
@classmethod
def __get_pydantic_core_schema__(cls, _source_type, _handler):
from pydantic_core import core_schema
return core_schema.int_schema(ge=0)
class FieldKind(betterproto.Enum): class FieldKind(betterproto.Enum):
"""Basic field types.""" """Basic field types."""
@ -98,6 +109,12 @@ class FieldKind(betterproto.Enum):
TYPE_SINT64 = 18 TYPE_SINT64 = 18
"""Field type sint64.""" """Field type sint64."""
@classmethod
def __get_pydantic_core_schema__(cls, _source_type, _handler):
from pydantic_core import core_schema
return core_schema.int_schema(ge=0)
class FieldCardinality(betterproto.Enum): class FieldCardinality(betterproto.Enum):
"""Whether a field is optional, required, or repeated.""" """Whether a field is optional, required, or repeated."""
@ -114,6 +131,12 @@ class FieldCardinality(betterproto.Enum):
CARDINALITY_REPEATED = 3 CARDINALITY_REPEATED = 3
"""For repeated fields.""" """For repeated fields."""
@classmethod
def __get_pydantic_core_schema__(cls, _source_type, _handler):
from pydantic_core import core_schema
return core_schema.int_schema(ge=0)
class Edition(betterproto.Enum): class Edition(betterproto.Enum):
"""The full set of known editions.""" """The full set of known editions."""
@ -155,6 +178,12 @@ class Edition(betterproto.Enum):
support a new edition. support a new edition.
""" """
@classmethod
def __get_pydantic_core_schema__(cls, _source_type, _handler):
from pydantic_core import core_schema
return core_schema.int_schema(ge=0)
class ExtensionRangeOptionsVerificationState(betterproto.Enum): class ExtensionRangeOptionsVerificationState(betterproto.Enum):
"""The verification state of the extension range.""" """The verification state of the extension range."""
@ -164,6 +193,12 @@ class ExtensionRangeOptionsVerificationState(betterproto.Enum):
UNVERIFIED = 1 UNVERIFIED = 1
@classmethod
def __get_pydantic_core_schema__(cls, _source_type, _handler):
from pydantic_core import core_schema
return core_schema.int_schema(ge=0)
class FieldDescriptorProtoType(betterproto.Enum): class FieldDescriptorProtoType(betterproto.Enum):
TYPE_DOUBLE = 1 TYPE_DOUBLE = 1
@ -210,6 +245,12 @@ class FieldDescriptorProtoType(betterproto.Enum):
TYPE_SINT32 = 17 TYPE_SINT32 = 17
TYPE_SINT64 = 18 TYPE_SINT64 = 18
@classmethod
def __get_pydantic_core_schema__(cls, _source_type, _handler):
from pydantic_core import core_schema
return core_schema.int_schema(ge=0)
class FieldDescriptorProtoLabel(betterproto.Enum): class FieldDescriptorProtoLabel(betterproto.Enum):
LABEL_OPTIONAL = 1 LABEL_OPTIONAL = 1
@ -223,6 +264,12 @@ class FieldDescriptorProtoLabel(betterproto.Enum):
can be used to get this behavior. can be used to get this behavior.
""" """
@classmethod
def __get_pydantic_core_schema__(cls, _source_type, _handler):
from pydantic_core import core_schema
return core_schema.int_schema(ge=0)
class FileOptionsOptimizeMode(betterproto.Enum): class FileOptionsOptimizeMode(betterproto.Enum):
"""Generated classes can be optimized for speed or code size.""" """Generated classes can be optimized for speed or code size."""
@ -233,6 +280,12 @@ class FileOptionsOptimizeMode(betterproto.Enum):
LITE_RUNTIME = 3 LITE_RUNTIME = 3
@classmethod
def __get_pydantic_core_schema__(cls, _source_type, _handler):
from pydantic_core import core_schema
return core_schema.int_schema(ge=0)
class FieldOptionsCType(betterproto.Enum): class FieldOptionsCType(betterproto.Enum):
STRING = 0 STRING = 0
@ -250,6 +303,12 @@ class FieldOptionsCType(betterproto.Enum):
STRING_PIECE = 2 STRING_PIECE = 2
@classmethod
def __get_pydantic_core_schema__(cls, _source_type, _handler):
from pydantic_core import core_schema
return core_schema.int_schema(ge=0)
class FieldOptionsJsType(betterproto.Enum): class FieldOptionsJsType(betterproto.Enum):
JS_NORMAL = 0 JS_NORMAL = 0
@ -261,6 +320,12 @@ class FieldOptionsJsType(betterproto.Enum):
JS_NUMBER = 2 JS_NUMBER = 2
"""Use JavaScript numbers.""" """Use JavaScript numbers."""
@classmethod
def __get_pydantic_core_schema__(cls, _source_type, _handler):
from pydantic_core import core_schema
return core_schema.int_schema(ge=0)
class FieldOptionsOptionRetention(betterproto.Enum): class FieldOptionsOptionRetention(betterproto.Enum):
""" """
@ -273,6 +338,12 @@ class FieldOptionsOptionRetention(betterproto.Enum):
RETENTION_RUNTIME = 1 RETENTION_RUNTIME = 1
RETENTION_SOURCE = 2 RETENTION_SOURCE = 2
@classmethod
def __get_pydantic_core_schema__(cls, _source_type, _handler):
from pydantic_core import core_schema
return core_schema.int_schema(ge=0)
class FieldOptionsOptionTargetType(betterproto.Enum): class FieldOptionsOptionTargetType(betterproto.Enum):
""" """
@ -293,6 +364,12 @@ class FieldOptionsOptionTargetType(betterproto.Enum):
TARGET_TYPE_SERVICE = 8 TARGET_TYPE_SERVICE = 8
TARGET_TYPE_METHOD = 9 TARGET_TYPE_METHOD = 9
@classmethod
def __get_pydantic_core_schema__(cls, _source_type, _handler):
from pydantic_core import core_schema
return core_schema.int_schema(ge=0)
class MethodOptionsIdempotencyLevel(betterproto.Enum): class MethodOptionsIdempotencyLevel(betterproto.Enum):
""" """
@ -305,6 +382,12 @@ class MethodOptionsIdempotencyLevel(betterproto.Enum):
NO_SIDE_EFFECTS = 1 NO_SIDE_EFFECTS = 1
IDEMPOTENT = 2 IDEMPOTENT = 2
@classmethod
def __get_pydantic_core_schema__(cls, _source_type, _handler):
from pydantic_core import core_schema
return core_schema.int_schema(ge=0)
class FeatureSetFieldPresence(betterproto.Enum): class FeatureSetFieldPresence(betterproto.Enum):
FIELD_PRESENCE_UNKNOWN = 0 FIELD_PRESENCE_UNKNOWN = 0
@ -312,36 +395,72 @@ class FeatureSetFieldPresence(betterproto.Enum):
IMPLICIT = 2 IMPLICIT = 2
LEGACY_REQUIRED = 3 LEGACY_REQUIRED = 3
@classmethod
def __get_pydantic_core_schema__(cls, _source_type, _handler):
from pydantic_core import core_schema
return core_schema.int_schema(ge=0)
class FeatureSetEnumType(betterproto.Enum): class FeatureSetEnumType(betterproto.Enum):
ENUM_TYPE_UNKNOWN = 0 ENUM_TYPE_UNKNOWN = 0
OPEN = 1 OPEN = 1
CLOSED = 2 CLOSED = 2
@classmethod
def __get_pydantic_core_schema__(cls, _source_type, _handler):
from pydantic_core import core_schema
return core_schema.int_schema(ge=0)
class FeatureSetRepeatedFieldEncoding(betterproto.Enum): class FeatureSetRepeatedFieldEncoding(betterproto.Enum):
REPEATED_FIELD_ENCODING_UNKNOWN = 0 REPEATED_FIELD_ENCODING_UNKNOWN = 0
PACKED = 1 PACKED = 1
EXPANDED = 2 EXPANDED = 2
@classmethod
def __get_pydantic_core_schema__(cls, _source_type, _handler):
from pydantic_core import core_schema
return core_schema.int_schema(ge=0)
class FeatureSetUtf8Validation(betterproto.Enum): class FeatureSetUtf8Validation(betterproto.Enum):
UTF8_VALIDATION_UNKNOWN = 0 UTF8_VALIDATION_UNKNOWN = 0
VERIFY = 2 VERIFY = 2
NONE = 3 NONE = 3
@classmethod
def __get_pydantic_core_schema__(cls, _source_type, _handler):
from pydantic_core import core_schema
return core_schema.int_schema(ge=0)
class FeatureSetMessageEncoding(betterproto.Enum): class FeatureSetMessageEncoding(betterproto.Enum):
MESSAGE_ENCODING_UNKNOWN = 0 MESSAGE_ENCODING_UNKNOWN = 0
LENGTH_PREFIXED = 1 LENGTH_PREFIXED = 1
DELIMITED = 2 DELIMITED = 2
@classmethod
def __get_pydantic_core_schema__(cls, _source_type, _handler):
from pydantic_core import core_schema
return core_schema.int_schema(ge=0)
class FeatureSetJsonFormat(betterproto.Enum): class FeatureSetJsonFormat(betterproto.Enum):
JSON_FORMAT_UNKNOWN = 0 JSON_FORMAT_UNKNOWN = 0
ALLOW = 1 ALLOW = 1
LEGACY_BEST_EFFORT = 2 LEGACY_BEST_EFFORT = 2
@classmethod
def __get_pydantic_core_schema__(cls, _source_type, _handler):
from pydantic_core import core_schema
return core_schema.int_schema(ge=0)
class GeneratedCodeInfoAnnotationSemantic(betterproto.Enum): class GeneratedCodeInfoAnnotationSemantic(betterproto.Enum):
""" """
@ -358,6 +477,12 @@ class GeneratedCodeInfoAnnotationSemantic(betterproto.Enum):
ALIAS = 2 ALIAS = 2
"""An alias to the element is returned.""" """An alias to the element is returned."""
@classmethod
def __get_pydantic_core_schema__(cls, _source_type, _handler):
from pydantic_core import core_schema
return core_schema.int_schema(ge=0)
class NullValue(betterproto.Enum): class NullValue(betterproto.Enum):
""" """
@ -370,6 +495,12 @@ class NullValue(betterproto.Enum):
_ = 0 _ = 0
"""Null value.""" """Null value."""
@classmethod
def __get_pydantic_core_schema__(cls, _source_type, _handler):
from pydantic_core import core_schema
return core_schema.int_schema(ge=0)
@dataclass(eq=False, repr=False) @dataclass(eq=False, repr=False)
class Any(betterproto.Message): class Any(betterproto.Message):
@ -1176,16 +1307,12 @@ class FileOptions(betterproto.Message):
java_string_check_utf8: bool = betterproto.bool_field(27) java_string_check_utf8: bool = betterproto.bool_field(27)
""" """
A proto2 file can set this to true to opt in to UTF-8 checking for Java, If set true, then the Java2 code generator will generate code that
which will throw an exception if invalid UTF-8 is parsed from the wire or throws an exception whenever an attempt is made to assign a non-UTF-8
assigned to a string field. byte sequence to a string field.
Message reflection will do the same.
TODO: clarify exactly what kinds of field types this option However, an extension field still accepts non-UTF-8 byte sequences.
applies to, and update these docs accordingly. This option has no effect on when used with the lite runtime.
Proto3 files already perform these checks. Setting the option explicitly to
false has no effect: it cannot be used to opt proto3 files out of UTF-8
checks.
""" """
optimize_for: "FileOptionsOptimizeMode" = betterproto.enum_field(9) optimize_for: "FileOptionsOptimizeMode" = betterproto.enum_field(9)
@ -1477,7 +1604,6 @@ class FieldOptions(betterproto.Message):
features: "FeatureSet" = betterproto.message_field(21) features: "FeatureSet" = betterproto.message_field(21)
"""Any features defined in the specific edition.""" """Any features defined in the specific edition."""
feature_support: "FieldOptionsFeatureSupport" = betterproto.message_field(22)
uninterpreted_option: List["UninterpretedOption"] = betterproto.message_field(999) uninterpreted_option: List["UninterpretedOption"] = betterproto.message_field(999)
"""The parser stores options it doesn't recognize here. See above.""" """The parser stores options it doesn't recognize here. See above."""
@ -1488,37 +1614,6 @@ class FieldOptionsEditionDefault(betterproto.Message):
value: str = betterproto.string_field(2) value: str = betterproto.string_field(2)
@dataclass(eq=False, repr=False)
class FieldOptionsFeatureSupport(betterproto.Message):
"""Information about the support window of a feature."""
edition_introduced: "Edition" = betterproto.enum_field(1)
"""
The edition that this feature was first available in. In editions
earlier than this one, the default assigned to EDITION_LEGACY will be
used, and proto files will not be able to override it.
"""
edition_deprecated: "Edition" = betterproto.enum_field(2)
"""
The edition this feature becomes deprecated in. Using this after this
edition may trigger warnings.
"""
deprecation_warning: str = betterproto.string_field(3)
"""
The deprecation warning text if this feature is used after the edition it
was marked deprecated in.
"""
edition_removed: "Edition" = betterproto.enum_field(4)
"""
The edition this feature is no longer available in. In editions after
this one, the last default assigned will be used, and proto files will
not be able to override it.
"""
@dataclass(eq=False, repr=False) @dataclass(eq=False, repr=False)
class OneofOptions(betterproto.Message): class OneofOptions(betterproto.Message):
features: "FeatureSet" = betterproto.message_field(1) features: "FeatureSet" = betterproto.message_field(1)
@ -1723,17 +1818,7 @@ class FeatureSetDefaultsFeatureSetEditionDefault(betterproto.Message):
""" """
edition: "Edition" = betterproto.enum_field(3) edition: "Edition" = betterproto.enum_field(3)
overridable_features: "FeatureSet" = betterproto.message_field(4)
"""Defaults of features that can be overridden in this edition."""
fixed_features: "FeatureSet" = betterproto.message_field(5)
"""Defaults of features that can't be overridden in this edition."""
features: "FeatureSet" = betterproto.message_field(2) features: "FeatureSet" = betterproto.message_field(2)
"""
TODO Deprecate and remove this field, which is just the
above two merged.
"""
@dataclass(eq=False, repr=False) @dataclass(eq=False, repr=False)
@ -2314,7 +2399,7 @@ class Value(betterproto.Message):
) )
"""Represents a repeated `Value`.""" """Represents a repeated `Value`."""
@root_validator() @model_validator(mode="after")
def check_oneof(cls, values): def check_oneof(cls, values):
return cls._validate_field_groups(values) return cls._validate_field_groups(values)
@ -2549,41 +2634,40 @@ class BytesValue(betterproto.Message):
"""The bytes value.""" """The bytes value."""
Type.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(Type) # type: ignore
Field.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(Field) # type: ignore
Enum.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(Enum) # type: ignore
EnumValue.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(EnumValue) # type: ignore
Option.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(Option) # type: ignore
Api.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(Api) # type: ignore
Method.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(Method) # type: ignore
FileDescriptorSet.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(FileDescriptorSet) # type: ignore
FileDescriptorProto.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(FileDescriptorProto) # type: ignore
DescriptorProto.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(DescriptorProto) # type: ignore
DescriptorProtoExtensionRange.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(DescriptorProtoExtensionRange) # type: ignore
ExtensionRangeOptions.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(ExtensionRangeOptions) # type: ignore
FieldDescriptorProto.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(FieldDescriptorProto) # type: ignore
OneofDescriptorProto.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(OneofDescriptorProto) # type: ignore
EnumDescriptorProto.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(EnumDescriptorProto) # type: ignore
EnumValueDescriptorProto.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(EnumValueDescriptorProto) # type: ignore
ServiceDescriptorProto.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(ServiceDescriptorProto) # type: ignore
MethodDescriptorProto.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(MethodDescriptorProto) # type: ignore
FileOptions.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(FileOptions) # type: ignore
MessageOptions.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(MessageOptions) # type: ignore
FieldOptions.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(FieldOptions) # type: ignore
FieldOptionsEditionDefault.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(FieldOptionsEditionDefault) # type: ignore
FieldOptionsFeatureSupport.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(OneofOptions) # type: ignore
OneofOptions.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(EnumOptions) # type: ignore
EnumOptions.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(EnumValueOptions) # type: ignore
EnumValueOptions.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(ServiceOptions) # type: ignore
ServiceOptions.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(MethodOptions) # type: ignore
MethodOptions.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(UninterpretedOption) # type: ignore
UninterpretedOption.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(FeatureSet) # type: ignore
FeatureSet.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(FeatureSetDefaults) # type: ignore
FeatureSetDefaults.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(FeatureSetDefaultsFeatureSetEditionDefault) # type: ignore
FeatureSetDefaultsFeatureSetEditionDefault.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(SourceCodeInfo) # type: ignore
SourceCodeInfo.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(GeneratedCodeInfo) # type: ignore
GeneratedCodeInfo.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(GeneratedCodeInfoAnnotation) # type: ignore
GeneratedCodeInfoAnnotation.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(Struct) # type: ignore
Struct.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(Value) # type: ignore
Value.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass(ListValue) # type: ignore
ListValue.__pydantic_model__.update_forward_refs() # type: ignore

View File

@ -589,7 +589,7 @@ class PydanticOneOfFieldCompiler(OneOfFieldCompiler):
@property @property
def pydantic_imports(self) -> Set[str]: def pydantic_imports(self) -> Set[str]:
return {"root_validator"} return {"model_validator"}
@dataclass @dataclass

View File

@ -15,6 +15,7 @@ if TYPE_CHECKING:
from dataclasses import dataclass from dataclasses import dataclass
else: else:
from pydantic.dataclasses import dataclass from pydantic.dataclasses import dataclass
from pydantic.dataclasses import rebuild_dataclass
{%- else -%} {%- else -%}
from dataclasses import dataclass from dataclasses import dataclass
{% endif %} {% endif %}

View File

@ -12,6 +12,13 @@ class {{ enum.py_name }}(betterproto.Enum):
{% endif %} {% endif %}
{% endfor %} {% endfor %}
{% if output_file.pydantic_dataclasses %}
@classmethod
def __get_pydantic_core_schema__(cls, _source_type, _handler):
from pydantic_core import core_schema
return core_schema.int_schema(ge=0)
{% endif %}
{% endfor %} {% endfor %}
{% endif %} {% endif %}
@ -46,7 +53,7 @@ class {{ message.py_name }}(betterproto.Message):
{% endif %} {% endif %}
{% if output_file.pydantic_dataclasses and message.has_oneof_fields %} {% if output_file.pydantic_dataclasses and message.has_oneof_fields %}
@root_validator() @model_validator(mode='after')
def check_oneof(cls, values): def check_oneof(cls, values):
return cls._validate_field_groups(values) return cls._validate_field_groups(values)
{% endif %} {% endif %}
@ -200,7 +207,7 @@ class {{ service.py_name }}Base(ServiceBase):
{% if output_file.pydantic_dataclasses %} {% if output_file.pydantic_dataclasses %}
{% for message in output_file.messages %} {% for message in output_file.messages %}
{% if message.has_message_field %} {% if message.has_message_field %}
{{ message.py_name }}.__pydantic_model__.update_forward_refs() # type: ignore rebuild_dataclass({{ message.py_name }}) # type: ignore
{% endif %} {% endif %}
{% endfor %} {% endfor %}
{% endif %} {% endif %}

View File

@ -10,10 +10,15 @@ def test_value():
def test_pydantic_no_value(): def test_pydantic_no_value():
with pytest.raises(ValueError): message = TestPyd()
TestPyd() assert not message.value, "Boolean is False by default"
def test_pydantic_value(): def test_pydantic_value():
message = Test(value=False) message = TestPyd(value=False)
assert not message.value assert not message.value
def test_pydantic_bad_value():
with pytest.raises(ValueError):
TestPyd(value=123)