Detect redundant override-dependencies / constraint-dependencies in uv projects
Project description
uv-override-prune
Detect prunable override-dependencies / constraint-dependencies entries in uv projects.
Install
uv tool install uv-override-prune
Or run it without installing — useful for one-off checks:
uvx uv-override-prune
Usage
# Detect prunable entries (default)
uv-override-prune # checks ./pyproject.toml
uv-override-prune path/to/pyproject.toml # checks given file
# Remove prunable entries in place
uv-override-prune --fix
Example output:
=== override-dependencies (3 entries) ===
[KEEP] aiohttp>=3.13.5 3.13.3
[PRUNE] httpx>=0.1.0 0.28.1
[SKIP] foo==1.0 (non-lower-bound)
Run with --fix to prune entries marked [PRUNE].
Exit codes:
| Code | Meaning |
|---|---|
0 |
No prunable entries (or --fix succeeded) |
1 |
Prunable entries found (without --fix) |
2 |
pyproject.toml not found |
Why
uv lets you pin a transitive dependency version via [tool.uv] override-dependencies and constraint-dependencies.
A common reason to reach for these is CVE mitigation: a vulnerability is disclosed in a transitive package, and you force the patched minimum version while direct deps catch up.
Once they do, the entry is no longer doing anything — but it's easy to forget which ones are still load-bearing. Stale overrides become a judgment cost at every audit or upgrade ("is this still needed, or just history?").
uv-override-prune answers that mechanically: it checks whether each entry's lower bound is already satisfied by what uv lock would resolve without the override.
How it works
For each candidate entry, the tool removes it in a temp copy of pyproject.toml, runs uv lock there, and checks whether the resulting natural resolution still satisfies the entry's specifier. If yes, the entry is [PRUNE].
Scope
- Targets entries in
[tool.uv] override-dependenciesandconstraint-dependencies. - Only specifiers using
>=and/or>are checked. Entries using==,~=,<,<=,!=(alone or mixed) are skipped. - Entries with an environment marker (e.g.
foo>=1.0; python_version >= "3.10") are skipped, since the naturaluv lockresolution doesn't reflect the marker's intent.
Known limitations
- Projects with a
[build-system]section may fail to lock in the temp dir if they depend on source files (e.g.setuptools.packages.find, Hatch dynamic version from source).[tool.uv.sources]path deps, workspace members, and[project] readmeare rewritten automatically; other build-backend-specific references are not. - One-at-a-time evaluation: if overrides interact (e.g. cascade redundancy, shared transitive deps), individual runs may miss some prunable entries. Re-run after applying removals to surface the next layer.
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file uv_override_prune-0.0.10.tar.gz.
File metadata
- Download URL: uv_override_prune-0.0.10.tar.gz
- Upload date:
- Size: 11.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
32b8a28d4fbd5c6bc21793a751fc82a14d9d35a03a3154b1f28b10fd28f54973
|
|
| MD5 |
bcae324d17b44e28dd85d89dde06a00d
|
|
| BLAKE2b-256 |
14be6ac1c7751ff50d4d93c2076c7a14fa90696ce77c96484d5fca0d42de8a7c
|
File details
Details for the file uv_override_prune-0.0.10-py3-none-any.whl.
File metadata
- Download URL: uv_override_prune-0.0.10-py3-none-any.whl
- Upload date:
- Size: 11.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
56481ee38ca5b0376fb14386af22145e5c6c0610266e3f2d4be66f1e18b5dff3
|
|
| MD5 |
edaef45ae30646ebc647619775e161c7
|
|
| BLAKE2b-256 |
9374366f088167709956c166e918e6def087db43b7f4869f4dc614ae0b5c2eb0
|