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. - An entry that repeats an earlier entry in the same section (same package and specifier, ignoring spelling) is reported as
[PRUNE]with(duplicate). The first copy is evaluated with every copy removed, so its verdict reflects the natural resolution and--fixleaves exactly one copy.
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
Metadata
Release files for uv-override-prune 0.0.12
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| uv_override_prune-0.0.12.tar.gz | 19.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| uv_override_prune-0.0.12-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 30.9 kB
Release files / uv_override_prune-0.0.12.tar.gz
| Download URL | uv_override_prune-0.0.12.tar.gz |
|---|---|
| Size | 19.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4414887c8a4366ca8ca443485ac13199bb8ea06e935f4bb4469c183ba0748f6b
|
|
BLAKE2b-256 checksum How to use checksums |
fe024debe850087235bf8769d660beafcdc29034cf4947ad0409df237d7f225d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.8 {"installer":{"name":"uv","version":"0.12.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}
|
Release files / uv_override_prune-0.0.12-py3-none-any.whl
| Download URL | uv_override_prune-0.0.12-py3-none-any.whl |
|---|---|
| Size | 11.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d300184d8198316b5f32065171ddcb86ce3d3b6a7fab34a7cd8552c1ea76cd46
|
|
BLAKE2b-256 checksum How to use checksums |
ef89c1497e67a56c607e2491f6f7c21cf6bdc41b305cd1f7ac1ee3679ec18ff2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.8 {"installer":{"name":"uv","version":"0.12.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}
|