pyrefdev 2025.4__tar.gz → 2025.6__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 (126) hide show
  1. {pyrefdev-2025.4 → pyrefdev-2025.6}/.gitignore +1 -0
  2. pyrefdev-2025.6/.pre-commit-config.yaml +10 -0
  3. pyrefdev-2025.6/CHANGELOG.md +115 -0
  4. pyrefdev-2025.6/CLAUDE.md +51 -0
  5. {pyrefdev-2025.4 → pyrefdev-2025.6}/PKG-INFO +12 -9
  6. {pyrefdev-2025.4 → pyrefdev-2025.6}/README.md +5 -5
  7. {pyrefdev-2025.4 → pyrefdev-2025.6}/pyproject.toml +8 -4
  8. pyrefdev-2025.6/src/pyrefdev/__main__.py +42 -0
  9. pyrefdev-2025.6/src/pyrefdev/_version.py +1 -0
  10. pyrefdev-2025.6/src/pyrefdev/config.py +134 -0
  11. {pyrefdev-2025.4 → pyrefdev-2025.6}/src/pyrefdev/indexer/__main__.py +2 -0
  12. pyrefdev-2025.6/src/pyrefdev/indexer/add_docs.py +44 -0
  13. pyrefdev-2025.6/src/pyrefdev/indexer/crawl_docs.py +262 -0
  14. {pyrefdev-2025.4 → pyrefdev-2025.6}/src/pyrefdev/indexer/parse_docs.py +173 -46
  15. pyrefdev-2025.6/src/pyrefdev/indexer/requests.py +54 -0
  16. pyrefdev-2025.6/src/pyrefdev/indexer/schema.py +16 -0
  17. pyrefdev-2025.6/src/pyrefdev/indexer/update_docs.py +31 -0
  18. pyrefdev-2025.6/src/pyrefdev/indexer/update_landing_page.py +50 -0
  19. {pyrefdev-2025.4 → pyrefdev-2025.6}/src/pyrefdev/mapping/__init__.py +6 -2
  20. {pyrefdev-2025.4 → pyrefdev-2025.6}/src/pyrefdev/mapping/__python__.py +56 -3
  21. pyrefdev-2025.6/src/pyrefdev/mapping/aiohttp.py +646 -0
  22. pyrefdev-2025.6/src/pyrefdev/mapping/aioitertools.py +47 -0
  23. pyrefdev-2025.6/src/pyrefdev/mapping/aiosignal.py +9 -0
  24. pyrefdev-2025.6/src/pyrefdev/mapping/anyio.py +302 -0
  25. pyrefdev-2025.6/src/pyrefdev/mapping/apache-beam.py +6066 -0
  26. pyrefdev-2025.6/src/pyrefdev/mapping/arrow.py +857 -0
  27. pyrefdev-2025.6/src/pyrefdev/mapping/attrs.py +99 -0
  28. pyrefdev-2025.6/src/pyrefdev/mapping/azure-identity.py +182 -0
  29. pyrefdev-2025.6/src/pyrefdev/mapping/boto3.py +154 -0
  30. pyrefdev-2025.6/src/pyrefdev/mapping/botocore.py +58 -0
  31. pyrefdev-2025.6/src/pyrefdev/mapping/cachetools.py +41 -0
  32. pyrefdev-2025.6/src/pyrefdev/mapping/cattrs.py +239 -0
  33. pyrefdev-2025.6/src/pyrefdev/mapping/charset-normalizer.py +68 -0
  34. pyrefdev-2025.6/src/pyrefdev/mapping/click.py +219 -0
  35. pyrefdev-2025.6/src/pyrefdev/mapping/coverage.py +113 -0
  36. pyrefdev-2025.6/src/pyrefdev/mapping/cryptography.py +1188 -0
  37. pyrefdev-2025.6/src/pyrefdev/mapping/cyclopts.py +257 -0
  38. pyrefdev-2025.6/src/pyrefdev/mapping/distlib.py +197 -0
  39. pyrefdev-2025.6/src/pyrefdev/mapping/fastapi.py +897 -0
  40. pyrefdev-2025.6/src/pyrefdev/mapping/fastjsonschema.py +11 -0
  41. pyrefdev-2025.6/src/pyrefdev/mapping/filelock.py +35 -0
  42. pyrefdev-2025.6/src/pyrefdev/mapping/flask.py +502 -0
  43. pyrefdev-2025.6/src/pyrefdev/mapping/frozenlist.py +8 -0
  44. pyrefdev-2025.6/src/pyrefdev/mapping/fsspec.py +248 -0
  45. pyrefdev-2025.6/src/pyrefdev/mapping/google-api-core.py +250 -0
  46. pyrefdev-2025.6/src/pyrefdev/mapping/google-auth.py +670 -0
  47. pyrefdev-2025.6/src/pyrefdev/mapping/grpcio.py +282 -0
  48. pyrefdev-2025.6/src/pyrefdev/mapping/h11.py +61 -0
  49. pyrefdev-2025.6/src/pyrefdev/mapping/h5py.py +120 -0
  50. pyrefdev-2025.6/src/pyrefdev/mapping/httplib2.py +38 -0
  51. pyrefdev-2025.6/src/pyrefdev/mapping/ipython.py +5 -0
  52. pyrefdev-2025.6/src/pyrefdev/mapping/jinja2.py +268 -0
  53. pyrefdev-2025.6/src/pyrefdev/mapping/jsonschema.py +184 -0
  54. pyrefdev-2025.6/src/pyrefdev/mapping/jupyter-core.py +83 -0
  55. pyrefdev-2025.6/src/pyrefdev/mapping/libcst.py +939 -0
  56. pyrefdev-2025.6/src/pyrefdev/mapping/markupsafe.py +12 -0
  57. pyrefdev-2025.6/src/pyrefdev/mapping/matplotlib.py +6351 -0
  58. pyrefdev-2025.6/src/pyrefdev/mapping/more-itertools.py +161 -0
  59. pyrefdev-2025.6/src/pyrefdev/mapping/multidict.py +41 -0
  60. pyrefdev-2025.6/src/pyrefdev/mapping/nbformat.py +38 -0
  61. pyrefdev-2025.6/src/pyrefdev/mapping/networkx.py +1490 -0
  62. pyrefdev-2025.6/src/pyrefdev/mapping/numba.py +48 -0
  63. {pyrefdev-2025.4 → pyrefdev-2025.6}/src/pyrefdev/mapping/numpy.py +43 -0
  64. pyrefdev-2025.6/src/pyrefdev/mapping/oauthlib.py +248 -0
  65. pyrefdev-2025.6/src/pyrefdev/mapping/packaging.py +144 -0
  66. {pyrefdev-2025.4 → pyrefdev-2025.6}/src/pyrefdev/mapping/pandas.py +5 -0
  67. pyrefdev-2025.6/src/pyrefdev/mapping/pathspec.py +88 -0
  68. pyrefdev-2025.6/src/pyrefdev/mapping/pillow.py +1364 -0
  69. pyrefdev-2025.6/src/pyrefdev/mapping/platformdirs.py +163 -0
  70. pyrefdev-2025.6/src/pyrefdev/mapping/pluggy.py +74 -0
  71. pyrefdev-2025.6/src/pyrefdev/mapping/propcache.py +8 -0
  72. pyrefdev-2025.6/src/pyrefdev/mapping/protobuf.py +2011 -0
  73. pyrefdev-2025.6/src/pyrefdev/mapping/psutil.py +176 -0
  74. pyrefdev-2025.6/src/pyrefdev/mapping/pyOpenSSL.py +274 -0
  75. pyrefdev-2025.6/src/pyrefdev/mapping/pyarrow.py +5194 -0
  76. pyrefdev-2025.6/src/pyrefdev/mapping/pyasn1.py +442 -0
  77. pyrefdev-2025.6/src/pyrefdev/mapping/pydantic-core.py +158 -0
  78. pyrefdev-2025.6/src/pyrefdev/mapping/pydantic.py +417 -0
  79. pyrefdev-2025.6/src/pyrefdev/mapping/pygments.py +60 -0
  80. pyrefdev-2025.6/src/pyrefdev/mapping/pyjwt.py +29 -0
  81. pyrefdev-2025.6/src/pyrefdev/mapping/pyparsing.py +403 -0
  82. pyrefdev-2025.6/src/pyrefdev/mapping/pytest.py +547 -0
  83. pyrefdev-2025.4/src/pyrefdev/mapping/dateutil.py → pyrefdev-2025.6/src/pyrefdev/mapping/python-dateutil.py +11 -0
  84. pyrefdev-2025.6/src/pyrefdev/mapping/requests-oauthlib.py +26 -0
  85. pyrefdev-2025.6/src/pyrefdev/mapping/requests-toolbelt.py +89 -0
  86. {pyrefdev-2025.4 → pyrefdev-2025.6}/src/pyrefdev/mapping/requests.py +6 -0
  87. pyrefdev-2025.6/src/pyrefdev/mapping/rich.py +556 -0
  88. pyrefdev-2025.6/src/pyrefdev/mapping/rpds-py.py +44 -0
  89. pyrefdev-2025.6/src/pyrefdev/mapping/s3fs.py +121 -0
  90. pyrefdev-2025.6/src/pyrefdev/mapping/scikit-learn.py +63 -0
  91. pyrefdev-2025.6/src/pyrefdev/mapping/scipy.py +4151 -0
  92. pyrefdev-2025.6/src/pyrefdev/mapping/semver.py +5 -0
  93. pyrefdev-2025.6/src/pyrefdev/mapping/setuptools.py +26 -0
  94. pyrefdev-2025.6/src/pyrefdev/mapping/six.py +67 -0
  95. pyrefdev-2025.6/src/pyrefdev/mapping/sniffio.py +9 -0
  96. pyrefdev-2025.6/src/pyrefdev/mapping/sqlalchemy.py +6604 -0
  97. pyrefdev-2025.6/src/pyrefdev/mapping/tomlkit.py +159 -0
  98. pyrefdev-2025.6/src/pyrefdev/mapping/torch.py +5493 -0
  99. pyrefdev-2025.6/src/pyrefdev/mapping/tox.py +270 -0
  100. pyrefdev-2025.6/src/pyrefdev/mapping/trio.py +425 -0
  101. pyrefdev-2025.6/src/pyrefdev/mapping/typing-extensions.py +127 -0
  102. {pyrefdev-2025.4 → pyrefdev-2025.6}/src/pyrefdev/mapping/urllib3.py +11 -1
  103. pyrefdev-2025.6/src/pyrefdev/mapping/werkzeug.py +567 -0
  104. pyrefdev-2025.6/src/pyrefdev/mapping/wrapt.py +5 -0
  105. pyrefdev-2025.6/src/pyrefdev/mapping/yarl.py +63 -0
  106. pyrefdev-2025.6/src/pyrefdev/mapping/yib.py +10 -0
  107. pyrefdev-2025.6/src/pyrefdev/server.py +35 -0
  108. pyrefdev-2025.6/static/logo128.png +0 -0
  109. pyrefdev-2025.6/templates/index.html +564 -0
  110. pyrefdev-2025.6/tests/test_pyrefdev.py +11 -0
  111. {pyrefdev-2025.4 → pyrefdev-2025.6}/uv.lock +169 -7
  112. pyrefdev-2025.4/CHANGELOG.md +0 -21
  113. pyrefdev-2025.4/index.html +0 -353
  114. pyrefdev-2025.4/src/pyrefdev/__main__.py +0 -27
  115. pyrefdev-2025.4/src/pyrefdev/_version.py +0 -1
  116. pyrefdev-2025.4/src/pyrefdev/config.py +0 -67
  117. pyrefdev-2025.4/src/pyrefdev/indexer/add_docs.py +0 -49
  118. pyrefdev-2025.4/src/pyrefdev/indexer/crawl_docs.py +0 -163
  119. pyrefdev-2025.4/src/pyrefdev/indexer/update_docs.py +0 -16
  120. pyrefdev-2025.4/src/pyrefdev/server.py +0 -21
  121. pyrefdev-2025.4/tests/test_mapping.py +0 -6
  122. {pyrefdev-2025.4 → pyrefdev-2025.6}/.github/workflows/ci.yml +0 -0
  123. {pyrefdev-2025.4 → pyrefdev-2025.6}/.github/workflows/pypi_upload.yml +0 -0
  124. {pyrefdev-2025.4 → pyrefdev-2025.6}/LICENSE +0 -0
  125. {pyrefdev-2025.4 → pyrefdev-2025.6}/pyrefdev.service +0 -0
  126. {pyrefdev-2025.4 → pyrefdev-2025.6}/src/pyrefdev/__init__.py +0 -0
