Skip to content

Commit

Permalink
add CLI version parameter
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
armintaenzertng committed Jul 13, 2023
1 parent c489827 commit 52ebe3b
Show file tree
Hide file tree
Showing 30 changed files with 97 additions and 171 deletions.
15 changes: 5 additions & 10 deletions setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -52,16 +52,11 @@ tern.formats =
yaml = tern.formats.yaml.generator:YAML
html = tern.formats.html.generator:HTML
cyclonedxjson = tern.formats.cyclonedx.cyclonedxjson.generator:CycloneDXJSON
spdxjson22 = tern.formats.spdx_new.spdxjson22.generator:SpdxJSON22
spdxyaml22 = tern.formats.spdx_new.spdxyaml22.generator:SpdxYAML22
spdxxml22 = tern.formats.spdx_new.spdxxml22.generator:SpdxXML22
spdxrdf22 = tern.formats.spdx_new.spdxrdf22.generator:SpdxRDF22
spdxtagvalue22 = tern.formats.spdx_new.spdxtagvalue22.generator:SpdxTagValue22
spdxjson23 = tern.formats.spdx_new.spdxjson23.generator:SpdxJSON23
spdxyaml23 = tern.formats.spdx_new.spdxyaml23.generator:SpdxYAML23
spdxxml23 = tern.formats.spdx_new.spdxxml23.generator:SpdxXML23
spdxrdf23 = tern.formats.spdx_new.spdxrdf23.generator:SpdxRDF23
spdxtagvalue23 = tern.formats.spdx_new.spdxtagvalue23.generator:SpdxTagValue23
spdxjson_new = tern.formats.spdx_new.spdxjson.generator:SpdxJSON
spdxyaml_new = tern.formats.spdx_new.spdxyaml.generator:SpdxYAML
spdxxml_new = tern.formats.spdx_new.spdxxml.generator:SpdxXML
spdxrdf_new = tern.formats.spdx_new.spdxrdf.generator:SpdxRDF
spdxtagvalue_new = tern.formats.spdx_new.spdxtagvalue.generator:SpdxTagValue
tern.extensions =
cve_bin_tool = tern.extensions.cve_bin_tool.executor:CveBinTool
scancode = tern.extensions.scancode.executor:Scancode
Expand Down
3 changes: 3 additions & 0 deletions tern/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,9 @@ def main():
"available formats: "
"spdxtagvalue, spdxjson, cyclonedxjson, json, "
"yaml, html")
parser_report.add_argument('-fv', '--format-version',
metavar='FORMAT_VERSION',
help="Specify the version of the report format.")
parser_report.add_argument('-o', '--output-file', default=None,
metavar='FILE',
help="Write the report to a file. "
Expand Down
4 changes: 3 additions & 1 deletion tern/formats/cyclonedx/cyclonedxjson/generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,14 @@ def get_document_dict(image_obj_list):


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

report = get_document_dict(image_obj_list)

Expand Down
10 changes: 8 additions & 2 deletions tern/formats/default/generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -140,8 +140,11 @@ def print_licenses_only(image_obj_list):


class Default(generator.Generate):
def generate(self, image_obj_list, print_inclusive=False):
def generate(self, image_obj_list, version: str, print_inclusive=False):
'''Generate a default report'''
if version is not None:
raise ValueError("The version parameter is not supported for the default format.")

report = formats.disclaimer.format(
version_info=content.get_tool_version())
logger.debug('Creating a detailed report of components in image...')
Expand All @@ -154,8 +157,11 @@ def generate(self, image_obj_list, print_inclusive=False):
return report
return report + print_licenses_only(image_obj_list)

def generate_layer(self, layer):
def generate_layer(self, layer, version: str):
"""Generate a default report for one layer object"""
if version is not None:
raise ValueError("The version parameter is not supported for the default format.")

report = formats.disclaimer.format(
version_info=content.get_tool_version())
logger.debug("Generating summary report for layer...")
Expand Down
2 changes: 1 addition & 1 deletion tern/formats/generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@
class Generate(metaclass=ABCMeta):
'''Base class for report plugins'''
@abstractmethod
def generate(self, image_obj_list, print_inclusive=False):
def generate(self, image_obj_list, format_version, print_inclusive=False):
'''Format the report according to the plugin style.
Each subclass is responsible for their own formatting.'''
10 changes: 8 additions & 2 deletions tern/formats/html/generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -321,16 +321,22 @@ def get_report_dict(image_obj_list):


class HTML(generator.Generate):
def generate(self, image_obj_list, print_inclusive=False):
def generate(self, image_obj_list, version: str, print_inclusive=False):
'''Given a list of image objects, create a html report
for the images'''
if version is not None:
raise ValueError("The version parameter is not supported for HTML.")

report_dict = get_report_dict(image_obj_list)
report = create_html_report(report_dict, image_obj_list)
return report

def generate_layer(self, layer):
def generate_layer(self, layer, version: str):
"""Given a layer object, create a html report for the layer"""
logger.debug("Creating HTML report...")
if version is not None:
raise ValueError("The version parameter is not supported for HTML.")

report = ""
report = report + '\n' + head_layer % (css, get_tool_version())
report = report + '\n' + report_dict_to_html(layer.to_dict())
Expand Down
10 changes: 8 additions & 2 deletions tern/formats/json/generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,20 @@


class JSON(generator.Generate):
def generate(self, image_obj_list, print_inclusive=False):
def generate(self, image_obj_list, version: str, print_inclusive=False):
'''Given a list of image objects, create a json object string'''
image_list = []
if version is not None:
raise ValueError("The version parameter is not supported for JSON.")

for image in image_obj_list:
image_list.append({'image': image.to_dict()})
image_dict = {'images': image_list}
return json.dumps(image_dict)

def generate_layer(self, layer):
def generate_layer(self, layer, version: str):
"""Create a json object for one layer"""
if version is not None:
raise ValueError("The version parameter is not supported for JSON.")

return json.dumps(layer.to_dict())
15 changes: 13 additions & 2 deletions tern/formats/spdx_new/spdx_formats_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@

logger = logging.getLogger(constants.logger_name)

SPDX_VERSION_MAPPING = {
"2.2": "SPDX-2.2",
"2.3": "SPDX-2.3",
}


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

spdx_document: Document = make_spdx_model(image_obj_list, spdx_version)
if spdx_version not in SPDX_VERSION_MAPPING:
raise ValueError(f"SPDX version {spdx_version} is not supported by tern.")

spdx_document: Document = make_spdx_model(image_obj_list, SPDX_VERSION_MAPPING[spdx_version])

return convert_document_to_serialized_string(spdx_document, spdx_format)

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

if spdx_version not in SPDX_VERSION_MAPPING:
raise ValueError(f"SPDX version {spdx_version} is not supported by tern.")

template = SPDX()
spdx_document: Document = make_spdx_model_snapshot(layer, template, spdx_version)
spdx_document: Document = make_spdx_model_snapshot(layer, template, SPDX_VERSION_MAPPING[spdx_version])

return convert_document_to_serialized_string(spdx_document, spdx_format)

Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
# SPDX-License-Identifier: BSD-2-Clause

"""
SPDX-2.2 JSON document generator
SPDX JSON document generator
"""
from typing import List

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


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

def generate_layer(self, layer: ImageLayer) -> str:
return get_spdx_from_layer(layer, "JSON", "SPDX-2.2")
def generate_layer(self, layer: ImageLayer, version) -> str:
return get_spdx_from_layer(layer, "JSON", version)
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
# SPDX-License-Identifier: BSD-2-Clause

"""
SPDX-2.2 RDF-XML document generator
SPDX RDF-XML document generator
"""
from typing import List

Expand All @@ -14,9 +14,9 @@
from tern.formats.spdx_new.spdx_formats_helper import get_spdx_from_image_list, get_spdx_from_layer


class SpdxRDF22(generator.Generate):
def generate(self, image_obj_list: List[Image], print_inclusive=False) -> str:
return get_spdx_from_image_list(image_obj_list, "RDF-XML", "SPDX-2.2")
class SpdxRDF(generator.Generate):
def generate(self, image_obj_list: List[Image], version: str, print_inclusive=False) -> str:
return get_spdx_from_image_list(image_obj_list, "RDF-XML", version)

def generate_layer(self, layer: ImageLayer) -> str:
return get_spdx_from_layer(layer, "RDF-XML", "SPDX-2.2")
def generate_layer(self, layer: ImageLayer, version: str) -> str:
return get_spdx_from_layer(layer, "RDF-XML", version)
22 changes: 0 additions & 22 deletions tern/formats/spdx_new/spdxrdf23/generator.py

This file was deleted.

File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
# SPDX-License-Identifier: BSD-2-Clause

"""
SPDX-2.2 Tag-Value document generator
SPDX Tag-Value document generator
"""

from typing import List
Expand All @@ -15,9 +15,9 @@
from tern.formats.spdx_new.spdx_formats_helper import get_spdx_from_image_list, get_spdx_from_layer


class SpdxTagValue22(generator.Generate):
def generate(self, image_obj_list: List[Image], print_inclusive=False) -> str:
return get_spdx_from_image_list(image_obj_list, "Tag-Value", "SPDX-2.2")
class SpdxTagValue(generator.Generate):
def generate(self, image_obj_list: List[Image], version: str, print_inclusive=False) -> str:
return get_spdx_from_image_list(image_obj_list, "Tag-Value", version)

def generate_layer(self, layer: ImageLayer) -> str:
return get_spdx_from_layer(layer, "Tag-Value", "SPDX-2.2")
def generate_layer(self, layer: ImageLayer, version: str) -> str:
return get_spdx_from_layer(layer, "Tag-Value", version)
Empty file.
23 changes: 0 additions & 23 deletions tern/formats/spdx_new/spdxtagvalue23/generator.py

This file was deleted.

File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
# SPDX-License-Identifier: BSD-2-Clause

"""
SPDX-2.3 JSON document generator
SPDX XML document generator
"""
from typing import List

Expand All @@ -14,9 +14,9 @@
from tern.formats.spdx_new.spdx_formats_helper import get_spdx_from_image_list, get_spdx_from_layer


class SpdxJSON22(generator.Generate):
def generate(self, image_obj_list: List[Image], print_inclusive=False) -> str:
return get_spdx_from_image_list(image_obj_list, "JSON", "SPDX-2.3")
class SpdxXML(generator.Generate):
def generate(self, image_obj_list: List[Image], version: str, print_inclusive=False) -> str:
return get_spdx_from_image_list(image_obj_list, "XML", version)

def generate_layer(self, layer: ImageLayer) -> str:
return get_spdx_from_layer(layer, "JSON", "SPDX-2.3")
def generate_layer(self, layer: ImageLayer, version: str) -> str:
return get_spdx_from_layer(layer, "XML", version)
Empty file.
22 changes: 0 additions & 22 deletions tern/formats/spdx_new/spdxxml22/generator.py

This file was deleted.

Empty file.
22 changes: 0 additions & 22 deletions tern/formats/spdx_new/spdxxml23/generator.py

This file was deleted.

File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
# SPDX-License-Identifier: BSD-2-Clause

"""
SPDX-2.2 YAML document generator
SPDX YAML document generator
"""
from typing import List

Expand All @@ -14,9 +14,9 @@
from tern.formats.spdx_new.spdx_formats_helper import get_spdx_from_image_list, get_spdx_from_layer


class SpdxYAML22(generator.Generate):
def generate(self, image_obj_list: List[Image], print_inclusive=False) -> str:
return get_spdx_from_image_list(image_obj_list, "YAML", "SPDX-2.2")
class SpdxYAML(generator.Generate):
def generate(self, image_obj_list: List[Image], version: str, print_inclusive=False) -> str:
return get_spdx_from_image_list(image_obj_list, "YAML", version)

def generate_layer(self, layer: ImageLayer) -> str:
return get_spdx_from_layer(layer, "YAML", "SPDX-2.2")
def generate_layer(self, layer: ImageLayer, version: str) -> str:
return get_spdx_from_layer(layer, "YAML", version)
Empty file.
Empty file.
Loading

0 comments on commit 52ebe3b

Please sign in to comment.