3
3
"""
4
4
5
5
import re
6
- from typing import Dict , Iterable , List
6
+ from typing import Dict , Iterable , List , Optional
7
7
8
8
from pip ._vendor .packaging .tags import Tag
9
9
from pip ._vendor .packaging .utils import BuildTag , parse_wheel_filename
@@ -31,11 +31,11 @@ def __init__(self, filename: str) -> None:
31
31
# To make mypy happy specify type hints that can come from either
32
32
# parse_wheel_filename or the legacy_wheel_file_re match.
33
33
self .name : str
34
- self .build_tag : BuildTag
34
+ self ._build_tag : Optional [ BuildTag ] = None
35
35
36
36
try :
37
37
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
39
39
self .version = str (_version )
40
40
except _PackagingInvalidWheelFilename as e :
41
41
# Check if the wheel filename is in the legacy format
@@ -61,14 +61,7 @@ def __init__(self, filename: str) -> None:
61
61
self .name = legacy_wheel_info .group ("name" ).replace ("_" , "-" )
62
62
self .version = legacy_wheel_info .group ("ver" ).replace ("_" , "-" )
63
63
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
72
65
pyversions = legacy_wheel_info .group ("pyver" ).split ("." )
73
66
abis = legacy_wheel_info .group ("abi" ).split ("." )
74
67
plats = legacy_wheel_info .group ("plat" ).split ("." )
@@ -79,6 +72,22 @@ def __init__(self, filename: str) -> None:
79
72
for plat in plats
80
73
)
81
74
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
+
82
91
def get_formatted_file_tags (self ) -> List [str ]:
83
92
"""Return the wheel's tags as a sorted list of strings."""
84
93
return sorted (str (tag ) for tag in self .file_tags )
0 commit comments