diff --git a/src/poetry/console/commands/publish.py b/src/poetry/console/commands/publish.py index 98c0bebe896..3927bffc2cb 100644 --- a/src/poetry/console/commands/publish.py +++ b/src/poetry/console/commands/publish.py @@ -72,9 +72,13 @@ def handle(self) -> int: # Building package first, if told if self.option("build"): - if publisher.files and not self.confirm( - f"There are {len(publisher.files)} files ready for" - " publishing. Build anyway?" + if ( + publisher.files + and self.io.is_interactive() + and not self.confirm( + f"There are {len(publisher.files)} files ready for" + " publishing. Build anyway?" + ) ): self.line_error("Aborted!") diff --git a/tests/console/commands/test_publish.py b/tests/console/commands/test_publish.py index 31723ac8ce3..016b4858bcd 100644 --- a/tests/console/commands/test_publish.py +++ b/tests/console/commands/test_publish.py @@ -5,6 +5,7 @@ from pathlib import Path from typing import TYPE_CHECKING from typing import NoReturn +from unittest.mock import PropertyMock import pytest import requests @@ -215,3 +216,29 @@ def test_publish_dist_dir_and_build_options( assert "Publishing simple-project (1.2.3) to PyPI" in output assert "- Uploading simple_project-1.2.3.tar.gz" in error assert "- Uploading simple_project-1.2.3-py2.py3-none-any.whl" in error + + +def test_publish_build_no_interaction_skips_confirmation( + app_tester: ApplicationTester, mocker: MockerFixture +) -> None: + mocker.patch( + "poetry.publishing.publisher.Publisher.files", + new_callable=PropertyMock, + return_value=[Path("dist/simple_project-1.2.3-py2.py3-none-any.whl")], + ) + confirm = mocker.patch("poetry.console.commands.publish.PublishCommand.confirm") + command_call = mocker.patch("poetry.console.commands.publish.PublishCommand.call") + publisher_files = mocker.patch( + "poetry.publishing.publisher.Publisher.files", + new_callable=mocker.PropertyMock, + return_value=[Path("dist/existing.whl")], + ) + publisher_publish = mocker.patch("poetry.publishing.Publisher.publish") + + exit_code = app_tester.execute("publish --build --no-interaction --dry-run") + + assert exit_code == 0 + confirm.assert_not_called() + command_call.assert_called_once_with("build", args="--output dist") + assert publisher_files.call_count >= 1 + assert publisher_publish.call_count == 1