diff --git a/src/poetry/console/commands/init.py b/src/poetry/console/commands/init.py index 48ea6e206ed..29919d931ab 100644 --- a/src/poetry/console/commands/init.py +++ b/src/poetry/console/commands/init.py @@ -11,6 +11,8 @@ from cleo.helpers import option from packaging.utils import canonicalize_name +from poetry.core.constraints.version import parse_constraint +from poetry.core.constraints.version.exceptions import ParseConstraintError from tomlkit import inline_table from poetry.console.commands.command import Command @@ -395,6 +397,14 @@ def _determine_requirements( f"Using version {package_constraint} for" f" {package}" ) + else: + try: + parse_constraint(package_constraint) + except ParseConstraintError: + self.line_error( + "Invalid version constraint. Please enter a valid version specifier." + ) + continue constraint["version"] = package_constraint diff --git a/tests/console/commands/test_init.py b/tests/console/commands/test_init.py index 3d12e3015c5..895c733b431 100644 --- a/tests/console/commands/test_init.py +++ b/tests/console/commands/test_init.py @@ -1215,3 +1215,38 @@ def test_init_does_not_add_readme_key_when_readme_missing( # Assert pyproject = (tmp_path / "pyproject.toml").read_text(encoding="utf-8") assert "readme =" not in pyproject + + +def test_interactive_rejects_invalid_version_constraint( + tester: CommandTester, repo: TestRepository +) -> None: + repo.add_package(get_package("pendulum", "2.0.0")) + + inputs = [ + "my-package", # Package name + "1.0.0", # Version + "Desc", # Description + "n", # Author + "MIT", # License + ">=3.8", # Python + "", # Interactive packages + "pendulum", # Search package + "0", # Select first result + "isort", # INVALID version constraint + ">=2.0.0", # VALID version constraint + "", # Stop searching for packages + "", # Interactive dev packages + "", + "\n", # Generate + ] + + tester.execute(inputs="\n".join(inputs)) + + output = tester.io.fetch_output() + error = tester.io.fetch_error() + + # Must show validation error + assert "Invalid version constraint" in error + + # Must use valid constraint + assert "pendulum (>=2.0.0" in output