Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 17 additions & 9 deletions src/poetry/factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand All @@ -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,
Expand All @@ -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)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[tool.poetry]
package-mode = false
requires-poetry = "<1.2"
invalid_option = 42

[tool.poetry.dependencies]
python = "^3.8"
11 changes: 11 additions & 0 deletions tests/test_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"),
Expand Down