Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ensure --dry-run option doesn't update poetry.lock for add, update and remove #5718

Merged
merged 3 commits into from
May 29, 2022
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
4 changes: 2 additions & 2 deletions src/poetry/installation/installer.py
Original file line number Diff line number Diff line change
Expand Up @@ -337,8 +337,8 @@ def _do_install(self, local_repo: Repository) -> int:
# Execute operations
return self._execute(ops)

def _write_lock_file(self, repo: Repository, force: bool = True) -> None:
if force or (self._update and self._write_lock):
def _write_lock_file(self, repo: Repository, force: bool = False) -> None:
if self._write_lock and (force or self._update):
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was a suggestion from @radoering here, and looking at the usage of the method, it does seem that the only place where we use force leaves _write_lock to True, so this seems to make sense.

updated_lock = self._locker.set_lock_data(self._package, repo.packages)

if updated_lock:
Expand Down
2 changes: 0 additions & 2 deletions tests/console/commands/plugin/test_remove.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,8 +122,6 @@ def test_remove_installed_package_dry_run(
Updating dependencies
Resolving dependencies...

Writing lock file

Package operations: 0 installs, 0 updates, 1 removal

• Removing poetry-plugin (1.2.3)
Expand Down
61 changes: 48 additions & 13 deletions tests/console/commands/test_add.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,21 @@
from tests.helpers import PoetryTestApplication
from tests.helpers import TestRepository
from tests.types import CommandTesterFactory
from tests.types import FixtureDirGetter
from tests.types import ProjectFactory


@pytest.fixture
def poetry_with_up_to_date_lockfile(
project_factory: ProjectFactory, fixture_dir: FixtureDirGetter
) -> Poetry:
source = fixture_dir("up_to_date_lock")

return project_factory(
name="foobar",
pyproject_content=(source / "pyproject.toml").read_text(encoding="utf-8"),
poetry_lock_content=(source / "poetry.lock").read_text(encoding="utf-8"),
)


@pytest.fixture()
Expand Down Expand Up @@ -1999,34 +2014,54 @@ def test_add_with_lock_old_installer(


def test_add_keyboard_interrupt_restore_content(
app: PoetryTestApplication,
poetry_with_up_to_date_lockfile: Poetry,
repo: TestRepository,
installer: NoopInstaller,
tester: CommandTester,
command_tester_factory: CommandTesterFactory,
mocker: MockerFixture,
):
tester = command_tester_factory("add", poetry=poetry_with_up_to_date_lockfile)

mocker.patch(
"poetry.installation.installer.Installer.run", side_effect=KeyboardInterrupt()
)
original_content = app.poetry.file.read()
original_pyproject_content = poetry_with_up_to_date_lockfile.file.read()
original_lockfile_content = poetry_with_up_to_date_lockfile._locker.lock_data

repo.add_package(get_package("cachy", "0.2.0"))
repo.add_package(get_package("docker", "4.3.1"))

tester.execute("cachy --dry-run")
tester.execute("cachy")
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated the test here because since we're testing a keyboard interrupt, it may be nice to test that the non-dry-run variant prevents updates on the files.


assert original_content == app.poetry.file.read()
assert poetry_with_up_to_date_lockfile.file.read() == original_pyproject_content
assert (
poetry_with_up_to_date_lockfile._locker.lock_data == original_lockfile_content
)


def test_dry_run_restore_original_content(
app: PoetryTestApplication,
@pytest.mark.parametrize(
"command",
[
"cachy --dry-run",
"cachy --lock --dry-run",
],
)
def test_add_with_dry_run_keep_files_intact(
command: str,
poetry_with_up_to_date_lockfile: Poetry,
repo: TestRepository,
installer: NoopInstaller,
tester: CommandTester,
command_tester_factory: CommandTesterFactory,
):
original_content = app.poetry.file.read()
tester = command_tester_factory("add", poetry=poetry_with_up_to_date_lockfile)

original_pyproject_content = poetry_with_up_to_date_lockfile.file.read()
original_lockfile_content = poetry_with_up_to_date_lockfile._locker.lock_data

repo.add_package(get_package("cachy", "0.2.0"))
repo.add_package(get_package("docker", "4.3.1"))

tester.execute("cachy --dry-run")
tester.execute(command)

assert original_content == app.poetry.file.read()
assert poetry_with_up_to_date_lockfile.file.read() == original_pyproject_content
assert (
poetry_with_up_to_date_lockfile._locker.lock_data == original_lockfile_content
)
37 changes: 37 additions & 0 deletions tests/console/commands/test_remove.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,33 @@
from poetry.core.packages.package import Package

from poetry.factory import Factory
from tests.helpers import get_package


if TYPE_CHECKING:
from cleo.testers.command_tester import CommandTester
from pytest_mock import MockerFixture

from poetry.poetry import Poetry
from poetry.repositories import Repository
from tests.helpers import PoetryTestApplication
from tests.helpers import TestRepository
from tests.types import CommandTesterFactory
from tests.types import FixtureDirGetter
from tests.types import ProjectFactory


@pytest.fixture
def poetry_with_up_to_date_lockfile(
project_factory: ProjectFactory, fixture_dir: FixtureDirGetter
) -> Poetry:
source = fixture_dir("up_to_date_lock")

return project_factory(
name="foobar",
pyproject_content=(source / "pyproject.toml").read_text(encoding="utf-8"),
poetry_lock_content=(source / "poetry.lock").read_text(encoding="utf-8"),
)


@pytest.fixture()
Expand Down Expand Up @@ -256,3 +273,23 @@ def test_remove_command_should_not_write_changes_upon_installer_errors(
tester.execute("foo")

assert app.poetry.file.read().as_string() == original_content


def test_remove_with_dry_run_keep_files_intact(
poetry_with_up_to_date_lockfile: Poetry,
repo: TestRepository,
command_tester_factory: CommandTesterFactory,
):
tester = command_tester_factory("remove", poetry=poetry_with_up_to_date_lockfile)

original_pyproject_content = poetry_with_up_to_date_lockfile.file.read()
original_lockfile_content = poetry_with_up_to_date_lockfile._locker.lock_data

repo.add_package(get_package("docker", "4.3.1"))

tester.execute("docker --dry-run")

assert poetry_with_up_to_date_lockfile.file.read() == original_pyproject_content
assert (
poetry_with_up_to_date_lockfile._locker.lock_data == original_lockfile_content
)
57 changes: 57 additions & 0 deletions tests/console/commands/test_update.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
from __future__ import annotations

from typing import TYPE_CHECKING

import pytest

from tests.helpers import get_package


if TYPE_CHECKING:
from poetry.poetry import Poetry
from tests.helpers import TestRepository
from tests.types import CommandTesterFactory
from tests.types import FixtureDirGetter
from tests.types import ProjectFactory


@pytest.fixture
def poetry_with_up_to_date_lockfile(
project_factory: ProjectFactory, fixture_dir: FixtureDirGetter
) -> Poetry:
source = fixture_dir("outdated_lock")

return project_factory(
name="foobar",
pyproject_content=(source / "pyproject.toml").read_text(encoding="utf-8"),
poetry_lock_content=(source / "poetry.lock").read_text(encoding="utf-8"),
)


@pytest.mark.parametrize(
"command",
[
"--dry-run",
"docker --dry-run",
],
)
def test_update_with_dry_run_keep_files_intact(
command: str,
poetry_with_up_to_date_lockfile: Poetry,
repo: TestRepository,
command_tester_factory: CommandTesterFactory,
):
tester = command_tester_factory("update", poetry=poetry_with_up_to_date_lockfile)

original_pyproject_content = poetry_with_up_to_date_lockfile.file.read()
original_lockfile_content = poetry_with_up_to_date_lockfile._locker.lock_data

repo.add_package(get_package("docker", "4.3.0"))
repo.add_package(get_package("docker", "4.3.1"))

tester.execute(command)

assert poetry_with_up_to_date_lockfile.file.read() == original_pyproject_content
assert (
poetry_with_up_to_date_lockfile._locker.lock_data == original_lockfile_content
)