Skip to content

Commit b91984b

Browse files
Merge pull request #152 from boidolr/perf
Skip requests guaranteed to fail
2 parents 2dc32af + 41443b1 commit b91984b

2 files changed

Lines changed: 29 additions & 3 deletions

File tree

‎licensecheck/packageinforesolver.py‎

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import re
88
from concurrent.futures import ThreadPoolExecutor
99
from email.message import Message
10+
from functools import lru_cache
1011
from importlib import metadata
1112
from importlib.metadata._meta import PackageMetadata
1213
from pathlib import Path
@@ -113,6 +114,7 @@ def _get_package_info(self, package: Requirement) -> PackageInfo:
113114
return pkg_info
114115

115116

117+
@lru_cache(maxsize=128)
116118
def normalize_license(lice: str) -> str:
117119
licensing = Licensing()
118120
parsed = None
@@ -182,9 +184,11 @@ def __init__(self, pypi_api: str, package: PackageInfo) -> None:
182184
def lazy_fetch(self) -> None:
183185
if self.resp is None:
184186
# Attempt to get versioned info first
185-
rc, raw_resp = self.make_req(
186-
url=f"{self.pypi_api_pypi}{self.package.name}/{self.package.version}/json"
187-
)
187+
rc, raw_resp = -1, {}
188+
if self.package.version is not None:
189+
rc, raw_resp = self.make_req(
190+
url=f"{self.pypi_api_pypi}{self.package.name}/{self.package.version}/json"
191+
)
188192
# Otherwise just get the latest
189193
if rc != HTTP_OK:
190194
rc, raw_resp = self.make_req(url=f"{self.pypi_api_pypi}/{self.package.name}/json")

‎tests/test_packageinfo.py‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,28 @@ def test_getPackagePypiLocalNotFound() -> None:
6767
assert pkg.get_size() is None
6868

6969

70+
def test_unpinned_remote_package_skips_versioned_request(
71+
monkeypatch: pytest.MonkeyPatch,
72+
) -> None:
73+
pkg = RemotePackageInfo("https://pypi.org", aux_packageinfo("sample"))
74+
requested_urls: list[str] = []
75+
76+
def make_req(_self: RemotePackageInfo, url: str) -> tuple[int, dict[str, object]]:
77+
requested_urls.append(url)
78+
return 200, {}
79+
80+
class ProjectResponseStub:
81+
@staticmethod
82+
def model_validate(data: dict[str, object]) -> dict[str, object]:
83+
return data
84+
85+
monkeypatch.setattr("licensecheck.packageinforesolver.RemotePackageInfo.make_req", make_req)
86+
monkeypatch.setattr("licensecheck.packageinforesolver.ProjectResponse", ProjectResponseStub)
87+
pkg.lazy_fetch()
88+
89+
assert requested_urls == ["https://pypi.org/pypi/sample/json"]
90+
91+
7092
def test_getPackages(package_info_manager: PackageInfoManager) -> None:
7193
package_info_manager.reqs = {aux_packageinfo("requests")}
7294
packages = package_info_manager.getPackages()

0 commit comments

Comments
 (0)