From 4cbf4b610d958c0f368a33b67ad8d8d1452ea0df Mon Sep 17 00:00:00 2001 From: SarthakB11 Date: Sun, 17 May 2026 18:37:54 +0000 Subject: [PATCH] fix(init): validate version constraint in interactive prompt Resolves #8797 --- src/poetry/console/commands/init.py | 17 +++++++++++++++- tests/console/commands/test_init.py | 31 +++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/poetry/console/commands/init.py b/src/poetry/console/commands/init.py index 48ea6e206ed..ca8c87710ac 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() or None + if constraint is None: + 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..020ce0e1342 100644 --- a/tests/console/commands/test_init.py +++ b/tests/console/commands/test_init.py @@ -1217,3 +1217,34 @@ 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 + + +@pytest.mark.parametrize( + ("constraint", "expected"), + [ + ("^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)