Skip to content

Commit 2c6c7df

Browse files
hoodmanehenryiiiagriyakhetarpal
authored
feat: add handling for Emscripten wheels tags per PEP 783 (#804)
* Add handling for Emscripten wheels tags per PEP 783 These are the changes to packaging specified in PEP 783. PEP 783 is now accepted per dstufft https://discuss.python.org/t/pep-783-emscripten-packaging/86862/104 * Apply suggestions from code review Co-authored-by: Agriya Khetarpal <74401230+agriyakhetarpal@users.noreply.github.com> --------- Co-authored-by: Henry Schreiner <HenrySchreinerIII@gmail.com> Co-authored-by: Agriya Khetarpal <74401230+agriyakhetarpal@users.noreply.github.com>
1 parent 6762eea commit 2c6c7df

2 files changed

Lines changed: 62 additions & 0 deletions

File tree

src/packaging/tags.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -718,6 +718,13 @@ def _linux_platforms(is_32bit: bool = _32_BIT_INTERPRETER) -> Iterator[str]:
718718
yield f"linux_{arch}"
719719

720720

721+
def _emscripten_platforms() -> Iterator[str]:
722+
pyemscripten_abi_version = sysconfig.get_config_var("PYEMSCRIPTEN_ABI_VERSION")
723+
if pyemscripten_abi_version:
724+
yield f"pyemscripten_{pyemscripten_abi_version}_wasm32"
725+
yield from _generic_platforms()
726+
727+
721728
def _generic_platforms() -> Iterator[str]:
722729
yield _normalize_string(sysconfig.get_platform())
723730

@@ -734,6 +741,8 @@ def platform_tags() -> Iterator[str]:
734741
return android_platforms()
735742
elif platform.system() == "Linux":
736743
return _linux_platforms()
744+
elif platform.system() == "Emscripten":
745+
return _emscripten_platforms()
737746
else:
738747
return _generic_platforms()
739748

tests/test_tags.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1751,6 +1751,59 @@ def test_cpython_first_none_any_tag(self, monkeypatch: pytest.MonkeyPatch) -> No
17511751
interpreter = f"cp{tags.interpreter_version()}"
17521752
assert tag == tags.Tag(interpreter, "none", "any")
17531753

1754+
def test_emscripten(
1755+
self,
1756+
mock_interpreter_name: Callable[[str], bool],
1757+
monkeypatch: pytest.MonkeyPatch,
1758+
) -> None:
1759+
expected_interpreter = "cp" + tags._version_nodot(sys.version_info[:2])
1760+
if mock_interpreter_name("CPython"):
1761+
monkeypatch.setattr(
1762+
tags, "_cpython_abis", lambda _1, _2: [expected_interpreter]
1763+
)
1764+
config = {
1765+
"Py_GIL_DISABLED": 0,
1766+
}
1767+
1768+
monkeypatch.setattr(sysconfig, "get_config_var", config.get)
1769+
monkeypatch.setattr(platform, "system", lambda: "Emscripten")
1770+
monkeypatch.setattr(
1771+
sysconfig, "get_platform", lambda: "emscripten-5.0.3-wasm32"
1772+
)
1773+
assert list(tags.platform_tags()) == ["emscripten_5_0_3_wasm32"]
1774+
result = list(tags.sys_tags())
1775+
assert result[0] == tags.Tag(
1776+
expected_interpreter, expected_interpreter, "emscripten_5_0_3_wasm32"
1777+
)
1778+
1779+
def test_pyemscripten(
1780+
self,
1781+
mock_interpreter_name: Callable[[str], bool],
1782+
monkeypatch: pytest.MonkeyPatch,
1783+
) -> None:
1784+
expected_interpreter = "cp" + tags._version_nodot(sys.version_info[:2])
1785+
config = {
1786+
"PYEMSCRIPTEN_ABI_VERSION": "2026_0",
1787+
}
1788+
1789+
monkeypatch.setattr(sysconfig, "get_config_var", config.get)
1790+
if mock_interpreter_name("CPython"):
1791+
monkeypatch.setattr(
1792+
tags, "_cpython_abis", lambda _1, _2: [expected_interpreter]
1793+
)
1794+
monkeypatch.setattr(platform, "system", lambda: "Emscripten")
1795+
monkeypatch.setattr(
1796+
sysconfig, "get_platform", lambda: "emscripten-5.0.3-wasm32"
1797+
)
1798+
assert list(tags.platform_tags()) == [
1799+
"pyemscripten_2026_0_wasm32",
1800+
"emscripten_5_0_3_wasm32",
1801+
]
1802+
result = list(tags.sys_tags())
1803+
assert result[0] == tags.Tag(
1804+
expected_interpreter, expected_interpreter, "pyemscripten_2026_0_wasm32"
1805+
)
1806+
17541807

17551808
class TestBitness:
17561809
def teardown_method(self) -> None:

0 commit comments

Comments
 (0)