diff --git a/src/poetry/console/commands/new.py b/src/poetry/console/commands/new.py index 968a3a2a90b..2a86ecb5e4d 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,16 @@ 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 = "^" + ".".join( + str(v) + for v in EnvManager.get_python_version( + prefer_active_python=poetry_config.get( + "virtualenvs.prefer-active-python" + ), + io=self.io, + )[:2] + ) layout_ = layout_cls( name, 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()