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..aaaa75b209f 100644 --- a/src/poetry/utils/env/mock_env.py +++ b/src/poetry/utils/env/mock_env.py @@ -41,6 +41,9 @@ 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 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