dependabot-bundler 0.324.1 → 0.325.1

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: 680f06ee4e940eaa830f822b0fded4ea43826ef39285089608925d0c7e15204a
4
- data.tar.gz: 620809604eadbfca78e1bbb75165e84d7bcbf44cf008fffd3a51165eb8be54fa
3
+ metadata.gz: c20b98f21e2dd3ee2e57b131f7c8990b38ffc8eecfc09e792acf74381fbd4f57
4
+ data.tar.gz: 3332c38e5415493e6d57c0094255fe1e236779b0c1d74192ee102df5e2c42dd0
5
5
  SHA512:
6
- metadata.gz: fcf6add9227eb52e3a0d6cf441f395abd2179f508974643ed6a8104a9bf3c7e895e21b69ade9e436807320e0d2f8891776a2130cf53ec89906bb1925b9eb8527
7
- data.tar.gz: 82ad27d48844ae3d19f55e289840de300d546681b357c2ac6dbf2342c3c2fb333d57f09fb95599bb04ff9a7d2d63366ebebe6d3ff193f5f0a39d09cae098a061
6
+ metadata.gz: f9f0f4d63bc7ee7a45a1c199ef99373fccae15e4db352fe5c2435d34782769621d6231496221f5e085767b1d3ff32820e6dc0d5e55281bf3197a0fe1474c2a06
7
+ data.tar.gz: a313088f61d1d1fea117c6bcfb958765d23ed8df8f27974153125e0770e4ec686c9f3a9a7a5ec2ccd80c836a620b25959dfe86c736e0ee9350b1c13c1173b9b4
@@ -1,7 +1,8 @@
1
- # typed: true
1
+ # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "parallel"
5
+ require "sorbet-runtime"
5
6
  require "dependabot/bundler/language"
6
7
  require "dependabot/bundler/package_manager"
7
8
  require "dependabot/dependency"
@@ -17,7 +18,7 @@ require "dependabot/errors"
17
18
 
18
19
  module Dependabot
19
20
  module Bundler
20
- class FileParser < Dependabot::FileParsers::Base
21
+ class FileParser < Dependabot::FileParsers::Base # rubocop:disable Metrics/ClassLength
21
22
  extend T::Sig
22
23
  require "dependabot/file_parsers/base/dependency_set"
23
24
  require "dependabot/bundler/file_parser/file_preparer"
@@ -50,34 +51,47 @@ module Dependabot
50
51
 
51
52
  sig { returns(Ecosystem::VersionManager) }
52
53
  def package_manager
