|
16 | 16 | from packaging.utils import canonicalize_name |
17 | 17 |
|
18 | 18 | from poetry.core.packages.dependency import Dependency |
| 19 | +from poetry.core.packages.dependency_group import DependencyGroup |
19 | 20 | from poetry.core.utils.helpers import combine_unicode |
20 | 21 | from poetry.core.utils.helpers import readme_content_type |
21 | 22 |
|
22 | 23 |
|
23 | 24 | if TYPE_CHECKING: |
24 | 25 | from packaging.utils import NormalizedName |
25 | 26 |
|
26 | | - from poetry.core.packages.dependency_group import DependencyGroup |
27 | 27 | from poetry.core.packages.project_package import ProjectPackage |
28 | 28 | from poetry.core.poetry import Poetry |
29 | 29 | 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 |
@@ -422,68 +422,9 @@ def _configure_package_dependencies( |
422 | 422 | ) |
423 | 423 |
|
424 | 424 | if with_groups: |
425 | | - tool_poetry_groups = tool_poetry.get("group", {}) |
426 | | - tool_poetry_groups_normalized = { |
427 | | - canonicalize_name(name): config |
428 | | - for name, config in tool_poetry_groups.items() |
429 | | - } |
430 | | - # create groups from the dependency-groups section considering |
431 | | - # additional information from the corresponding tool.poetry.group section |
432 | | - pep739_include_groups = {} |
433 | | - for group_name, dependencies in dependency_groups.items(): |
434 | | - poetry_group_config = tool_poetry_groups_normalized.get( |
435 | | - canonicalize_name(group_name), {} |
436 | | - ) |
437 | | - group = DependencyGroup( |
438 | | - name=group_name, |
439 | | - optional=poetry_group_config.get("optional", False), |
440 | | - ) |
441 | | - package.add_dependency_group(group) |
442 | | - included_groups = cls._add_package_pep735_group_dependencies( |
443 | | - package=package, |
444 | | - group=group, |
445 | | - dependencies=dependencies, |
446 | | - ) |
447 | | - pep739_include_groups[group_name] = included_groups |
448 | | - # create groups from the tool.poetry.group section |
449 | | - # with no corresponding entry in dependency-groups |
450 | | - # and add dependency information for existing groups |
451 | | - poetry_include_groups = {} |
452 | | - for group_name, group_config in tool_poetry_groups.items(): |
453 | | - poetry_include_groups[group_name] = group_config.get( |
454 | | - "include-groups", [] |
455 | | - ) |
456 | | - if package.has_dependency_group(group_name): |
457 | | - group = package.dependency_group(group_name) |
458 | | - else: |
459 | | - group = DependencyGroup( |
460 | | - name=group_name, |
461 | | - optional=group_config.get("optional", False), |
462 | | - ) |
463 | | - package.add_dependency_group(group) |
464 | | - cls._add_package_poetry_group_dependencies( |
465 | | - package=package, |
466 | | - group=group, |
467 | | - dependencies=group_config.get("dependencies", {}), |
468 | | - ) |
469 | | - |
470 | | - for group_name, include_groups in chain( |
471 | | - pep739_include_groups.items(), poetry_include_groups.items() |
472 | | - ): |
473 | | - if include_groups: |
474 | | - current_group = package.dependency_group(group_name) |
475 | | - for name in include_groups: |
476 | | - try: |
477 | | - # `name` isn't normalized, |
478 | | - # but `.dependency_group()` handles that. |
479 | | - group_to_include = package.dependency_group(name) |
480 | | - except ValueError as e: |
481 | | - raise ValueError( |
482 | | - f"Group '{group_name}' includes group '{name}'" |
483 | | - " which is not defined." |
484 | | - ) from e |
485 | | - |
486 | | - current_group.include_dependency_group(group_to_include) |
| 425 | + cls._configure_package_dependency_groups( |
| 426 | + package, tool_poetry, dependency_groups |
| 427 | + ) |
487 | 428 |
|
488 | 429 | if with_groups and "dev-dependencies" in tool_poetry: |
489 | 430 | cls._add_package_poetry_group_dependencies( |
@@ -512,6 +453,74 @@ def _configure_package_dependencies( |
512 | 453 |
|
513 | 454 | package.extras = package_extras |
514 | 455 |
|
| 456 | + @classmethod |
| 457 | + def _configure_package_dependency_groups( |
| 458 | + cls, |
| 459 | + package: ProjectPackage, |
| 460 | + tool_poetry: dict[str, Any], |
| 461 | + dependency_groups: dict[str, list[str | dict[str, str]]], |
| 462 | + ) -> None: |
| 463 | + tool_poetry_groups = tool_poetry.get("group", {}) |
| 464 | + tool_poetry_groups_normalized = { |
| 465 | + canonicalize_name(name): config |
| 466 | + for name, config in tool_poetry_groups.items() |
| 467 | + } |
| 468 | + # create groups from the dependency-groups section considering |
| 469 | + # additional information from the corresponding tool.poetry.group section |
| 470 | + pep739_include_groups = {} |
| 471 | + for group_name, dependencies in dependency_groups.items(): |
| 472 | + poetry_group_config = tool_poetry_groups_normalized.get( |
| 473 | + canonicalize_name(group_name), {} |
| 474 | + ) |
| 475 | + group = DependencyGroup( |
| 476 | + name=group_name, |
| 477 | + optional=poetry_group_config.get("optional", False), |
| 478 | + ) |
| 479 | + package.add_dependency_group(group) |
| 480 | + included_groups = cls._add_package_pep735_group_dependencies( |
| 481 | + package=package, |
| 482 | + group=group, |
| 483 | + dependencies=dependencies, |
| 484 | + ) |
| 485 | + pep739_include_groups[group_name] = included_groups |
| 486 | + # create groups from the tool.poetry.group section |
| 487 | + # with no corresponding entry in dependency-groups |
| 488 | + # and add dependency information for existing groups |
| 489 | + poetry_include_groups = {} |
| 490 | + for group_name, group_config in tool_poetry_groups.items(): |
| 491 | + poetry_include_groups[group_name] = group_config.get("include-groups", []) |
| 492 | + if package.has_dependency_group(group_name): |
| 493 | + group = package.dependency_group(group_name) |
| 494 | + else: |
| 495 | + group = DependencyGroup( |
| 496 | + name=group_name, |
| 497 | + optional=group_config.get("optional", False), |
| 498 | + ) |
| 499 | + package.add_dependency_group(group) |
| 500 | + cls._add_package_poetry_group_dependencies( |
| 501 | + package=package, |
| 502 | + group=group, |
| 503 | + dependencies=group_config.get("dependencies", {}), |
| 504 | + ) |
| 505 | + |
| 506 | + for group_name, include_groups in chain( |
| 507 | + pep739_include_groups.items(), poetry_include_groups.items() |
| 508 | + ): |
| 509 | + if include_groups: |
| 510 | + current_group = package.dependency_group(group_name) |
| 511 | + for name in include_groups: |
| 512 | + try: |
| 513 | + # `name` isn't normalized, |
| 514 | + # but `.dependency_group()` handles that. |
| 515 | + group_to_include = package.dependency_group(name) |
| 516 | + except ValueError as e: |
| 517 | + raise ValueError( |
| 518 | + f"Group '{group_name}' includes group '{name}'" |
| 519 | + " which is not defined." |
| 520 | + ) from e |
| 521 | + |
| 522 | + current_group.include_dependency_group(group_to_include) |
| 523 | + |
515 | 524 | @classmethod |
516 | 525 | def _prepare_formats( |
517 | 526 | cls, |
|
0 commit comments