Return a tuple with all attributes of AffectedPackage as a set for all values in the given iterable of AffectedPackage This is useful where an iterable of AffectedPackage needs to be converted into one tuple of structure similar to AffectedPackage but with m
(
cls, affected_packages: Iterable
)
| 361 | |
| 362 | @classmethod |
| 363 | def merge( |
| 364 | cls, affected_packages: Iterable |
| 365 | ) -> Tuple[PackageURL, List[VersionRange], List[Version]]: |
| 366 | """ |
| 367 | Return a tuple with all attributes of AffectedPackage as a set |
| 368 | for all values in the given iterable of AffectedPackage |
| 369 | |
| 370 | This is useful where an iterable of AffectedPackage needs to be |
| 371 | converted into one tuple of structure similar to AffectedPackage |
| 372 | but with multiple fixed_versions, ie |
| 373 | package: PackageURL |
| 374 | affected_version_range: set(VersionRange) |
| 375 | fixed_versions: set(Version) |
| 376 | """ |
| 377 | affected_packages = list(affected_packages) |
| 378 | if not affected_packages: |
| 379 | raise NoAffectedPackages("No affected packages found") |
| 380 | affected_version_ranges = list() |
| 381 | fixed_versions = list() |
| 382 | purls = set() |
| 383 | for pkg in affected_packages: |
| 384 | if pkg.affected_version_range: |
| 385 | if pkg.affected_version_range not in affected_version_ranges: |
| 386 | affected_version_ranges.append(pkg.affected_version_range) |
| 387 | if pkg.fixed_version: |
| 388 | if pkg.fixed_version not in fixed_versions: |
| 389 | fixed_versions.append(pkg.fixed_version) |
| 390 | purls.add(pkg.package) |
| 391 | if len(purls) > 1: |
| 392 | raise UnMergeablePackageError("Cannot merge with different purls", purls) |
| 393 | return purls.pop(), list(affected_version_ranges), sorted(fixed_versions) |
| 394 | |
| 395 | def to_dict(self): |
| 396 | """ |