53
- @package_manager ||= PackageManager.new(
54
- detected_version: bundler_version,
55
- raw_version: bundler_raw_version,
56
- requirement: package_manager_requirement
54
+ @package_manager ||= T.let(
55
+ PackageManager.new(
56
+ detected_version: bundler_version,
57
+ raw_version: bundler_raw_version,
58
+ requirement: package_manager_requirement
59
+ ),
60
+ T.nilable(Ecosystem::VersionManager)
57
61
  )
58
62
  end
59
63
 
64
+ sig { returns(T.nilable(Requirement)) }
60
65
  def package_manager_requirement
61
- @package_manager_requirement ||= Helpers.dependency_requirement(
62
- Helpers::BUNDLER_GEM_NAME, dependency_files
66
+ @package_manager_requirement ||= T.let(
67
+ Helpers.dependency_requirement(
68
+ Helpers::BUNDLER_GEM_NAME, dependency_files
69
+ ),
70
+ T.nilable(T.nilable(Requirement))
63
71
  )
64
72
  end
65
73
 
66
74
  sig { returns(T.nilable(Ecosystem::VersionManager)) }
67
75
  def language
76
+ @language = T.let(@language, T.nilable(Ecosystem::VersionManager))
68
77
  return @language if defined?(@language)
69
78
 
70
- return nil if package_manager.unsupported?
79
+ return @language = nil if package_manager.unsupported?
71
80
 
72
- Language.new(ruby_raw_version, language_requirement)
81
+ @language = Language.new(ruby_raw_version, language_requirement)
73
82
  end
74
83
 
84
+ sig { returns(T.nilable(Requirement)) }
75
85
  def language_requirement
76
- @language_requirement ||= Helpers.dependency_requirement(
77
- Helpers::LANGUAGE, dependency_files
86
+ @language_requirement ||= T.let(
87
+ Helpers.dependency_requirement(
88
+ Helpers::LANGUAGE, dependency_files
89
+ ),
90
+ T.nilable(T.nilable(Requirement))
78
91
  )
79
92
  end
80
93
 
94
+ sig { params(dependencies: T::Array[Dependabot::Dependency]).void }
81
95
  def check_external_code(dependencies)
82
96
  return unless @reject_external_code
83
97
  return unless git_source?(dependencies)
@@ -86,18 +100,23 @@ module Dependabot
86
100
  raise ::Dependabot::UnexpectedExternalCode
87
101
  end
88
102
 
103
+ sig { params(dependencies: T::Array[Dependabot::Dependency]).returns(T::Boolean) }
89
104
  def git_source?(dependencies)
90
105
  dependencies.any? do |dep|
91
106
  dep.requirements.any? { |req| req.fetch(:source)&.fetch(:type) == "git" }
92
107
  end
93
108
  end
94
109
 
110
+ sig { returns(DependencySet) }
95
111
  def gemfile_dependencies
112
+ @gemfile_dependencies = T.let(@gemfile_dependencies, T.nilable(DependencySet))
113
+ return @gemfile_dependencies if @gemfile_dependencies
114
+
96
115
  dependencies = DependencySet.new
97
116
 
98
- return dependencies unless gemfile
117
+ return (@gemfile_dependencies = dependencies) unless gemfile
99
118
 
100
- [gemfile, *evaled_gemfiles].each do |file|
119
+ [T.must(gemfile), *evaled_gemfiles].each do |file|
101
120
  gemfile_declaration_finder = GemfileDeclarationFinder.new(gemfile: file)
102
121
 
103
122
  parsed_gemfile.each do |dep|
@@ -118,15 +137,17 @@ module Dependabot
118
137
  end
119
138
  end
120
139
 
121
- dependencies
140
+ @gemfile_dependencies = dependencies
122
141
  end
123
142
 
143
+ sig { returns(DependencySet) }
124
144
  def gemspec_dependencies # rubocop:disable Metrics/PerceivedComplexity
125
- return @gemspec_dependencies if defined?(@gemspec_dependencies)
145
+ @gemspec_dependencies = T.let(@gemspec_dependencies, T.nilable(DependencySet))
146
+ return @gemspec_dependencies if @gemspec_dependencies
126
147
 
127
148
  queue = Queue.new
128
149
 
129
- SharedHelpers.in_a_temporary_repo_directory(base_directory, repo_contents_path) do
150
+ SharedHelpers.in_a_temporary_repo_directory(T.must(base_directory), repo_contents_path) do
130
151
  write_temporary_dependency_files
131
152
 
132
153
  Parallel.map(gemspecs, in_threads: 4) do |gemspec|
@@ -156,9 +177,10 @@ module Dependabot
156
177
 
157
178
  dependency_set = DependencySet.new
158
179
  dependency_set << queue.pop(true) while queue.size.positive?
159
- @gemspec_dependencies ||= dependency_set
180
+ @gemspec_dependencies = dependency_set
160
181
  end
161
182
 
183
+ sig { returns(DependencySet) }
162
184
  def lockfile_dependencies
163
185
  dependencies = DependencySet.new
164
186
 
@@ -185,9 +207,10 @@ module Dependabot
185
207
  dependencies
186
208
  end
187
209
 
210
+ sig { returns(T::Array[T::Hash[String, T.untyped]]) }
188
211
  def parsed_gemfile
189
- @parsed_gemfile ||=
190
- SharedHelpers.in_a_temporary_repo_directory(base_directory,
212
+ @parsed_gemfile ||= T.let(
213
+ SharedHelpers.in_a_temporary_repo_directory(T.must(base_directory),
191
214
  repo_contents_path) do
192
215
  write_temporary_dependency_files
193
216
 
@@ -196,12 +219,14 @@ module Dependabot
196
219
  function: "parsed_gemfile",
197
220
  options: options,
198
221
  args: {
199
- gemfile_name: gemfile.name,
222
+ gemfile_name: T.must(gemfile).name,
200
223
  lockfile_name: lockfile&.name,
201
224
  dir: Dir.pwd
202
225
  }
203
226
  )
204
- end
227
+ end,
228
+ T.nilable(T::Array[T::Hash[String, T.untyped]])
229
+ )
205
230
  rescue SharedHelpers::HelperSubprocessFailed => e
206
231
  handle_eval_error(e) if e.error_class == "JSON::ParserError"
207
232
 
@@ -210,11 +235,13 @@ module Dependabot
210
235
  raise Dependabot::DependencyFileNotEvaluatable, msg
211
236
  end
212
237
 
238
+ sig { params(err: StandardError).void }
213
239
  def handle_eval_error(err)
214
240
  msg = "Error evaluating your dependency files: #{err.message}"
215
241
  raise Dependabot::DependencyFileNotEvaluatable, msg
216
242
  end
217
243
 
244
+ sig { params(file: Dependabot::DependencyFile).returns(T::Array[T::Hash[String, T.untyped]]) }
218
245
  def parsed_gemspec(file)
219
246
  NativeHelpers.run_bundler_subprocess(
220
247
  bundler_version: bundler_version,
@@ -231,16 +258,21 @@ module Dependabot
231
258
  raise Dependabot::DependencyFileNotEvaluatable, msg
232
259
  end
233
260
 
261
+ sig { returns(T.nilable(String)) }
234
262
  def base_directory
235
263
  dependency_files.first&.directory
236
264
  end
237
265
 
266
+ sig { returns(T::Array[Dependabot::DependencyFile]) }
238
267
  def prepared_dependency_files
239
- @prepared_dependency_files ||=
268
+ @prepared_dependency_files ||= T.let(
240
269
  FilePreparer.new(dependency_files: dependency_files)
241
- .prepared_dependency_files
270
+ .prepared_dependency_files,
271
+ T.nilable(T::Array[Dependabot::DependencyFile])
272
+ )
242
273
  end
243
274
 
275
+ sig { void }
244
276
  def write_temporary_dependency_files
245
277
  prepared_dependency_files.each do |file|
246
278
  path = file.name
@@ -248,9 +280,10 @@ module Dependabot
248
280
  File.write(path, file.content)
249
281
  end
250
282
 
251
- File.write(lockfile.name, sanitized_lockfile_content) if lockfile
283
+ File.write(T.must(lockfile).name, sanitized_lockfile_content) if lockfile
252
284
  end
253
285
 
286
+ sig { override.void }
254
287
  def check_required_files
255
288
  file_names = dependency_files.map(&:name)
256
289
 
@@ -263,6 +296,7 @@ module Dependabot
263
296
  raise "A gemspec or Gemfile must be provided!"
264
297
  end
265
298
 
299
+ sig { params(dependency_name: String).returns(T.nilable(T.any(Dependabot::Version, String, Gem::Version))) }
266
300
  def dependency_version(dependency_name)
267
301
  return unless lockfile
268
302
 
@@ -281,11 +315,16 @@ module Dependabot
281
315
  spec.version
282
316
  end
283
317
 
318
+ sig { returns(T.nilable(Dependabot::DependencyFile)) }
284
319
  def gemfile
285
- @gemfile ||= get_original_file("Gemfile") ||
286
- get_original_file("gems.rb")
320
+ @gemfile ||= T.let(
321
+ get_original_file("Gemfile") ||
322
+ get_original_file("gems.rb"),
323
+ T.nilable(Dependabot::DependencyFile)
324
+ )
287
325
  end
288
326
 
327
+ sig { returns(T::Array[Dependabot::DependencyFile]) }
289
328
  def evaled_gemfiles
290
329
  dependency_files
291
330
  .reject { |f| f.name.end_with?(".gemspec") }
@@ -297,23 +336,33 @@ module Dependabot
297
336
  .reject(&:support_file?)
298
337
  end
299
338
 
339
+ sig { returns(T.nilable(Dependabot::DependencyFile)) }
300
340
  def lockfile
301
- @lockfile ||= get_original_file("Gemfile.lock") ||
302
- get_original_file("gems.locked")
341
+ @lockfile ||= T.let(
342
+ get_original_file("Gemfile.lock") ||
343
+ get_original_file("gems.locked"),
344
+ T.nilable(Dependabot::DependencyFile)
345
+ )
303
346
  end
304
347
 
348
+ sig { returns(T.untyped) }
305
349
  def parsed_lockfile
350
+ @parsed_lockfile = T.let(@parsed_lockfile, T.untyped)
306
351
  @parsed_lockfile ||= CachedLockfileParser.parse(sanitized_lockfile_content)
307
352
  end
308
353
 
354
+ sig { returns(T::Array[String]) }
309
355
  def production_dep_names
310
- @production_dep_names ||=
356
+ @production_dep_names ||= T.let(
311
357
  (gemfile_dependencies + gemspec_dependencies).dependencies
312
- .select { |dep| production?(dep) }
313
- .flat_map { |dep| expanded_dependency_names(dep) }
314
- .uniq
358
+ .select { |dep| production?(dep) }
359
+ .flat_map { |dep| expanded_dependency_names(dep) }
360
+ .uniq,
361
+ T.nilable(T::Array[String])
362
+ )
315
363
  end
316
364
 
365
+ sig { params(dep: T.any(Dependabot::Dependency, Gem::Dependency)).returns(T::Array[String]) }
317
366
  def expanded_dependency_names(dep)
318
367
  spec = parsed_lockfile.specs.find { |s| s.name == dep.name }
319
368
  return [dep.name] unless spec
@@ -324,6 +373,7 @@ module Dependabot
324
373
  ]
325
374
  end
326
375
 
376
+ sig { params(dependency: Dependabot::Dependency).returns(T::Boolean) }
327
377
  def production?(dependency)
328
378
  groups = dependency.requirements
329
379
  .flat_map { |r| r.fetch(:groups) }
@@ -337,15 +387,20 @@ module Dependabot
337
387
  end
338
388
 
339
389
  # TODO: Stop sanitizing the lockfile once we have bundler 2 installed
390
+ sig { returns(String) }
340
391
  def sanitized_lockfile_content
341
392
  regex = FileUpdater::LockfileUpdater::LOCKFILE_ENDING
342
- lockfile.content.gsub(regex, "")
393
+ T.must(T.must(lockfile).content).gsub(regex, "")
343
394
  end
344
395
 
396
+ sig { returns(T::Array[Dependabot::DependencyFile]) }
345
397
  def gemspecs
346
398
  # Path gemspecs are excluded (they're supporting files)
347
- @gemspecs ||= prepared_dependency_files
348
- .select { |file| file.name.end_with?(".gemspec") }
399
+ @gemspecs ||= T.let(
400
+ prepared_dependency_files
401
+ .select { |file| file.name.end_with?(".gemspec") },
402
+ T.nilable(T::Array[Dependabot::DependencyFile])
403
+ )
349
404
  end
350
405
 
351
406
  sig { returns(T::Array[Dependabot::DependencyFile]) }
@@ -357,38 +412,43 @@ module Dependabot
357
412
 
358
413
  sig { returns(String) }
359
414
  def bundler_raw_version
360
- return bundler_raw_version if defined?(@bundler_raw_version)
415
+ @bundler_raw_version = T.let(@bundler_raw_version, T.nilable(String))
416
+ return @bundler_raw_version if @bundler_raw_version
361
417
 
362
418
  package_manager = PackageManager.new(
363
419
  detected_version: bundler_version
364
420
  )
365
421
 
366
422
  # If the selected version is unsupported, an unsupported error will be raised,
367
- # so theres no need to attempt retrieving the raw version.
423
+ # so there's no need to attempt retrieving the raw version.
368
424
  return bundler_version if package_manager.unsupported?
369
425
 
426
+ directory = base_directory
370
427
  # read raw version directly from the ecosystem environment
371
- bundler_raw_version = SharedHelpers.in_a_temporary_repo_directory(
372
- base_directory,
373
- repo_contents_path
374
- ) do
375
- write_temporary_dependency_files
376
- NativeHelpers.run_bundler_subprocess(
377
- function: "bundler_raw_version",
378
- args: {},
379
- bundler_version: bundler_version,
380
- options: { timeout_per_operation_seconds: 10 }
381
- )
382
- end
383
- bundler_raw_version || ::Bundler::VERSION
428
+ bundler_raw_version = if directory
429
+ SharedHelpers.in_a_temporary_repo_directory(
430
+ directory,
431
+ repo_contents_path
432
+ ) do
433
+ write_temporary_dependency_files
434
+ NativeHelpers.run_bundler_subprocess(
435
+ function: "bundler_raw_version",
436
+ args: {},
437
+ bundler_version: bundler_version,
438
+ options: { timeout_per_operation_seconds: 10 }
439
+ )
440
+ end
441
+ end
442
+ @bundler_raw_version = bundler_raw_version || ::Bundler::VERSION
384
443
  end
385
444
 
386
445
  sig { returns(String) }
387
446
  def ruby_raw_version
388
- return @ruby_raw_version if defined?(@ruby_raw_version)
447
+ @ruby_raw_version = T.let(@ruby_raw_version, T.nilable(String))
448
+ return @ruby_raw_version if @ruby_raw_version
389
449
 
390
450
  ruby_raw_version = SharedHelpers.in_a_temporary_repo_directory(
391
- base_directory,
451
+ T.must(base_directory),
392
452
  repo_contents_path
393
453
  ) do
394
454
  write_temporary_dependency_files
@@ -399,12 +459,12 @@ module Dependabot
399
459
  options: { timeout_per_operation_seconds: 10 }
400
460
  )
401
461
  end
402
- ruby_raw_version || RUBY_VERSION
462
+ @ruby_raw_version = ruby_raw_version || RUBY_VERSION
403
463
  end
404
464
 
405
465
  sig { returns(String) }
406
466
  def bundler_version
407
- @bundler_version ||= Helpers.bundler_version(lockfile)
467
+ @bundler_version ||= T.let(Helpers.bundler_version(lockfile), T.nilable(String))
408
468
  end
409
469
  end
410
470
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-bundler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.324.1
4
+ version: 0.325.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
@@ -15,14 +15,14 @@ dependencies:
15
15
  requirements:
16
16
  - - '='
17
17
  - !ruby/object:Gem::Version
18
- version: 0.324.1
18
+ version: 0.325.1
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - '='
24
24
  - !ruby/object:Gem::Version
25
- version: 0.324.1
25
+ version: 0.325.1
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: parallel
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -197,14 +197,14 @@ dependencies:
197
197
  requirements:
198
198
  - - "~>"
199
199
  - !ruby/object:Gem::Version
200
- version: '2.2'
200
+ version: 2.2.5
201
201
  type: :development
202
202
  prerelease: false
203
203
  version_requirements: !ruby/object:Gem::Requirement
204
204
  requirements:
205
205
  - - "~>"
206
206
  - !ruby/object:Gem::Version
207
- version: '2.2'
207
+ version: 2.2.5
208
208
  - !ruby/object:Gem::Dependency
209
209
  name: vcr
210
210
  requirement: !ruby/object:Gem::Requirement
@@ -322,7 +322,7 @@ licenses:
322
322
  - MIT
323
323
  metadata:
324
324
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
325
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.324.1
325
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.325.1
326
326
  rdoc_options: []
327
327
  require_paths:
328
328
  - lib