@@ -1,4 +1,5 @@
1
1
  .DS_Store
2
+ api-docs/
2
3
 
3
4
  # Hatch-managed version file
4
5
  src/pyrefdev/_version.py
@@ -0,0 +1,10 @@
1
+ repos:
2
+ - repo: local
3
+ hooks:
4
+ - id: update-landing-page
5
+ name: Update landing page
6
+ language: system
7
+ entry: uv run pyrefdev-indexer update-landing-page
8
+ pass_filenames: false
9
+ files: \.(py|yaml)$
10
+ verbose: true
@@ -0,0 +1,115 @@
1
+ # Changelog
2
+
3
+ ## [Unreleased]
4
+
5
+ Nothing noticeable unreleased.
6
+
7
+ ## v2025.6
8
+
9
+ - Added a `-p/--print` flag to the `pyrefdev` CLI to print the URL instead of opening it in the browser.
10
+ - Support [cyclopts](https://cyclopts.readthedocs.io/en/latest/).
11
+ - Support [yib](https://yib.readthedocs.io/en/latest/).
12
+
13
+ ## v2025.5
14
+
15
+ - Added `add-docs`, `update-docs`, and `update-landing-page` commands to `pyrefdev-indexer`.
16
+ - Added missing module symbols.
17
+ - Support [aiohttp](https://docs.aiohttp.org/en/stable/).
18
+ - Support [aioitertools](https://aioitertools.omnilib.dev/en/stable/).
19
+ - Support [aiosignal](https://aiosignal.aio-libs.org/en/stable/).
20
+ - Support [anyio](https://anyio.readthedocs.io/en/stable/).
21
+ - Support [apache-beam](https://beam.apache.org/releases/pydoc/current/).
22
+ - Support [arrow](https://arrow.readthedocs.io/en/latest/).
23
+ - Support [attrs](https://www.attrs.org/en/stable/).
24
+ - Support [azure-identity](https://azuresdkdocs.z19.web.core.windows.net/python/azure-identity/latest/index.html).
25
+ - Support [boto3](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html).
26
+ - Support [botocore](https://botocore.amazonaws.com/v1/documentation/api/latest/index.html).
27
+ - Support [cachetools](https://cachetools.readthedocs.io/en/latest/).
28
+ - Support [cattrs](https://catt.rs/en/stable/).
29
+ - Support [charset-normalizer](https://charset-normalizer.readthedocs.io/en/latest/).
30
+ - Support [click](https://click.palletsprojects.com/en/stable/).
31
+ - Support [coverage](https://coverage.readthedocs.io/en/latest/).
32
+ - Support [cryptography](https://cryptography.io/en/latest/).
33
+ - Support [distlib](https://distlib.readthedocs.io/en/latest/).
34
+ - Support [fastapi](https://fastapi.tiangolo.com/reference/).
35
+ - Support [fastjsonschema](https://horejsek.github.io/python-fastjsonschema/).
36
+ - Support [filelock](https://py-filelock.readthedocs.io/en/latest/).
37
+ - Support [flask](https://flask.palletsprojects.com/en/stable/).
38
+ - Support [frozenlist](https://frozenlist.aio-libs.org/en/latest/).
39
+ - Support [fsspec](https://filesystem-spec.readthedocs.io/en/latest/).
40
+ - Support [google-api-core](https://googleapis.dev/python/google-api-core/latest/).
41
+ - Support [google-auth](https://googleapis.dev/python/google-auth/latest/).
42
+ - Support [grpcio](https://grpc.github.io/grpc/python/index.html).
43
+ - Support [h11](https://h11.readthedocs.io/en/latest/).
44
+ - Support [h5py](https://docs.h5py.org/en/stable/).
45
+ - Support [httplib2](https://httplib2.readthedocs.io/en/latest/).
46
+ - Support [ipython](https://ipython.readthedocs.io/en/stable/).
47
+ - Support [jinja2](https://jinja.palletsprojects.com/en/latest/).
48
+ - Support [jsonschema](https://python-jsonschema.readthedocs.io/en/stable/).
49
+ - Support [jupyter-core](https://jupyter-core.readthedocs.io/en/latest/).
50
+ - Support [markupsafe](https://markupsafe.palletsprojects.com/en/stable/).
51
+ - Support [matplotlib](https://matplotlib.org/stable/api/index.html).
52
+ - Support [more-itertools](https://more-itertools.readthedocs.io/en/stable/).
53
+ - Support [multidict](https://multidict.aio-libs.org/en/stable/).
54
+ - Support [nbformat](https://nbformat.readthedocs.io/en/latest/).
55
+ - Support [networkx](https://networkx.org/documentation/stable/reference/index.html).
56
+ - Support [numba](https://numba.readthedocs.io/en/stable/reference/index.html).
57
+ - Support [oauthlib](https://oauthlib.readthedocs.io/en/latest/).
58
+ - Support [packaging](https://packaging.pypa.io/en/stable/).
59
+ - Support [pathspec](https://python-path-specification.readthedocs.io/en/latest/index.html).
60
+ - Support [pillow](https://pillow.readthedocs.io/en/stable/).
61
+ - Support [platformdirs](https://platformdirs.readthedocs.io/en/latest/).
62
+ - Support [pluggy](https://pluggy.readthedocs.io/en/latest/).
63
+ - Support [propcache](https://propcache.aio-libs.org/en/latest/).
64
+ - Support [protobuf](https://googleapis.dev/python/protobuf/latest/).
65
+ - Support [psutil](https://psutil.readthedocs.io/en/latest/).
66
+ - Support [pyarrow](https://arrow.apache.org/docs/python/api.html).
67
+ - Support [pyasn1](https://pyasn1.readthedocs.io/en/latest/contents.html).
68
+ - Support [pydantic-core](https://docs.pydantic.dev/latest/).
69
+ - Support [pydantic](https://docs.pydantic.dev/latest/).
70
+ - Support [pygments](https://pygments.org/docs/api/).
71
+ - Support [pyjwt](https://pyjwt.readthedocs.io/en/stable/).
72
+ - Support [pyOpenSSL](https://www.pyopenssl.org/en/latest/).
73
+ - Support [pyparsing](https://pyparsing-docs.readthedocs.io/en/latest/).
74
+ - Support [pytest](https://docs.pytest.org/en/stable/reference/index.html).
75
+ - Support [requests-oauthlib](https://requests-oauthlib.readthedocs.io/en/latest/).
76
+ - Support [requests-toolbelt](https://toolbelt.readthedocs.io/en/latest/index.html).
77
+ - Support [rich](https://rich.readthedocs.io/en/latest/).
78
+ - Support [rpds-py](https://rpds.readthedocs.io/en/latest/).
79
+ - Support [s3fs](https://s3fs.readthedocs.io/en/latest/).
80
+ - Support [scikit-learn](https://scikit-learn.org/stable/api/index.html).
81
+ - Support [scipy](https://docs.scipy.org/doc/scipy/reference/index.html).
82
+ - Support [semver](https://python-semver.readthedocs.io/en/latest/).
83
+ - Support [setuptools](https://setuptools.pypa.io/en/latest/).
84
+ - Support [six](https://six.readthedocs.io/).
85
+ - Support [sniffio](https://sniffio.readthedocs.io/en/latest/).
86
+ - Support [sqlalchemy](https://docs.sqlalchemy.org/en/20/).
87
+ - Support [tomlkit](https://tomlkit.readthedocs.io/en/latest/).
88
+ - Support [torch](https://docs.pytorch.org/docs/stable/index.html).
89
+ - Support [tox](https://tox.wiki/en/stable/).
90
+ - Support [trio](https://trio.readthedocs.io/en/stable/).
91
+ - Support [typing-extensions](https://typing-extensions.readthedocs.io/en/latest/).
92
+ - Support [werkzeug](https://werkzeug.palletsprojects.com/en/stable/).
93
+ - Support [wrapt](https://wrapt.readthedocs.io/en/master/).
94
+ - Support [yarl](https://yarl.aio-libs.org/en/latest/).
95
+
96
+ ## v2025.4
97
+
98
+ - Fix a bug in the crawler where relative paths aren't joined correctly.
99
+ - Support [pandas](https://pandas.pydata.org/docs/reference/index.html).
100
+ - Support [python-dateutil](https://dateutil.readthedocs.io/en/stable/).
101
+ - Support [requests](https://requests.readthedocs.io/en/latest/).
102
+ - Support [urllib3](https://urllib3.readthedocs.io/en/stable/reference/index.html).
103
+
104
+ ## v2025.3
105
+
106
+ - Support [numpy](https://numpy.org/doc/stable/reference/index.html).
107
+
108
+ ## v2025.2
109
+
110
+ - Added a new `pyrefdev-indexer` CLI to `crawl-docs` and `parse-docs`. The `mapping.py` is now reproducible and easily updatable when Python 3.14 is released.
111
+ - Update the mappings.
112
+
113
+ ## v2025.1
114
+
115
+ Initial release.
@@ -0,0 +1,51 @@
1
+ # CLAUDE.md
2
+
3
+ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
+
5
+ ## Architecture
6
+
7
+ The project has several components:
8
+
9
+ 1. **Web Server** (`src/pyrefdev/server.py`): FastAPI application that serves redirects based on symbol lookup. `index.html` is the landing page of the server
10
+ 2. **CLI Tool** (`src/pyrefdev/__main__.py`): Command-line interface that opens documentation in browser
11
+ 3. **Indexer** (`src/pyrefdev/indexer/`): Tools for crawling, parsing, and managing documentation mappings
12
+ 4. **Mapping System** (`src/pyrefdev/mapping/`): Individual Python files per package containing symbol-to-URL mappings
13
+
14
+ ## Common Commands
15
+
16
+ ### Development Setup
17
+ ```bash
18
+ uv sync --all-extras --locked
19
+ ```
20
+
21
+ ### Testing
22
+ ```bash
23
+ uv run pytest
24
+ ```
25
+
26
+ ### Run Web Server
27
+ ```bash
28
+ uv run uvicorn pyrefdev.server:app --reload
29
+ ```
30
+
31
+ ### Run CLI Tool
32
+ ```bash
33
+ pyrefdev <symbol>
34
+ ```
35
+
36
+ ### Indexer Operations
37
+ ```bash
38
+ pyrefdev-indexer add-docs --docs-directory api-docs --package <package> --url <API reference doc root URL>
39
+ pyrefdev-indexer crawl-docs --docs-directory api-docs --package <package>
40
+ pyrefdev-indexer parse-docs --docs-directory api-docs --package <package>
41
+ pyrefdev-indexer update-docs --docs-directory api-docs --package <package>
42
+ pyrefdev-indexer update-landing-page
43
+ ```
44
+
45
+ ## Development Workflow
46
+
47
+ - **Testing**: Run pytest to ensure mappings work correctly
48
+
49
+ ## Important Notes
50
+
51
+ - Server deployment uses systemd and is configured in `pyrefdev.service`
@@ -1,9 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyrefdev
3
- Version: 2025.4
3
+ Version: 2025.6
4
4
  Summary: The entry point to Python reference docs
5
- Project-URL: Home, https://pyref.dev
5
+ Project-URL: Homepage, https://pyref.dev
6
6
  Project-URL: Source, https://github.com/mangoumbrella/pyref.dev
7
+ Project-URL: Changelog, https://github.com/mangoumbrella/pyref.dev/blob/main/CHANGELOG.md
7
8
  Author-email: Mango Umbrella LLC <hi@mangoumbrella.com>
8
9
  License-Expression: Apache-2.0
9
10
  License-File: LICENSE
@@ -22,10 +23,12 @@ Classifier: Programming Language :: Python :: 3.14
22
23
  Classifier: Programming Language :: Python :: Free Threading
23
24
  Classifier: Topic :: Documentation
24
25
  Requires-Python: >=3.10
25
- Requires-Dist: yib>=0.2.0
26
+ Requires-Dist: cyclopts>=3.19.0
27
+ Requires-Dist: jinja2>=3.1.6
28
+ Requires-Dist: packaging>=25.0
29
+ Requires-Dist: yib>=0.3.0
26
30
  Provides-Extra: indexer
27
31
  Requires-Dist: beautifulsoup4>=4.13.4; extra == 'indexer'
28
- Requires-Dist: cyclopts>=3.19.0; extra == 'indexer'
29
32
  Requires-Dist: rich>=14.0.0; extra == 'indexer'
30
33
  Provides-Extra: server
31
34
  Requires-Dist: fastapi<1,>=0.115.12; extra == 'server'
@@ -52,10 +55,10 @@ Alternatively, you could also `pip install pyrefdev` and run the `pyrefdev` CLI
52
55
 
53
56
  ## Examples
54
57
 
55
- * https://pyref.dev/json
56
- * https://pyref.dev/pathlib.Path
57
- * https://pyref.dev/datetime.datetime.strftime
58
- * https://pyref.dev/numpy.array
58
+ * [pyref.dev/json](https://pyref.dev/json)
59
+ * [pyref.dev/pathlib.Path](https://pyref.dev/pathlib.Path)
60
+ * [pyref.dev/datetime.datetime.strftime](https://pyref.dev/datetime.datetime.strftime)
61
+ * [pyref.dev/numpy.array](https://pyref.dev/numpy.array)
59
62
 
60
63
  ## Supported packages
61
64
 
@@ -81,7 +84,7 @@ To update to a new version:
81
84
  ```bash
82
85
  > cd pyref.dev
83
86
  > git pull
84
- > uv sync --all-extras
87
+ > uv sync --all-extras --locked
85
88
  > systemctl restart pyrefdev.service
86
89
  ```
87
90
 
@@ -18,10 +18,10 @@ Alternatively, you could also `pip install pyrefdev` and run the `pyrefdev` CLI
18
18
 
19
19
  ## Examples
20
20
 
21
- * https://pyref.dev/json
22
- * https://pyref.dev/pathlib.Path
23
- * https://pyref.dev/datetime.datetime.strftime
24
- * https://pyref.dev/numpy.array
21
+ * [pyref.dev/json](https://pyref.dev/json)
22
+ * [pyref.dev/pathlib.Path](https://pyref.dev/pathlib.Path)
23
+ * [pyref.dev/datetime.datetime.strftime](https://pyref.dev/datetime.datetime.strftime)
24
+ * [pyref.dev/numpy.array](https://pyref.dev/numpy.array)
25
25
 
26
26
  ## Supported packages
27
27
 
@@ -47,7 +47,7 @@ To update to a new version:
47
47
  ```bash
48
48
  > cd pyref.dev
49
49
  > git pull
50
- > uv sync --all-extras
50
+ > uv sync --all-extras --locked
51
51
  > systemctl restart pyrefdev.service
52
52
  ```
53
53
 
@@ -30,13 +30,17 @@ keywords = [
30
30
  ]
31
31
  requires-python = ">=3.10"
32
32
  dependencies = [
33
- "yib>=0.2.0",
33
+ "cyclopts>=3.19.0",
34
+ "jinja2>=3.1.6",
35
+ "packaging>=25.0",
36
+ "yib>=0.3.0",
34
37
  ]
35
38
  dynamic = ["version"]
36
39
 
37
40
  [project.urls]
38
- Home = "https://pyref.dev"
41
+ Homepage = "https://pyref.dev"
39
42
  Source = "https://github.com/mangoumbrella/pyref.dev"
43
+ Changelog = "https://github.com/mangoumbrella/pyref.dev/blob/main/CHANGELOG.md"
40
44
 
41
45
  [project.optional-dependencies]
42
46
  server = [
@@ -44,13 +48,12 @@ server = [
44
48
  "fastapi>=0.115.12,<1",
45
49
  ]
46
50
  indexer = [
47
- "cyclopts>=3.19.0",
48
51
  "rich>=14.0.0",
49
52
  "Beautifulsoup4>=4.13.4",
50
53
  ]
51
54
 
52
55
  [project.scripts]
53
- pyrefdev = "pyrefdev.__main__:main"
56
+ pyrefdev = "pyrefdev.__main__:app"
54
57
  pyrefdev-indexer = "pyrefdev.indexer.__main__:app"
55
58
 
56
59
  [tool.hatch.version]
@@ -65,4 +68,5 @@ version = "{version}"
65
68
  [dependency-groups]
66
69
  dev = [
67
70
  "pytest>=8.4.1",
71
+ "pre-commit>=4.2.0",
68
72
  ]
@@ -0,0 +1,42 @@
1
+ import webbrowser
2
+ import sys
3
+ from typing import Annotated
4
+
5
+ import cyclopts
6
+ from cyclopts import Parameter
7
+
8
+ import pyrefdev
9
+ from pyrefdev.mapping import MAPPING
10
+
11
+
12
+ app = cyclopts.App("pyrefdev", help=pyrefdev.__doc__)
13
+
14
+
15
+ @app.default
16
+ def main(
17
+ symbol: str,
18
+ /,
19
+ *,
20
+ should_print: Annotated[
21
+ bool,
22
+ Parameter(
23
+ name=["--print", "-p"],
24
+ negative="--no-print",
25
+ help="When true, print the API reference URL instead of opening it in the browser.",
26
+ ),
27
+ ] = False,
28
+ ):
29
+ if not (url := MAPPING.get(symbol)):
30
+ url = MAPPING.get(symbol.lower())
31
+ if url:
32
+ if should_print:
33
+ print(url)
34
+ else:
35
+ webbrowser.open_new_tab(url)
36
+ else:
37
+ print(f"{symbol} not found", file=sys.stderr)
38
+ sys.exit(1)
39
+
40
+
41
+ if __name__ == "__main__":
42
+ app()
@@ -0,0 +1 @@
1
+ version = "2025.6"
@@ -0,0 +1,134 @@
1
+ import dataclasses
2
+
3
+ from yib import yconsole
4
+
5
+
6
+ console = yconsole.Console(stderr=True)
7
+
8
+
9
+ @dataclasses.dataclass
10
+ class Package:
11
+ pypi: str
12
+ # The crawler will crawl URLs with the same prefix until the last slash.
13
+ index_url: str
14
+ namespaces: list[str] = dataclasses.field(default_factory=list)
15
+ exclude_root_urls: list[str] = dataclasses.field(default_factory=list)
16
+
17
+ def __post_init__(self):
18
+ if not self.namespaces:
19
+ self.namespaces = [self.pypi.replace("-", "_")]
20
+
21
+ def is_cpython(self):
22
+ return self.pypi == "__python__"
23
+
24
+
25
+ # fmt: off
26
+ _packages = [
27
+ Package(
28
+ pypi="__python__",
29
+ index_url="https://docs.python.org/3/library",
30
+ exclude_root_urls=[
31
+ "https://docs.python.org/3/copyright.html", # Conflict with built-in copyright.
32
+ ],
33
+ ),
34
+ Package(pypi="attrs", index_url="https://www.attrs.org/en/stable/", namespaces=["attrs", "attr"]),
35
+ Package(pypi="boto3", index_url="https://boto3.amazonaws.com/v1/documentation/api/latest/index.html", exclude_root_urls=["https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/"]), # TODO: Support boto services
36
+ Package(pypi="botocore", index_url="https://botocore.amazonaws.com/v1/documentation/api/latest/index.html", exclude_root_urls=["https://botocore.amazonaws.com/v1/documentation/api/latest/reference/services/"]), # TODO: Support boto services
37
+ Package(pypi="charset-normalizer", index_url="https://charset-normalizer.readthedocs.io/en/latest/"),
38
+ Package(pypi="cryptography", index_url="https://cryptography.io/en/latest/"),
39
+ Package(pypi="fsspec", index_url="https://filesystem-spec.readthedocs.io/en/latest/"),
40
+ Package(pypi="google-api-core", namespaces=["google.api_core"], index_url="https://googleapis.dev/python/google-api-core/latest/"),
41
+ Package(pypi="numpy", index_url="https://numpy.org/doc/stable/reference/index.html"),
42
+ Package(pypi="packaging", index_url="https://packaging.pypa.io/en/stable/"),
43
+ Package(pypi="pandas", index_url="https://pandas.pydata.org/docs/reference/index.html"),
44
+ Package(pypi="protobuf", index_url="https://googleapis.dev/python/protobuf/latest/",namespaces=["google.protobuf"]),
45
+ Package(pypi="pydantic-core", index_url="https://docs.pydantic.dev/latest/"),
46
+ Package(pypi="pydantic", index_url="https://docs.pydantic.dev/latest/"),
47
+ Package(pypi="python-dateutil", namespaces=["dateutil"], index_url="https://dateutil.readthedocs.io/en/stable/"),
48
+ Package(pypi="requests", index_url="https://requests.readthedocs.io/en/latest/"),
49
+ Package(pypi="s3fs", index_url="https://s3fs.readthedocs.io/en/latest/"),
50
+ Package(pypi="setuptools", index_url="https://setuptools.pypa.io/en/latest/"),
51
+ Package(pypi="six", index_url="https://six.readthedocs.io/"),
52
+ Package(pypi="typing-extensions", index_url="https://typing-extensions.readthedocs.io/en/latest/"),
53
+ Package(pypi="urllib3", index_url="https://urllib3.readthedocs.io/en/stable/reference/index.html"),
54
+ Package(pypi="platformdirs", index_url="https://platformdirs.readthedocs.io/en/latest/"),
55
+ Package(pypi="click", index_url="https://click.palletsprojects.com/en/stable/"),
56
+ Package(pypi="grpcio", index_url="https://grpc.github.io/grpc/python/index.html", namespaces=["grpc"]),
57
+ Package(pypi="jinja2", index_url="https://jinja.palletsprojects.com/en/latest/"),
58
+ Package(pypi="pyasn1", index_url="https://pyasn1.readthedocs.io/en/latest/contents.html"),
59
+ Package(pypi="h11", index_url="https://h11.readthedocs.io/en/latest/"),
60
+ Package(pypi="filelock", index_url="https://py-filelock.readthedocs.io/en/latest/"),
61
+ Package(pypi="aiohttp", index_url="https://docs.aiohttp.org/en/stable/"),
62
+ Package(pypi="cachetools", index_url="https://cachetools.readthedocs.io/en/latest/"),
63
+ Package(pypi="pluggy", index_url="https://pluggy.readthedocs.io/en/latest/"),
64
+ Package(pypi="markupsafe", index_url="https://markupsafe.palletsprojects.com/en/stable/"),
65
+ Package(pypi="scipy", index_url="https://docs.scipy.org/doc/scipy/reference/index.html"),
66
+ Package(pypi="propcache", index_url="https://propcache.aio-libs.org/en/latest/"),
67
+ Package(pypi="pathspec", index_url="https://python-path-specification.readthedocs.io/en/latest/index.html"),
68
+ Package(pypi="aiosignal", index_url="https://aiosignal.aio-libs.org/en/stable/"),
69
+ Package(pypi="pyOpenSSL", namespaces=["OpenSSL"], index_url="https://www.pyopenssl.org/en/latest/"),
70
+ Package(pypi="oauthlib", index_url="https://oauthlib.readthedocs.io/en/latest/"),
71
+ Package(pypi="requests-toolbelt", index_url="https://toolbelt.readthedocs.io/en/latest/index.html"),
72
+ Package(pypi="azure-identity", namespaces=["azure.identity"], index_url="https://azuresdkdocs.z19.web.core.windows.net/python/azure-identity/latest/index.html"),
73
+ Package(pypi="distlib", index_url="https://distlib.readthedocs.io/en/latest/"),
74
+ Package(pypi="pillow", namespaces=["PIL"], index_url="https://pillow.readthedocs.io/en/stable/"),
75
+ Package(pypi="frozenlist", index_url="https://frozenlist.aio-libs.org/en/latest/"),
76
+ Package(pypi="pyparsing", index_url="https://pyparsing-docs.readthedocs.io/en/latest/"),
77
+ Package(pypi="tomlkit", index_url="https://tomlkit.readthedocs.io/en/latest/"),
78
+ Package(pypi="rich", index_url="https://rich.readthedocs.io/en/latest/"),
79
+ Package(pypi="sqlalchemy", index_url="https://docs.sqlalchemy.org/en/20/"),
80
+ Package(pypi="requests-oauthlib", index_url="https://requests-oauthlib.readthedocs.io/en/latest/"),
81
+ Package(pypi="yarl", index_url="https://yarl.aio-libs.org/en/latest/"),
82
+ Package(pypi="multidict", index_url="https://multidict.aio-libs.org/en/stable/"),
83
+ Package(pypi="pyarrow", index_url="https://arrow.apache.org/docs/python/api.html"),
84
+ Package(pypi="sniffio", index_url="https://sniffio.readthedocs.io/en/latest/"),
85
+ Package(pypi="jsonschema", index_url="https://python-jsonschema.readthedocs.io/en/stable/"),
86
+ Package(pypi="google-auth", namespaces=["google.auth"], index_url="https://googleapis.dev/python/google-auth/latest/"),
87
+ Package(pypi="pyjwt", namespaces=["jwt"], index_url="https://pyjwt.readthedocs.io/en/stable/"),
88
+ Package(pypi="anyio", index_url="https://anyio.readthedocs.io/en/stable/"),
89
+ Package(pypi="psutil", index_url="https://psutil.readthedocs.io/en/latest/"),
90
+ Package(pypi="wrapt", index_url="https://wrapt.readthedocs.io/en/master/"),
91
+ Package(pypi="pygments", index_url="https://pygments.org/docs/api/"),
92
+ Package(pypi="rpds-py", namespaces=["rpds"], index_url="https://rpds.readthedocs.io/en/latest/"),
93
+ Package(pypi="pytest", index_url="https://docs.pytest.org/en/stable/reference/index.html"),
94
+ Package(pypi="libcst", index_url="https://libcst.readthedocs.io/en/latest/"),
95
+ Package(pypi="numba", index_url="https://numba.readthedocs.io/en/stable/reference/index.html"),
96
+ Package(pypi="trio", index_url="https://trio.readthedocs.io/en/stable/"),
97
+ Package(pypi="tox", index_url="https://tox.wiki/en/stable/"),
98
+ Package(pypi="h5py", index_url="https://docs.h5py.org/en/stable/"),
99
+ Package(pypi="cattrs", index_url="https://catt.rs/en/stable/"),
100
+ Package(pypi="nbformat", index_url="https://nbformat.readthedocs.io/en/latest/"),
101
+ Package(pypi="semver", index_url="https://python-semver.readthedocs.io/en/latest/"),
102
+ Package(pypi="aioitertools", index_url="https://aioitertools.omnilib.dev/en/stable/"),
103
+ Package(pypi="torch", index_url="https://docs.pytorch.org/docs/stable/index.html"),
104
+ Package(pypi="arrow", index_url="https://arrow.readthedocs.io/en/latest/"),
105
+ Package(pypi="apache-beam", index_url="https://beam.apache.org/releases/pydoc/current/"),
106
+ Package(pypi="fastapi", index_url="https://fastapi.tiangolo.com/reference/"),
107
+ Package(pypi="flask", index_url="https://flask.palletsprojects.com/en/stable/"),
108
+ Package(pypi="fastjsonschema", index_url="https://horejsek.github.io/python-fastjsonschema/"),
109
+ Package(pypi="jupyter-core", index_url="https://jupyter-core.readthedocs.io/en/latest/"),
110
+ Package(pypi="more-itertools", index_url="https://more-itertools.readthedocs.io/en/stable/"),
111
+ Package(pypi="werkzeug", index_url="https://werkzeug.palletsprojects.com/en/stable/"),
112
+ Package(pypi="scikit-learn", namespaces=["sklearn"], index_url="https://scikit-learn.org/stable/api/index.html"),
113
+ Package(pypi="coverage", index_url="https://coverage.readthedocs.io/en/latest/"),
114
+ Package(pypi="matplotlib", index_url="https://matplotlib.org/stable/api/index.html"),
115
+ Package(pypi="networkx", index_url="https://networkx.org/documentation/stable/reference/index.html"),
116
+ Package(pypi="ipython", index_url="https://ipython.readthedocs.io/en/stable/"),
117
+ Package(pypi="httplib2", index_url="https://httplib2.readthedocs.io/en/latest/"),
118
+ Package(pypi="cyclopts", index_url="https://cyclopts.readthedocs.io/en/latest/"),
119
+ Package(pypi="yib", index_url="https://yib.readthedocs.io/en/latest/"),
120
+ # ENTRY-LINE-MARKER
121
+ ]
122
+ # fmt: on
123
+
124
+
125
+ SUPPORTED_PACKAGES: dict[str, Package] = {pkg.pypi: pkg for pkg in _packages}
126
+
127
+
128
+ def get_packages(package: str | None) -> list[Package]:
129
+ if package is None:
130
+ return list(SUPPORTED_PACKAGES.values())
131
+ else:
132
+ if package not in SUPPORTED_PACKAGES:
133
+ console.fatal(f"No package named {package}")
134
+ return [SUPPORTED_PACKAGES[package]]
@@ -5,6 +5,7 @@ from pyrefdev.indexer.add_docs import add_docs
5
5
  from pyrefdev.indexer.crawl_docs import crawl_docs
6
6
  from pyrefdev.indexer.parse_docs import parse_docs
7
7
  from pyrefdev.indexer.update_docs import update_docs
8
+ from pyrefdev.indexer.update_landing_page import update_landing_page
8
9
  from pyrefdev.config import console
9
10
 
10
11
 
@@ -18,6 +19,7 @@ app.command(add_docs)
18
19
  app.command(crawl_docs)
19
20
  app.command(parse_docs)
20
21
  app.command(update_docs)
22
+ app.command(update_landing_page)
21
23
 
22
24
 
23
25
  if __name__ == "__main__":
@@ -0,0 +1,44 @@
1
+ import importlib
2
+ from pathlib import Path
3
+ import re
4
+
5
+ from pyrefdev import config
6
+ from pyrefdev.config import console
7
+ from pyrefdev.indexer.update_docs import update_docs
8
+ from pyrefdev.indexer.update_landing_page import update_landing_page_with_packages
9
+
10
+
11
+ _MARKER = re.compile("(\n.*ENTRY-LINE-MARKER.*\n)")
12
+
13
+
14
+ def add_docs(
15
+ *,
16
+ package: str,
17
+ docs_directory: Path | None = None,
18
+ url: str,
19
+ namespaces: list[str] | None = None,
20
+ crawl: bool = True,
21
+ num_threads_per_package: int | None = None,
22
+ ) -> None:
23
+ if package in config.SUPPORTED_PACKAGES:
24
+ console.fatal(f"Package exists: {package}")
25
+
26
+ if namespaces:
27
+ ns_content = ", ".join(f'"{ns}"' for ns in namespaces)
28
+ ns_str = f", namespaces=[{ns_content}]"
29
+ else:
30
+ ns_str = ""
31
+ config_entry = f'\n Package(pypi="{package}"{ns_str}, index_url="{url}"),'
32
+ config_file = Path(config.__file__)
33
+ config_content = config_file.read_text()
34
+ config_content = _MARKER.sub(config_entry + r"\g<1>", config_content)
35
+ config_file.write_text(config_content)
36
+
37
+ if crawl:
38
+ importlib.reload(config)
39
+ update_docs(
40
+ docs_directory=docs_directory,
41
+ package=package,
42
+ num_threads_per_package=num_threads_per_package,
43
+ )
44
+ update_landing_page_with_packages(config.SUPPORTED_PACKAGES)