Class: Bibliothecary::MultiParsers::CycloneDX::ManifestEntries

Inherits:
Object
  • Object
show all
Defined in:
lib/bibliothecary/multi_parsers/cyclonedx.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(parse_queue:) ⇒ ManifestEntries

Returns a new instance of ManifestEntries.



22
23
24
25
26
27
28
29
# File 'lib/bibliothecary/multi_parsers/cyclonedx.rb', line 22

def initialize(parse_queue:)
  @manifests = {}

  # Instead of recursing, we'll work through a queue of components
  # to process, letting the different parser add components to the
  # queue however they need to  pull them from the source document.
  @parse_queue = parse_queue.dup
end

Instance Attribute Details

#manifestsObject (readonly)

Returns the value of attribute manifests.



20
21
22
# File 'lib/bibliothecary/multi_parsers/cyclonedx.rb', line 20

def manifests
  @manifests
end

Class Method Details

.full_name_for_purl(purl) ⇒ String

Returns The properly namespaced package name.

Returns:

  • (String)

    The properly namespaced package name



65
66
67
68
69
70
71
72
73
74
# File 'lib/bibliothecary/multi_parsers/cyclonedx.rb', line 65

def self.full_name_for_purl(purl)
  parts = [purl.namespace, purl.name].compact

  case purl.type
  when "maven"
    parts.join(":")
  else
    parts.join("/")
  end
end

Instance Method Details

#<<(purl) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
# File 'lib/bibliothecary/multi_parsers/cyclonedx.rb', line 31

def <<(purl)
  mapping = Bibliothecary::PURL_TYPE_MAPPING[purl.type]
  return unless mapping

  @manifests[mapping] ||= Set.new
  @manifests[mapping] << {
    name: self.class.full_name_for_purl(purl),
    requirement: purl.version,
    type: "lockfile",
  }
end

#[](key) ⇒ Object



60
61
62
# File 'lib/bibliothecary/multi_parsers/cyclonedx.rb', line 60

def [](key)
  @manifests[key]&.to_a
end

#parse!(&block) ⇒ Object

Iterates over each manifest entry in the parse_queue, and accepts a block which will be called on each component. The block has two jobs: 1) add more sub-components to parse (if they exist), and 2) return the components purl.



46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/bibliothecary/multi_parsers/cyclonedx.rb', line 46

def parse!(&block)
  while @parse_queue.length > 0
    component = @parse_queue.shift

    purl_text = block.call(component, @parse_queue)

    next unless purl_text

    purl = PackageURL.parse(purl_text)

    self << purl
  end
end