wheelreach
Apple published a wheel your Python can't install — and their own source says it should work.
Real case, still live: coreai-models==0.1.0.
The wheel on PyPI declares Requires-Python: >=3.14, but the repo's
python/pyproject.toml says requires-python = ">=3.11" and .python-version
pins 3.11. Anyone on Python 3.11 or 3.12 gets a resolution failure for a
package the source claims to support. (Verified against the live PyPI JSON API.)
A second flavor of the same disease:
pytorch/pytorch#186099 —
triton nightly wheels are built with cp315 tags, but their METADATA still
says Requires-Python: >=3.10,<3.15, so pip rejects them on Python 3.15.
wheelreach checks that a package's declared Python support actually has installable release files — the release-integrity question nobody's CI asks.
Part of the release-integrity series: readmeta (did your README render?), wheeltruth (did your wheel ship complete?), casecrash (will your filenames survive checkout?), tagtruth (does the tag match the release?), wheelreach (can your Python actually install it?).
Quickstart
pip install wheelreach
wheelreach check --package coreai-models
version python verdict wheel
------- ------ ------------------------ ----------------------------------
0.1.0 3.10 BLOCKED_BY_REQUIRES_PYTHON coreai_models-0.1.0-py3-none-any.whl
0.1.0 3.11 BLOCKED_BY_REQUIRES_PYTHON coreai_models-0.1.0-py3-none-any.whl
0.1.0 3.12 BLOCKED_BY_REQUIRES_PYTHON coreai_models-0.1.0-py3-none-any.whl
0.1.0 3.13 BLOCKED_BY_REQUIRES_PYTHON coreai_models-0.1.0-py3-none-any.whl
0.1.0 3.14 INSTALLABLE coreai_models-0.1.0-py3-none-any.whl
checked 5 version/python pairs, 4 problem(s): 0.1.0 on 3.10 (BLOCKED_BY_REQUIRES_PYTHON), ...
0.1.0 / 3.11: wheel coreai_models-0.1.0-py3-none-any.whl exists for cp311 but Requires-Python '>=3.14' excludes Python 3.11
Exit codes: 0 clean, 1 problems found, 2 errors (fetch failures, bad args).
Verdicts
| Verdict | Meaning |
|---|---|
INSTALLABLE |
a compatible wheel exists and metadata allows this Python |
BLOCKED_BY_REQUIRES_PYTHON |
a wheel exists for this Python but Requires-Python excludes it |
NO_WHEEL |
no compatible wheel and no sdist published |
NO_WHEEL_HAS_SDIST |
no compatible wheel, but an sdist exists that might build |
The NO_WHEEL / NO_WHEEL_HAS_SDIST split is deliberate: "no wheel" and
"nothing installable at all" are different severities, and a checker that
conflates them cries wolf on every sdist-only package.
Options:
wheelreach check --package <name> --version 1.2.3 # one version (default: latest stable)
wheelreach check --package <name> --all # every published version
wheelreach check --package <name> --python 3.11 # single target Python
wheelreach check --package <name> --python-set 3.11,3.12
wheelreach check --package <name> --format json
Config file (pyproject.toml):
[tool.wheelreach]
python_set = "3.11,3.12"
ignore = ["2.0a1"]
What wheelreach does not verify
The target model is CPython on Linux x86-64 — the most common CI/server
shape. macOS, Windows, ARM, and alternative interpreters are out of scope for
v0.1.0. Wheel-tag compatibility is syntactic (filename tags + metadata), not a
trial install: a passing check means pip should accept the file, not that the
code runs. Requires-Python clauses beyond ==/!=/>=/<=/>/</~= (with optional
.* wildcards) raise an error rather than guessing.
Metadata
Release files for wheelreach 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 | Provenance | Actions |
|---|---|---|---|---|
| wheelreach-0.1.0.tar.gz | 16.5 kB | Without provenance | Details for wheelreach-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| wheelreach-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for wheelreach-0.1.0-py3-none-any.whl |
Total release size: 30.5 kB
Release files / wheelreach-0.1.0.tar.gz
| Download URL | wheelreach-0.1.0.tar.gz |
|---|---|
| Size | 16.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e40c997d6d2ada633737b7503c2470583970f909aaeab0b4211ebbb6b0bfe2d8
|
|
BLAKE2b-256 checksum How to use checksums |
468bd95b62895b630e9290adaefd3be240fc891e80519c8c173a4162da3dc947
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / wheelreach-0.1.0-py3-none-any.whl
| Download URL | wheelreach-0.1.0-py3-none-any.whl |
|---|---|
| Size | 14.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
eb10b19c868a9cf81b43c08a40501aa2b25aefd658cef971ceabb95e6249b500
|
|
BLAKE2b-256 checksum How to use checksums |
40a243a841339bfc1eade1d0e1f3e70c11cbe809658e7496992908c03e42da91
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Security for wheelreach 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.