diff --git a/index.html b/index.html index 991135c..034b857 100644 --- a/index.html +++ b/index.html @@ -70,12 +70,17 @@
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.
+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.
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;