Skip to content

Commit 00698f6

Browse files
committed
Make legacy build_tag lazy
1 parent c153810 commit 00698f6

File tree

1 file changed

+20
-11
lines changed

1 file changed

+20
-11
lines changed

src/pip/_internal/models/wheel.py

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"""
44

55
import re
6-
from typing import Dict, Iterable, List
6+
from typing import Dict, Iterable, List, Optional
77

88
from pip._vendor.packaging.tags import Tag
99
from pip._vendor.packaging.utils import BuildTag, parse_wheel_filename
@@ -31,11 +31,11 @@ def __init__(self, filename: str) -> None:
3131
# To make mypy happy specify type hints that can come from either
3232
# parse_wheel_filename or the legacy_wheel_file_re match.
3333
self.name: str
34-
self.build_tag: BuildTag
34+
self._build_tag: Optional[BuildTag] = None
3535

3636
try:
3737
wheel_info = parse_wheel_filename(filename)
38-
self.name, _version, self.build_tag, self.file_tags = wheel_info
38+
self.name, _version, self._build_tag, self.file_tags = wheel_info
3939
self.version = str(_version)
4040
except _PackagingInvalidWheelFilename as e:
4141
# Check if the wheel filename is in the legacy format
@@ -61,14 +61,7 @@ def __init__(self, filename: str) -> None:
6161
self.name = legacy_wheel_info.group("name").replace("_", "-")
6262
self.version = legacy_wheel_info.group("ver").replace("_", "-")
6363

64-
# Parse the build tag
65-
build_tag = legacy_wheel_info.group("build")
66-
match = re.match(r"^(\d+)(.*)$", build_tag)
67-
assert match is not None, "guaranteed by filename validation"
68-
build_tag_groups = match.groups()
69-
self.build_tag = (int(build_tag_groups[0]), build_tag_groups[1])
70-
71-
# Generate the file tags
64+
# Generate the file tags from the legacy wheel filename
7265
pyversions = legacy_wheel_info.group("pyver").split(".")
7366
abis = legacy_wheel_info.group("abi").split(".")
7467
plats = legacy_wheel_info.group("plat").split(".")
@@ -79,6 +72,22 @@ def __init__(self, filename: str) -> None:
7972
for plat in plats
8073
)
8174

75+
@property
76+
def build_tag(self) -> BuildTag:
77+
if self._build_tag is not None:
78+
return self._build_tag
79+
80+
# Parse the build tag from the legacy wheel filename
81+
legacy_wheel_info = self.legacy_wheel_file_re.match(self.filename)
82+
assert legacy_wheel_info is not None, "guaranteed by filename validation"
83+
build_tag = legacy_wheel_info.group("build")
84+
match = re.match(r"^(\d+)(.*)$", build_tag)
85+
assert match is not None, "guaranteed by filename validation"
86+
build_tag_groups = match.groups()
87+
self._build_tag = (int(build_tag_groups[0]), build_tag_groups[1])
88+
89+
return self._build_tag
90+
8291
def get_formatted_file_tags(self) -> List[str]:
8392
"""Return the wheel's tags as a sorted list of strings."""
8493
return sorted(str(tag) for tag in self.file_tags)

0 commit comments

Comments
 (0)