bibliothecary 8.0.0 → 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 50ba5ddf48a3b7d1051272fef2bcef8ca7bca465b13e251fe9656ae8751f1353
4
- data.tar.gz: 40b88cb18308c0d624f00eedb67d1a5a946e42d2f3e242436fa376dd54b2c55a
3
+ metadata.gz: 7ed029f460ea32073ccc2d06f6fb297926686064554b1447a7014ff8588382f1
4
+ data.tar.gz: 70482eb3f0cfe7afb13124904b1e713596d92e92d90cd6267153ff4319e9d356
5
5
  SHA512:
6
- metadata.gz: 51675c6be455da5a996fe92f703245aac5f3a148eb65aed33bc48675e1a94677da65e3de1651d28cc511391d241e44bc774b287ff6ae2b27d7494037389f0391
7
- data.tar.gz: 74ceaa45f07deaa972be3a50e5da4e91b2507be75f6a8cf7b46cd8c02319690063e4a6f52f394fafe918debba2af765efceb13e78195de8a827997a343b8128c
6
+ metadata.gz: b8a243cb926cf8e49835f11db86199f8fe8d45dc53b1f80a17c9b3c941bb5935e4c8b8c1a897b40704d8c6c3ddc271fd5d3139aa9373a8328eea3a538c383fac
7
+ data.tar.gz: d6dd8f873e0ce3cabf3f526e4e50393c36c1e3c6aacb7b1581bc7720bc022670ecd0cc96114df8d3dcc561341e3ee920d401a578eaf7fe5b066f64a33306d730
@@ -39,8 +39,13 @@ module Bibliothecary
39
39
 
40
40
  attr_reader :manifests
41
41
 
42
- def initialize
42
+ def initialize(parse_queue:)
43
43
  @manifests = {}
44
+
45
+ # Instead of recursing, we'll work through a queue of components
46
+ # to process, letting the different parser add components to the
47
+ # queue however they need to pull them from the source document.
48
+ @parse_queue = parse_queue
44
49
  end
45
50
 
46
51
  def <<(purl)
@@ -55,6 +60,23 @@ module Bibliothecary
55
60
  }
56
61
  end
57
62
 
63
+ # Iterates over each manifest entry in the parse_queue, and accepts a block which will
64
+ # be called on each component. The block has two jobs: 1) add more sub-components
65
+ # to parse (if they exist), and 2) return the components purl.
66
+ def parse!(&block)
67
+ while @parse_queue.length > 0
68
+ component = @parse_queue.shift
69
+
70
+ purl_text = block.call(component, @parse_queue)
71
+
72
+ next unless purl_text
73
+
74
+ purl = PackageURL.parse(purl_text)
75
+
76
+ self << purl
77
+ end
78
+ end
79
+
58
80
  def [](key)
59
81
  @manifests[key]&.to_a
60
82
  end
@@ -94,14 +116,12 @@ module Bibliothecary
94
116
 
95
117
  raise NoComponents unless manifest["components"]
96
118
 
97
- entries = ManifestEntries.new
98
-
99
- manifest["components"].each_with_object(entries) do |component, obj|
100
- next unless component["purl"]
119
+ entries = ManifestEntries.new(parse_queue: manifest["components"])
101
120
 
102
- purl = PackageURL.parse(component["purl"])
121
+ entries.parse! do |component, parse_queue|
122
+ parse_queue.concat(component["components"]) if component["components"]
103
123
 
104
- obj << purl
124
+ component["purl"]
105
125
  end
106
126
 
107
127
  entries[platform_name.to_sym]
@@ -119,16 +139,14 @@ module Bibliothecary
119
139
 
120
140
  raise NoComponents unless root.locate('components').first
121
141
 
122
- entries = ManifestEntries.new
123
-
124
- root.locate('components/*').each_with_object(entries) do |component, obj|
125
- purl_node = component.locate("purl").first
126
-
127
- next unless purl_node
142
+ entries = ManifestEntries.new(parse_queue: root.locate('components/*'))
128
143
 
129
- purl = PackageURL.parse(purl_node.text)
144
+ entries.parse! do |component, parse_queue|
145
+ # #locate returns an empty array if nothing is found, so we can
146
+ # always safely concatenate it to the parse queue.
147
+ parse_queue.concat(component.locate('components/*'))
130
148
 
131
- obj << purl
149
+ component.locate("purl").first&.text
132
150
  end
133
151
 
134
152
  entries[platform_name.to_sym]
@@ -1,3 +1,3 @@
1
1
  module Bibliothecary
2
- VERSION = "8.0.0"
2
+ VERSION = "8.1.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bibliothecary
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.0.0
4
+ version: 8.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Nesbitt
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-04-25 00:00:00.000000000 Z
11
+ date: 2022-04-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: tomlrb