diff --git a/src/packaging/tags.py b/src/packaging/tags.py index f5903402a..21e6e560a 100644 --- a/src/packaging/tags.py +++ b/src/packaging/tags.py @@ -549,6 +549,13 @@ def _linux_platforms(is_32bit: bool = _32_BIT_INTERPRETER) -> Iterator[str]: yield f"linux_{arch}" +def _emscripten_platforms() -> Iterator[str]: + pyemscripten_abi_version = sysconfig.get_config_var("PYEMSCRIPTEN_ABI_VERSION") + if pyemscripten_abi_version: + yield f"pyemscripten_{pyemscripten_abi_version}_wasm32" + yield from _generic_platforms() + + def _generic_platforms() -> Iterator[str]: yield _normalize_string(sysconfig.get_platform()) @@ -563,6 +570,8 @@ def platform_tags() -> Iterator[str]: return ios_platforms() elif platform.system() == "Linux": return _linux_platforms() + elif platform.system() == "Emscripten": + return _emscripten_platforms() else: return _generic_platforms() diff --git a/tests/test_tags.py b/tests/test_tags.py index 5ec89b244..1334f2b7b 100644 --- a/tests/test_tags.py +++ b/tests/test_tags.py @@ -1465,6 +1465,44 @@ def test_cpython_first_none_any_tag(self, monkeypatch): interpreter = f"cp{tags.interpreter_version()}" assert tag == tags.Tag(interpreter, "none", "any") + def test_emscripten(self, mock_interpreter_name, monkeypatch): + expected_interpreter = "cp" + tags._version_nodot(sys.version_info[:2]) + if mock_interpreter_name("CPython"): + monkeypatch.setattr( + tags, "_cpython_abis", lambda _1, _2: [expected_interpreter] + ) + monkeypatch.setattr(platform, "system", lambda: "Emscripten") + monkeypatch.setattr( + sysconfig, "get_platform", lambda: "emscripten-3.1.58-wasm32" + ) + assert list(tags.platform_tags()) == ["emscripten_3_1_58_wasm32"] + result = list(tags.sys_tags()) + assert result[0] == tags.Tag( + expected_interpreter, expected_interpreter, "emscripten_3_1_58_wasm32" + ) + + def test_pyemscripten(self, mock_interpreter_name, monkeypatch): + expected_interpreter = "cp" + tags._version_nodot(sys.version_info[:2]) + monkeypatch.setitem( + sysconfig.get_config_vars(), "PYEMSCRIPTEN_ABI_VERSION", "2024_0" + ) + if mock_interpreter_name("CPython"): + monkeypatch.setattr( + tags, "_cpython_abis", lambda _1, _2: [expected_interpreter] + ) + monkeypatch.setattr(platform, "system", lambda: "Emscripten") + monkeypatch.setattr( + sysconfig, "get_platform", lambda: "emscripten-3.1.58-wasm32" + ) + assert list(tags.platform_tags()) == [ + "pyemscripten_2024_0_wasm32", + "emscripten_3_1_58_wasm32", + ] + result = list(tags.sys_tags()) + assert result[0] == tags.Tag( + expected_interpreter, expected_interpreter, "pyemscripten_2024_0_wasm32" + ) + class TestBitness: def teardown_method(self):