This data class expresses the contract between data sources and the import runner.
| 600 | |
| 601 | @dataclasses.dataclass(order=True) |
| 602 | class AdvisoryData: |
| 603 | """ |
| 604 | This data class expresses the contract between data sources and the import runner. |
| 605 | """ |
| 606 | |
| 607 | aliases: List[str] = dataclasses.field(default_factory=list) |
| 608 | summary: Optional[str] = "" |
| 609 | affected_packages: List[AffectedPackage] = dataclasses.field(default_factory=list) |
| 610 | references: List[Reference] = dataclasses.field(default_factory=list) |
| 611 | date_published: Optional[datetime.datetime] = None |
| 612 | weaknesses: List[int] = dataclasses.field(default_factory=list) |
| 613 | url: Optional[str] = None |
| 614 | |
| 615 | def __post_init__(self): |
| 616 | if self.summary: |
| 617 | self.summary = clean_summary(self.summary) |
| 618 | |
| 619 | def to_dict(self): |
| 620 | return { |
| 621 | "aliases": self.aliases, |
| 622 | "summary": self.summary, |
| 623 | "affected_packages": [pkg.to_dict() for pkg in self.affected_packages], |
| 624 | "references": [ref.to_dict() for ref in self.references], |
| 625 | "date_published": self.date_published.isoformat() if self.date_published else None, |
| 626 | "weaknesses": self.weaknesses, |
| 627 | "url": self.url if self.url else "", |
| 628 | } |
| 629 | |
| 630 | @classmethod |
| 631 | def from_dict(cls, advisory_data): |
| 632 | date_published = advisory_data["date_published"] |
| 633 | transformed = { |
| 634 | "aliases": advisory_data["aliases"], |
| 635 | "summary": advisory_data["summary"], |
| 636 | "affected_packages": [ |
| 637 | AffectedPackage.from_dict(pkg) |
| 638 | for pkg in advisory_data["affected_packages"] |
| 639 | if pkg is not None |
| 640 | ], |
| 641 | "references": [Reference.from_dict(ref) for ref in advisory_data["references"]], |
| 642 | "date_published": ( |
| 643 | datetime.datetime.fromisoformat(date_published) if date_published else None |
| 644 | ), |
| 645 | "weaknesses": advisory_data["weaknesses"], |
| 646 | "url": advisory_data.get("url") or None, |
| 647 | } |
| 648 | return cls(**transformed) |
| 649 | |
| 650 | |
| 651 | @dataclasses.dataclass(order=True) |
no outgoing calls