From 2fbecd3969f2cced72a62b69c9f80b5421f6a1eb Mon Sep 17 00:00:00 2001 From: Frost Ming Date: Tue, 13 Aug 2024 09:56:57 +0800 Subject: [PATCH] fix: pdm install from requirements.txt does not consider auto selected python version Fixes #3095 Signed-off-by: Frost Ming --- news/3095.bugfix.md | 1 + src/pdm/formats/requirements.py | 12 +++++++----- src/pdm/resolver/providers.py | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) create mode 100644 news/3095.bugfix.md diff --git a/news/3095.bugfix.md b/news/3095.bugfix.md new file mode 100644 index 0000000000..5c9c29bfd3 --- /dev/null +++ b/news/3095.bugfix.md @@ -0,0 +1 @@ +Consider the auto-selected Python range when installing from requirements.txt. diff --git a/src/pdm/formats/requirements.py b/src/pdm/formats/requirements.py index 966f776b42..eb6ec671d3 100644 --- a/src/pdm/formats/requirements.py +++ b/src/pdm/formats/requirements.py @@ -7,6 +7,7 @@ from pathlib import Path from typing import TYPE_CHECKING, Any, Iterable, Mapping +from pdm.environments import BareEnvironment from pdm.exceptions import PdmException, PdmUsageError from pdm.formats.base import make_array from pdm.models.requirements import FileRequirement, Requirement, parse_requirement @@ -16,8 +17,8 @@ from argparse import Namespace from os import PathLike - from pdm.environments import BaseEnvironment from pdm.models.candidates import Candidate + from pdm.models.session import PDMPyPIClient from pdm.project import Project @@ -28,7 +29,7 @@ class RequirementParser: # TODO: support no_binary, only_binary, prefer_binary, pre and no_index - def __init__(self, environment: BaseEnvironment) -> None: + def __init__(self, session: PDMPyPIClient) -> None: self.requirements: list[Requirement] = [] self.index_url: str | None = None self.extra_index_urls: list[str] = [] @@ -44,7 +45,7 @@ def __init__(self, environment: BaseEnvironment) -> None: parser.add_argument("-e", "--editable", nargs="+") parser.add_argument("-r", "--requirement") self._parser = parser - self._env = environment + self._session = session def _clean_line(self, line: str) -> str: """Strip the surrounding whitespaces and comment from the line""" @@ -95,7 +96,7 @@ def parse_lines(self, lines: Iterable[str], filename: str = "") -> No def parse_file(self, filename_or_url: str) -> None: parsed = urllib.parse.urlparse(filename_or_url) if parsed.scheme in ("http", "https", "file"): - resp = self._env.session.get(filename_or_url) + resp = self._session.get(filename_or_url) if resp.is_error: # pragma: no cover raise PdmException( f"Failed to fetch {filename_or_url}: ({resp.status_code} - {resp.reason_phrase}) {resp.text}" @@ -143,7 +144,8 @@ def convert_url_to_source(url: str, name: str | None, trusted_hosts: list[str], def convert(project: Project, filename: PathLike, options: Namespace) -> tuple[Mapping[str, Any], Mapping[str, Any]]: - parser = RequirementParser(project.environment) + env = BareEnvironment(project) + parser = RequirementParser(env.session) parser.parse_file(str(filename)) backend = project.backend diff --git a/src/pdm/resolver/providers.py b/src/pdm/resolver/providers.py index de9dc6388f..77f77116d2 100644 --- a/src/pdm/resolver/providers.py +++ b/src/pdm/resolver/providers.py @@ -160,7 +160,7 @@ def overrides(self) -> dict[str, Requirement]: requirements[r.identify()] = r # Read from --override files - parser = RequirementParser(self.repository.environment) + parser = RequirementParser(self.repository.environment.session) for override_file in self.repository.environment.project.core.state.overrides: parser.parse_file(override_file) for r in parser.requirements: