(
name: str,
version: str | None = None,
dependencies: list[Dependency] | None = None,
extras: dict[str, list[str]] | None = None,
merge_extras: bool = False,
)
| 539 | """ |
| 540 | |
| 541 | def create_new_package( |
| 542 | name: str, |
| 543 | version: str | None = None, |
| 544 | dependencies: list[Dependency] | None = None, |
| 545 | extras: dict[str, list[str]] | None = None, |
| 546 | merge_extras: bool = False, |
| 547 | ) -> Package: |
| 548 | version = version or "1.0" |
| 549 | package = get_package(name, version) |
| 550 | |
| 551 | package_extras: dict[NormalizedName, list[Dependency]] = {} |
| 552 | |
| 553 | for extra, extra_dependencies in (extras or {}).items(): |
| 554 | extra = canonicalize_name(extra) |
| 555 | |
| 556 | if extra not in package_extras: |
| 557 | package_extras[extra] = [] |
| 558 | |
| 559 | for extra_dependency_spec in extra_dependencies: |
| 560 | extra_dependency = Dependency.create_from_pep_508(extra_dependency_spec) |
| 561 | extra_dependency._optional = True |
| 562 | extra_dependency.marker = extra_dependency.marker.intersect( |
| 563 | parse_marker(f"extra == '{extra}'") |
| 564 | ) |
| 565 | |
| 566 | if extra_dependency.name != package.name: |
| 567 | assert extra_dependency.constraint.allows(package.version) |
| 568 | |
| 569 | # if it is not a self-referencing dependency, make sure we add it to the repo |
| 570 | try: |
| 571 | pkg = repo.package(extra_dependency.name, package.version) |
| 572 | except PackageNotFoundError: |
| 573 | pkg = get_package(extra_dependency.name, str(package.version)) |
| 574 | repo.add_package(pkg) |
| 575 | |
| 576 | extra_dependency.constraint = parse_constraint(f"^{pkg.version}") |
| 577 | |
| 578 | if merge_extras: |
| 579 | # if requirement already exists in the package, |
| 580 | # update the marker |
| 581 | for requirement in package.requires: |
| 582 | if ( |
| 583 | requirement.name == extra_dependency.name |
| 584 | and requirement.is_optional() |
| 585 | ): |
| 586 | requirement.marker = requirement.marker.union( |
| 587 | extra_dependency.marker |
| 588 | ) |
| 589 | break |
| 590 | else: |
| 591 | package.add_dependency(extra_dependency) |
| 592 | else: |
| 593 | package.add_dependency(extra_dependency) |
| 594 | |
| 595 | package_extras[extra].append(extra_dependency) |
| 596 | |
| 597 | package.extras = package_extras |
| 598 |
nothing calls this directly
no test coverage detected
searching dependent graphs…