dependabot-common 0.244.0 → 0.246.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (28) hide show
  1. checksums.yaml +4 -4
  2. data/lib/dependabot/clients/bitbucket.rb +113 -5
  3. data/lib/dependabot/clients/bitbucket_with_retries.rb +34 -10
  4. data/lib/dependabot/clients/codecommit.rb +107 -12
  5. data/lib/dependabot/clients/github_with_retries.rb +61 -19
  6. data/lib/dependabot/clients/gitlab_with_retries.rb +60 -7
  7. data/lib/dependabot/dependency.rb +1 -1
  8. data/lib/dependabot/errors.rb +8 -2
  9. data/lib/dependabot/git_commit_checker.rb +4 -3
  10. data/lib/dependabot/metadata_finders/base/changelog_finder.rb +1 -1
  11. data/lib/dependabot/metadata_finders/base/commits_finder.rb +1 -1
  12. data/lib/dependabot/metadata_finders/base/release_finder.rb +1 -1
  13. data/lib/dependabot/pull_request_creator/azure.rb +80 -9
  14. data/lib/dependabot/pull_request_creator/bitbucket.rb +73 -9
  15. data/lib/dependabot/pull_request_creator/codecommit.rb +96 -25
  16. data/lib/dependabot/pull_request_creator/github.rb +162 -49
  17. data/lib/dependabot/pull_request_creator/gitlab.rb +109 -21
  18. data/lib/dependabot/pull_request_creator/message_builder.rb +239 -89
  19. data/lib/dependabot/pull_request_creator/pr_name_prefixer.rb +11 -9
  20. data/lib/dependabot/pull_request_creator.rb +32 -27
  21. data/lib/dependabot/pull_request_updater/azure.rb +75 -11
  22. data/lib/dependabot/pull_request_updater/github.rb +89 -28
  23. data/lib/dependabot/pull_request_updater/gitlab.rb +61 -12
  24. data/lib/dependabot/pull_request_updater.rb +1 -1
  25. data/lib/dependabot/shared_helpers.rb +19 -1
  26. data/lib/dependabot/update_checkers/base.rb +121 -31
  27. data/lib/dependabot.rb +1 -1
  28. metadata +3 -3
@@ -1,16 +1,51 @@
1
- # typed: true
1
+ # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
+ require "gitlab"
5
+ require "sorbet-runtime"
6
+
4
7
  require "dependabot/clients/gitlab_with_retries"
8
+ require "dependabot/credential"
5
9
  require "dependabot/pull_request_creator"
6
- require "gitlab"
7
10
 
8
11
  module Dependabot
9
12
  class PullRequestUpdater
10
13
  class Gitlab
11
- attr_reader :source, :files, :base_commit, :old_commit, :credentials,
12
- :pull_request_number, :target_project_id
14
+ extend T::Sig
15
+
16
+ sig { returns(Dependabot::Source) }
17
+ attr_reader :source
18
+
19
+ sig { returns(T::Array[Dependabot::DependencyFile]) }
20
+ attr_reader :files
21
+
22
+ sig { returns(String) }
23
+ attr_reader :base_commit
13
24
 
25
+ sig { returns(String) }
26
+ attr_reader :old_commit
27
+
28
+ sig { returns(T::Array[Dependabot::Credential]) }
29
+ attr_reader :credentials
30
+
31
+ sig { returns(Integer) }
32
+ attr_reader :pull_request_number
33
+
34
+ sig { returns(T.nilable(Integer)) }
35
+ attr_reader :target_project_id
36
+
37
+ sig do
38
+ params(
39
+ source: Dependabot::Source,
40
+ base_commit: String,
41
+ old_commit: String,
42
+ files: T::Array[Dependabot::DependencyFile],
43
+ credentials: T::Array[Dependabot::Credential],
44
+ pull_request_number: Integer,
45
+ target_project_id: T.nilable(Integer)
46
+ )
47
+ .void
48
+ end
14
49
  def initialize(source:, base_commit:, old_commit:, files:,
15
50
  credentials:, pull_request_number:, target_project_id:)
16
51
  @source = source
@@ -22,6 +57,7 @@ module Dependabot
22
57
  @target_project_id = target_project_id
23
58
  end
24
59
 
60
+ sig { returns(T.nilable(String)) }
25
61
  def update
