From 9dcfd259065f79fe2905cd300f79383ddbfe2039 Mon Sep 17 00:00:00 2001 From: Jonathan Jin Date: Thu, 1 May 2025 13:22:05 -0700 Subject: [PATCH 01/38] Support defaults from Pydantic fields --- pdoc/doc.py | 9 +- pyproject.toml | 1 + test/test_doc.py | 28 +++++++ test/with_pydantic/__init__.py | 14 ++++ uv.lock | 149 ++++++++++++++++++++++++++++++++- 5 files changed, 199 insertions(+), 2 deletions(-) create mode 100644 test/with_pydantic/__init__.py diff --git a/pdoc/doc.py b/pdoc/doc.py index da92f812..9f605989 100644 --- a/pdoc/doc.py +++ b/pdoc/doc.py @@ -314,12 +314,19 @@ def members(self) -> dict[str, Doc]: taken_from=taken_from, ) else: + try: + default_value = self._member_objects["__pydantic_fields__"][ + name + ].default + except KeyError: + default_value = obj + doc = Variable( self.modulename, qualname, docstring="", annotation=self._var_annotations.get(name, empty), - default_value=obj, + default_value=default_value, taken_from=taken_from, ) if self._var_docstrings.get(name): diff --git a/pyproject.toml b/pyproject.toml index f7a2552c..6834350f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -51,6 +51,7 @@ dev-dependencies = [ "pytest-timeout>=2.3.1", "hypothesis>=6.113.0", "pdoc-pyo3-sample-library>=1.0.11", + "pydantic>=2.11.4", ] [build-system] diff --git a/test/test_doc.py b/test/test_doc.py index 3fcf96d4..e62a62bc 100644 --- a/test/test_doc.py +++ b/test/test_doc.py @@ -134,6 +134,34 @@ class Foo(metaclass=FooMeta): assert x.docstring == "" +@pytest.mark.parametrize( + "member, defaults", + [ + ( + "Foo", + { + "a": "1", + "b": "2", + }, + ), + ( + "PydanticStyleDataclass", + { + "a": "1", + }, + ), + ], +) +def test_with_pydantic(member, defaults): + m = Module.from_name("test.with_pydantic") + assert "Foo" in m.members + + cls: Class = m.members[member] + + for k, v in defaults.items(): + assert cls.members[k].default_value_str == v + + def test_raising_submodules(): f = here / "syntax_err" / "syntax_err.py" f.write_bytes(b"class") diff --git a/test/with_pydantic/__init__.py b/test/with_pydantic/__init__.py new file mode 100644 index 00000000..8b7d8b3a --- /dev/null +++ b/test/with_pydantic/__init__.py @@ -0,0 +1,14 @@ +import pydantic +from pydantic.dataclasses import dataclass + + +class Foo(pydantic.BaseModel): + a: int = pydantic.Field(default=1, description="Docstring for a") + + b: int = 2 + """Docstring for b.""" + + +@dataclass +class PydanticStyleDataclass: + a: int = 1 diff --git a/uv.lock b/uv.lock index 1c5525b4..5118f28c 100644 --- a/uv.lock +++ b/uv.lock @@ -1,6 +1,15 @@ version = 1 requires-python = ">=3.9" +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, +] + [[package]] name = "attrs" version = "25.3.0" @@ -306,7 +315,7 @@ wheels = [ [[package]] name = "pdoc" -version = "15.0.1" +version = "15.0.3" source = { editable = "." } dependencies = [ { name = "jinja2" }, @@ -319,6 +328,7 @@ dev = [ { name = "hypothesis" }, { name = "mypy" }, { name = "pdoc-pyo3-sample-library" }, + { name = "pydantic" }, { name = "pytest" }, { name = "pytest-cov" }, { name = "pytest-timeout" }, @@ -340,6 +350,7 @@ dev = [ { name = "hypothesis", specifier = ">=6.113.0" }, { name = "mypy", specifier = ">=1.11.2" }, { name = "pdoc-pyo3-sample-library", specifier = ">=1.0.11" }, + { name = "pydantic", specifier = ">=2.11.4" }, { name = "pytest", specifier = ">=8.3.3" }, { name = "pytest-cov", specifier = ">=5.0.0" }, { name = "pytest-timeout", specifier = ">=2.3.1" }, @@ -378,6 +389,130 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 }, ] +[[package]] +name = "pydantic" +version = "2.11.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/77/ab/5250d56ad03884ab5efd07f734203943c8a8ab40d551e208af81d0257bf2/pydantic-2.11.4.tar.gz", hash = "sha256:32738d19d63a226a52eed76645a98ee07c1f410ee41d93b4afbfa85ed8111c2d", size = 786540 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/12/46b65f3534d099349e38ef6ec98b1a5a81f42536d17e0ba382c28c67ba67/pydantic-2.11.4-py3-none-any.whl", hash = "sha256:d9615eaa9ac5a063471da949c8fc16376a84afb5024688b3ff885693506764eb", size = 443900 }, +] + +[[package]] +name = "pydantic-core" +version = "2.33.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/92/b31726561b5dae176c2d2c2dc43a9c5bfba5d32f96f8b4c0a600dd492447/pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8", size = 2028817 }, + { url = "https://files.pythonhosted.org/packages/a3/44/3f0b95fafdaca04a483c4e685fe437c6891001bf3ce8b2fded82b9ea3aa1/pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d", size = 1861357 }, + { url = "https://files.pythonhosted.org/packages/30/97/e8f13b55766234caae05372826e8e4b3b96e7b248be3157f53237682e43c/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d", size = 1898011 }, + { url = "https://files.pythonhosted.org/packages/9b/a3/99c48cf7bafc991cc3ee66fd544c0aae8dc907b752f1dad2d79b1b5a471f/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572", size = 1982730 }, + { url = "https://files.pythonhosted.org/packages/de/8e/a5b882ec4307010a840fb8b58bd9bf65d1840c92eae7534c7441709bf54b/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02", size = 2136178 }, + { url = "https://files.pythonhosted.org/packages/e4/bb/71e35fc3ed05af6834e890edb75968e2802fe98778971ab5cba20a162315/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b", size = 2736462 }, + { url = "https://files.pythonhosted.org/packages/31/0d/c8f7593e6bc7066289bbc366f2235701dcbebcd1ff0ef8e64f6f239fb47d/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2", size = 2005652 }, + { url = "https://files.pythonhosted.org/packages/d2/7a/996d8bd75f3eda405e3dd219ff5ff0a283cd8e34add39d8ef9157e722867/pydantic_core-2.33.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a", size = 2113306 }, + { url = "https://files.pythonhosted.org/packages/ff/84/daf2a6fb2db40ffda6578a7e8c5a6e9c8affb251a05c233ae37098118788/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac", size = 2073720 }, + { url = "https://files.pythonhosted.org/packages/77/fb/2258da019f4825128445ae79456a5499c032b55849dbd5bed78c95ccf163/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a", size = 2244915 }, + { url = "https://files.pythonhosted.org/packages/d8/7a/925ff73756031289468326e355b6fa8316960d0d65f8b5d6b3a3e7866de7/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b", size = 2241884 }, + { url = "https://files.pythonhosted.org/packages/0b/b0/249ee6d2646f1cdadcb813805fe76265745c4010cf20a8eba7b0e639d9b2/pydantic_core-2.33.2-cp310-cp310-win32.whl", hash = "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22", size = 1910496 }, + { url = "https://files.pythonhosted.org/packages/66/ff/172ba8f12a42d4b552917aa65d1f2328990d3ccfc01d5b7c943ec084299f/pydantic_core-2.33.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640", size = 1955019 }, + { url = "https://files.pythonhosted.org/packages/3f/8d/71db63483d518cbbf290261a1fc2839d17ff89fce7089e08cad07ccfce67/pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7", size = 2028584 }, + { url = "https://files.pythonhosted.org/packages/24/2f/3cfa7244ae292dd850989f328722d2aef313f74ffc471184dc509e1e4e5a/pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246", size = 1855071 }, + { url = "https://files.pythonhosted.org/packages/b3/d3/4ae42d33f5e3f50dd467761304be2fa0a9417fbf09735bc2cce003480f2a/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f", size = 1897823 }, + { url = "https://files.pythonhosted.org/packages/f4/f3/aa5976e8352b7695ff808599794b1fba2a9ae2ee954a3426855935799488/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc", size = 1983792 }, + { url = "https://files.pythonhosted.org/packages/d5/7a/cda9b5a23c552037717f2b2a5257e9b2bfe45e687386df9591eff7b46d28/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de", size = 2136338 }, + { url = "https://files.pythonhosted.org/packages/2b/9f/b8f9ec8dd1417eb9da784e91e1667d58a2a4a7b7b34cf4af765ef663a7e5/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a", size = 2730998 }, + { url = "https://files.pythonhosted.org/packages/47/bc/cd720e078576bdb8255d5032c5d63ee5c0bf4b7173dd955185a1d658c456/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef", size = 2003200 }, + { url = "https://files.pythonhosted.org/packages/ca/22/3602b895ee2cd29d11a2b349372446ae9727c32e78a94b3d588a40fdf187/pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e", size = 2113890 }, + { url = "https://files.pythonhosted.org/packages/ff/e6/e3c5908c03cf00d629eb38393a98fccc38ee0ce8ecce32f69fc7d7b558a7/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d", size = 2073359 }, + { url = "https://files.pythonhosted.org/packages/12/e7/6a36a07c59ebefc8777d1ffdaf5ae71b06b21952582e4b07eba88a421c79/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30", size = 2245883 }, + { url = "https://files.pythonhosted.org/packages/16/3f/59b3187aaa6cc0c1e6616e8045b284de2b6a87b027cce2ffcea073adf1d2/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf", size = 2241074 }, + { url = "https://files.pythonhosted.org/packages/e0/ed/55532bb88f674d5d8f67ab121a2a13c385df382de2a1677f30ad385f7438/pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51", size = 1910538 }, + { url = "https://files.pythonhosted.org/packages/fe/1b/25b7cccd4519c0b23c2dd636ad39d381abf113085ce4f7bec2b0dc755eb1/pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab", size = 1952909 }, + { url = "https://files.pythonhosted.org/packages/49/a9/d809358e49126438055884c4366a1f6227f0f84f635a9014e2deb9b9de54/pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65", size = 1897786 }, + { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000 }, + { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996 }, + { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957 }, + { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199 }, + { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296 }, + { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109 }, + { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028 }, + { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044 }, + { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881 }, + { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034 }, + { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187 }, + { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628 }, + { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866 }, + { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894 }, + { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688 }, + { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808 }, + { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580 }, + { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859 }, + { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810 }, + { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498 }, + { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611 }, + { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924 }, + { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196 }, + { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389 }, + { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223 }, + { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473 }, + { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269 }, + { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921 }, + { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162 }, + { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560 }, + { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777 }, + { url = "https://files.pythonhosted.org/packages/53/ea/bbe9095cdd771987d13c82d104a9c8559ae9aec1e29f139e286fd2e9256e/pydantic_core-2.33.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a2b911a5b90e0374d03813674bf0a5fbbb7741570dcd4b4e85a2e48d17def29d", size = 2028677 }, + { url = "https://files.pythonhosted.org/packages/49/1d/4ac5ed228078737d457a609013e8f7edc64adc37b91d619ea965758369e5/pydantic_core-2.33.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6fa6dfc3e4d1f734a34710f391ae822e0a8eb8559a85c6979e14e65ee6ba2954", size = 1864735 }, + { url = "https://files.pythonhosted.org/packages/23/9a/2e70d6388d7cda488ae38f57bc2f7b03ee442fbcf0d75d848304ac7e405b/pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c54c939ee22dc8e2d545da79fc5381f1c020d6d3141d3bd747eab59164dc89fb", size = 1898467 }, + { url = "https://files.pythonhosted.org/packages/ff/2e/1568934feb43370c1ffb78a77f0baaa5a8b6897513e7a91051af707ffdc4/pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53a57d2ed685940a504248187d5685e49eb5eef0f696853647bf37c418c538f7", size = 1983041 }, + { url = "https://files.pythonhosted.org/packages/01/1a/1a1118f38ab64eac2f6269eb8c120ab915be30e387bb561e3af904b12499/pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09fb9dd6571aacd023fe6aaca316bd01cf60ab27240d7eb39ebd66a3a15293b4", size = 2136503 }, + { url = "https://files.pythonhosted.org/packages/5c/da/44754d1d7ae0f22d6d3ce6c6b1486fc07ac2c524ed8f6eca636e2e1ee49b/pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e6116757f7959a712db11f3e9c0a99ade00a5bbedae83cb801985aa154f071b", size = 2736079 }, + { url = "https://files.pythonhosted.org/packages/4d/98/f43cd89172220ec5aa86654967b22d862146bc4d736b1350b4c41e7c9c03/pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d55ab81c57b8ff8548c3e4947f119551253f4e3787a7bbc0b6b3ca47498a9d3", size = 2006508 }, + { url = "https://files.pythonhosted.org/packages/2b/cc/f77e8e242171d2158309f830f7d5d07e0531b756106f36bc18712dc439df/pydantic_core-2.33.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c20c462aa4434b33a2661701b861604913f912254e441ab8d78d30485736115a", size = 2113693 }, + { url = "https://files.pythonhosted.org/packages/54/7a/7be6a7bd43e0a47c147ba7fbf124fe8aaf1200bc587da925509641113b2d/pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44857c3227d3fb5e753d5fe4a3420d6376fa594b07b621e220cd93703fe21782", size = 2074224 }, + { url = "https://files.pythonhosted.org/packages/2a/07/31cf8fadffbb03be1cb520850e00a8490c0927ec456e8293cafda0726184/pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:eb9b459ca4df0e5c87deb59d37377461a538852765293f9e6ee834f0435a93b9", size = 2245403 }, + { url = "https://files.pythonhosted.org/packages/b6/8d/bbaf4c6721b668d44f01861f297eb01c9b35f612f6b8e14173cb204e6240/pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9fcd347d2cc5c23b06de6d3b7b8275be558a0c90549495c699e379a80bf8379e", size = 2242331 }, + { url = "https://files.pythonhosted.org/packages/bb/93/3cc157026bca8f5006250e74515119fcaa6d6858aceee8f67ab6dc548c16/pydantic_core-2.33.2-cp39-cp39-win32.whl", hash = "sha256:83aa99b1285bc8f038941ddf598501a86f1536789740991d7d8756e34f1e74d9", size = 1910571 }, + { url = "https://files.pythonhosted.org/packages/5b/90/7edc3b2a0d9f0dda8806c04e511a67b0b7a41d2187e2003673a996fb4310/pydantic_core-2.33.2-cp39-cp39-win_amd64.whl", hash = "sha256:f481959862f57f29601ccced557cc2e817bce7533ab8e01a797a48b49c9692b3", size = 1956504 }, + { url = "https://files.pythonhosted.org/packages/30/68/373d55e58b7e83ce371691f6eaa7175e3a24b956c44628eb25d7da007917/pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa", size = 2023982 }, + { url = "https://files.pythonhosted.org/packages/a4/16/145f54ac08c96a63d8ed6442f9dec17b2773d19920b627b18d4f10a061ea/pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29", size = 1858412 }, + { url = "https://files.pythonhosted.org/packages/41/b1/c6dc6c3e2de4516c0bb2c46f6a373b91b5660312342a0cf5826e38ad82fa/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d", size = 1892749 }, + { url = "https://files.pythonhosted.org/packages/12/73/8cd57e20afba760b21b742106f9dbdfa6697f1570b189c7457a1af4cd8a0/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e", size = 2067527 }, + { url = "https://files.pythonhosted.org/packages/e3/d5/0bb5d988cc019b3cba4a78f2d4b3854427fc47ee8ec8e9eaabf787da239c/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c", size = 2108225 }, + { url = "https://files.pythonhosted.org/packages/f1/c5/00c02d1571913d496aabf146106ad8239dc132485ee22efe08085084ff7c/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec", size = 2069490 }, + { url = "https://files.pythonhosted.org/packages/22/a8/dccc38768274d3ed3a59b5d06f59ccb845778687652daa71df0cab4040d7/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052", size = 2237525 }, + { url = "https://files.pythonhosted.org/packages/d4/e7/4f98c0b125dda7cf7ccd14ba936218397b44f50a56dd8c16a3091df116c3/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c", size = 2238446 }, + { url = "https://files.pythonhosted.org/packages/ce/91/2ec36480fdb0b783cd9ef6795753c1dea13882f2e68e73bce76ae8c21e6a/pydantic_core-2.33.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808", size = 2066678 }, + { url = "https://files.pythonhosted.org/packages/7b/27/d4ae6487d73948d6f20dddcd94be4ea43e74349b56eba82e9bdee2d7494c/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8", size = 2025200 }, + { url = "https://files.pythonhosted.org/packages/f1/b8/b3cb95375f05d33801024079b9392a5ab45267a63400bf1866e7ce0f0de4/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593", size = 1859123 }, + { url = "https://files.pythonhosted.org/packages/05/bc/0d0b5adeda59a261cd30a1235a445bf55c7e46ae44aea28f7bd6ed46e091/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612", size = 1892852 }, + { url = "https://files.pythonhosted.org/packages/3e/11/d37bdebbda2e449cb3f519f6ce950927b56d62f0b84fd9cb9e372a26a3d5/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7", size = 2067484 }, + { url = "https://files.pythonhosted.org/packages/8c/55/1f95f0a05ce72ecb02a8a8a1c3be0579bbc29b1d5ab68f1378b7bebc5057/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e", size = 2108896 }, + { url = "https://files.pythonhosted.org/packages/53/89/2b2de6c81fa131f423246a9109d7b2a375e83968ad0800d6e57d0574629b/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8", size = 2069475 }, + { url = "https://files.pythonhosted.org/packages/b8/e9/1f7efbe20d0b2b10f6718944b5d8ece9152390904f29a78e68d4e7961159/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf", size = 2239013 }, + { url = "https://files.pythonhosted.org/packages/3c/b2/5309c905a93811524a49b4e031e9851a6b00ff0fb668794472ea7746b448/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb", size = 2238715 }, + { url = "https://files.pythonhosted.org/packages/32/56/8a7ca5d2cd2cda1d245d34b1c9a942920a718082ae8e54e5f3e5a58b7add/pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", size = 2066757 }, + { url = "https://files.pythonhosted.org/packages/08/98/dbf3fdfabaf81cda5622154fda78ea9965ac467e3239078e0dcd6df159e7/pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:87acbfcf8e90ca885206e98359d7dca4bcbb35abdc0ff66672a293e1d7a19101", size = 2024034 }, + { url = "https://files.pythonhosted.org/packages/8d/99/7810aa9256e7f2ccd492590f86b79d370df1e9292f1f80b000b6a75bd2fb/pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f92c15cd1e97d4b12acd1cc9004fa092578acfa57b67ad5e43a197175d01a64", size = 1858578 }, + { url = "https://files.pythonhosted.org/packages/d8/60/bc06fa9027c7006cc6dd21e48dbf39076dc39d9abbaf718a1604973a9670/pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3f26877a748dc4251cfcfda9dfb5f13fcb034f5308388066bcfe9031b63ae7d", size = 1892858 }, + { url = "https://files.pythonhosted.org/packages/f2/40/9d03997d9518816c68b4dfccb88969756b9146031b61cd37f781c74c9b6a/pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac89aea9af8cd672fa7b510e7b8c33b0bba9a43186680550ccf23020f32d535", size = 2068498 }, + { url = "https://files.pythonhosted.org/packages/d8/62/d490198d05d2d86672dc269f52579cad7261ced64c2df213d5c16e0aecb1/pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:970919794d126ba8645f3837ab6046fb4e72bbc057b3709144066204c19a455d", size = 2108428 }, + { url = "https://files.pythonhosted.org/packages/9a/ec/4cd215534fd10b8549015f12ea650a1a973da20ce46430b68fc3185573e8/pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3eb3fe62804e8f859c49ed20a8451342de53ed764150cb14ca71357c765dc2a6", size = 2069854 }, + { url = "https://files.pythonhosted.org/packages/1a/1a/abbd63d47e1d9b0d632fee6bb15785d0889c8a6e0a6c3b5a8e28ac1ec5d2/pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:3abcd9392a36025e3bd55f9bd38d908bd17962cc49bc6da8e7e96285336e2bca", size = 2237859 }, + { url = "https://files.pythonhosted.org/packages/80/1c/fa883643429908b1c90598fd2642af8839efd1d835b65af1f75fba4d94fe/pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:3a1c81334778f9e3af2f8aeb7a960736e5cab1dfebfb26aabca09afd2906c039", size = 2239059 }, + { url = "https://files.pythonhosted.org/packages/d4/29/3cade8a924a61f60ccfa10842f75eb12787e1440e2b8660ceffeb26685e7/pydantic_core-2.33.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2807668ba86cb38c6817ad9bc66215ab8584d1d304030ce4f0887336f28a5e27", size = 2066661 }, +] + [[package]] name = "pygments" version = "2.19.1" @@ -582,6 +717,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, ] +[[package]] +name = "typing-inspection" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125 }, +] + [[package]] name = "uv" version = "0.6.7" From 991910c69cc78ea0dd8ec8918646797ab94c7802 Mon Sep 17 00:00:00 2001 From: Jonathan Jin Date: Fri, 2 May 2025 06:48:42 -0700 Subject: [PATCH 02/38] gate specifically on pydantic --- pdoc/doc.py | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/pdoc/doc.py b/pdoc/doc.py index 9f605989..bea93e9d 100644 --- a/pdoc/doc.py +++ b/pdoc/doc.py @@ -57,6 +57,15 @@ from pdoc.doc_types import resolve_annotations from pdoc.doc_types import safe_eval_type +_PYDANTIC_ENABLED: bool + +try: + import pydantic +except ImportError: + _PYDANTIC_ENABLED = False +finally: + _PYDANTIC_ENABLED = True + def _include_fullname_in_traceback(f): """ @@ -314,12 +323,20 @@ def members(self) -> dict[str, Doc]: taken_from=taken_from, ) else: - try: - default_value = self._member_objects["__pydantic_fields__"][ - name - ].default - except KeyError: - default_value = obj + default_value = obj + + if ( + _PYDANTIC_ENABLED + and isinstance(self.obj, type) + and issubclass(self.obj, pydantic.BaseModel) + ): + pydantic_fields = self.obj.__pydantic_fields__ + + default_value = ( + pydantic_fields[name].default + if name in pydantic_fields + else obj + ) doc = Variable( self.modulename, From b0778913844b0e16233dd70314df6c4a0d1d0777 Mon Sep 17 00:00:00 2001 From: Jonathan Jin Date: Fri, 2 May 2025 07:25:13 -0700 Subject: [PATCH 03/38] do not include importerror block in test coverage --- pdoc/doc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdoc/doc.py b/pdoc/doc.py index bea93e9d..20526b39 100644 --- a/pdoc/doc.py +++ b/pdoc/doc.py @@ -59,7 +59,7 @@ _PYDANTIC_ENABLED: bool -try: +try: # pragma: no cover import pydantic except ImportError: _PYDANTIC_ENABLED = False From 19efc294581f0028bbc6ec59322179df1fbb651f Mon Sep 17 00:00:00 2001 From: Jonathan Jin Date: Fri, 2 May 2025 07:27:08 -0700 Subject: [PATCH 04/38] extend pragma no cover --- pdoc/doc.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pdoc/doc.py b/pdoc/doc.py index 20526b39..bdd3f11f 100644 --- a/pdoc/doc.py +++ b/pdoc/doc.py @@ -61,9 +61,9 @@ try: # pragma: no cover import pydantic -except ImportError: +except ImportError: # pragma: no cover _PYDANTIC_ENABLED = False -finally: +finally: # pragma: no cover _PYDANTIC_ENABLED = True From 7a32d2bc6525d0212d168e33bc7c1d1185e99af7 Mon Sep 17 00:00:00 2001 From: Jonathan Jin Date: Fri, 2 May 2025 10:23:51 -0700 Subject: [PATCH 05/38] WIP: Convert to snapshot test --- test/test_doc.py | 28 ---------- test/test_snapshot.py | 1 + test/testdata/with_pydantic.html | 54 +++++++++++++++++++ .../__init__.py => testdata/with_pydantic.py} | 9 ++-- test/testdata/with_pydantic.txt | 1 + 5 files changed, 60 insertions(+), 33 deletions(-) create mode 100644 test/testdata/with_pydantic.html rename test/{with_pydantic/__init__.py => testdata/with_pydantic.py} (78%) create mode 100644 test/testdata/with_pydantic.txt diff --git a/test/test_doc.py b/test/test_doc.py index e62a62bc..3fcf96d4 100644 --- a/test/test_doc.py +++ b/test/test_doc.py @@ -134,34 +134,6 @@ class Foo(metaclass=FooMeta): assert x.docstring == "" -@pytest.mark.parametrize( - "member, defaults", - [ - ( - "Foo", - { - "a": "1", - "b": "2", - }, - ), - ( - "PydanticStyleDataclass", - { - "a": "1", - }, - ), - ], -) -def test_with_pydantic(member, defaults): - m = Module.from_name("test.with_pydantic") - assert "Foo" in m.members - - cls: Class = m.members[member] - - for k, v in defaults.items(): - assert cls.members[k].default_value_str == v - - def test_raising_submodules(): f = here / "syntax_err" / "syntax_err.py" f.write_bytes(b"class") diff --git a/test/test_snapshot.py b/test/test_snapshot.py index ed4cadd5..991fd609 100755 --- a/test/test_snapshot.py +++ b/test/test_snapshot.py @@ -166,6 +166,7 @@ def outfile(self, format: str) -> Path: "include_undocumented": False, }, ), + Snapshot("with_pydantic"), ] diff --git a/test/testdata/with_pydantic.html b/test/testdata/with_pydantic.html new file mode 100644 index 00000000..04a858a6 --- /dev/null +++ b/test/testdata/with_pydantic.html @@ -0,0 +1,54 @@ + + + + + + + with_pydantic API documentation + + + + + + + + + +
+
+

+with_pydantic

+ +

A small example with Pydantic entities.

+
+ + + + + +
1"""
+2A small example with Pydantic entities.
+3"""
+
+ + +
+
+ + \ No newline at end of file diff --git a/test/with_pydantic/__init__.py b/test/testdata/with_pydantic.py similarity index 78% rename from test/with_pydantic/__init__.py rename to test/testdata/with_pydantic.py index 8b7d8b3a..b1d763f3 100644 --- a/test/with_pydantic/__init__.py +++ b/test/testdata/with_pydantic.py @@ -1,3 +1,7 @@ +""" +A small example with Pydantic entities. +""" + import pydantic from pydantic.dataclasses import dataclass @@ -7,8 +11,3 @@ class Foo(pydantic.BaseModel): b: int = 2 """Docstring for b.""" - - -@dataclass -class PydanticStyleDataclass: - a: int = 1 diff --git a/test/testdata/with_pydantic.txt b/test/testdata/with_pydantic.txt new file mode 100644 index 00000000..cbcc12eb --- /dev/null +++ b/test/testdata/with_pydantic.txt @@ -0,0 +1 @@ + \ No newline at end of file From a413dd9e1700abc8148b4ed9501ada3ed9371274 Mon Sep 17 00:00:00 2001 From: Jonathan Jin Date: Fri, 2 May 2025 10:42:35 -0700 Subject: [PATCH 06/38] remove dataclass import --- test/testdata/with_pydantic.py | 1 - 1 file changed, 1 deletion(-) diff --git a/test/testdata/with_pydantic.py b/test/testdata/with_pydantic.py index b1d763f3..7130a045 100644 --- a/test/testdata/with_pydantic.py +++ b/test/testdata/with_pydantic.py @@ -3,7 +3,6 @@ """ import pydantic -from pydantic.dataclasses import dataclass class Foo(pydantic.BaseModel): From 25090ddfeeafc97a280480af13a06001f568fdd0 Mon Sep 17 00:00:00 2001 From: Jonathan Jin Date: Sat, 11 Oct 2025 04:35:25 -0400 Subject: [PATCH 07/38] create _pydantic module --- pdoc/_pydantic.py | 25 ++++ pdoc/doc.py | 19 +-- pyproject.toml | 2 +- test/testdata/with_pydantic.html | 128 ++++++++++++++++- test/testdata/with_pydantic.txt | 171 +++++++++++++++++++++- uv.lock | 238 ++++++++++++++++--------------- 6 files changed, 454 insertions(+), 129 deletions(-) create mode 100644 pdoc/_pydantic.py diff --git a/pdoc/_pydantic.py b/pdoc/_pydantic.py new file mode 100644 index 00000000..65f65729 --- /dev/null +++ b/pdoc/_pydantic.py @@ -0,0 +1,25 @@ +"""Work with Pydantic models.""" + +_PYDANTIC_ENABLED: bool + +try: # pragma: no cover + import pydantic +except ImportError: # pragma: no cover + _PYDANTIC_ENABLED = False +finally: # pragma: no cover + _PYDANTIC_ENABLED = True + + +_IGNORED_FIELDS = ["__fields__"] + + +def default_value(parent, name, obj): + if ( + _PYDANTIC_ENABLED + and isinstance(parent, type) + and issubclass(parent, pydantic.BaseModel) + ): + pydantic_fields = parent.__pydantic_fields__ + return pydantic_fields[name].default if name in pydantic_fields else obj + + return obj diff --git a/pdoc/doc.py b/pdoc/doc.py index bdd3f11f..cf638e33 100644 --- a/pdoc/doc.py +++ b/pdoc/doc.py @@ -57,6 +57,8 @@ from pdoc.doc_types import resolve_annotations from pdoc.doc_types import safe_eval_type +from pdoc import _pydantic + _PYDANTIC_ENABLED: bool try: # pragma: no cover @@ -264,6 +266,9 @@ def members(self) -> dict[str, Doc]: """ members: dict[str, Doc] = {} for name, obj in self._member_objects.items(): + if _pydantic._PYDANTIC_ENABLED and name in _pydantic._IGNORED_FIELDS: + continue + qualname = f"{self.qualname}.{name}".lstrip(".") taken_from = self._taken_from(name, obj) doc: Doc[Any] @@ -325,18 +330,8 @@ def members(self) -> dict[str, Doc]: else: default_value = obj - if ( - _PYDANTIC_ENABLED - and isinstance(self.obj, type) - and issubclass(self.obj, pydantic.BaseModel) - ): - pydantic_fields = self.obj.__pydantic_fields__ - - default_value = ( - pydantic_fields[name].default - if name in pydantic_fields - else obj - ) + if _pydantic._PYDANTIC_ENABLED: + default_value = _pydantic.default_value(self.obj, name, obj) doc = Variable( self.modulename, diff --git a/pyproject.toml b/pyproject.toml index 6834350f..9ed8d860 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -51,7 +51,7 @@ dev-dependencies = [ "pytest-timeout>=2.3.1", "hypothesis>=6.113.0", "pdoc-pyo3-sample-library>=1.0.11", - "pydantic>=2.11.4", + "pydantic>=2.12.0", ] [build-system] diff --git a/test/testdata/with_pydantic.html b/test/testdata/with_pydantic.html index 04a858a6..f3633545 100644 --- a/test/testdata/with_pydantic.html +++ b/test/testdata/with_pydantic.html @@ -21,6 +21,25 @@ +

API Documentation

+ + @@ -42,13 +61,116 @@

-
1"""
-2A small example with Pydantic entities.
-3"""
+                        
 1"""
+ 2A small example with Pydantic entities.
+ 3"""
+ 4
+ 5import pydantic
+ 6
+ 7
+ 8class Foo(pydantic.BaseModel):
+ 9    a: int = pydantic.Field(default=1, description="Docstring for a")
+10
+11    b: int = 2
+12    """Docstring for b."""
 
+
+ +
+ + class + Foo(pydantic.main.BaseModel): + + + +
+ +
 9class Foo(pydantic.BaseModel):
+10    a: int = pydantic.Field(default=1, description="Docstring for a")
+11
+12    b: int = 2
+13    """Docstring for b."""
+
+ + +

!!! abstract "Usage Documentation" + Models

+ +

A base class for creating Pydantic models.

+ +

Attributes: + __class_vars__: The names of the class variables defined on the model. + __private_attributes__: Metadata about the private attributes of the model. + __signature__: The synthesized __init__ [Signature][inspect.Signature] of the model.

+ +
__pydantic_complete__: Whether model building is completed, or if there are still undefined fields.
+__pydantic_core_schema__: The core schema of the model.
+__pydantic_custom_init__: Whether the model has a custom `__init__` function.
+__pydantic_decorators__: Metadata containing the decorators defined on the model.
+    This replaces `Model.__validators__` and `Model.__root_validators__` from Pydantic V1.
+__pydantic_generic_metadata__: Metadata for generic models; contains data used for a similar purpose to
+    __args__, __origin__, __parameters__ in typing-module generics. May eventually be replaced by these.
+__pydantic_parent_namespace__: Parent namespace of the model, used for automatic rebuilding of models.
+__pydantic_post_init__: The name of the post-init method for the model, if defined.
+__pydantic_root_model__: Whether the model is a [`RootModel`][pydantic.root_model.RootModel].
+__pydantic_serializer__: The `pydantic-core` `SchemaSerializer` used to dump instances of the model.
+__pydantic_validator__: The `pydantic-core` `SchemaValidator` used to validate instances of the model.
+
+__pydantic_fields__: A dictionary of field names and their corresponding [`FieldInfo`][pydantic.fields.FieldInfo] objects.
+__pydantic_computed_fields__: A dictionary of computed field names and their corresponding [`ComputedFieldInfo`][pydantic.fields.ComputedFieldInfo] objects.
+
+__pydantic_extra__: A dictionary containing extra values, if [`extra`][pydantic.config.ConfigDict.extra]
+    is set to `'allow'`.
+__pydantic_fields_set__: The names of fields explicitly set during instantiation.
+__pydantic_private__: Values of private attributes set on the model instance.
+
+
+ + +
+
+ a: int = +1 + + +
+ + + + +
+
+
+ b: int = +2 + + +
+ + +

Docstring for b.

+
+ + +
+
+
+ model_config: ClassVar[pydantic.config.ConfigDict] = +{} + + +
+ + +

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

+
+ + +
+
\ No newline at end of file diff --git a/test/testdata/with_pydantic.txt b/test/testdata/with_pydantic.txt index cbcc12eb..5f4f768d 100644 --- a/test/testdata/with_pydantic.txt +++ b/test/testdata/with_pydantic.txt @@ -1 +1,170 @@ - \ No newline at end of file + + + + + + + + + <@classmethod class def model_construct(cls, _fields_set: set[str] | None = None, **values: Any) -> Self: ... # inherited from pydantic.main.BaseModel.model_construct, Creates a new instan…> + Self: ... # inherited from pydantic.main.BaseModel.model_copy, !!! abstract "Usage …> + dict[str, typing.Any]: ... # inherited from pydantic.main.BaseModel.model_dump, !!! abstract "Usage …> + str: ... # inherited from pydantic.main.BaseModel.model_dump_json, !!! abstract "Usage …> + <@classmethod class def model_json_schema( + cls, + by_alias: bool = True, + ref_template: str = '#/$defs/{model}', + schema_generator: type[pydantic.json_schema.GenerateJsonSchema] = , + mode: Literal['validation', 'serialization'] = 'validation', + *, + union_format: Literal['any_of', 'primitive_type_array'] = 'any_of' + ) -> dict[str, typing.Any]: ... # inherited from pydantic.main.BaseModel.model_json_schema, Generates a JSON sch…> + <@classmethod class def model_parametrized_name(cls, params: tuple[type[typing.Any], ...]) -> str: ... # inherited from pydantic.main.BaseModel.model_parametrized_name, Compute the class na…> + None: ... # inherited from pydantic.main.BaseModel.model_post_init, Override this method…> + <@classmethod class def model_rebuild( + cls, + *, + force: bool = False, + raise_errors: bool = True, + _parent_namespace_depth: int = 2, + _types_namespace: Mapping[str, typing.Any] | None = None + ) -> bool | None: ... # inherited from pydantic.main.BaseModel.model_rebuild, Try to rebuild the p…> + <@classmethod class def model_validate( + cls, + obj: Any, + *, + strict: bool | None = None, + extra: Optional[Literal['allow', 'ignore', 'forbid']] = None, + from_attributes: bool | None = None, + context: typing.Any | None = None, + by_alias: bool | None = None, + by_name: bool | None = None + ) -> Self: ... # inherited from pydantic.main.BaseModel.model_validate, Validate a pydantic …> + <@classmethod class def model_validate_json( + cls, + json_data: str | bytes | bytearray, + *, + strict: bool | None = None, + extra: Optional[Literal['allow', 'ignore', 'forbid']] = None, + context: typing.Any | None = None, + by_alias: bool | None = None, + by_name: bool | None = None + ) -> Self: ... # inherited from pydantic.main.BaseModel.model_validate_json, !!! abstract "Usage …> + <@classmethod class def model_validate_strings( + cls, + obj: Any, + *, + strict: bool | None = None, + extra: Optional[Literal['allow', 'ignore', 'forbid']] = None, + context: typing.Any | None = None, + by_alias: bool | None = None, + by_name: bool | None = None + ) -> Self: ... # inherited from pydantic.main.BaseModel.model_validate_strings, Validate the given o…> + <@typing_extensions.deprecated('The `dict` method is deprecated; use `model_dump` instead.', category=None) method def dict( + self, + *, + include: Union[set[int], set[str], Mapping[int, Union[set[int], set[str], Mapping[int, Union[ForwardRef('IncEx'), bool]], Mapping[str, Union[ForwardRef('IncEx'), bool]], bool]], Mapping[str, Union[set[int], set[str], Mapping[int, Union[ForwardRef('IncEx'), bool]], Mapping[str, Union[ForwardRef('IncEx'), bool]], bool]], NoneType] = None, + exclude: Union[set[int], set[str], Mapping[int, Union[set[int], set[str], Mapping[int, Union[ForwardRef('IncEx'), bool]], Mapping[str, Union[ForwardRef('IncEx'), bool]], bool]], Mapping[str, Union[set[int], set[str], Mapping[int, Union[ForwardRef('IncEx'), bool]], Mapping[str, Union[ForwardRef('IncEx'), bool]], bool]], NoneType] = None, + by_alias: bool = False, + exclude_unset: bool = False, + exclude_defaults: bool = False, + exclude_none: bool = False + ) -> Dict[str, Any]: ... # inherited from pydantic.main.BaseModel.dict> + <@typing_extensions.deprecated('The `json` method is deprecated; use `model_dump_json` instead.', category=None) method def json( + self, + *, + include: Union[set[int], set[str], Mapping[int, Union[set[int], set[str], Mapping[int, Union[ForwardRef('IncEx'), bool]], Mapping[str, Union[ForwardRef('IncEx'), bool]], bool]], Mapping[str, Union[set[int], set[str], Mapping[int, Union[ForwardRef('IncEx'), bool]], Mapping[str, Union[ForwardRef('IncEx'), bool]], bool]], NoneType] = None, + exclude: Union[set[int], set[str], Mapping[int, Union[set[int], set[str], Mapping[int, Union[ForwardRef('IncEx'), bool]], Mapping[str, Union[ForwardRef('IncEx'), bool]], bool]], Mapping[str, Union[set[int], set[str], Mapping[int, Union[ForwardRef('IncEx'), bool]], Mapping[str, Union[ForwardRef('IncEx'), bool]], bool]], NoneType] = None, + by_alias: bool = False, + exclude_unset: bool = False, + exclude_defaults: bool = False, + exclude_none: bool = False, + encoder: Optional[Callable[[Any], Any]] = PydanticUndefined, + models_as_dict: bool = PydanticUndefined, + **dumps_kwargs: Any + ) -> str: ... # inherited from pydantic.main.BaseModel.json> + <@classmethod @typing_extensions.deprecated('The `parse_obj` method is deprecated; use `model_validate` instead.', category=None) class def parse_obj(cls, obj: Any) -> Self: ... # inherited from pydantic.main.BaseModel.parse_obj> + <@classmethod @typing_extensions.deprecated('The `parse_raw` method is deprecated; if your data is JSON use `model_validate_json`, otherwise load the data then use `model_validate` instead.', category=None) class def parse_raw( + cls, + b: str | bytes, + *, + content_type: str | None = None, + encoding: str = 'utf8', + proto: pydantic.deprecated.parse.Protocol | None = None, + allow_pickle: bool = False + ) -> Self: ... # inherited from pydantic.main.BaseModel.parse_raw> + <@classmethod @typing_extensions.deprecated('The `parse_file` method is deprecated; load the data from file, then if your data is JSON use `model_validate_json`, otherwise `model_validate` instead.', category=None) class def parse_file( + cls, + path: str | pathlib._local.Path, + *, + content_type: str | None = None, + encoding: str = 'utf8', + proto: pydantic.deprecated.parse.Protocol | None = None, + allow_pickle: bool = False + ) -> Self: ... # inherited from pydantic.main.BaseModel.parse_file> + <@classmethod @typing_extensions.deprecated("The `from_orm` method is deprecated; set `model_config['from_attributes']=True` and use `model_validate` instead.", category=None) class def from_orm(cls, obj: Any) -> Self: ... # inherited from pydantic.main.BaseModel.from_orm> + <@classmethod @typing_extensions.deprecated('The `construct` method is deprecated; use `model_construct` instead.', category=None) class def construct(cls, _fields_set: set[str] | None = None, **values: Any) -> Self: ... # inherited from pydantic.main.BaseModel.construct> + <@typing_extensions.deprecated('The `copy` method is deprecated; use `model_copy` instead. See the docstring of `BaseModel.copy` for details about how to handle `include` and `exclude`.', category=None) method def copy( + self, + *, + include: Set[int] | Set[str] | Mapping[int, typing.Any] | Mapping[str, typing.Any] | None = None, + exclude: Set[int] | Set[str] | Mapping[int, typing.Any] | Mapping[str, typing.Any] | None = None, + update: Optional[Dict[str, Any]] = None, + deep: bool = False + ) -> Self: ... # inherited from pydantic.main.BaseModel.copy, Returns a copy of th…> + <@classmethod @typing_extensions.deprecated('The `schema` method is deprecated; use `model_json_schema` instead.', category=None) class def schema( + cls, + by_alias: bool = True, + ref_template: str = '#/$defs/{model}' + ) -> Dict[str, Any]: ... # inherited from pydantic.main.BaseModel.schema> + <@classmethod @typing_extensions.deprecated('The `schema_json` method is deprecated; use `model_json_schema` and json.dumps instead.', category=None) class def schema_json( + cls, + *, + by_alias: bool = True, + ref_template: str = '#/$defs/{model}', + **dumps_kwargs: Any + ) -> str: ... # inherited from pydantic.main.BaseModel.schema_json> + <@classmethod @typing_extensions.deprecated('The `validate` method is deprecated; use `model_validate` instead.', category=None) class def validate(cls, value: Any) -> Self: ... # inherited from pydantic.main.BaseModel.validate> + <@classmethod @typing_extensions.deprecated('The `update_forward_refs` method is deprecated; use `model_rebuild` instead.', category=None) class def update_forward_refs(cls, **localns: Any) -> None: ... # inherited from pydantic.main.BaseModel.update_forward_refs> + > +> \ No newline at end of file diff --git a/uv.lock b/uv.lock index 5118f28c..ba74c946 100644 --- a/uv.lock +++ b/uv.lock @@ -1,4 +1,5 @@ version = 1 +revision = 1 requires-python = ">=3.9" [[package]] @@ -315,7 +316,6 @@ wheels = [ [[package]] name = "pdoc" -version = "15.0.3" source = { editable = "." } dependencies = [ { name = "jinja2" }, @@ -350,7 +350,7 @@ dev = [ { name = "hypothesis", specifier = ">=6.113.0" }, { name = "mypy", specifier = ">=1.11.2" }, { name = "pdoc-pyo3-sample-library", specifier = ">=1.0.11" }, - { name = "pydantic", specifier = ">=2.11.4" }, + { name = "pydantic", specifier = ">=2.12.0" }, { name = "pytest", specifier = ">=8.3.3" }, { name = "pytest-cov", specifier = ">=5.0.0" }, { name = "pytest-timeout", specifier = ">=2.3.1" }, @@ -391,7 +391,7 @@ wheels = [ [[package]] name = "pydantic" -version = "2.11.4" +version = "2.12.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, @@ -399,118 +399,132 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/77/ab/5250d56ad03884ab5efd07f734203943c8a8ab40d551e208af81d0257bf2/pydantic-2.11.4.tar.gz", hash = "sha256:32738d19d63a226a52eed76645a98ee07c1f410ee41d93b4afbfa85ed8111c2d", size = 786540 } +sdist = { url = "https://files.pythonhosted.org/packages/c3/da/b8a7ee04378a53f6fefefc0c5e05570a3ebfdfa0523a878bcd3b475683ee/pydantic-2.12.0.tar.gz", hash = "sha256:c1a077e6270dbfb37bfd8b498b3981e2bb18f68103720e51fa6c306a5a9af563", size = 814760 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/12/46b65f3534d099349e38ef6ec98b1a5a81f42536d17e0ba382c28c67ba67/pydantic-2.11.4-py3-none-any.whl", hash = "sha256:d9615eaa9ac5a063471da949c8fc16376a84afb5024688b3ff885693506764eb", size = 443900 }, + { url = "https://files.pythonhosted.org/packages/f4/9d/d5c855424e2e5b6b626fbc6ec514d8e655a600377ce283008b115abb7445/pydantic-2.12.0-py3-none-any.whl", hash = "sha256:f6a1da352d42790537e95e83a8bdfb91c7efbae63ffd0b86fa823899e807116f", size = 459730 }, ] [[package]] name = "pydantic-core" -version = "2.33.2" +version = "2.41.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/92/b31726561b5dae176c2d2c2dc43a9c5bfba5d32f96f8b4c0a600dd492447/pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8", size = 2028817 }, - { url = "https://files.pythonhosted.org/packages/a3/44/3f0b95fafdaca04a483c4e685fe437c6891001bf3ce8b2fded82b9ea3aa1/pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d", size = 1861357 }, - { url = "https://files.pythonhosted.org/packages/30/97/e8f13b55766234caae05372826e8e4b3b96e7b248be3157f53237682e43c/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d", size = 1898011 }, - { url = "https://files.pythonhosted.org/packages/9b/a3/99c48cf7bafc991cc3ee66fd544c0aae8dc907b752f1dad2d79b1b5a471f/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572", size = 1982730 }, - { url = "https://files.pythonhosted.org/packages/de/8e/a5b882ec4307010a840fb8b58bd9bf65d1840c92eae7534c7441709bf54b/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02", size = 2136178 }, - { url = "https://files.pythonhosted.org/packages/e4/bb/71e35fc3ed05af6834e890edb75968e2802fe98778971ab5cba20a162315/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b", size = 2736462 }, - { url = "https://files.pythonhosted.org/packages/31/0d/c8f7593e6bc7066289bbc366f2235701dcbebcd1ff0ef8e64f6f239fb47d/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2", size = 2005652 }, - { url = "https://files.pythonhosted.org/packages/d2/7a/996d8bd75f3eda405e3dd219ff5ff0a283cd8e34add39d8ef9157e722867/pydantic_core-2.33.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a", size = 2113306 }, - { url = "https://files.pythonhosted.org/packages/ff/84/daf2a6fb2db40ffda6578a7e8c5a6e9c8affb251a05c233ae37098118788/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac", size = 2073720 }, - { url = "https://files.pythonhosted.org/packages/77/fb/2258da019f4825128445ae79456a5499c032b55849dbd5bed78c95ccf163/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a", size = 2244915 }, - { url = "https://files.pythonhosted.org/packages/d8/7a/925ff73756031289468326e355b6fa8316960d0d65f8b5d6b3a3e7866de7/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b", size = 2241884 }, - { url = "https://files.pythonhosted.org/packages/0b/b0/249ee6d2646f1cdadcb813805fe76265745c4010cf20a8eba7b0e639d9b2/pydantic_core-2.33.2-cp310-cp310-win32.whl", hash = "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22", size = 1910496 }, - { url = "https://files.pythonhosted.org/packages/66/ff/172ba8f12a42d4b552917aa65d1f2328990d3ccfc01d5b7c943ec084299f/pydantic_core-2.33.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640", size = 1955019 }, - { url = "https://files.pythonhosted.org/packages/3f/8d/71db63483d518cbbf290261a1fc2839d17ff89fce7089e08cad07ccfce67/pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7", size = 2028584 }, - { url = "https://files.pythonhosted.org/packages/24/2f/3cfa7244ae292dd850989f328722d2aef313f74ffc471184dc509e1e4e5a/pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246", size = 1855071 }, - { url = "https://files.pythonhosted.org/packages/b3/d3/4ae42d33f5e3f50dd467761304be2fa0a9417fbf09735bc2cce003480f2a/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f", size = 1897823 }, - { url = "https://files.pythonhosted.org/packages/f4/f3/aa5976e8352b7695ff808599794b1fba2a9ae2ee954a3426855935799488/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc", size = 1983792 }, - { url = "https://files.pythonhosted.org/packages/d5/7a/cda9b5a23c552037717f2b2a5257e9b2bfe45e687386df9591eff7b46d28/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de", size = 2136338 }, - { url = "https://files.pythonhosted.org/packages/2b/9f/b8f9ec8dd1417eb9da784e91e1667d58a2a4a7b7b34cf4af765ef663a7e5/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a", size = 2730998 }, - { url = "https://files.pythonhosted.org/packages/47/bc/cd720e078576bdb8255d5032c5d63ee5c0bf4b7173dd955185a1d658c456/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef", size = 2003200 }, - { url = "https://files.pythonhosted.org/packages/ca/22/3602b895ee2cd29d11a2b349372446ae9727c32e78a94b3d588a40fdf187/pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e", size = 2113890 }, - { url = "https://files.pythonhosted.org/packages/ff/e6/e3c5908c03cf00d629eb38393a98fccc38ee0ce8ecce32f69fc7d7b558a7/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d", size = 2073359 }, - { url = "https://files.pythonhosted.org/packages/12/e7/6a36a07c59ebefc8777d1ffdaf5ae71b06b21952582e4b07eba88a421c79/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30", size = 2245883 }, - { url = "https://files.pythonhosted.org/packages/16/3f/59b3187aaa6cc0c1e6616e8045b284de2b6a87b027cce2ffcea073adf1d2/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf", size = 2241074 }, - { url = "https://files.pythonhosted.org/packages/e0/ed/55532bb88f674d5d8f67ab121a2a13c385df382de2a1677f30ad385f7438/pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51", size = 1910538 }, - { url = "https://files.pythonhosted.org/packages/fe/1b/25b7cccd4519c0b23c2dd636ad39d381abf113085ce4f7bec2b0dc755eb1/pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab", size = 1952909 }, - { url = "https://files.pythonhosted.org/packages/49/a9/d809358e49126438055884c4366a1f6227f0f84f635a9014e2deb9b9de54/pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65", size = 1897786 }, - { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000 }, - { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996 }, - { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957 }, - { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199 }, - { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296 }, - { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109 }, - { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028 }, - { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044 }, - { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881 }, - { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034 }, - { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187 }, - { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628 }, - { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866 }, - { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894 }, - { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688 }, - { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808 }, - { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580 }, - { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859 }, - { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810 }, - { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498 }, - { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611 }, - { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924 }, - { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196 }, - { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389 }, - { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223 }, - { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473 }, - { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269 }, - { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921 }, - { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162 }, - { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560 }, - { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777 }, - { url = "https://files.pythonhosted.org/packages/53/ea/bbe9095cdd771987d13c82d104a9c8559ae9aec1e29f139e286fd2e9256e/pydantic_core-2.33.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a2b911a5b90e0374d03813674bf0a5fbbb7741570dcd4b4e85a2e48d17def29d", size = 2028677 }, - { url = "https://files.pythonhosted.org/packages/49/1d/4ac5ed228078737d457a609013e8f7edc64adc37b91d619ea965758369e5/pydantic_core-2.33.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6fa6dfc3e4d1f734a34710f391ae822e0a8eb8559a85c6979e14e65ee6ba2954", size = 1864735 }, - { url = "https://files.pythonhosted.org/packages/23/9a/2e70d6388d7cda488ae38f57bc2f7b03ee442fbcf0d75d848304ac7e405b/pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c54c939ee22dc8e2d545da79fc5381f1c020d6d3141d3bd747eab59164dc89fb", size = 1898467 }, - { url = "https://files.pythonhosted.org/packages/ff/2e/1568934feb43370c1ffb78a77f0baaa5a8b6897513e7a91051af707ffdc4/pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53a57d2ed685940a504248187d5685e49eb5eef0f696853647bf37c418c538f7", size = 1983041 }, - { url = "https://files.pythonhosted.org/packages/01/1a/1a1118f38ab64eac2f6269eb8c120ab915be30e387bb561e3af904b12499/pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09fb9dd6571aacd023fe6aaca316bd01cf60ab27240d7eb39ebd66a3a15293b4", size = 2136503 }, - { url = "https://files.pythonhosted.org/packages/5c/da/44754d1d7ae0f22d6d3ce6c6b1486fc07ac2c524ed8f6eca636e2e1ee49b/pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e6116757f7959a712db11f3e9c0a99ade00a5bbedae83cb801985aa154f071b", size = 2736079 }, - { url = "https://files.pythonhosted.org/packages/4d/98/f43cd89172220ec5aa86654967b22d862146bc4d736b1350b4c41e7c9c03/pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d55ab81c57b8ff8548c3e4947f119551253f4e3787a7bbc0b6b3ca47498a9d3", size = 2006508 }, - { url = "https://files.pythonhosted.org/packages/2b/cc/f77e8e242171d2158309f830f7d5d07e0531b756106f36bc18712dc439df/pydantic_core-2.33.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c20c462aa4434b33a2661701b861604913f912254e441ab8d78d30485736115a", size = 2113693 }, - { url = "https://files.pythonhosted.org/packages/54/7a/7be6a7bd43e0a47c147ba7fbf124fe8aaf1200bc587da925509641113b2d/pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44857c3227d3fb5e753d5fe4a3420d6376fa594b07b621e220cd93703fe21782", size = 2074224 }, - { url = "https://files.pythonhosted.org/packages/2a/07/31cf8fadffbb03be1cb520850e00a8490c0927ec456e8293cafda0726184/pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:eb9b459ca4df0e5c87deb59d37377461a538852765293f9e6ee834f0435a93b9", size = 2245403 }, - { url = "https://files.pythonhosted.org/packages/b6/8d/bbaf4c6721b668d44f01861f297eb01c9b35f612f6b8e14173cb204e6240/pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9fcd347d2cc5c23b06de6d3b7b8275be558a0c90549495c699e379a80bf8379e", size = 2242331 }, - { url = "https://files.pythonhosted.org/packages/bb/93/3cc157026bca8f5006250e74515119fcaa6d6858aceee8f67ab6dc548c16/pydantic_core-2.33.2-cp39-cp39-win32.whl", hash = "sha256:83aa99b1285bc8f038941ddf598501a86f1536789740991d7d8756e34f1e74d9", size = 1910571 }, - { url = "https://files.pythonhosted.org/packages/5b/90/7edc3b2a0d9f0dda8806c04e511a67b0b7a41d2187e2003673a996fb4310/pydantic_core-2.33.2-cp39-cp39-win_amd64.whl", hash = "sha256:f481959862f57f29601ccced557cc2e817bce7533ab8e01a797a48b49c9692b3", size = 1956504 }, - { url = "https://files.pythonhosted.org/packages/30/68/373d55e58b7e83ce371691f6eaa7175e3a24b956c44628eb25d7da007917/pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa", size = 2023982 }, - { url = "https://files.pythonhosted.org/packages/a4/16/145f54ac08c96a63d8ed6442f9dec17b2773d19920b627b18d4f10a061ea/pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29", size = 1858412 }, - { url = "https://files.pythonhosted.org/packages/41/b1/c6dc6c3e2de4516c0bb2c46f6a373b91b5660312342a0cf5826e38ad82fa/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d", size = 1892749 }, - { url = "https://files.pythonhosted.org/packages/12/73/8cd57e20afba760b21b742106f9dbdfa6697f1570b189c7457a1af4cd8a0/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e", size = 2067527 }, - { url = "https://files.pythonhosted.org/packages/e3/d5/0bb5d988cc019b3cba4a78f2d4b3854427fc47ee8ec8e9eaabf787da239c/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c", size = 2108225 }, - { url = "https://files.pythonhosted.org/packages/f1/c5/00c02d1571913d496aabf146106ad8239dc132485ee22efe08085084ff7c/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec", size = 2069490 }, - { url = "https://files.pythonhosted.org/packages/22/a8/dccc38768274d3ed3a59b5d06f59ccb845778687652daa71df0cab4040d7/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052", size = 2237525 }, - { url = "https://files.pythonhosted.org/packages/d4/e7/4f98c0b125dda7cf7ccd14ba936218397b44f50a56dd8c16a3091df116c3/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c", size = 2238446 }, - { url = "https://files.pythonhosted.org/packages/ce/91/2ec36480fdb0b783cd9ef6795753c1dea13882f2e68e73bce76ae8c21e6a/pydantic_core-2.33.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808", size = 2066678 }, - { url = "https://files.pythonhosted.org/packages/7b/27/d4ae6487d73948d6f20dddcd94be4ea43e74349b56eba82e9bdee2d7494c/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8", size = 2025200 }, - { url = "https://files.pythonhosted.org/packages/f1/b8/b3cb95375f05d33801024079b9392a5ab45267a63400bf1866e7ce0f0de4/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593", size = 1859123 }, - { url = "https://files.pythonhosted.org/packages/05/bc/0d0b5adeda59a261cd30a1235a445bf55c7e46ae44aea28f7bd6ed46e091/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612", size = 1892852 }, - { url = "https://files.pythonhosted.org/packages/3e/11/d37bdebbda2e449cb3f519f6ce950927b56d62f0b84fd9cb9e372a26a3d5/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7", size = 2067484 }, - { url = "https://files.pythonhosted.org/packages/8c/55/1f95f0a05ce72ecb02a8a8a1c3be0579bbc29b1d5ab68f1378b7bebc5057/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e", size = 2108896 }, - { url = "https://files.pythonhosted.org/packages/53/89/2b2de6c81fa131f423246a9109d7b2a375e83968ad0800d6e57d0574629b/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8", size = 2069475 }, - { url = "https://files.pythonhosted.org/packages/b8/e9/1f7efbe20d0b2b10f6718944b5d8ece9152390904f29a78e68d4e7961159/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf", size = 2239013 }, - { url = "https://files.pythonhosted.org/packages/3c/b2/5309c905a93811524a49b4e031e9851a6b00ff0fb668794472ea7746b448/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb", size = 2238715 }, - { url = "https://files.pythonhosted.org/packages/32/56/8a7ca5d2cd2cda1d245d34b1c9a942920a718082ae8e54e5f3e5a58b7add/pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", size = 2066757 }, - { url = "https://files.pythonhosted.org/packages/08/98/dbf3fdfabaf81cda5622154fda78ea9965ac467e3239078e0dcd6df159e7/pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:87acbfcf8e90ca885206e98359d7dca4bcbb35abdc0ff66672a293e1d7a19101", size = 2024034 }, - { url = "https://files.pythonhosted.org/packages/8d/99/7810aa9256e7f2ccd492590f86b79d370df1e9292f1f80b000b6a75bd2fb/pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f92c15cd1e97d4b12acd1cc9004fa092578acfa57b67ad5e43a197175d01a64", size = 1858578 }, - { url = "https://files.pythonhosted.org/packages/d8/60/bc06fa9027c7006cc6dd21e48dbf39076dc39d9abbaf718a1604973a9670/pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3f26877a748dc4251cfcfda9dfb5f13fcb034f5308388066bcfe9031b63ae7d", size = 1892858 }, - { url = "https://files.pythonhosted.org/packages/f2/40/9d03997d9518816c68b4dfccb88969756b9146031b61cd37f781c74c9b6a/pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac89aea9af8cd672fa7b510e7b8c33b0bba9a43186680550ccf23020f32d535", size = 2068498 }, - { url = "https://files.pythonhosted.org/packages/d8/62/d490198d05d2d86672dc269f52579cad7261ced64c2df213d5c16e0aecb1/pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:970919794d126ba8645f3837ab6046fb4e72bbc057b3709144066204c19a455d", size = 2108428 }, - { url = "https://files.pythonhosted.org/packages/9a/ec/4cd215534fd10b8549015f12ea650a1a973da20ce46430b68fc3185573e8/pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3eb3fe62804e8f859c49ed20a8451342de53ed764150cb14ca71357c765dc2a6", size = 2069854 }, - { url = "https://files.pythonhosted.org/packages/1a/1a/abbd63d47e1d9b0d632fee6bb15785d0889c8a6e0a6c3b5a8e28ac1ec5d2/pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:3abcd9392a36025e3bd55f9bd38d908bd17962cc49bc6da8e7e96285336e2bca", size = 2237859 }, - { url = "https://files.pythonhosted.org/packages/80/1c/fa883643429908b1c90598fd2642af8839efd1d835b65af1f75fba4d94fe/pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:3a1c81334778f9e3af2f8aeb7a960736e5cab1dfebfb26aabca09afd2906c039", size = 2239059 }, - { url = "https://files.pythonhosted.org/packages/d4/29/3cade8a924a61f60ccfa10842f75eb12787e1440e2b8660ceffeb26685e7/pydantic_core-2.33.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2807668ba86cb38c6817ad9bc66215ab8584d1d304030ce4f0887336f28a5e27", size = 2066661 }, +sdist = { url = "https://files.pythonhosted.org/packages/7d/14/12b4a0d2b0b10d8e1d9a24ad94e7bbb43335eaf29c0c4e57860e8a30734a/pydantic_core-2.41.1.tar.gz", hash = "sha256:1ad375859a6d8c356b7704ec0f547a58e82ee80bb41baa811ad710e124bc8f2f", size = 454870 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/2c/a5c4640dc7132540109f67fe83b566fbc7512ccf2a068cfa22a243df70c7/pydantic_core-2.41.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:e63036298322e9aea1c8b7c0a6c1204d615dbf6ec0668ce5b83ff27f07404a61", size = 2113814 }, + { url = "https://files.pythonhosted.org/packages/e3/e7/a8694c3454a57842095d69c7a4ab3cf81c3c7b590f052738eabfdfc2e234/pydantic_core-2.41.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:241299ca91fc77ef64f11ed909d2d9220a01834e8e6f8de61275c4dd16b7c936", size = 1916660 }, + { url = "https://files.pythonhosted.org/packages/9c/58/29f12e65b19c1877a0269eb4f23c5d2267eded6120a7d6762501ab843dc9/pydantic_core-2.41.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ab7e594a2a5c24ab8013a7dc8cfe5f2260e80e490685814122081705c2cf2b0", size = 1975071 }, + { url = "https://files.pythonhosted.org/packages/98/26/4e677f2b7ec3fbdd10be6b586a82a814c8ebe3e474024c8df2d4260e564e/pydantic_core-2.41.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b054ef1a78519cb934b58e9c90c09e93b837c935dcd907b891f2b265b129eb6e", size = 2067271 }, + { url = "https://files.pythonhosted.org/packages/29/50/50614bd906089904d7ca1be3b9ecf08c00a327143d48f1decfdc21b3c302/pydantic_core-2.41.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f2ab7d10d0ab2ed6da54c757233eb0f48ebfb4f86e9b88ccecb3f92bbd61a538", size = 2253207 }, + { url = "https://files.pythonhosted.org/packages/ea/58/b1e640b4ca559273cca7c28e0fe8891d5d8e9a600f5ab4882670ec107549/pydantic_core-2.41.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2757606b7948bb853a27e4040820306eaa0ccb9e8f9f8a0fa40cb674e170f350", size = 2375052 }, + { url = "https://files.pythonhosted.org/packages/53/25/cd47df3bfb24350e03835f0950288d1054f1cc9a8023401dabe6d4ff2834/pydantic_core-2.41.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cec0e75eb61f606bad0a32f2be87507087514e26e8c73db6cbdb8371ccd27917", size = 2076834 }, + { url = "https://files.pythonhosted.org/packages/ec/b4/71b2c77e5df527fbbc1a03e72c3fd96c44cd10d4241a81befef8c12b9fc4/pydantic_core-2.41.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0234236514f44a5bf552105cfe2543a12f48203397d9d0f866affa569345a5b5", size = 2195374 }, + { url = "https://files.pythonhosted.org/packages/aa/08/4b8a50733005865efde284fec45da75fe16a258f706e16323c5ace4004eb/pydantic_core-2.41.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1b974e41adfbb4ebb0f65fc4ca951347b17463d60893ba7d5f7b9bb087c83897", size = 2156060 }, + { url = "https://files.pythonhosted.org/packages/83/c3/1037cb603ef2130c210150a51b1710d86825b5c28df54a55750099f91196/pydantic_core-2.41.1-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:248dafb3204136113c383e91a4d815269f51562b6659b756cf3df14eefc7d0bb", size = 2331640 }, + { url = "https://files.pythonhosted.org/packages/56/4c/52d111869610e6b1a46e1f1035abcdc94d0655587e39104433a290e9f377/pydantic_core-2.41.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:678f9d76a91d6bcedd7568bbf6beb77ae8447f85d1aeebaab7e2f0829cfc3a13", size = 2329844 }, + { url = "https://files.pythonhosted.org/packages/32/5d/4b435f0b52ab543967761aca66b84ad3f0026e491e57de47693d15d0a8db/pydantic_core-2.41.1-cp310-cp310-win32.whl", hash = "sha256:dff5bee1d21ee58277900692a641925d2dddfde65182c972569b1a276d2ac8fb", size = 1991289 }, + { url = "https://files.pythonhosted.org/packages/88/52/31b4deafc1d3cb96d0e7c0af70f0dc05454982d135d07f5117e6336153e8/pydantic_core-2.41.1-cp310-cp310-win_amd64.whl", hash = "sha256:5042da12e5d97d215f91567110fdfa2e2595a25f17c19b9ff024f31c34f9b53e", size = 2027747 }, + { url = "https://files.pythonhosted.org/packages/f6/a9/ec440f02e57beabdfd804725ef1e38ac1ba00c49854d298447562e119513/pydantic_core-2.41.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4f276a6134fe1fc1daa692642a3eaa2b7b858599c49a7610816388f5e37566a1", size = 2111456 }, + { url = "https://files.pythonhosted.org/packages/f0/f9/6bc15bacfd8dcfc073a1820a564516d9c12a435a9a332d4cbbfd48828ddd/pydantic_core-2.41.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:07588570a805296ece009c59d9a679dc08fab72fb337365afb4f3a14cfbfc176", size = 1915012 }, + { url = "https://files.pythonhosted.org/packages/38/8a/d9edcdcdfe80bade17bed424284427c08bea892aaec11438fa52eaeaf79c/pydantic_core-2.41.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28527e4b53400cd60ffbd9812ccb2b5135d042129716d71afd7e45bf42b855c0", size = 1973762 }, + { url = "https://files.pythonhosted.org/packages/d5/b3/ff225c6d49fba4279de04677c1c876fc3dc6562fd0c53e9bfd66f58c51a8/pydantic_core-2.41.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46a1c935c9228bad738c8a41de06478770927baedf581d172494ab36a6b96575", size = 2065386 }, + { url = "https://files.pythonhosted.org/packages/47/ba/183e8c0be4321314af3fd1ae6bfc7eafdd7a49bdea5da81c56044a207316/pydantic_core-2.41.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:447ddf56e2b7d28d200d3e9eafa936fe40485744b5a824b67039937580b3cb20", size = 2252317 }, + { url = "https://files.pythonhosted.org/packages/57/c5/aab61e94fd02f45c65f1f8c9ec38bb3b33fbf001a1837c74870e97462572/pydantic_core-2.41.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:63892ead40c1160ac860b5debcc95c95c5a0035e543a8b5a4eac70dd22e995f4", size = 2373405 }, + { url = "https://files.pythonhosted.org/packages/e5/4f/3aaa3bd1ea420a15acc42d7d3ccb3b0bbc5444ae2f9dbc1959f8173e16b8/pydantic_core-2.41.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4a9543ca355e6df8fbe9c83e9faab707701e9103ae857ecb40f1c0cf8b0e94d", size = 2073794 }, + { url = "https://files.pythonhosted.org/packages/58/bd/e3975cdebe03ec080ef881648de316c73f2a6be95c14fc4efb2f7bdd0d41/pydantic_core-2.41.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f2611bdb694116c31e551ed82e20e39a90bea9b7ad9e54aaf2d045ad621aa7a1", size = 2194430 }, + { url = "https://files.pythonhosted.org/packages/2b/b8/6b7e7217f147d3b3105b57fb1caec3c4f667581affdfaab6d1d277e1f749/pydantic_core-2.41.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fecc130893a9b5f7bfe230be1bb8c61fe66a19db8ab704f808cb25a82aad0bc9", size = 2154611 }, + { url = "https://files.pythonhosted.org/packages/fe/7b/239c2fe76bd8b7eef9ae2140d737368a3c6fea4fd27f8f6b4cde6baa3ce9/pydantic_core-2.41.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:1e2df5f8344c99b6ea5219f00fdc8950b8e6f2c422fbc1cc122ec8641fac85a1", size = 2329809 }, + { url = "https://files.pythonhosted.org/packages/bd/2e/77a821a67ff0786f2f14856d6bd1348992f695ee90136a145d7a445c1ff6/pydantic_core-2.41.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:35291331e9d8ed94c257bab6be1cb3a380b5eee570a2784bffc055e18040a2ea", size = 2327907 }, + { url = "https://files.pythonhosted.org/packages/fd/9a/b54512bb9df7f64c586b369328c30481229b70ca6a5fcbb90b715e15facf/pydantic_core-2.41.1-cp311-cp311-win32.whl", hash = "sha256:2876a095292668d753f1a868c4a57c4ac9f6acbd8edda8debe4218d5848cf42f", size = 1989964 }, + { url = "https://files.pythonhosted.org/packages/9d/72/63c9a4f1a5c950e65dd522d7dd67f167681f9d4f6ece3b80085a0329f08f/pydantic_core-2.41.1-cp311-cp311-win_amd64.whl", hash = "sha256:b92d6c628e9a338846a28dfe3fcdc1a3279388624597898b105e078cdfc59298", size = 2025158 }, + { url = "https://files.pythonhosted.org/packages/d8/16/4e2706184209f61b50c231529257c12eb6bd9eb36e99ea1272e4815d2200/pydantic_core-2.41.1-cp311-cp311-win_arm64.whl", hash = "sha256:7d82ae99409eb69d507a89835488fb657faa03ff9968a9379567b0d2e2e56bc5", size = 1972297 }, + { url = "https://files.pythonhosted.org/packages/ee/bc/5f520319ee1c9e25010412fac4154a72e0a40d0a19eb00281b1f200c0947/pydantic_core-2.41.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:db2f82c0ccbce8f021ad304ce35cbe02aa2f95f215cac388eed542b03b4d5eb4", size = 2099300 }, + { url = "https://files.pythonhosted.org/packages/31/14/010cd64c5c3814fb6064786837ec12604be0dd46df3327cf8474e38abbbd/pydantic_core-2.41.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:47694a31c710ced9205d5f1e7e8af3ca57cbb8a503d98cb9e33e27c97a501601", size = 1910179 }, + { url = "https://files.pythonhosted.org/packages/8e/2e/23fc2a8a93efad52df302fdade0a60f471ecc0c7aac889801ac24b4c07d6/pydantic_core-2.41.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e9decce94daf47baf9e9d392f5f2557e783085f7c5e522011545d9d6858e00", size = 1957225 }, + { url = "https://files.pythonhosted.org/packages/b9/b6/6db08b2725b2432b9390844852e11d320281e5cea8a859c52c68001975fa/pydantic_core-2.41.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab0adafdf2b89c8b84f847780a119437a0931eca469f7b44d356f2b426dd9741", size = 2053315 }, + { url = "https://files.pythonhosted.org/packages/61/d9/4de44600f2d4514b44f3f3aeeda2e14931214b6b5bf52479339e801ce748/pydantic_core-2.41.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5da98cc81873f39fd56882e1569c4677940fbc12bce6213fad1ead784192d7c8", size = 2224298 }, + { url = "https://files.pythonhosted.org/packages/7a/ae/dbe51187a7f35fc21b283c5250571a94e36373eb557c1cba9f29a9806dcf/pydantic_core-2.41.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:209910e88afb01fd0fd403947b809ba8dba0e08a095e1f703294fda0a8fdca51", size = 2351797 }, + { url = "https://files.pythonhosted.org/packages/b5/a7/975585147457c2e9fb951c7c8dab56deeb6aa313f3aa72c2fc0df3f74a49/pydantic_core-2.41.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:365109d1165d78d98e33c5bfd815a9b5d7d070f578caefaabcc5771825b4ecb5", size = 2074921 }, + { url = "https://files.pythonhosted.org/packages/62/37/ea94d1d0c01dec1b7d236c7cec9103baab0021f42500975de3d42522104b/pydantic_core-2.41.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:706abf21e60a2857acdb09502bc853ee5bce732955e7b723b10311114f033115", size = 2187767 }, + { url = "https://files.pythonhosted.org/packages/d3/fe/694cf9fdd3a777a618c3afd210dba7b414cb8a72b1bd29b199c2e5765fee/pydantic_core-2.41.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bf0bd5417acf7f6a7ec3b53f2109f587be176cb35f9cf016da87e6017437a72d", size = 2136062 }, + { url = "https://files.pythonhosted.org/packages/0f/ae/174aeabd89916fbd2988cc37b81a59e1186e952afd2a7ed92018c22f31ca/pydantic_core-2.41.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:2e71b1c6ceb9c78424ae9f63a07292fb769fb890a4e7efca5554c47f33a60ea5", size = 2317819 }, + { url = "https://files.pythonhosted.org/packages/65/e8/e9aecafaebf53fc456314f72886068725d6fba66f11b013532dc21259343/pydantic_core-2.41.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:80745b9770b4a38c25015b517451c817799bfb9d6499b0d13d8227ec941cb513", size = 2312267 }, + { url = "https://files.pythonhosted.org/packages/35/2f/1c2e71d2a052f9bb2f2df5a6a05464a0eb800f9e8d9dd800202fe31219e1/pydantic_core-2.41.1-cp312-cp312-win32.whl", hash = "sha256:83b64d70520e7890453f1aa21d66fda44e7b35f1cfea95adf7b4289a51e2b479", size = 1990927 }, + { url = "https://files.pythonhosted.org/packages/b1/78/562998301ff2588b9c6dcc5cb21f52fa919d6e1decc75a35055feb973594/pydantic_core-2.41.1-cp312-cp312-win_amd64.whl", hash = "sha256:377defd66ee2003748ee93c52bcef2d14fde48fe28a0b156f88c3dbf9bc49a50", size = 2034703 }, + { url = "https://files.pythonhosted.org/packages/b2/53/d95699ce5a5cdb44bb470bd818b848b9beadf51459fd4ea06667e8ede862/pydantic_core-2.41.1-cp312-cp312-win_arm64.whl", hash = "sha256:c95caff279d49c1d6cdfe2996e6c2ad712571d3b9caaa209a404426c326c4bde", size = 1972719 }, + { url = "https://files.pythonhosted.org/packages/27/8a/6d54198536a90a37807d31a156642aae7a8e1263ed9fe6fc6245defe9332/pydantic_core-2.41.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:70e790fce5f05204ef4403159857bfcd587779da78627b0babb3654f75361ebf", size = 2105825 }, + { url = "https://files.pythonhosted.org/packages/4f/2e/4784fd7b22ac9c8439db25bf98ffed6853d01e7e560a346e8af821776ccc/pydantic_core-2.41.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9cebf1ca35f10930612d60bd0f78adfacee824c30a880e3534ba02c207cceceb", size = 1910126 }, + { url = "https://files.pythonhosted.org/packages/f3/92/31eb0748059ba5bd0aa708fb4bab9fcb211461ddcf9e90702a6542f22d0d/pydantic_core-2.41.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:170406a37a5bc82c22c3274616bf6f17cc7df9c4a0a0a50449e559cb755db669", size = 1961472 }, + { url = "https://files.pythonhosted.org/packages/ab/91/946527792275b5c4c7dde4cfa3e81241bf6900e9fee74fb1ba43e0c0f1ab/pydantic_core-2.41.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:12d4257fc9187a0ccd41b8b327d6a4e57281ab75e11dda66a9148ef2e1fb712f", size = 2063230 }, + { url = "https://files.pythonhosted.org/packages/31/5d/a35c5d7b414e5c0749f1d9f0d159ee2ef4bab313f499692896b918014ee3/pydantic_core-2.41.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a75a33b4db105dd1c8d57839e17ee12db8d5ad18209e792fa325dbb4baeb00f4", size = 2229469 }, + { url = "https://files.pythonhosted.org/packages/21/4d/8713737c689afa57ecfefe38db78259d4484c97aa494979e6a9d19662584/pydantic_core-2.41.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08a589f850803a74e0fcb16a72081cafb0d72a3cdda500106942b07e76b7bf62", size = 2347986 }, + { url = "https://files.pythonhosted.org/packages/f6/ec/929f9a3a5ed5cda767081494bacd32f783e707a690ce6eeb5e0730ec4986/pydantic_core-2.41.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a97939d6ea44763c456bd8a617ceada2c9b96bb5b8ab3dfa0d0827df7619014", size = 2072216 }, + { url = "https://files.pythonhosted.org/packages/26/55/a33f459d4f9cc8786d9db42795dbecc84fa724b290d7d71ddc3d7155d46a/pydantic_core-2.41.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2ae423c65c556f09569524b80ffd11babff61f33055ef9773d7c9fabc11ed8d", size = 2193047 }, + { url = "https://files.pythonhosted.org/packages/77/af/d5c6959f8b089f2185760a2779079e3c2c411bfc70ea6111f58367851629/pydantic_core-2.41.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:4dc703015fbf8764d6a8001c327a87f1823b7328d40b47ce6000c65918ad2b4f", size = 2140613 }, + { url = "https://files.pythonhosted.org/packages/58/e5/2c19bd2a14bffe7fabcf00efbfbd3ac430aaec5271b504a938ff019ac7be/pydantic_core-2.41.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:968e4ffdfd35698a5fe659e5e44c508b53664870a8e61c8f9d24d3d145d30257", size = 2327641 }, + { url = "https://files.pythonhosted.org/packages/93/ef/e0870ccda798c54e6b100aff3c4d49df5458fd64217e860cb9c3b0a403f4/pydantic_core-2.41.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:fff2b76c8e172d34771cd4d4f0ade08072385310f214f823b5a6ad4006890d32", size = 2318229 }, + { url = "https://files.pythonhosted.org/packages/b1/4b/c3b991d95f5deb24d0bd52e47bcf716098fa1afe0ce2d4bd3125b38566ba/pydantic_core-2.41.1-cp313-cp313-win32.whl", hash = "sha256:a38a5263185407ceb599f2f035faf4589d57e73c7146d64f10577f6449e8171d", size = 1997911 }, + { url = "https://files.pythonhosted.org/packages/a7/ce/5c316fd62e01f8d6be1b7ee6b54273214e871772997dc2c95e204997a055/pydantic_core-2.41.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42ae7fd6760782c975897e1fdc810f483b021b32245b0105d40f6e7a3803e4b", size = 2034301 }, + { url = "https://files.pythonhosted.org/packages/29/41/902640cfd6a6523194123e2c3373c60f19006447f2fb06f76de4e8466c5b/pydantic_core-2.41.1-cp313-cp313-win_arm64.whl", hash = "sha256:ad4111acc63b7384e205c27a2f15e23ac0ee21a9d77ad6f2e9cb516ec90965fb", size = 1977238 }, + { url = "https://files.pythonhosted.org/packages/04/04/28b040e88c1b89d851278478842f0bdf39c7a05da9e850333c6c8cbe7dfa/pydantic_core-2.41.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:440d0df7415b50084a4ba9d870480c16c5f67c0d1d4d5119e3f70925533a0edc", size = 1875626 }, + { url = "https://files.pythonhosted.org/packages/d6/58/b41dd3087505220bb58bc81be8c3e8cbc037f5710cd3c838f44f90bdd704/pydantic_core-2.41.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71eaa38d342099405dae6484216dcf1e8e4b0bebd9b44a4e08c9b43db6a2ab67", size = 2045708 }, + { url = "https://files.pythonhosted.org/packages/d7/b8/760f23754e40bf6c65b94a69b22c394c24058a0ef7e2aa471d2e39219c1a/pydantic_core-2.41.1-cp313-cp313t-win_amd64.whl", hash = "sha256:555ecf7e50f1161d3f693bc49f23c82cf6cdeafc71fa37a06120772a09a38795", size = 1997171 }, + { url = "https://files.pythonhosted.org/packages/41/12/cec246429ddfa2778d2d6301eca5362194dc8749ecb19e621f2f65b5090f/pydantic_core-2.41.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:05226894a26f6f27e1deb735d7308f74ef5fa3a6de3e0135bb66cdcaee88f64b", size = 2107836 }, + { url = "https://files.pythonhosted.org/packages/20/39/baba47f8d8b87081302498e610aefc37142ce6a1cc98b2ab6b931a162562/pydantic_core-2.41.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:85ff7911c6c3e2fd8d3779c50925f6406d770ea58ea6dde9c230d35b52b16b4a", size = 1904449 }, + { url = "https://files.pythonhosted.org/packages/50/32/9a3d87cae2c75a5178334b10358d631bd094b916a00a5993382222dbfd92/pydantic_core-2.41.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47f1f642a205687d59b52dc1a9a607f45e588f5a2e9eeae05edd80c7a8c47674", size = 1961750 }, + { url = "https://files.pythonhosted.org/packages/27/42/a96c9d793a04cf2a9773bff98003bb154087b94f5530a2ce6063ecfec583/pydantic_core-2.41.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df11c24e138876ace5ec6043e5cae925e34cf38af1a1b3d63589e8f7b5f5cdc4", size = 2063305 }, + { url = "https://files.pythonhosted.org/packages/3e/8d/028c4b7d157a005b1f52c086e2d4b0067886b213c86220c1153398dbdf8f/pydantic_core-2.41.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f0bf7f5c8f7bf345c527e8a0d72d6b26eda99c1227b0c34e7e59e181260de31", size = 2228959 }, + { url = "https://files.pythonhosted.org/packages/08/f7/ee64cda8fcc9ca3f4716e6357144f9ee71166775df582a1b6b738bf6da57/pydantic_core-2.41.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82b887a711d341c2c47352375d73b029418f55b20bd7815446d175a70effa706", size = 2345421 }, + { url = "https://files.pythonhosted.org/packages/13/c0/e8ec05f0f5ee7a3656973ad9cd3bc73204af99f6512c1a4562f6fb4b3f7d/pydantic_core-2.41.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b5f1d5d6bbba484bdf220c72d8ecd0be460f4bd4c5e534a541bb2cd57589fb8b", size = 2065288 }, + { url = "https://files.pythonhosted.org/packages/0a/25/d77a73ff24e2e4fcea64472f5e39b0402d836da9b08b5361a734d0153023/pydantic_core-2.41.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2bf1917385ebe0f968dc5c6ab1375886d56992b93ddfe6bf52bff575d03662be", size = 2189759 }, + { url = "https://files.pythonhosted.org/packages/66/45/4a4ebaaae12a740552278d06fe71418c0f2869537a369a89c0e6723b341d/pydantic_core-2.41.1-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:4f94f3ab188f44b9a73f7295663f3ecb8f2e2dd03a69c8f2ead50d37785ecb04", size = 2140747 }, + { url = "https://files.pythonhosted.org/packages/da/6d/b727ce1022f143194a36593243ff244ed5a1eb3c9122296bf7e716aa37ba/pydantic_core-2.41.1-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:3925446673641d37c30bd84a9d597e49f72eacee8b43322c8999fa17d5ae5bc4", size = 2327416 }, + { url = "https://files.pythonhosted.org/packages/6f/8c/02df9d8506c427787059f87c6c7253435c6895e12472a652d9616ee0fc95/pydantic_core-2.41.1-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:49bd51cc27adb980c7b97357ae036ce9b3c4d0bb406e84fbe16fb2d368b602a8", size = 2318138 }, + { url = "https://files.pythonhosted.org/packages/98/67/0cf429a7d6802536941f430e6e3243f6d4b68f41eeea4b242372f1901794/pydantic_core-2.41.1-cp314-cp314-win32.whl", hash = "sha256:a31ca0cd0e4d12ea0df0077df2d487fc3eb9d7f96bbb13c3c5b88dcc21d05159", size = 1998429 }, + { url = "https://files.pythonhosted.org/packages/38/60/742fef93de5d085022d2302a6317a2b34dbfe15258e9396a535c8a100ae7/pydantic_core-2.41.1-cp314-cp314-win_amd64.whl", hash = "sha256:1b5c4374a152e10a22175d7790e644fbd8ff58418890e07e2073ff9d4414efae", size = 2028870 }, + { url = "https://files.pythonhosted.org/packages/31/38/cdd8ccb8555ef7720bd7715899bd6cfbe3c29198332710e1b61b8f5dd8b8/pydantic_core-2.41.1-cp314-cp314-win_arm64.whl", hash = "sha256:4fee76d757639b493eb600fba668f1e17475af34c17dd61db7a47e824d464ca9", size = 1974275 }, + { url = "https://files.pythonhosted.org/packages/e7/7e/8ac10ccb047dc0221aa2530ec3c7c05ab4656d4d4bd984ee85da7f3d5525/pydantic_core-2.41.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f9b9c968cfe5cd576fdd7361f47f27adeb120517e637d1b189eea1c3ece573f4", size = 1875124 }, + { url = "https://files.pythonhosted.org/packages/c3/e4/7d9791efeb9c7d97e7268f8d20e0da24d03438a7fa7163ab58f1073ba968/pydantic_core-2.41.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1ebc7ab67b856384aba09ed74e3e977dded40e693de18a4f197c67d0d4e6d8e", size = 2043075 }, + { url = "https://files.pythonhosted.org/packages/2d/c3/3f6e6b2342ac11ac8cd5cb56e24c7b14afa27c010e82a765ffa5f771884a/pydantic_core-2.41.1-cp314-cp314t-win_amd64.whl", hash = "sha256:8ae0dc57b62a762985bc7fbf636be3412394acc0ddb4ade07fe104230f1b9762", size = 1995341 }, + { url = "https://files.pythonhosted.org/packages/aa/d2/90421a4749f15aa4f06dd1d25a6419b91b181ae7994a4e7c4ed0a6415057/pydantic_core-2.41.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:10ce489cf09a4956a1549af839b983edc59b0f60e1b068c21b10154e58f54f80", size = 2114974 }, + { url = "https://files.pythonhosted.org/packages/39/6a/3b5c2ba43da5380f252b35f7e74851e1379f4935c8bccbbda05992b5fe4d/pydantic_core-2.41.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ff548c908caffd9455fd1342366bcf8a1ec8a3fca42f35c7fc60883d6a901074", size = 1940064 }, + { url = "https://files.pythonhosted.org/packages/81/a9/050595183529316cf95d0f97662a4fe782dbea5f31dba0cf366015b67fad/pydantic_core-2.41.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d43bf082025082bda13be89a5f876cc2386b7727c7b322be2d2b706a45cea8e", size = 1976637 }, + { url = "https://files.pythonhosted.org/packages/46/a8/846a8e466edd841c67f11f0ae738ca5c5d87968f6d8630bc449e2e6e11f2/pydantic_core-2.41.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:666aee751faf1c6864b2db795775dd67b61fdcf646abefa309ed1da039a97209", size = 2069274 }, + { url = "https://files.pythonhosted.org/packages/4c/dc/19d01747082daf3667f952b6deee73e9e63338caa9c61442558cbdf8c876/pydantic_core-2.41.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b83aaeff0d7bde852c32e856f3ee410842ebc08bc55c510771d87dcd1c01e1ed", size = 2255302 }, + { url = "https://files.pythonhosted.org/packages/fa/99/0d4f031aeddf2cf03a5eb8eafde50147259067716c32174551b786aa72e1/pydantic_core-2.41.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:055c7931b0329cb8acde20cdde6d9c2cbc2a02a0a8e54a792cddd91e2ea92c65", size = 2386549 }, + { url = "https://files.pythonhosted.org/packages/09/7f/027061a060718733a6c016e7d4acc864c8bb69f0092d9b3da7e3888b102f/pydantic_core-2.41.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:530bbb1347e3e5ca13a91ac087c4971d7da09630ef8febd27a20a10800c2d06d", size = 2079817 }, + { url = "https://files.pythonhosted.org/packages/3a/5e/791c16d5e2a0b394c2c236f7d2556dbc381f8666bc12db7d35dc051c67e3/pydantic_core-2.41.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65a0ea16cfea7bfa9e43604c8bd726e63a3788b61c384c37664b55209fcb1d74", size = 2196276 }, + { url = "https://files.pythonhosted.org/packages/a3/99/2c7010145da82fdd30955c1c0e1e75723ca7aef32b52f2565383fd2347d2/pydantic_core-2.41.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8fa93fadff794c6d15c345c560513b160197342275c6d104cc879f932b978afc", size = 2157417 }, + { url = "https://files.pythonhosted.org/packages/c6/df/b8f2ac7fa15479e989d0c2ea88e5e28eeb923096b2462804b9113bce51b5/pydantic_core-2.41.1-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:c8a1af9ac51969a494c6a82b563abae6859dc082d3b999e8fa7ba5ee1b05e8e8", size = 2333884 }, + { url = "https://files.pythonhosted.org/packages/60/e8/06387d852bf67402fb0129b3297aa0c358aa9647e59f795c0965a7bedefe/pydantic_core-2.41.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:30edab28829703f876897c9471a857e43d847b8799c3c9e2fbce644724b50aa4", size = 2330735 }, + { url = "https://files.pythonhosted.org/packages/07/41/8964006fd8897df13cb0eec374bda053d1936cbc81315acdd755d85c99d5/pydantic_core-2.41.1-cp39-cp39-win32.whl", hash = "sha256:84d0ff869f98be2e93efdf1ae31e5a15f0926d22af8677d51676e373abbfe57a", size = 1992855 }, + { url = "https://files.pythonhosted.org/packages/d3/c9/0f68c22ba0cac693326a7de73f04c7543886e0b240e2320f8ced861f0c3d/pydantic_core-2.41.1-cp39-cp39-win_amd64.whl", hash = "sha256:b5674314987cdde5a5511b029fa5fb1556b3d147a367e01dd583b19cfa8e35df", size = 2030219 }, + { url = "https://files.pythonhosted.org/packages/16/89/d0afad37ba25f5801735af1472e650b86baad9fe807a42076508e4824a2a/pydantic_core-2.41.1-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:68f2251559b8efa99041bb63571ec7cdd2d715ba74cc82b3bc9eff824ebc8bf0", size = 2124001 }, + { url = "https://files.pythonhosted.org/packages/8e/c4/08609134b34520568ddebb084d9ed0a2a3f5f52b45739e6e22cb3a7112eb/pydantic_core-2.41.1-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:c7bc140c596097cb53b30546ca257dbe3f19282283190b1b5142928e5d5d3a20", size = 1941841 }, + { url = "https://files.pythonhosted.org/packages/2a/43/94a4877094e5fe19a3f37e7e817772263e2c573c94f1e3fa2b1eee56ef3b/pydantic_core-2.41.1-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2896510fce8f4725ec518f8b9d7f015a00db249d2fd40788f442af303480063d", size = 1961129 }, + { url = "https://files.pythonhosted.org/packages/a2/30/23a224d7e25260eb5f69783a63667453037e07eb91ff0e62dabaadd47128/pydantic_core-2.41.1-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ced20e62cfa0f496ba68fa5d6c7ee71114ea67e2a5da3114d6450d7f4683572a", size = 2148770 }, + { url = "https://files.pythonhosted.org/packages/2b/3e/a51c5f5d37b9288ba30683d6e96f10fa8f1defad1623ff09f1020973b577/pydantic_core-2.41.1-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:b04fa9ed049461a7398138c604b00550bc89e3e1151d84b81ad6dc93e39c4c06", size = 2115344 }, + { url = "https://files.pythonhosted.org/packages/5a/bd/389504c9e0600ef4502cd5238396b527afe6ef8981a6a15cd1814fc7b434/pydantic_core-2.41.1-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:b3b7d9cfbfdc43c80a16638c6dc2768e3956e73031fca64e8e1a3ae744d1faeb", size = 1927994 }, + { url = "https://files.pythonhosted.org/packages/ff/9c/5111c6b128861cb792a4c082677e90dac4f2e090bb2e2fe06aa5b2d39027/pydantic_core-2.41.1-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eec83fc6abef04c7f9bec616e2d76ee9a6a4ae2a359b10c21d0f680e24a247ca", size = 1959394 }, + { url = "https://files.pythonhosted.org/packages/14/3f/cfec8b9a0c48ce5d64409ec5e1903cb0b7363da38f14b41de2fcb3712700/pydantic_core-2.41.1-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6771a2d9f83c4038dfad5970a3eef215940682b2175e32bcc817bdc639019b28", size = 2147365 }, + { url = "https://files.pythonhosted.org/packages/d4/31/f403d7ca8352e3e4df352ccacd200f5f7f7fe81cef8e458515f015091625/pydantic_core-2.41.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:fabcbdb12de6eada8d6e9a759097adb3c15440fafc675b3e94ae5c9cb8d678a0", size = 2114268 }, + { url = "https://files.pythonhosted.org/packages/6e/b5/334473b6d2810df84db67f03d4f666acacfc538512c2d2a254074fee0889/pydantic_core-2.41.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:80e97ccfaf0aaf67d55de5085b0ed0d994f57747d9d03f2de5cc9847ca737b08", size = 1935786 }, + { url = "https://files.pythonhosted.org/packages/ea/5e/45513e4dc621f47397cfa5fef12ba8fa5e8b1c4c07f2ff2a5fef8ff81b25/pydantic_core-2.41.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34df1fe8fea5d332484a763702e8b6a54048a9d4fe6ccf41e34a128238e01f52", size = 1971995 }, + { url = "https://files.pythonhosted.org/packages/22/e3/f1797c168e5f52b973bed1c585e99827a22d5e579d1ed57d51bc15b14633/pydantic_core-2.41.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:421b5595f845842fc093f7250e24ee395f54ca62d494fdde96f43ecf9228ae01", size = 2191264 }, + { url = "https://files.pythonhosted.org/packages/bb/e1/24ef4c3b4ab91c21c3a09a966c7d2cffe101058a7bfe5cc8b2c7c7d574e2/pydantic_core-2.41.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dce8b22663c134583aaad24827863306a933f576c79da450be3984924e2031d1", size = 2152430 }, + { url = "https://files.pythonhosted.org/packages/35/74/70c1e225d67f7ef3fdba02c506d9011efaf734020914920b2aa3d1a45e61/pydantic_core-2.41.1-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:300a9c162fea9906cc5c103893ca2602afd84f0ec90d3be36f4cc360125d22e1", size = 2324691 }, + { url = "https://files.pythonhosted.org/packages/c8/bf/dd4d21037c8bef0d8cce90a86a3f2dcb011c30086db2a10113c3eea23eba/pydantic_core-2.41.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e019167628f6e6161ae7ab9fb70f6d076a0bf0d55aa9b20833f86a320c70dd65", size = 2324493 }, + { url = "https://files.pythonhosted.org/packages/7e/78/3093b334e9c9796c8236a4701cd2ddef1c56fb0928fe282a10c797644380/pydantic_core-2.41.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:13ab9cc2de6f9d4ab645a050ae5aee61a2424ac4d3a16ba23d4c2027705e0301", size = 2146156 }, + { url = "https://files.pythonhosted.org/packages/e6/6c/fa3e45c2b054a1e627a89a364917f12cbe3abc3e91b9004edaae16e7b3c5/pydantic_core-2.41.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:af2385d3f98243fb733862f806c5bb9122e5fba05b373e3af40e3c82d711cef1", size = 2112094 }, + { url = "https://files.pythonhosted.org/packages/e5/17/7eebc38b4658cc8e6902d0befc26388e4c2a5f2e179c561eeb43e1922c7b/pydantic_core-2.41.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:6550617a0c2115be56f90c31a5370261d8ce9dbf051c3ed53b51172dd34da696", size = 1935300 }, + { url = "https://files.pythonhosted.org/packages/2b/00/9fe640194a1717a464ab861d43595c268830f98cb1e2705aa134b3544b70/pydantic_core-2.41.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc17b6ecf4983d298686014c92ebc955a9f9baf9f57dad4065e7906e7bee6222", size = 1970417 }, + { url = "https://files.pythonhosted.org/packages/b2/ad/f4cdfaf483b78ee65362363e73b6b40c48e067078d7b146e8816d5945ad6/pydantic_core-2.41.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:42ae9352cf211f08b04ea110563d6b1e415878eea5b4c70f6bdb17dca3b932d2", size = 2190745 }, + { url = "https://files.pythonhosted.org/packages/cb/c1/18f416d40a10f44e9387497ba449f40fdb1478c61ba05c4b6bdb82300362/pydantic_core-2.41.1-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e82947de92068b0a21681a13dd2102387197092fbe7defcfb8453e0913866506", size = 2150888 }, + { url = "https://files.pythonhosted.org/packages/42/30/134c8a921630d8a88d6f905a562495a6421e959a23c19b0f49b660801d67/pydantic_core-2.41.1-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:e244c37d5471c9acdcd282890c6c4c83747b77238bfa19429b8473586c907656", size = 2324489 }, + { url = "https://files.pythonhosted.org/packages/9c/48/a9263aeaebdec81e941198525b43edb3b44f27cfa4cb8005b8d3eb8dec72/pydantic_core-2.41.1-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1e798b4b304a995110d41ec93653e57975620ccb2842ba9420037985e7d7284e", size = 2322763 }, + { url = "https://files.pythonhosted.org/packages/1d/62/755d2bd2593f701c5839fc084e9c2c5e2418f460383ad04e3b5d0befc3ca/pydantic_core-2.41.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f1fc716c0eb1663c59699b024428ad5ec2bcc6b928527b8fe28de6cb89f47efb", size = 2144046 }, ] [[package]] @@ -710,23 +724,23 @@ wheels = [ [[package]] name = "typing-extensions" -version = "4.12.2" +version = "4.15.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391 } wheels = [ - { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614 }, ] [[package]] name = "typing-inspection" -version = "0.4.0" +version = "0.4.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222 } +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949 } wheels = [ - { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125 }, + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611 }, ] [[package]] From a2ab163412d50eebcfafc6641c6160c42749cce1 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Sat, 11 Oct 2025 08:37:13 +0000 Subject: [PATCH 08/38] [autofix.ci] apply automated fixes --- pdoc/doc.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pdoc/doc.py b/pdoc/doc.py index cf638e33..5d87a2e7 100644 --- a/pdoc/doc.py +++ b/pdoc/doc.py @@ -44,6 +44,7 @@ from typing import get_origin import warnings +from pdoc import _pydantic from pdoc import doc_ast from pdoc import doc_pyi from pdoc import extract @@ -57,8 +58,6 @@ from pdoc.doc_types import resolve_annotations from pdoc.doc_types import safe_eval_type -from pdoc import _pydantic - _PYDANTIC_ENABLED: bool try: # pragma: no cover From 83f467cd7a5af8a342ea0bf3057e3663944761ce Mon Sep 17 00:00:00 2001 From: Jonathan Jin Date: Sat, 11 Oct 2025 04:46:48 -0400 Subject: [PATCH 09/38] fix lint --- pdoc/_pydantic.py | 16 ++++++++-------- pdoc/doc.py | 9 --------- 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/pdoc/_pydantic.py b/pdoc/_pydantic.py index 65f65729..1307153f 100644 --- a/pdoc/_pydantic.py +++ b/pdoc/_pydantic.py @@ -1,16 +1,16 @@ """Work with Pydantic models.""" -_PYDANTIC_ENABLED: bool +import importlib +from typing import Final -try: # pragma: no cover - import pydantic -except ImportError: # pragma: no cover - _PYDANTIC_ENABLED = False -finally: # pragma: no cover - _PYDANTIC_ENABLED = True +_PYDANTIC_ENABLED: Final[bool] = importlib.util.find_spec("pydantic") is not None +"""True when pydantic is found on the PYTHONPATH.""" +if _PYDANTIC_ENABLED: + import pydantic -_IGNORED_FIELDS = ["__fields__"] +_IGNORED_FIELDS: Final[list[str]] = ["__fields__"] +"""Fields to ignore when generating docs, e.g. those that emit deprecation warnings.""" def default_value(parent, name, obj): diff --git a/pdoc/doc.py b/pdoc/doc.py index 5d87a2e7..8ea6d259 100644 --- a/pdoc/doc.py +++ b/pdoc/doc.py @@ -58,15 +58,6 @@ from pdoc.doc_types import resolve_annotations from pdoc.doc_types import safe_eval_type -_PYDANTIC_ENABLED: bool - -try: # pragma: no cover - import pydantic -except ImportError: # pragma: no cover - _PYDANTIC_ENABLED = False -finally: # pragma: no cover - _PYDANTIC_ENABLED = True - def _include_fullname_in_traceback(f): """ From 538111676e35108b1ebb1ab1127b07004c239216 Mon Sep 17 00:00:00 2001 From: Jonathan Jin Date: Sat, 11 Oct 2025 04:49:20 -0400 Subject: [PATCH 10/38] fix importlib import --- pdoc/_pydantic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdoc/_pydantic.py b/pdoc/_pydantic.py index 1307153f..d21752ad 100644 --- a/pdoc/_pydantic.py +++ b/pdoc/_pydantic.py @@ -1,6 +1,6 @@ """Work with Pydantic models.""" -import importlib +import importlib.util from typing import Final _PYDANTIC_ENABLED: Final[bool] = importlib.util.find_spec("pydantic") is not None From adbe8532ce392278802f07a344d706bb48955050 Mon Sep 17 00:00:00 2001 From: Jonathan Jin Date: Sat, 11 Oct 2025 04:55:43 -0400 Subject: [PATCH 11/38] mark generated files --- pdoc/.gitattributes | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 pdoc/.gitattributes diff --git a/pdoc/.gitattributes b/pdoc/.gitattributes new file mode 100644 index 00000000..2fa246d7 --- /dev/null +++ b/pdoc/.gitattributes @@ -0,0 +1,2 @@ +test/testdata/*.html linguist-generated=true +test/testdata/*.txt linguist-generated=true From 10c35b80787270247b3ddac43e907ad66318716a Mon Sep 17 00:00:00 2001 From: Jonathan Jin Date: Sat, 11 Oct 2025 05:27:20 -0400 Subject: [PATCH 12/38] suppress BaseModel fields --- pdoc/doc.py | 10 +- test/testdata/with_pydantic.html | 2 +- test/testdata/with_pydantic.txt | 163 ------------------------------- 3 files changed, 8 insertions(+), 167 deletions(-) diff --git a/pdoc/doc.py b/pdoc/doc.py index 8ea6d259..e3476367 100644 --- a/pdoc/doc.py +++ b/pdoc/doc.py @@ -256,11 +256,15 @@ def members(self) -> dict[str, Doc]: """ members: dict[str, Doc] = {} for name, obj in self._member_objects.items(): - if _pydantic._PYDANTIC_ENABLED and name in _pydantic._IGNORED_FIELDS: - continue - qualname = f"{self.qualname}.{name}".lstrip(".") taken_from = self._taken_from(name, obj) + + if _pydantic._PYDANTIC_ENABLED and ( + name in _pydantic._IGNORED_FIELDS + or taken_from[0].startswith("pydantic") + ): + continue + doc: Doc[Any] is_classmethod = isinstance(obj, classmethod) diff --git a/test/testdata/with_pydantic.html b/test/testdata/with_pydantic.html index f3633545..d3a99683 100644 --- a/test/testdata/with_pydantic.html +++ b/test/testdata/with_pydantic.html @@ -104,7 +104,7 @@

Attributes: __class_vars__: The names of the class variables defined on the model. __private_attributes__: Metadata about the private attributes of the model. - __signature__: The synthesized __init__ [Signature][inspect.Signature] of the model.

+ __signature__: The synthesized __init__ [Signature][inspect.Signature] of the model.

__pydantic_complete__: Whether model building is completed, or if there are still undefined fields.
 __pydantic_core_schema__: The core schema of the model.
diff --git a/test/testdata/with_pydantic.txt b/test/testdata/with_pydantic.txt
index 5f4f768d..666ac126 100644
--- a/test/testdata/with_pydantic.txt
+++ b/test/testdata/with_pydantic.txt
@@ -1,170 +1,7 @@
 
         
         
         
-        
-        
-        
-        
-        <@classmethod class def model_construct(cls, _fields_set: set[str] | None = None, **values: Any) -> Self: ...  # inherited from pydantic.main.BaseModel.model_construct, Creates a new instan…>
-         Self: ...  # inherited from pydantic.main.BaseModel.model_copy, !!! abstract "Usage …>
-         dict[str, typing.Any]: ...  # inherited from pydantic.main.BaseModel.model_dump, !!! abstract "Usage …>
-         str: ...  # inherited from pydantic.main.BaseModel.model_dump_json, !!! abstract "Usage …>
-        <@classmethod class def model_json_schema(
-            cls,
-            by_alias: bool = True,
-            ref_template: str = '#/$defs/{model}',
-            schema_generator: type[pydantic.json_schema.GenerateJsonSchema] = ,
-            mode: Literal['validation', 'serialization'] = 'validation',
-            *,
-            union_format: Literal['any_of', 'primitive_type_array'] = 'any_of'
-        ) -> dict[str, typing.Any]: ...  # inherited from pydantic.main.BaseModel.model_json_schema, Generates a JSON sch…>
-        <@classmethod class def model_parametrized_name(cls, params: tuple[type[typing.Any], ...]) -> str: ...  # inherited from pydantic.main.BaseModel.model_parametrized_name, Compute the class na…>
-         None: ...  # inherited from pydantic.main.BaseModel.model_post_init, Override this method…>
-        <@classmethod class def model_rebuild(
-            cls,
-            *,
-            force: bool = False,
-            raise_errors: bool = True,
-            _parent_namespace_depth: int = 2,
-            _types_namespace: Mapping[str, typing.Any] | None = None
-        ) -> bool | None: ...  # inherited from pydantic.main.BaseModel.model_rebuild, Try to rebuild the p…>
-        <@classmethod class def model_validate(
-            cls,
-            obj: Any,
-            *,
-            strict: bool | None = None,
-            extra: Optional[Literal['allow', 'ignore', 'forbid']] = None,
-            from_attributes: bool | None = None,
-            context: typing.Any | None = None,
-            by_alias: bool | None = None,
-            by_name: bool | None = None
-        ) -> Self: ...  # inherited from pydantic.main.BaseModel.model_validate, Validate a pydantic …>
-        <@classmethod class def model_validate_json(
-            cls,
-            json_data: str | bytes | bytearray,
-            *,
-            strict: bool | None = None,
-            extra: Optional[Literal['allow', 'ignore', 'forbid']] = None,
-            context: typing.Any | None = None,
-            by_alias: bool | None = None,
-            by_name: bool | None = None
-        ) -> Self: ...  # inherited from pydantic.main.BaseModel.model_validate_json, !!! abstract "Usage …>
-        <@classmethod class def model_validate_strings(
-            cls,
-            obj: Any,
-            *,
-            strict: bool | None = None,
-            extra: Optional[Literal['allow', 'ignore', 'forbid']] = None,
-            context: typing.Any | None = None,
-            by_alias: bool | None = None,
-            by_name: bool | None = None
-        ) -> Self: ...  # inherited from pydantic.main.BaseModel.model_validate_strings, Validate the given o…>
-        <@typing_extensions.deprecated('The `dict` method is deprecated; use `model_dump` instead.', category=None) method def dict(
-            self,
-            *,
-            include: Union[set[int], set[str], Mapping[int, Union[set[int], set[str], Mapping[int, Union[ForwardRef('IncEx'), bool]], Mapping[str, Union[ForwardRef('IncEx'), bool]], bool]], Mapping[str, Union[set[int], set[str], Mapping[int, Union[ForwardRef('IncEx'), bool]], Mapping[str, Union[ForwardRef('IncEx'), bool]], bool]], NoneType] = None,
-            exclude: Union[set[int], set[str], Mapping[int, Union[set[int], set[str], Mapping[int, Union[ForwardRef('IncEx'), bool]], Mapping[str, Union[ForwardRef('IncEx'), bool]], bool]], Mapping[str, Union[set[int], set[str], Mapping[int, Union[ForwardRef('IncEx'), bool]], Mapping[str, Union[ForwardRef('IncEx'), bool]], bool]], NoneType] = None,
-            by_alias: bool = False,
-            exclude_unset: bool = False,
-            exclude_defaults: bool = False,
-            exclude_none: bool = False
-        ) -> Dict[str, Any]: ...  # inherited from pydantic.main.BaseModel.dict>
-        <@typing_extensions.deprecated('The `json` method is deprecated; use `model_dump_json` instead.', category=None) method def json(
-            self,
-            *,
-            include: Union[set[int], set[str], Mapping[int, Union[set[int], set[str], Mapping[int, Union[ForwardRef('IncEx'), bool]], Mapping[str, Union[ForwardRef('IncEx'), bool]], bool]], Mapping[str, Union[set[int], set[str], Mapping[int, Union[ForwardRef('IncEx'), bool]], Mapping[str, Union[ForwardRef('IncEx'), bool]], bool]], NoneType] = None,
-            exclude: Union[set[int], set[str], Mapping[int, Union[set[int], set[str], Mapping[int, Union[ForwardRef('IncEx'), bool]], Mapping[str, Union[ForwardRef('IncEx'), bool]], bool]], Mapping[str, Union[set[int], set[str], Mapping[int, Union[ForwardRef('IncEx'), bool]], Mapping[str, Union[ForwardRef('IncEx'), bool]], bool]], NoneType] = None,
-            by_alias: bool = False,
-            exclude_unset: bool = False,
-            exclude_defaults: bool = False,
-            exclude_none: bool = False,
-            encoder: Optional[Callable[[Any], Any]] = PydanticUndefined,
-            models_as_dict: bool = PydanticUndefined,
-            **dumps_kwargs: Any
-        ) -> str: ...  # inherited from pydantic.main.BaseModel.json>
-        <@classmethod @typing_extensions.deprecated('The `parse_obj` method is deprecated; use `model_validate` instead.', category=None) class def parse_obj(cls, obj: Any) -> Self: ...  # inherited from pydantic.main.BaseModel.parse_obj>
-        <@classmethod @typing_extensions.deprecated('The `parse_raw` method is deprecated; if your data is JSON use `model_validate_json`, otherwise load the data then use `model_validate` instead.', category=None) class def parse_raw(
-            cls,
-            b: str | bytes,
-            *,
-            content_type: str | None = None,
-            encoding: str = 'utf8',
-            proto: pydantic.deprecated.parse.Protocol | None = None,
-            allow_pickle: bool = False
-        ) -> Self: ...  # inherited from pydantic.main.BaseModel.parse_raw>
-        <@classmethod @typing_extensions.deprecated('The `parse_file` method is deprecated; load the data from file, then if your data is JSON use `model_validate_json`, otherwise `model_validate` instead.', category=None) class def parse_file(
-            cls,
-            path: str | pathlib._local.Path,
-            *,
-            content_type: str | None = None,
-            encoding: str = 'utf8',
-            proto: pydantic.deprecated.parse.Protocol | None = None,
-            allow_pickle: bool = False
-        ) -> Self: ...  # inherited from pydantic.main.BaseModel.parse_file>
-        <@classmethod @typing_extensions.deprecated("The `from_orm` method is deprecated; set `model_config['from_attributes']=True` and use `model_validate` instead.", category=None) class def from_orm(cls, obj: Any) -> Self: ...  # inherited from pydantic.main.BaseModel.from_orm>
-        <@classmethod @typing_extensions.deprecated('The `construct` method is deprecated; use `model_construct` instead.', category=None) class def construct(cls, _fields_set: set[str] | None = None, **values: Any) -> Self: ...  # inherited from pydantic.main.BaseModel.construct>
-        <@typing_extensions.deprecated('The `copy` method is deprecated; use `model_copy` instead. See the docstring of `BaseModel.copy` for details about how to handle `include` and `exclude`.', category=None) method def copy(
-            self,
-            *,
-            include: Set[int] | Set[str] | Mapping[int, typing.Any] | Mapping[str, typing.Any] | None = None,
-            exclude: Set[int] | Set[str] | Mapping[int, typing.Any] | Mapping[str, typing.Any] | None = None,
-            update: Optional[Dict[str, Any]] = None,
-            deep: bool = False
-        ) -> Self: ...  # inherited from pydantic.main.BaseModel.copy, Returns a copy of th…>
-        <@classmethod @typing_extensions.deprecated('The `schema` method is deprecated; use `model_json_schema` instead.', category=None) class def schema(
-            cls,
-            by_alias: bool = True,
-            ref_template: str = '#/$defs/{model}'
-        ) -> Dict[str, Any]: ...  # inherited from pydantic.main.BaseModel.schema>
-        <@classmethod @typing_extensions.deprecated('The `schema_json` method is deprecated; use `model_json_schema` and json.dumps instead.', category=None) class def schema_json(
-            cls,
-            *,
-            by_alias: bool = True,
-            ref_template: str = '#/$defs/{model}',
-            **dumps_kwargs: Any
-        ) -> str: ...  # inherited from pydantic.main.BaseModel.schema_json>
-        <@classmethod @typing_extensions.deprecated('The `validate` method is deprecated; use `model_validate` instead.', category=None) class def validate(cls, value: Any) -> Self: ...  # inherited from pydantic.main.BaseModel.validate>
-        <@classmethod @typing_extensions.deprecated('The `update_forward_refs` method is deprecated; use `model_rebuild` instead.', category=None) class def update_forward_refs(cls, **localns: Any) -> None: ...  # inherited from pydantic.main.BaseModel.update_forward_refs>
     >
 >
\ No newline at end of file

From 3206e0f9ccb8b2b78dad55beead7d5662f0b0093 Mon Sep 17 00:00:00 2001
From: Jonathan Jin 
Date: Sat, 11 Oct 2025 05:38:15 -0400
Subject: [PATCH 13/38] harden

---
 pdoc/_pydantic.py |  4 ++++
 pdoc/doc.py       | 11 ++++++++---
 2 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/pdoc/_pydantic.py b/pdoc/_pydantic.py
index d21752ad..7f4e0051 100644
--- a/pdoc/_pydantic.py
+++ b/pdoc/_pydantic.py
@@ -13,6 +13,10 @@
 """Fields to ignore when generating docs, e.g. those that emit deprecation warnings."""
 
 
+def is_pydantic_model(obj):
+    return pydantic.BaseModel in obj.__bases__
+
+
 def default_value(parent, name, obj):
     if (
         _PYDANTIC_ENABLED
diff --git a/pdoc/doc.py b/pdoc/doc.py
index e3476367..cb1fae58 100644
--- a/pdoc/doc.py
+++ b/pdoc/doc.py
@@ -259,9 +259,14 @@ def members(self) -> dict[str, Doc]:
             qualname = f"{self.qualname}.{name}".lstrip(".")
             taken_from = self._taken_from(name, obj)
 
-            if _pydantic._PYDANTIC_ENABLED and (
-                name in _pydantic._IGNORED_FIELDS
-                or taken_from[0].startswith("pydantic")
+            if (
+                _pydantic._PYDANTIC_ENABLED
+                and self.kind == "class"
+                and _pydantic.is_pydantic_model(self.obj)
+                and (
+                    name in _pydantic._IGNORED_FIELDS
+                    or taken_from[0].startswith("pydantic")
+                )
             ):
                 continue
 

From 9f9e5d61d0a1c4a47881b4bd59ae24da89c9bcef Mon Sep 17 00:00:00 2001
From: Jonathan Jin 
Date: Sat, 11 Oct 2025 05:39:48 -0400
Subject: [PATCH 14/38] update snapshot

---
 test/testdata/with_pydantic.html | 48 ++++++++------------------------
 test/testdata/with_pydantic.py   |  2 ++
 test/testdata/with_pydantic.txt  |  2 +-
 3 files changed, 14 insertions(+), 38 deletions(-)

diff --git a/test/testdata/with_pydantic.html b/test/testdata/with_pydantic.html
index d3a99683..f5f499ed 100644
--- a/test/testdata/with_pydantic.html
+++ b/test/testdata/with_pydantic.html
@@ -69,10 +69,12 @@ 

6 7 8class Foo(pydantic.BaseModel): - 9 a: int = pydantic.Field(default=1, description="Docstring for a") + 9 """Foo class documentation.""" 10 -11 b: int = 2 -12 """Docstring for b.""" +11 a: int = pydantic.Field(default=1, description="Docstring for a") +12 +13 b: int = 2 +14 """Docstring for b."""

@@ -89,44 +91,16 @@

 9class Foo(pydantic.BaseModel):
-10    a: int = pydantic.Field(default=1, description="Docstring for a")
+10    """Foo class documentation."""
 11
-12    b: int = 2
-13    """Docstring for b."""
+12    a: int = pydantic.Field(default=1, description="Docstring for a")
+13
+14    b: int = 2
+15    """Docstring for b."""
 
-

!!! abstract "Usage Documentation" - Models

- -

A base class for creating Pydantic models.

- -

Attributes: - __class_vars__: The names of the class variables defined on the model. - __private_attributes__: Metadata about the private attributes of the model. - __signature__: The synthesized __init__ [Signature][inspect.Signature] of the model.

- -
__pydantic_complete__: Whether model building is completed, or if there are still undefined fields.
-__pydantic_core_schema__: The core schema of the model.
-__pydantic_custom_init__: Whether the model has a custom `__init__` function.
-__pydantic_decorators__: Metadata containing the decorators defined on the model.
-    This replaces `Model.__validators__` and `Model.__root_validators__` from Pydantic V1.
-__pydantic_generic_metadata__: Metadata for generic models; contains data used for a similar purpose to
-    __args__, __origin__, __parameters__ in typing-module generics. May eventually be replaced by these.
-__pydantic_parent_namespace__: Parent namespace of the model, used for automatic rebuilding of models.
-__pydantic_post_init__: The name of the post-init method for the model, if defined.
-__pydantic_root_model__: Whether the model is a [`RootModel`][pydantic.root_model.RootModel].
-__pydantic_serializer__: The `pydantic-core` `SchemaSerializer` used to dump instances of the model.
-__pydantic_validator__: The `pydantic-core` `SchemaValidator` used to validate instances of the model.
-
-__pydantic_fields__: A dictionary of field names and their corresponding [`FieldInfo`][pydantic.fields.FieldInfo] objects.
-__pydantic_computed_fields__: A dictionary of computed field names and their corresponding [`ComputedFieldInfo`][pydantic.fields.ComputedFieldInfo] objects.
-
-__pydantic_extra__: A dictionary containing extra values, if [`extra`][pydantic.config.ConfigDict.extra]
-    is set to `'allow'`.
-__pydantic_fields_set__: The names of fields explicitly set during instantiation.
-__pydantic_private__: Values of private attributes set on the model instance.
-
+

Foo class documentation.

diff --git a/test/testdata/with_pydantic.py b/test/testdata/with_pydantic.py index 7130a045..227946a6 100644 --- a/test/testdata/with_pydantic.py +++ b/test/testdata/with_pydantic.py @@ -6,6 +6,8 @@ class Foo(pydantic.BaseModel): + """Foo class documentation.""" + a: int = pydantic.Field(default=1, description="Docstring for a") b: int = 2 diff --git a/test/testdata/with_pydantic.txt b/test/testdata/with_pydantic.txt index 666ac126..4ae68039 100644 --- a/test/testdata/with_pydantic.txt +++ b/test/testdata/with_pydantic.txt @@ -1,5 +1,5 @@ From 236e97dac1988e53631d573ca86e46214c6b7949 Mon Sep 17 00:00:00 2001 From: Jonathan Jin Date: Sat, 11 Oct 2025 05:41:20 -0400 Subject: [PATCH 15/38] add note --- pdoc/doc.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pdoc/doc.py b/pdoc/doc.py index cb1fae58..149196e9 100644 --- a/pdoc/doc.py +++ b/pdoc/doc.py @@ -259,6 +259,9 @@ def members(self) -> dict[str, Doc]: qualname = f"{self.qualname}.{name}".lstrip(".") taken_from = self._taken_from(name, obj) + # For Pydantic models, filter out all methods on the BaseModel + # class, as they are almost never relevant to the consumers of the + # inheriting model itself. if ( _pydantic._PYDANTIC_ENABLED and self.kind == "class" From b576d73e68c7245076700ff58706ceb48ace5649 Mon Sep 17 00:00:00 2001 From: Jonathan Jin Date: Sat, 11 Oct 2025 06:07:56 -0400 Subject: [PATCH 16/38] changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a01574d1..bd93e57e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ - Fix linking of identifiers that contain unicode characters. ([#831](https://github.com/mitmproxy/pdoc/issues/831), @iFreilicht) +- Add support for Pydantic-style field docstrings, + e.g. `pydantic.Field(description="...")` ## 2025-06-04: pdoc 15.0.4 From db7938d9b48dac461857d726b0108781c84b26ca Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Sat, 11 Oct 2025 10:08:35 +0000 Subject: [PATCH 17/38] [autofix.ci] apply automated fixes --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bd93e57e..642745b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ ([#831](https://github.com/mitmproxy/pdoc/issues/831), @iFreilicht) - Add support for Pydantic-style field docstrings, e.g. `pydantic.Field(description="...")` + ([#802](https://github.com/mitmproxy/pdoc/pull/802), @jinnovation) ## 2025-06-04: pdoc 15.0.4 From cdee9e5f3bc453c7e126bb7252a8c15b8d4ce55a Mon Sep 17 00:00:00 2001 From: Jonathan Jin Date: Sat, 11 Oct 2025 15:35:42 -0400 Subject: [PATCH 18/38] add docs --- pdoc/__init__.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/pdoc/__init__.py b/pdoc/__init__.py index 98cc3412..5af66194 100644 --- a/pdoc/__init__.py +++ b/pdoc/__init__.py @@ -260,6 +260,25 @@ class GoldenRetriever(Dog): Adding additional syntax elements is usually easy. If you feel that pdoc doesn't parse a docstring element properly, please amend `pdoc.docstrings` and send us a pull request! +## ...document Pydantic model fields? + +For [Pydantic models](https://docs.pydantic.dev/latest/concepts/models/), pdoc +will extract [field](https://docs.pydantic.dev/latest/concepts/fields/) +descriptions and treat them just like [documented +variables](#document-variables). For example, the following two Pydantic models +would have identical pdoc-rendered documentation: + +```python +from pydantic import BaseModel, Field + +class Foo(BaseModel): + a: int = Field(description="Docs for field a.") + +class OtherFoo(BaseModel): + a: int + """Docs for field a.""" + +``` ## ...render math formulas? From 010d26b07c220f8eaefc5672ad823e7f4de90786 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Sat, 11 Oct 2025 19:36:24 +0000 Subject: [PATCH 19/38] [autofix.ci] apply automated fixes --- test/testdata/with_pydantic.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/testdata/with_pydantic.html b/test/testdata/with_pydantic.html index f5f499ed..f87fdf2b 100644 --- a/test/testdata/with_pydantic.html +++ b/test/testdata/with_pydantic.html @@ -10,7 +10,7 @@ - +
From ee2a783a7bca5cf3f055b63a403c5c5df2388c5a Mon Sep 17 00:00:00 2001 From: Jonathan Jin Date: Sat, 11 Oct 2025 23:05:42 -0400 Subject: [PATCH 20/38] undo gitattributes --- pdoc/.gitattributes | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 pdoc/.gitattributes diff --git a/pdoc/.gitattributes b/pdoc/.gitattributes deleted file mode 100644 index 2fa246d7..00000000 --- a/pdoc/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -test/testdata/*.html linguist-generated=true -test/testdata/*.txt linguist-generated=true From 3f26ff715cfe4e44ad645e23e26d73003c998523 Mon Sep 17 00:00:00 2001 From: Jonathan Jin Date: Sat, 11 Oct 2025 23:06:16 -0400 Subject: [PATCH 21/38] Update pdoc/__init__.py Co-authored-by: Maximilian Hils --- pdoc/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdoc/__init__.py b/pdoc/__init__.py index 5af66194..b6326fd7 100644 --- a/pdoc/__init__.py +++ b/pdoc/__init__.py @@ -260,7 +260,7 @@ class GoldenRetriever(Dog): Adding additional syntax elements is usually easy. If you feel that pdoc doesn't parse a docstring element properly, please amend `pdoc.docstrings` and send us a pull request! -## ...document Pydantic model fields? +## ...document Pydantic models? For [Pydantic models](https://docs.pydantic.dev/latest/concepts/models/), pdoc will extract [field](https://docs.pydantic.dev/latest/concepts/fields/) From fb31c982fc644fe27c50034cf1baecf917c85cae Mon Sep 17 00:00:00 2001 From: Jonathan Jin Date: Sat, 11 Oct 2025 23:27:44 -0400 Subject: [PATCH 22/38] render docstring --- pdoc/_pydantic.py | 16 +++++++++ pdoc/doc.py | 17 ++++++--- test/testdata/with_pydantic.html | 60 +++++++++++++++++++------------- test/testdata/with_pydantic.py | 4 +++ test/testdata/with_pydantic.txt | 4 +-- 5 files changed, 70 insertions(+), 31 deletions(-) diff --git a/pdoc/_pydantic.py b/pdoc/_pydantic.py index 7f4e0051..b590f8ee 100644 --- a/pdoc/_pydantic.py +++ b/pdoc/_pydantic.py @@ -27,3 +27,19 @@ def default_value(parent, name, obj): return pydantic_fields[name].default if name in pydantic_fields else obj return obj + + +def get_field_docstring(parent, field_name) -> str: + if ( + _PYDANTIC_ENABLED + and isinstance(parent, type) + and issubclass(parent, pydantic.BaseModel) + ): + pydantic_fields = parent.__pydantic_fields__ + return ( + pydantic_fields[field_name].description + if field_name in pydantic_fields + else "" + ) + + return "" diff --git a/pdoc/doc.py b/pdoc/doc.py index 149196e9..540eec33 100644 --- a/pdoc/doc.py +++ b/pdoc/doc.py @@ -343,10 +343,19 @@ def members(self) -> dict[str, Doc]: default_value=default_value, taken_from=taken_from, ) - if self._var_docstrings.get(name): - doc.docstring = self._var_docstrings[name] - if self._func_docstrings.get(name) and not doc.docstring: - doc.docstring = self._func_docstrings[name] + + if ( + _pydantic._PYDANTIC_ENABLED + and self.kind == "class" + and _pydantic.is_pydantic_model(self.obj) + ): + doc.docstring = _pydantic.get_field_docstring(self.obj, name) + else: + if self._var_docstrings.get(name): + doc.docstring = self._var_docstrings[name] + if self._func_docstrings.get(name) and not doc.docstring: + doc.docstring = self._func_docstrings[name] + members[doc.name] = doc if isinstance(self, Module): diff --git a/test/testdata/with_pydantic.html b/test/testdata/with_pydantic.html index f87fdf2b..ed3ae7d5 100644 --- a/test/testdata/with_pydantic.html +++ b/test/testdata/with_pydantic.html @@ -27,13 +27,13 @@

API Documentation

Foo @@ -71,10 +71,15 @@

8class Foo(pydantic.BaseModel): 9 """Foo class documentation.""" 10 -11 a: int = pydantic.Field(default=1, description="Docstring for a") -12 -13 b: int = 2 -14 """Docstring for b.""" +11 model_config = pydantic.ConfigDict( +12 use_attribute_docstrings=True, +13 ) +14 """@private""" +15 +16 a: int = pydantic.Field(default=1, description="Docstring for a") +17 +18 b: int = 2 +19 """Docstring for b.""" @@ -93,10 +98,15 @@

 9class Foo(pydantic.BaseModel):
 10    """Foo class documentation."""
 11
-12    a: int = pydantic.Field(default=1, description="Docstring for a")
-13
-14    b: int = 2
-15    """Docstring for b."""
+12    model_config = pydantic.ConfigDict(
+13        use_attribute_docstrings=True,
+14    )
+15    """@private"""
+16
+17    a: int = pydantic.Field(default=1, description="Docstring for a")
+18
+19    b: int = 2
+20    """Docstring for b."""
 
@@ -104,42 +114,42 @@

-
+
- a: int = -1 + model_config = +{'use_attribute_docstrings': True}
- +
-
+
- b: int = -2 + a: int = +1
- + -

Docstring for b.

+

Docstring for a

-
+
- model_config: ClassVar[pydantic.config.ConfigDict] = -{} + b: int = +2
- + -

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

+

Docstring for b.

diff --git a/test/testdata/with_pydantic.py b/test/testdata/with_pydantic.py index 227946a6..9535c247 100644 --- a/test/testdata/with_pydantic.py +++ b/test/testdata/with_pydantic.py @@ -8,6 +8,10 @@ class Foo(pydantic.BaseModel): """Foo class documentation.""" + model_config = pydantic.ConfigDict( + use_attribute_docstrings=True, + ) + a: int = pydantic.Field(default=1, description="Docstring for a") b: int = 2 diff --git a/test/testdata/with_pydantic.txt b/test/testdata/with_pydantic.txt index 4ae68039..7bd89e2b 100644 --- a/test/testdata/with_pydantic.txt +++ b/test/testdata/with_pydantic.txt @@ -1,7 +1,7 @@ + + - > > \ No newline at end of file From 9327e1370f71877ea50aeafc88bbd6a39aca9f98 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Sun, 12 Oct 2025 03:28:45 +0000 Subject: [PATCH 23/38] [autofix.ci] apply automated fixes --- test/testdata/with_pydantic.html | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/test/testdata/with_pydantic.html b/test/testdata/with_pydantic.html index ed3ae7d5..e26de6c3 100644 --- a/test/testdata/with_pydantic.html +++ b/test/testdata/with_pydantic.html @@ -74,12 +74,11 @@

11 model_config = pydantic.ConfigDict( 12 use_attribute_docstrings=True, 13 ) -14 """@private""" -15 -16 a: int = pydantic.Field(default=1, description="Docstring for a") -17 -18 b: int = 2 -19 """Docstring for b.""" +14 +15 a: int = pydantic.Field(default=1, description="Docstring for a") +16 +17 b: int = 2 +18 """Docstring for b."""

@@ -101,12 +100,11 @@

12 model_config = pydantic.ConfigDict( 13 use_attribute_docstrings=True, 14 ) -15 """@private""" -16 -17 a: int = pydantic.Field(default=1, description="Docstring for a") -18 -19 b: int = 2 -20 """Docstring for b.""" +15 +16 a: int = pydantic.Field(default=1, description="Docstring for a") +17 +18 b: int = 2 +19 """Docstring for b."""

From 1795c406e1a236d4893c690f9921a90c66250caa Mon Sep 17 00:00:00 2001 From: Jonathan Jin Date: Sat, 11 Oct 2025 23:42:42 -0400 Subject: [PATCH 24/38] _pydantic.skip_field --- pdoc/_pydantic.py | 22 +++++++++++++++++++++- pdoc/doc.py | 16 +++++----------- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/pdoc/_pydantic.py b/pdoc/_pydantic.py index b590f8ee..018a920e 100644 --- a/pdoc/_pydantic.py +++ b/pdoc/_pydantic.py @@ -1,7 +1,7 @@ """Work with Pydantic models.""" import importlib.util -from typing import Final +from typing import Any, Final _PYDANTIC_ENABLED: Final[bool] = importlib.util.find_spec("pydantic") is not None """True when pydantic is found on the PYTHONPATH.""" @@ -43,3 +43,23 @@ def get_field_docstring(parent, field_name) -> str: ) return "" + + +def skip_field( + *, + parent_kind: str, + parent_obj: Any, + name: str, + taken_from: tuple[str, str], +) -> bool: + """For Pydantic models, filter out all methods on the BaseModel + class, as they are almost never relevant to the consumers of the + inheriting model itself. + """ + + return ( + _PYDANTIC_ENABLED + and parent_kind == "class" + and is_pydantic_model(parent_obj) + and (name in _IGNORED_FIELDS or taken_from[0].startswith("pydantic")) + ) diff --git a/pdoc/doc.py b/pdoc/doc.py index 540eec33..71da96f7 100644 --- a/pdoc/doc.py +++ b/pdoc/doc.py @@ -259,17 +259,11 @@ def members(self) -> dict[str, Doc]: qualname = f"{self.qualname}.{name}".lstrip(".") taken_from = self._taken_from(name, obj) - # For Pydantic models, filter out all methods on the BaseModel - # class, as they are almost never relevant to the consumers of the - # inheriting model itself. - if ( - _pydantic._PYDANTIC_ENABLED - and self.kind == "class" - and _pydantic.is_pydantic_model(self.obj) - and ( - name in _pydantic._IGNORED_FIELDS - or taken_from[0].startswith("pydantic") - ) + if _pydantic.skip_field( + parent_kind=self.kind, + parent_obj=self.obj, + name=name, + taken_from=taken_from, ): continue From 9a19f6e775daca610b262a002945fe2f1d55ab96 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Sun, 12 Oct 2025 03:43:34 +0000 Subject: [PATCH 25/38] [autofix.ci] apply automated fixes --- pdoc/_pydantic.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pdoc/_pydantic.py b/pdoc/_pydantic.py index 018a920e..dff59914 100644 --- a/pdoc/_pydantic.py +++ b/pdoc/_pydantic.py @@ -1,7 +1,8 @@ """Work with Pydantic models.""" import importlib.util -from typing import Any, Final +from typing import Any +from typing import Final _PYDANTIC_ENABLED: Final[bool] = importlib.util.find_spec("pydantic") is not None """True when pydantic is found on the PYTHONPATH.""" From 82d54fecb34a9d97eda41d91e69ebbe0959b9d40 Mon Sep 17 00:00:00 2001 From: Jonathan Jin Date: Sat, 11 Oct 2025 23:53:39 -0400 Subject: [PATCH 26/38] fix lint --- pdoc/_pydantic.py | 6 +++--- pdoc/doc.py | 8 ++++++-- test/testdata/with_pydantic.html | 4 +++- test/testdata/with_pydantic.txt | 2 +- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/pdoc/_pydantic.py b/pdoc/_pydantic.py index dff59914..ffbe1cc1 100644 --- a/pdoc/_pydantic.py +++ b/pdoc/_pydantic.py @@ -30,7 +30,7 @@ def default_value(parent, name, obj): return obj -def get_field_docstring(parent, field_name) -> str: +def get_field_docstring(parent, field_name) -> str | None: if ( _PYDANTIC_ENABLED and isinstance(parent, type) @@ -40,10 +40,10 @@ def get_field_docstring(parent, field_name) -> str: return ( pydantic_fields[field_name].description if field_name in pydantic_fields - else "" + else None ) - return "" + return None def skip_field( diff --git a/pdoc/doc.py b/pdoc/doc.py index 71da96f7..dc858939 100644 --- a/pdoc/doc.py +++ b/pdoc/doc.py @@ -338,17 +338,21 @@ def members(self) -> dict[str, Doc]: taken_from=taken_from, ) + _docstring: str | None = None if ( _pydantic._PYDANTIC_ENABLED and self.kind == "class" and _pydantic.is_pydantic_model(self.obj) ): - doc.docstring = _pydantic.get_field_docstring(self.obj, name) - else: + _docstring = _pydantic.get_field_docstring(self.obj, name) + + if _docstring is None: if self._var_docstrings.get(name): doc.docstring = self._var_docstrings[name] if self._func_docstrings.get(name) and not doc.docstring: doc.docstring = self._func_docstrings[name] + else: + doc.docstring = _docstring members[doc.name] = doc diff --git a/test/testdata/with_pydantic.html b/test/testdata/with_pydantic.html index e26de6c3..6f35feee 100644 --- a/test/testdata/with_pydantic.html +++ b/test/testdata/with_pydantic.html @@ -121,7 +121,9 @@

- +

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

+
+
diff --git a/test/testdata/with_pydantic.txt b/test/testdata/with_pydantic.txt index 7bd89e2b..5871a9d1 100644 --- a/test/testdata/with_pydantic.txt +++ b/test/testdata/with_pydantic.txt @@ -1,6 +1,6 @@ + > From 976c23694276ea07fd3e8d4b5798f3a675b667e3 Mon Sep 17 00:00:00 2001 From: Jonathan Jin Date: Sun, 12 Oct 2025 09:39:32 -0400 Subject: [PATCH 27/38] refining pydantic-installed detection logic --- pdoc/_pydantic.py | 29 +++++++++++++++++++---------- pdoc/doc.py | 5 ++--- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/pdoc/_pydantic.py b/pdoc/_pydantic.py index ffbe1cc1..39e25d73 100644 --- a/pdoc/_pydantic.py +++ b/pdoc/_pydantic.py @@ -1,26 +1,35 @@ """Work with Pydantic models.""" -import importlib.util from typing import Any from typing import Final +from typing import TypeVar -_PYDANTIC_ENABLED: Final[bool] = importlib.util.find_spec("pydantic") is not None -"""True when pydantic is found on the PYTHONPATH.""" +from pdoc.docstrings import AnyException -if _PYDANTIC_ENABLED: +try: import pydantic +except AnyException: + pydantic = None _IGNORED_FIELDS: Final[list[str]] = ["__fields__"] """Fields to ignore when generating docs, e.g. those that emit deprecation warnings.""" +T = TypeVar("T") -def is_pydantic_model(obj): + +def is_pydantic_model(obj) -> bool: return pydantic.BaseModel in obj.__bases__ -def default_value(parent, name, obj): +def default_value(parent, name: str, obj: T) -> T: + """Determine the default value of obj. + + If pydantic is not installed or the parent type is not a Pydantic model, + simply returns obj. + + """ if ( - _PYDANTIC_ENABLED + pydantic is not None and isinstance(parent, type) and issubclass(parent, pydantic.BaseModel) ): @@ -30,9 +39,9 @@ def default_value(parent, name, obj): return obj -def get_field_docstring(parent, field_name) -> str | None: +def get_field_docstring(parent, field_name: str) -> str | None: if ( - _PYDANTIC_ENABLED + pydantic is not None and isinstance(parent, type) and issubclass(parent, pydantic.BaseModel) ): @@ -59,7 +68,7 @@ def skip_field( """ return ( - _PYDANTIC_ENABLED + pydantic is not None and parent_kind == "class" and is_pydantic_model(parent_obj) and (name in _IGNORED_FIELDS or taken_from[0].startswith("pydantic")) diff --git a/pdoc/doc.py b/pdoc/doc.py index dc858939..e91fae6d 100644 --- a/pdoc/doc.py +++ b/pdoc/doc.py @@ -326,8 +326,7 @@ def members(self) -> dict[str, Doc]: else: default_value = obj - if _pydantic._PYDANTIC_ENABLED: - default_value = _pydantic.default_value(self.obj, name, obj) + default_value = _pydantic.default_value(self.obj, name, obj) doc = Variable( self.modulename, @@ -340,7 +339,7 @@ def members(self) -> dict[str, Doc]: _docstring: str | None = None if ( - _pydantic._PYDANTIC_ENABLED + _pydantic.pydantic is not None and self.kind == "class" and _pydantic.is_pydantic_model(self.obj) ): From 3506b48421822d721d4f955a1ec525651373ff01 Mon Sep 17 00:00:00 2001 From: Jonathan Jin Date: Sun, 12 Oct 2025 10:38:19 -0400 Subject: [PATCH 28/38] fix lint --- pdoc/_pydantic.py | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/pdoc/_pydantic.py b/pdoc/_pydantic.py index 39e25d73..24c91a27 100644 --- a/pdoc/_pydantic.py +++ b/pdoc/_pydantic.py @@ -1,15 +1,24 @@ """Work with Pydantic models.""" +from importlib import import_module +from types import ModuleType +from typing import TYPE_CHECKING from typing import Any from typing import Final from typing import TypeVar +from typing import cast from pdoc.docstrings import AnyException -try: +if TYPE_CHECKING: import pydantic -except AnyException: - pydantic = None +else: + pydantic: ModuleType | None + try: + pydantic = import_module("pydantic") + except AnyException: + pydantic = None + _IGNORED_FIELDS: Final[list[str]] = ["__fields__"] """Fields to ignore when generating docs, e.g. those that emit deprecation warnings.""" @@ -18,6 +27,17 @@ def is_pydantic_model(obj) -> bool: + """Returns whether an object is a Pydantic model. + + Raises: + ModuleNotFoundError: when function is called but Pydantic is not on the PYTHONPATH. + + """ + if pydantic is None: + raise ModuleNotFoundError( + "_pydantic.is_pydantic_model() needs Pydantic installed" + ) + return pydantic.BaseModel in obj.__bases__ @@ -33,7 +53,8 @@ def default_value(parent, name: str, obj: T) -> T: and isinstance(parent, type) and issubclass(parent, pydantic.BaseModel) ): - pydantic_fields = parent.__pydantic_fields__ + _parent = cast(pydantic.BaseModel, parent) + pydantic_fields = _parent.__pydantic_fields__ return pydantic_fields[name].default if name in pydantic_fields else obj return obj From cd271f267997737c9336912d34bacccb8b32784d Mon Sep 17 00:00:00 2001 From: Jonathan Jin Date: Sun, 12 Oct 2025 10:41:10 -0400 Subject: [PATCH 29/38] support 3.9 type checking --- pdoc/_pydantic.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pdoc/_pydantic.py b/pdoc/_pydantic.py index 24c91a27..3ebd0bf0 100644 --- a/pdoc/_pydantic.py +++ b/pdoc/_pydantic.py @@ -5,6 +5,7 @@ from typing import TYPE_CHECKING from typing import Any from typing import Final +from typing import Optional from typing import TypeVar from typing import cast @@ -13,7 +14,7 @@ if TYPE_CHECKING: import pydantic else: - pydantic: ModuleType | None + pydantic: Optional[ModuleType] try: pydantic = import_module("pydantic") except AnyException: @@ -60,7 +61,7 @@ def default_value(parent, name: str, obj: T) -> T: return obj -def get_field_docstring(parent, field_name: str) -> str | None: +def get_field_docstring(parent, field_name: str) -> Optional[str]: if ( pydantic is not None and isinstance(parent, type) From 5fd74629af2d3723393d6e7c66d1a75250e5ff2d Mon Sep 17 00:00:00 2001 From: Jonathan Jin Date: Sun, 12 Oct 2025 10:42:29 -0400 Subject: [PATCH 30/38] expand type annotations --- pdoc/_pydantic.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pdoc/_pydantic.py b/pdoc/_pydantic.py index 3ebd0bf0..53018e10 100644 --- a/pdoc/_pydantic.py +++ b/pdoc/_pydantic.py @@ -27,7 +27,7 @@ T = TypeVar("T") -def is_pydantic_model(obj) -> bool: +def is_pydantic_model(obj: Any) -> bool: """Returns whether an object is a Pydantic model. Raises: @@ -42,7 +42,7 @@ def is_pydantic_model(obj) -> bool: return pydantic.BaseModel in obj.__bases__ -def default_value(parent, name: str, obj: T) -> T: +def default_value(parent: Any, name: str, obj: T) -> T: """Determine the default value of obj. If pydantic is not installed or the parent type is not a Pydantic model, @@ -61,7 +61,7 @@ def default_value(parent, name: str, obj: T) -> T: return obj -def get_field_docstring(parent, field_name: str) -> Optional[str]: +def get_field_docstring(parent: Any, field_name: str) -> Optional[str]: if ( pydantic is not None and isinstance(parent, type) From 7567fe5b07247392a3fc319f6afdafb4b3c7f53a Mon Sep 17 00:00:00 2001 From: Jonathan Jin Date: Thu, 16 Oct 2025 22:30:11 -0400 Subject: [PATCH 31/38] cleanup --- pdoc/_pydantic.py | 7 +++---- pdoc/doc.py | 6 +----- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/pdoc/_pydantic.py b/pdoc/_pydantic.py index 53018e10..832abacd 100644 --- a/pdoc/_pydantic.py +++ b/pdoc/_pydantic.py @@ -13,7 +13,7 @@ if TYPE_CHECKING: import pydantic -else: +else: # pragma: no cover pydantic: Optional[ModuleType] try: pydantic = import_module("pydantic") @@ -34,7 +34,7 @@ def is_pydantic_model(obj: Any) -> bool: ModuleNotFoundError: when function is called but Pydantic is not on the PYTHONPATH. """ - if pydantic is None: + if pydantic is None: # pragma: no cover raise ModuleNotFoundError( "_pydantic.is_pydantic_model() needs Pydantic installed" ) @@ -61,10 +61,9 @@ def default_value(parent: Any, name: str, obj: T) -> T: return obj -def get_field_docstring(parent: Any, field_name: str) -> Optional[str]: +def get_field_docstring(parent: type, field_name: str) -> Optional[str]: if ( pydantic is not None - and isinstance(parent, type) and issubclass(parent, pydantic.BaseModel) ): pydantic_fields = parent.__pydantic_fields__ diff --git a/pdoc/doc.py b/pdoc/doc.py index e91fae6d..1e4b732e 100644 --- a/pdoc/doc.py +++ b/pdoc/doc.py @@ -338,11 +338,7 @@ def members(self) -> dict[str, Doc]: ) _docstring: str | None = None - if ( - _pydantic.pydantic is not None - and self.kind == "class" - and _pydantic.is_pydantic_model(self.obj) - ): + if self.kind == "class": _docstring = _pydantic.get_field_docstring(self.obj, name) if _docstring is None: From 8f0441cb8fa5b81bf937ba642cee86580f314494 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Fri, 17 Oct 2025 02:31:27 +0000 Subject: [PATCH 32/38] [autofix.ci] apply automated fixes --- pdoc/_pydantic.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/pdoc/_pydantic.py b/pdoc/_pydantic.py index 832abacd..d44007e3 100644 --- a/pdoc/_pydantic.py +++ b/pdoc/_pydantic.py @@ -13,7 +13,7 @@ if TYPE_CHECKING: import pydantic -else: # pragma: no cover +else: # pragma: no cover pydantic: Optional[ModuleType] try: pydantic = import_module("pydantic") @@ -34,7 +34,7 @@ def is_pydantic_model(obj: Any) -> bool: ModuleNotFoundError: when function is called but Pydantic is not on the PYTHONPATH. """ - if pydantic is None: # pragma: no cover + if pydantic is None: # pragma: no cover raise ModuleNotFoundError( "_pydantic.is_pydantic_model() needs Pydantic installed" ) @@ -62,10 +62,7 @@ def default_value(parent: Any, name: str, obj: T) -> T: def get_field_docstring(parent: type, field_name: str) -> Optional[str]: - if ( - pydantic is not None - and issubclass(parent, pydantic.BaseModel) - ): + if pydantic is not None and issubclass(parent, pydantic.BaseModel): pydantic_fields = parent.__pydantic_fields__ return ( pydantic_fields[field_name].description From 33d9cd9bcf781f645c00f77a276d4efa3223eac9 Mon Sep 17 00:00:00 2001 From: Jonathan Jin Date: Thu, 16 Oct 2025 22:36:07 -0400 Subject: [PATCH 33/38] typecast --- pdoc/doc.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pdoc/doc.py b/pdoc/doc.py index 1e4b732e..8a42d864 100644 --- a/pdoc/doc.py +++ b/pdoc/doc.py @@ -41,6 +41,7 @@ from typing import TypedDict from typing import TypeVar from typing import Union +from typing import cast from typing import get_origin import warnings @@ -339,7 +340,7 @@ def members(self) -> dict[str, Doc]: _docstring: str | None = None if self.kind == "class": - _docstring = _pydantic.get_field_docstring(self.obj, name) + _docstring = _pydantic.get_field_docstring(cast(type, self.obj), name) if _docstring is None: if self._var_docstrings.get(name): From 938c762d2ff77e3d5adc2299ed7ab0ce8d82d141 Mon Sep 17 00:00:00 2001 From: Jonathan Jin Date: Thu, 16 Oct 2025 22:57:14 -0400 Subject: [PATCH 34/38] move field exclusion to `Class._member_objects` --- pdoc/_pydantic.py | 7 +++++-- pdoc/doc.py | 13 +++++-------- test/testdata/with_pydantic.html | 17 ----------------- test/testdata/with_pydantic.txt | 1 - 4 files changed, 10 insertions(+), 28 deletions(-) diff --git a/pdoc/_pydantic.py b/pdoc/_pydantic.py index d44007e3..acec0633 100644 --- a/pdoc/_pydantic.py +++ b/pdoc/_pydantic.py @@ -21,8 +21,11 @@ pydantic = None -_IGNORED_FIELDS: Final[list[str]] = ["__fields__"] -"""Fields to ignore when generating docs, e.g. those that emit deprecation warnings.""" +_IGNORED_FIELDS: Final[list[str]] = [ + "__fields__", +] + list(pydantic.BaseModel.__dict__.keys()) +"""Fields to ignore when generating docs, e.g. those that emit deprecation +warnings or that are not relevant to users of BaseModel-derived classes.""" T = TypeVar("T") diff --git a/pdoc/doc.py b/pdoc/doc.py index 8a42d864..bafcdb84 100644 --- a/pdoc/doc.py +++ b/pdoc/doc.py @@ -260,14 +260,6 @@ def members(self) -> dict[str, Doc]: qualname = f"{self.qualname}.{name}".lstrip(".") taken_from = self._taken_from(name, obj) - if _pydantic.skip_field( - parent_kind=self.kind, - parent_obj=self.obj, - name=name, - taken_from=taken_from, - ): - continue - doc: Doc[Any] is_classmethod = isinstance(obj, classmethod) @@ -799,6 +791,11 @@ def _member_objects(self) -> dict[str, Any]: for cls in self._bases: sorted, unsorted = doc_ast.sort_by_source(cls, sorted, unsorted) sorted.update(unsorted) + + if _pydantic.pydantic is not None and _pydantic.is_pydantic_model(self.obj): + for field in _pydantic._IGNORED_FIELDS: + sorted.pop(field, None) + return sorted @cached_property diff --git a/test/testdata/with_pydantic.html b/test/testdata/with_pydantic.html index 6f35feee..ff980df6 100644 --- a/test/testdata/with_pydantic.html +++ b/test/testdata/with_pydantic.html @@ -26,9 +26,6 @@

API Documentation

  • Foo
  • -
    -
    - model_config = -{'use_attribute_docstrings': True} - - -
    - - -

    Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

    -
    - - -
    a: int = diff --git a/test/testdata/with_pydantic.txt b/test/testdata/with_pydantic.txt index 5871a9d1..6a5a5543 100644 --- a/test/testdata/with_pydantic.txt +++ b/test/testdata/with_pydantic.txt @@ -1,6 +1,5 @@ > From 7ef71605f4ee0f970582915d225f1e7d99d07cd5 Mon Sep 17 00:00:00 2001 From: Jonathan Jin Date: Thu, 16 Oct 2025 23:01:03 -0400 Subject: [PATCH 35/38] rm defunct fn --- pdoc/_pydantic.py | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/pdoc/_pydantic.py b/pdoc/_pydantic.py index acec0633..a5d1a072 100644 --- a/pdoc/_pydantic.py +++ b/pdoc/_pydantic.py @@ -23,7 +23,7 @@ _IGNORED_FIELDS: Final[list[str]] = [ "__fields__", -] + list(pydantic.BaseModel.__dict__.keys()) +] + list(pydantic.BaseModel.__dict__.keys()) if pydantic is not None else [] """Fields to ignore when generating docs, e.g. those that emit deprecation warnings or that are not relevant to users of BaseModel-derived classes.""" @@ -74,23 +74,3 @@ def get_field_docstring(parent: type, field_name: str) -> Optional[str]: ) return None - - -def skip_field( - *, - parent_kind: str, - parent_obj: Any, - name: str, - taken_from: tuple[str, str], -) -> bool: - """For Pydantic models, filter out all methods on the BaseModel - class, as they are almost never relevant to the consumers of the - inheriting model itself. - """ - - return ( - pydantic is not None - and parent_kind == "class" - and is_pydantic_model(parent_obj) - and (name in _IGNORED_FIELDS or taken_from[0].startswith("pydantic")) - ) From c2d876c519d5960da7ea69c860cbd023c35c4ba8 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Fri, 17 Oct 2025 03:01:47 +0000 Subject: [PATCH 36/38] [autofix.ci] apply automated fixes --- pdoc/_pydantic.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/pdoc/_pydantic.py b/pdoc/_pydantic.py index a5d1a072..c5302cf7 100644 --- a/pdoc/_pydantic.py +++ b/pdoc/_pydantic.py @@ -21,9 +21,14 @@ pydantic = None -_IGNORED_FIELDS: Final[list[str]] = [ - "__fields__", -] + list(pydantic.BaseModel.__dict__.keys()) if pydantic is not None else [] +_IGNORED_FIELDS: Final[list[str]] = ( + [ + "__fields__", + ] + + list(pydantic.BaseModel.__dict__.keys()) + if pydantic is not None + else [] +) """Fields to ignore when generating docs, e.g. those that emit deprecation warnings or that are not relevant to users of BaseModel-derived classes.""" From f75ff51f8522aae9d111e3eb03ed3d52ae9bd06a Mon Sep 17 00:00:00 2001 From: Jonathan Jin Date: Thu, 16 Oct 2025 23:02:36 -0400 Subject: [PATCH 37/38] simplify --- pdoc/doc.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/pdoc/doc.py b/pdoc/doc.py index bafcdb84..08f01b64 100644 --- a/pdoc/doc.py +++ b/pdoc/doc.py @@ -317,16 +317,12 @@ def members(self) -> dict[str, Doc]: taken_from=taken_from, ) else: - default_value = obj - - default_value = _pydantic.default_value(self.obj, name, obj) - doc = Variable( self.modulename, qualname, docstring="", annotation=self._var_annotations.get(name, empty), - default_value=default_value, + default_value=_pydantic.default_value(self.obj, name, obj), taken_from=taken_from, ) From 121a4625161d3f8016f229a67007425429a9fcac Mon Sep 17 00:00:00 2001 From: Jonathan Jin Date: Thu, 16 Oct 2025 23:04:58 -0400 Subject: [PATCH 38/38] refine type annotations --- pdoc/_pydantic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdoc/_pydantic.py b/pdoc/_pydantic.py index c5302cf7..6d657270 100644 --- a/pdoc/_pydantic.py +++ b/pdoc/_pydantic.py @@ -35,7 +35,7 @@ T = TypeVar("T") -def is_pydantic_model(obj: Any) -> bool: +def is_pydantic_model(obj: type) -> bool: """Returns whether an object is a Pydantic model. Raises: