Relate a Package URL with a range of affected versions and fixed versions. The Package URL must *not* have a version. AffectedPackage must contain either ``affected_version_range`` or ``fixed_version_range`` or ``introduced_by_commits`` or ``fixed_by_commits``.
| 450 | @functools.total_ordering |
| 451 | @dataclasses.dataclass(eq=True) |
| 452 | class AffectedPackageV2: |
| 453 | """ |
| 454 | Relate a Package URL with a range of affected versions and fixed versions. |
| 455 | The Package URL must *not* have a version. |
| 456 | AffectedPackage must contain either ``affected_version_range`` or ``fixed_version_range`` or ``introduced_by_commits`` or ``fixed_by_commits``. |
| 457 | """ |
| 458 | |
| 459 | package: PackageURL |
| 460 | affected_version_range: Optional[VersionRange] = None |
| 461 | fixed_version_range: Optional[VersionRange] = None |
| 462 | introduced_by_commit_patches: List[PackageCommitPatchData] = dataclasses.field( |
| 463 | default_factory=list |
| 464 | ) |
| 465 | fixed_by_commit_patches: List[PackageCommitPatchData] = dataclasses.field(default_factory=list) |
| 466 | |
| 467 | def __post_init__(self): |
| 468 | if self.package.version: |
| 469 | raise ValueError(f"Affected Package URL {self.package!r} cannot have a version.") |
| 470 | |
| 471 | if not ( |
| 472 | self.affected_version_range |
| 473 | or self.fixed_version_range |
| 474 | or self.introduced_by_commit_patches |
| 475 | or self.fixed_by_commit_patches |
| 476 | ): |
| 477 | raise ValueError( |
| 478 | f"Affected package {self.package!r} must have either a fixed version range, " |
| 479 | "an affected version range, introduced commit patches, or fixed commit patches." |
| 480 | ) |
| 481 | |
| 482 | if self.affected_version_range is not None and not isinstance( |
| 483 | self.affected_version_range, VersionRange |
| 484 | ): |
| 485 | raise TypeError( |
| 486 | f"affected_version_range must be VersionRange or None, got {type(self.affected_version_range)!r}" |
| 487 | ) |
| 488 | |
| 489 | if self.fixed_version_range is not None and not isinstance( |
| 490 | self.fixed_version_range, VersionRange |
| 491 | ): |
| 492 | raise TypeError( |
| 493 | f"fixed_version_range must be VersionRange or None, got {type(self.fixed_version_range)!r}" |
| 494 | ) |
| 495 | |
| 496 | if not isinstance(self.introduced_by_commit_patches, list): |
| 497 | raise TypeError( |
| 498 | f"introduced_by_commit_patches must be a list, got {type(self.introduced_by_commit_patches)!r}" |
| 499 | ) |
| 500 | |
| 501 | if not isinstance(self.fixed_by_commit_patches, list): |
| 502 | raise TypeError( |
| 503 | f"fixed_by_commit_patches must be a list, got {type(self.fixed_by_commit_patches)!r}" |
| 504 | ) |
| 505 | |
| 506 | for item in self.introduced_by_commit_patches: |
| 507 | if not isinstance(item, PackageCommitPatchData): |
| 508 | raise TypeError( |
| 509 | f"introduced_by_commit_patches items must be PackageCommitPatchData, got {type(item)!r}" |
no outgoing calls