pdoc 15.0.3__tar.gz → 16.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pdoc-15.0.3 → pdoc-16.0.0}/CHANGELOG.md +26 -0
- {pdoc-15.0.3/pdoc.egg-info → pdoc-16.0.0}/PKG-INFO +7 -6
- {pdoc-15.0.3 → pdoc-16.0.0}/README.md +3 -3
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/__init__.py +20 -1
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/_compat.py +1 -26
- pdoc-16.0.0/pdoc/_pydantic.py +54 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/doc.py +23 -12
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/doc_types.py +17 -33
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/docstrings.py +3 -1
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/extract.py +1 -1
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/render_helpers.py +7 -6
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/content.css +3 -3
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/default/index.html.jinja2 +1 -1
- pdoc-16.0.0/pdoc/templates/resources/pdoc-logo.svg +1 -0
- {pdoc-15.0.3 → pdoc-16.0.0/pdoc.egg-info}/PKG-INFO +7 -6
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc.egg-info/SOURCES.txt +2 -3
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc.egg-info/requires.txt +1 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pyproject.toml +13 -8
- pdoc-16.0.0/test/test__pydantic.py +26 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/test/test_doc_types.py +0 -11
- {pdoc-15.0.3 → pdoc-16.0.0}/test/test_extract.py +4 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/test/test_render_helpers.py +16 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/test/test_snapshot.py +7 -8
- pdoc-15.0.3/pdoc/markdown2/LICENSE +0 -23
- pdoc-15.0.3/pdoc/markdown2/README.md +0 -2
- pdoc-15.0.3/pdoc/markdown2/__init__.py +0 -4029
- pdoc-15.0.3/pdoc/templates/resources/pdoc-logo.svg +0 -1
- {pdoc-15.0.3 → pdoc-16.0.0}/LICENSE +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/MANIFEST.in +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/__main__.py +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/doc_ast.py +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/doc_pyi.py +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/py.typed +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/render.py +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/search.py +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/README.md +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/build-search-index.js +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/custom.css +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/default/error.html.jinja2 +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/default/frame.html.jinja2 +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/default/module.html.jinja2 +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/deprecated/README.md +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/deprecated/bootstrap-reboot.min.css +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/deprecated/box-arrow-in-left.svg +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/deprecated/elasticlunr.min.js +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/deprecated/favicon.svg +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/deprecated/navtoggle.svg +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/deprecated/pdoc-logo.svg +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/deprecated/resources/favicon.svg +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/layout.css +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/livereload.html.jinja2 +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/math.html.jinja2 +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/mermaid.html.jinja2 +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/resources/bootstrap-reboot.min.css +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/resources/box-arrow-in-left.svg +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/resources/elasticlunr.min.js +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/resources/exclamation-octagon-fill.svg +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/resources/exclamation-square-fill.svg +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/resources/exclamation-triangle-fill.svg +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/resources/info-circle-fill.svg +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/resources/lightbulb.svg +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/resources/lightning-fill.svg +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/resources/navtoggle.svg +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/search.html.jinja2 +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/search.js.jinja2 +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/syntax-highlighting.css +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/templates/theme.css +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc/web.py +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc.egg-info/dependency_links.txt +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc.egg-info/entry_points.txt +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/pdoc.egg-info/top_level.txt +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/setup.cfg +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/test/test_doc.py +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/test/test_doc_ast.py +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/test/test_doc_pyi.py +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/test/test_docstrings.py +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/test/test_main.py +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/test/test_search.py +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/test/test_smoke.py +0 -0
- {pdoc-15.0.3 → pdoc-16.0.0}/test/test_web.py +0 -0
|
@@ -5,6 +5,32 @@
|
|
|
5
5
|
## Unreleased: pdoc next
|
|
6
6
|
|
|
7
7
|
|
|
8
|
+
## 2025-10-27: pdoc 16.0.0
|
|
9
|
+
|
|
10
|
+
- pdoc has a new logo. 🐍
|
|
11
|
+
([#838](https://github.com/mitmproxy/pdoc/pull/838), @mhils)
|
|
12
|
+
- Add support for Python 3.14.
|
|
13
|
+
([#843](https://github.com/mitmproxy/pdoc/pull/843), @mhils)
|
|
14
|
+
- Drop support for Python 3.9, which as reached
|
|
15
|
+
[end of life](https://devguide.python.org/versions/).
|
|
16
|
+
([#842](https://github.com/mitmproxy/pdoc/pull/842), @mhils)
|
|
17
|
+
- Fix linking of identifiers that contain unicode characters.
|
|
18
|
+
([#831](https://github.com/mitmproxy/pdoc/issues/831), @iFreilicht)
|
|
19
|
+
- Replace vendored version of `markdown2` with the [official
|
|
20
|
+
upstream](https://github.com/trentm/python-markdown2)
|
|
21
|
+
- Add support for keyword args for Google flavor docs.
|
|
22
|
+
([#840](https://github.com/mitmproxy/pdoc/pull/840), @aleksslitvinovs)
|
|
23
|
+
- Add support for Pydantic-style field docstrings,
|
|
24
|
+
e.g. `pydantic.Field(description="...")`
|
|
25
|
+
([#802](https://github.com/mitmproxy/pdoc/pull/802), @jinnovation)
|
|
26
|
+
|
|
27
|
+
## 2025-06-04: pdoc 15.0.4
|
|
28
|
+
|
|
29
|
+
- Include included HTML headers in the ToC by default by enabling markdown2's `mixed=True` option of the `header-ids` extra
|
|
30
|
+
(#806, @mrossinek)
|
|
31
|
+
- Make `pdoc .` work to document the module in the current directory.
|
|
32
|
+
([#813](https://github.com/mitmproxy/pdoc/pull/813), @mhils)
|
|
33
|
+
|
|
8
34
|
## 2025-04-21: pdoc 15.0.3
|
|
9
35
|
|
|
10
36
|
- Add missing styles for Github's markdown alerts.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: pdoc
|
|
3
|
-
Version:
|
|
3
|
+
Version: 16.0.0
|
|
4
4
|
Summary: API Documentation for Python Projects
|
|
5
5
|
Author-email: Maximilian Hils <pdoc@maximilianhils.com>
|
|
6
6
|
License: MIT-0
|
|
@@ -16,24 +16,25 @@ Classifier: Development Status :: 5 - Production/Stable
|
|
|
16
16
|
Classifier: Environment :: Console
|
|
17
17
|
Classifier: Intended Audience :: Developers
|
|
18
18
|
Classifier: Operating System :: OS Independent
|
|
19
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
20
19
|
Classifier: Programming Language :: Python :: 3.10
|
|
21
20
|
Classifier: Programming Language :: Python :: 3.11
|
|
22
21
|
Classifier: Programming Language :: Python :: 3.12
|
|
23
22
|
Classifier: Programming Language :: Python :: 3.13
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
24
24
|
Classifier: Typing :: Typed
|
|
25
|
-
Requires-Python: >=3.
|
|
25
|
+
Requires-Python: >=3.10
|
|
26
26
|
Description-Content-Type: text/markdown
|
|
27
27
|
License-File: LICENSE
|
|
28
28
|
Requires-Dist: Jinja2>=2.11.0
|
|
29
29
|
Requires-Dist: pygments>=2.12.0
|
|
30
30
|
Requires-Dist: MarkupSafe>=1.1.1
|
|
31
|
+
Requires-Dist: markdown2>=2.5.4
|
|
31
32
|
|
|
32
33
|
<p align="center">
|
|
33
34
|
<a href="https://pdoc.dev/"><img alt="pdoc" src="https://pdoc.dev/logo.svg" width="200" height="100" /></a>
|
|
34
35
|
<br><br>
|
|
35
|
-
<a href="https://pdoc.dev/docs/pdoc.html"><img height="20" alt="pdoc documentation" src="https://shields.mitmproxy.org/badge/docs-pdoc.dev-brightgreen.svg"></a>
|
|
36
|
-
<img height="20" alt="CI Status" src="https://shields.mitmproxy.org/github/actions/workflow/status/mitmproxy/pdoc/main.yml?label=CI&logo=github">
|
|
36
|
+
<a href="https://pdoc.dev/docs/pdoc.html"><img height="20" alt="pdoc documentation" src="https://shields.mitmproxy.org/badge/docs-pdoc.dev-brightgreen.svg?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOTIiIGhlaWdodD0iMTkyIj48cGF0aCBkPSJNNjcuODA3IDIzLjI0NGMtMTguMDMyIDUuNTIzLTI0LjI3MyA5LjQxMS0zMy4xOTMgMTYuMTY5UzE5LjQwNyA1MS4xMjUgOS4zNCA2OS43NkMzLjI3IDgwLjk5Ni44MjcgOTkuMjcxIDEgMTExLjY3OWMuMTE0IDguMTY5IDIuMTg4IDEzLjU1OSAyLjE4OCAxMy41NTlTNDIuMzI2IDI0Ny4yNyAyMC40MzUgMjc4LjEwNWMtMTAuNDg4IDE0Ljc3MyA4NC40MjIgMjcuMDA3IDgwLjA0NyAxMC40NS0xMC4zOTctMzkuMzQ4LTI3LjU5NS05Ny40MDktMzEuOTA4LTExMy42NjctMy4wNDctMTEuNDg0IDguMTYtMjEuOTk1IDE2LjI5NS0yNy4zNDMgMy4zODMtMi4yMjQgOC4wNTEtMy43ODYgOC4wNTEtMy43ODZsNTEuOTI0LTE1LjU5NXMyMy44MDktOC41NzkgMzQuMDYyLTI2LjU2NyAxMi42ODktMzcuNTg0IDEyLjY4OS0zNy41ODQuNDk1LTE2LjU4OC01LjkzOS0yMy4xNC0yLjczMi01Ljg2Ni0xOC42NDYtMTIuNDk4LTQ5LjEyMi0xMC4wNTMtNDkuMTIyLTEwLjA1My0zMi4wNDktLjYwMi01MC4wODEgNC45MjF6IiBmaWxsPSIjMjBhZDZjIi8+PGcgdHJhbnNmb3JtPSJyb3RhdGUoMzQzLjk5MykiPjxlbGxpcHNlIGN4PSI1Mi4yNzYiIGN5PSI5NC4wODkiIGZpbGw9IiNmZmYiIHJ4PSIyNy44NTIiIHJ5PSIyNy44MjMiLz48ZWxsaXBzZSBjeD0iNTIuNTM4IiBjeT0iOTQuNjg5IiByeD0iMTguNjg4IiByeT0iMTguMzMxIiBmaWxsPSIjMTA1YTQ4Ii8+PGVsbGlwc2UgY3g9IjYzLjMzMyIgY3k9Ijg2LjMiIGZpbGw9IiNmZmYiIHJ4PSI3LjU5NiIgcnk9IjcuNTg4Ii8+PC9nPjxnIGZpbGw9IiMxMDVhNDgiPjxlbGxpcHNlIGN4PSI5NC4xNTQiIGN5PSIxMzUuNzM0IiByeD0iNC41MDUiIHJ5PSI1LjI1NyIgdHJhbnNmb3JtPSJyb3RhdGUoMzI1LjAxNSkiLz48ZWxsaXBzZSBjeD0iMTY3Ljg2IiBjeT0iNTYuOTUxIiByeD0iNC40ODQiIHJ5PSI1LjIzMSIgdHJhbnNmb3JtPSJyb3RhdGUoMzU4Ljc3OSkiLz48L2c+PHBhdGggZD0iTTE4OC45NjIgNzcuNDU4bC0zNC4yNDggMTAuMTcxYy02Ljg3OCAxLjk3My05Ljk3NCAzLjM4OC0xNC44ODggMy42NnMtMTAuODY4LTEuODY5LTEwLjg2OC0xLjg2OWwtMi4zNDIgOC42MzNjMi4xOTcuOTQ0IDkuOTY5IDIuMzkgMTQuNzU2IDIuNTkyczE1LjU4Mi0yLjQ2IDE1LjU4Mi0yLjQ2bDI3LjQ3MS03LjUzNGMxLjk1MS00LjcwOSAzLjQzMi05LjIzOCA0LjUzNy0xMy4xOTN6IiBmaWxsPSIjZTc4MzYxIi8+PC9zdmc+"></a>
|
|
37
|
+
<a href="https://github.com/mitmproxy/pdoc/actions"><img height="20" alt="CI Status" src="https://shields.mitmproxy.org/github/actions/workflow/status/mitmproxy/pdoc/main.yml?label=CI&logo=github"></a>
|
|
37
38
|
<img height="20" alt="Code Coverage" src="https://shields.mitmproxy.org/badge/coverage-100%25-brightgreen">
|
|
38
39
|
<a href="https://autofix.ci"><img height="20" alt="autofix.ci: yes" src="https://shields.mitmproxy.org/badge/autofix.ci-yes-success?logo=data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjZmZmIiB2aWV3Qm94PSIwIDAgMTI4IDEyOCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCB0cmFuc2Zvcm09InNjYWxlKDAuMDYxLC0wLjA2MSkgdHJhbnNsYXRlKC0yNTAsLTE3NTApIiBkPSJNMTMyNSAtMzQwcS0xMTUgMCAtMTY0LjUgMzIuNXQtNDkuNSAxMTQuNXEwIDMyIDUgNzAuNXQxMC41IDcyLjV0NS41IDU0djIyMHEtMzQgLTkgLTY5LjUgLTE0dC03MS41IC01cS0xMzYgMCAtMjUxLjUgNjJ0LTE5MSAxNjl0LTkyLjUgMjQxcS05MCAxMjAgLTkwIDI2NnEwIDEwOCA0OC41IDIwMC41dDEzMiAxNTUuNXQxODguNSA4MXExNSA5OSAxMDAuNSAxODAuNXQyMTcgMTMwLjV0MjgyLjUgNDlxMTM2IDAgMjU2LjUgLTQ2IHQyMDkgLTEyNy41dDEyOC41IC0xODkuNXExNDkgLTgyIDIyNyAtMjEzLjV0NzggLTI5OS41cTAgLTEzNiAtNTggLTI0NnQtMTY1LjUgLTE4NC41dC0yNTYuNSAtMTAzLjVsLTI0MyAtMzAwdi01MnEwIC0yNyAzLjUgLTU2LjV0Ni41IC01Ny41dDMgLTUycTAgLTg1IC00MS41IC0xMTguNXQtMTU3LjUgLTMzLjV6TTEzMjUgLTI2MHE3NyAwIDk4IDE0LjV0MjEgNTcuNXEwIDI5IC0zIDY4dC02LjUgNzN0LTMuNSA0OHY2NGwyMDcgMjQ5IHEtMzEgMCAtNjAgNS41dC01NCAxMi41bC0xMDQgLTEyM3EtMSAzNCAtMiA2My41dC0xIDU0LjVxMCA2OSA5IDEyM2wzMSAyMDBsLTExNSAtMjhsLTQ2IC0yNzFsLTIwNSAyMjZxLTE5IC0xNSAtNDMgLTI4LjV0LTU1IC0yNi41bDIxOSAtMjQydi0yNzZxMCAtMjAgLTUuNSAtNjB0LTEwLjUgLTc5dC01IC01OHEwIC00MCAzMCAtNTMuNXQxMDQgLTEzLjV6TTEyNjIgNjE2cS0xMTkgMCAtMjI5LjUgMzQuNXQtMTkzLjUgOTYuNWw0OCA2NCBxNzMgLTU1IDE3MC41IC04NXQyMDQuNSAtMzBxMTM3IDAgMjQ5IDQ1LjV0MTc5IDEyMXQ2NyAxNjUuNWg4MHEwIC0xMTQgLTc3LjUgLTIwNy41dC0yMDggLTE0OXQtMjg5LjUgLTU1LjV6TTgwMyA1OTVxODAgMCAxNDkgMjkuNXQxMDggNzIuNWwyMjEgLTY3bDMwOSA4NnE0NyAtMzIgMTA0LjUgLTUwdDExNy41IC0xOHE5MSAwIDE2NSAzOHQxMTguNSAxMDMuNXQ0NC41IDE0Ni41cTAgNzYgLTM0LjUgMTQ5dC05NS41IDEzNHQtMTQzIDk5IHEtMzcgMTA3IC0xMTUuNSAxODMuNXQtMTg2IDExNy41dC0yMzAuNSA0MXEtMTAzIDAgLTE5Ny41IC0yNnQtMTY5IC03Mi41dC0xMTcuNSAtMTA4dC00MyAtMTMxLjVxMCAtMzQgMTQuNSAtNjIuNXQ0MC41IC01MC41bC01NSAtNTlxLTM0IDI5IC01NCA2NS41dC0yNSA4MS41cS04MSAtMTggLTE0NSAtNzB0LTEwMSAtMTI1LjV0LTM3IC0xNTguNXEwIC0xMDIgNDguNSAtMTgwLjV0MTI5LjUgLTEyM3QxNzkgLTQ0LjV6Ii8+PC9zdmc+"></a>
|
|
39
40
|
<a href="https://pypi.python.org/pypi/pdoc"><img height="20" alt="PyPI Version" src="https://shields.mitmproxy.org/pypi/v/pdoc.svg"></a>
|
|
@@ -52,7 +53,7 @@ API Documentation for Python Projects.
|
|
|
52
53
|
pip install pdoc
|
|
53
54
|
```
|
|
54
55
|
|
|
55
|
-
pdoc is compatible with Python 3.
|
|
56
|
+
pdoc is compatible with Python 3.10 and newer.
|
|
56
57
|
|
|
57
58
|
|
|
58
59
|
# Usage
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
<p align="center">
|
|
2
2
|
<a href="https://pdoc.dev/"><img alt="pdoc" src="https://pdoc.dev/logo.svg" width="200" height="100" /></a>
|
|
3
3
|
<br><br>
|
|
4
|
-
<a href="https://pdoc.dev/docs/pdoc.html"><img height="20" alt="pdoc documentation" src="https://shields.mitmproxy.org/badge/docs-pdoc.dev-brightgreen.svg"></a>
|
|
5
|
-
<img height="20" alt="CI Status" src="https://shields.mitmproxy.org/github/actions/workflow/status/mitmproxy/pdoc/main.yml?label=CI&logo=github">
|
|
4
|
+
<a href="https://pdoc.dev/docs/pdoc.html"><img height="20" alt="pdoc documentation" src="https://shields.mitmproxy.org/badge/docs-pdoc.dev-brightgreen.svg?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOTIiIGhlaWdodD0iMTkyIj48cGF0aCBkPSJNNjcuODA3IDIzLjI0NGMtMTguMDMyIDUuNTIzLTI0LjI3MyA5LjQxMS0zMy4xOTMgMTYuMTY5UzE5LjQwNyA1MS4xMjUgOS4zNCA2OS43NkMzLjI3IDgwLjk5Ni44MjcgOTkuMjcxIDEgMTExLjY3OWMuMTE0IDguMTY5IDIuMTg4IDEzLjU1OSAyLjE4OCAxMy41NTlTNDIuMzI2IDI0Ny4yNyAyMC40MzUgMjc4LjEwNWMtMTAuNDg4IDE0Ljc3MyA4NC40MjIgMjcuMDA3IDgwLjA0NyAxMC40NS0xMC4zOTctMzkuMzQ4LTI3LjU5NS05Ny40MDktMzEuOTA4LTExMy42NjctMy4wNDctMTEuNDg0IDguMTYtMjEuOTk1IDE2LjI5NS0yNy4zNDMgMy4zODMtMi4yMjQgOC4wNTEtMy43ODYgOC4wNTEtMy43ODZsNTEuOTI0LTE1LjU5NXMyMy44MDktOC41NzkgMzQuMDYyLTI2LjU2NyAxMi42ODktMzcuNTg0IDEyLjY4OS0zNy41ODQuNDk1LTE2LjU4OC01LjkzOS0yMy4xNC0yLjczMi01Ljg2Ni0xOC42NDYtMTIuNDk4LTQ5LjEyMi0xMC4wNTMtNDkuMTIyLTEwLjA1My0zMi4wNDktLjYwMi01MC4wODEgNC45MjF6IiBmaWxsPSIjMjBhZDZjIi8+PGcgdHJhbnNmb3JtPSJyb3RhdGUoMzQzLjk5MykiPjxlbGxpcHNlIGN4PSI1Mi4yNzYiIGN5PSI5NC4wODkiIGZpbGw9IiNmZmYiIHJ4PSIyNy44NTIiIHJ5PSIyNy44MjMiLz48ZWxsaXBzZSBjeD0iNTIuNTM4IiBjeT0iOTQuNjg5IiByeD0iMTguNjg4IiByeT0iMTguMzMxIiBmaWxsPSIjMTA1YTQ4Ii8+PGVsbGlwc2UgY3g9IjYzLjMzMyIgY3k9Ijg2LjMiIGZpbGw9IiNmZmYiIHJ4PSI3LjU5NiIgcnk9IjcuNTg4Ii8+PC9nPjxnIGZpbGw9IiMxMDVhNDgiPjxlbGxpcHNlIGN4PSI5NC4xNTQiIGN5PSIxMzUuNzM0IiByeD0iNC41MDUiIHJ5PSI1LjI1NyIgdHJhbnNmb3JtPSJyb3RhdGUoMzI1LjAxNSkiLz48ZWxsaXBzZSBjeD0iMTY3Ljg2IiBjeT0iNTYuOTUxIiByeD0iNC40ODQiIHJ5PSI1LjIzMSIgdHJhbnNmb3JtPSJyb3RhdGUoMzU4Ljc3OSkiLz48L2c+PHBhdGggZD0iTTE4OC45NjIgNzcuNDU4bC0zNC4yNDggMTAuMTcxYy02Ljg3OCAxLjk3My05Ljk3NCAzLjM4OC0xNC44ODggMy42NnMtMTAuODY4LTEuODY5LTEwLjg2OC0xLjg2OWwtMi4zNDIgOC42MzNjMi4xOTcuOTQ0IDkuOTY5IDIuMzkgMTQuNzU2IDIuNTkyczE1LjU4Mi0yLjQ2IDE1LjU4Mi0yLjQ2bDI3LjQ3MS03LjUzNGMxLjk1MS00LjcwOSAzLjQzMi05LjIzOCA0LjUzNy0xMy4xOTN6IiBmaWxsPSIjZTc4MzYxIi8+PC9zdmc+"></a>
|
|
5
|
+
<a href="https://github.com/mitmproxy/pdoc/actions"><img height="20" alt="CI Status" src="https://shields.mitmproxy.org/github/actions/workflow/status/mitmproxy/pdoc/main.yml?label=CI&logo=github"></a>
|
|
6
6
|
<img height="20" alt="Code Coverage" src="https://shields.mitmproxy.org/badge/coverage-100%25-brightgreen">
|
|
7
7
|
<a href="https://autofix.ci"><img height="20" alt="autofix.ci: yes" src="https://shields.mitmproxy.org/badge/autofix.ci-yes-success?logo=data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjZmZmIiB2aWV3Qm94PSIwIDAgMTI4IDEyOCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCB0cmFuc2Zvcm09InNjYWxlKDAuMDYxLC0wLjA2MSkgdHJhbnNsYXRlKC0yNTAsLTE3NTApIiBkPSJNMTMyNSAtMzQwcS0xMTUgMCAtMTY0LjUgMzIuNXQtNDkuNSAxMTQuNXEwIDMyIDUgNzAuNXQxMC41IDcyLjV0NS41IDU0djIyMHEtMzQgLTkgLTY5LjUgLTE0dC03MS41IC01cS0xMzYgMCAtMjUxLjUgNjJ0LTE5MSAxNjl0LTkyLjUgMjQxcS05MCAxMjAgLTkwIDI2NnEwIDEwOCA0OC41IDIwMC41dDEzMiAxNTUuNXQxODguNSA4MXExNSA5OSAxMDAuNSAxODAuNXQyMTcgMTMwLjV0MjgyLjUgNDlxMTM2IDAgMjU2LjUgLTQ2IHQyMDkgLTEyNy41dDEyOC41IC0xODkuNXExNDkgLTgyIDIyNyAtMjEzLjV0NzggLTI5OS41cTAgLTEzNiAtNTggLTI0NnQtMTY1LjUgLTE4NC41dC0yNTYuNSAtMTAzLjVsLTI0MyAtMzAwdi01MnEwIC0yNyAzLjUgLTU2LjV0Ni41IC01Ny41dDMgLTUycTAgLTg1IC00MS41IC0xMTguNXQtMTU3LjUgLTMzLjV6TTEzMjUgLTI2MHE3NyAwIDk4IDE0LjV0MjEgNTcuNXEwIDI5IC0zIDY4dC02LjUgNzN0LTMuNSA0OHY2NGwyMDcgMjQ5IHEtMzEgMCAtNjAgNS41dC01NCAxMi41bC0xMDQgLTEyM3EtMSAzNCAtMiA2My41dC0xIDU0LjVxMCA2OSA5IDEyM2wzMSAyMDBsLTExNSAtMjhsLTQ2IC0yNzFsLTIwNSAyMjZxLTE5IC0xNSAtNDMgLTI4LjV0LTU1IC0yNi41bDIxOSAtMjQydi0yNzZxMCAtMjAgLTUuNSAtNjB0LTEwLjUgLTc5dC01IC01OHEwIC00MCAzMCAtNTMuNXQxMDQgLTEzLjV6TTEyNjIgNjE2cS0xMTkgMCAtMjI5LjUgMzQuNXQtMTkzLjUgOTYuNWw0OCA2NCBxNzMgLTU1IDE3MC41IC04NXQyMDQuNSAtMzBxMTM3IDAgMjQ5IDQ1LjV0MTc5IDEyMXQ2NyAxNjUuNWg4MHEwIC0xMTQgLTc3LjUgLTIwNy41dC0yMDggLTE0OXQtMjg5LjUgLTU1LjV6TTgwMyA1OTVxODAgMCAxNDkgMjkuNXQxMDggNzIuNWwyMjEgLTY3bDMwOSA4NnE0NyAtMzIgMTA0LjUgLTUwdDExNy41IC0xOHE5MSAwIDE2NSAzOHQxMTguNSAxMDMuNXQ0NC41IDE0Ni41cTAgNzYgLTM0LjUgMTQ5dC05NS41IDEzNHQtMTQzIDk5IHEtMzcgMTA3IC0xMTUuNSAxODMuNXQtMTg2IDExNy41dC0yMzAuNSA0MXEtMTAzIDAgLTE5Ny41IC0yNnQtMTY5IC03Mi41dC0xMTcuNSAtMTA4dC00MyAtMTMxLjVxMCAtMzQgMTQuNSAtNjIuNXQ0MC41IC01MC41bC01NSAtNTlxLTM0IDI5IC01NCA2NS41dC0yNSA4MS41cS04MSAtMTggLTE0NSAtNzB0LTEwMSAtMTI1LjV0LTM3IC0xNTguNXEwIC0xMDIgNDguNSAtMTgwLjV0MTI5LjUgLTEyM3QxNzkgLTQ0LjV6Ii8+PC9zdmc+"></a>
|
|
8
8
|
<a href="https://pypi.python.org/pypi/pdoc"><img height="20" alt="PyPI Version" src="https://shields.mitmproxy.org/pypi/v/pdoc.svg"></a>
|
|
@@ -21,7 +21,7 @@ API Documentation for Python Projects.
|
|
|
21
21
|
pip install pdoc
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
-
pdoc is compatible with Python 3.
|
|
24
|
+
pdoc is compatible with Python 3.10 and newer.
|
|
25
25
|
|
|
26
26
|
|
|
27
27
|
# Usage
|
|
@@ -260,6 +260,25 @@ pdoc only interprets a subset of the reStructuredText specification.
|
|
|
260
260
|
Adding additional syntax elements is usually easy. If you feel that pdoc doesn't parse a docstring element properly,
|
|
261
261
|
please amend `pdoc.docstrings` and send us a pull request!
|
|
262
262
|
|
|
263
|
+
## ...document Pydantic models?
|
|
264
|
+
|
|
265
|
+
For [Pydantic models](https://docs.pydantic.dev/latest/concepts/models/), pdoc
|
|
266
|
+
will extract [field](https://docs.pydantic.dev/latest/concepts/fields/)
|
|
267
|
+
descriptions and treat them just like [documented
|
|
268
|
+
variables](#document-variables). For example, the following two Pydantic models
|
|
269
|
+
would have identical pdoc-rendered documentation:
|
|
270
|
+
|
|
271
|
+
```python
|
|
272
|
+
from pydantic import BaseModel, Field
|
|
273
|
+
|
|
274
|
+
class Foo(BaseModel):
|
|
275
|
+
a: int = Field(description="Docs for field a.")
|
|
276
|
+
|
|
277
|
+
class OtherFoo(BaseModel):
|
|
278
|
+
a: int
|
|
279
|
+
"""Docs for field a."""
|
|
280
|
+
|
|
281
|
+
```
|
|
263
282
|
|
|
264
283
|
## ...render math formulas?
|
|
265
284
|
|
|
@@ -481,7 +500,7 @@ You can find an example in [`examples/library-usage`](https://github.com/mitmpro
|
|
|
481
500
|
from __future__ import annotations
|
|
482
501
|
|
|
483
502
|
__docformat__ = "markdown" # explicitly disable rST processing in the examples above.
|
|
484
|
-
__version__ = "
|
|
503
|
+
__version__ = "16.0.0" # this is read from setup.py
|
|
485
504
|
|
|
486
505
|
from pathlib import Path
|
|
487
506
|
from typing import overload
|
|
@@ -13,20 +13,7 @@ else: # pragma: no cover
|
|
|
13
13
|
class TypeAliasType:
|
|
14
14
|
"""Placeholder class for TypeAliasType"""
|
|
15
15
|
|
|
16
|
-
if sys.version_info
|
|
17
|
-
from typing import TypeAlias
|
|
18
|
-
else: # pragma: no cover
|
|
19
|
-
class TypeAlias:
|
|
20
|
-
pass
|
|
21
|
-
|
|
22
|
-
if sys.version_info >= (3, 10):
|
|
23
|
-
from types import UnionType # type: ignore
|
|
24
|
-
else: # pragma: no cover
|
|
25
|
-
class UnionType:
|
|
26
|
-
pass
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
if (3, 9) <= sys.version_info < (3, 9, 8) or (3, 10) <= sys.version_info < (3, 10, 1): # pragma: no cover
|
|
16
|
+
if (3, 10) <= sys.version_info < (3, 10, 1): # pragma: no cover
|
|
30
17
|
import inspect
|
|
31
18
|
import types
|
|
32
19
|
|
|
@@ -40,21 +27,9 @@ if (3, 9) <= sys.version_info < (3, 9, 8) or (3, 10) <= sys.version_info < (3, 1
|
|
|
40
27
|
else:
|
|
41
28
|
from inspect import formatannotation
|
|
42
29
|
|
|
43
|
-
if sys.version_info >= (3, 10):
|
|
44
|
-
from typing import is_typeddict
|
|
45
|
-
else: # pragma: no cover
|
|
46
|
-
def is_typeddict(tp):
|
|
47
|
-
try:
|
|
48
|
-
return tp.__orig_bases__[-1].__name__ == "TypedDict"
|
|
49
|
-
except Exception:
|
|
50
|
-
return False
|
|
51
|
-
|
|
52
30
|
|
|
53
31
|
__all__ = [
|
|
54
32
|
"ast_TypeAlias",
|
|
55
33
|
"TypeAliasType",
|
|
56
|
-
"TypeAlias",
|
|
57
|
-
"UnionType",
|
|
58
34
|
"formatannotation",
|
|
59
|
-
"is_typeddict",
|
|
60
35
|
]
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"""Work with Pydantic models."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import types
|
|
6
|
+
from typing import Any
|
|
7
|
+
from typing import TypeAlias
|
|
8
|
+
from typing import TypeGuard
|
|
9
|
+
|
|
10
|
+
try:
|
|
11
|
+
import pydantic
|
|
12
|
+
except ImportError: # pragma: no cover
|
|
13
|
+
pydantic = None # type: ignore
|
|
14
|
+
|
|
15
|
+
ClassOrModule: TypeAlias = type | types.ModuleType
|
|
16
|
+
"""Type alias for the type of `Namespace.obj`."""
|
|
17
|
+
|
|
18
|
+
IGNORED_FIELDS: frozenset[str] = frozenset(
|
|
19
|
+
(["__fields__"] + list(pydantic.BaseModel.__dict__.keys()))
|
|
20
|
+
if pydantic is not None
|
|
21
|
+
else []
|
|
22
|
+
)
|
|
23
|
+
"""Fields to ignore when generating docs, e.g. those that emit deprecation
|
|
24
|
+
warnings or that are not relevant to users of BaseModel-derived classes."""
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def is_pydantic_model(obj: ClassOrModule) -> TypeGuard[pydantic.BaseModel]:
|
|
28
|
+
"""Returns whether an object is a Pydantic model."""
|
|
29
|
+
if pydantic is None: # pragma: no cover
|
|
30
|
+
# classes that subclass pydantic.BaseModel can only be instantiated if pydantic is importable
|
|
31
|
+
# => if we cannot import pydantic, the passed object cannot be a subclass of BaseModel.
|
|
32
|
+
return False
|
|
33
|
+
|
|
34
|
+
return isinstance(obj, type) and issubclass(obj, pydantic.BaseModel)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def default_value(parent: ClassOrModule, name: str, obj: Any) -> Any:
|
|
38
|
+
"""Determine the default value of obj.
|
|
39
|
+
|
|
40
|
+
For pydantic BaseModels, extract the default value from field metadata.
|
|
41
|
+
For all other objects, return `obj` as-is.
|
|
42
|
+
"""
|
|
43
|
+
if is_pydantic_model(parent):
|
|
44
|
+
pydantic_fields = parent.__pydantic_fields__
|
|
45
|
+
return pydantic_fields[name].default if name in pydantic_fields else obj
|
|
46
|
+
|
|
47
|
+
return obj
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def get_field_docstring(parent: ClassOrModule, field_name: str) -> str | None:
|
|
51
|
+
if is_pydantic_model(parent):
|
|
52
|
+
if field := parent.__pydantic_fields__.get(field_name, None):
|
|
53
|
+
return field.description
|
|
54
|
+
return None
|
|
@@ -38,19 +38,20 @@ import types
|
|
|
38
38
|
from typing import Any
|
|
39
39
|
from typing import ClassVar
|
|
40
40
|
from typing import Generic
|
|
41
|
+
from typing import TypeAlias
|
|
41
42
|
from typing import TypedDict
|
|
42
43
|
from typing import TypeVar
|
|
43
|
-
from typing import
|
|
44
|
+
from typing import cast
|
|
44
45
|
from typing import get_origin
|
|
46
|
+
from typing import is_typeddict
|
|
45
47
|
import warnings
|
|
46
48
|
|
|
49
|
+
from pdoc import _pydantic
|
|
47
50
|
from pdoc import doc_ast
|
|
48
51
|
from pdoc import doc_pyi
|
|
49
52
|
from pdoc import extract
|
|
50
|
-
from pdoc._compat import TypeAlias
|
|
51
53
|
from pdoc._compat import TypeAliasType
|
|
52
54
|
from pdoc._compat import formatannotation
|
|
53
|
-
from pdoc._compat import is_typeddict
|
|
54
55
|
from pdoc.doc_types import GenericAlias
|
|
55
56
|
from pdoc.doc_types import NonUserDefinedCallables
|
|
56
57
|
from pdoc.doc_types import empty
|
|
@@ -210,7 +211,10 @@ class Doc(Generic[T]):
|
|
|
210
211
|
)
|
|
211
212
|
|
|
212
213
|
|
|
213
|
-
|
|
214
|
+
U = TypeVar("U", bound=types.ModuleType | type)
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
class Namespace(Doc[U], metaclass=ABCMeta):
|
|
214
218
|
"""
|
|
215
219
|
A documentation object that can have children. In other words, either a module or a class.
|
|
216
220
|
"""
|
|
@@ -319,13 +323,17 @@ class Namespace(Doc[T], metaclass=ABCMeta):
|
|
|
319
323
|
qualname,
|
|
320
324
|
docstring="",
|
|
321
325
|
annotation=self._var_annotations.get(name, empty),
|
|
322
|
-
default_value=obj,
|
|
326
|
+
default_value=_pydantic.default_value(self.obj, name, obj),
|
|
323
327
|
taken_from=taken_from,
|
|
324
328
|
)
|
|
325
|
-
|
|
329
|
+
|
|
330
|
+
if _doc := _pydantic.get_field_docstring(cast(type, self.obj), name):
|
|
331
|
+
doc.docstring = _doc
|
|
332
|
+
elif self._var_docstrings.get(name):
|
|
326
333
|
doc.docstring = self._var_docstrings[name]
|
|
327
|
-
|
|
334
|
+
elif self._func_docstrings.get(name) and not doc.docstring:
|
|
328
335
|
doc.docstring = self._func_docstrings[name]
|
|
336
|
+
|
|
329
337
|
members[doc.name] = doc
|
|
330
338
|
|
|
331
339
|
if isinstance(self, Module):
|
|
@@ -775,6 +783,12 @@ class Class(Namespace[type]):
|
|
|
775
783
|
for cls in self._bases:
|
|
776
784
|
sorted, unsorted = doc_ast.sort_by_source(cls, sorted, unsorted)
|
|
777
785
|
sorted.update(unsorted)
|
|
786
|
+
|
|
787
|
+
if _pydantic.is_pydantic_model(self.obj):
|
|
788
|
+
sorted = {
|
|
789
|
+
k: v for k, v in sorted.items() if k not in _pydantic.IGNORED_FIELDS
|
|
790
|
+
}
|
|
791
|
+
|
|
778
792
|
return sorted
|
|
779
793
|
|
|
780
794
|
@cached_property
|
|
@@ -868,10 +882,7 @@ class Class(Namespace[type]):
|
|
|
868
882
|
]
|
|
869
883
|
|
|
870
884
|
|
|
871
|
-
|
|
872
|
-
WrappedFunction = types.FunctionType | staticmethod | classmethod
|
|
873
|
-
else: # pragma: no cover
|
|
874
|
-
WrappedFunction = Union[types.FunctionType, staticmethod, classmethod]
|
|
885
|
+
WrappedFunction = types.FunctionType | staticmethod | classmethod
|
|
875
886
|
|
|
876
887
|
|
|
877
888
|
class Function(Doc[types.FunctionType]):
|
|
@@ -908,7 +919,7 @@ class Function(Doc[types.FunctionType]):
|
|
|
908
919
|
else:
|
|
909
920
|
unwrapped = func
|
|
910
921
|
super().__init__(modulename, qualname, unwrapped, taken_from)
|
|
911
|
-
self.wrapped = func
|
|
922
|
+
self.wrapped = func # type: ignore
|
|
912
923
|
|
|
913
924
|
@cache
|
|
914
925
|
@_include_fullname_in_traceback
|
|
@@ -16,6 +16,7 @@ import types
|
|
|
16
16
|
from types import BuiltinFunctionType
|
|
17
17
|
from types import GenericAlias
|
|
18
18
|
from types import ModuleType
|
|
19
|
+
from types import UnionType
|
|
19
20
|
import typing
|
|
20
21
|
from typing import TYPE_CHECKING
|
|
21
22
|
from typing import Any
|
|
@@ -25,7 +26,6 @@ from typing import get_origin
|
|
|
25
26
|
import warnings
|
|
26
27
|
|
|
27
28
|
from . import extract
|
|
28
|
-
from ._compat import UnionType
|
|
29
29
|
from .doc_ast import type_checking_sections
|
|
30
30
|
|
|
31
31
|
if TYPE_CHECKING:
|
|
@@ -108,19 +108,7 @@ def safe_eval_type(
|
|
|
108
108
|
err = str(e)
|
|
109
109
|
_, mod, _ = err.split("'")
|
|
110
110
|
except Exception as e:
|
|
111
|
-
|
|
112
|
-
py_ver = ".".join(str(x) for x in sys.version_info[:3])
|
|
113
|
-
warnings.warn(
|
|
114
|
-
f"Error parsing type annotation {t} for {fullname}: {e}. "
|
|
115
|
-
f"You are likely attempting to use Python 3.10 syntax (PEP 604 union types) with an older Python "
|
|
116
|
-
f"release. `X | Y`-style type annotations are invalid syntax on Python {py_ver}, which is what your "
|
|
117
|
-
f"pdoc instance is using. `from __future__ import annotations` (PEP 563) postpones evaluation of "
|
|
118
|
-
f"annotations, which is why your program won't crash right away. However, pdoc needs to evaluate your "
|
|
119
|
-
f"type annotations and is unable to do so on Python {py_ver}. To fix this issue, either invoke pdoc "
|
|
120
|
-
f"from Python 3.10+, or switch to `typing.Union[]` syntax."
|
|
121
|
-
)
|
|
122
|
-
else:
|
|
123
|
-
warnings.warn(f"Error parsing type annotation {t} for {fullname}: {e}")
|
|
111
|
+
warnings.warn(f"Error parsing type annotation {t} for {fullname}: {e}")
|
|
124
112
|
return t
|
|
125
113
|
|
|
126
114
|
# Simple _eval_type has failed. We now execute all TYPE_CHECKING sections in the module and try again.
|
|
@@ -185,8 +173,6 @@ def _eval_type(t, globalns, localns, recursive_guard=frozenset()):
|
|
|
185
173
|
# Added a special check for typing.Literal, whose literal strings would otherwise be evaluated.
|
|
186
174
|
|
|
187
175
|
if isinstance(t, str):
|
|
188
|
-
if sys.version_info < (3, 9): # pragma: no cover
|
|
189
|
-
t = t.strip("\"'")
|
|
190
176
|
t = typing.ForwardRef(t)
|
|
191
177
|
|
|
192
178
|
if get_origin(t) is Literal:
|
|
@@ -197,24 +183,22 @@ def _eval_type(t, globalns, localns, recursive_guard=frozenset()):
|
|
|
197
183
|
# https://github.com/python/cpython/blob/4f51fa9e2d3ea9316e674fb9a9f3e3112e83661c/Lib/typing.py#L684-L707
|
|
198
184
|
if t.__forward_arg__ in recursive_guard: # pragma: no cover
|
|
199
185
|
return t
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
)
|
|
212
|
-
(type_,) = (eval(t.__forward_code__, globalns, localns),)
|
|
213
|
-
t.__forward_value__ = _eval_type(
|
|
214
|
-
type_, globalns, localns, recursive_guard | {t.__forward_arg__}
|
|
186
|
+
|
|
187
|
+
if globalns is None and localns is None: # pragma: no cover
|
|
188
|
+
globalns = localns = {}
|
|
189
|
+
elif globalns is None: # pragma: no cover
|
|
190
|
+
globalns = localns
|
|
191
|
+
elif localns is None: # pragma: no cover
|
|
192
|
+
localns = globalns
|
|
193
|
+
__forward_module__ = getattr(t, "__forward_module__", None)
|
|
194
|
+
if __forward_module__ is not None:
|
|
195
|
+
globalns = getattr(
|
|
196
|
+
sys.modules.get(__forward_module__, None), "__dict__", globalns
|
|
215
197
|
)
|
|
216
|
-
|
|
217
|
-
return
|
|
198
|
+
(type_,) = (eval(t.__forward_code__, globalns, localns),)
|
|
199
|
+
return _eval_type(
|
|
200
|
+
type_, globalns, localns, recursive_guard | {t.__forward_arg__}
|
|
201
|
+
)
|
|
218
202
|
|
|
219
203
|
# https://github.com/python/cpython/blob/main/Lib/typing.py#L333-L343
|
|
220
204
|
# fmt: off
|
|
@@ -104,13 +104,15 @@ def google(docstring: str) -> str:
|
|
|
104
104
|
)
|
|
105
105
|
|
|
106
106
|
|
|
107
|
-
GOOGLE_LIST_SECTIONS = ["Args", "Raises", "Attributes"]
|
|
107
|
+
GOOGLE_LIST_SECTIONS = ["Args", "Raises", "Attributes", "Keyword Args"]
|
|
108
108
|
"""Section headers listed in the official Google docstring style guide."""
|
|
109
109
|
|
|
110
110
|
GOOGLE_LIST_SECTION_ALIASES = {
|
|
111
111
|
"Parameters": "Args",
|
|
112
112
|
"Params": "Args",
|
|
113
113
|
"Arguments": "Args",
|
|
114
|
+
"Raise": "Raises",
|
|
115
|
+
"Keyword Arguments": "Keyword Args",
|
|
114
116
|
}
|
|
115
117
|
"""
|
|
116
118
|
Alternative section headers that are not listed in the official Google
|
|
@@ -112,7 +112,7 @@ def parse_spec(spec: Path | str) -> str:
|
|
|
112
112
|
raise ModuleNotFoundError
|
|
113
113
|
except pdoc.docstrings.AnyException:
|
|
114
114
|
# Module does not exist, use local file.
|
|
115
|
-
spec = pspec
|
|
115
|
+
spec = pspec.resolve()
|
|
116
116
|
else:
|
|
117
117
|
# Module does exist. We now check if the local file/directory is the same (e.g. after pip install -e),
|
|
118
118
|
# and emit a warning if that's not the case.
|
|
@@ -24,9 +24,10 @@ except ImportError: # pragma: no cover
|
|
|
24
24
|
from jinja2 import contextfilter as pass_context # type: ignore
|
|
25
25
|
|
|
26
26
|
from jinja2.runtime import Context
|
|
27
|
+
import markdown2
|
|
27
28
|
from markupsafe import Markup
|
|
28
29
|
|
|
29
|
-
import pdoc
|
|
30
|
+
import pdoc
|
|
30
31
|
|
|
31
32
|
from . import docstrings
|
|
32
33
|
|
|
@@ -61,7 +62,7 @@ markdown_extensions = {
|
|
|
61
62
|
"cuddled-lists": None,
|
|
62
63
|
"fenced-code-blocks": {"cssclass": formatter.cssclass},
|
|
63
64
|
"footnotes": None,
|
|
64
|
-
"header-ids": None,
|
|
65
|
+
"header-ids": {"mixed": True, "prefix": None, "reset-count": True},
|
|
65
66
|
"link-patterns": None,
|
|
66
67
|
"markdown-in-html": None,
|
|
67
68
|
"mermaid": None,
|
|
@@ -175,7 +176,7 @@ def to_html(docstring: str) -> str:
|
|
|
175
176
|
# careful: markdown2 returns a subclass of str with an extra
|
|
176
177
|
# .toc_html attribute. don't further process the result,
|
|
177
178
|
# otherwise this attribute will be lost.
|
|
178
|
-
return
|
|
179
|
+
return markdown2.markdown( # type: ignore
|
|
179
180
|
docstring,
|
|
180
181
|
extras=markdown_extensions,
|
|
181
182
|
link_patterns=markdown_link_patterns,
|
|
@@ -408,7 +409,7 @@ def linkify(
|
|
|
408
409
|
# First part of the identifier (e.g. "foo") - this is optional for relative references.
|
|
409
410
|
(?:
|
|
410
411
|
\b
|
|
411
|
-
(?!\d)
|
|
412
|
+
(?!\d)\w+
|
|
412
413
|
|
|
|
413
414
|
\.* # We may also start with multiple dots.
|
|
414
415
|
)
|
|
@@ -416,7 +417,7 @@ def linkify(
|
|
|
416
417
|
(?:
|
|
417
418
|
# A single dot or a dot surrounded with pygments highlighting.
|
|
418
419
|
(?:\.|</span><span\ class="o">\.</span><span\ class="n">)
|
|
419
|
-
(?!\d)
|
|
420
|
+
(?!\d)\w+
|
|
420
421
|
)+
|
|
421
422
|
(?:\(\)|\b(?!\(\))) # we either end on () or on a word boundary.
|
|
422
423
|
(?!</a>) # not an existing link
|
|
@@ -424,7 +425,7 @@ def linkify(
|
|
|
424
425
|
|
|
425
426
|
| # Part 2: `foo` or `foo()`. `foo.bar` is already covered with part 1.
|
|
426
427
|
(?<=<code>)
|
|
427
|
-
(?!\d)
|
|
428
|
+
(?!\d)\w+
|
|
428
429
|
(?:\(\))?
|
|
429
430
|
(?=</code>(?!</a>))
|
|
430
431
|
""",
|
|
@@ -445,9 +445,9 @@ This makes sure that the pdoc styling doesn't leak to the rest of the page when
|
|
|
445
445
|
|
|
446
446
|
.pdoc .attribution img {
|
|
447
447
|
margin-left: 5px;
|
|
448
|
-
height:
|
|
449
|
-
vertical-align:
|
|
450
|
-
width:
|
|
448
|
+
height: 27px;
|
|
449
|
+
vertical-align: bottom;
|
|
450
|
+
width: 50px;
|
|
451
451
|
transition: all 200ms;
|
|
452
452
|
}
|
|
453
453
|
|
|
@@ -14,7 +14,7 @@ A custom template could override this by setting root_module_name to false befor
|
|
|
14
14
|
</html>
|
|
15
15
|
{% else %}
|
|
16
16
|
{% extends "frame.html.jinja2" %}
|
|
17
|
-
{% block title %}Module List
|
|
17
|
+
{% block title %}Module List{% endblock %}
|
|
18
18
|
{% block style %}
|
|
19
19
|
{{ super() | safe }}
|
|
20
20
|
<style>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" role="img" aria-label="pdoc logo" width="300" height="160" viewBox="0 0 150 80"><title>pdoc</title><path d="M132.316 48.886c.276-4.679 2.342-6.698 4.409-7.982s4.27-1.165 6.751-1.055c1.586.07 3.044.156 4.222-.482 1.142-.619 2.026-1.932 2.162-3.739.268-3.576-1.929-5.368-5.006-5.551s-7.599.524-10.517 1.606c-4.455 1.652-8.588 6.606-9.552 8.992s-2.342 6.193-1.745 10.873 2.664 9.221 5.878 11.79 5.878 3.808 10.103 4.312 3.444.229 6.062.229 5.006-2.202 4.914-4.909-2.296-5.001-4.501-4.863-3.077.505-5.281.229-7.715-2.064-7.899-9.451z" fill="#198754"/><circle cx="101.504" cy="48.943" r="14.208" fill="none" stroke="#198754" stroke-width="9.354"/><path d="M87.81.002c-3.637.065-5.001.454-7.014 1.232s-3.443 1.363-6.3 4.282c-1.723 1.76-3.148 5.019-3.776 7.329-.413 1.521-.316 2.63-.316 2.63l-.195 34.612c.065 5.774-6.755 8.305-9.612 8.37s-9.678-1.038-9.743-9.408 7.128-9.521 8.362-9.521c1.413-.13 2.526-.021 3.718-.016 2.071.009 4.157-.778 4.092-4.671s-4.157-4.736-4.157-4.736c-6.3-.843-11.43 2.206-11.43 2.206S40.917 38.15 41.372 49.634 51.568 68.19 61.311 68.125s18.316-7.007 18.445-17.193l.13-22.772c.046-2.291 2.683-3.644 4.476-4.203.745-.232 1.694-.274 1.694-.274l10.457-.13s4.871-.324 7.729-3.114 4.352-6.294 4.352-6.294.974-3.049.13-4.606-.195-1.233-2.792-3.309-8.573-4.477-8.573-4.477S91.447-.063 87.81.002zM0 47.169l.065 28.417S0 80.127 4.481 79.997s5.072-3.866 5.049-4.152l-.113-28.482s1.624-7.656 9.937-7.721 10.002 6.942 10.002 8.499-.909 10.51-9.093 10.51c-.948 0-2.99-.567-4.145-.272-3.919 1-3.194 4.554-3.194 4.554s.065 5.061 7.404 4.996 18.575-6.034 18.575-19.074S26.953 30.04 19.549 29.91 1.234 35.296 0 47.169z" fill="#198754"/><g transform="matrix(.325601 0 0 .325256 -10.32669 -45.802786)"><circle cx="297.554" cy="172.286" r="16.5" fill="#fff"/><ellipse cx="297.709" cy="172.642" rx="11.071" ry="10.871" fill="#105a48"/><circle cx="304.104" cy="167.667" r="4.5" fill="#fff"/></g><path d="M94.661 17.032l.893-1.476s.99.714 1.916.925 1.575.114 2.955.114l14.565-.162c1.283-.032 3.085-.762 3.02-3.293s-.373-3.503-.373-3.503l1.283-.487s.52.503.877 1.573.309 1.995.292 2.66-.227 1.541-.227 1.541 1.564-.308 2.359-1.038.823-.779 1.489-1.508.812-.86.812-.86.552-.13.877.26.341.957.065 1.46-1.672 2.206-3.247 3.066-2.76 1.427-3.929 1.768-3.848.73-7.063.714l-10.944-.114s-2.143-.081-3.02-.373-2.241-.973-2.598-1.265z" fill="#d36d49"/><g fill="#105a48"><ellipse cx="93.052" cy="43.567" rx=".869" ry="1.014" transform="rotate(341.022)"/><ellipse cx="104.3" cy="-16.184" rx=".865" ry="1.009" transform="rotate(14.786)"/></g></svg>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: pdoc
|
|
3
|
-
Version:
|
|
3
|
+
Version: 16.0.0
|
|
4
4
|
Summary: API Documentation for Python Projects
|
|
5
5
|
Author-email: Maximilian Hils <pdoc@maximilianhils.com>
|
|
6
6
|
License: MIT-0
|
|
@@ -16,24 +16,25 @@ Classifier: Development Status :: 5 - Production/Stable
|
|
|
16
16
|
Classifier: Environment :: Console
|
|
17
17
|
Classifier: Intended Audience :: Developers
|
|
18
18
|
Classifier: Operating System :: OS Independent
|
|
19
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
20
19
|
Classifier: Programming Language :: Python :: 3.10
|
|
21
20
|
Classifier: Programming Language :: Python :: 3.11
|
|
22
21
|
Classifier: Programming Language :: Python :: 3.12
|
|
23
22
|
Classifier: Programming Language :: Python :: 3.13
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
24
24
|
Classifier: Typing :: Typed
|
|
25
|
-
Requires-Python: >=3.
|
|
25
|
+
Requires-Python: >=3.10
|
|
26
26
|
Description-Content-Type: text/markdown
|
|
27
27
|
License-File: LICENSE
|
|
28
28
|
Requires-Dist: Jinja2>=2.11.0
|
|
29
29
|
Requires-Dist: pygments>=2.12.0
|
|
30
30
|
Requires-Dist: MarkupSafe>=1.1.1
|
|
31
|
+
Requires-Dist: markdown2>=2.5.4
|
|
31
32
|
|
|
32
33
|
<p align="center">
|
|
33
34
|
<a href="https://pdoc.dev/"><img alt="pdoc" src="https://pdoc.dev/logo.svg" width="200" height="100" /></a>
|
|
34
35
|
<br><br>
|
|
35
|
-
<a href="https://pdoc.dev/docs/pdoc.html"><img height="20" alt="pdoc documentation" src="https://shields.mitmproxy.org/badge/docs-pdoc.dev-brightgreen.svg"></a>
|
|
36
|
-
<img height="20" alt="CI Status" src="https://shields.mitmproxy.org/github/actions/workflow/status/mitmproxy/pdoc/main.yml?label=CI&logo=github">
|
|
36
|
+
<a href="https://pdoc.dev/docs/pdoc.html"><img height="20" alt="pdoc documentation" src="https://shields.mitmproxy.org/badge/docs-pdoc.dev-brightgreen.svg?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOTIiIGhlaWdodD0iMTkyIj48cGF0aCBkPSJNNjcuODA3IDIzLjI0NGMtMTguMDMyIDUuNTIzLTI0LjI3MyA5LjQxMS0zMy4xOTMgMTYuMTY5UzE5LjQwNyA1MS4xMjUgOS4zNCA2OS43NkMzLjI3IDgwLjk5Ni44MjcgOTkuMjcxIDEgMTExLjY3OWMuMTE0IDguMTY5IDIuMTg4IDEzLjU1OSAyLjE4OCAxMy41NTlTNDIuMzI2IDI0Ny4yNyAyMC40MzUgMjc4LjEwNWMtMTAuNDg4IDE0Ljc3MyA4NC40MjIgMjcuMDA3IDgwLjA0NyAxMC40NS0xMC4zOTctMzkuMzQ4LTI3LjU5NS05Ny40MDktMzEuOTA4LTExMy42NjctMy4wNDctMTEuNDg0IDguMTYtMjEuOTk1IDE2LjI5NS0yNy4zNDMgMy4zODMtMi4yMjQgOC4wNTEtMy43ODYgOC4wNTEtMy43ODZsNTEuOTI0LTE1LjU5NXMyMy44MDktOC41NzkgMzQuMDYyLTI2LjU2NyAxMi42ODktMzcuNTg0IDEyLjY4OS0zNy41ODQuNDk1LTE2LjU4OC01LjkzOS0yMy4xNC0yLjczMi01Ljg2Ni0xOC42NDYtMTIuNDk4LTQ5LjEyMi0xMC4wNTMtNDkuMTIyLTEwLjA1My0zMi4wNDktLjYwMi01MC4wODEgNC45MjF6IiBmaWxsPSIjMjBhZDZjIi8+PGcgdHJhbnNmb3JtPSJyb3RhdGUoMzQzLjk5MykiPjxlbGxpcHNlIGN4PSI1Mi4yNzYiIGN5PSI5NC4wODkiIGZpbGw9IiNmZmYiIHJ4PSIyNy44NTIiIHJ5PSIyNy44MjMiLz48ZWxsaXBzZSBjeD0iNTIuNTM4IiBjeT0iOTQuNjg5IiByeD0iMTguNjg4IiByeT0iMTguMzMxIiBmaWxsPSIjMTA1YTQ4Ii8+PGVsbGlwc2UgY3g9IjYzLjMzMyIgY3k9Ijg2LjMiIGZpbGw9IiNmZmYiIHJ4PSI3LjU5NiIgcnk9IjcuNTg4Ii8+PC9nPjxnIGZpbGw9IiMxMDVhNDgiPjxlbGxpcHNlIGN4PSI5NC4xNTQiIGN5PSIxMzUuNzM0IiByeD0iNC41MDUiIHJ5PSI1LjI1NyIgdHJhbnNmb3JtPSJyb3RhdGUoMzI1LjAxNSkiLz48ZWxsaXBzZSBjeD0iMTY3Ljg2IiBjeT0iNTYuOTUxIiByeD0iNC40ODQiIHJ5PSI1LjIzMSIgdHJhbnNmb3JtPSJyb3RhdGUoMzU4Ljc3OSkiLz48L2c+PHBhdGggZD0iTTE4OC45NjIgNzcuNDU4bC0zNC4yNDggMTAuMTcxYy02Ljg3OCAxLjk3My05Ljk3NCAzLjM4OC0xNC44ODggMy42NnMtMTAuODY4LTEuODY5LTEwLjg2OC0xLjg2OWwtMi4zNDIgOC42MzNjMi4xOTcuOTQ0IDkuOTY5IDIuMzkgMTQuNzU2IDIuNTkyczE1LjU4Mi0yLjQ2IDE1LjU4Mi0yLjQ2bDI3LjQ3MS03LjUzNGMxLjk1MS00LjcwOSAzLjQzMi05LjIzOCA0LjUzNy0xMy4xOTN6IiBmaWxsPSIjZTc4MzYxIi8+PC9zdmc+"></a>
|
|
37
|
+
<a href="https://github.com/mitmproxy/pdoc/actions"><img height="20" alt="CI Status" src="https://shields.mitmproxy.org/github/actions/workflow/status/mitmproxy/pdoc/main.yml?label=CI&logo=github"></a>
|
|
37
38
|
<img height="20" alt="Code Coverage" src="https://shields.mitmproxy.org/badge/coverage-100%25-brightgreen">
|
|
38
39
|
<a href="https://autofix.ci"><img height="20" alt="autofix.ci: yes" src="https://shields.mitmproxy.org/badge/autofix.ci-yes-success?logo=data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjZmZmIiB2aWV3Qm94PSIwIDAgMTI4IDEyOCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCB0cmFuc2Zvcm09InNjYWxlKDAuMDYxLC0wLjA2MSkgdHJhbnNsYXRlKC0yNTAsLTE3NTApIiBkPSJNMTMyNSAtMzQwcS0xMTUgMCAtMTY0LjUgMzIuNXQtNDkuNSAxMTQuNXEwIDMyIDUgNzAuNXQxMC41IDcyLjV0NS41IDU0djIyMHEtMzQgLTkgLTY5LjUgLTE0dC03MS41IC01cS0xMzYgMCAtMjUxLjUgNjJ0LTE5MSAxNjl0LTkyLjUgMjQxcS05MCAxMjAgLTkwIDI2NnEwIDEwOCA0OC41IDIwMC41dDEzMiAxNTUuNXQxODguNSA4MXExNSA5OSAxMDAuNSAxODAuNXQyMTcgMTMwLjV0MjgyLjUgNDlxMTM2IDAgMjU2LjUgLTQ2IHQyMDkgLTEyNy41dDEyOC41IC0xODkuNXExNDkgLTgyIDIyNyAtMjEzLjV0NzggLTI5OS41cTAgLTEzNiAtNTggLTI0NnQtMTY1LjUgLTE4NC41dC0yNTYuNSAtMTAzLjVsLTI0MyAtMzAwdi01MnEwIC0yNyAzLjUgLTU2LjV0Ni41IC01Ny41dDMgLTUycTAgLTg1IC00MS41IC0xMTguNXQtMTU3LjUgLTMzLjV6TTEzMjUgLTI2MHE3NyAwIDk4IDE0LjV0MjEgNTcuNXEwIDI5IC0zIDY4dC02LjUgNzN0LTMuNSA0OHY2NGwyMDcgMjQ5IHEtMzEgMCAtNjAgNS41dC01NCAxMi41bC0xMDQgLTEyM3EtMSAzNCAtMiA2My41dC0xIDU0LjVxMCA2OSA5IDEyM2wzMSAyMDBsLTExNSAtMjhsLTQ2IC0yNzFsLTIwNSAyMjZxLTE5IC0xNSAtNDMgLTI4LjV0LTU1IC0yNi41bDIxOSAtMjQydi0yNzZxMCAtMjAgLTUuNSAtNjB0LTEwLjUgLTc5dC01IC01OHEwIC00MCAzMCAtNTMuNXQxMDQgLTEzLjV6TTEyNjIgNjE2cS0xMTkgMCAtMjI5LjUgMzQuNXQtMTkzLjUgOTYuNWw0OCA2NCBxNzMgLTU1IDE3MC41IC04NXQyMDQuNSAtMzBxMTM3IDAgMjQ5IDQ1LjV0MTc5IDEyMXQ2NyAxNjUuNWg4MHEwIC0xMTQgLTc3LjUgLTIwNy41dC0yMDggLTE0OXQtMjg5LjUgLTU1LjV6TTgwMyA1OTVxODAgMCAxNDkgMjkuNXQxMDggNzIuNWwyMjEgLTY3bDMwOSA4NnE0NyAtMzIgMTA0LjUgLTUwdDExNy41IC0xOHE5MSAwIDE2NSAzOHQxMTguNSAxMDMuNXQ0NC41IDE0Ni41cTAgNzYgLTM0LjUgMTQ5dC05NS41IDEzNHQtMTQzIDk5IHEtMzcgMTA3IC0xMTUuNSAxODMuNXQtMTg2IDExNy41dC0yMzAuNSA0MXEtMTAzIDAgLTE5Ny41IC0yNnQtMTY5IC03Mi41dC0xMTcuNSAtMTA4dC00MyAtMTMxLjVxMCAtMzQgMTQuNSAtNjIuNXQ0MC41IC01MC41bC01NSAtNTlxLTM0IDI5IC01NCA2NS41dC0yNSA4MS41cS04MSAtMTggLTE0NSAtNzB0LTEwMSAtMTI1LjV0LTM3IC0xNTguNXEwIC0xMDIgNDguNSAtMTgwLjV0MTI5LjUgLTEyM3QxNzkgLTQ0LjV6Ii8+PC9zdmc+"></a>
|
|
39
40
|
<a href="https://pypi.python.org/pypi/pdoc"><img height="20" alt="PyPI Version" src="https://shields.mitmproxy.org/pypi/v/pdoc.svg"></a>
|
|
@@ -52,7 +53,7 @@ API Documentation for Python Projects.
|
|
|
52
53
|
pip install pdoc
|
|
53
54
|
```
|
|
54
55
|
|
|
55
|
-
pdoc is compatible with Python 3.
|
|
56
|
+
pdoc is compatible with Python 3.10 and newer.
|
|
56
57
|
|
|
57
58
|
|
|
58
59
|
# Usage
|
|
@@ -6,6 +6,7 @@ pyproject.toml
|
|
|
6
6
|
pdoc/__init__.py
|
|
7
7
|
pdoc/__main__.py
|
|
8
8
|
pdoc/_compat.py
|
|
9
|
+
pdoc/_pydantic.py
|
|
9
10
|
pdoc/doc.py
|
|
10
11
|
pdoc/doc_ast.py
|
|
11
12
|
pdoc/doc_pyi.py
|
|
@@ -23,9 +24,6 @@ pdoc.egg-info/dependency_links.txt
|
|
|
23
24
|
pdoc.egg-info/entry_points.txt
|
|
24
25
|
pdoc.egg-info/requires.txt
|
|
25
26
|
pdoc.egg-info/top_level.txt
|
|
26
|
-
pdoc/markdown2/LICENSE
|
|
27
|
-
pdoc/markdown2/README.md
|
|
28
|
-
pdoc/markdown2/__init__.py
|
|
29
27
|
pdoc/templates/README.md
|
|
30
28
|
pdoc/templates/build-search-index.js
|
|
31
29
|
pdoc/templates/content.css
|
|
@@ -61,6 +59,7 @@ pdoc/templates/resources/lightbulb.svg
|
|
|
61
59
|
pdoc/templates/resources/lightning-fill.svg
|
|
62
60
|
pdoc/templates/resources/navtoggle.svg
|
|
63
61
|
pdoc/templates/resources/pdoc-logo.svg
|
|
62
|
+
test/test__pydantic.py
|
|
64
63
|
test/test_doc.py
|
|
65
64
|
test/test_doc_ast.py
|
|
66
65
|
test/test_doc_pyi.py
|