Commit d9b563b3 by finswimmer Committed by Randy Döring

feat: take `virtualenvs.prefer-active-python` into account on `poetry new`

parent 8949bfdc
...@@ -164,7 +164,7 @@ The <c1>init</c1> command creates a basic <comment>pyproject.toml</> file in the ...@@ -164,7 +164,7 @@ The <c1>init</c1> command creates a basic <comment>pyproject.toml</> file in the
default_python = ( default_python = (
"^" "^"
+ EnvManager.get_python_version( + EnvManager.get_python_version(
precious=2, precision=2,
prefer_active_python=config.get("virtualenvs.prefer-active-python"), prefer_active_python=config.get("virtualenvs.prefer-active-python"),
io=self.io, io=self.io,
).to_string() ).to_string()
......
from __future__ import annotations from __future__ import annotations
import sys
from contextlib import suppress from contextlib import suppress
from cleo.helpers import argument from cleo.helpers import argument
...@@ -31,8 +29,9 @@ class NewCommand(Command): ...@@ -31,8 +29,9 @@ class NewCommand(Command):
from poetry.core.vcs.git import GitConfig from poetry.core.vcs.git import GitConfig
from poetry.config.config import Config
from poetry.layouts import layout from poetry.layouts import layout
from poetry.utils.env import SystemEnv from poetry.utils.env import EnvManager
if self.io.input.option("directory"): if self.io.input.option("directory"):
self.line_error( self.line_error(
...@@ -71,8 +70,17 @@ class NewCommand(Command): ...@@ -71,8 +70,17 @@ class NewCommand(Command):
if author_email: if author_email:
author += f" <{author_email}>" author += f" <{author_email}>"
current_env = SystemEnv(Path(sys.executable)) poetry_config = Config.create()
default_python = "^" + ".".join(str(v) for v in current_env.version_info[:2]) 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( layout_ = layout_cls(
name, name,
......
...@@ -563,11 +563,11 @@ class EnvManager: ...@@ -563,11 +563,11 @@ class EnvManager:
@staticmethod @staticmethod
def get_python_version( def get_python_version(
precious: int = 3, precision: int = 3,
prefer_active_python: bool = False, prefer_active_python: bool = False,
io: None | IO = None, io: None | IO = None,
) -> Version: ) -> 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: if prefer_active_python:
executable = EnvManager._detect_active_python(io) executable = EnvManager._detect_active_python(io)
...@@ -582,7 +582,7 @@ class EnvManager: ...@@ -582,7 +582,7 @@ class EnvManager:
).strip() ).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) return Version.parse(version)
...@@ -701,7 +701,7 @@ class EnvManager: ...@@ -701,7 +701,7 @@ class EnvManager:
"virtualenvs.prefer-active-python" "virtualenvs.prefer-active-python"
) )
python_minor = self.get_python_version( 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() ).to_string()
venv_path = self._poetry.config.virtualenvs_path venv_path = self._poetry.config.virtualenvs_path
......
from __future__ import annotations from __future__ import annotations
import subprocess
import sys
from pathlib import Path from pathlib import Path
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from typing import Any
import pytest import pytest
...@@ -10,7 +14,9 @@ from poetry.factory import Factory ...@@ -10,7 +14,9 @@ from poetry.factory import Factory
if TYPE_CHECKING: if TYPE_CHECKING:
from cleo.testers.command_tester import CommandTester from cleo.testers.command_tester import CommandTester
from pytest_mock import MockerFixture
from poetry.config.config import Config
from poetry.poetry import Poetry from poetry.poetry import Poetry
from tests.types import CommandTesterFactory from tests.types import CommandTesterFactory
...@@ -170,3 +176,47 @@ def test_command_new_with_readme(fmt: str | None, tester: CommandTester, tmp_dir ...@@ -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) poetry = verify_project_directory(path, package, package, None)
assert poetry.local_config.get("readme") == f"README.{fmt or 'md'}" 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()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment