Skip to content

Commit 43895af

Browse files
committed
feat: use ArtifactCache in get_package_from_url
1 parent 6b4b539 commit 43895af

File tree

7 files changed

+75
-19
lines changed

7 files changed

+75
-19
lines changed

src/poetry/console/commands/init.py

+3
Original file line numberDiff line numberDiff line change
@@ -434,14 +434,17 @@ def _parse_requirements(self, requirements: list[str]) -> list[dict[str, Any]]:
434434

435435
try:
436436
cwd = self.poetry.file.parent
437+
artifact_cache = self.poetry.pool.artifact_cache
437438
except (PyProjectException, RuntimeError):
438439
cwd = Path.cwd()
440+
artifact_cache = None
439441

440442
return [
441443
parse_dependency_specification(
442444
requirement=requirement,
443445
env=self.env if isinstance(self, EnvCommand) else None,
444446
cwd=cwd,
447+
artifact_cache=artifact_cache,
445448
)
446449
for requirement in requirements
447450
]

src/poetry/console/commands/show.py

+12-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
from poetry.console.commands.env_command import EnvCommand
1010
from poetry.console.commands.group_command import GroupCommand
11+
from poetry.utils.cache import ArtifactCache
1112

1213

1314
if TYPE_CHECKING:
@@ -213,7 +214,12 @@ def _display_packages_information(
213214
from poetry.utils.helpers import get_package_version_display_string
214215

215216
locked_packages = locked_repository.packages
216-
pool = RepositoryPool(ignore_repository_names=True)
217+
pool = RepositoryPool(
218+
ignore_repository_names=True,
219+
artifact_cache=ArtifactCache(
220+
cache_dir=self.poetry.config.artifacts_cache_directory
221+
),
222+
)
217223
pool.add_repository(locked_repository)
218224
solver = Solver(
219225
root,
@@ -547,7 +553,11 @@ def find_latest_package(
547553
if package.is_direct_origin():
548554
for dep in requires:
549555
if dep.name == package.name and dep.source_type == package.source_type:
550-
provider = Provider(root, self.poetry.pool, NullIO())
556+
provider = Provider(
557+
root,
558+
self.poetry.pool,
559+
NullIO(),
560+
)
551561
return provider.search_for_direct_origin_dependency(dep)
552562

553563
allow_prereleases = False

src/poetry/factory.py

+8-5
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from poetry.plugins.plugin_manager import PluginManager
2222
from poetry.poetry import Poetry
2323
from poetry.toml.file import TOMLFile
24+
from poetry.utils.cache import ArtifactCache
2425

2526

2627
if TYPE_CHECKING:
@@ -118,7 +119,7 @@ def get_package(cls, name: str, version: str) -> ProjectPackage:
118119
@classmethod
119120
def create_pool(
120121
cls,
121-
auth_config: Config,
122+
config: Config,
122123
sources: Iterable[dict[str, Any]] = (),
123124
io: IO | None = None,
124125
disable_cache: bool = False,
@@ -132,11 +133,13 @@ def create_pool(
132133
if disable_cache:
133134
logger.debug("Disabling source caches")
134135

135-
pool = RepositoryPool()
136+
pool = RepositoryPool(
137+
artifact_cache=ArtifactCache(cache_dir=config.artifacts_cache_directory)
138+
)
136139

137140
for source in sources:
138141
repository = cls.create_package_source(
139-
source, auth_config, disable_cache=disable_cache
142+
source, config, disable_cache=disable_cache
140143
)
141144
priority = Priority[source.get("priority", Priority.PRIMARY.name).upper()]
142145
if "default" in source or "secondary" in source:
@@ -184,7 +187,7 @@ def create_pool(
184187

185188
@classmethod
186189
def create_package_source(
187-
cls, source: dict[str, str], auth_config: Config, disable_cache: bool = False
190+
cls, source: dict[str, str], config: Config, disable_cache: bool = False
188191
) -> LegacyRepository:
189192
from poetry.repositories.legacy_repository import LegacyRepository
190193
from poetry.repositories.single_page_repository import SinglePageRepository
@@ -206,7 +209,7 @@ def create_package_source(
206209
return repository_class(
207210
name,
208211
url,
209-
config=auth_config,
212+
config=config,
210213
disable_cache=disable_cache,
211214
)
212215

src/poetry/installation/installer.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from poetry.repositories import RepositoryPool
1717
from poetry.repositories.installed_repository import InstalledRepository
1818
from poetry.repositories.lockfile_repository import LockfileRepository
19+
from poetry.utils.cache import ArtifactCache
1920
from poetry.utils.extras import get_extra_package_names
2021
from poetry.utils.helpers import pluralize
2122

@@ -81,6 +82,7 @@ def __init__(
8182
installed = self._get_installed()
8283

8384
self._installed_repository = installed
85+
self._artifact_cache = ArtifactCache(cache_dir=config.artifacts_cache_directory)
8486

8587
@property
8688
def executor(self) -> Executor:
@@ -314,7 +316,9 @@ def _do_install(self) -> int:
314316
)
315317

316318
# We resolve again by only using the lock file
317-
pool = RepositoryPool(ignore_repository_names=True)
319+
pool = RepositoryPool(
320+
ignore_repository_names=True, artifact_cache=self._artifact_cache
321+
)
318322

319323
# Making a new repo containing the packages
320324
# newly resolved and the ones from the current lock file

src/poetry/puzzle/provider.py

+27-7
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from cleo.ui.progress_indicator import ProgressIndicator
1818
from poetry.core.constraints.version import EmptyConstraint
1919
from poetry.core.constraints.version import Version
20+
from poetry.core.packages.utils.link import Link
2021
from poetry.core.packages.utils.utils import get_python_constraint_from_marker
2122
from poetry.core.version.markers import AnyMarker
2223
from poetry.core.version.markers import EmptyMarker
@@ -56,6 +57,7 @@
5657
from poetry.core.version.markers import BaseMarker
5758

5859
from poetry.repositories import RepositoryPool
60+
from poetry.utils.cache import ArtifactCache
5961
from poetry.utils.env import Env
6062

6163

@@ -439,7 +441,7 @@ def get_package_from_directory(cls, directory: Path) -> Package:
439441
return PackageInfo.from_directory(path=directory).to_package(root_dir=directory)
440442

441443
def _search_for_url(self, dependency: URLDependency) -> Package:
442-
package = self.get_package_from_url(dependency.url)
444+
package = self.get_package_from_url(dependency.url, self._pool.artifact_cache)
443445

444446
self.validate_package_for_dependency(dependency=dependency, package=package)
445447

@@ -454,15 +456,33 @@ def _search_for_url(self, dependency: URLDependency) -> Package:
454456
return package
455457

456458
@classmethod
457-
def get_package_from_url(cls, url: str) -> Package:
459+
def get_package_from_url(
460+
cls, url: str, artifact_cache: ArtifactCache | None = None
461+
) -> Package:
458462
file_name = os.path.basename(urllib.parse.urlparse(url).path)
459-
with tempfile.TemporaryDirectory() as temp_dir:
460-
dest = Path(temp_dir) / file_name
461-
download_file(url, dest)
462-
package = cls.get_package_from_file(dest)
463+
link = Link(url)
464+
artifact = (
465+
artifact_cache.get_cached_archive_for_link(Link(url), strict=True)
466+
if artifact_cache
467+
else None
468+
)
469+
470+
with tempfile.TemporaryDirectory() as tmp_dir:
471+
if not artifact:
472+
if artifact_cache:
473+
artifact = (
474+
artifact_cache.get_cache_directory_for_link(link) / file_name
475+
)
476+
artifact.parent.mkdir(parents=True, exist_ok=True)
477+
else:
478+
artifact = Path(tmp_dir) / file_name
479+
480+
download_file(url, artifact)
481+
482+
package = cls.get_package_from_file(artifact)
463483

464484
package.files = [
465-
{"file": file_name, "hash": "sha256:" + get_file_hash(dest)}
485+
{"file": file_name, "hash": "sha256:" + get_file_hash(artifact)}
466486
]
467487

468488
package._source_type = "url"

src/poetry/repositories/repository_pool.py

+8
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from poetry.core.packages.package import Package
1919

2020
from poetry.repositories.repository import Repository
21+
from poetry.utils.cache import ArtifactCache
2122

2223

2324
class Priority(IntEnum):
@@ -40,6 +41,7 @@ def __init__(
4041
self,
4142
repositories: list[Repository] | None = None,
4243
ignore_repository_names: bool = False,
44+
artifact_cache: ArtifactCache | None = None,
4345
) -> None:
4446
super().__init__("poetry-repository-pool")
4547
self._repositories: OrderedDict[str, PrioritizedRepository] = OrderedDict()
@@ -50,6 +52,8 @@ def __init__(
5052
for repository in repositories:
5153
self.add_repository(repository)
5254

55+
self._artifact_cache = artifact_cache
56+
5357
@property
5458
def repositories(self) -> list[Repository]:
5559
"""
@@ -77,6 +81,10 @@ def _sorted_repositories(self) -> list[PrioritizedRepository]:
7781
self._repositories.values(), key=lambda prio_repo: prio_repo.priority
7882
)
7983

84+
@property
85+
def artifact_cache(self) -> ArtifactCache | None:
86+
return self._artifact_cache
87+
8088
def has_default(self) -> bool:
8189
return self._contains_priority(Priority.DEFAULT)
8290

src/poetry/utils/dependency_specification.py

+12-4
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
if TYPE_CHECKING:
2323
from poetry.core.packages.vcs_dependency import VCSDependency
2424

25+
from poetry.utils.cache import ArtifactCache
2526
from poetry.utils.env import Env
2627

2728

@@ -58,7 +59,9 @@ def _parse_dependency_specification_git_url(
5859

5960

6061
def _parse_dependency_specification_url(
61-
requirement: str, env: Env | None = None
62+
requirement: str,
63+
env: Env | None = None,
64+
artifact_cache: ArtifactCache | None = None,
6265
) -> DependencySpec | None:
6366
url_parsed = urllib.parse.urlparse(requirement)
6467
if not (url_parsed.scheme and url_parsed.netloc):
@@ -68,7 +71,7 @@ def _parse_dependency_specification_url(
6871
return _parse_dependency_specification_git_url(requirement, env)
6972

7073
if url_parsed.scheme in ["http", "https"]:
71-
package = Provider.get_package_from_url(requirement)
74+
package = Provider.get_package_from_url(requirement, artifact_cache)
7275
assert package.source_url is not None
7376
return {"name": package.name, "url": package.source_url}
7477

@@ -196,7 +199,10 @@ def pep508_to_dependency_specification(requirement: str) -> DependencySpec | Non
196199

197200

198201
def parse_dependency_specification(
199-
requirement: str, env: Env | None = None, cwd: Path | None = None
202+
requirement: str,
203+
env: Env | None = None,
204+
cwd: Path | None = None,
205+
artifact_cache: ArtifactCache | None = None,
200206
) -> DependencySpec:
201207
requirement = requirement.strip()
202208
cwd = cwd or Path.cwd()
@@ -213,7 +219,9 @@ def parse_dependency_specification(
213219
requirement, _ = requirement.split("[")
214220

215221
specification = (
216-
_parse_dependency_specification_url(requirement, env=env)
222+
_parse_dependency_specification_url(
223+
requirement, env=env, artifact_cache=artifact_cache
224+
)
217225
or _parse_dependency_specification_path(requirement, cwd=cwd)
218226
or _parse_dependency_specification_simple(requirement)
219227
)

0 commit comments

Comments
 (0)