diff --git a/src/poetry/console/commands/init.py b/src/poetry/console/commands/init.py index 48ea6e206ed..a0921fdd1eb 100644 --- a/src/poetry/console/commands/init.py +++ b/src/poetry/console/commands/init.py @@ -382,7 +382,7 @@ def _determine_requirements( "(or leave blank to use the latest version):" ) question.set_max_attempts(3) - question.set_validator(lambda x: (x or "").strip() or None) + question.set_validator(self._validate_version_constraint) package_constraint = self.ask(question) @@ -521,6 +521,21 @@ def _validate_package(package: str | None) -> str | None: return package + @staticmethod + def _validate_version_constraint(constraint: str | None) -> str | None: + from poetry.core.constraints.version import parse_constraint + + constraint = (constraint or "").strip() + if not constraint: + return None + + try: + parse_constraint(constraint) + except ValueError as e: + raise ValueError(f"Invalid version constraint: {constraint}") from e + + return constraint + def _get_pool(self) -> RepositoryPool: from poetry.config.config import Config from poetry.repositories import RepositoryPool diff --git a/tests/console/commands/test_init.py b/tests/console/commands/test_init.py index 7585740edec..935f6d1d9cb 100644 --- a/tests/console/commands/test_init.py +++ b/tests/console/commands/test_init.py @@ -1016,6 +1016,38 @@ def test_validate_package_invalid(name: str) -> None: assert InitCommand._validate_package(name) +@pytest.mark.parametrize( + ("constraint", "expected"), + [ + ("^1.0", "^1.0"), + (" ^1.0 ", "^1.0"), + ("==1.2.3", "==1.2.3"), + (">=1,<2", ">=1,<2"), + ("", None), + (None, None), + (" ", None), + ], +) +def test_validate_version_constraint_accepts_valid_inputs( + constraint: str | None, expected: str | None +) -> None: + assert InitCommand._validate_version_constraint(constraint) == expected + + +@pytest.mark.parametrize( + "invalid", + [ + "latest", + "isort", + "==1.,", + "not-a-version", + ], +) +def test_validate_version_constraint_rejects_invalid_inputs(invalid: str) -> None: + with pytest.raises(ValueError, match="Invalid version constraint"): + InitCommand._validate_version_constraint(invalid) + + @pytest.mark.parametrize( "author", [