Skip to content

Commit cd7c9ce

Browse files
committed
add support for PEP 621: consider relevant project sections when calculating the content hash for the lock file (#9135)
1 parent d68e310 commit cd7c9ce

File tree

2 files changed

+32
-6
lines changed

2 files changed

+32
-6
lines changed

src/poetry/packages/locker.py

+31-5
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@ class Locker:
5959
"dev-dependencies",
6060
]
6161
_relevant_keys: ClassVar[list[str]] = [*_legacy_keys, "group"]
62+
_relevant_project_keys: ClassVar[list[str]] = [
63+
"requires-python",
64+
"dependencies",
65+
"optional-dependencies",
66+
]
6267

6368
def __init__(self, lock: Path, pyproject_data: dict[str, Any]) -> None:
6469
self._lock = lock
@@ -324,16 +329,37 @@ def _get_content_hash(self) -> str:
324329
"""
325330
Returns the sha256 hash of the sorted content of the pyproject file.
326331
"""
327-
content = self._pyproject_data.get("tool", {}).get("poetry", {})
332+
project_content = self._pyproject_data.get("project", {})
333+
tool_poetry_content = self._pyproject_data.get("tool", {}).get("poetry", {})
328334

329-
relevant_content = {}
335+
relevant_project_content = {}
336+
for key in self._relevant_project_keys:
337+
data = project_content.get(key)
338+
if data is not None:
339+
relevant_project_content[key] = data
340+
341+
relevant_poetry_content = {}
330342
for key in self._relevant_keys:
331-
data = content.get(key)
343+
data = tool_poetry_content.get(key)
332344

333-
if data is None and key not in self._legacy_keys:
345+
if data is None and (
346+
# Special handling for legacy keys is just for backwards compatibility,
347+
# and thereby not required if there is relevant content in [project].
348+
key not in self._legacy_keys or relevant_project_content
349+
):
334350
continue
335351

336-
relevant_content[key] = data
352+
relevant_poetry_content[key] = data
353+
354+
if relevant_project_content:
355+
relevant_content = {
356+
"project": relevant_project_content,
357+
"tool": {"poetry": relevant_poetry_content},
358+
}
359+
else:
360+
# For backwards compatibility, we have to put the relevant content
361+
# of the [tool.poetry] section at top level!
362+
relevant_content = relevant_poetry_content
337363

338364
return sha256(json.dumps(relevant_content, sort_keys=True).encode()).hexdigest()
339365

tests/fixtures/up_to_date_lock/poetry.lock

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)