dependabot-common 0.393.0 → 0.395.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: 1a99920113509c66688f9ff8e4c3da84a054c3ce8d0f6c1d137cbdbc936ab4e9
4
- data.tar.gz: 5c4de02216c87431010c69387a5ade5f4f296423e3b5e7f3e889e293743ee666
3
+ metadata.gz: d9566b1a9930f4b53e02d88a9eda5893f794bcd80b37c0a82870dab926432fba
4
+ data.tar.gz: 77aa3094407df4ef7627a53cb584abd0cf1b14a16e690b3ee178c8600dad2dd7
5
5
  SHA512:
6
- metadata.gz: c84ada814badfb9efc4e7a60d67fa5a26154c9c110337bf77c0963bbb08393ffd13247508d2db349750fb26590f81dfdded077aaf74ad54bf0b4f01b769453cb
7
- data.tar.gz: 1dc8a19ec787541adb136602ee00d101d7919b86c6d903c6d33ae4dedd65afd6fe677b83f4574e5c370a9e2e379093f4e5e7bf630cf95868e9bf91f0db66eccc
6
+ metadata.gz: f994b68adbb197b61dfa48006b35b8cd39058d5b482393aa2c56993b86958c32364d7e6869b31b068a8fbc85375883eb33110abd9f5fdc254aff940ae4d98c51
7
+ data.tar.gz: f5bba21d3f012e715c1918f161ce077d1d9f2a0b2ca681e90fd87d9b321d096b710f98902f1ece9e1814c2cdb16d8b89fb68f0d7670aab3b7630e68acaa0cd9c
@@ -8,7 +8,7 @@ require "sorbet-runtime"
8
8
 
9
9
  module Dependabot
10
10
  module Clients
11
- # rubocop:disable Metrics/ClassLength
11
+ # rubocop:disable-next Metrics/ClassLength
12
12
  class Azure
13
13
  extend T::Sig
14
14
  include JsonResponseParser
@@ -550,6 +550,5 @@ module Dependabot
550
550
  sig { returns(Dependabot::Source) }
551
551
  attr_reader :source
552
552
  end
553
- # rubocop:enable Metrics/ClassLength
554
553
  end
555
554
  end
@@ -11,7 +11,7 @@ module Dependabot
11
11
 
12
12
  module TIMEOUTS
13
13
  NO_TIME_OUT = -1 # No timeout
14
- GRARECFULLY_STOP = 5 # 5 seconds for graceful termination
14
+ GRACEFULLY_STOP = 5 # 5 seconds for graceful termination
15
15
  LOCAL = 30 # 30 seconds
16
16
  NETWORK = 120 # 2 minutes
17
17
  LONG_RUNNING = 300 # 5 minutes
@@ -185,8 +185,8 @@ module Dependabot
185
185
  if observation&.dig(:gracefully_stop)
186
186
  message = observation[:reason] || "Terminated by output_observer"
187
187
  # If the observer indicates a graceful stop, terminate the process
188
- # by adjusting the remaining timeout 5 seconds
189
- timeout = [timeout, ((Time.now - last_output_time) + 5).to_i].min
188
+ # by adjusting the remaining timeout
189
+ timeout = [timeout, ((Time.now - last_output_time) + TIMEOUTS::GRACEFULLY_STOP).to_i].min
190
190
  Dependabot.logger.warn("Terminating process due to observer signal: #{message}")
191
191
  end
192
192
  rescue EOFError
@@ -5,7 +5,7 @@ require "sorbet-runtime"
5
5
  require "dependabot/error_details"
6
6
  require "dependabot/utils"
7
7
 
8
- # rubocop:disable Metrics/ModuleLength
8
+ # rubocop:disable-next Metrics/ModuleLength
9
9
  module Dependabot
10
10
  extend T::Sig
11
11
 
@@ -580,7 +580,10 @@ module Dependabot
580
580
  end
581
581
  def initialize(tool_name, tool_message)
582
582
  @tool_name = tool_name
583
- @tool_message = tool_message
583
+ # Sanitize here as well as via `super`: the raw `tool_message` attribute is read
584
+ # directly during error serialization (see `updater_error_details`), so it must not
585
+ # carry credentials (e.g. basic-auth URLs) that the base message sanitization strips.
586
+ @tool_message = T.let(filter_sensitive_data(tool_message), String)
584
587
 
