|
15 | 15 | from packaging.utils import canonicalize_name |
16 | 16 |
|
17 | 17 | from poetry.core.packages.dependency import Dependency |
| 18 | +from poetry.core.packages.dependency_group import DependencyGroup |
18 | 19 | from poetry.core.utils.helpers import combine_unicode |
19 | 20 | from poetry.core.utils.helpers import readme_content_type |
20 | 21 |
|
21 | 22 |
|
22 | 23 | if TYPE_CHECKING: |
23 | 24 | from packaging.utils import NormalizedName |
24 | 25 |
|
25 | | - from poetry.core.packages.dependency_group import DependencyGroup |
26 | 26 | from poetry.core.packages.project_package import ProjectPackage |
27 | 27 | from poetry.core.poetry import Poetry |
28 | 28 | from poetry.core.pyproject.toml import PyProjectTOML |
@@ -103,8 +103,8 @@ def _add_package_pep735_group_dependencies( |
103 | 103 | groups=[group.pretty_name], |
104 | 104 | ) |
105 | 105 | group.add_dependency(dep) |
106 | | - else: |
107 | | - group_includes.append(constraint["include-group"]) |
| 106 | + elif include := constraint.get("include-group"): |
| 107 | + group_includes.append(include) |
108 | 108 | return group_includes |
109 | 109 |
|
110 | 110 | @classmethod |
@@ -367,68 +367,9 @@ def _configure_package_dependencies( |
367 | 367 | ) |
368 | 368 |
|
369 | 369 | if with_groups: |
370 | | - tool_poetry_groups = tool_poetry.get("group", {}) |
371 | | - tool_poetry_groups_normalized = { |
372 | | - canonicalize_name(name): config |
373 | | - for name, config in tool_poetry_groups.items() |
374 | | - } |
375 | | - # create groups from the dependency-groups section considering |
376 | | - # additional information from the corresponding tool.poetry.group section |
377 | | - pep739_include_groups = {} |
378 | | - for group_name, dependencies in dependency_groups.items(): |
379 | | - poetry_group_config = tool_poetry_groups_normalized.get( |
380 | | - canonicalize_name(group_name), {} |
381 | | - ) |
382 | | - group = DependencyGroup( |
383 | | - name=group_name, |
384 | | - optional=poetry_group_config.get("optional", False), |
385 | | - ) |
386 | | - package.add_dependency_group(group) |
387 | | - included_groups = cls._add_package_pep735_group_dependencies( |
388 | | - package=package, |
389 | | - group=group, |
390 | | - dependencies=dependencies, |
391 | | - ) |
392 | | - pep739_include_groups[group_name] = included_groups |
393 | | - # create groups from the tool.poetry.group section |
394 | | - # with no corresponding entry in dependency-groups |
395 | | - # and add dependency information for existing groups |
396 | | - poetry_include_groups = {} |
397 | | - for group_name, group_config in tool_poetry_groups.items(): |
398 | | - poetry_include_groups[group_name] = group_config.get( |
399 | | - "include-groups", [] |
400 | | - ) |
401 | | - if package.has_dependency_group(group_name): |
402 | | - group = package.dependency_group(group_name) |
403 | | - else: |
404 | | - group = DependencyGroup( |
405 | | - name=group_name, |
406 | | - optional=group_config.get("optional", False), |
407 | | - ) |
408 | | - package.add_dependency_group(group) |
409 | | - cls._add_package_poetry_group_dependencies( |
410 | | - package=package, |
411 | | - group=group, |
412 | | - dependencies=group_config.get("dependencies", {}), |
413 | | - ) |
414 | | - |
415 | | - for group_name, include_groups in chain( |
416 | | - pep739_include_groups.items(), poetry_include_groups.items() |
417 | | - ): |
418 | | - if include_groups: |
419 | | - current_group = package.dependency_group(group_name) |
420 | | - for name in include_groups: |
421 | | - try: |
422 | | - # `name` isn't normalized, |
423 | | - # but `.dependency_group()` handles that. |
424 | | - group_to_include = package.dependency_group(name) |
425 | | - except ValueError as e: |
426 | | - raise ValueError( |
427 | | - f"Group '{group_name}' includes group '{name}'" |
428 | | - " which is not defined." |
429 | | - ) from e |
430 | | - |
431 | | - current_group.include_dependency_group(group_to_include) |
| 370 | + cls._configure_package_dependency_groups( |
| 371 | + package, tool_poetry, dependency_groups |
| 372 | + ) |
432 | 373 |
|
433 | 374 | if with_groups and "dev-dependencies" in tool_poetry: |
434 | 375 | cls._add_package_poetry_group_dependencies( |
@@ -457,6 +398,74 @@ def _configure_package_dependencies( |
457 | 398 |
|
458 | 399 | package.extras = package_extras |
459 | 400 |
|
| 401 | + @classmethod |
| 402 | + def _configure_package_dependency_groups( |
| 403 | + cls, |
| 404 | + package: ProjectPackage, |
| 405 | + tool_poetry: dict[str, Any], |
| 406 | + dependency_groups: dict[str, list[str | dict[str, str]]], |
| 407 | + ) -> None: |
| 408 | + tool_poetry_groups = tool_poetry.get("group", {}) |
| 409 | + tool_poetry_groups_normalized = { |
| 410 | + canonicalize_name(name): config |
| 411 | + for name, config in tool_poetry_groups.items() |
| 412 | + } |
| 413 | + # create groups from the dependency-groups section considering |
| 414 | + # additional information from the corresponding tool.poetry.group section |
| 415 | + pep739_include_groups = {} |
| 416 | + for group_name, dependencies in dependency_groups.items(): |
| 417 | + poetry_group_config = tool_poetry_groups_normalized.get( |
| 418 | + canonicalize_name(group_name), {} |
| 419 | + ) |
| 420 | + group = DependencyGroup( |
| 421 | + name=group_name, |
| 422 | + optional=poetry_group_config.get("optional", False), |
| 423 | + ) |
| 424 | + package.add_dependency_group(group) |
| 425 | + included_groups = cls._add_package_pep735_group_dependencies( |
| 426 | + package=package, |
| 427 | + group=group, |
| 428 | + dependencies=dependencies, |
| 429 | + ) |
| 430 | + pep739_include_groups[group_name] = included_groups |
| 431 | + # create groups from the tool.poetry.group section |
| 432 | + # with no corresponding entry in dependency-groups |
| 433 | + # and add dependency information for existing groups |
| 434 | + poetry_include_groups = {} |
| 435 | + for group_name, group_config in tool_poetry_groups.items(): |
| 436 | + poetry_include_groups[group_name] = group_config.get("include-groups", []) |
| 437 | + if package.has_dependency_group(group_name): |
| 438 | + group = package.dependency_group(group_name) |
| 439 | + else: |
| 440 | + group = DependencyGroup( |
| 441 | + name=group_name, |
| 442 | + optional=group_config.get("optional", False), |
| 443 | + ) |
| 444 | + package.add_dependency_group(group) |
| 445 | + cls._add_package_poetry_group_dependencies( |
| 446 | + package=package, |
| 447 | + group=group, |
| 448 | + dependencies=group_config.get("dependencies", {}), |
| 449 | + ) |
| 450 | + |
| 451 | + for group_name, include_groups in chain( |
| 452 | + pep739_include_groups.items(), poetry_include_groups.items() |
| 453 | + ): |
| 454 | + if include_groups: |
| 455 | + current_group = package.dependency_group(group_name) |
| 456 | + for name in include_groups: |
| 457 | + try: |
| 458 | + # `name` isn't normalized, |
| 459 | + # but `.dependency_group()` handles that. |
| 460 | + group_to_include = package.dependency_group(name) |
| 461 | + except ValueError as e: |
| 462 | + raise ValueError( |
| 463 | + f"Group '{group_name}' includes group '{name}'" |
| 464 | + " which is not defined." |
| 465 | + ) from e |
| 466 | + |
| 467 | + current_group.include_dependency_group(group_to_include) |
| 468 | + |
460 | 469 | @classmethod |
461 | 470 | def _prepare_formats( |
462 | 471 | cls, |
|
0 commit comments