From 2c126a635dfbb5e99d76d1279f345fa09d9216cf Mon Sep 17 00:00:00 2001 From: Phil Schaf Date: Thu, 11 Jun 2026 17:38:57 -0400 Subject: [PATCH 1/3] feat: rc support --- scripts/update_distributions.py | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/scripts/update_distributions.py b/scripts/update_distributions.py index 6d7aa64..03ce347 100644 --- a/scripts/update_distributions.py +++ b/scripts/update_distributions.py @@ -1,15 +1,20 @@ # /// script # dependencies = [ -# "httpx", +# "httpx2", # "packaging", +# "tqdm", # ] # /// import os +import atexit from collections import defaultdict from contextlib import suppress +from itertools import count from pathlib import Path +from urllib.parse import urlparse, parse_qs -import httpx +import httpx2 +from tqdm import tqdm from packaging.version import Version RELEASES_URL = 'https://api.github.com/repos/astral-sh/python-build-standalone/releases' @@ -30,16 +35,21 @@ def get_assets(): headers = {'Authorization': f'Bearer {token}', 'X-GitHub-Api-Version': '2022-11-28'} - page = 1 - while True: - print(f'Fetching page {page}...') - response = httpx.get(RELEASES_URL, headers=headers, timeout=60, params={'page': page, 'per_page': 5}) + progress = tqdm(count(1), unit='page') + atexit.register(progress.close) + for page in progress: + response = httpx2.get(RELEASES_URL, headers=headers, timeout=60, params={'page': page, 'per_page': 5}) releases = response.json() if not response.is_success: import json formatted = json.dumps(releases, indent=2) - raise httpx.NetworkError(formatted) + raise httpx2.NetworkError(formatted) + + if last_link := response.links.get('last'): + query = parse_qs(urlparse(last_link['url']).query) + if page_str := next(iter(query.get('page', ())), None): + progress.total = int(page_str) if not releases: break @@ -48,8 +58,6 @@ def get_assets(): for asset in release['assets']: yield asset['name'], asset['browser_download_url'] - page += 1 - def main(): print('Updating distributions...') @@ -96,8 +104,8 @@ def main(): raw_version, _, release = release_data.partition('+') version = Version(raw_version) - # Skip prereleases for now - if version.pre is not None: + # Skip non-rc prereleases for now + if version.pre is not None and version.pre[0] != "rc": continue variant_start = 3 if 'apple' in remaining else 4 @@ -141,7 +149,7 @@ def main(): arch = 'powerpc64' distribution = (minor_version_parts, os_name, arch, abi, variant_cpu, variant_gil) - distributions[distribution].append((((version.major, Version.minor, version.micro), date), url)) + distributions[distribution].append((((version.major, version.minor, version.micro), date), url)) flattened_distributions = defaultdict(list) for ( From 25b5ace2d7d74f19ed645ff600b26fea7d723a61 Mon Sep 17 00:00:00 2001 From: Phil Schaf Date: Thu, 11 Jun 2026 23:37:58 -0400 Subject: [PATCH 2/3] switch to rich --- scripts/update_distributions.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/scripts/update_distributions.py b/scripts/update_distributions.py index 03ce347..1dcab1b 100644 --- a/scripts/update_distributions.py +++ b/scripts/update_distributions.py @@ -2,11 +2,10 @@ # dependencies = [ # "httpx2", # "packaging", -# "tqdm", +# "rich", # ] # /// import os -import atexit from collections import defaultdict from contextlib import suppress from itertools import count @@ -14,7 +13,7 @@ from urllib.parse import urlparse, parse_qs import httpx2 -from tqdm import tqdm +from rich.progress import Progress from packaging.version import Version RELEASES_URL = 'https://api.github.com/repos/astral-sh/python-build-standalone/releases' @@ -35,9 +34,9 @@ def get_assets(): headers = {'Authorization': f'Bearer {token}', 'X-GitHub-Api-Version': '2022-11-28'} - progress = tqdm(count(1), unit='page') - atexit.register(progress.close) - for page in progress: + progress = Progress() + task = progress.add_task("Updating distributions...") + for page in count(1): response = httpx2.get(RELEASES_URL, headers=headers, timeout=60, params={'page': page, 'per_page': 5}) releases = response.json() if not response.is_success: @@ -48,8 +47,9 @@ def get_assets(): if last_link := response.links.get('last'): query = parse_qs(urlparse(last_link['url']).query) - if page_str := next(iter(query.get('page', ())), None): - progress.total = int(page_str) + if last_page := next(iter(query.get('page', ())), None): + progress.update(task, total=int(last_page)) + progress.start() if not releases: break @@ -58,10 +58,9 @@ def get_assets(): for asset in release['assets']: yield asset['name'], asset['browser_download_url'] + progress.advance(task, 1) def main(): - print('Updating distributions...') - lines = Path('build.rs').read_text('utf-8').splitlines() start = end = -1 for i, line in enumerate(lines): From b1b6aa21a9fc035546f087d193baf12f3517b305 Mon Sep 17 00:00:00 2001 From: Phil Schaf Date: Thu, 11 Jun 2026 23:42:16 -0400 Subject: [PATCH 3/3] start immediately --- scripts/update_distributions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/update_distributions.py b/scripts/update_distributions.py index 1dcab1b..70cbdca 100644 --- a/scripts/update_distributions.py +++ b/scripts/update_distributions.py @@ -36,6 +36,7 @@ def get_assets(): progress = Progress() task = progress.add_task("Updating distributions...") + progress.start() for page in count(1): response = httpx2.get(RELEASES_URL, headers=headers, timeout=60, params={'page': page, 'per_page': 5}) releases = response.json() @@ -49,7 +50,6 @@ def get_assets(): query = parse_qs(urlparse(last_link['url']).query) if last_page := next(iter(query.get('page', ())), None): progress.update(task, total=int(last_page)) - progress.start() if not releases: break