diff --git a/index.html b/index.html index 991135c..034b857 100644 --- a/index.html +++ b/index.html @@ -70,12 +70,17 @@

Advantages of wheels

What is this list?

This site shows the top 360 most-downloaded packages on PyPI showing which have been uploaded as wheel archives.

+

Currently, Python 3.13 is considered the newest Python version.

Packages that are known to be deprecated are not included. (For example distribute). If your package is incorrectly listed, please create a ticket.

This used to show the all-time most-downloaded packages. The all-time list is no longer available, and the packages in the last-30-days list will change to reflect more closely what the Python community is using.

This is not the official website for wheels, just a nice visual way to measure adoption. To see the authoritative guide on wheels and other aspects of Python packaging, see the Python Packaging User Guide.

+

My package is orange. What can I do?

+

If you have a package that doesn't publish the wheels for the newest Python yet, consider releasing them on PyPI. This will make it possible for Python users to start developing with a new Python version from the day of its release.

+

Alternatively, you can consider porting your project to the stable ABI.

My package is white. What can I do?

Pure Python

If you have a pure Python package that is not using 2to3 for Python 3 support, you've got it easy. Make sure Wheel is installed…

diff --git a/utils.py b/utils.py index 3711cbf..7089c86 100644 --- a/utils.py +++ b/utils.py @@ -20,6 +20,11 @@ SESSION = requests.Session() +# Updated ~ when the release candidates start to appear +# Goal: to have as many as possible wheels ready to use from the day it's released +NEWEST_PYTHON_VER = "3.13" +NEWEST_PYTHON_ABI_TAG = "cp313" + def get_json_url(package_name): return BASE_URL + "/" + package_name + "/json" @@ -31,6 +36,7 @@ def annotate_wheels(packages): for index, package in enumerate(packages): print(index + 1, num_packages, package["name"]) has_wheel = False + has_newest_wheel = False url = get_json_url(package["name"]) response = SESSION.get(url) if response.status_code != 200: @@ -40,13 +46,24 @@ def annotate_wheels(packages): for download in data["urls"]: if download["packagetype"] == "bdist_wheel": has_wheel = True + abi_tag = download["filename"].split("-")[-2] + # wheel can be universal or compiled for the specific Python version + # there can be additional letters at the end of the abi tag + # e.g. "cp313t" built for free-threading + if abi_tag in ["none", "abi3"] or abi_tag.startswith(NEWEST_PYTHON_ABI_TAG): + has_newest_wheel = True package["wheel"] = has_wheel + package["newest_wheel"] = has_newest_wheel # Display logic. I know, I'm sorry. package["value"] = 1 - if has_wheel: + if has_newest_wheel: package["css_class"] = "success" package["icon"] = "\u2713" # Check mark + package["title"] = f"This package provides a wheel compatible with Python {NEWEST_PYTHON_VER}." + elif has_wheel: + package["css_class"] = "warning" + package["icon"] = "\u23FA" # Circle package["title"] = "This package provides a wheel." else: package["css_class"] = "default" diff --git a/wheel.css b/wheel.css index bbeb067..3f1d498 100644 --- a/wheel.css +++ b/wheel.css @@ -4,6 +4,12 @@ fill: #5CB85C; } +.warning { + stroke: #d58512; + stroke-width: 1; + fill: #ed9c28; +} + .default { stroke: #cccccc; stroke-width: 1;