From 786abccbe0a77cbc6a352d196f7f16698b8d3577 Mon Sep 17 00:00:00 2001 From: Karolina Surma Date: Thu, 5 Sep 2024 10:12:57 +0200 Subject: [PATCH] Display the packages with wheels compatible with the newest Python Motivation: Every year, the Fedora Python contributors open a bunch of issues to upstream projects to ask them to publish the new Python wheels early. This update will increase the visibility of the projects that need our attention and may serve as a gentle nudge for the project authors to not stay behind the rest of the ecosystem. --- index.html | 7 ++++++- utils.py | 19 ++++++++++++++++++- wheel.css | 6 ++++++ 3 files changed, 30 insertions(+), 2 deletions(-) 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;