diff --git a/johnnydep/lib.py b/johnnydep/lib.py index 5a37d8c..0128120 100644 --- a/johnnydep/lib.py +++ b/johnnydep/lib.py @@ -1,7 +1,6 @@ import hashlib import io import json -import os import re import subprocess import sys @@ -187,9 +186,7 @@ def license(self): @cached_property def versions_available(self): - finder = _get_package_finder() - matches = finder.find_matches(self.project_name, allow_prereleases=True) - versions = [p.version for p in matches][::-1] + versions = _get_versions(self.project_name) if self._local_path is not None: raw_version = self._local_path.name.split("-")[1] local_version = canonicalize_version(raw_version) @@ -263,17 +260,22 @@ def pinned(self): def download_link(self): if self._local_path is not None: return f"file://{self._local_path}" - package_finder = _get_package_finder() - return package_finder.find_best_match(self.req, allow_prereleases=True).best.link.url + best = _get_link(self.req) + if best is not None: + return best.link.url @property def checksum(self): if self._local_path is not None: return "md5=" + hashlib.md5(self._local_path.read_bytes()).hexdigest() - link = self.download_link + best = _get_link(self.req) + if best.link.hashes: + for hash in "md5", "sha256": + if hash in best.link.hashes: + return f"{hash}={best.link.hashes[hash]}" f = io.BytesIO() download_dist( - url=link, + url=best.link.url, f=f, index_url=config.index_url, extra_index_url=config.extra_index_url, @@ -577,14 +579,28 @@ def _get_package_finder(): return package_finder +@lru_cache(maxsize=None) +def _get_versions(req): + finder = _get_package_finder() + matches = finder.find_matches(req, allow_prereleases=True) + versions = [p.version for p in matches][::-1] + return versions + + +@lru_cache(maxsize=None) +def _get_link(req): + package_finder = _get_package_finder() + best = package_finder.find_best_match(req, allow_prereleases=True).best + return best + + @lru_cache(maxsize=None) def _get_info(dist_name): log = logger.bind(dist_name=dist_name) tmpdir = mkdtemp() log.debug("created scratch", tmpdir=tmpdir) try: - package_finder = _get_package_finder() - best = package_finder.find_best_match(dist_name, allow_prereleases=True).best + best = _get_link(dist_name) if best is None: raise JohnnyError(f"Package not found {dist_name!r}") dist_path = Path(tmpdir) / best.link.filename diff --git a/tests/conftest.py b/tests/conftest.py index 0a59b81..02ba28c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -17,6 +17,8 @@ @pytest.fixture(autouse=True) def expire_caches(): lib._get_info.cache_clear() + lib._get_link.cache_clear() + lib._get_versions.cache_clear() @pytest.fixture(autouse=True)