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
default_python = (
"^"
+ EnvManager.get_python_version(
precious=2,
precision=2,
prefer_active_python=config.get("virtualenvs.prefer-active-python"),
io=self.io,
).to_string()
......
from __future__ import annotations
import sys
from contextlib import suppress
from cleo.helpers import argument
......@@ -31,8 +29,9 @@ class NewCommand(Command):
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 @@ class NewCommand(Command):
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,
......
......@@ -563,11 +563,11 @@ class EnvManager:
@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 @@ class EnvManager:
).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 @@ class EnvManager:
"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
......
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 @@ from poetry.factory import Factory
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()
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