dependabot-bundler 0.397.0 → 0.399.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: 43d670382313df98efe56ca75538daf1ef494b65bdb4dfa87e79bcb2f5ae3fdc
4
- data.tar.gz: 46faf363b2a8e37874cc5516425abf14bf31a50c12573fac6c837d78aba6a182
3
+ metadata.gz: 956510bd31180ba35712d9450f6d0588b573479b136329ee45a34399374f7bdd
4
+ data.tar.gz: fb4afe0f709028f4e5856cadb69179046498382038bd361d93cd9a401e4b2bbf
5
5
  SHA512:
6
- metadata.gz: 24a9688ad6a277c68a763f39a298e13b9c2a8a64fea6ecc57d2414ea55555d9cfb49ec5feeddc1ad99a99ce475625ef18a4f35ee83a1bb2e26666fecb166ae58
7
- data.tar.gz: 9b8e28ec1cc08b2d841112f29d75e3d7545be0563dd69dd1f0a67cf693cf66759e175245cf88b658229ca90878aaaa53cc13ea40c5e400ae23a2738efdde0150
6
+ metadata.gz: d5d4dcc4184dbe5da513afbe5cd9656d413c9fd0d47861997122357fe30c01b722871684957fa8a0fa05a10f7807a27cd1a4532549b8cf8986e489a9d0af119c
7
+ data.tar.gz: 651fc49c1125f02e0cd5283cb7f58144c47d4ba95c52b427f57aa321fd39bd5f81d2e6d84e67a5ac025ee16436d06ecf56009fb7303bde33a963d03cbe96808c
@@ -43,7 +43,7 @@ module Dependabot
43
43
  options: {}
44
44
  )
45
45
  @package_details = T.let(nil, T.nilable(Dependabot::Package::PackageDetails))
46
- @latest_version_details = T.let(nil, T.nilable(T::Hash[Symbol, T.untyped]))
46
+ @latest_version_details = T.let(nil, T.nilable(VersionDetails))
47
47
  @releases_from_dependency_source = T.let(nil, T.nilable(T::Array[Dependabot::Package::PackageRelease]))
48
48
  super
49
49
  end
@@ -57,11 +57,15 @@ module Dependabot
57
57
  ).fetch
58
58
  end
59
59
 
60
- sig { returns(T.nilable(T::Hash[Symbol, T.untyped])) }
60
+ sig { returns(T.nilable(VersionDetails)) }
61
61
  def latest_version_details
62
62
  @latest_version_details ||= begin
63
63
  latest_version = fetch_latest_version(language_version: nil)
64
- latest_version ? { version: latest_version } : nil
64
+ if latest_version
65
+ raise TypeError, "expected a Bundler version" unless latest_version.is_a?(Dependabot::Bundler::Version)
66
+
67
+ VersionDetails.new(version: latest_version)
68
+ end
65
69
  end
66
70
  end
67
71
 
@@ -74,11 +74,12 @@ module Dependabot
74
74
  #########################
75
75
 
76
76
  sig do
77
- params(
78
- error_handling: T::Boolean,
79
- _blk: T.proc.params(arg0: String).returns(T.untyped)
80
- )
81
- .returns(T.untyped)
77
+ type_parameters(:T)
78
+ .params(
79
+ error_handling: T::Boolean,
80
+ _blk: T.proc.params(arg0: String).returns(T.type_parameter(:T))
81
+ )
82
+ .returns(T.type_parameter(:T))
82
83
  end
83
84
  def in_a_native_bundler_context(error_handling: true, &_blk)
84
85
  SharedHelpers
@@ -115,7 +116,7 @@ module Dependabot
115
116
  # rubocop:disable Metrics/PerceivedComplexity
116
117
  # rubocop:disable Metrics/AbcSize
117
118
  # rubocop:disable Metrics/MethodLength
118
- sig { params(error: Dependabot::SharedHelpers::HelperSubprocessFailed).void }
119
+ sig { params(error: Dependabot::SharedHelpers::HelperSubprocessFailed).returns(T.noreturn) }
119
120
  def handle_bundler_errors(error)
120
121
  if error.error_class == "JSON::ParserError"
121
122
  msg = "Error evaluating your dependency files: #{error.message}"
@@ -0,0 +1,81 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+ require "dependabot/shared_helpers"
6
+ require "dependabot/bundler/version"
7
+ require "dependabot/bundler/update_checker"
8
+
9
+ module Dependabot
10
+ module Bundler
11
+ class UpdateChecker < Dependabot::UpdateCheckers::Base
12
+ class VersionDetails < T::ImmutableStruct
13
+ extend T::Sig
14
+
15
+ class InvalidResult < SharedHelpers::HelperSubprocessFailed; end
16
+
17
+ ObjectHash = T.type_alias { T::Hash[String, Object] }
18
+
19
+ const :version, Dependabot::Bundler::Version
20
+ const :ruby_version, T.nilable(String), default: nil
21
+ const :fetcher, T.nilable(String), default: nil
22
+ const :commit_sha, T.nilable(String), default: nil
23
+
24
+ sig { params(result: Object).returns(VersionDetails) }
25
+ def self.from_helper_result(result)
26
+ fields = object_fields(result)
27
+ new(
28
+ version: parse_version(fields["version"]),
29
+ ruby_version: optional_string(fields["ruby_version"], "ruby_version"),
30
+ fetcher: optional_string(fields["fetcher"], "fetcher"),
31
+ commit_sha: optional_string(fields["commit_sha"], "commit_sha")
32
+ )
33
+ end
34
+
35
+ sig { params(value: Object).returns(ObjectHash) }
36
+ def self.object_fields(value)
37
+ invalid_result(" must be an object") unless value.is_a?(Hash)
38
+
39
+ value.to_h do |raw_key, raw_value|
40
+ key = T.cast(raw_key, Object)
41
+ invalid_result(" keys must be strings") unless key.is_a?(String)
42
+
43
+ [key, T.cast(raw_value, Object)]
44
+ end
45
+ end
46
+ private_class_method :object_fields
47
+
48
+ sig { params(value: Object).returns(Dependabot::Bundler::Version) }
49
+ def self.parse_version(value)
50
+ invalid_result(".version must be a string") unless value.is_a?(String)
51
+
52
+ # Version.new's inherited signature returns the base class.
53
+ T.cast(Dependabot::Bundler::Version.new(value), Dependabot::Bundler::Version)
54
+ rescue ArgumentError
55
+ invalid_result(".version must be a valid version")
56
+ end
57
+ private_class_method :parse_version
58
+
59
+ sig { params(value: Object, field: String).returns(T.nilable(String)) }
60
+ def self.optional_string(value, field)
61
+ return if value.nil?
62
+ return value if value.is_a?(String)
63
+
64
+ invalid_result(".#{field} must be a string or nil")
65
+ end
66
+ private_class_method :optional_string
67
+
68
+ sig { params(message: String).returns(T.noreturn) }
69
+ def self.invalid_result(message)
70
+ raise InvalidResult.new(
71
+ message: "resolve_version result#{message}",
72
+ error_class: "TypeError",
73
+ error_context: { function: "resolve_version" }
74
+ ),
75
+ cause: nil
76
+ end
77
+ private_class_method :invalid_result
78
+ end
79
+ end
80
+ end
81
+ end
@@ -67,14 +67,14 @@ module Dependabot
67
67
  @options = options
68
68
 
69
69
  @latest_allowable_version_incompatible_with_ruby = T.let(false, T::Boolean)
70
- @latest_resolvable_version_details = T.let(nil, T.nilable(T::Hash[Symbol, T.untyped]))
70
+ @latest_resolvable_version_details = T.let(nil, T.nilable(VersionDetails))
71
71
  @dependency_files = T.let(nil, T.nilable(T::Array[Dependabot::DependencyFile]))
72
- @latest_version_details = T.let(nil, T.nilable(T::Hash[Symbol, T.untyped]))
72
+ @latest_version_details = T.let(nil, T.nilable(VersionDetails))
73
73
  @gemspec_ruby_unlocked = T.let(false, T::Boolean)
74
74
  @bundler_version = T.let(nil, T.nilable(String))
75
75
  end
76
76
 
77
- sig { returns(T.nilable(T::Hash[Symbol, T.untyped])) }
77
+ sig { returns(T.nilable(VersionDetails)) }
78
78
  def latest_resolvable_version_details
79
79
  @latest_resolvable_version_details ||=
80
80
  fetch_latest_resolvable_version_details
@@ -136,7 +136,7 @@ module Dependabot
136
136
  end
137
137
 
138
138
  # rubocop:disable Metrics/PerceivedComplexity
139
- sig { returns(T.nilable(T::Hash[Symbol, T.untyped])) }
139
+ sig { returns(T.nilable(VersionDetails)) }
140
140
  def fetch_latest_resolvable_version_details
141
141
  return latest_version_details unless gemfile
142
142
 
@@ -145,7 +145,7 @@ module Dependabot
145
145
  # some errors we want to handle specifically ourselves, including
146
146
  # potentially retrying in the case of the Ruby version being locked
147
147
  in_a_native_bundler_context(error_handling: false) do |tmp_dir|
148
- details = NativeHelpers.run_bundler_subprocess(
148
+ result = NativeHelpers.run_bundler_subprocess(
149
149
  bundler_version: bundler_version,
150
150
  function: "resolve_version",
151
151
  options: options,
@@ -159,23 +159,24 @@ module Dependabot
159
159
  }
160
160
  )
161
161
 
162
- return latest_version_details if details == "latest"
162
+ result = T.cast(result, Object)
163
+ return latest_version_details if result == "latest"
164
+ return if result.nil?
163
165
 
164
- if details
165
- details.transform_keys!(&:to_sym)
166
+ details = VersionDetails.from_helper_result(result)
166
167
 
167
- # If the old Gemfile index was used then it won't have checked
168
- # Ruby compatibility. Fix that by doing the check manually and
169
- # saying no update is possible if the Ruby version is a
170
- # mismatch
171
- return nil if ruby_version_incompatible?(details)
168
+ # If the old Gemfile index was used then it won't have checked
169
+ # Ruby compatibility. Fix that by doing the check manually and
170
+ # saying no update is possible if the Ruby version is a
171
+ # mismatch
172
+ return if ruby_version_incompatible?(details)
172
173
 
173
- details[:version] = Dependabot::Bundler::Version.new(details[:version])
174
- end
175
174
  details
176
175
  end
177
176
  end
178
177
  rescue Dependabot::SharedHelpers::HelperSubprocessFailed => e
178
+ raise if e.is_a?(VersionDetails::InvalidResult)
179
+
179
180
  return if error_due_to_restrictive_upper_bound?(e)
180
181
  return if circular_dependency_at_new_version?(e)
181
182
 
@@ -184,7 +185,8 @@ module Dependabot
184
185
  handle_bundler_errors(e) unless ruby_lock_error?(e)
185
186
 
186
187
  @gemspec_ruby_unlocked = true
187
- regenerate_dependency_files_without_ruby_lock && retry
188
+ regenerate_dependency_files_without_ruby_lock
189
+ retry
188
190
  end
189
191
  # rubocop:enable Metrics/PerceivedComplexity
190
192
 
@@ -206,7 +208,7 @@ module Dependabot
206
208
  error.message.include?("#{dependency.name} ")
207
209
  end
208
210
 
209
- sig { params(error: T.untyped).returns(T::Boolean) }
211
+ sig { params(error: Dependabot::SharedHelpers::HelperSubprocessFailed).returns(T::Boolean) }
210
212
  def ruby_lock_error?(error)
211
213
  return false unless conflict_on_ruby?(error)
212
214
  return false if @gemspec_ruby_unlocked
@@ -223,7 +225,7 @@ module Dependabot
223
225
  end
224
226
  end
225
227
 
226
- sig { returns(T::Boolean) }
228
+ sig { void }
227
229
  def regenerate_dependency_files_without_ruby_lock
228
230
  @dependency_files =
229
231
  FilePreparer.new(
@@ -235,10 +237,9 @@ module Dependabot
235
237
  latest_allowable_version: latest_allowable_version,
236
238
  lock_ruby_version: false
237
239
  ).prepared_dependency_files
238
- true
239
240
  end
240
241
 
241
- sig { returns(T.nilable(T::Hash[Symbol, T.untyped])) }
242
+ sig { returns(T.nilable(VersionDetails)) }
242
243
  def latest_version_details
243
244
  @latest_version_details ||=
244
245
  LatestVersionFinder.new(
@@ -253,13 +254,14 @@ module Dependabot
253
254
  ).latest_version_details
254
255
  end
255
256
 
256
- sig { params(details: T.untyped).returns(T::Boolean) }
257
+ sig { params(details: VersionDetails).returns(T::Boolean) }
257
258
  def ruby_version_incompatible?(details)
258
259
  # It's only the old index we have a problem with
259
- return false unless details[:fetcher] == "Bundler::Fetcher::Dependency"
260
+ return false unless details.fetcher == "Bundler::Fetcher::Dependency"
260
261
 
261
262
  # If no Ruby version is specified, we don't have a problem
262
- return false unless details[:ruby_version]
263
+ ruby_version = details.ruby_version
264
+ return false unless ruby_version
263
265
 
264
266
  versions = Dependabot::RegistryClient.get(
265
267
  url: "https://rubygems.org/api/v1/versions/#{dependency.name}.json",
@@ -272,7 +274,7 @@ module Dependabot
272
274
 
273
275
  ruby_requirement =
274
276
  JSON.parse(versions.body)
275
- .find { |version| version["number"] == details[:version] }
277
+ .find { |version| version["number"] == details.version.to_semver }
276
278
  &.fetch("ruby_version", nil)
277
279
 
278
280
  # Give the benefit of the doubt if we can't find the version's
@@ -280,7 +282,7 @@ module Dependabot
280
282
  return false unless ruby_requirement
281
283
 
282
284
  ruby_requirement = Dependabot::Bundler::Requirement.new(ruby_requirement)
283
- current_ruby_version = Dependabot::Bundler::Version.new(details[:ruby_version])
285
+ current_ruby_version = Dependabot::Bundler::Version.new(ruby_version)
284
286
 
285
287
  return false if ruby_requirement.satisfied_by?(current_ruby_version)
286
288
 
@@ -1,4 +1,4 @@
1
- # typed: strict
1
+ # typed: strong
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "dependabot/bundler/file_updater/requirement_replacer"
@@ -16,6 +16,7 @@ module Dependabot
16
16
  # ecosystem update checkers (npm_and_yarn, bun, docker, python) disable this cop
17
17
  # for the same reason, so the exception is retained deliberately.
18
18
  class UpdateChecker < Dependabot::UpdateCheckers::Base # rubocop:disable Metrics/ClassLength
19
+ require_relative "update_checker/version_details"
19
20
  require_relative "update_checker/force_updater"
20
21
  require_relative "update_checker/file_preparer"
21
22
  require_relative "update_checker/requirements_updater"
@@ -29,14 +30,14 @@ module Dependabot
29
30
  def latest_version
30
31
  return latest_version_for_git_dependency if git_dependency?
31
32
 
32
- latest_version_details&.fetch(:version)
33
+ latest_version_details&.version
33
34
  end
34
35
 
35
36
  sig { override.returns(T.nilable(T.any(String, Dependabot::Bundler::Version))) }
36
37
  def latest_resolvable_version
37
38
  return latest_resolvable_version_for_git_dependency if git_dependency?
38
39
 
39
- latest_resolvable_version_details&.fetch(:version)
40
+ latest_resolvable_version_details&.version
40
41
  end
41
42
 
42
43
  sig { override.returns(T.nilable(Dependabot::Bundler::Version)) }
@@ -67,7 +68,7 @@ module Dependabot
67
68
 
68
69
  @latest_resolvable_version_detail_with_no_unlock = T.let(
69
70
  @latest_resolvable_version_detail_with_no_unlock,
70
- T.nilable(T::Hash[Symbol, T.untyped])
71
+ T.nilable(VersionDetails)
71
72
  )
72
73
 
73
74
  @latest_resolvable_version_detail_with_no_unlock ||=
@@ -75,16 +76,16 @@ module Dependabot
75
76
  .latest_resolvable_version_details
76
77
 
77
78
  if git_dependency?
78
- @latest_resolvable_version_detail_with_no_unlock&.fetch(:commit_sha)
79
+ @latest_resolvable_version_detail_with_no_unlock&.commit_sha
79
80
  else
80
- @latest_resolvable_version_detail_with_no_unlock&.fetch(:version)
81
+ @latest_resolvable_version_detail_with_no_unlock&.version
81
82
  end
82
83
  end
83
84
 
84
85
  sig { override.returns(T::Array[Dependabot::DependencyRequirement]) }
85
86
  def updated_requirements
86
- latest_version_for_req_updater = latest_version_details&.fetch(:version)&.to_s
87
- latest_resolvable_version_for_req_updater = preferred_resolvable_version_details&.fetch(:version)&.to_s
87
+ latest_version_for_req_updater = latest_version_details&.version&.to_s
88
+ latest_resolvable_version_for_req_updater = preferred_resolvable_version_details&.version&.to_s
88
89
 
89
90
  RequirementsUpdater.new(
90
91
  requirements: dependency.requirements,
@@ -204,9 +205,12 @@ module Dependabot
204
205
  force_updater.updated_dependencies
205
206
  end
206
207
 
207
- sig { returns(T.nilable(T::Hash[Symbol, T.untyped])) }
208
+ sig { returns(T.nilable(VersionDetails)) }
208
209
  def preferred_resolvable_version_details
209
- return { version: lowest_resolvable_security_fix_version } if vulnerable?
210
+ if vulnerable?
211
+ version = lowest_resolvable_security_fix_version
212
+ return version && VersionDetails.new(version: version)
213
+ end
210
214
 
211
215
  latest_resolvable_version_details
212
216
  end
@@ -263,17 +267,17 @@ module Dependabot
263
267
  end
264
268
  end
265
269
 
266
- sig { params(remove_git_source: T::Boolean).returns(T.nilable(T::Hash[Symbol, T.untyped])) }
270
+ sig { params(remove_git_source: T::Boolean).returns(T.nilable(VersionDetails)) }
267
271
  def latest_version_details(remove_git_source: false)
268
- @latest_version_details ||= T.let({}, T.nilable(T::Hash[T.untyped, T.untyped]))
272
+ @latest_version_details ||= T.let({}, T.nilable(T::Hash[T::Boolean, T.nilable(VersionDetails)]))
269
273
  @latest_version_details[remove_git_source] ||=
270
274
  latest_version_finder(remove_git_source: remove_git_source)
271
275
  .latest_version_details
272
276
  end
273
277
 
274
- sig { params(remove_git_source: T::Boolean).returns(T.nilable(T::Hash[Symbol, T.untyped])) }
278
+ sig { params(remove_git_source: T::Boolean).returns(T.nilable(VersionDetails)) }
275
279
  def latest_resolvable_version_details(remove_git_source: false)
276
- @latest_resolvable_version_details ||= T.let({}, T.nilable(T::Hash[T.untyped, T.untyped]))
280
+ @latest_resolvable_version_details ||= T.let({}, T.nilable(T::Hash[T::Boolean, T.nilable(VersionDetails)]))
277
281
  @latest_resolvable_version_details[remove_git_source] ||=
278
282
  version_resolver(remove_git_source: remove_git_source)
279
283
  .latest_resolvable_version_details
@@ -283,7 +287,7 @@ module Dependabot
283
287
  def latest_version_for_git_dependency
284
288
  latest_release =
285
289
  latest_version_details(remove_git_source: true)
286
- &.fetch(:version)
290
+ &.version
287
291
 
288
292
  # If there's been a release that includes the current pinned ref or
289
293
  # that the current branch is behind, we switch to that release.
@@ -329,12 +333,12 @@ module Dependabot
329
333
  dependency.version
330
334
  end
331
335
 
332
- sig { returns(T.any(String, T.nilable(Dependabot::Bundler::Version))) }
336
+ sig { returns(T.nilable(Dependabot::Bundler::Version)) }
333
337
  def latest_resolvable_version_without_git_source
334
338
  return nil unless latest_version.is_a?(Gem::Version)
335
339
 
336
340
  latest_resolvable_version_details(remove_git_source: true)
337
- &.fetch(:version)
341
+ &.version
338
342
  rescue Dependabot::DependencyFileNotResolvable
339
343
  nil
340
344
  end
@@ -346,9 +350,7 @@ module Dependabot
346
350
  # If this dependency has a git version in the Gemfile.lock but not in
347
351
  # the Gemfile (i.e., because they're out-of-sync) we might not get a
348
352
  # commit_sha back from Bundler. In that case, return `nil`.
349
- return unless details&.key?(:commit_sha)
350
-
351
- details.fetch(:commit_sha)
353
+ details&.commit_sha
352
354
  rescue Dependabot::DependencyFileNotResolvable
353
355
  nil
354
356
  end
@@ -361,7 +363,7 @@ module Dependabot
361
363
  git_tag_resolvable?(latest_tag_details.tag)
362
364
  end
363
365
 
364
- sig { params(release: T.untyped).returns(T::Boolean) }
366
+ sig { params(release: T.nilable(Dependabot::Bundler::Version)).returns(T::Boolean) }
365
367
  def git_branch_or_ref_in_release?(release)
366
368
  return false unless release
367
369
 
@@ -423,11 +425,11 @@ module Dependabot
423
425
  )
424
426
  end
425
427
 
426
- sig { params(remove_git_source: T::Boolean, unlock_requirement: T::Boolean).returns(T.untyped) }
428
+ sig { params(remove_git_source: T::Boolean, unlock_requirement: T::Boolean).returns(VersionResolver) }
427
429
  def version_resolver(remove_git_source:, unlock_requirement: true)
428
- @version_resolver ||= T.let({}, T.nilable(T::Hash[T.untyped, T.untyped]))
429
- @version_resolver[remove_git_source] ||= {}
430
- @version_resolver[remove_git_source][unlock_requirement] ||=
430
+ @version_resolver ||= T.let({}, T.nilable(T::Hash[T::Boolean, T::Hash[T::Boolean, VersionResolver]]))
431
+ resolvers = @version_resolver[remove_git_source] ||= {}
432
+ resolvers[unlock_requirement] ||=
431
433
  VersionResolver.new(
432
434
  dependency: dependency,
433
435
  unprepared_dependency_files: dependency_files,
@@ -445,7 +447,7 @@ module Dependabot
445
447
 
446
448
  sig { params(remove_git_source: T::Boolean).returns(Dependabot::Bundler::UpdateChecker::LatestVersionFinder) }
447
449
  def latest_version_finder(remove_git_source:)
448
- @latest_version_finder ||= T.let({}, T.nilable(T::Hash[T.untyped, T.untyped]))
450
+ @latest_version_finder ||= T.let({}, T.nilable(T::Hash[T::Boolean, LatestVersionFinder]))
449
451
  @latest_version_finder[remove_git_source] ||=
450
452
  begin
451
453
  prepared_dependency_files = prepared_dependency_files(
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.397.0
4
+ version: 0.399.0
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.397.0
18
+ version: 0.399.0
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.397.0
25
+ version: 0.399.0
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: parallel
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -354,6 +354,7 @@ files:
354
354
  - lib/dependabot/bundler/update_checker/latest_version_finder/dependency_source.rb
355
355
  - lib/dependabot/bundler/update_checker/requirements_updater.rb
356
356
  - lib/dependabot/bundler/update_checker/shared_bundler_helpers.rb
357
+ - lib/dependabot/bundler/update_checker/version_details.rb
357
358
  - lib/dependabot/bundler/update_checker/version_resolver.rb
358
359
  - lib/dependabot/bundler/version.rb
359
360
  homepage: https://github.com/dependabot/dependabot-core
@@ -361,7 +362,7 @@ licenses:
361
362
  - MIT
362
363
  metadata:
363
364
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
364
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.397.0
365
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.399.0
365
366
  rdoc_options: []
366
367
  require_paths:
367
368
  - lib