1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
from __future__ import annotations
import logging
from datetime import date
from typing import ClassVar
from sec_certs.sample.cc import CCCertificate
from sec_certs.serialization.json import ComplexSerializableType
from sec_certs.utils import helpers
logger = logging.getLogger(__name__)
class CCMaintenanceUpdate(CCCertificate, ComplexSerializableType):
pandas_columns: ClassVar[list[str]] = [
"dgst",
"name",
"report_link",
"st_link",
"related_cert_digest",
"maintenance_date",
]
def __init__(
self,
name: str,
report_link: str,
st_link: str,
state: CCCertificate.InternalState | None,
pdf_data: CCCertificate.PdfData | None,
heuristics: CCCertificate.Heuristics | None,
related_cert_digest: str,
maintenance_date: date,
):
super().__init__(
"",
"",
name,
"",
"",
"",
None,
None,
report_link,
st_link,
"",
"",
set(),
set(),
state,
pdf_data,
heuristics,
)
self.related_cert_digest = related_cert_digest
self.maintenance_date = maintenance_date
@property
def serialized_attributes(self) -> list[str]:
return ["dgst"] + list(self.__class__.__init__.__code__.co_varnames)[1:]
@property
def dgst(self) -> str:
if not self.name:
raise RuntimeError("MaintenanceUpdate digest can't be computed, because name of update is missing.")
return "cert_" + self.related_cert_digest + "_update_" + helpers.get_first_16_bytes_sha256(self.name)
@property
def pandas_tuple(self) -> tuple:
return tuple([getattr(self, x) for x in CCMaintenanceUpdate.pandas_columns])
@classmethod
def from_dict(cls, dct: dict) -> CCMaintenanceUpdate:
dct.pop("dgst")
return cls(*(tuple(dct.values())))
@classmethod
def get_updates_from_cc_cert(cls, cert: CCCertificate) -> list[CCMaintenanceUpdate]:
if cert.maintenance_updates is None:
raise RuntimeError("Dataset was probably not built correctly - this should not be happening.")
return [
cls(
x.maintenance_title,
x.maintenance_report_link,
x.maintenance_st_link,
None,
None,
None,
cert.dgst,
x.maintenance_date,
)
for x in cert.maintenance_updates
if (
x.maintenance_title is not None
and x.maintenance_report_link is not None
and x.maintenance_st_link is not None
and x.maintenance_date is not None
)
]
|