pyrefdev 2025.5__tar.gz → 2025.7__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.
- {pyrefdev-2025.5 → pyrefdev-2025.7}/.gitignore +1 -1
- pyrefdev-2025.7/.pre-commit-config.yaml +10 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/CHANGELOG.md +11 -0
- pyrefdev-2025.7/CLAUDE.md +54 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/PKG-INFO +24 -10
- {pyrefdev-2025.5 → pyrefdev-2025.7}/README.md +18 -6
- {pyrefdev-2025.5 → pyrefdev-2025.7}/pyproject.toml +7 -4
- pyrefdev-2025.7/src/pyrefdev/__main__.py +42 -0
- pyrefdev-2025.7/src/pyrefdev/_version.py +1 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/config.py +2 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/indexer/crawl_docs.py +4 -6
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/indexer/requests.py +2 -6
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/indexer/update_landing_page.py +1 -1
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/__init__.py +1 -1
- pyrefdev-2025.7/src/pyrefdev/mapping/cyclopts.py +257 -0
- pyrefdev-2025.7/src/pyrefdev/mapping/yib.py +10 -0
- pyrefdev-2025.7/src/pyrefdev/server.py +116 -0
- pyrefdev-2025.7/static/logo128.png +0 -0
- pyrefdev-2025.7/static/styles.css +693 -0
- pyrefdev-2025.7/templates/index.html +178 -0
- pyrefdev-2025.7/templates/search.html +152 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/uv.lock +167 -7
- pyrefdev-2025.5/index.html +0 -556
- pyrefdev-2025.5/src/pyrefdev/__main__.py +0 -27
- pyrefdev-2025.5/src/pyrefdev/_version.py +0 -1
- pyrefdev-2025.5/src/pyrefdev/server.py +0 -21
- {pyrefdev-2025.5 → pyrefdev-2025.7}/.github/workflows/ci.yml +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/.github/workflows/pypi_upload.yml +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/LICENSE +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/pyrefdev.service +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/__init__.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/indexer/__main__.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/indexer/add_docs.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/indexer/parse_docs.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/indexer/schema.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/indexer/update_docs.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/__python__.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/aiohttp.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/aioitertools.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/aiosignal.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/anyio.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/apache-beam.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/arrow.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/attrs.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/azure-identity.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/boto3.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/botocore.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/cachetools.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/cattrs.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/charset-normalizer.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/click.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/coverage.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/cryptography.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/distlib.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/fastapi.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/fastjsonschema.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/filelock.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/flask.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/frozenlist.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/fsspec.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/google-api-core.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/google-auth.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/grpcio.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/h11.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/h5py.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/httplib2.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/ipython.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/jinja2.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/jsonschema.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/jupyter-core.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/libcst.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/markupsafe.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/matplotlib.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/more-itertools.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/multidict.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/nbformat.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/networkx.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/numba.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/numpy.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/oauthlib.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/packaging.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/pandas.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/pathspec.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/pillow.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/platformdirs.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/pluggy.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/propcache.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/protobuf.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/psutil.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/pyOpenSSL.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/pyarrow.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/pyasn1.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/pydantic-core.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/pydantic.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/pygments.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/pyjwt.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/pyparsing.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/pytest.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/python-dateutil.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/requests-oauthlib.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/requests-toolbelt.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/requests.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/rich.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/rpds-py.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/s3fs.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/scikit-learn.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/scipy.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/semver.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/setuptools.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/six.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/sniffio.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/sqlalchemy.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/tomlkit.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/torch.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/tox.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/trio.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/typing-extensions.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/urllib3.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/werkzeug.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/wrapt.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/yarl.py +0 -0
- {pyrefdev-2025.5 → pyrefdev-2025.7}/tests/test_pyrefdev.py +0 -0
|
@@ -4,6 +4,17 @@
|
|
|
4
4
|
|
|
5
5
|
Nothing noticeable unreleased.
|
|
6
6
|
|
|
7
|
+
## v2025.7
|
|
8
|
+
|
|
9
|
+
- Added search to [pyref.dev](https://pyref.dev).
|
|
10
|
+
- When the symbol is not found, redirect to the search page.
|
|
11
|
+
|
|
12
|
+
## v2025.6
|
|
13
|
+
|
|
14
|
+
- Added a `-p/--print` flag to the `pyrefdev` CLI to print the URL instead of opening it in the browser.
|
|
15
|
+
- Support [cyclopts](https://cyclopts.readthedocs.io/en/latest/).
|
|
16
|
+
- Support [yib](https://yib.readthedocs.io/en/latest/).
|
|
17
|
+
|
|
7
18
|
## v2025.5
|
|
8
19
|
|
|
9
20
|
- Added `add-docs`, `update-docs`, and `update-landing-page` commands to `pyrefdev-indexer`.
|
|
@@ -0,0 +1,54 @@
|
|
|
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. `templates/index.html` is the landing page of the server, `static/styles.css` contains CSS styles
|
|
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
|
+
- Do not add tests unless explictly asked to.
|
|
52
|
+
- When creating a new file with content, ensure the file has an extra new line at the end.
|
|
53
|
+
- Do NOT add redundant comments describe what the cod does. When needed, DO add comments that explains "why".
|
|
54
|
+
- 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.
|
|
3
|
+
Version: 2025.7
|
|
4
4
|
Summary: The entry point to Python reference docs
|
|
5
|
-
Project-URL:
|
|
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,11 +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
|
|
26
|
+
Requires-Dist: cyclopts>=3.19.0
|
|
27
|
+
Requires-Dist: jinja2>=3.1.6
|
|
25
28
|
Requires-Dist: packaging>=25.0
|
|
26
|
-
Requires-Dist: yib>=0.
|
|
29
|
+
Requires-Dist: yib>=0.3.0
|
|
27
30
|
Provides-Extra: indexer
|
|
28
31
|
Requires-Dist: beautifulsoup4>=4.13.4; extra == 'indexer'
|
|
29
|
-
Requires-Dist: cyclopts>=3.19.0; extra == 'indexer'
|
|
30
32
|
Requires-Dist: rich>=14.0.0; extra == 'indexer'
|
|
31
33
|
Provides-Extra: server
|
|
32
34
|
Requires-Dist: fastapi<1,>=0.115.12; extra == 'server'
|
|
@@ -49,14 +51,26 @@ It allows you to quickly jump to the official documentation for Python standard
|
|
|
49
51
|
https://pyref.dev/<fully.qualified.symbol.name>
|
|
50
52
|
```
|
|
51
53
|
|
|
52
|
-
|
|
54
|
+
You can also search for symbols using:
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
https://pyref.dev/is?symbol=<SYMBOL>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
And if you are feeling lucky, ask it to redirect to the first result:
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
https://pyref.dev/is?lucky=true&symbol=<SYMBOL>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Lastly, you can `pip install pyrefdev` and run the `pyrefdev` CLI tool.
|
|
53
67
|
|
|
54
68
|
## Examples
|
|
55
69
|
|
|
56
|
-
* https://pyref.dev/json
|
|
57
|
-
* https://pyref.dev/pathlib.Path
|
|
58
|
-
* https://pyref.dev/datetime.datetime.strftime
|
|
59
|
-
* https://pyref.dev/numpy.array
|
|
70
|
+
* [pyref.dev/json](https://pyref.dev/json)
|
|
71
|
+
* [pyref.dev/pathlib.Path](https://pyref.dev/pathlib.Path)
|
|
72
|
+
* [pyref.dev/datetime.datetime.strftime](https://pyref.dev/datetime.datetime.strftime)
|
|
73
|
+
* [pyref.dev/numpy.array](https://pyref.dev/numpy.array)
|
|
60
74
|
|
|
61
75
|
## Supported packages
|
|
62
76
|
|
|
@@ -82,7 +96,7 @@ To update to a new version:
|
|
|
82
96
|
```bash
|
|
83
97
|
> cd pyref.dev
|
|
84
98
|
> git pull
|
|
85
|
-
> uv sync --all-extras
|
|
99
|
+
> uv sync --all-extras --locked
|
|
86
100
|
> systemctl restart pyrefdev.service
|
|
87
101
|
```
|
|
88
102
|
|
|
@@ -14,14 +14,26 @@ It allows you to quickly jump to the official documentation for Python standard
|
|
|
14
14
|
https://pyref.dev/<fully.qualified.symbol.name>
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
You can also search for symbols using:
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
https://pyref.dev/is?symbol=<SYMBOL>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
And if you are feeling lucky, ask it to redirect to the first result:
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
https://pyref.dev/is?lucky=true&symbol=<SYMBOL>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Lastly, you can `pip install pyrefdev` and run the `pyrefdev` CLI tool.
|
|
18
30
|
|
|
19
31
|
## Examples
|
|
20
32
|
|
|
21
|
-
* https://pyref.dev/json
|
|
22
|
-
* https://pyref.dev/pathlib.Path
|
|
23
|
-
* https://pyref.dev/datetime.datetime.strftime
|
|
24
|
-
* https://pyref.dev/numpy.array
|
|
33
|
+
* [pyref.dev/json](https://pyref.dev/json)
|
|
34
|
+
* [pyref.dev/pathlib.Path](https://pyref.dev/pathlib.Path)
|
|
35
|
+
* [pyref.dev/datetime.datetime.strftime](https://pyref.dev/datetime.datetime.strftime)
|
|
36
|
+
* [pyref.dev/numpy.array](https://pyref.dev/numpy.array)
|
|
25
37
|
|
|
26
38
|
## Supported packages
|
|
27
39
|
|
|
@@ -47,7 +59,7 @@ To update to a new version:
|
|
|
47
59
|
```bash
|
|
48
60
|
> cd pyref.dev
|
|
49
61
|
> git pull
|
|
50
|
-
> uv sync --all-extras
|
|
62
|
+
> uv sync --all-extras --locked
|
|
51
63
|
> systemctl restart pyrefdev.service
|
|
52
64
|
```
|
|
53
65
|
|
|
@@ -30,14 +30,17 @@ keywords = [
|
|
|
30
30
|
]
|
|
31
31
|
requires-python = ">=3.10"
|
|
32
32
|
dependencies = [
|
|
33
|
+
"cyclopts>=3.19.0",
|
|
34
|
+
"jinja2>=3.1.6",
|
|
33
35
|
"packaging>=25.0",
|
|
34
|
-
"yib>=0.
|
|
36
|
+
"yib>=0.3.0",
|
|
35
37
|
]
|
|
36
38
|
dynamic = ["version"]
|
|
37
39
|
|
|
38
40
|
[project.urls]
|
|
39
|
-
|
|
41
|
+
Homepage = "https://pyref.dev"
|
|
40
42
|
Source = "https://github.com/mangoumbrella/pyref.dev"
|
|
43
|
+
Changelog = "https://github.com/mangoumbrella/pyref.dev/blob/main/CHANGELOG.md"
|
|
41
44
|
|
|
42
45
|
[project.optional-dependencies]
|
|
43
46
|
server = [
|
|
@@ -45,13 +48,12 @@ server = [
|
|
|
45
48
|
"fastapi>=0.115.12,<1",
|
|
46
49
|
]
|
|
47
50
|
indexer = [
|
|
48
|
-
"cyclopts>=3.19.0",
|
|
49
51
|
"rich>=14.0.0",
|
|
50
52
|
"Beautifulsoup4>=4.13.4",
|
|
51
53
|
]
|
|
52
54
|
|
|
53
55
|
[project.scripts]
|
|
54
|
-
pyrefdev = "pyrefdev.__main__:
|
|
56
|
+
pyrefdev = "pyrefdev.__main__:app"
|
|
55
57
|
pyrefdev-indexer = "pyrefdev.indexer.__main__:app"
|
|
56
58
|
|
|
57
59
|
[tool.hatch.version]
|
|
@@ -66,4 +68,5 @@ version = "{version}"
|
|
|
66
68
|
[dependency-groups]
|
|
67
69
|
dev = [
|
|
68
70
|
"pytest>=8.4.1",
|
|
71
|
+
"pre-commit>=4.2.0",
|
|
69
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.7"
|
|
@@ -115,6 +115,8 @@ _packages = [
|
|
|
115
115
|
Package(pypi="networkx", index_url="https://networkx.org/documentation/stable/reference/index.html"),
|
|
116
116
|
Package(pypi="ipython", index_url="https://ipython.readthedocs.io/en/stable/"),
|
|
117
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/"),
|
|
118
120
|
# ENTRY-LINE-MARKER
|
|
119
121
|
]
|
|
120
122
|
# fmt: on
|
|
@@ -64,8 +64,8 @@ def crawl_docs(
|
|
|
64
64
|
)
|
|
65
65
|
crawl_state = None
|
|
66
66
|
elif package_version < crawled_version:
|
|
67
|
-
console.
|
|
68
|
-
f"
|
|
67
|
+
console.warning(
|
|
68
|
+
f"{pkg}'s latest version {package_version!s} is older than previously crawled {crawl_state.package_version}"
|
|
69
69
|
)
|
|
70
70
|
else:
|
|
71
71
|
crawl_state = None
|
|
@@ -196,9 +196,7 @@ class _Crawler:
|
|
|
196
196
|
with urlopen(url) as f:
|
|
197
197
|
content = f.read().decode("utf-8", "backslashreplace")
|
|
198
198
|
except error.URLError as e:
|
|
199
|
-
console.
|
|
200
|
-
f"[yellow]WARNING:[/yellow] Failed to fetch url {url}, error: {e}"
|
|
201
|
-
)
|
|
199
|
+
console.warning(f"Failed to fetch url {url}, error: {e}")
|
|
202
200
|
self._failed_urls.append(url)
|
|
203
201
|
return None
|
|
204
202
|
maybe_redirected_url = f.url
|
|
@@ -233,7 +231,7 @@ class _Crawler:
|
|
|
233
231
|
existing_content = output.read_text()
|
|
234
232
|
if content == existing_content:
|
|
235
233
|
return output
|
|
236
|
-
console.
|
|
234
|
+
console.warning(f"Overriding {output!s}")
|
|
237
235
|
output.write_text(content)
|
|
238
236
|
return output
|
|
239
237
|
|
|
@@ -35,9 +35,7 @@ def fetch_package_version(package: Package) -> version.Version | None:
|
|
|
35
35
|
pypi_info = json.loads(content)
|
|
36
36
|
return version.parse(pypi_info["info"]["version"])
|
|
37
37
|
except error.URLError as e:
|
|
38
|
-
console.
|
|
39
|
-
f"[yellow]WARNING:[/yellow] Failed to fetch pypi version for {package.pypi}, error: {e}"
|
|
40
|
-
)
|
|
38
|
+
console.warning(f"Failed to fetch pypi version for {package.pypi}, error: {e}")
|
|
41
39
|
return None
|
|
42
40
|
|
|
43
41
|
|
|
@@ -52,7 +50,5 @@ def _fetch_latest_cpython_version() -> version.Version | None:
|
|
|
52
50
|
latest_version = latest
|
|
53
51
|
return latest_version
|
|
54
52
|
except error.URLError as e:
|
|
55
|
-
console.
|
|
56
|
-
f"[yellow]WARNING:[/yellow] Failed to fetch latest CPython version, error: {e}"
|
|
57
|
-
)
|
|
53
|
+
console.warning(f"Failed to fetch latest CPython version, error: {e}")
|
|
58
54
|
return None
|
|
@@ -13,7 +13,7 @@ def update_landing_page_with_packages(
|
|
|
13
13
|
packages: dict[str, Package], file: Path | None = None
|
|
14
14
|
) -> None:
|
|
15
15
|
if file is None:
|
|
16
|
-
file = Path(__file__).parent.parent.parent.parent / "index.html"
|
|
16
|
+
file = Path(__file__).parent.parent.parent.parent / "templates" / "index.html"
|
|
17
17
|
if not file.exists():
|
|
18
18
|
console.fatal(f"{file} does not exist")
|
|
19
19
|
|
|
@@ -9,7 +9,7 @@ def load_mapping(verify_duplicates: bool) -> dict[str, str]:
|
|
|
9
9
|
try:
|
|
10
10
|
package_module = importlib.import_module(f"pyrefdev.mapping.{package}")
|
|
11
11
|
except ImportError:
|
|
12
|
-
console.
|
|
12
|
+
console.warning(f"Missing mapping for {package}")
|
|
13
13
|
continue
|
|
14
14
|
package_mapping = getattr(package_module, "MAPPING")
|
|
15
15
|
if verify_duplicates:
|