585
588
  msg = "Dependabot detected that #{tool_name} is misconfigured in this repository. " \
586
589
  "Running `#{tool_name.downcase}` results in the following error: #{tool_message}"
@@ -1007,4 +1010,3 @@ module Dependabot
1007
1010
  end
1008
1011
  end
1009
1012
  end
1010
- # rubocop:enable Metrics/ModuleLength
@@ -16,7 +16,7 @@ require "dependabot/clients/bitbucket_with_retries"
16
16
  require "dependabot/clients/gitlab_with_retries"
17
17
  require "dependabot/shared_helpers"
18
18
 
19
- # rubocop:disable Metrics/ClassLength
19
+ # rubocop:disable-next Metrics/ClassLength
20
20
  module Dependabot
21
21
  module FileFetchers
22
22
  class RepositoryContent < T::ImmutableStruct
@@ -503,7 +503,7 @@ module Dependabot
503
503
  params(path: String, fetch_submodules: T::Boolean, raise_errors: T::Boolean)
504
504
  .returns(T::Array[RepositoryContent])
505
505
  end
506
- def _fetch_repo_contents(path, fetch_submodules: false, raise_errors: true) # rubocop:disable Metrics/PerceivedComplexity
506
+ def _fetch_repo_contents(path, fetch_submodules: false, raise_errors: true)
507
507
  path = path.gsub(" ", "%20")
508
508
  specification = _full_specification_for(path, fetch_submodules: fetch_submodules)
509
509
  provider = specification.provider
@@ -512,11 +512,7 @@ module Dependabot
512
512
  commit = specification.commit
513
513
 
514
514
  entries = _fetch_repo_contents_fully_specified(provider, repo, tmp_path, commit)
515
- if Dependabot::Experiments.enabled?(:enable_exclude_paths_subdirectory_manifest_files)
516
- filter_excluded(entries)
517
- else
518
- entries
519
- end
515
+ filter_excluded(entries)
520
516
  rescue *CLIENT_NOT_FOUND_ERRORS
