Current section
14 Versions
Jump to
Current section
14 Versions
Compare versions
529
files changed
+2600
additions
-2475
deletions
| @@ -3,7 +3,7 @@ | |
| 3 3 | {<<"Issues">>,<<"https://github.com/erlef/mix_sbom/issues">>}, |
| 4 4 | {<<"Releases">>,<<"https://github.com/erlef/mix_sbom/releases">>}]}. |
| 5 5 | {<<"name">>,<<"sbom">>}. |
| 6 | - {<<"version">>,<<"0.8.0-beta.2">>}. |
| 6 | + {<<"version">>,<<"0.8.0-beta.3">>}. |
| 7 7 | {<<"description">>, |
| 8 8 | <<"Mix task to generate a Software Bill-of-Materials (SBoM) in CycloneDX format">>}. |
| 9 9 | {<<"elixir">>,<<"~> 1.16 and >= 1.16.2">>}. |
| @@ -9,14 +9,10 @@ defmodule SBoM.CLI do | |
| 9 9 | # This module is used by both the Mix task and escript implementations. |
| 10 10 | |
| 11 11 | alias SBoM.CycloneDX |
| 12 | - alias SBoM.Fetcher |
| 13 12 | |
| 14 13 | @version Mix.Project.config()[:version] |
| 15 14 | |
| 16 15 | @type cli_mode() :: :mix | :escript | :burrito |
| 17 | - @type format() :: :xml | :json | :protobuf |
| 18 | - @type schema_version() :: String.t() |
| 19 | - @type pretty() :: boolean() |
| 20 16 | |
| 21 17 | @schema_versions ~w[1.7 1.6 1.5 1.4 1.3] |
| 22 18 | |
| @@ -87,13 +83,13 @@ defmodule SBoM.CLI do | |
| 87 83 | |
| 88 84 | @spec generate_bom_content_in_app(Optimus.ParseResult.t()) :: :ok |
| 89 85 | defp generate_bom_content_in_app(parse_result) do |
| 90 | - Fetcher.fetch() |
| 91 | - |> CycloneDX.bom( |
| 86 | + [ |
| 92 87 | version: parse_result.options.schema, |
| 93 88 | only: parse_result.options.only, |
| 94 89 | targets: parse_result.options.targets, |
| 95 90 | classification: parse_result.options.classification |
| 96 | - ) |
| 91 | + ] |
| 92 | + |> CycloneDX.bom() |
| 97 93 | |> CycloneDX.encode(parse_result.options.format, parse_result.flags.pretty) |
| 98 94 | |> write_file(parse_result.options.output, parse_result.flags.force) |
| 99 95 | end |
| @@ -134,7 +130,7 @@ defmodule SBoM.CLI do | |
| 134 130 | end |
| 135 131 | end |
| 136 132 | |
| 137 | - @spec safe_decode(String.t(), format()) :: {:ok, CycloneDX.t()} | {:error, any()} |
| 133 | + @spec safe_decode(String.t(), CycloneDX.format()) :: {:ok, CycloneDX.t()} | {:error, any()} |
| 138 134 | defp safe_decode(content, format) do |
| 139 135 | {:ok, CycloneDX.decode(content, format)} |
| 140 136 | rescue |
| @@ -361,7 +357,7 @@ defmodule SBoM.CLI do | |
| 361 357 | end) |
| 362 358 | end |
| 363 359 | |
| 364 | - @spec format_from_path(Path.t()) :: format() |
| 360 | + @spec format_from_path(Path.t()) :: CycloneDX.format() |
| 365 361 | defp format_from_path(path) do |
| 366 362 | case Path.extname(path) do |
| 367 363 | ".json" -> :json |
| @@ -371,13 +367,13 @@ defmodule SBoM.CLI do | |
| 371 367 | end |
| 372 368 | end |
| 373 369 | |
| 374 | - @spec parse_schema(String.t()) :: {:ok, schema_version()} | {:error, String.t()} |
| 370 | + @spec parse_schema(String.t()) :: {:ok, CycloneDX.schema_version()} | {:error, String.t()} |
| 375 371 | defp parse_schema(schema) |
| 376 372 | defp parse_schema(schema) when schema in @schema_versions, do: {:ok, schema} |
| 377 373 | |
| 378 374 | defp parse_schema(_other), do: {:error, "available versions are #{Enum.join(@schema_versions, ", ")}"} |
| 379 375 | |
| 380 | - @spec parse_format(String.t()) :: {:ok, format()} | {:error, String.t()} |
| 376 | + @spec parse_format(String.t()) :: {:ok, CycloneDX.format()} | {:error, String.t()} |
| 381 377 | defp parse_format(format) |
| 382 378 | defp parse_format("xml"), do: {:ok, :xml} |
| 383 379 | defp parse_format("json"), do: {:ok, :json} |
| @@ -2,74 +2,82 @@ | |
| 2 2 | # SPDX-FileCopyrightText: 2025 Erlang Ecosystem Foundation |
| 3 3 | |
| 4 4 | defmodule SBoM.CycloneDX do |
| 5 | - @moduledoc false |
| 5 | + @moduledoc "SBoM CycloneDX encoding and decoding." |
| 6 6 | |
| 7 7 | alias SBoM.CycloneDX.JSON |
| 8 8 | alias SBoM.CycloneDX.Protobuf |
| 9 9 | alias SBoM.CycloneDX.XML |
| 10 | + alias SBoM.Fetcher |
| 10 11 | |
| 11 12 | @type t() :: |
| 12 | - SBoM.Cyclonedx.V13.Bom.t() |
| 13 | - | SBoM.Cyclonedx.V14.Bom.t() |
| 14 | - | SBoM.Cyclonedx.V15.Bom.t() |
| 15 | - | SBoM.Cyclonedx.V16.Bom.t() |
| 16 | - | SBoM.Cyclonedx.V17.Bom.t() |
| 17 | - @type components_map() :: %{SBoM.Fetcher.app_name() => SBoM.Fetcher.dependency()} |
| 18 | - @type component() :: |
| 19 | - SBoM.Cyclonedx.V13.Component.t() |
| 20 | - | SBoM.Cyclonedx.V14.Component.t() |
| 21 | - | SBoM.Cyclonedx.V15.Component.t() |
| 22 | - | SBoM.Cyclonedx.V16.Component.t() |
| 23 | - | SBoM.Cyclonedx.V17.Component.t() |
| 13 | + SBoM.CycloneDX.V13.Bom.t() |
| 14 | + | SBoM.CycloneDX.V14.Bom.t() |
| 15 | + | SBoM.CycloneDX.V15.Bom.t() |
| 16 | + | SBoM.CycloneDX.V16.Bom.t() |
| 17 | + | SBoM.CycloneDX.V17.Bom.t() |
| 18 | + |
| 19 | + @type format() :: :protobuf | :json | :xml |
| 20 | + @type schema_version() :: String.t() |
| 21 | + |
| 22 | + @typep components_map() :: %{Fetcher.app_name() => Fetcher.dependency()} |
| 23 | + @typep component() :: |
| 24 | + SBoM.CycloneDX.V13.Component.t() |
| 25 | + | SBoM.CycloneDX.V14.Component.t() |
| 26 | + | SBoM.CycloneDX.V15.Component.t() |
| 27 | + | SBoM.CycloneDX.V16.Component.t() |
| 28 | + | SBoM.CycloneDX.V17.Component.t() |
| 24 29 | @type classification() :: |
| 25 | - SBoM.Cyclonedx.V13.Classification.t() |
| 26 | - | SBoM.Cyclonedx.V14.Classification.t() |
| 27 | - | SBoM.Cyclonedx.V15.Classification.t() |
| 28 | - | SBoM.Cyclonedx.V16.Classification.t() |
| 29 | - | SBoM.Cyclonedx.V17.Classification.t() |
| 30 | - @type dependency_list() :: [ |
| 31 | - SBoM.Cyclonedx.V13.Dependency.t() |
| 32 | - | SBoM.Cyclonedx.V14.Dependency.t() |
| 33 | - | SBoM.Cyclonedx.V15.Dependency.t() |
| 34 | - | SBoM.Cyclonedx.V16.Dependency.t() |
| 35 | - | SBoM.Cyclonedx.V17.Dependency.t() |
| 36 | - ] |
| 37 | - @type license_list() :: [ |
| 38 | - SBoM.Cyclonedx.V13.LicenseChoice.t() |
| 39 | - | SBoM.Cyclonedx.V14.LicenseChoice.t() |
| 40 | - | SBoM.Cyclonedx.V15.LicenseChoice.t() |
| 41 | - | SBoM.Cyclonedx.V16.LicenseChoice.t() |
| 42 | - | SBoM.Cyclonedx.V17.LicenseChoice.t() |
| 43 | - ] |
| 44 | - @type scope() :: |
| 45 | - SBoM.Cyclonedx.V13.Scope.t() |
| 46 | - | SBoM.Cyclonedx.V14.Scope.t() |
| 47 | - | SBoM.Cyclonedx.V15.Scope.t() |
| 48 | - | SBoM.Cyclonedx.V16.Scope.t() |
| 49 | - | SBoM.Cyclonedx.V17.Scope.t() |
| 50 | - @type metadata() :: |
| 51 | - SBoM.Cyclonedx.V13.Metadata.t() |
| 52 | - | SBoM.Cyclonedx.V14.Metadata.t() |
| 53 | - | SBoM.Cyclonedx.V15.Metadata.t() |
| 54 | - | SBoM.Cyclonedx.V16.Metadata.t() |
| 55 | - | SBoM.Cyclonedx.V17.Metadata.t() |
| 56 | - @type tool() :: |
| 57 | - SBoM.Cyclonedx.V13.Tool.t() |
| 58 | - | SBoM.Cyclonedx.V14.Tool.t() |
| 59 | - | SBoM.Cyclonedx.V15.Tool.t() |
| 60 | - | SBoM.Cyclonedx.V16.Tool.t() |
| 61 | - | SBoM.Cyclonedx.V17.Tool.t() |
| 62 | - @type external_reference() :: |
| 63 | - SBoM.Cyclonedx.V13.ExternalReference.t() |
| 64 | - | SBoM.Cyclonedx.V14.ExternalReference.t() |
| 65 | - | SBoM.Cyclonedx.V15.ExternalReference.t() |
| 66 | - | SBoM.Cyclonedx.V16.ExternalReference.t() |
| 67 | - | SBoM.Cyclonedx.V17.ExternalReference.t() |
| 68 | - @type uuid() :: <<_::288>> |
| 30 | + SBoM.CycloneDX.V13.Classification.t() |
| 31 | + | SBoM.CycloneDX.V14.Classification.t() |
| 32 | + | SBoM.CycloneDX.V15.Classification.t() |
| 33 | + | SBoM.CycloneDX.V16.Classification.t() |
| 34 | + | SBoM.CycloneDX.V17.Classification.t() |
| 35 | + @typep dependency_list() :: [ |
| 36 | + SBoM.CycloneDX.V13.Dependency.t() |
| 37 | + | SBoM.CycloneDX.V14.Dependency.t() |
| 38 | + | SBoM.CycloneDX.V15.Dependency.t() |
| 39 | + | SBoM.CycloneDX.V16.Dependency.t() |
| 40 | + | SBoM.CycloneDX.V17.Dependency.t() |
| 41 | + ] |
| 42 | + @typep license_list() :: [ |
| 43 | + SBoM.CycloneDX.V13.LicenseChoice.t() |
| 44 | + | SBoM.CycloneDX.V14.LicenseChoice.t() |
| 45 | + | SBoM.CycloneDX.V15.LicenseChoice.t() |
| 46 | + | SBoM.CycloneDX.V16.LicenseChoice.t() |
| 47 | + | SBoM.CycloneDX.V17.LicenseChoice.t() |
| 48 | + ] |
| 49 | + @typep scope() :: |
| 50 | + SBoM.CycloneDX.V13.Scope.t() |
| 51 | + | SBoM.CycloneDX.V14.Scope.t() |
| 52 | + | SBoM.CycloneDX.V15.Scope.t() |
| 53 | + | SBoM.CycloneDX.V16.Scope.t() |
| 54 | + | SBoM.CycloneDX.V17.Scope.t() |
| 55 | + @typep metadata() :: |
| 56 | + SBoM.CycloneDX.V13.Metadata.t() |
| 57 | + | SBoM.CycloneDX.V14.Metadata.t() |
| 58 | + | SBoM.CycloneDX.V15.Metadata.t() |
| 59 | + | SBoM.CycloneDX.V16.Metadata.t() |
| 60 | + | SBoM.CycloneDX.V17.Metadata.t() |
| 61 | + @typep tool() :: |
| 62 | + SBoM.CycloneDX.V13.Tool.t() |
| 63 | + | SBoM.CycloneDX.V14.Tool.t() |
| 64 | + | SBoM.CycloneDX.V15.Tool.t() |
| 65 | + | SBoM.CycloneDX.V16.Tool.t() |
| 66 | + | SBoM.CycloneDX.V17.Tool.t() |
| 67 | + @typep external_reference() :: |
| 68 | + SBoM.CycloneDX.V13.ExternalReference.t() |
| 69 | + | SBoM.CycloneDX.V14.ExternalReference.t() |
| 70 | + | SBoM.CycloneDX.V15.ExternalReference.t() |
| 71 | + | SBoM.CycloneDX.V16.ExternalReference.t() |
| 72 | + | SBoM.CycloneDX.V17.ExternalReference.t() |
| 73 | + @typep uuid() :: <<_::288>> |
| 69 74 | |
| 70 75 | @version Mix.Project.config()[:version] |
| 71 76 | |
| 72 | - @spec empty(SBoM.CLI.schema_version()) :: t() |
| 77 | + @doc """ |
| 78 | + Create an empty BOM structure for the given schema version. |
| 79 | + """ |
| 80 | + @spec empty(schema_version()) :: t() |
| 73 81 | def empty(version \\ "1.7") do |
| 74 82 | bom_struct(:Bom, version, |
| 75 83 | spec_version: version, |
| @@ -88,8 +96,15 @@ defmodule SBoM.CycloneDX do | |
| 88 96 | classification: classification() |
| 89 97 | ] |
| 90 98 | |
| 91 | - @spec bom(components_map(), bom_opts()) :: t() |
| 92 | - def bom(components, opts \\ []) do |
| 99 | + @doc """ |
| 100 | + Generate a BOM for the current Mix project and its dependencies. |
| 101 | + """ |
| 102 | + @spec bom(bom_opts()) :: t() |
| 103 | + def bom(opts \\ []), do: bom_for_components(Fetcher.fetch(), opts) |
| 104 | + |
| 105 | + @doc false |
| 106 | + @spec bom_for_components(components_map(), bom_opts()) :: t() |
| 107 | + def bom_for_components(components, opts \\ []) do |
| 93 108 | version = Keyword.get(opts, :version, "1.7") |
| 94 109 | starting_bom = Keyword.get(opts, :starting_bom, empty(version)) |
| 95 110 | serial = Keyword.get(opts, :serial, urn_uuid()) |
| @@ -110,17 +125,14 @@ defmodule SBoM.CycloneDX do | |
| 110 125 | |> Map.put(:dependencies, attach_dependencies(filtered_components, version)) |
| 111 126 | end |
| 112 127 | |
| 113 | - @spec encode(t(), SBoM.CLI.format(), SBoM.CLI.pretty()) :: iodata() |
| 128 | + @doc "Encode a BOM" |
| 129 | + @spec encode(t(), format(), boolean()) :: iodata() |
| 114 130 | def encode(bom, type, pretty \\ false) |
| 115 131 | def encode(bom, :protobuf, _pretty), do: Protobuf.encode(bom) |
| 116 132 | def encode(bom, :json, pretty), do: JSON.encode(bom, pretty) |
| 117 133 | def encode(bom, :xml, pretty), do: XML.encode(bom, pretty) |
| 118 134 | |
| 119 | - @doc """ |
| 120 | - Decode a BOM from JSON format. |
| 121 | - |
| 122 | - Returns the parsed BOM struct based on the version found in the JSON. |
| 123 | - """ |
| 135 | + @doc "Decode a BOM" |
| 124 136 | @spec decode(String.t(), :json) :: t() |
| 125 137 | def decode(data, format) |
| 126 138 | def decode(data, :protobuf), do: Protobuf.decode(data) |
| @@ -159,7 +171,7 @@ defmodule SBoM.CycloneDX do | |
| 159 171 | Map.put(metadata, :timestamp, nil) |
| 160 172 | end |
| 161 173 | |
| 162 | - @spec attach_metadata(metadata(), SBoM.CLI.schema_version(), components_map(), classification()) :: |
| 174 | + @spec attach_metadata(metadata(), schema_version(), components_map(), classification()) :: |
| 163 175 | metadata() |
| 164 176 | defp attach_metadata(metadata, version, components, classification) |
| 165 177 | |
| @@ -195,9 +207,9 @@ defmodule SBoM.CycloneDX do | |
| 195 207 | @spec timestamp_now() :: Google.Protobuf.Timestamp.t() |
| 196 208 | defp timestamp_now, do: DateTime.utc_now() |> DateTime.truncate(:second) |> Google.Protobuf.from_datetime() |
| 197 209 | |
| 198 | - @spec root_component(components_map(), SBoM.CLI.schema_version(), classification()) :: |
| 199 | - {SBoM.Fetcher.app_name(), SBoM.Fetcher.dependency()} | nil |
| 200 | - def root_component(components, version, classification) do |
| 210 | + @spec root_component(components_map(), schema_version(), classification()) :: |
| 211 | + {Fetcher.app_name(), Fetcher.dependency()} | nil |
| 212 | + defp root_component(components, version, classification) do |
| 201 213 | components |
| 202 214 | |> Enum.find(&match?({_name, %{root: true}}, &1)) |
| 203 215 | |> case do |
| @@ -243,7 +255,7 @@ defmodule SBoM.CycloneDX do | |
| 243 255 | end) |
| 244 256 | end |
| 245 257 | |
| 246 | - @spec attach_components(components_map(), SBoM.CLI.schema_version()) :: [component()] |
| 258 | + @spec attach_components(components_map(), schema_version()) :: [component()] |
| 247 259 | defp attach_components(components, version) do |
| 248 260 | Enum.flat_map(components, fn |
| 249 261 | {_name, %{root: true}} -> |
| @@ -255,9 +267,9 @@ defmodule SBoM.CycloneDX do | |
| 255 267 | end |
| 256 268 | |
| 257 269 | @spec convert_component( |
| 258 | - SBoM.Fetcher.app_name(), |
| 259 | - SBoM.Fetcher.dependency(), |
| 260 | - SBoM.CLI.schema_version() |
| 270 | + Fetcher.app_name(), |
| 271 | + Fetcher.dependency(), |
| 272 | + schema_version() |
| 261 273 | ) :: struct() |
| 262 274 | defp convert_component(name, component, schema_version) do |
| 263 275 | source_url_reference = |
| @@ -308,7 +320,7 @@ defmodule SBoM.CycloneDX do | |
| 308 320 | |
| 309 321 | @spec source_url_reference( |
| 310 322 | source_url :: String.t(), |
| 311 | - SBoM.CLI.schema_version() |
| 323 | + schema_version() |
| 312 324 | ) :: external_reference() |
| 313 325 | defp source_url_reference(source_url, version) do |
| 314 326 | bom_struct(:ExternalReference, version, |
| @@ -318,8 +330,8 @@ defmodule SBoM.CycloneDX do | |
| 318 330 | end |
| 319 331 | |
| 320 332 | @spec asset_reference( |
| 321 | - component :: SBoM.Fetcher.dependency(), |
| 322 | - SBoM.CLI.schema_version() |
| 333 | + component :: Fetcher.dependency(), |
| 334 | + schema_version() |
| 323 335 | ) :: external_reference() | nil |
| 324 336 | defp asset_reference(component, version) |
| 325 337 | |
| @@ -338,7 +350,7 @@ defmodule SBoM.CycloneDX do | |
| 338 350 | |
| 339 351 | @spec links_references( |
| 340 352 | links :: %{optional(String.t()) => String.t()}, |
| 341 | - SBoM.CLI.schema_version() |
| 353 | + schema_version() |
| 342 354 | ) :: [external_reference()] |
| 343 355 | defp links_references(links, version) do |
| 344 356 | alias SBoM.Fetcher.Links |
| @@ -380,15 +392,12 @@ defmodule SBoM.CycloneDX do | |
| 380 392 | end) |
| 381 393 | end |
| 382 394 | |
| 383 | - @spec dependency_scope(SBoM.Fetcher.dependency()) :: scope() |
| 395 | + @spec dependency_scope(Fetcher.dependency()) :: scope() |
| 384 396 | defp dependency_scope(dependency) do |
| 385 397 | optional? = Map.get(dependency, :optional, false) |
| 386 398 | |
| 387 | - prod? = |
| 388 | - case Map.get(dependency, :only, []) do |
| 389 | - :* -> true |
| 390 | - only -> :prod in List.wrap(only) |
| 391 | - end |
| 399 | + only = Map.get(dependency, :only, [:*]) |
| 400 | + prod? = :prod in List.wrap(only) or :* in List.wrap(only) |
| 392 401 | |
| 393 402 | cond do |
| 394 403 | optional? -> |
| @@ -402,7 +411,7 @@ defmodule SBoM.CycloneDX do | |
| 402 411 | end |
| 403 412 | end |
| 404 413 | |
| 405 | - @spec convert_licenses([String.t()], SBoM.CLI.schema_version()) :: license_list() |
| 414 | + @spec convert_licenses([String.t()], schema_version()) :: license_list() |
| 406 415 | defp convert_licenses(licenses, version) do |
| 407 416 | Enum.map( |
| 408 417 | licenses, |
| @@ -410,7 +419,7 @@ defmodule SBoM.CycloneDX do | |
| 410 419 | ) |
| 411 420 | end |
| 412 421 | |
| 413 | - @spec attach_dependencies(components_map(), SBoM.CLI.schema_version()) :: dependency_list() |
| 422 | + @spec attach_dependencies(components_map(), schema_version()) :: dependency_list() |
| 414 423 | defp attach_dependencies(components, version) do |
| 415 424 | for {_name, component_data} <- components do |
| 416 425 | dependency_refs = |
| @@ -433,7 +442,7 @@ defmodule SBoM.CycloneDX do | |
| 433 442 | "otp:component:#{purl.name}:#{purl.type}:#{hash}" |
| 434 443 | end |
| 435 444 | |
| 436 | - @spec tool(SBoM.CLI.schema_version()) :: tool() | component() |
| 445 | + @spec tool(schema_version()) :: tool() | component() |
| 437 446 | defp tool(version) |
| 438 447 | |
| 439 448 | defp tool(version) when version in ["1.3", "1.4"] do |
| @@ -472,18 +481,20 @@ defmodule SBoM.CycloneDX do | |
| 472 481 | ) |
| 473 482 | end |
| 474 483 | |
| 475 | - @spec bom_struct(module(), SBoM.CLI.schema_version(), Keyword.t()) :: struct() |
| 484 | + @doc false |
| 485 | + @spec bom_struct(module(), schema_version(), Keyword.t()) :: struct() |
| 476 486 | defp bom_struct(module, version, attrs \\ []) |
| 477 487 | |
| 478 | - @spec bom_struct_module(module(), SBoM.CLI.schema_version()) :: module() |
| 488 | + @doc false |
| 489 | + @spec bom_struct_module(module(), schema_version()) :: module() |
| 479 490 | def bom_struct_module(module, version) |
| 480 491 | |
| 481 492 | for {schema_version, prefix} <- %{ |
| 482 | - "1.7" => SBoM.Cyclonedx.V17, |
| 483 | - "1.6" => SBoM.Cyclonedx.V16, |
| 484 | - "1.5" => SBoM.Cyclonedx.V15, |
| 485 | - "1.4" => SBoM.Cyclonedx.V14, |
| 486 | - "1.3" => SBoM.Cyclonedx.V13 |
| 493 | + "1.7" => SBoM.CycloneDX.V17, |
| 494 | + "1.6" => SBoM.CycloneDX.V16, |
| 495 | + "1.5" => SBoM.CycloneDX.V15, |
| 496 | + "1.4" => SBoM.CycloneDX.V14, |
| 497 | + "1.3" => SBoM.CycloneDX.V13 |
| 487 498 | } do |
| 488 499 | # Safe: Module.concat is called at compile time with well-known module names from a fixed map |
| 489 500 | # credo:disable-for-next-line Credo.Check.Warning.UnsafeToAtom |
| @@ -494,9 +505,10 @@ defmodule SBoM.CycloneDX do | |
| 494 505 | def bom_struct_module(module, unquote(schema_version)), do: Module.concat([unquote(prefix), module]) |
| 495 506 | end |
| 496 507 | |
| 497 | - @spec bom_struct_version(module()) :: SBoM.CLI.schema_version() |
| 508 | + @doc false |
| 509 | + @spec bom_struct_version(module()) :: schema_version() |
| 498 510 | def bom_struct_version(module) do |
| 499 | - ["SBoM", "Cyclonedx", "V" <> version | _rest] = Module.split(module) |
| 511 | + ["SBoM", "CycloneDX", "V" <> version | _rest] = Module.split(module) |
| 500 512 | |
| 501 513 | case version do |
| 502 514 | "13" -> "1.3" |
| @@ -507,7 +519,7 @@ defmodule SBoM.CycloneDX do | |
| 507 519 | end |
| 508 520 | end |
| 509 521 | |
| 510 | - @spec qualifiers_to_hashes(map(), SBoM.CLI.schema_version()) :: [struct()] |
| 522 | + @spec qualifiers_to_hashes(map(), schema_version()) :: [struct()] |
| 511 523 | defp qualifiers_to_hashes(%{"checksum" => "sha256:" <> hash}, version) do |
| 512 524 | [ |
| 513 525 | bom_struct(:Hash, version, |
| @@ -519,7 +531,7 @@ defmodule SBoM.CycloneDX do | |
| 519 531 | |
| 520 532 | defp qualifiers_to_hashes(_qualifiers, _version), do: [] |
| 521 533 | |
| 522 | - @spec component_version(SBoM.Fetcher.dependency(), SBoM.CLI.schema_version()) :: |
| 534 | + @spec component_version(Fetcher.dependency(), schema_version()) :: |
| 523 535 | String.t() | nil |
| 524 536 | defp component_version(component, schema_version) do |
| 525 537 | case schema_version do |
| @@ -5,32 +5,32 @@ defmodule SBoM.CycloneDX.Common.EnumHelpers do | |
| 5 5 | @moduledoc false |
| 6 6 | |
| 7 7 | @type hash_alg() :: |
| 8 | - SBoM.Cyclonedx.V13.HashAlg.t() |
| 9 | - | SBoM.Cyclonedx.V14.HashAlg.t() |
| 10 | - | SBoM.Cyclonedx.V15.HashAlg.t() |
| 11 | - | SBoM.Cyclonedx.V16.HashAlg.t() |
| 12 | - | SBoM.Cyclonedx.V17.HashAlg.t() |
| 8 | + SBoM.CycloneDX.V13.HashAlg.t() |
| 9 | + | SBoM.CycloneDX.V14.HashAlg.t() |
| 10 | + | SBoM.CycloneDX.V15.HashAlg.t() |
| 11 | + | SBoM.CycloneDX.V16.HashAlg.t() |
| 12 | + | SBoM.CycloneDX.V17.HashAlg.t() |
| 13 13 | |
| 14 14 | @type external_reference_type() :: |
| 15 | - SBoM.Cyclonedx.V13.ExternalReferenceType.t() |
| 16 | - | SBoM.Cyclonedx.V14.ExternalReferenceType.t() |
| 17 | - | SBoM.Cyclonedx.V15.ExternalReferenceType.t() |
| 18 | - | SBoM.Cyclonedx.V16.ExternalReferenceType.t() |
| 19 | - | SBoM.Cyclonedx.V17.ExternalReferenceType.t() |
| 15 | + SBoM.CycloneDX.V13.ExternalReferenceType.t() |
| 16 | + | SBoM.CycloneDX.V14.ExternalReferenceType.t() |
| 17 | + | SBoM.CycloneDX.V15.ExternalReferenceType.t() |
| 18 | + | SBoM.CycloneDX.V16.ExternalReferenceType.t() |
| 19 | + | SBoM.CycloneDX.V17.ExternalReferenceType.t() |
| 20 20 | |
| 21 21 | @type classification() :: |
| 22 | - SBoM.Cyclonedx.V13.Classification.t() |
| 23 | - | SBoM.Cyclonedx.V14.Classification.t() |
| 24 | - | SBoM.Cyclonedx.V15.Classification.t() |
| 25 | - | SBoM.Cyclonedx.V16.Classification.t() |
| 26 | - | SBoM.Cyclonedx.V17.Classification.t() |
| 22 | + SBoM.CycloneDX.V13.Classification.t() |
| 23 | + | SBoM.CycloneDX.V14.Classification.t() |
| 24 | + | SBoM.CycloneDX.V15.Classification.t() |
| 25 | + | SBoM.CycloneDX.V16.Classification.t() |
| 26 | + | SBoM.CycloneDX.V17.Classification.t() |
| 27 27 | |
| 28 28 | @type scope() :: |
| 29 | - SBoM.Cyclonedx.V13.Scope.t() |
| 30 | - | SBoM.Cyclonedx.V14.Scope.t() |
| 31 | - | SBoM.Cyclonedx.V15.Scope.t() |
| 32 | - | SBoM.Cyclonedx.V16.Scope.t() |
| 33 | - | SBoM.Cyclonedx.V17.Scope.t() |
| 29 | + SBoM.CycloneDX.V13.Scope.t() |
| 30 | + | SBoM.CycloneDX.V14.Scope.t() |
| 31 | + | SBoM.CycloneDX.V15.Scope.t() |
| 32 | + | SBoM.CycloneDX.V16.Scope.t() |
| 33 | + | SBoM.CycloneDX.V17.Scope.t() |
| 34 34 | |
| 35 35 | @hash_alg_mappings %{ |
| 36 36 | HASH_ALG_NULL: "", |
| @@ -289,11 +289,11 @@ end | |
| 289 289 | |
| 290 290 | defimpl SBoM.CycloneDX.JSON.Decodable, |
| 291 291 | for: [ |
| 292 | - SBoM.Cyclonedx.V17.Component, |
| 293 | - SBoM.Cyclonedx.V16.Component, |
| 294 | - SBoM.Cyclonedx.V15.Component, |
| 295 | - SBoM.Cyclonedx.V14.Component, |
| 296 | - SBoM.Cyclonedx.V13.Component |
| 292 | + SBoM.CycloneDX.V17.Component, |
| 293 | + SBoM.CycloneDX.V16.Component, |
| 294 | + SBoM.CycloneDX.V15.Component, |
| 295 | + SBoM.CycloneDX.V14.Component, |
| 296 | + SBoM.CycloneDX.V13.Component |
| 297 297 | ] do |
| 298 298 | alias SBoM.CycloneDX.Common.EnumHelpers |
| 299 299 | alias SBoM.CycloneDX.JSON.Decoder |
| @@ -340,11 +340,11 @@ end | |
| 340 340 | |
| 341 341 | defimpl SBoM.CycloneDX.JSON.Decodable, |
| 342 342 | for: [ |
| 343 | - SBoM.Cyclonedx.V17.Hash, |
| 344 | - SBoM.Cyclonedx.V16.Hash, |
| 345 | - SBoM.Cyclonedx.V15.Hash, |
| 346 | - SBoM.Cyclonedx.V14.Hash, |
| 347 | - SBoM.Cyclonedx.V13.Hash |
| 343 | + SBoM.CycloneDX.V17.Hash, |
| 344 | + SBoM.CycloneDX.V16.Hash, |
| 345 | + SBoM.CycloneDX.V15.Hash, |
| 346 | + SBoM.CycloneDX.V14.Hash, |
| 347 | + SBoM.CycloneDX.V13.Hash |
| 348 348 | ] do |
| 349 349 | alias SBoM.CycloneDX.Common.EnumHelpers |
| 350 350 | alias SBoM.CycloneDX.JSON.Decoder |
| @@ -380,11 +380,11 @@ end | |
| 380 380 | |
| 381 381 | defimpl SBoM.CycloneDX.JSON.Decodable, |
| 382 382 | for: [ |
| 383 | - SBoM.Cyclonedx.V17.ExternalReference, |
| 384 | - SBoM.Cyclonedx.V16.ExternalReference, |
| 385 | - SBoM.Cyclonedx.V15.ExternalReference, |
| 386 | - SBoM.Cyclonedx.V14.ExternalReference, |
| 387 | - SBoM.Cyclonedx.V13.ExternalReference |
| 383 | + SBoM.CycloneDX.V17.ExternalReference, |
| 384 | + SBoM.CycloneDX.V16.ExternalReference, |
| 385 | + SBoM.CycloneDX.V15.ExternalReference, |
| 386 | + SBoM.CycloneDX.V14.ExternalReference, |
| 387 | + SBoM.CycloneDX.V13.ExternalReference |
| 388 388 | ] do |
| 389 389 | alias SBoM.CycloneDX.Common.EnumHelpers |
| 390 390 | alias SBoM.CycloneDX.JSON.Decoder |
| @@ -409,11 +409,11 @@ end | |
| 409 409 | |
| 410 410 | defimpl SBoM.CycloneDX.JSON.Decodable, |
| 411 411 | for: [ |
| 412 | - SBoM.Cyclonedx.V17.Dependency, |
| 413 | - SBoM.Cyclonedx.V16.Dependency, |
| 414 | - SBoM.Cyclonedx.V15.Dependency, |
| 415 | - SBoM.Cyclonedx.V14.Dependency, |
| 416 | - SBoM.Cyclonedx.V13.Dependency |
| 412 | + SBoM.CycloneDX.V17.Dependency, |
| 413 | + SBoM.CycloneDX.V16.Dependency, |
| 414 | + SBoM.CycloneDX.V15.Dependency, |
| 415 | + SBoM.CycloneDX.V14.Dependency, |
| 416 | + SBoM.CycloneDX.V13.Dependency |
| 417 417 | ] do |
| 418 418 | alias SBoM.CycloneDX.JSON.Decoder |
Loading more files…