Skip to content

Commit 52ebe3b

Browse files
add CLI version parameter
This adds new a new -fv option to specify the version of the output format if it supports versions. Removes the old SPDX version handling. Signed-off-by: Armin Tänzer <armin.taenzer@tngtech.com>
1 parent c489827 commit 52ebe3b

File tree

30 files changed

+97
-171
lines changed

30 files changed

+97
-171
lines changed

setup.cfg

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,11 @@ tern.formats =
5252
yaml = tern.formats.yaml.generator:YAML
5353
html = tern.formats.html.generator:HTML
5454
cyclonedxjson = tern.formats.cyclonedx.cyclonedxjson.generator:CycloneDXJSON
55-
spdxjson22 = tern.formats.spdx_new.spdxjson22.generator:SpdxJSON22
56-
spdxyaml22 = tern.formats.spdx_new.spdxyaml22.generator:SpdxYAML22
57-
spdxxml22 = tern.formats.spdx_new.spdxxml22.generator:SpdxXML22
58-
spdxrdf22 = tern.formats.spdx_new.spdxrdf22.generator:SpdxRDF22
59-
spdxtagvalue22 = tern.formats.spdx_new.spdxtagvalue22.generator:SpdxTagValue22
60-
spdxjson23 = tern.formats.spdx_new.spdxjson23.generator:SpdxJSON23
61-
spdxyaml23 = tern.formats.spdx_new.spdxyaml23.generator:SpdxYAML23
62-
spdxxml23 = tern.formats.spdx_new.spdxxml23.generator:SpdxXML23
63-
spdxrdf23 = tern.formats.spdx_new.spdxrdf23.generator:SpdxRDF23
64-
spdxtagvalue23 = tern.formats.spdx_new.spdxtagvalue23.generator:SpdxTagValue23
55+
spdxjson_new = tern.formats.spdx_new.spdxjson.generator:SpdxJSON
56+
spdxyaml_new = tern.formats.spdx_new.spdxyaml.generator:SpdxYAML
57+
spdxxml_new = tern.formats.spdx_new.spdxxml.generator:SpdxXML
58+
spdxrdf_new = tern.formats.spdx_new.spdxrdf.generator:SpdxRDF
59+
spdxtagvalue_new = tern.formats.spdx_new.spdxtagvalue.generator:SpdxTagValue
6560
tern.extensions =
6661
cve_bin_tool = tern.extensions.cve_bin_tool.executor:CveBinTool
6762
scancode = tern.extensions.scancode.executor:Scancode