521
517
  raise Dependabot::DirectoryNotFound, directory if path == directory.gsub(%r{^/*}, "")
522
518
 
@@ -597,11 +593,7 @@ module Dependabot
597
593
  size: 0 # NOTE: added for parity with github contents API
598
594
  )
599
595
  end
600
- if Dependabot::Experiments.enabled?(:enable_exclude_paths_subdirectory_manifest_files)
601
- filter_excluded(entries)
602
- else
603
- entries
604
- end
596
+ filter_excluded(entries)
605
597
  end
606
598
 
607
599
  # Filters out any entries whose paths match one of the exclude_paths globs.
@@ -1038,4 +1030,3 @@ module Dependabot
1038
1030
  end
1039
1031
  end
1040
1032
  end
1041
- # rubocop:enable Metrics/ClassLength
@@ -90,8 +90,6 @@ module Dependabot
90
90
  ).returns(T::Boolean)
91
91
  end
92
92
  def self.should_exclude_path?(path, context, exclude_paths)
93
- return false unless Dependabot::Experiments.enabled?(:enable_exclude_paths_subdirectory_manifest_files)
94
-
95
93
  return false if exclude_paths.nil? || exclude_paths.empty?
96
94
 
97
95
  should_exclude = exclude_path?(path, exclude_paths)
@@ -36,9 +36,8 @@ module Dependabot
36
36
  return [] unless repo_contents_path && target_directory
37
37
 
38
38
  Dir.chdir(T.must(repo_contents_path)) do
39
- # rubocop:disable Performance/DeletePrefix
39
+ # rubocop:disable-next Performance/DeletePrefix
40
40
  relative_dir = Pathname.new(base_directory).sub(%r{\A/}, "").join(T.must(target_directory))
41
- # rubocop:enable Performance/DeletePrefix
42
41
 
43
42
  status = T.let(
44
43
  SharedHelpers.run_shell_command(
@@ -23,7 +23,7 @@ require "dependabot/package/release_cooldown_options"
23
23
  require "dependabot/update_checkers/cooldown_calculation"
24
24
  require "dependabot/git_cooldown_date_resolver"
25
25
  module Dependabot
26
- # rubocop:disable Metrics/ClassLength
26
+ # rubocop:disable-next Metrics/ClassLength
27
27
  class GitCommitChecker
28
28
  extend T::Sig
29
29
  include Dependabot::GitCooldownDateResolver
@@ -265,6 +265,7 @@ module Dependabot
265
265
 
266
266
  sig { returns(T.nilable(String)) }
267
267
  def local_tag_for_pinned_sha
268
+ return @local_tag_for_pinned_sha if defined?(@local_tag_for_pinned_sha)
268
269
  return unless pinned_ref_looks_like_commit_sha?
269
270
 
270
271
  @local_tag_for_pinned_sha = T.let(
@@ -957,5 +958,4 @@ module Dependabot
957
958
  SourceDetails.from_hash(details) if details
958
959
  end
959
960
  end
960
- # rubocop:enable Metrics/ClassLength
961
961
  end
@@ -24,7 +24,7 @@ module Dependabot
24
24
  const :api_url, T.nilable(String), default: nil
25
25
  end
26
26
 
27
- # rubocop:disable Metrics/ClassLength
27
+ # rubocop:disable-next Metrics/ClassLength
28
28
  class ChangelogFinder
29
29
  extend T::Sig
30
30
 
@@ -653,7 +653,6 @@ module Dependabot
653
653
  )
654
654
  end
655
655
  end
656
- # rubocop:enable Metrics/ClassLength
657
656
  end
658
657
  end
659
658
  end
@@ -0,0 +1,72 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+
6
+ module Dependabot
7
+ module Package
8
+ class NpmPackageManagerConfig < T::ImmutableStruct
9
+ extend T::Sig
10
+
11
+ ObjectHash = T.type_alias { T::Hash[String, Object] }
12
+
13
+ const :package_manager, T.nilable(String), default: nil
14
+ const :engines, T.nilable(T::Hash[String, String]), default: nil
15
+
16
+ sig { params(package_json: T.nilable(Object)).returns(NpmPackageManagerConfig) }
17
+ def self.from_package_json(package_json)
18
+ return new if package_json.nil?
19
+
20
+ manifest = object_hash(package_json, "package.json")
21
+
22
+ new(
23
+ package_manager: optional_string(manifest["packageManager"], "packageManager"),
24
+ engines: parse_engines(manifest)
25
+ )
26
+ end
27
+
28
+ sig { params(manifest: ObjectHash).returns(T.nilable(T::Hash[String, String])) }
29
+ def self.parse_engines(manifest)
30
+ return unless manifest.key?("engines")
31
+
32
+ raw_engines = manifest["engines"]
33
+ return if raw_engines.nil?
34
+
35
+ engines = T.let({}, T::Hash[String, String])
36
+ object_hash(raw_engines, "engines").each do |name, raw_requirement|
37
+ next if raw_requirement.nil?
38
+
39
+ raise TypeError, "engines.#{name} must be a string" unless raw_requirement.is_a?(String)
40
+
41
+ engines[name] = raw_requirement
42
+ end
43
+ engines
44
+ end
45
+ private_class_method :parse_engines
46
+
47
+ sig { params(value: Object, context: String).returns(ObjectHash) }
48
+ def self.object_hash(value, context)
49
+ raise TypeError, "#{context} must be an object" unless value.is_a?(Hash)
50
+
51
+ result = T.let({}, ObjectHash)
52
+ value.each do |raw_key, raw_value|
53
+ key = T.cast(raw_key, Object)
54
+ raise TypeError, "#{context} keys must be strings" unless key.is_a?(String)
55
+
56
+ result[key] = T.cast(raw_value, Object)
57
+ end
58
+ result
59
+ end
60
+ private_class_method :object_hash
61
+
62
+ sig { params(value: T.nilable(Object), context: String).returns(T.nilable(String)) }
63
+ def self.optional_string(value, context)
64
+ return if value.nil?
65
+ return value if value.is_a?(String)
66
+
67
+ raise TypeError, "#{context} must be a string"
68
+ end
69
+ private_class_method :optional_string
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,195 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ require "json"
5
+ require "time"
6
+ require "sorbet-runtime"
7
+
8
+ module Dependabot
9
+ module Package
10
+ class NpmRegistryPackage < T::ImmutableStruct
11
+ extend T::Sig
12
+
13
+ ObjectHash = T.type_alias { T::Hash[String, Object] }
14
+ VersionFilter = T.type_alias { T.proc.params(version: String).returns(T::Boolean) }
15
+
16
+ class Repository < T::ImmutableStruct
17
+ extend T::Sig
18
+
19
+ const :git, T::Boolean
20
+ const :url, T.nilable(String), default: nil
21
+ const :type, T.nilable(String), default: nil
22
+
23
+ sig { returns(T::Boolean) }
24
+ def git?
25
+ git
26
+ end
27
+ end
28
+
29
+ class Release < T::ImmutableStruct
30
+ extend T::Sig
31
+
32
+ const :version, String
33
+ const :released_at, T.nilable(Time), default: nil
34
+ const :node_requirement, T.nilable(String), default: nil
35
+ const :repository, T.nilable(Repository), default: nil
36
+ const :details, ObjectHash
37
+
38
+ sig { returns(String) }
39
+ def package_type
40
+ repository&.git? ? "git" : "npm"
41
+ end
42
+ end
43
+
44
+ const :releases, T::Hash[String, Release]
45
+ const :dist_tags, T.nilable(T::Hash[String, String]), default: nil
46
+
47
+ sig { params(json: String, version_filter: VersionFilter).returns(NpmRegistryPackage) }
48
+ def self.from_json(json, &version_filter)
49
+ parsed = T.cast(JSON.parse(json), Object)
50
+ package = object_hash(parsed, "npm registry package")
51
+
52
+ versions = package["versions"]
53
+ times = package["time"]
54
+ dist_tags = package["dist-tags"]
55
+
56
+ release_details = versions.nil? ? {} : object_hash(versions, "versions")
57
+ accepted_versions = T.let({}, T::Hash[String, T::Boolean])
58
+ release_details.each_key do |version|
59
+ accepted_versions[version] = true if yield(version)
60
+ end
61
+
62
+ release_times = if times.nil?
63
+ {}
64
+ else
65
+ string_map(times, "time", included_keys: accepted_versions)
66
+ end
67
+
68
+ releases = T.let({}, T::Hash[String, Release])
69
+ release_details.each do |version, details|
70
+ next unless accepted_versions.key?(version)
71
+
72
+ releases[version] = parse_release(
73
+ version: version,
74
+ details: details,
75
+ released_at: release_times[version]
76
+ )
77
+ end
78
+
79
+ new(
80
+ releases: releases,
81
+ dist_tags: dist_tags.nil? ? nil : string_map(dist_tags, "dist-tags")
82
+ )
83
+ end
84
+
85
+ sig do
86
+ params(
87
+ version: String,
88
+ details: Object,
89
+ released_at: T.nilable(String)
90
+ ).returns(Release)
91
+ end
92
+ def self.parse_release(version:, details:, released_at:)
93
+ details_hash = object_hash(details, "version #{version} details")
94
+
95
+ Release.new(
96
+ version: version,
97
+ released_at: released_at && Time.parse(released_at),
98
+ node_requirement: parse_node_requirement(details_hash, version),
99
+ repository: parse_repository(details_hash["repository"], version),
100
+ details: details_hash
101
+ )
102
+ end
103
+ private_class_method :parse_release
104
+
105
+ sig { params(details: ObjectHash, version: String).returns(T.nilable(String)) }
106
+ def self.parse_node_requirement(details, version)
107
+ engines = details["engines"]
108
+ return unless engines.is_a?(Hash)
109
+
110
+ engines_hash = object_hash(engines, "version #{version} engines")
111
+ optional_string(
112
+ engines_hash["node"],
113
+ "version #{version} engines.node"
114
+ )
115
+ end
116
+ private_class_method :parse_node_requirement
117
+
118
+ sig { params(value: T.nilable(Object), version: String).returns(T.nilable(Repository)) }
119
+ def self.parse_repository(value, version)
120
+ case value
121
+ when nil
122
+ nil
123
+ when String
124
+ Repository.new(url: value, git: value.start_with?("git+"))
125
+ when Hash
126
+ repository = object_hash(value, "version #{version} repository")
127
+ url = optional_string(repository["url"], "version #{version} repository.url")
128
+ type = optional_string(repository["type"], "version #{version} repository.type")
129
+
130
+ Repository.new(
131
+ url: url,
132
+ type: type,
133
+ git: type == "git"
134
+ )
135
+ when Array
136
+ repositories = T.let([], T::Array[Repository])
137
+ value.each do |raw_repository|
138
+ repository_value = T.cast(raw_repository, Object)
139
+ parsed_repository = parse_repository(repository_value, version)
140
+ repositories << parsed_repository if parsed_repository
141
+ end
142
+
143
+ repositories.find(&:git?) || repositories.first
144
+ else
145
+ raise TypeError, "version #{version} repository must be a string, object, or array"
146
+ end
147
+ end
148
+ private_class_method :parse_repository
149
+
150
+ sig { params(value: Object, context: String).returns(ObjectHash) }
151
+ def self.object_hash(value, context)
152
+ raise TypeError, "#{context} must be an object" unless value.is_a?(Hash)
153
+
154
+ result = T.let({}, ObjectHash)
155
+ value.each do |raw_key, raw_value|
156
+ key = T.cast(raw_key, Object)
157
+ raise TypeError, "#{context} keys must be strings" unless key.is_a?(String)
158
+
159
+ result[key] = T.cast(raw_value, Object)
160
+ end
161
+ result
162
+ end
163
+ private_class_method :object_hash
164
+
165
+ sig do
166
+ params(
167
+ value: Object,
168
+ context: String,
169
+ included_keys: T.nilable(T::Hash[String, T::Boolean])
170
+ ).returns(T::Hash[String, String])
171
+ end
172
+ def self.string_map(value, context, included_keys: nil)
173
+ result = T.let({}, T::Hash[String, String])
174
+ object_hash(value, context).each do |key, raw_value|
175
+ next if included_keys && !included_keys.key?(key)
176
+
177
+ raise TypeError, "#{context} values must be strings" unless raw_value.is_a?(String)
178
+
179
+ result[key] = raw_value
180
+ end
181
+ result
182
+ end
183
+ private_class_method :string_map
184
+
185
+ sig { params(value: T.nilable(Object), context: String).returns(T.nilable(String)) }
186
+ def self.optional_string(value, context)
187
+ return if value.nil?
188
+ return value if value.is_a?(String)
189
+
190
+ raise TypeError, "#{context} must be a string"
191
+ end
192
+ private_class_method :optional_string
193
+ end
194
+ end
195
+ end
@@ -12,7 +12,7 @@ require "dependabot/pull_request_creator/commit_signer"
12
12
 
13
13
  module Dependabot
14
14
  class PullRequestCreator
15
- # rubocop:disable Metrics/ClassLength
15
+ # rubocop:disable-next Metrics/ClassLength
16
16
  class Github
17
17
  extend T::Sig
18
18
  include Dependabot::Clients::GithubResourceParser
@@ -634,6 +634,5 @@ module Dependabot
634
634
  end
635
635
  end
636
636
  end
637
- # rubocop:enable Metrics/ClassLength
638
637
  end
639
638
  end
@@ -9,7 +9,7 @@ require "dependabot/credential"
9
9
 
10
10
  module Dependabot
11
11
  class PullRequestCreator
12
- # rubocop:disable Metrics/ClassLength
12
+ # rubocop:disable-next Metrics/ClassLength
13
13
  class Labeler
14
14
  extend T::Sig
15
15
 
@@ -155,9 +155,8 @@ module Dependabot
155
155
  new_version_parts = T.must(version(dep)).split(/[.+]/)
156
156
  old_version_parts = previous_version(dep)&.split(/[.+]/) || []
157
157
  all_parts = new_version_parts.first(3) + old_version_parts.first(3)
158
- # rubocop:disable Performance/RedundantEqualityComparisonBlock
158
+ # rubocop:disable-next Performance/RedundantEqualityComparisonBlock
159
159
  next 0 unless all_parts.all? { |part| part.to_i.to_s == part }
160
- # rubocop:enable Performance/RedundantEqualityComparisonBlock
161
160
  next 1 if new_version_parts[0] != old_version_parts[0]
162
161
  next 2 if new_version_parts[1] != old_version_parts[1]
163
162
 
@@ -556,6 +555,5 @@ module Dependabot
556
555
  Utils.version_class_for_package_manager(package_manager)
557
556
  end
558
557
  end
559
- # rubocop:enable Metrics/ClassLength
560
558
  end
561
559
  end
@@ -14,7 +14,7 @@ require "dependabot/pull_request_creator"
14
14
  require "dependabot/pull_request_creator/message"
15
15
  require "dependabot/notices"
16
16
 
17
- # rubocop:disable Metrics/ClassLength
17
+ # rubocop:disable-next Metrics/ClassLength
18
18
  module Dependabot
19
19
  class PullRequestCreator
20
20
  # MessageBuilder builds PR message for a dependency update
@@ -976,4 +976,3 @@ module Dependabot
976
976
  end
977
977
  end
978
978
  end
979
- # rubocop:enable Metrics/ClassLength
data/lib/dependabot.rb CHANGED
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Dependabot
5
- VERSION = "0.393.0"
5
+ VERSION = "0.395.0"
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-common
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.393.0
4
+ version: 0.395.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
@@ -147,14 +147,14 @@ dependencies:
147
147
  requirements:
148
148
  - - "<"
149
149
  - !ruby/object:Gem::Version
150
- version: '2.20'
150
+ version: '2.22'
151
151
  type: :runtime
152
152
  prerelease: false
153
153
  version_requirements: !ruby/object:Gem::Requirement
154
154
  requirements:
155
155
  - - "<"
156
156
  - !ruby/object:Gem::Version
157
- version: '2.20'
157
+ version: '2.22'
158
158
  - !ruby/object:Gem::Dependency
159
159
  name: nokogiri
160
160
  requirement: !ruby/object:Gem::Requirement
@@ -441,28 +441,28 @@ dependencies:
441
441
  requirements:
442
442
  - - "~>"
443
443
  - !ruby/object:Gem::Version
444
- version: '0.22'
444
+ version: '1.1'
445
445
  type: :development
446
446
  prerelease: false
447
447
  version_requirements: !ruby/object:Gem::Requirement
448
448
  requirements:
449
449
  - - "~>"
450
450
  - !ruby/object:Gem::Version
451
- version: '0.22'
451
+ version: '1.1'
452
452
  - !ruby/object:Gem::Dependency
453
- name: turbo_tests
453
+ name: turbo_tests2
454
454
  requirement: !ruby/object:Gem::Requirement
455
455
  requirements:
456
456
  - - "~>"
457
457
  - !ruby/object:Gem::Version
458
- version: 2.2.5
458
+ version: 3.2.7
459
459
  type: :development
460
460
  prerelease: false
461
461
  version_requirements: !ruby/object:Gem::Requirement
462
462
  requirements:
463
463
  - - "~>"
464
464
  - !ruby/object:Gem::Version
465
- version: 2.2.5
465
+ version: 3.2.7
466
466
  - !ruby/object:Gem::Dependency
467
467
  name: vcr
468
468
  requirement: !ruby/object:Gem::Requirement
@@ -572,6 +572,8 @@ files:
572
572
  - lib/dependabot/metadata_finders/base/commits_finder.rb
573
573
  - lib/dependabot/metadata_finders/base/release_finder.rb
574
574
  - lib/dependabot/notices.rb
575
+ - lib/dependabot/package/npm_package_manager_config.rb
576
+ - lib/dependabot/package/npm_registry_package.rb
575
577
  - lib/dependabot/package/package_details.rb
576
578
  - lib/dependabot/package/package_language.rb
577
579
  - lib/dependabot/package/package_latest_version_finder.rb
@@ -629,7 +631,7 @@ licenses:
629
631
  - MIT
630
632
  metadata:
631
633
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
632
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.393.0
634
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.395.0
633
635
  rdoc_options: []
634
636
  require_paths:
635
637
  - lib