diff --git a/src/poetry/console/commands/init.py b/src/poetry/console/commands/init.py index ee068e9ca31..b1c400e1042 100644 --- a/src/poetry/console/commands/init.py +++ b/src/poetry/console/commands/init.py @@ -164,7 +164,7 @@ def handle(self) -> int: default_python = ( "^" + EnvManager.get_python_version( - precious=2, + precision=2, prefer_active_python=config.get("virtualenvs.prefer-active-python"), io=self.io, ).to_string() diff --git a/src/poetry/console/commands/new.py b/src/poetry/console/commands/new.py index 968a3a2a90b..492a7258a94 100644 --- a/src/poetry/console/commands/new.py +++ b/src/poetry/console/commands/new.py @@ -1,7 +1,5 @@ from __future__ import annotations -import sys - from contextlib import suppress from cleo.helpers import argument @@ -31,8 +29,9 @@ def handle(self) -> int: from poetry.core.vcs.git import GitConfig + from poetry.config.config import Config from poetry.layouts import layout - from poetry.utils.env import SystemEnv + from poetry.utils.env import EnvManager if self.io.input.option("directory"): self.line_error( @@ -71,8 +70,17 @@ def handle(self) -> int: if author_email: author += f" <{author_email}>" - current_env = SystemEnv(Path(sys.executable)) - default_python = "^" + ".".join(str(v) for v in current_env.version_info[:2]) + poetry_config = Config.create() + default_python = ( + "^" + + EnvManager.get_python_version( + precision=2, + prefer_active_python=poetry_config.get( + "virtualenvs.prefer-active-python" + ), + io=self.io, + ).to_string() + ) layout_ = layout_cls( name, diff --git a/src/poetry/utils/env.py b/src/poetry/utils/env.py index 0877a9a17eb..7a3584a9e98 100644 --- a/src/poetry/utils/env.py +++ b/src/poetry/utils/env.py @@ -563,11 +563,11 @@ def _detect_active_python(io: None | IO = None) -> str | None: @staticmethod def get_python_version( - precious: int = 3, + precision: int = 3, prefer_active_python: bool = False, io: None | IO = None, ) -> Version: - version = ".".join(str(v) for v in sys.version_info[:precious]) + version = ".".join(str(v) for v in sys.version_info[:precision]) if prefer_active_python: executable = EnvManager._detect_active_python(io) @@ -582,7 +582,7 @@ def get_python_version( ).strip() ) - version = ".".join(str(v) for v in python_patch.split(".")[:precious]) + version = ".".join(str(v) for v in python_patch.split(".")[:precision]) return Version.parse(version) @@ -701,7 +701,7 @@ def get(self, reload: bool = False) -> Env: "virtualenvs.prefer-active-python" ) python_minor = self.get_python_version( - precious=2, prefer_active_python=prefer_active_python, io=self._io + precision=2, prefer_active_python=prefer_active_python, io=self._io ).to_string() venv_path = self._poetry.config.virtualenvs_path diff --git a/tests/console/commands/test_new.py b/tests/console/commands/test_new.py index 79f09e20f27..58560b01e89 100644 --- a/tests/console/commands/test_new.py +++ b/tests/console/commands/test_new.py @@ -1,7 +1,11 @@ from __future__ import annotations +import subprocess +import sys + from pathlib import Path from typing import TYPE_CHECKING +from typing import Any import pytest @@ -10,7 +14,9 @@ if TYPE_CHECKING: from cleo.testers.command_tester import CommandTester + from pytest_mock import MockerFixture + from poetry.config.config import Config from poetry.poetry import Poetry from tests.types import CommandTesterFactory @@ -170,3 +176,47 @@ def test_command_new_with_readme(fmt: str | None, tester: CommandTester, tmp_dir poetry = verify_project_directory(path, package, package, None) assert poetry.local_config.get("readme") == f"README.{fmt or 'md'}" + + +@pytest.mark.parametrize( + ["prefer_active", "python"], + [ + (True, "1.1"), + (False, f"{sys.version_info[0]}.{sys.version_info[1]}"), + ], +) +def test_respect_prefer_active_on_new( + prefer_active: bool, + python: str, + config: Config, + mocker: MockerFixture, + tester: CommandTester, + tmp_dir: str, +): + from poetry.utils.env import GET_PYTHON_VERSION_ONELINER + + orig_check_output = subprocess.check_output + + def mock_check_output(cmd: str, *_: Any, **__: Any) -> str: + if GET_PYTHON_VERSION_ONELINER in cmd: + return "1.1.1" + + return orig_check_output(cmd, *_, **__) + + mocker.patch("subprocess.check_output", side_effect=mock_check_output) + + config.config["virtualenvs"]["prefer-active-python"] = prefer_active + + package = "package" + path = Path(tmp_dir) / package + options = [path.as_posix()] + tester.execute(" ".join(options)) + + pyproject_file = path / "pyproject.toml" + + expected = f"""\ +[tool.poetry.dependencies] +python = "^{python}" +""" + + assert expected in pyproject_file.read_text()