pdoc 15.0.4__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.
Files changed (80) hide show
  1. {pdoc-15.0.4 → pdoc-16.0.0}/CHANGELOG.md +19 -0
  2. {pdoc-15.0.4/pdoc.egg-info → pdoc-16.0.0}/PKG-INFO +7 -6
  3. {pdoc-15.0.4 → pdoc-16.0.0}/README.md +3 -3
  4. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/__init__.py +20 -1
  5. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/_compat.py +1 -26
  6. pdoc-16.0.0/pdoc/_pydantic.py +54 -0
  7. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/doc.py +23 -12
  8. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/doc_types.py +17 -33
  9. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/docstrings.py +3 -1
  10. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/render_helpers.py +6 -5
  11. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/content.css +3 -3
  12. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/default/index.html.jinja2 +1 -1
  13. pdoc-16.0.0/pdoc/templates/resources/pdoc-logo.svg +1 -0
  14. {pdoc-15.0.4 → pdoc-16.0.0/pdoc.egg-info}/PKG-INFO +7 -6
  15. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc.egg-info/SOURCES.txt +2 -3
  16. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc.egg-info/requires.txt +1 -0
  17. {pdoc-15.0.4 → pdoc-16.0.0}/pyproject.toml +13 -8
  18. pdoc-16.0.0/test/test__pydantic.py +26 -0
  19. {pdoc-15.0.4 → pdoc-16.0.0}/test/test_doc_types.py +0 -11
  20. {pdoc-15.0.4 → pdoc-16.0.0}/test/test_snapshot.py +7 -8
  21. pdoc-15.0.4/pdoc/markdown2/LICENSE +0 -23
  22. pdoc-15.0.4/pdoc/markdown2/README.md +0 -2
  23. pdoc-15.0.4/pdoc/markdown2/__init__.py +0 -4029
  24. pdoc-15.0.4/pdoc/templates/resources/pdoc-logo.svg +0 -1
  25. {pdoc-15.0.4 → pdoc-16.0.0}/LICENSE +0 -0
  26. {pdoc-15.0.4 → pdoc-16.0.0}/MANIFEST.in +0 -0
  27. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/__main__.py +0 -0
  28. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/doc_ast.py +0 -0
  29. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/doc_pyi.py +0 -0
  30. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/extract.py +0 -0
  31. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/py.typed +0 -0
  32. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/render.py +0 -0
  33. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/search.py +0 -0
  34. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/README.md +0 -0
  35. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/build-search-index.js +0 -0
  36. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/custom.css +0 -0
  37. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/default/error.html.jinja2 +0 -0
  38. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/default/frame.html.jinja2 +0 -0
  39. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/default/module.html.jinja2 +0 -0
  40. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/deprecated/README.md +0 -0
  41. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/deprecated/bootstrap-reboot.min.css +0 -0
  42. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/deprecated/box-arrow-in-left.svg +0 -0
  43. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/deprecated/elasticlunr.min.js +0 -0
  44. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/deprecated/favicon.svg +0 -0
  45. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/deprecated/navtoggle.svg +0 -0
  46. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/deprecated/pdoc-logo.svg +0 -0
  47. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/deprecated/resources/favicon.svg +0 -0
  48. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/layout.css +0 -0
  49. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/livereload.html.jinja2 +0 -0
  50. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/math.html.jinja2 +0 -0
  51. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/mermaid.html.jinja2 +0 -0
  52. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/resources/bootstrap-reboot.min.css +0 -0
  53. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/resources/box-arrow-in-left.svg +0 -0
  54. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/resources/elasticlunr.min.js +0 -0
  55. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/resources/exclamation-octagon-fill.svg +0 -0
  56. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/resources/exclamation-square-fill.svg +0 -0
  57. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/resources/exclamation-triangle-fill.svg +0 -0
  58. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/resources/info-circle-fill.svg +0 -0
  59. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/resources/lightbulb.svg +0 -0
  60. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/resources/lightning-fill.svg +0 -0
  61. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/resources/navtoggle.svg +0 -0
  62. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/search.html.jinja2 +0 -0
  63. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/search.js.jinja2 +0 -0
  64. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/syntax-highlighting.css +0 -0
  65. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/templates/theme.css +0 -0
  66. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc/web.py +0 -0
  67. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc.egg-info/dependency_links.txt +0 -0
  68. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc.egg-info/entry_points.txt +0 -0
  69. {pdoc-15.0.4 → pdoc-16.0.0}/pdoc.egg-info/top_level.txt +0 -0
  70. {pdoc-15.0.4 → pdoc-16.0.0}/setup.cfg +0 -0
  71. {pdoc-15.0.4 → pdoc-16.0.0}/test/test_doc.py +0 -0
  72. {pdoc-15.0.4 → pdoc-16.0.0}/test/test_doc_ast.py +0 -0
  73. {pdoc-15.0.4 → pdoc-16.0.0}/test/test_doc_pyi.py +0 -0
  74. {pdoc-15.0.4 → pdoc-16.0.0}/test/test_docstrings.py +0 -0
  75. {pdoc-15.0.4 → pdoc-16.0.0}/test/test_extract.py +0 -0
  76. {pdoc-15.0.4 → pdoc-16.0.0}/test/test_main.py +0 -0
  77. {pdoc-15.0.4 → pdoc-16.0.0}/test/test_render_helpers.py +0 -0
  78. {pdoc-15.0.4 → pdoc-16.0.0}/test/test_search.py +0 -0
  79. {pdoc-15.0.4 → pdoc-16.0.0}/test/test_smoke.py +0 -0
  80. {pdoc-15.0.4 → pdoc-16.0.0}/test/test_web.py +0 -0
