Skip to content

Commit 73007f8

Browse files
committed
Add logic to down-convert all components/services if there are Tools
Signed-off-by: Joshua Kugler <[email protected]>
1 parent 76743d9 commit 73007f8

14 files changed

+270
-16
lines changed

cyclonedx/model/tool.py

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,8 @@ def json_normalize(cls, o: ToolsRepository, *,
312312

313313
result = {}
314314

315-
if view().schema_version_enum >= SchemaVersion1Dot5().schema_version_enum: # type: ignore[union-attr, misc]
315+
if (view().schema_version_enum >= SchemaVersion1Dot5().schema_version_enum # type: ignore[union-attr, misc]
316+
and not o.tools):
316317
if o.components:
317318
result['components'] = [json_loads(Component.as_json(c, view_=view)) # type: ignore[attr-defined]
318319
for c in o.components]
@@ -324,12 +325,10 @@ def json_normalize(cls, o: ToolsRepository, *,
324325
if result:
325326
return result
326327

327-
if ((o.components or o.services)
328-
and view().schema_version_enum < SchemaVersion1Dot5().schema_version_enum): # type: ignore[union-attr, misc] # noqa: disable=E501
329-
# We "down-convert" Components and Services to Tools so we can render to older schemas
330-
tools_to_render = cls.convert_new_to_old(o.components, o.services)
331-
else:
332-
tools_to_render = o.tools
328+
tools_to_render: 'SortedSet[Tool]' = SortedSet(o.tools)
329+
# We "down-convert" Components and Services to Tools so we can render to older schemas
330+
# or when there are existing Tool objects
331+
tools_to_render.update(cls.convert_new_to_old(o.components, o.services))
333332

334333
return [json_loads(Tool.as_json(t, view_=view)) for t in tools_to_render] # type: ignore[attr-defined]
335334

@@ -367,7 +366,8 @@ def xml_normalize(cls, o: ToolsRepository, *,
367366

368367
elem = Element(element_name)
369368

370-
if view().schema_version_enum >= SchemaVersion1Dot5().schema_version_enum: # type: ignore[union-attr, misc]
369+
if (view().schema_version_enum >= SchemaVersion1Dot5().schema_version_enum # type: ignore[union-attr, misc]
370+
and not o.tools):
371371
if o.components:
372372
c_elem = Element('{' + xmlns + '}' + 'components') # type: ignore[operator]
373373

@@ -393,12 +393,10 @@ def xml_normalize(cls, o: ToolsRepository, *,
393393
if len(elem) > 0:
394394
return elem
395395

396-
if ((o.components or o.services)
397-
and view().schema_version_enum < SchemaVersion1Dot5().schema_version_enum): # type: ignore[union-attr, misc] # noqa: disable=E501
398-
# We "down-convert" Components and Services to Tools so we can render to older schemas
399-
tools_to_render = cls.convert_new_to_old(o.components, o.services)
400-
else:
401-
tools_to_render = o.tools
396+
tools_to_render: 'SortedSet[Tool]' = SortedSet(o.tools)
397+
# We "down-convert" Components and Services to Tools so we can render to older schemas
398+
# or when there are existing Tool objects
399+
tools_to_render.update(cls.convert_new_to_old(o.components, o.services))
402400

403401
elem.extend(
404402
t.as_xml( # type: ignore[attr-defined]

tests/_data/models.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
Note,
3939
NoteText,
4040
Property,
41-
Tool,
4241
XsUri,
4342
)
4443
from cyclonedx.model.bom import Bom, BomMetaData
@@ -89,7 +88,7 @@
8988
from cyclonedx.model.license import DisjunctiveLicense, License, LicenseAcknowledgement, LicenseExpression
9089
from cyclonedx.model.release_note import ReleaseNotes
9190
from cyclonedx.model.service import Service
92-
from cyclonedx.model.tool import ToolsRepository
91+
from cyclonedx.model.tool import Tool, ToolsRepository
9392
from cyclonedx.model.vulnerability import (
9493
BomTarget,
9594
BomTargetVersionRange,
@@ -1060,6 +1059,17 @@ def get_bom_with_tools_with_component_and_service_migrate() -> Bom:
10601059
)
10611060

10621061

1062+
def get_bom_with_tools_with_component_and_service_and_tools_migrate() -> Bom:
1063+
tools = ToolsRepository()
1064+
tcomp = tools.components
1065+
tserv = tools.services
1066+
ttools = tools.tools
1067+
tcomp.add(Component(type=ComponentType.APPLICATION, name='test-component', version='1.2.3'))
1068+
tserv.add(Service(name='test-service', bom_ref='my-service'))
1069+
ttools.add(Tool(name='test-tool', version='1.33.7'))
1070+
return _make_bom(metadata=BomMetaData(tools=tools))
1071+
1072+
10631073
def get_bom_for_issue_497_urls() -> Bom:
10641074
"""regression test for issue #497
10651075
see https://github.com/CycloneDX/cyclonedx-python-lib/issues/497
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<?xml version="1.0" ?>
2+
<bom xmlns="http://cyclonedx.org/schema/bom/1.0" version="1">
3+
<components/>
4+
</bom>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<?xml version="1.0" ?>
2+
<bom xmlns="http://cyclonedx.org/schema/bom/1.1" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
3+
<components/>
4+
</bom>
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
"metadata": {
3+
"timestamp": "2023-01-07T13:44:32.312678+00:00",
4+
"tools": [
5+
{
6+
"name": "test-component",
7+
"version": "1.2.3"
8+
},
9+
{
10+
"name": "test-service"
11+
},
12+
{
13+
"name": "test-tool",
14+
"version": "1.33.7"
15+
}
16+
]
17+
},
18+
"serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
19+
"version": 1,
20+
"$schema": "http://cyclonedx.org/schema/bom-1.2b.schema.json",
21+
"bomFormat": "CycloneDX",
22+
"specVersion": "1.2"
23+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?xml version="1.0" ?>
2+
<bom xmlns="http://cyclonedx.org/schema/bom/1.2" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
3+
<metadata>
4+
<timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
5+
<tools>
6+
<tool>
7+
<name>test-component</name>
8+
<version>1.2.3</version>
9+
</tool>
10+
<tool>
11+
<name>test-service</name>
12+
</tool>
13+
<tool>
14+
<name>test-tool</name>
15+
<version>1.33.7</version>
16+
</tool>
17+
</tools>
18+
</metadata>
19+
</bom>
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
"metadata": {
3+
"timestamp": "2023-01-07T13:44:32.312678+00:00",
4+
"tools": [
5+
{
6+
"name": "test-component",
7+
"version": "1.2.3"
8+
},
9+
{
10+
"name": "test-service"
11+
},
12+
{
13+
"name": "test-tool",
14+
"version": "1.33.7"
15+
}
16+
]
17+
},
18+
"serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
19+
"version": 1,
20+
"$schema": "http://cyclonedx.org/schema/bom-1.3a.schema.json",
21+
"bomFormat": "CycloneDX",
22+
"specVersion": "1.3"
23+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?xml version="1.0" ?>
2+
<bom xmlns="http://cyclonedx.org/schema/bom/1.3" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
3+
<metadata>
4+
<timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
5+
<tools>
6+
<tool>
7+
<name>test-component</name>
8+
<version>1.2.3</version>
9+
</tool>
10+
<tool>
11+
<name>test-service</name>
12+
</tool>
13+
<tool>
14+
<name>test-tool</name>
15+
<version>1.33.7</version>
16+
</tool>
17+
</tools>
18+
</metadata>
19+
</bom>
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
"metadata": {
3+
"timestamp": "2023-01-07T13:44:32.312678+00:00",
4+
"tools": [
5+
{
6+
"name": "test-component",
7+
"version": "1.2.3"
8+
},
9+
{
10+
"name": "test-service"
11+
},
12+
{
13+
"name": "test-tool",
14+
"version": "1.33.7"
15+
}
16+
]
17+
},
18+
"serialNumber": "urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac",
19+
"version": 1,
20+
"$schema": "http://cyclonedx.org/schema/bom-1.4.schema.json",
21+
"bomFormat": "CycloneDX",
22+
"specVersion": "1.4"
23+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?xml version="1.0" ?>
2+
<bom xmlns="http://cyclonedx.org/schema/bom/1.4" serialNumber="urn:uuid:1441d33a-e0fc-45b5-af3b-61ee52a88bac" version="1">
3+
<metadata>
4+
<timestamp>2023-01-07T13:44:32.312678+00:00</timestamp>
5+
<tools>
6+
<tool>
7+
<name>test-component</name>
8+
<version>1.2.3</version>
9+
</tool>
10+
<tool>
11+
<name>test-service</name>
12+
</tool>
13+
<tool>
14+
<name>test-tool</name>
15+
<version>1.33.7</version>
16+
</tool>
17+
</tools>
18+
</metadata>
19+
</bom>

0 commit comments

Comments
 (0)