uv-readiness
Find out whether a uv project can move to a new Python version, and what is in the way.
uvx uv-readiness 3.14
Run it in a directory that has a uv.lock. It checks every locked package,
direct or transitive, and never modifies your project.
What it tells you
- What blocks the upgrade. Packages that ship compiled wheels but none for the target Python, drawn as a tree from your project down, so you can see which dependency pulls each one in.
- What fixes it. It re-locks a temporary copy of the project for the target
Python and prints the
uv lockcommand that works. When no upgrade helps, it shows uv's own explanation of which requirement holds things back. - What "ready" rests on. Most packages ship
py3-nonewheels that install on any Python 3, which says nothing about one particular version. The summary counts those apart from packages with a wheel built for the target, and a classifier check lists the ones that do not declare the target yet.
Two signals, used differently
The tool reads both wheels and classifiers. Which one applies depends on the package.
| Wheels | Classifiers | |
|---|---|---|
| What it is | A published file tagged for a Python version. | A line the author adds to the package metadata. |
| Which packages | Compiled ones: few in most projects, but the ones that hold up an upgrade. | Everything else: py3-none packages, usually the large majority. |
| How strong | A fact. A cp314 binary exists or it does not. |
A hint. Often added months late, or never. |
| Effect | Decides the verdict and the exit code. | Shown in the report. Never changes the verdict. |
So for most of your packages the classifier is the only version-specific information there is, and the report shows it. It does not fail a run, because a missing classifier usually means the author has not updated the metadata, not that the package is broken.
This is the uv counterpart to pdm-readiness, which reads classifiers for direct dependencies only.
Usage
uv-readiness <python> [--project DIR] [--offline] [--json] [--verbose]
| Argument | Meaning |
|---|---|
<python> |
Target version: 3.14, or 3.14t for the free-threaded build. |
--project DIR |
Project root containing uv.lock. Default: current directory. |
--offline |
Only read uv.lock: no uv lock runs, no PyPI lookups. |
--json |
Print the report as JSON. |
--verbose |
Also list ready packages. |
| Exit code | Meaning |
|---|---|
0 |
Ready: no package is missing a wheel for the target. |
1 |
Updates are needed, or packages are blocked. |
2 |
The tool could not run: no uv.lock, a bad version, uv missing. |
uv has no plugin system, so this is a standalone command, not uv readiness.
It needs uv on your PATH whenever it has to ask the resolver.
In CI
- uses: actions/checkout@v7
- uses: astral-sh/setup-uv@v10.2.0
- run: uvx uv-readiness 3.14
The step fails until the project is ready. See Running in CI for a scheduled workflow and for using the JSON output.
Documentation
- How it works: what is read, what is run, and where.
- Reading the report: every section, status and note.
- JSON output: the fields behind
--json. - Running in CI: workflows and exit codes.
- Limits: what the tool cannot tell you.
Limits worth knowing first
- A wheel shows that a package installs, not that it was tested. A
py3-nonewheel counts as ready even if the code uses something the target Python removed. - Platform tags are ignored: a wheel for the target Python on any platform counts.
- The suggested command is resolved for the target Python only. In a project that spans several Python versions, uv may pick other versions for the older ones.
The full list is in Limits.
Development
uv sync
uv run pytest # unit tests
uv run pytest -m network # runs real `uv lock` and queries PyPI
uv run ruff check && uv run ruff format --check && uv run ty check
vhs docs/demo.tape # re-record the demo GIF
License
MIT. See LICENSE.
Metadata
Release files for uv-readiness 0.1.0
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_readiness-0.1.0.tar.gz | 197.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| uv_readiness-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 212.4 kB
Release files / uv_readiness-0.1.0.tar.gz
| Download URL | uv_readiness-0.1.0.tar.gz |
|---|---|
| Size | 197.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8d2781754488e727b59572eea5fce49196631b746e9faf28bc3e5e1a7f9b6f3a
|
|
BLAKE2b-256 checksum How to use checksums |
c48a9c253457570f8c274d7d057b2c404a797479f5cbe281c9e31c67da9d535f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.24 {"installer":{"name":"uv","version":"0.12.24","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_readiness-0.1.0-py3-none-any.whl
| Download URL | uv_readiness-0.1.0-py3-none-any.whl |
|---|---|
| Size | 14.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
35e56dd3708598d2e20922398b9ec39d72aec15d3b7e7d363b38897ac488ae42
|
|
BLAKE2b-256 checksum How to use checksums |
95c7aa9640a127d6ba16deef7cd2409051adb3590f00becf19b9217749db2a96
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.24 {"installer":{"name":"uv","version":"0.12.24","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}
|