Return an AffectedPackage object from dict generated by self.to_dict
(cls, affected_pkg: dict)
| 551 | |
| 552 | @classmethod |
| 553 | def from_dict(cls, affected_pkg: dict): |
| 554 | """Return an AffectedPackage object from dict generated by self.to_dict""" |
| 555 | |
| 556 | package = PackageURL(**affected_pkg["package"]) |
| 557 | affected_version_range = None |
| 558 | fixed_version_range = None |
| 559 | affected_range = affected_pkg["affected_version_range"] |
| 560 | fixed_range = affected_pkg["fixed_version_range"] |
| 561 | introduced_by_commit_patches = affected_pkg.get("introduced_by_commit_patches") or [] |
| 562 | fixed_by_commit_patches = affected_pkg.get("fixed_by_commit_patches") or [] |
| 563 | |
| 564 | try: |
| 565 | affected_version_range = ( |
| 566 | VersionRange.from_string(affected_range) if affected_range else None |
| 567 | ) |
| 568 | fixed_version_range = VersionRange.from_string(fixed_range) if fixed_range else None |
| 569 | except: |
| 570 | tb = traceback.format_exc() |
| 571 | logger.error( |
| 572 | f"Cannot create AffectedPackage with invalid or unknown range: {affected_pkg!r} with error: {tb!r}" |
| 573 | ) |
| 574 | return |
| 575 | |
| 576 | if ( |
| 577 | not fixed_version_range |
| 578 | and not affected_version_range |
| 579 | and not introduced_by_commit_patches |
| 580 | and not fixed_by_commit_patches |
| 581 | ): |
| 582 | logger.error( |
| 583 | f"Cannot create an AffectedPackage for: {affected_pkg!r}, at least one of the following must be provided: " |
| 584 | "a fixed version range, an affected version range, introduced commit patches, or fixed commit patches" |
| 585 | ) |
| 586 | return |
| 587 | |
| 588 | return cls( |
| 589 | package=package, |
| 590 | affected_version_range=affected_version_range, |
| 591 | fixed_version_range=fixed_version_range, |
| 592 | introduced_by_commit_patches=[ |
| 593 | PackageCommitPatchData.from_dict(commit) for commit in introduced_by_commit_patches |
| 594 | ], |
| 595 | fixed_by_commit_patches=[ |
| 596 | PackageCommitPatchData.from_dict(commit) for commit in fixed_by_commit_patches |
| 597 | ], |
| 598 | ) |
| 599 | |
| 600 | |
| 601 | @dataclasses.dataclass(order=True) |