@@ -307,18 +307,31 @@ def _compute_pipfile_hash(pipfile): # type: (Dict[str, Any]) -> str
307
307
308
308
def _compute_poetry_hash (pyproject ): # type: (MutableMapping[str, Any]) -> str
309
309
"""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" , {})
313
312
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
317
317
# if pyproject.toml contains it. Including it always would break
318
318
# backward compatibility.
319
319
# 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
+ }
322
335
323
336
return hashlib .sha256 (json .dumps (relevant_content , sort_keys = True ).encode ()).hexdigest ()
324
337
0 commit comments