Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions src/poetry/utils/env/env_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ def activate(self, python: str) -> Env:
if self.use_in_project_venv():
create = False
venv = self.in_project_venv
if venv.exists():
if venv.is_dir():
# We need to check if the patch version is correct
_venv = VirtualEnv(venv)
current_patch = ".".join(str(v) for v in _venv.version_info[:3])
Expand Down Expand Up @@ -452,7 +452,7 @@ def create_venv(
f"Invalid template string in 'virtualenvs.prompt' setting: {e}"
) from e

if not venv.exists():
if not venv.is_dir():
if create_venv is False:
self._io.write_error_line(
"<fg=black;bg=yellow>"
Expand All @@ -463,6 +463,12 @@ def create_venv(

return self.get_system_env()

if venv.is_file():
self._io.write_error_line(
f"<warning>{venv} is not a virtual environment but a file. Removing it.</warning>"
)
venv.unlink()

self._io.write_error_line(
f"Creating virtualenv <c1>{name}</> in"
f" {venv_path if not WINDOWS else get_real_windows_path(venv_path)!s}"
Expand Down
11 changes: 9 additions & 2 deletions tests/utils/env/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

import pytest

from cleo.io.buffered_io import BufferedIO

from poetry.utils.env import EnvManager


Expand All @@ -19,5 +21,10 @@ def poetry(project_factory: ProjectFactory, fixture_dir: FixtureDirGetter) -> Po


@pytest.fixture
def manager(poetry: Poetry) -> EnvManager:
return EnvManager(poetry)
def io() -> BufferedIO:
return BufferedIO()


@pytest.fixture
def manager(poetry: Poetry, io: BufferedIO) -> EnvManager:
return EnvManager(poetry, io)
51 changes: 51 additions & 0 deletions tests/utils/env/test_env_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
from collections.abc import Iterator
from unittest.mock import MagicMock

from cleo.io.buffered_io import BufferedIO
from pytest import LogCaptureFixture
from pytest_mock import MockerFixture

Expand Down Expand Up @@ -470,6 +471,56 @@ def test_activate_with_in_project_setting_does_not_fail_if_no_venvs_dir(
assert not envs_file.exists()


def test_activate_with_in_project_setting_if_venv_is_file(
manager: EnvManager,
poetry: Poetry,
io: BufferedIO,
config: Config,
tmp_path: Path,
mocker: MockerFixture,
venv_flags_default: dict[str, bool],
mocked_python_register: MockedPythonRegister,
) -> None:
if "VIRTUAL_ENV" in os.environ:
del os.environ["VIRTUAL_ENV"]

config.merge(
{
"virtualenvs": {
"path": str(tmp_path / "virtualenvs"),
"in-project": True,
}
}
)

mocked_python_register("3.7.1")
m = mocker.patch("poetry.utils.env.EnvManager.build_venv")

venv_path = poetry.file.path.parent / ".venv"
assert not venv_path.exists()
venv_path.touch()
assert venv_path.is_file()

manager.activate("python3.7")

m.assert_called_with(
poetry.file.path.parent / ".venv",
executable=Path("/usr/bin/python3.7"),
flags=venv_flags_default,
prompt="simple-project-py3.7",
)

envs_file = TOMLFile(tmp_path / "virtualenvs" / "envs.toml")
assert not envs_file.exists()

# The .venv file is removed, but no .venv is created because we mocked build_venv.
assert not venv_path.exists()
assert (
f"{venv_path} is not a virtual environment but a file. Removing it."
in io.fetch_error()
)


def test_deactivate_non_activated_but_existing(
tmp_path: Path,
manager: EnvManager,
Expand Down
Loading