diff --git a/src/poetry/console/commands/build.py b/src/poetry/console/commands/build.py index 0bc293b1e16..e77aaf40394 100644 --- a/src/poetry/console/commands/build.py +++ b/src/poetry/console/commands/build.py @@ -114,6 +114,9 @@ def _get_builder(self) -> Callable[..., None]: return self._build + def _has_build_backend_defined(self) -> bool: + return "build-backend" in self.poetry.file.read().get("build-system", {}) + def build(self, options: BuildOptions) -> int: if not self.poetry.is_package_mode: self.io.write_error_line( @@ -121,6 +124,12 @@ def build(self, options: BuildOptions) -> int: ) return 1 + if not self._has_build_backend_defined(): + self.io.write_error_line( + "No build backend defined. Please define one in pyproject.toml." + ) + return 1 + dist_dir = Path(options.output) package = self.poetry.package self.io.write_line( diff --git a/tests/console/commands/test_build.py b/tests/console/commands/test_build.py index 18b57a3bf25..8a79585f8f6 100644 --- a/tests/console/commands/test_build.py +++ b/tests/console/commands/test_build.py @@ -300,3 +300,19 @@ def test_build_handler_build_isolated( handler.build(BuildOptions(clean=True, formats=["wheel"], output="dist")) assert mock_builder.build.call_count == 1 + + +@pytest.mark.parametrize("project", ["no_build_system", "no_build_backend"]) +def test_build_handler_raise_on_no_build_system( + project: str, + fixture_dir: FixtureDirGetter, + command_tester_factory: CommandTesterFactory, +) -> None: + poetry = Factory().create_poetry(fixture_dir(f"build_systems/{project}")) + tester = command_tester_factory("build", poetry) + + assert tester.execute() == 1 + assert ( + tester.io.fetch_error() + == "No build backend defined. Please define one in pyproject.toml.\n" + ) diff --git a/tests/fixtures/build_systems/no_build_backend/README.md b/tests/fixtures/build_systems/no_build_backend/README.md new file mode 100644 index 00000000000..f7fe15470f9 --- /dev/null +++ b/tests/fixtures/build_systems/no_build_backend/README.md @@ -0,0 +1,2 @@ +My Package +========== diff --git a/tests/fixtures/build_systems/no_build_backend/pyproject.toml b/tests/fixtures/build_systems/no_build_backend/pyproject.toml new file mode 100644 index 00000000000..ce7a0d64c46 --- /dev/null +++ b/tests/fixtures/build_systems/no_build_backend/pyproject.toml @@ -0,0 +1,14 @@ +[project] +name = "simple-project" +version = "1.2.3" +description = "Some description." +authors = [ + { name = "Poetry Contributors", email = "no-reply@python-poetry.org" } +] +license = { text = "MIT" } +readme = "README.md" +keywords = ["packaging", "dependency", "poetry"] +requires-python = ">=3.4" + +[build-system] +requires = ["poetry-core>=1.1.0a7"] diff --git a/tests/fixtures/build_systems/no_build_backend/simple_project/__init__.py b/tests/fixtures/build_systems/no_build_backend/simple_project/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/fixtures/build_systems/no_build_system/README.md b/tests/fixtures/build_systems/no_build_system/README.md new file mode 100644 index 00000000000..f7fe15470f9 --- /dev/null +++ b/tests/fixtures/build_systems/no_build_system/README.md @@ -0,0 +1,2 @@ +My Package +========== diff --git a/tests/fixtures/build_systems/no_build_system/pyproject.toml b/tests/fixtures/build_systems/no_build_system/pyproject.toml new file mode 100644 index 00000000000..6c3dd468b9f --- /dev/null +++ b/tests/fixtures/build_systems/no_build_system/pyproject.toml @@ -0,0 +1,11 @@ +[project] +name = "simple-project" +version = "1.2.3" +description = "Some description." +authors = [ + { name = "Poetry Contributors", email = "no-reply@python-poetry.org" } +] +license = { text = "MIT" } +readme = "README.md" +keywords = ["packaging", "dependency", "poetry"] +requires-python = ">=3.4" diff --git a/tests/fixtures/build_systems/no_build_system/simple_project/__init__.py b/tests/fixtures/build_systems/no_build_system/simple_project/__init__.py new file mode 100644 index 00000000000..e69de29bb2d