26
62
  return unless merge_request_exists?
27
63
  return unless branch_exists?(merge_request.source_branch)
@@ -32,6 +68,7 @@ module Dependabot
32
68
 
33
69
  private
34
70
 
71
+ sig { returns(T::Boolean) }
35
72
  def merge_request_exists?
36
73
  merge_request
37
74
  true
@@ -39,31 +76,43 @@ module Dependabot
39
76
  false
40
77
  end
41
78
 
79
+ sig { returns(T.untyped) }
42
80
  def merge_request
43
- @merge_request ||= gitlab_client_for_source.merge_request(
44
- target_project_id || source.repo,
45
- pull_request_number
81
+ @merge_request ||= T.let(
82
+ T.unsafe(gitlab_client_for_source).merge_request(
83
+ target_project_id || source.repo,
84
+ pull_request_number
85
+ ),
86
+ T.untyped
46
87
  )
47
88
  end
48
89
 
90
+ sig { returns(Dependabot::Clients::GitlabWithRetries) }
49
91
  def gitlab_client_for_source
50
92
  @gitlab_client_for_source ||=
51
- Dependabot::Clients::GitlabWithRetries.for_source(
52
- source: source,
53
- credentials: credentials
93
+ T.let(
94
+ Dependabot::Clients::GitlabWithRetries.for_source(
95
+ source: source,
96
+ credentials: credentials
97
+ ),
98
+ T.nilable(Dependabot::Clients::GitlabWithRetries)
54
99
  )
55
100
  end
56
101
 
102
+ sig { params(name: String).returns(T::Boolean) }
57
103
  def branch_exists?(name)
58
- gitlab_client_for_source.branch(source.repo, name)
104
+ !T.unsafe(gitlab_client_for_source).branch(source.repo, name).nil?
59
105
  rescue ::Gitlab::Error::NotFound
60
106
  false
61
107
  end
62
108
 
109
+ # TODO: This needs to be typed when the underlying client is
110
+ sig { returns(T.untyped) }
63
111
  def commit_being_updated
64
- gitlab_client_for_source.commit(source.repo, old_commit)
112
+ T.unsafe(gitlab_client_for_source).commit(source.repo, old_commit)
65
113
  end
66
114
 
115
+ sig { void }
67
116
  def create_commit
68
117
  gitlab_client_for_source.create_commit(
69
118
  source.repo,
@@ -106,7 +106,7 @@ module Dependabot
106
106
  files: files,
107
107
  credentials: credentials,
108
108
  pull_request_number: pull_request_number,
109
- target_project_id: provider_metadata[:target_project_id]
109
+ target_project_id: T.cast(provider_metadata[:target_project_id], T.nilable(Integer))
110
110
  )
111
111
  end
112
112
 
@@ -405,7 +405,6 @@ module Dependabot
405
405
  stderr_to_stdout: true)
406
406
  start = Time.now
407
407
  cmd = allow_unsafe_shell_command ? command : escape_command(command)
408
-
409
408
  if stderr_to_stdout
410
409
  stdout, process = Open3.capture2e(env || {}, cmd)
411
410
  else
@@ -425,12 +424,31 @@ module Dependabot
425
424
  process_exit_value: process.to_s
426
425
  }
427
426
 
427
+ check_out_of_disk_memory_error(stderr, error_context)
428
+
428
429
  raise SharedHelpers::HelperSubprocessFailed.new(
429
430
  message: stderr_to_stdout ? stdout : "#{stderr}\n#{stdout}",
430
431
  error_context: error_context
431
432
  )
432
433
  end
433
434
 
435
+ sig { params(stderr: T.nilable(String), error_context: T::Hash[Symbol, String]).void }
436
+ def self.check_out_of_disk_memory_error(stderr, error_context)
437
+ if stderr&.include?("No space left on device") || stderr&.include?("Out of diskspace")
438
+ raise HelperSubprocessFailed.new(
439
+ message: "No space left on device",
440
+ error_class: "Dependabot::OutOfDisk",
441
+ error_context: error_context
442
+ )
443
+ elsif stderr&.include?("MemoryError")
444
+ raise HelperSubprocessFailed.new(
445
+ message: "MemoryError",
446
+ error_class: "Dependabot::OutOfMemory",
447
+ error_context: error_context
448
+ )
449
+ end
450
+ end
451
+
434
452
  sig { params(command: String, stdin_data: String, env: T.nilable(T::Hash[String, String])).returns(String) }
