Class: Sbom::Spdx::Generator

Inherits:
Object
  • Object
show all
Defined in:
lib/sbom/spdx/generator.rb

Constant Summary collapse

SPDX_VERSION =
"SPDX-2.3"
SPDX_NAMESPACE =
"http://spdx.org/spdxdocs/"
FORMAT_TAG =
:tag
FORMAT_JSON =
:json
FORMAT_YAML =
:yaml
LIFECYCLE_MAP =
{
  "design" => "Design",
  "pre-build" => "Source",
  "build" => "Build",
  "post-build" => "Analyzed",
  "operations" => "Deployed",
  "discovery" => "Runtime"
}.freeze

Instance Method Summary collapse

Constructor Details

#initialize(format: FORMAT_TAG, application: "sbom", version: Sbom::VERSION) ⇒ Generator

Returns a new instance of Generator.



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/sbom/spdx/generator.rb', line 27

def initialize(format: FORMAT_TAG, application: "sbom", version: Sbom::VERSION)
  @format = validate_format(format)
  @application = application
  @version = version
  @spec_version = ENV.fetch("SBOM_SPDX_VERSION", SPDX_VERSION)
  @organization = ENV["SBOM_ORGANIZATION"]

  @tag_output = []
  @json_output = {}
  @packages = []
  @files = []
  @relationships = []
  @licenses = []
  @elements = {}
end

Instance Method Details

#generate(project_name, sbom_data) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/sbom/spdx/generator.rb', line 43

def generate(project_name, sbom_data)
  return if sbom_data.nil? || (sbom_data.respond_to?(:empty?) && sbom_data.empty?)

  data = sbom_data.is_a?(Hash) ? sbom_data : sbom_data.to_h

  @spec_version = data[:version] if data[:version]&.start_with?("SPDX")
  uuid = data[:uuid]

  doc_name = extract_document_name(data, project_name)
  organization = extract_organization(data)
  lifecycle = extract_lifecycle(data)

  generate_document_header(doc_name, uuid, lifecycle, organization)
  generate_packages(data[:packages])
  generate_files(data[:files])
  generate_relationships(data[:relationships])
  generate_license_info(data[:licenses])

  finalize_output
end

#outputObject



64
65
66
67
68
69
70
71
72
73
# File 'lib/sbom/spdx/generator.rb', line 64

def output
  case @format
  when FORMAT_JSON
    JSON.pretty_generate(@json_output)
  when FORMAT_YAML
    @json_output.to_yaml
  else
    @tag_output.join("\n")
  end
end

#to_hObject



75
76
77
# File 'lib/sbom/spdx/generator.rb', line 75

def to_h
  @json_output
end