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.
Files changed (122) hide show
  1. {pyrefdev-2025.5 → pyrefdev-2025.7}/.gitignore +1 -1
  2. pyrefdev-2025.7/.pre-commit-config.yaml +10 -0
  3. {pyrefdev-2025.5 → pyrefdev-2025.7}/CHANGELOG.md +11 -0
  4. pyrefdev-2025.7/CLAUDE.md +54 -0
  5. {pyrefdev-2025.5 → pyrefdev-2025.7}/PKG-INFO +24 -10
  6. {pyrefdev-2025.5 → pyrefdev-2025.7}/README.md +18 -6
  7. {pyrefdev-2025.5 → pyrefdev-2025.7}/pyproject.toml +7 -4
  8. pyrefdev-2025.7/src/pyrefdev/__main__.py +42 -0
  9. pyrefdev-2025.7/src/pyrefdev/_version.py +1 -0
  10. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/config.py +2 -0
  11. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/indexer/crawl_docs.py +4 -6
  12. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/indexer/requests.py +2 -6
  13. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/indexer/update_landing_page.py +1 -1
  14. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/__init__.py +1 -1
  15. pyrefdev-2025.7/src/pyrefdev/mapping/cyclopts.py +257 -0
  16. pyrefdev-2025.7/src/pyrefdev/mapping/yib.py +10 -0
  17. pyrefdev-2025.7/src/pyrefdev/server.py +116 -0
  18. pyrefdev-2025.7/static/logo128.png +0 -0
  19. pyrefdev-2025.7/static/styles.css +693 -0
  20. pyrefdev-2025.7/templates/index.html +178 -0
  21. pyrefdev-2025.7/templates/search.html +152 -0
  22. {pyrefdev-2025.5 → pyrefdev-2025.7}/uv.lock +167 -7
  23. pyrefdev-2025.5/index.html +0 -556
  24. pyrefdev-2025.5/src/pyrefdev/__main__.py +0 -27
  25. pyrefdev-2025.5/src/pyrefdev/_version.py +0 -1
  26. pyrefdev-2025.5/src/pyrefdev/server.py +0 -21
  27. {pyrefdev-2025.5 → pyrefdev-2025.7}/.github/workflows/ci.yml +0 -0
  28. {pyrefdev-2025.5 → pyrefdev-2025.7}/.github/workflows/pypi_upload.yml +0 -0
  29. {pyrefdev-2025.5 → pyrefdev-2025.7}/LICENSE +0 -0
  30. {pyrefdev-2025.5 → pyrefdev-2025.7}/pyrefdev.service +0 -0
  31. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/__init__.py +0 -0
  32. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/indexer/__main__.py +0 -0
  33. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/indexer/add_docs.py +0 -0
  34. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/indexer/parse_docs.py +0 -0
  35. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/indexer/schema.py +0 -0
  36. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/indexer/update_docs.py +0 -0
  37. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/__python__.py +0 -0
  38. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/aiohttp.py +0 -0
  39. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/aioitertools.py +0 -0
  40. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/aiosignal.py +0 -0
  41. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/anyio.py +0 -0
  42. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/apache-beam.py +0 -0
  43. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/arrow.py +0 -0
  44. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/attrs.py +0 -0
  45. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/azure-identity.py +0 -0
  46. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/boto3.py +0 -0
  47. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/botocore.py +0 -0
  48. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/cachetools.py +0 -0
  49. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/cattrs.py +0 -0
  50. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/charset-normalizer.py +0 -0
  51. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/click.py +0 -0
  52. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/coverage.py +0 -0
  53. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/cryptography.py +0 -0
  54. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/distlib.py +0 -0
  55. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/fastapi.py +0 -0
  56. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/fastjsonschema.py +0 -0
  57. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/filelock.py +0 -0
  58. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/flask.py +0 -0
  59. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/frozenlist.py +0 -0
  60. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/fsspec.py +0 -0
  61. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/google-api-core.py +0 -0
  62. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/google-auth.py +0 -0
  63. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/grpcio.py +0 -0
  64. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/h11.py +0 -0
  65. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/h5py.py +0 -0
  66. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/httplib2.py +0 -0
  67. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/ipython.py +0 -0
  68. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/jinja2.py +0 -0
  69. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/jsonschema.py +0 -0
  70. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/jupyter-core.py +0 -0
  71. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/libcst.py +0 -0
  72. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/markupsafe.py +0 -0
  73. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/matplotlib.py +0 -0
  74. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/more-itertools.py +0 -0
  75. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/multidict.py +0 -0
  76. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/nbformat.py +0 -0
  77. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/networkx.py +0 -0
  78. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/numba.py +0 -0
  79. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/numpy.py +0 -0
  80. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/oauthlib.py +0 -0
  81. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/packaging.py +0 -0
  82. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/pandas.py +0 -0
  83. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/pathspec.py +0 -0
  84. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/pillow.py +0 -0
  85. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/platformdirs.py +0 -0
  86. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/pluggy.py +0 -0
  87. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/propcache.py +0 -0
  88. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/protobuf.py +0 -0
  89. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/psutil.py +0 -0
  90. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/pyOpenSSL.py +0 -0
  91. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/pyarrow.py +0 -0
  92. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/pyasn1.py +0 -0
  93. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/pydantic-core.py +0 -0
  94. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/pydantic.py +0 -0
  95. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/pygments.py +0 -0
  96. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/pyjwt.py +0 -0
  97. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/pyparsing.py +0 -0
  98. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/pytest.py +0 -0
  99. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/python-dateutil.py +0 -0
  100. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/requests-oauthlib.py +0 -0
  101. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/requests-toolbelt.py +0 -0
  102. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/requests.py +0 -0
  103. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/rich.py +0 -0
  104. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/rpds-py.py +0 -0
  105. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/s3fs.py +0 -0
  106. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/scikit-learn.py +0 -0
  107. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/scipy.py +0 -0
  108. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/semver.py +0 -0
  109. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/setuptools.py +0 -0
  110. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/six.py +0 -0
  111. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/sniffio.py +0 -0
  112. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/sqlalchemy.py +0 -0
  113. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/tomlkit.py +0 -0
  114. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/torch.py +0 -0
  115. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/tox.py +0 -0
  116. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/trio.py +0 -0
  117. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/typing-extensions.py +0 -0
  118. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/urllib3.py +0 -0
  119. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/werkzeug.py +0 -0
  120. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/wrapt.py +0 -0
  121. {pyrefdev-2025.5 → pyrefdev-2025.7}/src/pyrefdev/mapping/yarl.py +0 -0
  122. {pyrefdev-2025.5 → pyrefdev-2025.7}/tests/test_pyrefdev.py +0 -0
@@ -1,5 +1,5 @@
1
1
  .DS_Store
2
- docs/
2
+ api-docs/
3
3
 
4
4
  # Hatch-managed version file
5
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
@@ -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.5
3
+ Version: 2025.7
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,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.2.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
- Alternatively, you could also `pip install pyrefdev` and run the `pyrefdev` CLI tool.
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
- Alternatively, you could also `pip install pyrefdev` and run the `pyrefdev` CLI tool.
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.2.0",
36
+ "yib>=0.3.0",
35
37
  ]
36
38
  dynamic = ["version"]
37
39
 
38
40
  [project.urls]
39
- Home = "https://pyref.dev"
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__: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.print(
68
- f"[yellow]WARNING:[/yellow] {pkg}'s latest version {package_version!s} is older than previously crawled {crawl_state.package_version}"
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.print(
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.print(f"[yellow]WARNING:[/yellow] Overriding {output!s}")
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.print(
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.print(
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.print(f"[yellow]WARNING:[/yellow] Missing mapping for {package}")
12
+ console.warning(f"Missing mapping for {package}")
13
13
  continue
14
14
  package_mapping = getattr(package_module, "MAPPING")
15
15
  if verify_duplicates: