license_finder 7.1.0 → 7.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +5 -1
  3. data/CHANGELOG.md +17 -0
  4. data/Dockerfile +80 -90
  5. data/README.md +6 -7
  6. data/Rakefile +1 -1
  7. data/VERSION +1 -1
  8. data/ci/pipelines/pull-request.yml.erb +29 -32
  9. data/ci/pipelines/release.yml.erb +17 -41
  10. data/ci/scripts/run-tests.sh +20 -4
  11. data/ci/tasks/rubocop.yml +3 -3
  12. data/ci/tasks/update-changelog.yml +2 -2
  13. data/lib/license_finder/core.rb +2 -2
  14. data/lib/license_finder/license/definitions.rb +127 -19
  15. data/lib/license_finder/license/templates/AGPL3.txt +661 -0
  16. data/lib/license_finder/license/templates/Artistic.txt +128 -0
  17. data/lib/license_finder/license/templates/CC01_alt.txt +31 -0
  18. data/lib/license_finder/license/templates/CDDL1_1.txt +123 -0
  19. data/lib/license_finder/license/templates/CPL1.txt +217 -0
  20. data/lib/license_finder/license/templates/EPL2.txt +80 -0
  21. data/lib/license_finder/license/templates/Unlicense.txt +24 -0
  22. data/lib/license_finder/license/text.rb +4 -0
  23. data/lib/license_finder/license.rb +1 -1
  24. data/lib/license_finder/manual_licenses.rb +1 -1
  25. data/lib/license_finder/package_manager.rb +1 -1
  26. data/lib/license_finder/package_managers/cargo.rb +1 -1
  27. data/lib/license_finder/package_managers/conan.rb +50 -8
  28. data/lib/license_finder/package_managers/dep.rb +43 -41
  29. data/lib/license_finder/package_managers/go_dep.rb +1 -1
  30. data/lib/license_finder/package_managers/go_workspace.rb +3 -2
  31. data/lib/license_finder/package_managers/maven.rb +18 -10
  32. data/lib/license_finder/package_managers/npm.rb +14 -1
  33. data/lib/license_finder/package_managers/pip.rb +1 -1
  34. data/lib/license_finder/package_managers/pnpm.rb +7 -1
  35. data/lib/license_finder/package_managers/yarn.rb +9 -9
  36. data/lib/license_finder/package_utils/conan_info_parser.rb +2 -2
  37. data/lib/license_finder/package_utils/conan_info_parser_v2.rb +82 -0
  38. data/lib/license_finder/package_utils/license_files.rb +12 -2
  39. data/lib/license_finder/package_utils/licensing.rb +2 -1
  40. data/lib/license_finder/package_utils/maven_dependency_finder.rb +43 -1
  41. data/lib/license_finder/package_utils/notice_files.rb +14 -3
  42. data/lib/license_finder/package_utils/possible_license_file.rb +8 -2
  43. data/lib/license_finder/packages/maven_package.rb +13 -1
  44. data/lib/license_finder/packages/npm_package.rb +37 -11
  45. data/lib/license_finder/printer.rb +2 -2
  46. data/lib/license_finder/scanner.rb +3 -3
  47. data/license_finder.gemspec +11 -10
  48. metadata +44 -22
@@ -3,7 +3,11 @@
3
3
  module LicenseFinder
4
4
  class PossibleLicenseFile
5
5
  def initialize(path, options = {})
6
- @path = Pathname(path)
6
+ if !path.is_a?(Zip::Entry)
7
+ @path = Pathname(path)
8
+ else
9
+ @zip_entry = path
10
+ end
7
11
  @logger = options[:logger]
8
12
  end
9
13
 
@@ -16,7 +20,9 @@ module LicenseFinder
16
20
  end
17
21
 
18
22
  def text
19
- if @path.exist?
23
+ if @zip_entry
24
+ @zip_entry.get_input_stream.read
25
+ elsif @path.exist?
20
26
  @text ||= (@path.respond_to?(:binread) ? @path.binread : @path.read)
21
27
  else
22
28
  @logger.info('ERROR', "#{@path} does not exists", color: :red)
@@ -5,13 +5,17 @@ module LicenseFinder
5
5
  def initialize(spec, options = {})
