Skip to content

Commit a63befe

Browse files
dbIgelfrenzymadness
authored andcommitted
Update poetry 2 support with suggested changes
1 parent 0085504 commit a63befe

File tree

4 files changed

+13
-7
lines changed

4 files changed

+13
-7
lines changed

micropipenv.py

+12-6
Original file line numberDiff line numberDiff line change
@@ -310,22 +310,28 @@ def _compute_poetry_hash(pyproject): # type: (MutableMapping[str, Any]) -> str
310310
project_data = pyproject.get("project", {})
311311
poetry_data = pyproject.get("tool", {}).get("poetry", {})
312312

313+
# legacy_keys are the original (pre poetry 2) concept, and should be in
314+
# the relevant_content even if their value is None as long as it is not a poetry 2 config.
313315
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
316+
# group is a new key since poetry 1.2, and must be included
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
320320
relevant_keys = [*legacy_keys, "group"]
321321
relevant_project_keys = ["requires-python", "dependencies", "optional-dependencies"]
322322

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)}
323+
relevant_project_content = {k: project_data[k] for k in relevant_project_keys if project_data.get(k)}
324+
relevant_poetry_content = {}
325+
for key in relevant_keys:
326+
value = poetry_data.get(key)
327+
# Set legacy keys as None for backwards compatibility to older poetry configs
328+
if not value and (key not in legacy_keys or relevant_project_content):
329+
continue
330+
relevant_poetry_content[key] = value
325331

326332
relevant_content = relevant_poetry_content
327333
if relevant_project_content:
328-
# project is a new concept since poetry 2.0 and must be used if new format is used
334+
# project is introduced as the new format in poetry 2.0 and must be used when configured.
329335
# Always using the new format would break backward compatibility.
330336
# See: https://github.com/python-poetry/poetry/blob/6f6fd7012983a2e749c6030c1f5f155fd4397058/src/poetry/packages/locker.py#L266-L302
331337
relevant_content = {

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", "poetry_project"])
1303+
@pytest.mark.parametrize("path", ["poetry", "poetry_group", "poetry_2_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)