diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b365057..7335787 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -227,7 +227,7 @@ jobs: fail-fast: false matrix: framework: [ toga ] - runner-os: [ macos-26-intel, macos-26, windows-2025, ubuntu-24.04, ubuntu-24.04-arm ] + runner-os: [ macos-26, windows-2025, ubuntu-24.04, ubuntu-24.04-arm ] test-app-build-verify-template: name: App Build Verify (Briefcase template) diff --git a/scripts/update_support.py b/scripts/update_support.py index 2fd3120..152ea34 100644 --- a/scripts/update_support.py +++ b/scripts/update_support.py @@ -63,8 +63,22 @@ APPLE_SUPPORT_REPO = "beeware/Python-Apple-support" -# Matches release tags of the form "-b", e.g. "3.14-b11". -APPLE_TAG_RE = re.compile(r"^(?P\d+\.\d+)-b(?P\d+)$") +# Matches release tags of the form "-b", e.g. +# "3.14-b11", including pre-release revisions with an a/b/rc suffix, e.g. +# "3.16-b0a2". +APPLE_TAG_RE = re.compile( + r"^(?P\d+\.\d+)-b" + r"(?P(?P\d+)(?:(?P
a|b|rc)(?P\d+))?)$"
+)
+
+
+def _apple_revision_sort_key(match: re.Match) -> tuple[int, int, int]:
+    """Sortable key for a Python-Apple-support revision such as "11" or
+    "0a2". A final revision sorts higher than its pre-releases (alpha < beta
+    < rc < final)."""
+    pre_rank = {"a": 0, "b": 1, "rc": 2, None: 3}[match.group("pre")]
+    preno = int(match.group("preno")) if match.group("preno") else 0
+    return (int(match.group("number")), pre_rank, preno)
 
 
 def _apple_support(
@@ -75,15 +89,19 @@ def _apple_support(
     """Flat (no per-architecture split) revisions/hashes for macOS and iOS."""
     releases = fetch_all_releases(APPLE_SUPPORT_REPO, opener=opener)
 
-    latest: dict[str, tuple[int, dict]] = {}
+    # fetch_all_releases includes pre-releases (e.g. "3.16-b0a2"); drafts are
+    # skipped, as they have no published assets.
+    latest: dict[str, tuple[tuple[int, int, int], str, dict]] = {}
     for release in releases:
+        if release.get("draft"):
+            continue
         match = APPLE_TAG_RE.match(release["tag_name"])
         if not match:
             continue
         py_version = match.group("py_version")
-        revision = int(match.group("revision"))
-        if py_version not in latest or revision > latest[py_version][0]:
-            latest[py_version] = (revision, release)
+        key = _apple_revision_sort_key(match)
+        if py_version not in latest or key > latest[py_version][0]:
+            latest[py_version] = (key, match.group("revision"), release)
 
     revisions: dict[str, str] = {}
     hashes: dict[str, str] = {}
@@ -94,10 +112,10 @@ def _apple_support(
                 file=sys.stderr,
             )
             continue
-        revision, release = latest[tag]
+        _, revision, release = latest[tag]
         expected_name = f"Python-{tag}-{platform}-support.b{revision}.tar.gz"
         digest = asset_digest(release, expected_name)
-        revisions[tag] = str(revision)
+        revisions[tag] = revision
         hashes[tag] = digest
         print(f"{tag}: support_revision = {revision}, {digest}")
     return revisions, hashes