6
6
  name = spec['artifactId']
7
7
  name = "#{spec['groupId']}:#{name}" if options[:include_groups]
8
+ @jar_file = spec['jarFile']
8
9
 
9
10
  super(
10
11
  name,
11
12
  spec['version'],
12
13
  options.merge(
13
14
  spec_licenses: Array(spec['licenses']).map { |l| l['name'] },
14
- groups: Array(spec['groupId'])
15
+ groups: Array(spec['groupId']),
16
+ summary: spec['summary'],
17
+ description: spec['description'],
18
+ homepage: spec['homepage']
15
19
  )
16
20
  )
17
21
  end
@@ -23,5 +27,13 @@ module LicenseFinder
23
27
  def package_url
24
28
  "https://search.maven.org/artifact/#{CGI.escape(groups.first)}/#{CGI.escape(name.split(':').last)}/#{CGI.escape(version)}/jar"
25
29
  end
30
+
31
+ def license_files
32
+ LicenseFiles.find(@jar_file, logger: logger)
33
+ end
34
+
35
+ def notice_files
36
+ NoticeFiles.find(@jar_file, logger: logger)
37
+ end
26
38
  end
27
39
  end
@@ -23,12 +23,12 @@ module LicenseFinder
23
23
  def flattened_dependencies(npm_json, existing_packages = {})
24
24
  identifier = Identifier.from_hash npm_json
25
25
  if existing_packages[identifier].nil?
26
- existing_packages[identifier] = NpmPackage.new(npm_json) if identifier
26
+ existing_packages[identifier] = package_for_dependency(npm_json) if identifier
27
27
  npm_json.fetch('dependencies', {}).values.map do |d|
28
28
  flattened_dependencies(d, existing_packages)
29
29
  end
30
30
  else
31
- duplicate_package = NpmPackage.new(npm_json)
31
+ duplicate_package = package_for_dependency(npm_json)
32
32
  unless existing_packages[identifier].dependencies.include?(duplicate_package.dependencies)
33
33
  existing_packages[identifier].dependencies |= duplicate_package.dependencies
34
34
  npm_json.fetch('dependencies', {}).values.map do |d|
@@ -39,6 +39,23 @@ module LicenseFinder
39
39
  existing_packages
40
40
  end
41
41
 
42
+ # Read the dependency's package.json file in order to get details like the license, authors,
43
+ # and so on. In NPM versions < 7, this information was included in the output of `npm list`.
44
+ # In later versions, it no longer is, and has to be read from the package.json file instead.
45
+ def package_for_dependency(npm_json)
46
+ package_path = npm_json['path']
47
+ package_json_path = Pathname.new(package_path).join('package.json') unless package_path.nil?
48
+
49
+ if package_json_path.nil? || !package_json_path.exist?
50
+ # Ancient NPM versions did not have the "path" field. Resort to the old way of gathering
51
+ # the details, expecting them to be contained in the output of `npm list`.
52
+ NpmPackage.new(npm_json)
53
+ else
54
+ package_json = JSON.parse(package_json_path.read, max_nesting: false)
55
+ NpmPackage.new(npm_json, package_json)
56
+ end
57
+ end
58
+
42
59
  def populate_groups(package_json)
43
60
  package_json.groups.each do |group|
44
61
  group.package_names.each do |package_name|
@@ -64,25 +81,34 @@ module LicenseFinder
64
81
  end
65
82
  end
66
83
 
67
- def initialize(npm_json)
68
- @json = npm_json
84
+ def initialize(npm_json, package_json = npm_json)
85
+ @npm_json = npm_json
86
+ @json = package_json
69
87
  @identifier = Identifier.from_hash(npm_json)
70
88
  @dependencies = deps_from_json
71
89
  super(@identifier.name,
72
90
  @identifier.version,
73
- description: npm_json['description'],
74
- homepage: npm_json['homepage'],
91
+ description: package_json['description'],
92
+ homepage: package_json['homepage'],
75
93
  authors: author_names,
76
- spec_licenses: Package.license_names_from_standard_spec(npm_json),
94
+ spec_licenses: Package.license_names_from_standard_spec(package_json),
77
95
  install_path: npm_json['path'],
78
96
  children: @dependencies.map(&:name))
