Skip to content

Commit 0f3e509

Browse files
perf(wheel): cache supported tags set
1 parent 050a405 commit 0f3e509

4 files changed

Lines changed: 46 additions & 1 deletion

File tree

src/poetry/utils/env/base_env.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ def __init__(self, path: Path, base: Path | None = None) -> None:
8080

8181
self._site_packages: SitePackages | None = None
8282
self._supported_tags: list[Tag] | None = None
83+
self._supported_tags_set: set[Tag] | None = None
8384
self._purelib: Path | None = None
8485
self._platlib: Path | None = None
8586
self._script_dirs: list[Path] | None = None
@@ -359,6 +360,13 @@ def supported_tags(self) -> list[Tag]:
359360

360361
return self._supported_tags
361362

363+
@property
364+
def supported_tags_set(self) -> set[Tag]:
365+
if self._supported_tags_set is None:
366+
self._supported_tags_set = set(self.supported_tags)
367+
368+
return self._supported_tags_set
369+
362370
@classmethod
363371
def get_base_prefix(cls) -> Path:
364372
real_prefix = getattr(sys, "real_prefix", None)

src/poetry/utils/env/mock_env.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ def __init__(
4141
self._sys_path = sys_path
4242
self._mock_marker_env = marker_env
4343
self._supported_tags = supported_tags
44+
self._supported_tags_set = None
4445

4546
@property
4647
def platform(self) -> str:

src/poetry/utils/wheel.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,4 @@ def get_minimum_supported_index(self, tags: list[Tag]) -> int | None:
4444
return min(indexes) if indexes else None
4545

4646
def is_supported_by_environment(self, env: Env) -> bool:
47-
return bool(set(env.supported_tags).intersection(self.tags))
47+
return not self.tags.isdisjoint(env.supported_tags_set)

tests/utils/test_wheel.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
from __future__ import annotations
2+
3+
import pytest
4+
5+
from packaging.tags import Tag
6+
7+
from poetry.utils.env import MockEnv
8+
from poetry.utils.wheel import Wheel
9+
10+
11+
@pytest.mark.parametrize(
12+
("filename", "supported_tags", "expected"),
13+
[
14+
("demo-1.0.0-py3-none-any.whl", [Tag("py3", "none", "any")], True),
15+
("demo-1.0.0-cp312-cp312-win_amd64.whl", [Tag("py3", "none", "any")], False),
16+
("demo-1.0.0-py3-none-any.whl", [], False),
17+
(
18+
"demo-1.0.0-py3-none-any.whl",
19+
[Tag("cp310", "none", "any"), Tag("py3", "none", "any")],
20+
True,
21+
),
22+
],
23+
)
24+
def test_wheel_is_supported_by_environment(
25+
filename: str, supported_tags: list[Tag], expected: bool
26+
) -> None:
27+
env = MockEnv(supported_tags=supported_tags)
28+
29+
assert Wheel(filename).is_supported_by_environment(env) is expected
30+
31+
32+
def test_env_supported_tags_set_is_cached() -> None:
33+
env = MockEnv(supported_tags=[Tag("py3", "none", "any")])
34+
35+
assert env.supported_tags_set == set(env.supported_tags)
36+
assert env.supported_tags_set is env.supported_tags_set

0 commit comments

Comments
 (0)