Skip to content

Commit e0f0573

Browse files
committed
feat: use ArtifactCache in get_package_from_url
1 parent 5f98fcf commit e0f0573

File tree

3 files changed

+47
-11
lines changed

3 files changed

+47
-11
lines changed

src/poetry/console/commands/init.py

+9
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
from poetry.console.commands.command import Command
1515
from poetry.console.commands.env_command import EnvCommand
16+
from poetry.utils.cache import ArtifactCache
1617
from poetry.utils.dependency_specification import parse_dependency_specification
1718

1819

@@ -440,11 +441,19 @@ def _parse_requirements(self, requirements: list[str]) -> list[dict[str, Any]]:
440441
except (PyProjectException, RuntimeError):
441442
cwd = Path.cwd()
442443

444+
try:
445+
artifact_cache = ArtifactCache(
446+
cache_dir=self.poetry.config.artifacts_cache_directory
447+
)
448+
except (PyProjectException, RuntimeError):
449+
artifact_cache = None
450+
443451
return [
444452
parse_dependency_specification(
445453
requirement=requirement,
446454
env=self.env if isinstance(self, EnvCommand) else None,
447455
cwd=cwd,
456+
artifact_cache=artifact_cache,
448457
)
449458
for requirement in requirements
450459
]

src/poetry/puzzle/provider.py

+26-7
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from cleo.ui.progress_indicator import ProgressIndicator
1919
from poetry.core.constraints.version import EmptyConstraint
2020
from poetry.core.constraints.version import Version
21+
from poetry.core.packages.utils.link import Link
2122
from poetry.core.packages.utils.utils import get_python_constraint_from_marker
2223
from poetry.core.version.markers import AnyMarker
2324
from poetry.core.version.markers import EmptyMarker
@@ -442,7 +443,7 @@ def get_package_from_directory(cls, directory: Path) -> Package:
442443
return PackageInfo.from_directory(path=directory).to_package(root_dir=directory)
443444

444445
def _search_for_url(self, dependency: URLDependency) -> Package:
445-
package = self.get_package_from_url(dependency.url)
446+
package = self.get_package_from_url(dependency.url, self._artifact_cache)
446447

447448
self.validate_package_for_dependency(dependency=dependency, package=package)
448449

@@ -457,15 +458,33 @@ def _search_for_url(self, dependency: URLDependency) -> Package:
457458
return package
458459

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

467486
package.files = [
468-
{"file": file_name, "hash": "sha256:" + get_file_hash(dest)}
487+
{"file": file_name, "hash": "sha256:" + get_file_hash(artifact)}
469488
]
470489

471490
package._source_type = "url"

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)