41
41
from .bom_ref import BomRef
42
42
from .component import Component
43
43
from .contact import OrganizationalContact , OrganizationalEntity
44
+ from .definition import Definitions
44
45
from .dependency import Dependable , Dependency
45
46
from .license import License , LicenseExpression , LicenseRepository
47
+ from .lifecycle import Lifecycle , LifecycleRepository , _LifecycleRepositoryHelper
46
48
from .service import Service
47
49
from .tool import Tool , ToolRepository , _ToolRepositoryHelper
48
50
from .vulnerability import Vulnerability
@@ -70,6 +72,7 @@ def __init__(
70
72
properties : Optional [Iterable [Property ]] = None ,
71
73
timestamp : Optional [datetime ] = None ,
72
74
manufacturer : Optional [OrganizationalEntity ] = None ,
75
+ lifecycles : Optional [Iterable [Lifecycle ]] = None ,
73
76
# Deprecated as of v1.6
74
77
manufacture : Optional [OrganizationalEntity ] = None ,
75
78
) -> None :
@@ -81,6 +84,7 @@ def __init__(
81
84
self .licenses = licenses or [] # type:ignore[assignment]
82
85
self .properties = properties or [] # type:ignore[assignment]
83
86
self .manufacturer = manufacturer
87
+ self .lifecycles = lifecycles or [] # type:ignore[assignment]
84
88
85
89
self .manufacture = manufacture
86
90
if manufacture :
@@ -105,16 +109,23 @@ def timestamp(self) -> datetime:
105
109
def timestamp (self , timestamp : datetime ) -> None :
106
110
self ._timestamp = timestamp
107
111
108
- # @property
109
- # ...
110
- # @serializable.view(SchemaVersion1Dot5)
111
- # @serializable.xml_sequence(2)
112
- # def lifecycles(self) -> ...:
113
- # ... # TODO since CDX1.5
114
- #
115
- # @lifecycles.setter
116
- # def lifecycles(self, ...) -> None:
117
- # ... # TODO since CDX1.5
112
+ @property
113
+ @serializable .view (SchemaVersion1Dot5 )
114
+ @serializable .view (SchemaVersion1Dot6 )
115
+ @serializable .type_mapping (_LifecycleRepositoryHelper )
116
+ @serializable .xml_sequence (2 )
117
+ def lifecycles (self ) -> LifecycleRepository :
118
+ """
119
+ An optional list of BOM lifecycle stages.
120
+
121
+ Returns:
122
+ Set of `Lifecycle`
123
+ """
124
+ return self ._lifecycles
125
+
126
+ @lifecycles .setter
127
+ def lifecycles (self , lifecycles : Iterable [Lifecycle ]) -> None :
128
+ self ._lifecycles = LifecycleRepository (lifecycles )
118
129
119
130
@property
120
131
@serializable .type_mapping (_ToolRepositoryHelper )
@@ -290,7 +301,7 @@ def __eq__(self, other: object) -> bool:
290
301
def __hash__ (self ) -> int :
291
302
return hash ((
292
303
tuple (self .authors ), self .component , tuple (self .licenses ), self .manufacture , tuple (self .properties ),
293
- self .supplier , self .timestamp , self .tools , self .manufacturer ,
304
+ tuple ( self .lifecycles ), self . supplier , self .timestamp , self .tools , self .manufacturer
294
305
))
295
306
296
307
def __repr__ (self ) -> str :
@@ -317,6 +328,7 @@ def __init__(
317
328
dependencies : Optional [Iterable [Dependency ]] = None ,
318
329
vulnerabilities : Optional [Iterable [Vulnerability ]] = None ,
319
330
properties : Optional [Iterable [Property ]] = None ,
331
+ definitions : Optional [Definitions ] = None ,
320
332
) -> None :
321
333
"""
322
334
Create a new Bom that you can manually/programmatically add data to later.
@@ -333,6 +345,7 @@ def __init__(
333
345
self .vulnerabilities = vulnerabilities or [] # type:ignore[assignment]
334
346
self .dependencies = dependencies or [] # type:ignore[assignment]
335
347
self .properties = properties or [] # type:ignore[assignment]
348
+ self .definitions = definitions or Definitions ()
336
349
337
350
@property
338
351
@serializable .type_mapping (UrnUuidHelper )
@@ -542,6 +555,22 @@ def vulnerabilities(self, vulnerabilities: Iterable[Vulnerability]) -> None:
542
555
# def formulation(self, ...) -> None:
543
556
# ... # TODO Since CDX 1.5
544
557
558
+ @property
559
+ @serializable .view (SchemaVersion1Dot6 )
560
+ @serializable .xml_sequence (110 )
561
+ def definitions (self ) -> Optional [Definitions ]:
562
+ """
563
+ The repository for definitions
564
+
565
+ Returns:
566
+ `DefinitionRepository`
567
+ """
568
+ return self ._definitions if len (self ._definitions .standards ) > 0 else None
569
+
570
+ @definitions .setter
571
+ def definitions (self , definitions : Definitions ) -> None :
572
+ self ._definitions = definitions
573
+
545
574
def get_component_by_purl (self , purl : Optional ['PackageURL' ]) -> Optional [Component ]:
546
575
"""
547
576
Get a Component already in the Bom by its PURL
0 commit comments