99# See https://aboutcode.org for more information about nexB OSS projects.
1010#
1111
12- from typing import List
12+ from typing import List , Iterable , Optional
1313
1414from packageurl import PackageURL
1515
2424from python_inspector .utils_pypi import PypiSimpleRepository
2525
2626
27- def get_pypi_data_from_purl (
27+ async def get_pypi_data_from_purl (
2828 purl : str , environment : Environment , repos : List [PypiSimpleRepository ], prefer_source : bool
29- ) -> PackageData :
29+ ) -> Optional [ PackageData ] :
3030 """
3131 Generate `Package` object from the `purl` string of pypi type
3232
@@ -36,18 +36,19 @@ def get_pypi_data_from_purl(
3636 ``prefer_source`` is a boolean value to prefer source distribution over wheel,
3737 if no source distribution is available then wheel is used
3838 """
39- purl = PackageURL .from_string (purl )
40- name = purl .name
41- version = purl .version
39+ parsed_purl = PackageURL .from_string (purl )
40+ name = parsed_purl .name
41+ version = parsed_purl .version
4242 if not version :
4343 raise Exception ("Version is not specified in the purl" )
4444 base_path = "https://pypi.org/pypi"
4545 api_url = f"{ base_path } /{ name } /{ version } /json"
46- from python_inspector .resolution import get_response
4746
48- response = get_response (api_url )
47+ from python_inspector .utils import get_response_async
48+ response = await get_response_async (api_url )
4949 if not response :
50- return []
50+ return None
51+
5152 info = response .get ("info" ) or {}
5253 homepage_url = info .get ("home_page" )
5354 project_urls = info .get ("project_urls" ) or {}
@@ -56,13 +57,9 @@ def get_pypi_data_from_purl(
5657 python_version = get_python_version_from_env_tag (python_version = environment .python_version )
5758 valid_distribution_urls = []
5859
59- valid_distribution_urls .append (
60- get_sdist_download_url (
61- purl = purl ,
62- repos = repos ,
63- python_version = python_version ,
64- )
65- )
60+ sdist_url = get_sdist_download_url (purl = parsed_purl , repos = repos , python_version = python_version )
61+ if sdist_url :
62+ valid_distribution_urls .append (sdist_url )
6663
6764 valid_distribution_urls = [url for url in valid_distribution_urls if url ]
6865
@@ -71,24 +68,27 @@ def get_pypi_data_from_purl(
7168 if not valid_distribution_urls or not prefer_source :
7269 wheel_urls = list (
7370 get_wheel_download_urls (
74- purl = purl ,
71+ purl = parsed_purl ,
7572 repos = repos ,
7673 environment = environment ,
7774 python_version = python_version ,
7875 )
7976 )
8077 wheel_url = choose_single_wheel (wheel_urls )
8178 if wheel_url :
82- valid_distribution_urls .append ( wheel_url )
79+ valid_distribution_urls .insert ( 0 , wheel_url )
8380
84- urls = response .get ("urls" ) or []
85- for url in urls :
86- dist_url = url .get ("url" )
87- if dist_url not in valid_distribution_urls :
81+ urls = {url .get ("url" ): url for url in response .get ("urls" , [])}
82+ # iterate over the valid distribution urls and return the first
83+ # one that is matching.
84+ for dist_url in valid_distribution_urls :
85+ if dist_url not in urls :
8886 continue
89- digests = url .get ("digests" ) or {}
9087
91- yield PackageData (
88+ url_data = urls .get (dist_url )
89+ digests = url_data .get ("digests" , {})
90+
91+ return PackageData (
9292 primary_language = "Python" ,
9393 description = get_description (info ),
9494 homepage_url = homepage_url ,
@@ -98,10 +98,10 @@ def get_pypi_data_from_purl(
9898 license_expression = info .get ("license_expression" ),
9999 declared_license = get_declared_license (info ),
100100 download_url = dist_url ,
101- size = url .get ("size" ),
102- md5 = digests .get ("md5" ) or url .get ("md5_digest" ),
101+ size = url_data .get ("size" ),
102+ md5 = digests .get ("md5" ) or url_data .get ("md5_digest" ),
103103 sha256 = digests .get ("sha256" ),
104- release_date = url .get ("upload_time" ),
104+ release_date = url_data .get ("upload_time" ),
105105 keywords = get_keywords (info ),
106106 parties = get_parties (
107107 info ,
@@ -110,9 +110,11 @@ def get_pypi_data_from_purl(
110110 maintainer_key = "maintainer" ,
111111 maintainer_email_key = "maintainer_email" ,
112112 ),
113- ** purl .to_dict (),
113+ ** parsed_purl .to_dict (),
114114 )
115115
116+ return None
117+
116118
117119def choose_single_wheel (wheel_urls ):
118120 """
@@ -125,18 +127,18 @@ def choose_single_wheel(wheel_urls):
125127
126128def get_pypi_bugtracker_url (project_urls ):
127129 bug_tracking_url = project_urls .get ("Tracker" )
128- if not ( bug_tracking_url ) :
130+ if not bug_tracking_url :
129131 bug_tracking_url = project_urls .get ("Issue Tracker" )
130- if not ( bug_tracking_url ) :
132+ if not bug_tracking_url :
131133 bug_tracking_url = project_urls .get ("Bug Tracker" )
132134 return bug_tracking_url
133135
134136
135137def get_pypi_codeview_url (project_urls ):
136138 code_view_url = project_urls .get ("Source" )
137- if not ( code_view_url ) :
139+ if not code_view_url :
138140 code_view_url = project_urls .get ("Code" )
139- if not ( code_view_url ) :
141+ if not code_view_url :
140142 code_view_url = project_urls .get ("Source Code" )
141143 return code_view_url
142144
@@ -146,7 +148,7 @@ def get_wheel_download_urls(
146148 repos : List [PypiSimpleRepository ],
147149 environment : Environment ,
148150 python_version : str ,
149- ) -> List [str ]:
151+ ) -> Iterable [str ]:
150152 """
151153 Return a list of download urls for the given purl.
152154 """
0 commit comments