Skip to content

Commit 4258e99

Browse files
committed
feat: add properties for licenses
Signed-off-by: Peter Schuster <p.schuster@pilz.de>
1 parent 6460b71 commit 4258e99

9 files changed

Lines changed: 349 additions & 15 deletions

cyclonedx/model/license.py

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
from enum import Enum
2424
from json import loads as json_loads
25-
from typing import TYPE_CHECKING, Any, Optional, Union
25+
from typing import TYPE_CHECKING, Any, Iterable, Optional, Union
2626
from warnings import warn
2727
from xml.etree.ElementTree import Element # nosec B405
2828

@@ -34,7 +34,7 @@
3434
from ..exception.model import MutuallyExclusivePropertiesException
3535
from ..exception.serialization import CycloneDxDeserializationException
3636
from ..schema.schema import SchemaVersion1Dot5, SchemaVersion1Dot6, SchemaVersion1Dot7
37-
from . import AttachedText, XsUri
37+
from . import AttachedText, Property, XsUri
3838
from .bom_ref import BomRef
3939

4040

@@ -85,6 +85,7 @@ def __init__(
8585
id: Optional[str] = None, name: Optional[str] = None,
8686
text: Optional[AttachedText] = None, url: Optional[XsUri] = None,
8787
acknowledgement: Optional[LicenseAcknowledgement] = None,
88+
properties: Optional[Iterable[Property]] = None,
8889
) -> None:
8990
if not id and not name:
9091
raise MutuallyExclusivePropertiesException('Either `id` or `name` MUST be supplied')
@@ -99,6 +100,7 @@ def __init__(
99100
self._text = text
100101
self._url = url
101102
self._acknowledgement = acknowledgement
103+
self._properties = SortedSet(properties or [])
102104

103105
@property
104106
@serializable.view(SchemaVersion1Dot5)
@@ -188,6 +190,26 @@ def url(self) -> Optional[XsUri]:
188190
def url(self, url: Optional[XsUri]) -> None:
189191
self._url = url
190192

193+
@property
194+
@serializable.view(SchemaVersion1Dot5)
195+
@serializable.view(SchemaVersion1Dot6)
196+
@serializable.view(SchemaVersion1Dot7)
197+
@serializable.xml_array(serializable.XmlArraySerializationType.NESTED, 'property')
198+
@serializable.xml_sequence(4)
199+
def properties(self) -> 'SortedSet[Property]':
200+
"""
201+
Provides the ability to document properties in a key/value store. This provides flexibility to include data not
202+
officially supported in the standard without having to use additional namespaces or create extensions.
203+
204+
Return:
205+
Set of `Property`
206+
"""
207+
return self._properties
208+
209+
@properties.setter
210+
def properties(self, properties: Iterable[Property]) -> None:
211+
self._properties = SortedSet(properties)
212+
191213
# @property
192214
# ...
193215
# @serializable.view(SchemaVersion1Dot5)
@@ -200,18 +222,6 @@ def url(self, url: Optional[XsUri]) -> None:
200222
# def licensing(self, ...) -> None:
201223
# ... # TODO since CDX1.5
202224

203-
# @property
204-
# ...
205-
# @serializable.view(SchemaVersion1Dot5)
206-
# @serializable.view(SchemaVersion1Dot6)
207-
# @serializable.xml_sequence(6)
208-
# def properties(self) -> ...:
209-
# ... # TODO since CDX1.5
210-
#
211-
# @licensing.setter
212-
# def properties(self, ...) -> None:
213-
# ... # TODO since CDX1.5
214-
215225
@property
216226
@serializable.view(SchemaVersion1Dot6)
217227
@serializable.view(SchemaVersion1Dot7)
@@ -245,6 +255,7 @@ def __comparable_tuple(self) -> _ComparableTuple:
245255
self._url,
246256
self._text,
247257
self._bom_ref.value,
258+
_ComparableTuple(self._properties),
248259
))
249260

250261
def __eq__(self, other: object) -> bool:

tests/_data/models.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1101,6 +1101,31 @@ def get_bom_with_licenses() -> Bom:
11011101
])
11021102

11031103

1104+
def get_bom_v1_5_with_license_properties() -> Bom:
1105+
return _make_bom(
1106+
components=[
1107+
Component(
1108+
name='c-with-license-properties', type=ComponentType.LIBRARY, bom_ref='C1',
1109+
licenses=[
1110+
DisjunctiveLicense(
1111+
id='Apache-2.0',
1112+
properties=[
1113+
Property(name='key1', value='val1'),
1114+
Property(name='key2', value='val2'),
1115+
]
1116+
),
1117+
DisjunctiveLicense(
1118+
name='some other license',
1119+
properties=[
1120+
Property(name='myname', value='proprietary'),
1121+
]
1122+
),
1123+
]
1124+
),
1125+
],
1126+
)
1127+
1128+
11041129
def get_bom_metadata_licenses_invalid() -> Bom:
11051130
return Bom(metadata=BomMetaData(licenses=get_invalid_license_repository()))
11061131