79
97
  end
80
98
 
81
99
  def author_names
82
100
  names = []
83
- names.push(author_name(@json['author'])) unless @json['author'].nil?
101
+ if @json['author'].is_a?(Array)
102
+ # "author":["foo","bar"] isn't valid according to the NPM package.json schema, but can be found in the wild.
103
+ names += @json['author'].map { |a| author_name(a) }
104
+ else
105
+ names << author_name(@json['author']) unless @json['author'].nil?
106
+ end
84
107
  names += @json['contributors'].map { |c| author_name(c) } if @json['contributors'].is_a?(Array)
85
- names.join(', ')
108
+ names.compact.join(', ')
109
+ rescue TypeError
110
+ puts "Warning: Invalid author and/or contributors metadata found in package.json for #{@identifier}"
111
+ nil
86
112
  end
87
113
 
88
114
  def author_name(author)
@@ -117,7 +143,7 @@ module LicenseFinder
117
143
  private
118
144
 
119
145
  def deps_from_json
120
- @json.fetch('dependencies', {}).values.map { |dep| Identifier.from_hash(dep) }.compact
146
+ @npm_json.fetch('dependencies', {}).values.map { |dep| Identifier.from_hash(dep) }.compact
121
147
  end
122
148
 
123
149
  class Identifier
@@ -131,7 +157,7 @@ module LicenseFinder
131
157
  def self.from_hash(hash)
132
158
  name = hash['name']
133
159
  version = hash['version']
134
- return nil if name.nil? || version.nil?
160
+ return nil if name.nil? || name.empty? || version.nil? || version.empty?
135
161
 
136
162
  Identifier.new(name, version)
137
163
  end
@@ -4,7 +4,7 @@ module LicenseFinder
4
4
  class Printer
5
5
  attr_reader :padding
6
6
 
7
- def initialize #:nodoc:
7
+ def initialize # :nodoc:
8
8
  @base = nil
9
9
  @mute = false
10
10
  @padding = 0
@@ -24,7 +24,7 @@ module LicenseFinder
24
24
  spaces + set_color(message.to_s, *color)
25
25
  end
26
26
 
27
- def set_color(string, *) #:nodoc:
27
+ def set_color(string, *) # :nodoc:
28
28
  string
29
29
  end
30
30
 
@@ -3,7 +3,7 @@
3
3
  module LicenseFinder
4
4
  class Scanner
5
5
  PACKAGE_MANAGERS = [
6
- GoModules, GoDep, GoWorkspace, Go15VendorExperiment, Glide, Gvt, Govendor, Trash, Dep, Bundler, NPM, PNPM, Pip,
6
+ GoModules, GoDep, GoWorkspace, Go15VendorExperiment, Glide, Gvt, Govendor, Trash, Bundler, NPM, PNPM, Pip,
7
7
  Yarn, Bower, Maven, Gradle, CocoaPods, Rebar, Erlangmk, Nuget, Carthage, Mix, Conan, Sbt, Cargo, Dotnet, Composer, Pipenv,
8
8
  Conda, Spm, Pub
9
9
  ].freeze
@@ -50,10 +50,10 @@ module LicenseFinder
50
50
  active = pm_class.new(@config).active?
51
51
 
52
52
  if active
53
- @logger.info pm_class, 'is active', color: :green
53
+ @logger.info pm_class, "is active for '#{@project_path}'", color: :green
54
54
  active_pm_classes << pm_class
55
55
  else
56
- @logger.debug pm_class, 'is not active', color: :red
56
+ @logger.debug pm_class, "is not active for '#{@project_path}'", color: :red
57
57
  end
58
58
  end
59
59
 
@@ -3,7 +3,7 @@
3
3
  version = File.read(File.expand_path('VERSION', __dir__)).strip
4
4
 
5
5
  Gem::Specification.new do |s|
6
- s.required_ruby_version = '>= 2.4.0'
6
+ s.required_ruby_version = '>= 2.6.0'
7
7
  s.name = 'license_finder'
8
8
  s.version = version
9
9
 
@@ -44,30 +44,31 @@ Gem::Specification.new do |s|
44
44
  s.license = 'MIT'
45
45
 
46
46
  s.add_dependency 'bundler'
47
+ s.add_dependency 'csv', '~> 3.2'
47
48
  s.add_dependency 'rubyzip', '>=1', '<3'
48
49
  s.add_dependency 'thor', '~> 1.2'
49
50
  s.add_dependency 'tomlrb', '>= 1.3', '< 2.1'
50
51
  s.add_dependency 'with_env', '1.1.0'
51
52
  s.add_dependency 'xml-simple', '~> 1.1.9'
52
53
 
53
- s.add_development_dependency 'addressable', '2.8.1'
54
- s.add_development_dependency 'capybara', '~> 3.32.2'
54
+ s.add_development_dependency 'addressable', '2.8.6'
55
+ s.add_development_dependency 'capybara', '~> 3.39.2'
55
56
  s.add_development_dependency 'cocoapods', '>= 1.0.0' if RUBY_PLATFORM.match?(/darwin/)
56
57
  s.add_development_dependency 'e2mmap', '~> 0.1.0'
57
- s.add_development_dependency 'fakefs', '~> 1.8.0'
58
- s.add_development_dependency 'matrix', '~> 0.1.0'
59
- s.add_development_dependency 'mime-types', '3.4.1'
58
+ s.add_development_dependency 'fakefs', '~> 2.5.0'
59
+ s.add_development_dependency 'matrix', '~> 0.4.2'
60
+ s.add_development_dependency 'mime-types', '3.5.2'
60
61
  s.add_development_dependency 'pry', '~> 0.14.1'
61
- s.add_development_dependency 'rake', '~> 13.0.6'
62
+ s.add_development_dependency 'rake', '~> 13.1.0'
62
63
  s.add_development_dependency 'rspec', '~> 3'
63
64
  s.add_development_dependency 'rspec-its', '~> 1.3.0'
64
- s.add_development_dependency 'rubocop', '~> 1.12.1'
65
- s.add_development_dependency 'rubocop-performance', '~> 1.10.2'
65
+ s.add_development_dependency 'rubocop', '~> 1.60.2'
66
+ s.add_development_dependency 'rubocop-performance', '~> 1.20.2'
66
67
  s.add_development_dependency 'webmock', '~> 3.14'
67
68
 
68
69
  s.add_development_dependency 'nokogiri', '~>1.10'
69
70
  s.add_development_dependency 'rack', '~> 3.0.0'
70
- s.add_development_dependency 'rack-test', '> 0.7', '~> 2.0.2'
71
+ s.add_development_dependency 'rack-test', '> 0.7', '~> 2.1.0'
71
72
 
72
73
  s.files = `git ls-files`.split("\n").reject { |f| f.start_with?('spec', 'features') }
73
74
  s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: license_finder
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.1.0
4
+ version: 7.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Collins
@@ -27,7 +27,7 @@ authors:
27
27
  autorequire:
28
28
  bindir: bin
29
29
  cert_chain: []
30
- date: 2022-11-28 00:00:00.000000000 Z
30
+ date: 2024-05-07 00:00:00.000000000 Z
31
31
  dependencies:
32
32
  - !ruby/object:Gem::Dependency
33
33
  name: bundler
@@ -43,6 +43,20 @@ dependencies:
43
43
  - - ">="
44
44
  - !ruby/object:Gem::Version
45
45
  version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: csv
48
+ requirement: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - "~>"
51
+ - !ruby/object:Gem::Version
52
+ version: '3.2'
53
+ type: :runtime
54
+ prerelease: false
55
+ version_requirements: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '3.2'
46
60
  - !ruby/object:Gem::Dependency
47
61
  name: rubyzip
48
62
  requirement: !ruby/object:Gem::Requirement
@@ -131,28 +145,28 @@ dependencies:
131
145
  requirements:
132
146
  - - '='
133
147
  - !ruby/object:Gem::Version
134
- version: 2.8.1
148
+ version: 2.8.6
135
149
  type: :development
136
150
  prerelease: false
137
151
  version_requirements: !ruby/object:Gem::Requirement
138
152
  requirements:
139
153
  - - '='
140
154
  - !ruby/object:Gem::Version
