@@ -403,31 +403,65 @@ def update_django_versions():
403
403
404
404
405
405
def update_pyodide_versions ():
406
+
407
+ def version_tuple (v : str ) -> tuple [int , int , int ]:
408
+ return tuple (int (x ) for x in v .split ("." )) # type: ignore
409
+
406
410
vers_re = r"(\d+\.\d+\.\d+)"
407
- all_versions = re .findall (
411
+ all_pyodide_build_versions = re .findall (
408
412
f"pyodide_build-{ vers_re } -py3-none-any.whl" , # excludes pre-releases
409
413
requests .get ("https://pypi.org/simple/pyodide-build/" ).text ,
410
414
)
411
- for pyodide_version in sorted (
415
+ pyodide_build_version = max (
412
416
# Don't just pick the most recent version; find the highest stable version.
413
- set (all_versions ),
414
- key = lambda version : tuple (int (x ) for x in version .split ("." )),
415
- reverse = True ,
416
- ):
417
- makefile_url = f"https://raw.githubusercontent.com/pyodide/pyodide/{ pyodide_version } /Makefile.envs"
418
- match = re .search (
419
- rf"export PYVERSION \?= { vers_re } \nexport PYODIDE_EMSCRIPTEN_VERSION \?= { vers_re } \n" ,
420
- requests .get (makefile_url ).text ,
417
+ set (all_pyodide_build_versions ),
418
+ key = version_tuple ,
419
+ )
420
+
421
+ cross_build_environments_url = "https://raw.githubusercontent.com/pyodide/pyodide/refs/heads/main/pyodide-cross-build-environments.json"
422
+ cross_build_environments_data = requests .get (cross_build_environments_url ).json ()
423
+
424
+ # Find the latest stable release for the Pyodide runtime/xbuildenv that is compatible
425
+ # with the pyodide-build version we found
426
+ stable_releases = [
427
+ release
428
+ for release in cross_build_environments_data ["releases" ].values ()
429
+ if re .fullmatch (vers_re , release ["version" ])
430
+ ]
431
+
432
+ compatible_releases = []
433
+ for release in stable_releases : # sufficiently large values
434
+ min_build_version = release .get ("min_pyodide_build_version" , "0.0.0" )
435
+ max_build_version = release .get ("max_pyodide_build_version" , "999.999.999" )
436
+
437
+ # Perform version comparisons to avoid getting an incompatible pyodide-build version
438
+ # with the Pyodide runtime
439
+ if (
440
+ version_tuple (min_build_version )
441
+ <= version_tuple (pyodide_build_version )
442
+ <= version_tuple (max_build_version )
443
+ ):
444
+ compatible_releases .append (release )
445
+
446
+ if not compatible_releases :
447
+ raise RuntimeError (
448
+ f"No compatible Pyodide release found for pyodide-build { pyodide_build_version } "
421
449
)
422
- if match is not None :
423
- python_version , emscripten_version = match .groups ()
424
- break
450
+
451
+ pyodide_release = max (
452
+ compatible_releases ,
453
+ key = lambda release : version_tuple (release ["version" ]),
454
+ )
455
+
456
+ pyodide_version = pyodide_release ["version" ]
457
+ python_version = pyodide_release ["python_version" ]
458
+
425
459
ci_file = tools .ROOT / ".github/workflows/main.yml"
426
460
config = ci_file .read_text (encoding = "utf-8" )
427
461
for name , var in [
428
462
("PYODIDE" , pyodide_version ),
463
+ ("PYODIDE_BUILD" , pyodide_build_version ),
429
464
("PYTHON" , python_version ),
430
- ("EMSCRIPTEN" , emscripten_version ),
431
465
]:
432
466
config = re .sub (f"{ name } _VERSION: { vers_re } " , f"{ name } _VERSION: { var } " , config )
433
467
ci_file .write_text (config , encoding = "utf-8" )
0 commit comments