@@ -1601,6 +1626,7 @@ def get_bom_for_issue540_duplicate_components() -> Bom:
16011626
get_bom_with_services_complex,
16021627
get_bom_with_services_simple,
16031628
get_bom_with_licenses,
1629+
get_bom_v1_5_with_license_properties,
16041630
get_bom_with_multiple_licenses,
16051631
get_bom_for_issue_497_urls,
16061632
get_bom_for_issue_598_multiple_components_with_purl_qualifiers,
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
{
2+
"components": [
3+
{
4+
"bom-ref": "C1",
5+
"licenses": [
6+
{
7+
"license": {
8+
"id": "Apache-2.0",
9+
"properties": [
10+
{
11+
"name": "key1",
12+
"value": "val1"
13+
},
14+
{
15+
"name": "key2",
16+
"value": "val2"
17+
}
18+
]
19+
}
20+
},
21+
{
22+
"license": {
23+
"name": "some other license",
24+
"properties": [
25+
{
26+
"name": "myname",
27+
"value": "proprietary"
28+
}
29+
]
30+
}
31+
}
32+
],
33+
"name": "c-with-license-properties",
34+
"type": "library"
35+
}
36+
],
37+
"dependencies": [
38+
{
39+
"ref": "C1"
40+
}
41+
],
42+
"metadata": {
43+
"timestamp": "2023-01-07T13:44:32.312678+00:00"
44+
},
45+
"properties": [
46+
{
47+
"name": "key1",
48+
"value": "val1"
49+
},
50+
{
51+
"name": "key2",
52+
"value": "val2"
53+
}
54+
],
55+
"serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
56+
"version": 1,
57+
"$schema": "http://cyclonedx.org/schema/bom-1.5.schema.json",
58+
"bomFormat": "CycloneDX",
59+
"specVersion": "1.5"
60+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?xml version="1.0" ?>
2+
<bom xmlns="http://cyclonedx.org/schema/bom/1.5" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
3+
<metadata>
4+
<timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
5+
</metadata>
6+
<components>
7+
<component type="library" bom-ref="C1">
8+
<name>c-with-license-properties</name>
9+
<licenses>
10+
<license>
11+
<id>Apache-2.0</id>
12+
<properties>
13+
<property name="key1">val1</property>
14+
<property name="key2">val2</property>
15+
</properties>
16+
</license>
17+
<license>
18+
<name>some other license</name>
19+
<properties>
20+
<property name="myname">proprietary</property>
21+
</properties>
22+
</license>
23+
</licenses>
24+
</component>
25+
</components>
26+
<dependencies>
27+
<dependency ref="C1"/>
28+
</dependencies>
29+
<properties>
30+
<property name="key1">val1</property>
31+
<property name="key2">val2</property>
32+
</properties>
33+
</bom>
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
{
2+
"components": [
3+
{
4+
"bom-ref": "C1",
5+
"licenses": [
6+
{
7+
"license": {
8+
"id": "Apache-2.0",
9+
"properties": [
10+
{
11+
"name": "key1",
12+
"value": "val1"
13+
},
14+
{
15+
"name": "key2",
16+
"value": "val2"
17+
}
18+
]
19+
}
20+
},
21+
{
22+
"license": {
23+
"name": "some other license",
24+
"properties": [
25+
{
26+
"name": "myname",
27+
"value": "proprietary"
28+
}
29+
]
30+
}
31+
}
32+
],
33+
"name": "c-with-license-properties",
34+
"type": "library"
35+
}
36+
],
37+
"dependencies": [
38+
{
39+
"ref": "C1"
40+
}
41+
],
42+
"metadata": {
43+
"timestamp": "2023-01-07T13:44:32.312678+00:00"
44+
},
45+
"properties": [
46+
{
47+
"name": "key1",
48+
"value": "val1"
49+
},
50+
{
51+
"name": "key2",
52+
"value": "val2"
53+
}
54+
],
55+
"serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
56+
"version": 1,
57+
"$schema": "http://cyclonedx.org/schema/bom-1.6.schema.json",
58+
"bomFormat": "CycloneDX",
59+
"specVersion": "1.6"
60+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?xml version="1.0" ?>
2+
<bom xmlns="http://cyclonedx.org/schema/bom/1.6" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
3+
<metadata>
4+
<timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
5+
</metadata>
6+
<components>
7+
<component type="library" bom-ref="C1">
8+
<name>c-with-license-properties</name>
9+
<licenses>
10+
<license>
11+
<id>Apache-2.0</id>
12+
<properties>
13+
<property name="key1">val1</property>
14+
<property name="key2">val2</property>
15+
</properties>
16+
</license>
17+
<license>
18+
<name>some other license</name>
19+
<properties>
20+
<property name="myname">proprietary</property>
21+
</properties>
22+
</license>
23+
</licenses>
24+
</component>
25+
</components>
26+
<dependencies>
27+
<dependency ref="C1"/>
28+
</dependencies>
29+
<properties>
30+
<property name="key1">val1</property>
31+
<property name="key2">val2</property>
32+
</properties>
33+
</bom>
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
{
2+
"components": [
3+
{
4+
"bom-ref": "C1",
5+
"licenses": [
6+
{
7+
"license": {
8+
"id": "Apache-2.0",
9+
"properties": [
10+
{
11+
"name": "key1",
12+
"value": "val1"
13+
},
14+
{
15+
"name": "key2",
16+
"value": "val2"
17+
}
18+
]
19+
}
20+
},
21+
{
22+
"license": {
23+
"name": "some other license",
24+
"properties": [
25+
{
26+
"name": "myname",
27+
"value": "proprietary"
28+
}
29+
]
30+
}
31+
}
32+
],
33+
"name": "c-with-license-properties",
34+
"type": "library"
35+
}
36+
],
37+
"dependencies": [
38+
{
39+
"ref": "C1"
40+
}
41+
],
42+
"metadata": {
43+
"timestamp": "2023-01-07T13:44:32.312678+00:00"
44+
},
45+
"properties": [
46+
{
47+
"name": "key1",
48+
"value": "val1"
49+
},
50+
{
51+
"name": "key2",
52+
"value": "val2"
53+
}
54+
],
55+
"serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
56+
"version": 1,
57+
"$schema": "http://cyclonedx.org/schema/bom-1.7.schema.json",
58+
"bomFormat": "CycloneDX",
59+
"specVersion": "1.7"
60+
}

0 commit comments

Comments
 (0)