141
- version: 2.8.1
155
+ version: 2.8.6
142
156
  - !ruby/object:Gem::Dependency
143
157
  name: capybara
144
158
  requirement: !ruby/object:Gem::Requirement
145
159
  requirements:
146
160
  - - "~>"
147
161
  - !ruby/object:Gem::Version
148
- version: 3.32.2
162
+ version: 3.39.2
149
163
  type: :development
150
164
  prerelease: false
151
165
  version_requirements: !ruby/object:Gem::Requirement
152
166
  requirements:
153
167
  - - "~>"
154
168
  - !ruby/object:Gem::Version
155
- version: 3.32.2
169
+ version: 3.39.2
156
170
  - !ruby/object:Gem::Dependency
157
171
  name: e2mmap
158
172
  requirement: !ruby/object:Gem::Requirement
@@ -173,42 +187,42 @@ dependencies:
173
187
  requirements:
174
188
  - - "~>"
175
189
  - !ruby/object:Gem::Version
176
- version: 1.8.0
190
+ version: 2.5.0
177
191
  type: :development
178
192
  prerelease: false
179
193
  version_requirements: !ruby/object:Gem::Requirement
180
194
  requirements:
181
195
  - - "~>"
182
196
  - !ruby/object:Gem::Version
183
- version: 1.8.0
197
+ version: 2.5.0
184
198
  - !ruby/object:Gem::Dependency
185
199
  name: matrix
186
200
  requirement: !ruby/object:Gem::Requirement
187
201
  requirements:
188
202
  - - "~>"
189
203
  - !ruby/object:Gem::Version
190
- version: 0.1.0
204
+ version: 0.4.2
191
205
  type: :development
192
206
  prerelease: false
193
207
  version_requirements: !ruby/object:Gem::Requirement
194
208
  requirements:
195
209
  - - "~>"
196
210
  - !ruby/object:Gem::Version
197
- version: 0.1.0
211
+ version: 0.4.2
198
212
  - !ruby/object:Gem::Dependency
199
213
  name: mime-types
200
214
  requirement: !ruby/object:Gem::Requirement
201
215
  requirements:
202
216
  - - '='
203
217
  - !ruby/object:Gem::Version
204
- version: 3.4.1
218
+ version: 3.5.2
205
219
  type: :development
206
220
  prerelease: false
207
221
  version_requirements: !ruby/object:Gem::Requirement
208
222
  requirements:
209
223
  - - '='
210
224
  - !ruby/object:Gem::Version
211
- version: 3.4.1
225
+ version: 3.5.2
212
226
  - !ruby/object:Gem::Dependency
213
227
  name: pry
214
228
  requirement: !ruby/object:Gem::Requirement
@@ -229,14 +243,14 @@ dependencies:
229
243
  requirements:
230
244
  - - "~>"
231
245
  - !ruby/object:Gem::Version
232
- version: 13.0.6
246
+ version: 13.1.0
233
247
  type: :development
234
248
  prerelease: false
235
249
  version_requirements: !ruby/object:Gem::Requirement
236
250
  requirements:
237
251
  - - "~>"
238
252
  - !ruby/object:Gem::Version
239
- version: 13.0.6
253
+ version: 13.1.0
240
254
  - !ruby/object:Gem::Dependency
241
255
  name: rspec
242
256
  requirement: !ruby/object:Gem::Requirement
@@ -271,28 +285,28 @@ dependencies:
271
285
  requirements:
272
286
  - - "~>"
273
287
  - !ruby/object:Gem::Version
274
- version: 1.12.1
288
+ version: 1.60.2
275
289
  type: :development
276
290
  prerelease: false
277
291
  version_requirements: !ruby/object:Gem::Requirement
278
292
  requirements:
279
293
  - - "~>"
280
294
  - !ruby/object:Gem::Version
281
- version: 1.12.1
295
+ version: 1.60.2
282
296
  - !ruby/object:Gem::Dependency
283
297
  name: rubocop-performance
284
298
  requirement: !ruby/object:Gem::Requirement
285
299
  requirements:
286
300
  - - "~>"
287
301
  - !ruby/object:Gem::Version
