diff --git a/src/poetry/factory.py b/src/poetry/factory.py index 2a76e1526cd..eca68ca1d92 100644 --- a/src/poetry/factory.py +++ b/src/poetry/factory.py @@ -23,6 +23,7 @@ from poetry.plugins.plugin import Plugin from poetry.plugins.plugin_manager import PluginManager from poetry.poetry import Poetry +from poetry.pyproject.toml import PyProjectTOML from poetry.toml.file import TOMLFile @@ -46,6 +47,20 @@ class Factory(BaseFactory): Factory class to create various elements needed by Poetry. """ + def _ensure_valid_poetry_version(self, cwd: Path | None) -> None: + poetry_file = self.locate(cwd) + pyproject = PyProjectTOML(path=poetry_file) + poetry_config = pyproject.data.get("tool", {}).get("poetry", {}) + + if version_str := poetry_config.get("requires-poetry"): + version_constraint = parse_constraint(version_str) + version = Version.parse(__version__) + if not version_constraint.allows(version): + raise PoetryError( + f"This project requires Poetry {version_constraint}," + f" but you are using Poetry {version}" + ) + def create_poetry( self, cwd: Path | None = None, @@ -57,16 +72,9 @@ def create_poetry( if io is None: io = NullIO() - base_poetry = super().create_poetry(cwd=cwd, with_groups=with_groups) + self._ensure_valid_poetry_version(cwd) - if version_str := base_poetry.local_config.get("requires-poetry"): - version_constraint = parse_constraint(version_str) - version = Version.parse(__version__) - if not version_constraint.allows(version): - raise PoetryError( - f"This project requires Poetry {version_constraint}," - f" but you are using Poetry {version}" - ) + base_poetry = super().create_poetry(cwd=cwd, with_groups=with_groups) poetry_file = base_poetry.pyproject_path locker = Locker(poetry_file.parent / "poetry.lock", base_poetry.pyproject.data) diff --git a/tests/fixtures/self_version_not_ok_invalid_config/pyproject.toml b/tests/fixtures/self_version_not_ok_invalid_config/pyproject.toml new file mode 100644 index 00000000000..3fcdfc4bb35 --- /dev/null +++ b/tests/fixtures/self_version_not_ok_invalid_config/pyproject.toml @@ -0,0 +1,7 @@ +[tool.poetry] +package-mode = false +requires-poetry = "<1.2" +invalid_option = 42 + +[tool.poetry.dependencies] +python = "^3.8" diff --git a/tests/test_factory.py b/tests/test_factory.py index 68cdbb3a71e..38b22c0f26e 100644 --- a/tests/test_factory.py +++ b/tests/test_factory.py @@ -256,6 +256,17 @@ def test_create_poetry_version_not_ok(fixture_dir: FixtureDirGetter) -> None: ) +def test_create_poetry_check_version_before_validation( + fixture_dir: FixtureDirGetter, +) -> None: + with pytest.raises(PoetryError) as e: + Factory().create_poetry(fixture_dir("self_version_not_ok_invalid_config")) + assert ( + str(e.value) + == f"This project requires Poetry <1.2, but you are using Poetry {__version__}" + ) + + @pytest.mark.parametrize( "project", ("with_primary_source_implicit", "with_primary_source_explicit"),