435
453
  def self.helper_subprocess_bash_command(command:, stdin_data:, env:)
436
454
  escaped_stdin_data = stdin_data.gsub("\"", "\\\"")
@@ -1,20 +1,65 @@
1
- # typed: true
1
+ # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "json"
5
+ require "sorbet-runtime"
6
+
5
7
  require "dependabot/utils"
6
8
  require "dependabot/security_advisory"
7
9
 
8
10
  module Dependabot
9
11
  module UpdateCheckers
10
12
  class Base
11
- attr_reader :dependency, :dependency_files, :repo_contents_path,
12
- :credentials, :ignored_versions, :raise_on_ignored,
13
- :security_advisories, :requirements_update_strategy,
14
- :dependency_group, :options
13
+ extend T::Sig
14
+ extend T::Helpers
15
+
16
+ sig { returns(Dependabot::Dependency) }
17
+ attr_reader :dependency
18
+
19
+ sig { returns(T::Array[Dependabot::DependencyFile]) }
20
+ attr_reader :dependency_files
21
+
22
+ sig { returns(T.nilable(String)) }
23
+ attr_reader :repo_contents_path
24
+
25
+ sig { returns(T::Array[Dependabot::Credential]) }
26
+ attr_reader :credentials
27
+
28
+ sig { returns(T::Array[String]) }
29
+ attr_reader :ignored_versions
30
+
31
+ sig { returns(T::Boolean) }
32
+ attr_reader :raise_on_ignored
33
+
34
+ sig { returns(T::Array[Dependabot::SecurityAdvisory]) }
35
+ attr_reader :security_advisories
36
+
37
+ sig { returns(T.nilable(Symbol)) }
38
+ attr_reader :requirements_update_strategy
39
+
40
+ sig { returns(T.nilable(Dependabot::DependencyGroup)) }
41
+ attr_reader :dependency_group
42
+
43
+ sig { returns(T::Hash[Symbol, T.untyped]) }
44
+ attr_reader :options
15
45
 
