cyclonedx-ruby 1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 789745148f02bbf9096f4cff69edd4bc685002a18963bc2aa884c8e9672ec20b
4
+ data.tar.gz: 60c926690951432f792e56ae26bbf0bcae47d79e2d080824b8a082a356743c27
5
+ SHA512:
6
+ metadata.gz: 8f0b8e63d08b95c7a38faba23724bcad4767fdfd825088e9854ac33b1482d646834ff4fe5f1f6e891e852384293853a4b3d4a242950921df4ffa5451a46e537b
7
+ data.tar.gz: 19da07694e83e5ce056cfce3a35dc511dfae41969ff3ad443168ba38a40779f010b13998b72bd5f8bf3cce7fb51bfa0b26b930acb96ff45fa3e1836e2afef562
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bom_builder'
4
+ Bombuilder.build(ARGV[0])
@@ -0,0 +1,145 @@
1
+ require "bundler"
2
+ require "fileutils"
3
+ require "json"
4
+ require "logger"
5
+ require "nokogiri"
6
+ require "optparse"
7
+ require "ostruct"
8
+ require "rest_client"
9
+ require 'securerandom'
10
+ require_relative "bom_helpers"
11
+
12
+ class Bombuilder
13
+ def self.build(path)
14
+ original_working_directory = Dir.pwd
15
+ setup(path)
16
+ specs_list
17
+ bom = build_bom(@gems)
18
+
19
+ begin
20
+ @logger.info("Changing directory to the original working directory located at #{original_working_directory}")
21
+ Dir.chdir original_working_directory
22
+ rescue => e
23
+ @logger.error("Unable to change directory the original working directory located at #{original_working_directory}. #{e.message}: #{e.backtrace.join('\n')}")
24
+ abort
25
+ end
26
+
27
+ bom_directory = File.dirname(@bom_file_path)
28
+ begin
29
+ FileUtils.mkdir_p(bom_directory) unless File.directory?(bom_directory)
30
+ rescue => e
31
+ @logger.error("Unable to create the directory to hold the BOM output at #{@bom_directory}. #{e.message}: #{e.backtrace.join('\n')}")
32
+ abort
33
+ end
34
+
35
+ begin
36
+ @logger.info("Writing BOM to #{@bom_file_path}...")
37
+ File.open(@bom_file_path, "w") {|file| file.write(bom)}
38
+
39
+ if @options[:verbose]
40
+ @logger.info("#{@gems.size} gems were written to BOM located at #{@bom_file_path}")
41
+ else
42
+ puts "#{@gems.size} gems were written to BOM located at #{@bom_file_path}"
43
+ end
44
+ rescue => e
45
+ @logger.error("Unable to write BOM to #{@bom_file_path}. #{e.message}: #{e.backtrace.join('\n')}")
46
+ abort
47
+ end
48
+ end
49
+ private
50
+ def self.setup(path)
51
+ @options = {}
52
+ OptionParser.new do |opts|
53
+ opts.banner = "Usage: cyclonedx-ruby [options]"
54
+
55
+ opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
56
+ @options[:verbose] = v
57
+ end
58
+ opts.on("-p", "--path path", "(Required) Path to Ruby project directory") do |path|
59
+ @options[:path] = path
60
+ end
61
+ opts.on("-o", "--output bom_file_path", "(Optional) Path to output the bom.xml file to") do |bom_file_path|
62
+ @options[:bom_file_path] = bom_file_path
63
+ end
64
+ opts.on_tail("-h", "--help", "Show help message") do
65
+ puts opts
66
+ exit
67
+ end
68
+ end.parse!
69
+
70
+ @logger = Logger.new(STDOUT)
71
+ if @options[:verbose]
72
+ @logger.level = Logger::INFO
73
+ else
74
+ @logger.level = Logger::ERROR
75
+ end
76
+
77
+ @gems = []
78
+ licenses_file = File.read "#{__dir__}/licenses.json"
79
+ @licenses_list = JSON.parse(licenses_file)
80
+
81
+ if @options[:path].nil?
82
+ @logger.error("missing path to project directory")
83
+ abort
84
+ end
85
+
86
+ if !File.directory?(@options[:path])
87
+ @logger.error("path provided is not a valid directory. path provided was: #{@options[:path]}")
88
+ abort
89
+ end
90
+
91
+ begin
92
+ @logger.info("Changing directory to Ruby project directory located at #{@options[:path]}")
93
+ Dir.chdir @options[:path]
94
+ rescue => e
95
+ @logger.error("Unable to change directory to Ruby project directory located at #{@options[:path]}. #{e.message}: #{e.backtrace.join('\n')}")
96
+ abort
97
+ end
98
+
99
+ if @options[:bom_file_path].nil?
100
+ @bom_file_path = "./bom.xml"
101
+ else
102
+ @bom_file_path = @options[:bom_file_path]
103
+ end
104
+
105
+ @logger.info("BOM will be written to #{@bom_file_path}")
106
+
107
+ begin
108
+ gemfile_path = @options[:path] + "/" + "Gemfile.lock"
109
+ @logger.info("Parsing specs from #{gemfile_path}...")
110
+ gemfile_contents = File.read(gemfile_path)
111
+ @specs = Bundler::LockfileParser.new(gemfile_contents).specs
112
+ @logger.info("Specs successfully parsed!")
113
+ rescue => e
114
+ @logger.error("Unable to parse specs from #{gemfile_path}. #{e.message}: #{e.backtrace.join('\n')}")
115
+ abort
116
+ end
117
+ end
118
+
119
+ def self.specs_list
120
+ count = 0
121
+ @specs.each do |dependency|
122
+ object = OpenStruct.new
123
+ object.name = dependency.name
124
+ object.version = dependency.version
125
+ object.purl = purl(object.name, object.version)
126
+ gem = get_gem(object.name, object.version)
127
+ next if gem.nil?
128
+
129
+ if gem["licenses"] and gem["licenses"].length > 0
130
+ if @licenses_list.include? gem["licenses"].first
131
+ object.license_id = gem["licenses"].first
132
+ else
133
+ object.license_name = gem["licenses"].first
134
+ end
135
+ end
136
+
137
+ object.author = gem["authors"]
138
+ object.description = gem["summary"]
139
+ object.hash = gem["sha"]
140
+ @gems.push(object)
141
+ count += 1
142
+ @logger.info("#{object.name}:#{object.version} gem added")
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,54 @@
1
+ def purl(name, version)
2
+ purl = "pkg:gem/" + name + "@" + version.to_s
3
+ end
4
+
5
+ def random_urn_uuid()
6
+ random_urn_uuid = "urn:uuid:" + SecureRandom.uuid
7
+ end
8
+
9
+ def build_bom(gems)
10
+ builder = Nokogiri::XML::Builder.new(:encoding => "UTF-8") do |xml|
11
+ attributes = {"xmlns" => "http://cyclonedx.org/schema/bom/1.1", "version" => "1", "serialNumber" => random_urn_uuid}
12
+ xml.bom(attributes) do
13
+ xml.components {
14
+ gems.each do |gem|
15
+ xml.component("type" => "library") {
16
+ xml.name gem["name"]
17
+ xml.version gem["version"]
18
+ xml.description gem["description"]
19
+ xml.hashes{
20
+ xml.hash_ gem["hash"], :alg => "SHA-256"
21
+ }
22
+ if gem["license_id"]
23
+ xml.licenses {
24
+ xml.license{
25
+ xml.id gem["license_id"]
26
+ }
27
+ }
28
+ elsif gem["license_name"]
29
+ xml.licenses {
30
+ xml.license{
31
+ xml.name gem["license_name"]
32
+ }
33
+ }
34
+ end
35
+ xml.purl gem["purl"]
36
+ }
37
+ end
38
+ }
39
+ end
40
+ end
41
+ builder.to_xml
42
+ end
43
+
44
+ def get_gem(name, version)
45
+ url = "https://rubygems.org/api/v1/versions/#{name}.json"
46
+ begin
47
+ response = RestClient.get(url)
48
+ body = JSON.parse(response.body)
49
+ body.select {|item| item["number"] == version.to_s}.first
50
+ rescue
51
+ @logger.warn("#{name} couldn't be fetched")
52
+ return nil
53
+ end
54
+ end
data/lib/licenses.json ADDED
@@ -0,0 +1,434 @@
1
+ [
2
+ "0BSD",
3
+ "AAL",
4
+ "ADSL",
5
+ "AFL-1.1",
6
+ "AFL-1.2",
7
+ "AFL-2.0",
8
+ "AFL-2.1",
9
+ "AFL-3.0",
10
+ "AGPL-1.0",
11
+ "AGPL-1.0-only",
12
+ "AGPL-1.0-or-later",
13
+ "AGPL-3.0",
14
+ "AGPL-3.0-only",
15
+ "AGPL-3.0-or-later",
16
+ "AMDPLPA",
17
+ "AML",
18
+ "AMPAS",
19
+ "ANTLR-PD",
20
+ "APAFML",
21
+ "APL-1.0",
22
+ "APSL-1.0",
23
+ "APSL-1.1",
24
+ "APSL-1.2",
25
+ "APSL-2.0",
26
+ "Abstyles",
27
+ "Adobe-2006",
28
+ "Adobe-Glyph",
29
+ "Afmparse",
30
+ "Aladdin",
31
+ "Apache-1.0",
32
+ "Apache-1.1",
33
+ "Apache-2.0",
34
+ "Artistic-1.0",
35
+ "Artistic-1.0-Perl",
36
+ "Artistic-1.0-cl8",
37
+ "Artistic-2.0",
38
+ "BSD-1-Clause",
39
+ "BSD-2-Clause",
40
+ "BSD-2-Clause-FreeBSD",
41
+ "BSD-2-Clause-NetBSD",
42
+ "BSD-2-Clause-Patent",
43
+ "BSD-3-Clause",
44
+ "BSD-3-Clause-Attribution",
45
+ "BSD-3-Clause-Clear",
46
+ "BSD-3-Clause-LBNL",
47
+ "BSD-3-Clause-No-Nuclear-License",
48
+ "BSD-3-Clause-No-Nuclear-License-2014",
49
+ "BSD-3-Clause-No-Nuclear-Warranty",
50
+ "BSD-3-Clause-Open-MPI",
51
+ "BSD-4-Clause",
52
+ "BSD-4-Clause-UC",
53
+ "BSD-Protection",
54
+ "BSD-Source-Code",
55
+ "BSL-1.0",
56
+ "Bahyph",
57
+ "Barr",
58
+ "Beerware",
59
+ "BitTorrent-1.0",
60
+ "BitTorrent-1.1",
61
+ "BlueOak-1.0.0",
62
+ "Borceux",
63
+ "CATOSL-1.1",
64
+ "CC-BY-1.0",
65
+ "CC-BY-2.0",
66
+ "CC-BY-2.5",
67
+ "CC-BY-3.0",
68
+ "CC-BY-4.0",
69
+ "CC-BY-NC-1.0",
70
+ "CC-BY-NC-2.0",
71
+ "CC-BY-NC-2.5",
72
+ "CC-BY-NC-3.0",
73
+ "CC-BY-NC-4.0",
74
+ "CC-BY-NC-ND-1.0",
75
+ "CC-BY-NC-ND-2.0",
76
+ "CC-BY-NC-ND-2.5",
77
+ "CC-BY-NC-ND-3.0",
78
+ "CC-BY-NC-ND-4.0",
79
+ "CC-BY-NC-SA-1.0",
80
+ "CC-BY-NC-SA-2.0",
81
+ "CC-BY-NC-SA-2.5",
82
+ "CC-BY-NC-SA-3.0",
83
+ "CC-BY-NC-SA-4.0",
84
+ "CC-BY-ND-1.0",
85
+ "CC-BY-ND-2.0",
86
+ "CC-BY-ND-2.5",
87
+ "CC-BY-ND-3.0",
88
+ "CC-BY-ND-4.0",
89
+ "CC-BY-SA-1.0",
90
+ "CC-BY-SA-2.0",
91
+ "CC-BY-SA-2.5",
92
+ "CC-BY-SA-3.0",
93
+ "CC-BY-SA-4.0",
94
+ "CC-PDDC",
95
+ "CC0-1.0",
96
+ "CDDL-1.0",
97
+ "CDDL-1.1",
98
+ "CDLA-Permissive-1.0",
99
+ "CDLA-Sharing-1.0",
100
+ "CECILL-1.0",
101
+ "CECILL-1.1",
102
+ "CECILL-2.0",
103
+ "CECILL-2.1",
104
+ "CECILL-B",
105
+ "CECILL-C",
106
+ "CERN-OHL-1.1",
107
+ "CERN-OHL-1.2",
108
+ "CNRI-Jython",
109
+ "CNRI-Python",
110
+ "CNRI-Python-GPL-Compatible",
111
+ "CPAL-1.0",
112
+ "CPL-1.0",
113
+ "CPOL-1.02",
114
+ "CUA-OPL-1.0",
115
+ "Caldera",
116
+ "ClArtistic",
117
+ "Condor-1.1",
118
+ "Crossword",
119
+ "CrystalStacker",
120
+ "Cube",
121
+ "D-FSL-1.0",
122
+ "DOC",
123
+ "DSDP",
124
+ "Dotseqn",
125
+ "ECL-1.0",
126
+ "ECL-2.0",
127
+ "EFL-1.0",
128
+ "EFL-2.0",
129
+ "EPL-1.0",
130
+ "EPL-2.0",
131
+ "EUDatagrid",
132
+ "EUPL-1.0",
133
+ "EUPL-1.1",
134
+ "EUPL-1.2",
135
+ "Entessa",
136
+ "ErlPL-1.1",
137
+ "Eurosym",
138
+ "FSFAP",
139
+ "FSFUL",
140
+ "FSFULLR",
141
+ "FTL",
142
+ "Fair",
143
+ "Frameworx-1.0",
144
+ "FreeImage",
145
+ "GFDL-1.1",
146
+ "GFDL-1.1-only",
147
+ "GFDL-1.1-or-later",
148
+ "GFDL-1.2",
149
+ "GFDL-1.2-only",
150
+ "GFDL-1.2-or-later",
151
+ "GFDL-1.3",
152
+ "GFDL-1.3-only",
153
+ "GFDL-1.3-or-later",
154
+ "GL2PS",
155
+ "GPL-1.0",
156
+ "GPL-1.0+",
157
+ "GPL-1.0-only",
158
+ "GPL-1.0-or-later",
159
+ "GPL-2.0",
160
+ "GPL-2.0+",
161
+ "GPL-2.0-only",
162
+ "GPL-2.0-or-later",
163
+ "GPL-2.0-with-GCC-exception",
164
+ "GPL-2.0-with-autoconf-exception",
165
+ "GPL-2.0-with-bison-exception",
166
+ "GPL-2.0-with-classpath-exception",
167
+ "GPL-2.0-with-font-exception",
168
+ "GPL-3.0",
169
+ "GPL-3.0+",
170
+ "GPL-3.0-only",
171
+ "GPL-3.0-or-later",
172
+ "GPL-3.0-with-GCC-exception",
173
+ "GPL-3.0-with-autoconf-exception",
174
+ "Giftware",
175
+ "Glide",
176
+ "Glulxe",
177
+ "HPND",
178
+ "HPND-sell-variant",
179
+ "HaskellReport",
180
+ "IBM-pibs",
181
+ "ICU",
182
+ "IJG",
183
+ "IPA",
184
+ "IPL-1.0",
185
+ "ISC",
186
+ "ImageMagick",
187
+ "Imlib2",
188
+ "Info-ZIP",
189
+ "Intel",
190
+ "Intel-ACPI",
191
+ "Interbase-1.0",
192
+ "JPNIC",
193
+ "JSON",
194
+ "JasPer-2.0",
195
+ "LAL-1.2",
196
+ "LAL-1.3",
197
+ "LGPL-2.0",
198
+ "LGPL-2.0+",
199
+ "LGPL-2.0-only",
200
+ "LGPL-2.0-or-later",
201
+ "LGPL-2.1",
202
+ "LGPL-2.1+",
203
+ "LGPL-2.1-only",
204
+ "LGPL-2.1-or-later",
205
+ "LGPL-3.0",
206
+ "LGPL-3.0+",
207
+ "LGPL-3.0-only",
208
+ "LGPL-3.0-or-later",
209
+ "LGPLLR",
210
+ "LPL-1.0",
211
+ "LPL-1.02",
212
+ "LPPL-1.0",
213
+ "LPPL-1.1",
214
+ "LPPL-1.2",
215
+ "LPPL-1.3a",
216
+ "LPPL-1.3c",
217
+ "Latex2e",
218
+ "Leptonica",
219
+ "LiLiQ-P-1.1",
220
+ "LiLiQ-R-1.1",
221
+ "LiLiQ-Rplus-1.1",
222
+ "Libpng",
223
+ "Linux-OpenIB",
224
+ "MIT",
225
+ "MIT-0",
226
+ "MIT-CMU",
227
+ "MIT-advertising",
228
+ "MIT-enna",
229
+ "MIT-feh",
230
+ "MITNFA",
231
+ "MPL-1.0",
232
+ "MPL-1.1",
233
+ "MPL-2.0",
234
+ "MPL-2.0-no-copyleft-exception",
235
+ "MS-PL",
236
+ "MS-RL",
237
+ "MTLL",
238
+ "MakeIndex",
239
+ "MirOS",
240
+ "Motosoto",
241
+ "Multics",
242
+ "Mup",
243
+ "NASA-1.3",
244
+ "NBPL-1.0",
245
+ "NCSA",
246
+ "NGPL",
247
+ "NLOD-1.0",
248
+ "NLPL",
249
+ "NOSL",
250
+ "NPL-1.0",
251
+ "NPL-1.1",
252
+ "NPOSL-3.0",
253
+ "NRL",
254
+ "NTP",
255
+ "Naumen",
256
+ "Net-SNMP",
257
+ "NetCDF",
258
+ "Newsletr",
259
+ "Nokia",
260
+ "Noweb",
261
+ "Nunit",
262
+ "OCCT-PL",
263
+ "OCLC-2.0",
264
+ "ODC-By-1.0",
265
+ "ODbL-1.0",
266
+ "OFL-1.0",
267
+ "OFL-1.1",
268
+ "OGL-UK-1.0",
269
+ "OGL-UK-2.0",
270
+ "OGL-UK-3.0",
271
+ "OGTSL",
272
+ "OLDAP-1.1",
273
+ "OLDAP-1.2",
274
+ "OLDAP-1.3",
275
+ "OLDAP-1.4",
276
+ "OLDAP-2.0",
277
+ "OLDAP-2.0.1",
278
+ "OLDAP-2.1",
279
+ "OLDAP-2.2",
280
+ "OLDAP-2.2.1",
281
+ "OLDAP-2.2.2",
282
+ "OLDAP-2.3",
283
+ "OLDAP-2.4",
284
+ "OLDAP-2.5",
285
+ "OLDAP-2.6",
286
+ "OLDAP-2.7",
287
+ "OLDAP-2.8",
288
+ "OML",
289
+ "OPL-1.0",
290
+ "OSET-PL-2.1",
291
+ "OSL-1.0",
292
+ "OSL-1.1",
293
+ "OSL-2.0",
294
+ "OSL-2.1",
295
+ "OSL-3.0",
296
+ "OpenSSL",
297
+ "PDDL-1.0",
298
+ "PHP-3.0",
299
+ "PHP-3.01",
300
+ "Parity-6.0.0",
301
+ "Plexus",
302
+ "PostgreSQL",
303
+ "Python-2.0",
304
+ "QPL-1.0",
305
+ "Qhull",
306
+ "RHeCos-1.1",
307
+ "RPL-1.1",
308
+ "RPL-1.5",
309
+ "RPSL-1.0",
310
+ "RSA-MD",
311
+ "RSCPL",
312
+ "Rdisc",
313
+ "Ruby",
314
+ "SAX-PD",
315
+ "SCEA",
316
+ "SGI-B-1.0",
317
+ "SGI-B-1.1",
318
+ "SGI-B-2.0",
319
+ "SHL-0.5",
320
+ "SHL-0.51",
321
+ "SISSL",
322
+ "SISSL-1.2",
323
+ "SMLNJ",
324
+ "SMPPL",
325
+ "SNIA",
326
+ "SPL-1.0",
327
+ "SSPL-1.0",
328
+ "SWL",
329
+ "Saxpath",
330
+ "Sendmail",
331
+ "Sendmail-8.23",
332
+ "SimPL-2.0",
333
+ "Sleepycat",
334
+ "Spencer-86",
335
+ "Spencer-94",
336
+ "Spencer-99",
337
+ "StandardML-NJ",
338
+ "SugarCRM-1.1.3",
339
+ "TAPR-OHL-1.0",
340
+ "TCL",
341
+ "TCP-wrappers",
342
+ "TMate",
343
+ "TORQUE-1.1",
344
+ "TOSL",
345
+ "TU-Berlin-1.0",
346
+ "TU-Berlin-2.0",
347
+ "UPL-1.0",
348
+ "Unicode-DFS-2015",
349
+ "Unicode-DFS-2016",
350
+ "Unicode-TOU",
351
+ "Unlicense",
352
+ "VOSTROM",
353
+ "VSL-1.0",
354
+ "Vim",
355
+ "W3C",
356
+ "W3C-19980720",
357
+ "W3C-20150513",
358
+ "WTFPL",
359
+ "Watcom-1.0",
360
+ "Wsuipa",
361
+ "X11",
362
+ "XFree86-1.1",
363
+ "XSkat",
364
+ "Xerox",
365
+ "Xnet",
366
+ "YPL-1.0",
367
+ "YPL-1.1",
368
+ "ZPL-1.1",
369
+ "ZPL-2.0",
370
+ "ZPL-2.1",
371
+ "Zed",
372
+ "Zend-2.0",
373
+ "Zimbra-1.3",
374
+ "Zimbra-1.4",
375
+ "Zlib",
376
+ "blessing",
377
+ "bzip2-1.0.5",
378
+ "bzip2-1.0.6",
379
+ "copyleft-next-0.3.0",
380
+ "copyleft-next-0.3.1",
381
+ "curl",
382
+ "diffmark",
383
+ "dvipdfm",
384
+ "eCos-2.0",
385
+ "eGenix",
386
+ "gSOAP-1.3b",
387
+ "gnuplot",
388
+ "iMatix",
389
+ "libpng-2.0",
390
+ "libtiff",
391
+ "mpich2",
392
+ "psfrag",
393
+ "psutils",
394
+ "wxWindows",
395
+ "xinetd",
396
+ "xpp",
397
+ "zlib-acknowledgement",
398
+ "Libtool-exception",
399
+ "Linux-syscall-note",
400
+ "Autoconf-exception-3.0",
401
+ "OCCT-exception-1.0",
402
+ "openvpn-openssl-exception",
403
+ "gnu-javamail-exception",
404
+ "OpenJDK-assembly-exception-1.0",
405
+ "Bison-exception-2.2",
406
+ "i2p-gpl-java-exception",
407
+ "Universal-FOSS-exception-1.0",
408
+ "Qt-LGPL-exception-1.1",
409
+ "389-exception",
410
+ "Classpath-exception-2.0",
411
+ "Fawkes-Runtime-exception",
412
+ "PS-or-PDF-font-exception-20170817",
413
+ "Qt-GPL-exception-1.0",
414
+ "LZMA-exception",
415
+ "freertos-exception-2.0",
416
+ "Qwt-exception-1.0",
417
+ "CLISP-exception-2.0",
418
+ "FLTK-exception",
419
+ "Bootloader-exception",
420
+ "Nokia-Qt-exception-1.1",
421
+ "LLVM-exception",
422
+ "WxWindows-exception-3.1",
423
+ "DigiRule-FOSS-exception",
424
+ "Swift-exception",
425
+ "GCC-exception-3.1",
426
+ "eCos-exception-2.0",
427
+ "Autoconf-exception-2.0",
428
+ "GPL-CC-1.0",
429
+ "Font-exception-2.0",
430
+ "u-boot-exception-2.0",
431
+ "GCC-exception-2.0",
432
+ "mif-exception",
433
+ "OCaml-LGPL-linking-exception"
434
+ ]
metadata ADDED
@@ -0,0 +1,134 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cyclonedx-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Joseph Kobti
8
+ - Steve Springett
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2019-07-12 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: json
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '2.2'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '2.2'
28
+ - !ruby/object:Gem::Dependency
29
+ name: nokogiri
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '1.8'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '1.8'
42
+ - !ruby/object:Gem::Dependency
43
+ name: ostruct
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '0.1'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '0.1'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rest-client
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '2.0'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '2.0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: rake
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '12'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '12'
84
+ - !ruby/object:Gem::Dependency
85
+ name: rspec
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: '3.7'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '3.7'
98
+ description: CycloneDX is a lightweight software bill-of-material (SBOM) specification
99
+ designed for use in application security contexts and supply chain component analysis.
100
+ This Gem generates CycloneDX BOMs from Ruby projects.
101
+ email: josephkobti@outlook.com
102
+ executables:
103
+ - cyclonedx-ruby
104
+ extensions: []
105
+ extra_rdoc_files: []
106
+ files:
107
+ - bin/cyclonedx-ruby
108
+ - lib/bom_builder.rb
109
+ - lib/bom_helpers.rb
110
+ - lib/licenses.json
111
+ homepage: https://github.com/CycloneDX/cyclonedx-ruby-gem
112
+ licenses:
113
+ - Apache-2.0
114
+ metadata: {}
115
+ post_install_message:
116
+ rdoc_options: []
117
+ require_paths:
118
+ - lib
119
+ required_ruby_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ required_rubygems_version: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
129
+ requirements: []
130
+ rubygems_version: 3.0.3
131
+ signing_key:
132
+ specification_version: 4
133
+ summary: CycloneDX software bill-of-material (SBoM) generation utility
134
+ test_files: []