@@ -310,7 +310,8 @@ def __init__(self, *, components: Optional[Iterable[Component]] = None,
310
310
serial_number : Optional [UUID ] = None , version : int = 1 ,
311
311
metadata : Optional [BomMetaData ] = None ,
312
312
dependencies : Optional [Iterable [Dependency ]] = None ,
313
- vulnerabilities : Optional [Iterable [Vulnerability ]] = None ) -> None :
313
+ vulnerabilities : Optional [Iterable [Vulnerability ]] = None ,
314
+ properties : Optional [Iterable [Property ]] = None ) -> None :
314
315
"""
315
316
Create a new Bom that you can manually/programmatically add data to later.
316
317
@@ -325,6 +326,7 @@ def __init__(self, *, components: Optional[Iterable[Component]] = None,
325
326
self .external_references = external_references or [] # type:ignore[assignment]
326
327
self .vulnerabilities = vulnerabilities or [] # type:ignore[assignment]
327
328
self .dependencies = dependencies or [] # type:ignore[assignment]
329
+ self .properties = properties or [] # type:ignore[assignment]
328
330
329
331
@property
330
332
@serializable .type_mapping (UrnUuidHelper )
@@ -364,7 +366,7 @@ def version(self, version: int) -> None:
364
366
@serializable .view (SchemaVersion1Dot4 )
365
367
@serializable .view (SchemaVersion1Dot5 )
366
368
@serializable .view (SchemaVersion1Dot6 )
367
- @serializable .xml_sequence (1 )
369
+ @serializable .xml_sequence (10 )
368
370
def metadata (self ) -> BomMetaData :
369
371
"""
370
372
Get our internal metadata object for this Bom.
@@ -385,7 +387,7 @@ def metadata(self, metadata: BomMetaData) -> None:
385
387
@serializable .include_none (SchemaVersion1Dot0 )
386
388
@serializable .include_none (SchemaVersion1Dot1 )
387
389
@serializable .xml_array (serializable .XmlArraySerializationType .NESTED , 'component' )
388
- @serializable .xml_sequence (2 )
390
+ @serializable .xml_sequence (20 )
389
391
def components (self ) -> 'SortedSet[Component]' :
390
392
"""
391
393
Get all the Components currently in this Bom.
@@ -406,7 +408,7 @@ def components(self, components: Iterable[Component]) -> None:
406
408
@serializable .view (SchemaVersion1Dot5 )
407
409
@serializable .view (SchemaVersion1Dot6 )
408
410
@serializable .xml_array (serializable .XmlArraySerializationType .NESTED , 'service' )
409
- @serializable .xml_sequence (3 )
411
+ @serializable .xml_sequence (30 )
410
412
def services (self ) -> 'SortedSet[Service]' :
411
413
"""
412
414
Get all the Services currently in this Bom.
@@ -428,7 +430,7 @@ def services(self, services: Iterable[Service]) -> None:
428
430
@serializable .view (SchemaVersion1Dot5 )
429
431
@serializable .view (SchemaVersion1Dot6 )
430
432
@serializable .xml_array (serializable .XmlArraySerializationType .NESTED , 'reference' )
431
- @serializable .xml_sequence (4 )
433
+ @serializable .xml_sequence (40 )
432
434
def external_references (self ) -> 'SortedSet[ExternalReference]' :
433
435
"""
434
436
Provides the ability to document external references related to the BOM or to the project the BOM describes.
@@ -449,7 +451,7 @@ def external_references(self, external_references: Iterable[ExternalReference])
449
451
@serializable .view (SchemaVersion1Dot5 )
450
452
@serializable .view (SchemaVersion1Dot6 )
451
453
@serializable .xml_array (serializable .XmlArraySerializationType .NESTED , 'dependency' )
452
- @serializable .xml_sequence (5 )
454
+ @serializable .xml_sequence (50 )
453
455
def dependencies (self ) -> 'SortedSet[Dependency]' :
454
456
return self ._dependencies
455
457
@@ -470,25 +472,35 @@ def dependencies(self, dependencies: Iterable[Dependency]) -> None:
470
472
# def compositions(self, ...) -> None:
471
473
# ... # TODO Since CDX 1.3
472
474
473
- # @property
474
- # ...
475
- # @serializable.view(SchemaVersion1Dot3)
476
- # @serializable.view(SchemaVersion1Dot4)
477
- # @serializable.view(SchemaVersion1Dot5)
478
- # @serializable.xml_sequence(7)
479
- # def properties(self) -> ...:
480
- # ... # TODO Since CDX 1.3
481
- #
482
- # @properties.setter
483
- # def properties(self, ...) -> None:
484
- # ... # TODO Since CDX 1.3
475
+ @property
476
+ # @serializable.view(SchemaVersion1Dot3) @todo: Update py-serializable to support view by OutputFormat filtering
477
+ # @serializable.view(SchemaVersion1Dot4) @todo: Update py-serializable to support view by OutputFormat filtering
478
+ @serializable .view (SchemaVersion1Dot5 )
479
+ @serializable .view (SchemaVersion1Dot6 )
480
+ @serializable .xml_array (serializable .XmlArraySerializationType .NESTED , 'property' )
481
+ @serializable .xml_sequence (70 )
482
+ def properties (self ) -> 'SortedSet[Property]' :
483
+ """
484
+ Provides the ability to document properties in a name/value store. This provides flexibility to include data
485
+ not officially supported in the standard without having to use additional namespaces or create extensions.
486
+ Property names of interest to the general public are encouraged to be registered in the CycloneDX Property
487
+ Taxonomy - https://github.com/CycloneDX/cyclonedx-property-taxonomy. Formal registration is OPTIONAL.
488
+
489
+ Return:
490
+ Set of `Property`
491
+ """
492
+ return self ._properties
493
+
494
+ @properties .setter
495
+ def properties (self , properties : Iterable [Property ]) -> None :
496
+ self ._properties = SortedSet (properties )
485
497
486
498
@property
487
499
@serializable .view (SchemaVersion1Dot4 )
488
500
@serializable .view (SchemaVersion1Dot5 )
489
501
@serializable .view (SchemaVersion1Dot6 )
490
502
@serializable .xml_array (serializable .XmlArraySerializationType .NESTED , 'vulnerability' )
491
- @serializable .xml_sequence (8 )
503
+ @serializable .xml_sequence (80 )
492
504
def vulnerabilities (self ) -> 'SortedSet[Vulnerability]' :
493
505
"""
494
506
Get all the Vulnerabilities in this BOM.
@@ -682,7 +694,8 @@ def __eq__(self, other: object) -> bool:
682
694
def __hash__ (self ) -> int :
683
695
return hash ((
684
696
self .serial_number , self .version , self .metadata , tuple (self .components ), tuple (self .services ),
685
- tuple (self .external_references ), tuple (self .vulnerabilities ), tuple (self .dependencies )
697
+ tuple (self .external_references ), tuple (self .dependencies ), tuple (self .properties ),
698
+ tuple (self .vulnerabilities ),
686
699
))
687
700
688
701
def __repr__ (self ) -> str :
0 commit comments