16
- def initialize(dependency:, dependency_files:, repo_contents_path: nil,
17
- credentials:, ignored_versions: [],
46
+ sig do
47
+ params(
48
+ dependency: Dependabot::Dependency,
49
+ dependency_files: T::Array[Dependabot::DependencyFile],
50
+ credentials: T::Array[Dependabot::Credential],
51
+ repo_contents_path: T.nilable(String),
52
+ ignored_versions: T::Array[String],
53
+ raise_on_ignored: T::Boolean,
54
+ security_advisories: T::Array[Dependabot::SecurityAdvisory],
55
+ requirements_update_strategy: T.nilable(Symbol),
56
+ dependency_group: T.nilable(Dependabot::DependencyGroup),
57
+ options: T::Hash[Symbol, T.untyped]
58
+ )
59
+ .void
60
+ end
61
+ def initialize(dependency:, dependency_files:, credentials:,
62
+ repo_contents_path: nil, ignored_versions: [],
18
63
  raise_on_ignored: false, security_advisories: [],
19
64
  requirements_update_strategy: nil, dependency_group: nil,
20
65
  options: {})
@@ -30,6 +75,7 @@ module Dependabot
30
75
  @options = options
31
76
  end
32
77
 
78
+ sig { returns(T::Boolean) }
33
79
  def up_to_date?
34
80
  if dependency.version
35
81
  version_up_to_date?
@@ -38,6 +84,7 @@ module Dependabot
38
84
  end
39
85
  end
40
86
 
87
+ sig { params(requirements_to_unlock: T.nilable(Symbol)).returns(T::Boolean) }
41
88
  def can_update?(requirements_to_unlock:)
42
89
  # Can't update if all versions are being ignored
43
90
  return false if ignore_requirements.include?(requirement_class.new(">= 0"))
@@ -52,6 +99,7 @@ module Dependabot
52
99
  end
53
100
  end
54
101
 
102
+ sig { params(requirements_to_unlock: T.nilable(Symbol)).returns(T::Array[Dependabot::Dependency]) }
55
103
  def updated_dependencies(requirements_to_unlock:)
56
104
  return [] unless can_update?(requirements_to_unlock: requirements_to_unlock)
57
105
 
@@ -63,10 +111,12 @@ module Dependabot
63
111
  end
64
112
  end
65
113
 
114
+ sig { overridable.returns(T.nilable(T.any(String, Gem::Version))) }
66
115
  def latest_version
67
- raise NotImplementedError
116
+ raise NotImplementedError, "#{self.class} must implement #latest_version"
68
117
  end
69
118
 
119
+ sig { overridable.returns(T.nilable(T.any(String, Gem::Version))) }
70
120
  def preferred_resolvable_version
71
121
  # If this dependency is vulnerable, prefer trying to update to the
72
122
  # lowest_resolvable_security_fix_version. Otherwise update all the way
@@ -78,22 +128,26 @@ module Dependabot
78
128
  latest_resolvable_version
79
129
  end
80
130
 
131
+ sig { overridable.returns(T.nilable(T.any(String, Gem::Version))) }
81
132
  def latest_resolvable_version
82
- raise NotImplementedError
133
+ raise NotImplementedError, "#{self.class} must implement #latest_resolvable_version"
83
134
  end
84
135
 
85
136
  # Lowest available security fix version not checking resolvability
86
137
  # @return [Dependabot::<package manager>::Version, #to_s] version class
138
+ sig { overridable.returns(Dependabot::Version) }
87
139
  def lowest_security_fix_version
88
- raise NotImplementedError
140
+ raise NotImplementedError, "#{self.class} must implement #lowest_security_fix_version"
89
141
  end
90
142
 
143
+ sig { overridable.returns(String) }
91
144
  def lowest_resolvable_security_fix_version
92
- raise NotImplementedError
145
+ raise NotImplementedError, "#{self.class} must implement #lowest_resolvable_security_fix_version"
93
146
  end
94
147
 
148
+ sig { overridable.returns(T.nilable(T.any(String, Dependabot::Version))) }
95
149
  def latest_resolvable_version_with_no_unlock
96
- raise NotImplementedError
150
+ raise NotImplementedError, "#{self.class} must implement #latest_resolvable_version_with_no_unlock"
97
151
  end
98
152
 
99
153
  # Finds any dependencies in the lockfile that have a subdependency on the
@@ -102,22 +156,27 @@ module Dependabot
102
156
  # name [String] the blocking dependencies name
103
157
  # version [String] the version of the blocking dependency
104
158
  # requirement [String] the requirement on the target_dependency
159
+ sig { overridable.returns(T::Array[T::Hash[String, String]]) }
105
160
  def conflicting_dependencies
106
161
  [] # return an empty array for ecosystems that don't support this yet
107
162
  end
108
163
 
164
+ sig { params(_updated_version: String).returns(T.nilable(String)) }
109
165
  def latest_resolvable_previous_version(_updated_version)
110
166
  dependency.version
111
167
  end
112
168
 
169
+ sig { overridable.returns(T::Array[T::Hash[Symbol, T.untyped]]) }
113
170
  def updated_requirements
114
171
  raise NotImplementedError
115
172
  end
116
173
 
174
+ sig { returns(T.class_of(Dependabot::Version)) }
117
175
  def version_class
118
176
  dependency.version_class
119
177
  end
120
178
 
179
+ sig { returns(T.class_of(Dependabot::Requirement)) }
121
180
  def requirement_class
122
181
  dependency.requirement_class
123
182
  end
@@ -125,10 +184,12 @@ module Dependabot
125
184
  # For some languages, the manifest file may be constructed such that
126
185
  # Dependabot has no way to update it (e.g., if it fetches its versions
127
186
  # from a web API). This method is overridden in those cases.
187
+ sig { returns(T::Boolean) }
128
188
  def requirements_unlocked_or_can_be?
129
189
  true
130
190
  end
131
191
 
192
+ sig { returns(T::Boolean) }
132
193
  def vulnerable?
133
194
  return false if security_advisories.none?
134
195
 
@@ -142,20 +203,24 @@ module Dependabot
142
203
  active_advisories.any?
143
204
  end
144
205
 
206
+ sig { returns(T::Array[Dependabot::Requirement]) }
145
207
  def ignore_requirements
146
208
  ignored_versions.flat_map { |req| requirement_class.requirements_array(req) }
147
209
  end
148
210
 
149
211
  private
150
212
 
213
+ sig { returns(T::Array[Dependabot::SecurityAdvisory]) }
151
214
  def active_advisories
152
- security_advisories.select { |a| a.vulnerable?(current_version) }
215
+ security_advisories.select { |a| a.vulnerable?(T.must(current_version)) }
153
216
  end
154
217
 
218
+ sig { overridable.returns(T::Boolean) }
155
219
  def latest_version_resolvable_with_full_unlock?
156
- raise NotImplementedError
220
+ raise NotImplementedError, "#{self.class} must implement #latest_version_resolvable_with_full_unlock?"
157
221
  end
158
222
 
223
+ sig { returns(Dependabot::Dependency) }
159
224
  def updated_dependency_without_unlock
160
225
  version = latest_resolvable_version_with_no_unlock.to_s
161
226
  previous_version = latest_resolvable_previous_version(version)&.to_s
@@ -172,6 +237,7 @@ module Dependabot
172
237
  )
173
238
  end
174
239
 
240
+ sig { returns(Dependabot::Dependency) }
175
241
  def updated_dependency_with_own_req_unlock
176
242
  version = preferred_resolvable_version.to_s
177
243
  previous_version = latest_resolvable_previous_version(version)&.to_s
@@ -188,16 +254,19 @@ module Dependabot
188
254
  )
189
255
  end
190
256
 
257
+ sig { overridable.returns(T::Array[Dependabot::Dependency]) }
191
258
  def updated_dependencies_after_full_unlock
192
259
  raise NotImplementedError
193
260
  end
194
261
 
262
+ sig { returns(T::Boolean) }
195
263
  def version_up_to_date?
196
264
  return sha1_version_up_to_date? if existing_version_is_sha?
197
265
 
198
266
  numeric_version_up_to_date?
199
267
  end
200
268
 
269
+ sig { params(requirements_to_unlock: T.nilable(Symbol)).returns(T::Boolean) }
201
270
  def version_can_update?(requirements_to_unlock:)
202
271
  if existing_version_is_sha?
203
272
  return sha1_version_can_update?(
@@ -210,16 +279,19 @@ module Dependabot
210
279
  )
211
280
  end
212
281
 
282
+ sig { returns(T::Boolean) }
213
283
  def existing_version_is_sha?
214
284
  return false if version_class.correct?(dependency.version)
215
285
 
216
- dependency.version.match?(/^[0-9a-f]{6,}$/)
286
+ T.must(dependency.version).match?(/^[0-9a-f]{6,}$/)
217
287
  end
218
288
 
289
+ sig { returns(T::Boolean) }
219
290
  def sha1_version_up_to_date?
220
- latest_version&.to_s&.start_with?(dependency.version)
291
+ latest_version&.to_s&.start_with?(T.must(dependency.version)) || false
221
292
  end
222
293
 
294
+ sig { params(requirements_to_unlock: T.nilable(Symbol)).returns(T::Boolean) }
223
295
  def sha1_version_can_update?(requirements_to_unlock:)
224
296
  return false if sha1_version_up_to_date?
225
297
 
@@ -227,7 +299,7 @@ module Dependabot
227
299
  case requirements_to_unlock&.to_sym
228
300
  when :none
229
301
  new_version = latest_resolvable_version_with_no_unlock
230
- new_version && !new_version.to_s.start_with?(dependency.version)
302
+ !new_version&.to_s&.start_with?(T.must(dependency.version))
231
303
  when :own
232
304
  preferred_version_resolvable_with_unlock?
233
305
  when :all
@@ -236,6 +308,7 @@ module Dependabot
236
308
  end
237
309
  end
238
310
 
311
+ sig { returns(T::Boolean) }
239
312
  def numeric_version_up_to_date?
240
313
  return false unless latest_version
241
314
 
@@ -244,16 +317,19 @@ module Dependabot
244
317
  # this case we treat the version as up-to-date so that it's ignored.
245
318
  return true if latest_version.to_s.match?(/^[0-9a-f]{40}$/)
246
319
 
247
- latest_version <= current_version
320
+ T.must(latest_version) <= current_version
248
321
  end
249
322
 
323
+ sig { params(requirements_to_unlock: T.nilable(Symbol)).returns(T::Boolean) }
250
324
  def numeric_version_can_update?(requirements_to_unlock:)
251
325
  return false if numeric_version_up_to_date?
252
326
 
253
327
  case requirements_to_unlock&.to_sym
254
328
  when :none
255
329
  new_version = latest_resolvable_version_with_no_unlock
256
- new_version && new_version > current_version
330
+ return false unless new_version
331
+
332
+ new_version > current_version
257
333
  when :own
258
334
  preferred_version_resolvable_with_unlock?
259
335
  when :all
@@ -262,12 +338,13 @@ module Dependabot
262
338
  end
263
339
  end
264
340
 
341
+ sig { returns(T::Boolean) }
265
342
  def preferred_version_resolvable_with_unlock?
266
343
  new_version = preferred_resolvable_version
267
344
  return false unless new_version
268
345
 
269
346
  if existing_version_is_sha?
270
- return false if new_version.to_s.start_with?(dependency.version)
347
+ return false if new_version.to_s.start_with?(T.must(dependency.version))
271
348
  elsif new_version <= current_version
272
349
  return false
273
350
  end
@@ -275,39 +352,52 @@ module Dependabot
275
352
  updated_requirements.none? { |r| r[:requirement] == :unfixable }
276
353
  end
277
354
 
355
+ sig { returns(T::Boolean) }
278
356
  def requirements_up_to_date?
279
357
  if can_compare_requirements?
280
- return (version_from_requirements >=
281
- version_class.new(latest_version.to_s))
358
+ return (T.must(version_from_requirements) >= version_class.new(latest_version.to_s))
282
359
  end
283
360
 
284
361
  changed_requirements.none?
285
362
  end
286
363
 
364
+ # TODO: Should this return Dependabot::Version?
365
+ sig { returns(T.nilable(Gem::Version)) }
287
366
  def current_version
288
- @current_version ||= dependency.numeric_version
367
+ @current_version ||=
368
+ T.let(
369
+ dependency.numeric_version,
370
+ T.nilable(Dependabot::Version)
371
+ )
289
372
  end
290
373
 
374
+ sig { returns(T::Boolean) }
291
375
  def can_compare_requirements?
292
- version_from_requirements &&
376
+ (version_from_requirements &&
293
377
  latest_version &&
294
- version_class.correct?(latest_version.to_s)
378
+ version_class.correct?(latest_version.to_s)) || false
295
379
  end
296
380
 
381
+ sig { returns(T::Array[T::Hash[Symbol, T.untyped]]) }
297
382
  def changed_requirements
298
383
  (updated_requirements - dependency.requirements)
299
384
  end
300
385
 
386
+ sig { returns(T.nilable(T.any(String, Gem::Version))) }
301
387
  def version_from_requirements
302
388
  @version_from_requirements ||=
303
- dependency.requirements.filter_map { |r| r.fetch(:requirement) }
304
- .flat_map { |req_str| requirement_class.requirements_array(req_str) }
305
- .flat_map(&:requirements)
306
- .reject { |req_array| req_array.first.start_with?("<") }
307
- .map(&:last)
308
- .max
389
+ T.let(
390
+ dependency.requirements.filter_map { |r| r.fetch(:requirement) }
391
+ .flat_map { |req_str| requirement_class.requirements_array(req_str) }
392
+ .flat_map(&:requirements)
393
+ .reject { |req_array| req_array.first.start_with?("<") }
394
+ .map(&:last)
395
+ .max,
396
+ T.nilable(T.any(String, Gem::Version))
397
+ )
309
398
  end
310
399
 
400
+ sig { returns(T::Boolean) }
311
401
  def requirements_can_update?
312
402
  return false if changed_requirements.none?
313
403
 
data/lib/dependabot.rb CHANGED
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Dependabot
5
- VERSION = "0.244.0"
5
+ VERSION = "0.246.0"
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-common
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.244.0
4
+ version: 0.246.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-15 00:00:00.000000000 Z
11
+ date: 2024-03-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-codecommit
@@ -567,7 +567,7 @@ licenses:
567
567
  - Nonstandard
568
568
  metadata:
569
569
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
570
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.244.0
570
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.246.0
571
571
  post_install_message:
572
572
  rdoc_options: []
573
573
  require_paths: