Skip to content

Commit 0085504

Browse files
dbIgelfrenzymadness
authored andcommitted
Implement support for poetry 2.0
1 parent 2050712 commit 0085504

File tree

4 files changed

+276
-9
lines changed

4 files changed

+276
-9
lines changed

micropipenv.py

+21-8
Original file line numberDiff line numberDiff line change
@@ -307,18 +307,31 @@ def _compute_pipfile_hash(pipfile): # type: (Dict[str, Any]) -> str
307307

308308
def _compute_poetry_hash(pyproject): # type: (MutableMapping[str, Any]) -> str
309309
"""Compute pyproject.toml hash based on poetry content."""
310-
poetry_data = pyproject["tool"]["poetry"]
311-
relevant_keys = ["dependencies", "dev-dependencies", "source", "extras"]
312-
relevant_content = {key: poetry_data.get(key) for key in relevant_keys}
310+
project_data = pyproject.get("project", {})
311+
poetry_data = pyproject.get("tool", {}).get("poetry", {})
313312

314-
# relevant_keys are the original one and they should always be in
315-
# the relevant_content even their value is None.
316-
# group is a new key since poetry 1.2 and we should include it only
313+
legacy_keys = ["dependencies", "source", "extras", "dev-dependencies"]
314+
# relevant_keys are the original concept, and they should always be in
315+
# the relevant_content even if their value is None.
316+
# group is a new key since poetry 1.2, and we must include it only
317317
# if pyproject.toml contains it. Including it always would break
318318
# backward compatibility.
319319
# See: https://github.com/python-poetry/poetry/blob/4a07b5e0243bb8879dd6725cb901d9fa0f6eb182/src/poetry/packages/locker.py#L278-L293
320-
if "group" in poetry_data:
321-
relevant_content["group"] = poetry_data.get("group")
320+
relevant_keys = [*legacy_keys, "group"]
321+
relevant_project_keys = ["requires-python", "dependencies", "optional-dependencies"]
322+
323+
relevant_project_content = {k: project_data.get(k) for k in relevant_project_keys if project_data.get(k)}
324+
relevant_poetry_content = {k: poetry_data.get(k) for k in relevant_keys if poetry_data.get(k) or (k in legacy_keys and not relevant_project_content)}
325+
326+
relevant_content = relevant_poetry_content
327+
if relevant_project_content:
328+
# project is a new concept since poetry 2.0 and must be used if new format is used
329+
# Always using the new format would break backward compatibility.
330+
# See: https://github.com/python-poetry/poetry/blob/6f6fd7012983a2e749c6030c1f5f155fd4397058/src/poetry/packages/locker.py#L266-L302
331+
relevant_content = {
332+
"project": relevant_project_content,
333+
"tool": {"poetry": relevant_content},
334+
}
322335

323336
return hashlib.sha256(json.dumps(relevant_content, sort_keys=True).encode()).hexdigest()
324337

tests/data/verify/poetry_project/poetry.lock

+234
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
[project]
2+
name = "micropipenv-test"
3+
version = "0.1.0"
4+
description = ""
5+
authors = [
6+
{ name = "Fridolin Pokorny", "email" = "[email protected]" }
7+
]
8+
dynamic = [ "dependencies" ]
9+
requires-python = "^3.7"
10+
11+
[tool.poetry.dependencies]
12+
python = "^3.7"
13+
daiquiri = "2.0.0"
14+
15+
[tool.poetry.group.dev.dependencies]
16+
pytest = "^6"
17+
18+
[build-system]
19+
requires = ["poetry>=0.12"]
20+
build-backend = "poetry.masonry.api"

tests/test_micropipenv.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1300,7 +1300,7 @@ def test_get_package_entry_str(info, expected):
13001300
assert result == expected
13011301

13021302

1303-
@pytest.mark.parametrize("path", ["poetry", "poetry_group"])
1303+
@pytest.mark.parametrize("path", ["poetry", "poetry_group", "poetry_project"])
13041304
def test_poetry_lockfile_verify(path):
13051305
"""Test verifying poetry lockfile."""
13061306
with cwd(os.path.join(_DATA_DIR, "verify", path)):

0 commit comments

Comments
 (0)