mirror of
https://github.com/astral-sh/uv.git
synced 2025-07-09 22:35:01 +00:00

## Summary
Add an option to overwrite the list of available Python downloads from a
local JSON file by using the environment variable
`UV_PYTHON_DOWNLOADS_JSON_URL`
as an experimental support for providing custom sources for Python
distribution binaries #8015
related #10203
I probably should make the JSON to be fetched from a remote URL instead
of a local file.
please let me know what you think and I will modify the code
accordingly.
## Test Plan
### normal run
```
root@75c66494ba8b:/# /code/target/release/uv python list
cpython-3.14.0a4+freethreaded-linux-x86_64-gnu <download available>
cpython-3.14.0a4-linux-x86_64-gnu <download available>
cpython-3.13.1+freethreaded-linux-x86_64-gnu <download available>
cpython-3.13.1-linux-x86_64-gnu <download available>
cpython-3.12.8-linux-x86_64-gnu <download available>
cpython-3.11.11-linux-x86_64-gnu <download available>
cpython-3.10.16-linux-x86_64-gnu <download available>
cpython-3.9.21-linux-x86_64-gnu <download available>
cpython-3.8.20-linux-x86_64-gnu <download available>
cpython-3.7.9-linux-x86_64-gnu <download available>
pypy-3.10.14-linux-x86_64-gnu <download available>
pypy-3.9.19-linux-x86_64-gnu <download available>
pypy-3.8.16-linux-x86_64-gnu <download available>
pypy-3.7.13-linux-x86_64-gnu <download available>
```
### empty JSON file
```sh
root@75c66494ba8b:/# export UV_PYTHON_DOWNLOADS_JSON_URL=/code/crates/uv-python/my-download-metadata.json
root@75c66494ba8b:/# cat $UV_PYTHON_DOWNLOADS_JSON_URL
{}
root@75c66494ba8b:/# /code/target/release/uv python list
root@75c66494ba8b:/#
```
### JSON file with valid version
```sh
root@75c66494ba8b:/# export UV_PYTHON_DOWNLOADS_JSON_URL=/code/crates/uv-python/my-download-metadata.json
root@75c66494ba8b:/# cat $UV_PYTHON_DOWNLOADS_JSON_URL
{
"cpython-3.11.9-linux-x86_64-gnu": {
"name": "cpython",
"arch": {
"family": "x86_64",
"variant": null
},
"os": "linux",
"libc": "gnu",
"major": 3,
"minor": 11,
"patch": 9,
"prerelease": "",
"url": "20240814/cpython-3.11.9%2B20240814-x86_64-unknown-linux-gnu-install_only_stripped.tar.gz
",
"sha256": "daa487c7e73005c4426ac393273117cf0e2dc4ab9b2eeda366e04cd00eea00c9",
"variant": null
}
}
root@75c66494ba8b:/# /code/target/release/uv python list
cpython-3.11.9-linux-x86_64-gnu <download available>
root@75c66494ba8b:/#
```
### Remote Path
```sh
root@75c66494ba8b:/# export UV_PYTHON_DOWNLOADS_JSON_URL=http://a.com/file.json
root@75c66494ba8b:/# /code/target/release/uv python list
error: Remote python downloads JSON is not yet supported, please use a local path (without `file://` prefix)
```
---------
Co-authored-by: Aria Desires <aria.desires@gmail.com>
43 lines
1 KiB
Python
Executable file
43 lines
1 KiB
Python
Executable file
# /// script
|
|
# requires-python = ">=3.12"
|
|
# ///
|
|
"""
|
|
Generate minified Python version download metadata json to embed in the binary.
|
|
|
|
Generates the `download-metadata-minified.json` file from the `download-metadata.json` file.
|
|
|
|
Usage:
|
|
|
|
uv run -- crates/uv-python/minify-download-metadata.py
|
|
"""
|
|
|
|
import json
|
|
from pathlib import Path
|
|
|
|
CRATE_ROOT = Path(__file__).parent
|
|
VERSION_METADATA = CRATE_ROOT / "download-metadata.json"
|
|
TARGET = CRATE_ROOT / "src" / "download-metadata-minified.json"
|
|
|
|
|
|
def process_json(data: dict) -> dict:
|
|
out_data = {}
|
|
|
|
for key, value in data.items():
|
|
# Exclude debug variants for now, we don't support them in the Rust side
|
|
if value["variant"] == "debug":
|
|
continue
|
|
|
|
out_data[key] = value
|
|
|
|
return out_data
|
|
|
|
|
|
def main() -> None:
|
|
json_data = json.loads(Path(VERSION_METADATA).read_text())
|
|
json_data = process_json(json_data)
|
|
json_string = json.dumps(json_data, separators=(",", ":"))
|
|
TARGET.write_text(json_string)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|