1
1
import logging
2
2
from optparse import Values
3
- from typing import Generator , Iterable , Iterator , List , NamedTuple , Optional
3
+ from typing import Dict , Generator , Iterable , Iterator , List , NamedTuple , Optional
4
4
5
5
from pip ._vendor .packaging .utils import canonicalize_name
6
6
@@ -61,7 +61,7 @@ class _PackageInfo(NamedTuple):
61
61
classifiers : List [str ]
62
62
summary : str
63
63
homepage : str
64
- project_urls : List [ str ]
64
+ project_urls : Dict [ str , str ]
65
65
author : str
66
66
author_email : str
67
67
license : str
@@ -121,6 +121,25 @@ def _get_requiring_packages(current_dist: BaseDistribution) -> Iterator[str]:
121
121
122
122
metadata = dist .metadata
123
123
124
+ project_urls = {}
125
+ for url in metadata .get_all ("Project-URL" , []):
126
+ url_label , url = url .split ("," , maxsplit = 1 )
127
+ project_urls [url_label .strip ()] = url .strip ()
128
+
129
+ homepage = metadata .get ("Home-page" , "" )
130
+ if not homepage :
131
+ # It's common that there is a "homepage" Project-URL, but Home-page
132
+ # remains unset (especially as PEP 621 doesn't surface the field).
133
+ #
134
+ # This logic was taken from PyPI's codebase.
135
+ for url_label , url in project_urls .items ():
136
+ normalized_label = (
137
+ url_label .casefold ().replace ("-" , "" ).replace ("_" , "" )
138
+ )
139
+ if normalized_label == "homepage" :
140
+ homepage = url
141
+ break
142
+
124
143
yield _PackageInfo (
125
144
name = dist .raw_name ,
126
145
version = str (dist .version ),
@@ -132,8 +151,8 @@ def _get_requiring_packages(current_dist: BaseDistribution) -> Iterator[str]:
132
151
metadata_version = dist .metadata_version or "" ,
133
152
classifiers = metadata .get_all ("Classifier" , []),
134
153
summary = metadata .get ("Summary" , "" ),
135
- homepage = metadata . get ( "Home-page" , "" ) ,
136
- project_urls = metadata . get_all ( "Project-URL" , []) ,
154
+ homepage = homepage ,
155
+ project_urls = project_urls ,
137
156
author = metadata .get ("Author" , "" ),
138
157
author_email = metadata .get ("Author-email" , "" ),
139
158
license = metadata .get ("License" , "" ),
@@ -181,8 +200,8 @@ def print_results(
181
200
for entry in dist .entry_points :
182
201
write_output (" %s" , entry .strip ())
183
202
write_output ("Project-URLs:" )
184
- for project_url in dist .project_urls :
185
- write_output (" %s" , project_url )
203
+ for label , url in dist .project_urls . items () :
204
+ write_output (f " { label } , { url } " )
186
205
if list_files :
187
206
write_output ("Files:" )
188
207
if dist .files is None :
0 commit comments