288
- version: 1.10.2
302
+ version: 1.20.2
289
303
  type: :development
290
304
  prerelease: false
291
305
  version_requirements: !ruby/object:Gem::Requirement
292
306
  requirements:
293
307
  - - "~>"
294
308
  - !ruby/object:Gem::Version
295
- version: 1.10.2
309
+ version: 1.20.2
296
310
  - !ruby/object:Gem::Dependency
297
311
  name: webmock
298
312
  requirement: !ruby/object:Gem::Requirement
@@ -344,7 +358,7 @@ dependencies:
344
358
  version: '0.7'
345
359
  - - "~>"
346
360
  - !ruby/object:Gem::Version
347
- version: 2.0.2
361
+ version: 2.1.0
348
362
  type: :development
349
363
  prerelease: false
350
364
  version_requirements: !ruby/object:Gem::Requirement
@@ -354,7 +368,7 @@ dependencies:
354
368
  version: '0.7'
355
369
  - - "~>"
356
370
  - !ruby/object:Gem::Version
357
- version: 2.0.2
371
+ version: 2.1.0
358
372
  description: |2
359
373
  LicenseFinder works with your package managers to find
360
374
  dependencies, detect the licenses of the packages in them, compare
@@ -434,12 +448,18 @@ files:
434
448
  - lib/license_finder/license/none_matcher.rb
435
449
  - lib/license_finder/license/template.rb
436
450
  - lib/license_finder/license/templates/0BSD.txt
451
+ - lib/license_finder/license/templates/AGPL3.txt
437
452
  - lib/license_finder/license/templates/Apache1_1.txt
438
453
  - lib/license_finder/license/templates/Apache2.txt
454
+ - lib/license_finder/license/templates/Artistic.txt
439
455
  - lib/license_finder/license/templates/BSD.txt
440
456
  - lib/license_finder/license/templates/CC01.txt
457
+ - lib/license_finder/license/templates/CC01_alt.txt
441
458
  - lib/license_finder/license/templates/CDDL1.txt
459
+ - lib/license_finder/license/templates/CDDL1_1.txt
460
+ - lib/license_finder/license/templates/CPL1.txt
442
461
  - lib/license_finder/license/templates/EPL1.txt
462
+ - lib/license_finder/license/templates/EPL2.txt
443
463
  - lib/license_finder/license/templates/GPLv2.txt
444
464
  - lib/license_finder/license/templates/GPLv3.txt
445
465
  - lib/license_finder/license/templates/ISC.txt
@@ -453,6 +473,7 @@ files:
453
473
  - lib/license_finder/license/templates/Python.txt
454
474
  - lib/license_finder/license/templates/Ruby.txt
455
475
  - lib/license_finder/license/templates/SimplifiedBSD.txt
476
+ - lib/license_finder/license/templates/Unlicense.txt
456
477
  - lib/license_finder/license/templates/WTFPL.txt
457
478
  - lib/license_finder/license/templates/Zlib.txt
458
479
  - lib/license_finder/license/text.rb
@@ -496,6 +517,7 @@ files:
496
517
  - lib/license_finder/package_managers/yarn.rb
497
518
  - lib/license_finder/package_utils/activation.rb
498
519
  - lib/license_finder/package_utils/conan_info_parser.rb
520
+ - lib/license_finder/package_utils/conan_info_parser_v2.rb
499
521
  - lib/license_finder/package_utils/gradle_dependency_finder.rb
500
522
  - lib/license_finder/package_utils/license_files.rb
501
523
  - lib/license_finder/package_utils/licensing.rb
@@ -566,14 +588,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
566
588
  requirements:
567
589
  - - ">="
568
590
  - !ruby/object:Gem::Version
569
- version: 2.4.0
591
+ version: 2.6.0
570
592
  required_rubygems_version: !ruby/object:Gem::Requirement
571
593
  requirements:
572
594
  - - ">="
573
595
  - !ruby/object:Gem::Version
574
596
  version: '0'
575
597
  requirements: []
576
- rubygems_version: 3.3.26
598
+ rubygems_version: 3.5.10
577
599
  signing_key:
578
600
  specification_version: 4
579
601
  summary: Audit the OSS licenses of your application's dependencies.