Update to Pyodide 314.0.0 (#2906)

* Update to Pyodide 314.0.0

* Update selector

* Update tests

* Use v2 xbuildenvs endpoint

* Update pyodide-build in constraints

* Add comment about `test_build_filter_pyodide_prerelease`
This commit is contained in:
Agriya Khetarpal
2026-06-09 16:30:30 -04:00
committed by GitHub
parent c58c5c58ec
commit 2f9a352352
11 changed files with 34 additions and 33 deletions
+1 -1
View File
@@ -103,7 +103,7 @@ class PyodideXBuildEnvInfo(typing.TypedDict):
def get_pyodide_xbuildenv_info() -> PyodideXBuildEnvInfo:
xbuildenv_info_url = (
"https://pyodide.github.io/pyodide/api/pyodide-cross-build-environments.json"
"https://pyodide.github.io/pyodide/api/v2/pyodide-cross-build-environments.json"
)
with urllib.request.urlopen(xbuildenv_info_url) as response:
return typing.cast("PyodideXBuildEnvInfo", json.loads(response.read().decode("utf-8")))
+1 -1
View File
@@ -217,7 +217,7 @@ python_configurations = [
python_configurations = [
{ identifier = "cp312-pyodide_wasm32", version = "3.12", default_pyodide_version = "0.27.7", node_version = "v22", sha256 = "0c2e7db42efa5d1dac38b50f8b3d659a1e3885d0a233494831b8206281307d52" },
{ identifier = "cp313-pyodide_wasm32", version = "3.13", default_pyodide_version = "0.29.4", node_version = "v22", sha256 = "a29fc4a076408a18fc29eb4b280f80c6dddc95c19514c874c29e590d0931c02a" },
{ identifier = "cp314-pyodide_wasm32", version = "3.14", default_pyodide_version = "314.0.0a2", node_version = "v24", sha256 = "ac7bbcdf289ab3ae25621c436b1d013099ef6bec644ad0538dae5d65552c5c95" },
{ identifier = "cp314-pyodide_wasm32", version = "3.14", default_pyodide_version = "314.0.0", node_version = "v24", sha256 = "6e76cf18251bd7d046bdb7ef35c9f938c8e995f10d88397497ca4b7020f27ba6" },
]
[android]
@@ -52,7 +52,7 @@ pydantic-core==2.46.4
# via pydantic
pygments==2.20.0
# via rich
pyodide-build==0.34.4
pyodide-build==0.35.0
# via -r .nox/update_constraints/tmp/constraints-pyodide.in
pyodide-cli==0.5.0
# via
@@ -52,7 +52,7 @@ pydantic-core==2.46.4
# via pydantic
pygments==2.20.0
# via rich
pyodide-build==0.34.4
pyodide-build==0.35.0
# via -r .nox/update_constraints/tmp/constraints-pyodide.in
pyodide-cli==0.5.0
# via
@@ -52,7 +52,7 @@ pydantic-core==2.46.4
# via pydantic
pygments==2.20.0
# via rich
pyodide-build==0.34.4
pyodide-build==0.35.0
# via -r .nox/update_constraints/tmp/constraints-pyodide.in
pyodide-cli==0.5.0
# via
+7 -7
View File
@@ -102,19 +102,19 @@ class BuildSelector:
return False
if EnableGroup.PyodideEoL not in self.enable and fnmatch(build_id, "cp312-pyodide_*"):
return False
# NOTE: Disable this when we don't have any Pyodide prereleases (e.g., 314.0.0a1+)
# NOTE: Re-enable this when we have a new Pyodide prerelease (e.g., 315.0.0a1+)
# When doing this, also:
# 1. update Pyodide tests in unit_test/build_selector_test.py and unit_test/options_test.py accordingly.
# 2. update Python versions for Pyodide identifiers in cibuildwheel/selector.py.
# 3. update constraints as necessary via bin/generate_pyodide_constraints.py and add/delete
# Pyodide constraints files in cibuildwheel/resources/constraints/ as necessary.
# When disabling, update the pattern to match the experimental Python version in case
# it is bumped to Python 3.15 (likely cp315-pyodide_* but could remain as 3.14 as well).
# When re-enabling, update the pattern to match the experimental Python version when
# it is bumped to Python 3.15 (likely cp315-pyodide_*).
# This depends on the CPython version being used in the Pyodide runtime at the time.
if EnableGroup.PyodidePrerelease not in self.enable and fnmatch(
build_id, "cp314-pyodide_*"
):
return False
# if EnableGroup.PyodidePrerelease not in self.enable and fnmatch(
# build_id, "cp315-pyodide_*"
# ):
# return False
should_build = selector_matches(self.build_config, build_id)
should_skip = selector_matches(self.skip_config, build_id)
+2 -2
View File
@@ -49,10 +49,10 @@ def test_abi3(tmp_path: Path) -> None:
project_dir,
add_env={
# free_threaded, GraalPy, and PyPy do not have a Py_LIMITED_API equivalent, just build one of those
# pyodide uses cp313 (the stable version) which supports limited API / abi3
# pyodide uses cp314 (the latest stable version) which supports limited API / abi3
# also limit the number of builds for test performance reasons
"CIBW_BUILD": (
"cp313-*"
"cp314-*"
if utils.get_platform() == "pyodide"
else "cp39-* cp310-* pp310-* gp312_250-* cp312-* cp314t-*"
),
+2 -2
View File
@@ -87,13 +87,13 @@ def get_versions_from_constraint_file(constraint_file: Path) -> dict[str, str]:
return result
@pytest.mark.parametrize("python_version", ["3.9", "3.13"])
@pytest.mark.parametrize("python_version", ["3.9", "3.14"])
def test_pinned_versions(
tmp_path: Path, python_version: str, build_frontend_env_nouv: dict[str, str]
) -> None:
if utils.get_platform() == "linux":
pytest.skip("linux doesn't pin individual tool versions, it pins manylinux images instead")
if python_version != "3.13" and utils.get_platform() == "pyodide":
if python_version != "3.14" and utils.get_platform() == "pyodide":
pytest.skip(f"pyodide does not support Python {python_version}")
project_dir = tmp_path / "project"
+1 -1
View File
@@ -175,6 +175,6 @@ def test_pyodide_repair_wheel(tmp_path: Path) -> None:
# check that the expected wheels are produced
expected_wheels = [
"spam-0.1.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl",
"spam-0.1.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl",
]
assert set(actual_wheels) == set(expected_wheels)
+6 -6
View File
@@ -31,7 +31,7 @@ EMULATED_ARCHS: Final[list[str]] = sorted(
PYPY_ARCHS = ["x86_64", "i686", "AMD64", "aarch64", "arm64"]
GRAALPY_ARCHS = ["x86_64", "AMD64", "aarch64", "arm64"]
SINGLE_PYTHON_VERSION: Final[tuple[int, int]] = (3, 13)
SINGLE_PYTHON_VERSION: Final[tuple[int, int]] = (3, 14)
# temporary workaround: set by build_frontend_env fixture to skip graalpy
# when uv is the build frontend (compatibility issue between graalpy and uv)
@@ -278,9 +278,9 @@ def _expected_wheels(
# To be kept in sync with Python versions for Pyodide identifiers in cibuildwheel/selector.py.
if platform == "pyodide" and python_abi_tags is None:
python_abi_tags = ["cp313-cp313"]
if EnableGroup.PyodidePrerelease in enable_groups:
python_abi_tags.append("cp314-cp314")
python_abi_tags = ["cp313-cp313", "cp314-cp314"]
if EnableGroup.PyodideEoL in enable_groups:
python_abi_tags.insert(0, "cp312-cp312")
elif (platform == "android" and python_abi_tags is None) or (
platform == "ios" and python_abi_tags is None
):
@@ -414,8 +414,8 @@ def _expected_wheels(
if not platform_tags:
# for example if the python tag is `none` or `abi3`, the wheel
# is built by the stable cp313 Python version
platform_tags = ["pyemscripten_2025_0_wasm32"]
# is built by the latest stable cp314 Python version
platform_tags = ["pyemscripten_2026_0_wasm32"]
else:
msg = f"Unsupported platform {platform!r}"
+11 -10
View File
@@ -91,14 +91,15 @@ def test_build_filter_pypy_all() -> None:
assert build_selector("pp39-manylinux_x86_64")
def test_build_filter_pyodide_prerelease() -> None:
build_selector = BuildSelector(
build_config="*",
skip_config="",
enable=frozenset([EnableGroup.PyodidePrerelease]),
)
assert build_selector("cp313-pyodide_wasm32")
assert build_selector("cp314-pyodide_wasm32")
# Re-enable when we have Pyodide 3.15 prerelease builds to test against
# def test_build_filter_pyodide_prerelease() -> None:
# build_selector = BuildSelector(
# build_config="*",
# skip_config="",
# enable=frozenset([EnableGroup.PyodidePrerelease]),
# )
# assert build_selector("cp314-pyodide_wasm32")
# assert build_selector("cp315-pyodide_wasm32")
def test_build_filter_pyodide() -> None:
@@ -108,8 +109,8 @@ def test_build_filter_pyodide() -> None:
enable=frozenset(),
)
assert build_selector("cp313-pyodide_wasm32")
assert build_selector("cp314-pyodide_wasm32")
assert not build_selector("cp312-pyodide_wasm32")
assert not build_selector("cp314-pyodide_wasm32")
def test_build_filter_pyodide_eol() -> None:
@@ -120,7 +121,7 @@ def test_build_filter_pyodide_eol() -> None:
)
assert build_selector("cp312-pyodide_wasm32")
assert build_selector("cp313-pyodide_wasm32")
assert not build_selector("cp314-pyodide_wasm32")
assert build_selector("cp314-pyodide_wasm32")
def test_skip() -> None: