From b7abae1213e7c42c070073e75b9b0e87381692d1 Mon Sep 17 00:00:00 2001 From: Dhimas Ardinata Date: Sun, 17 May 2026 17:30:08 +0700 Subject: [PATCH 1/2] perf(wheel): cache supported tags set --- src/poetry/utils/env/base_env.py | 8 +++++++ src/poetry/utils/env/mock_env.py | 1 + src/poetry/utils/wheel.py | 2 +- tests/utils/test_wheel.py | 36 ++++++++++++++++++++++++++++++++ 4 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 tests/utils/test_wheel.py diff --git a/src/poetry/utils/env/base_env.py b/src/poetry/utils/env/base_env.py index 1a8ff54bd26..935b28bb636 100644 --- a/src/poetry/utils/env/base_env.py +++ b/src/poetry/utils/env/base_env.py @@ -80,6 +80,7 @@ def __init__(self, path: Path, base: Path | None = None) -> None: self._site_packages: SitePackages | None = None self._supported_tags: list[Tag] | None = None + self._supported_tags_set: set[Tag] | None = None self._purelib: Path | None = None self._platlib: Path | None = None self._script_dirs: list[Path] | None = None @@ -359,6 +360,13 @@ def supported_tags(self) -> list[Tag]: return self._supported_tags + @property + def supported_tags_set(self) -> set[Tag]: + if self._supported_tags_set is None: + self._supported_tags_set = set(self.supported_tags) + + return self._supported_tags_set + @classmethod def get_base_prefix(cls) -> Path: real_prefix = getattr(sys, "real_prefix", None) diff --git a/src/poetry/utils/env/mock_env.py b/src/poetry/utils/env/mock_env.py index 0ffdc72eda3..17c48ae9997 100644 --- a/src/poetry/utils/env/mock_env.py +++ b/src/poetry/utils/env/mock_env.py @@ -41,6 +41,7 @@ def __init__( self._sys_path = sys_path self._mock_marker_env = marker_env self._supported_tags = supported_tags + self._supported_tags_set = None @property def platform(self) -> str: diff --git a/src/poetry/utils/wheel.py b/src/poetry/utils/wheel.py index bb4a70b7907..a50be4ba79b 100644 --- a/src/poetry/utils/wheel.py +++ b/src/poetry/utils/wheel.py @@ -44,4 +44,4 @@ def get_minimum_supported_index(self, tags: list[Tag]) -> int | None: return min(indexes) if indexes else None def is_supported_by_environment(self, env: Env) -> bool: - return bool(set(env.supported_tags).intersection(self.tags)) + return not self.tags.isdisjoint(env.supported_tags_set) diff --git a/tests/utils/test_wheel.py b/tests/utils/test_wheel.py new file mode 100644 index 00000000000..5248e96d206 --- /dev/null +++ b/tests/utils/test_wheel.py @@ -0,0 +1,36 @@ +from __future__ import annotations + +import pytest + +from packaging.tags import Tag + +from poetry.utils.env import MockEnv +from poetry.utils.wheel import Wheel + + +@pytest.mark.parametrize( + ("filename", "supported_tags", "expected"), + [ + ("demo-1.0.0-py3-none-any.whl", [Tag("py3", "none", "any")], True), + ("demo-1.0.0-cp312-cp312-win_amd64.whl", [Tag("py3", "none", "any")], False), + ("demo-1.0.0-py3-none-any.whl", [], False), + ( + "demo-1.0.0-py3-none-any.whl", + [Tag("cp310", "none", "any"), Tag("py3", "none", "any")], + True, + ), + ], +) +def test_wheel_is_supported_by_environment( + filename: str, supported_tags: list[Tag], expected: bool +) -> None: + env = MockEnv(supported_tags=supported_tags) + + assert Wheel(filename).is_supported_by_environment(env) is expected + + +def test_env_supported_tags_set_is_cached() -> None: + env = MockEnv(supported_tags=[Tag("py3", "none", "any")]) + + assert env.supported_tags_set == set(env.supported_tags) + assert env.supported_tags_set is env.supported_tags_set From de6697aaad4838c85b1ea4d4e49cdf545e691ec9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Randy=20D=C3=B6ring?= <30527984+radoering@users.noreply.github.com> Date: Sun, 24 May 2026 16:31:05 +0200 Subject: [PATCH 2/2] add comment --- src/poetry/utils/env/mock_env.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/poetry/utils/env/mock_env.py b/src/poetry/utils/env/mock_env.py index 17c48ae9997..aaaa75b209f 100644 --- a/src/poetry/utils/env/mock_env.py +++ b/src/poetry/utils/env/mock_env.py @@ -41,6 +41,8 @@ def __init__( self._sys_path = sys_path self._mock_marker_env = marker_env self._supported_tags = supported_tags + # _supported_tags_set should not be set at this point. + # We reset it after setting _supported_tags just to be sure. self._supported_tags_set = None @property