tern/__main__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,9 @@ def main():
216216
"available formats: "
217217
"spdxtagvalue, spdxjson, cyclonedxjson, json, "
218218
"yaml, html")
219+
parser_report.add_argument('-fv', '--format-version',
220+
metavar='FORMAT_VERSION',
221+
help="Specify the version of the report format.")
219222
parser_report.add_argument('-o', '--output-file', default=None,
220223
metavar='FILE',
221224
help="Write the report to a file. "

tern/formats/cyclonedx/cyclonedxjson/generator.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,14 @@ def get_document_dict(image_obj_list):
5050

5151

5252
class CycloneDXJSON(generator.Generate):
53-
def generate(self, image_obj_list, print_inclusive=False):
53+
def generate(self, image_obj_list, version, print_inclusive=False):
5454
''' Generate a CycloneDX document
5555
The whole document should be stored in a dictionary which can be
5656
converted to JSON and dumped to a file using the write_report function
5757
in report.py. '''
5858
logger.debug('Generating CycloneDX JSON document...')
59+
if version is not None:
60+
raise ValueError("The version parameter is not supported for CycloneDX JSON.")
5961

6062
report = get_document_dict(image_obj_list)
6163

tern/formats/default/generator.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,11 @@ def print_licenses_only(image_obj_list):
140140

141141

142142
class Default(generator.Generate):
143-
def generate(self, image_obj_list, print_inclusive=False):
143+
def generate(self, image_obj_list, version: str, print_inclusive=False):
144144
'''Generate a default report'''
145+
if version is not None:
146+
raise ValueError("The version parameter is not supported for the default format.")
147+
145148
report = formats.disclaimer.format(
146149
version_info=content.get_tool_version())
147150
logger.debug('Creating a detailed report of components in image...')
@@ -154,8 +157,11 @@ def generate(self, image_obj_list, print_inclusive=False):
154157
return report
155158
return report + print_licenses_only(image_obj_list)
156159

157-
def generate_layer(self, layer):
160+
def generate_layer(self, layer, version: str):
158161
"""Generate a default report for one layer object"""
162+
if version is not None:
163+
raise ValueError("The version parameter is not supported for the default format.")
164+
159165
report = formats.disclaimer.format(
160166
version_info=content.get_tool_version())
161167
logger.debug("Generating summary report for layer...")

tern/formats/generator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@
1010
class Generate(metaclass=ABCMeta):
1111
'''Base class for report plugins'''
1212
@abstractmethod
13-
def generate(self, image_obj_list, print_inclusive=False):
13+
def generate(self, image_obj_list, format_version, print_inclusive=False):
1414
'''Format the report according to the plugin style.
1515
Each subclass is responsible for their own formatting.'''

tern/formats/html/generator.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -321,16 +321,22 @@ def get_report_dict(image_obj_list):
321321

322322

323323
class HTML(generator.Generate):
324-
def generate(self, image_obj_list, print_inclusive=False):
324+
def generate(self, image_obj_list, version: str, print_inclusive=False):
325325
'''Given a list of image objects, create a html report
326326
for the images'''
327+
if version is not None:
328+
raise ValueError("The version parameter is not supported for HTML.")
329+
327330
report_dict = get_report_dict(image_obj_list)
328331
report = create_html_report(report_dict, image_obj_list)
329332
return report
330333

331-
def generate_layer(self, layer):
334+
def generate_layer(self, layer, version: str):
332335
"""Given a layer object, create a html report for the layer"""
333336
logger.debug("Creating HTML report...")
337+
if version is not None:
338+
raise ValueError("The version parameter is not supported for HTML.")
339+
334340
report = ""
335341
report = report + '\n' + head_layer % (css, get_tool_version())
336342
report = report + '\n' + report_dict_to_html(layer.to_dict())

tern/formats/json/generator.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,20 @@
1212

1313

1414
class JSON(generator.Generate):
15-
def generate(self, image_obj_list, print_inclusive=False):
15+
def generate(self, image_obj_list, version: str, print_inclusive=False):
1616
'''Given a list of image objects, create a json object string'''
1717
image_list = []
18+
if version is not None:
19+
raise ValueError("The version parameter is not supported for JSON.")
20+
1821
for image in image_obj_list:
1922
image_list.append({'image': image.to_dict()})
2023
image_dict = {'images': image_list}
2124
return json.dumps(image_dict)
2225

23-
def generate_layer(self, layer):
26+
def generate_layer(self, layer, version: str):
2427
"""Create a json object for one layer"""
28+
if version is not None:
29+
raise ValueError("The version parameter is not supported for JSON.")
30+
2531
return json.dumps(layer.to_dict())

tern/formats/spdx_new/spdx_formats_helper.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@
2020

2121
logger = logging.getLogger(constants.logger_name)
2222

23+
SPDX_VERSION_MAPPING = {
24+
"2.2": "SPDX-2.2",
25+
"2.3": "SPDX-2.3",
26+
}
27+
2328

2429
def get_spdx_from_image_list(image_obj_list: List[Image], spdx_format: str, spdx_version: str) -> str:
2530
"""Generate an SPDX document
@@ -32,7 +37,10 @@ def get_spdx_from_image_list(image_obj_list: List[Image], spdx_format: str, spdx
3237
layer which is also a 'Package' which 'CONTAINS' the real Packages"""
3338
logger.debug(f"Generating SPDX {spdx_format} document...")
3439

35-
spdx_document: Document = make_spdx_model(image_obj_list, spdx_version)
40+
if spdx_version not in SPDX_VERSION_MAPPING:
41+
raise ValueError(f"SPDX version {spdx_version} is not supported by tern.")
42+
43+
spdx_document: Document = make_spdx_model(image_obj_list, SPDX_VERSION_MAPPING[spdx_version])
3644

3745
return convert_document_to_serialized_string(spdx_document, spdx_format)
3846

@@ -42,8 +50,11 @@ def get_spdx_from_layer(layer: ImageLayer, spdx_format: str, spdx_version: str)
4250
at container build time"""
4351
logger.debug(f"Generating SPDX {spdx_format} snapshot document...")
4452

53+
if spdx_version not in SPDX_VERSION_MAPPING:
54+
raise ValueError(f"SPDX version {spdx_version} is not supported by tern.")
55+
4556
template = SPDX()
46-
spdx_document: Document = make_spdx_model_snapshot(layer, template, spdx_version)
57+
spdx_document: Document = make_spdx_model_snapshot(layer, template, SPDX_VERSION_MAPPING[spdx_version])
4758

4859
return convert_document_to_serialized_string(spdx_document, spdx_format)
4960

File renamed without changes.

tern/formats/spdx_new/spdxjson22/generator.py renamed to tern/formats/spdx_new/spdxjson/generator.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# SPDX-License-Identifier: BSD-2-Clause
55

66
"""
7-
SPDX-2.2 JSON document generator
7+
SPDX JSON document generator
88
"""
99
from typing import List
1010

@@ -14,9 +14,11 @@
1414
from tern.formats.spdx_new.spdx_formats_helper import get_spdx_from_image_list, get_spdx_from_layer
1515

1616

17-
class SpdxJSON22(generator.Generate):
18-
def generate(self, image_obj_list: List[Image], print_inclusive=False) -> str:
19-
return get_spdx_from_image_list(image_obj_list, "JSON", "SPDX-2.2")
17+
class SpdxJSON(generator.Generate):
18+
def generate(self, image_obj_list: List[Image], version: str, print_inclusive=False) -> str:
19+
if version is None:
20+
version = "2.2"
21+
return get_spdx_from_image_list(image_obj_list, "JSON", version)
2022

21-
def generate_layer(self, layer: ImageLayer) -> str:
22-
return get_spdx_from_layer(layer, "JSON", "SPDX-2.2")
23+
def generate_layer(self, layer: ImageLayer, version) -> str:
24+
return get_spdx_from_layer(layer, "JSON", version)

0 commit comments

Comments
 (0)