@@ -5,6 +5,25 @@
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
+
8
27
  ## 2025-06-04: pdoc 15.0.4
9
28
 
10
29
  - Include included HTML headers in the ToC by default by enabling markdown2's `mixed=True` option of the `header-ids` extra
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pdoc
3
- Version: 15.0.4
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.9
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.9 and newer.
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.9 and newer.
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__ = "15.0.4" # this is read from setup.py
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 >= (3, 10):
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 Union
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
- class Namespace(Doc[T], metaclass=ABCMeta):
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
- if self._var_docstrings.get(name):
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
- if self._func_docstrings.get(name) and not doc.docstring:
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
- if sys.version_info >= (3, 10):
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
- if "unsupported operand type(s) for |" in str(e) and sys.version_info < (3, 10):
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
- if not t.__forward_evaluated__ or localns is not globalns:
201
- if globalns is None and localns is None: # pragma: no cover
202
- globalns = localns = {}
203
- elif globalns is None: # pragma: no cover
204
- globalns = localns
205
- elif localns is None: # pragma: no cover
206
- localns = globalns
207
- __forward_module__ = getattr(t, "__forward_module__", None)
208
- if __forward_module__ is not None:
209
- globalns = getattr(
210
- sys.modules.get(__forward_module__, None), "__dict__", globalns
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
- t.__forward_evaluated__ = True
217
- return t.__forward_value__
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
@@ -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.markdown2
30
+ import pdoc
30
31
 
31
32
  from . import docstrings
32
33
 
@@ -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 pdoc.markdown2.markdown( # type: ignore
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)[a-zA-Z0-9_]+
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)[a-zA-Z0-9_]+
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)[a-zA-Z0-9_]+
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: 35px;
449
- vertical-align: middle;
450
- width: 70px;
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 &ndash; pdoc {{ __version__ }}{% endblock %}
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: 15.0.4
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.9
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.9 and newer.
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
@@ -1,3 +1,4 @@
1
1
  Jinja2>=2.11.0
2
2
  pygments>=2.12.0
3
3
  MarkupSafe>=1.1.1
4
+ markdown2>=2.5.4