dependabot-common 0.390.0 → 0.391.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.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/lib/dependabot/clients/azure.rb +1 -1
  3. data/lib/dependabot/command_helpers.rb +1 -1
  4. data/lib/dependabot/config/file_fetcher.rb +2 -2
  5. data/lib/dependabot/config/ignore_condition.rb +1 -1
  6. data/lib/dependabot/config/update_config.rb +1 -1
  7. data/lib/dependabot/dependency_group.rb +16 -0
  8. data/lib/dependabot/dependency_requirement.rb +53 -0
  9. data/lib/dependabot/ecosystem.rb +8 -8
  10. data/lib/dependabot/errors.rb +1 -1
  11. data/lib/dependabot/file_fetchers/base.rb +1 -1
  12. data/lib/dependabot/file_updaters/artifact_updater.rb +1 -1
  13. data/lib/dependabot/file_updaters/base.rb +2 -2
  14. data/lib/dependabot/metadata_finders/base/changelog_finder.rb +4 -7
  15. data/lib/dependabot/metadata_finders/base/changelog_pruner.rb +3 -3
  16. data/lib/dependabot/metadata_finders/base/commits_finder.rb +6 -5
  17. data/lib/dependabot/metadata_finders/base/release_finder.rb +24 -16
  18. data/lib/dependabot/metadata_finders/base.rb +1 -1
  19. data/lib/dependabot/package/package_details.rb +2 -2
  20. data/lib/dependabot/package/package_language.rb +3 -3
  21. data/lib/dependabot/package/package_latest_version_finder.rb +4 -3
  22. data/lib/dependabot/package/package_release.rb +11 -11
  23. data/lib/dependabot/pull_request_creator/branch_name_template.rb +3 -12
  24. data/lib/dependabot/pull_request_creator/branch_namer/solo_strategy.rb +18 -16
  25. data/lib/dependabot/pull_request_creator/labeler.rb +8 -15
  26. data/lib/dependabot/pull_request_creator/message_builder.rb +13 -13
  27. data/lib/dependabot/pull_request_creator/pr_name_prefixer.rb +10 -17
  28. data/lib/dependabot/pull_request_updater/github.rb +1 -1
  29. data/lib/dependabot/source.rb +1 -4
  30. data/lib/dependabot/update_checkers/base.rb +3 -3
  31. data/lib/dependabot/version.rb +2 -5
  32. data/lib/dependabot.rb +1 -1
  33. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9647e43655c1fb5b645ad6a5635c619fd681f12b926c6c2195492aba565b9401
4
- data.tar.gz: b50b9ac87807039b87a1c2c34fe2620bf332ceb607cd0c1acfb32189e78e3705
3
+ metadata.gz: 17a33f7a58c72db0519e97a6cafbcc82635b05e63990cc99ce0bef74aab095a5
4
+ data.tar.gz: 1cc7c71d06814db8fd53594b566e4f3b52ca89ec2429d8c7d6ba9824097865e6
5
5
  SHA512:
6
- metadata.gz: '0749c51d303699690aa4e89b2f29084d4082a83f1e1f986c023ad4089284a4a1b145729be61d8759f267c8951878a8c36537eb87037c59278f0fbd249daf71bb'
7
- data.tar.gz: 8de0c799f886104e9cd1bedd0fad7ca6e004dec5adb6f939ada8b496d37b41e324a89065542f9603b011d3ef60a9105d397f22e1c24440c029752ce94b52a56d
6
+ metadata.gz: d6fca56d5653cdbe70271dec38e5d43d225fe637ddd22c33afd015da340502bac20a41b69d244943c6dc05a6ecfc3ad0cad61220c1abf7c33dbafb4ebbd387fe
7
+ data.tar.gz: 6de41d80907590ec688ef8e178a5efb1575af696a7a88e8cf1ec482b5763c8846c792a6f88c78e45a00f574a987f1d3df13755e370edebdf043c008204fe3918
@@ -473,7 +473,7 @@ module Dependabot
473
473
  private
474
474
 
475
475
  sig { params(blk: T.proc.void).void }
476
- def retry_connection_failures(&blk) # rubocop:disable Lint/UnusedMethodArgument
476
+ def retry_connection_failures(&blk)
477
477
  retry_attempt = 0
478
478
 
479
479
  begin
@@ -35,7 +35,7 @@ module Dependabot
35
35
 
36
36
  sig { params(process_status: T.nilable(Process::Status), custom_exitstatus: T.nilable(Integer)).void }
37
37
  def initialize(process_status, custom_exitstatus = nil)
38
- @process_status = T.let(process_status, T.nilable(Process::Status))
38
+ @process_status = process_status
39
39
  @custom_exitstatus = custom_exitstatus
40
40
  end
41
41
 
@@ -10,11 +10,11 @@ module Dependabot
10
10
  class FileFetcher < FileFetchers::Base
11
11
  extend T::Sig
12
12
 
13
- CONFIG_FILE_PATHS = T.let(%w(.github/dependabot.yml .github/dependabot.yaml).freeze, T::Array[String])
13
+ CONFIG_FILE_PATHS = %w(.github/dependabot.yml .github/dependabot.yaml).freeze
14
14
 
15
15
  sig { override.params(filenames: T::Array[String]).returns(T::Boolean) }
16
16
  def self.required_files_in?(filenames)
17
- CONFIG_FILE_PATHS.any? { |file| filenames.include?(file) }
17
+ CONFIG_FILE_PATHS.intersect?(filenames)
18
18
  end
19
19
 
20
20
  sig { override.returns(String) }
@@ -32,7 +32,7 @@ module Dependabot
32
32
  ).void
33
33
  end
34
34
  def initialize(dependency_name:, versions: nil, update_types: nil)
35
- @dependency_name = T.let(dependency_name, String)
35
+ @dependency_name = dependency_name
36
36
  @versions = T.let(versions || [], T::Array[String])
37
37
  @update_types = T.let(update_types || [], T::Array[String])
38
38
  end
@@ -52,7 +52,7 @@ module Dependabot
52
52
  sig { params(dependency: Dependency).returns(Dependency) }
53
53
  def extract_base_version_from_requirement(dependency)
54
54
  requirements = dependency.requirements
55
- requirement = T.must(requirements.first)[:requirement]
55
+ requirement = T.must(requirements.first).requirement_string
56
56
  version = requirement&.match(/\d+\.\d+\.\d+/)&.to_s
57
57
  Dependabot::Dependency.new(
58
58
  name: dependency.name,
@@ -87,6 +87,22 @@ module Dependabot
87
87
  }.to_yaml.delete_prefix("---\n")
88
88
  end
89
89
 
90
+ sig { params(parent_name: String, dependency_name: String).returns(String) }
91
+ def self.subgroup_name(parent_name:, dependency_name:)
92
+ "#{parent_name}/#{dependency_name}"
93
+ end
94
+
95
+ sig do
96
+ params(subgroup_name: String, dependency_name: String)
97
+ .returns(T.nilable(String))
98
+ end
99
+ def self.parent_name_from_subgroup(subgroup_name:, dependency_name:)
100
+ suffix = "/#{dependency_name}"
101
+ return unless subgroup_name.end_with?(suffix)
102
+
103
+ subgroup_name.delete_suffix(suffix)
104
+ end
105
+
90
106
  private
91
107
 
92
108
  sig { params(dependency_name: String).returns(T::Boolean) }
@@ -153,8 +153,61 @@ module Dependabot
153
153
  raise TypeError, "requirement must be a string or nil"
154
154
  end
155
155
 
156
+ # Reads a known metadata field such as "property_name". Accepts either key
157
+ # style for the same reason as `source_string`. Returns nil when the
158
+ # requirement carries no metadata or the key is absent.
159
+ sig { params(key: String).returns(T.nilable(String)) }
160
+ def metadata_string(key)
161
+ value = metadata_value(key)
162
+ return if value.nil?
163
+ return value if value.is_a?(String)
164
+
165
+ raise TypeError, "metadata #{key} must be a string or nil"
166
+ end
167
+
168
+ # Reads a known symbol-valued metadata field such as Helm's "type".
169
+ sig { params(key: String).returns(T.nilable(Symbol)) }
170
+ def metadata_symbol(key)
171
+ value = metadata_value(key)
172
+ return if value.nil?
173
+ return value if value.is_a?(Symbol)
174
+
175
+ raise TypeError, "metadata #{key} must be a symbol or nil"
176
+ end
177
+
178
+ # Reads a nested metadata hash whose values are all strings, such as
179
+ # "dependency_set" (`{ group: "my.group", version: "1.4.0" }`). Keys are
180
+ # symbolised so callers can read them with symbols regardless of how the
181
+ # requirement was built.
182
+ sig { params(key: String).returns(T.nilable(T::Hash[Symbol, String])) }
183
+ def metadata_string_hash(key)
184
+ value = metadata_value(key)
185
+ return if value.nil?
186
+ raise TypeError, "metadata #{key} must be a hash of strings or nil" unless value.is_a?(Hash)
187
+
188
+ value.to_h do |raw_entry_key, raw_entry_value|
189
+ entry_key = T.cast(raw_entry_key, Object)
190
+ entry_value = T.cast(raw_entry_value, Object)
191
+ unless (entry_key.is_a?(Symbol) || entry_key.is_a?(String)) && entry_value.is_a?(String)
192
+ raise TypeError, "metadata #{key} must be a hash of strings or nil"
193
+ end
194
+
195
+ [entry_key.to_sym, entry_value]
196
+ end
197
+ end
198
+
156
199
  private
157
200
 
201
+ # Reads a raw metadata field, accepting either key style. Nil when the
202
+ # requirement carries no metadata or the key is absent.
203
+ sig { params(key: String).returns(T.nilable(Object)) }
204
+ def metadata_value(key)
205
+ details = metadata
206
+ return if details.nil?
207
+
208
+ details[key.to_sym] || details[key]
209
+ end
210
+
158
211
  sig { params(key: Symbol).returns(T.nilable(String)) }
159
212
  def optional_string(key)
160
213
  value = T.cast(self[key], T.nilable(Object))
@@ -46,12 +46,12 @@ module Dependabot
46
46
  supported_versions: [],
47
47
  requirement: nil
48
48
  )
49
- @name = T.let(name, String)
49
+ @name = name
50
50
  @detected_version = T.let(detected_version || version, T.nilable(Dependabot::Version))
51
- @version = T.let(version, T.nilable(Dependabot::Version))
52
- @deprecated_versions = T.let(deprecated_versions, T::Array[Dependabot::Version])
53
- @supported_versions = T.let(supported_versions, T::Array[Dependabot::Version])
54
- @requirement = T.let(requirement, T.nilable(Dependabot::Requirement))
51
+ @version = version
52
+ @deprecated_versions = deprecated_versions
53
+ @supported_versions = supported_versions
54
+ @requirement = requirement
55
55
  end
56
56
 
57
57
  # The name of the package manager (e.g., "bundler", "npm").
@@ -177,9 +177,9 @@ module Dependabot
177
177
  package_manager:,
178
178
  language: nil
179
179
  )
180
- @name = T.let(name, String)
181
- @package_manager = T.let(package_manager, VersionManager)
182
- @language = T.let(language, T.nilable(VersionManager))
180
+ @name = name
181
+ @package_manager = package_manager
182
+ @language = language
183
183
  end
184
184
 
185
185
  # The name of the ecosystem (mandatory).
@@ -483,7 +483,7 @@ module Dependabot
483
483
 
484
484
  sig { params(error_type: String, message: T.any(T.nilable(String), MatchData)).void }
485
485
  def initialize(error_type, message = nil)
486
- @error_type = T.let(error_type, String)
486
+ @error_type = error_type
487
487
 
488
488
  super(message || error_type)
489
489
  end
@@ -325,7 +325,7 @@ module Dependabot
325
325
 
326
326
  sig { params(path: String).returns(T::Boolean) }
327
327
  def in_submodule?(path)
328
- subpaths(path.delete_prefix("/")).any? { |subpath| @submodules.include?(subpath) }
328
+ subpaths(path.delete_prefix("/")).intersect?(@submodules)
329
329
  end
330
330
 
331
331
  # Given a "foo/bar/baz" path, returns ["foo", "foo/bar", "foo/bar/baz"]
@@ -78,7 +78,7 @@ module Dependabot
78
78
 
79
79
  private
80
80
 
81
- TEXT_ENCODINGS = T.let(%w(us-ascii utf-8).freeze, T::Array[String])
81
+ TEXT_ENCODINGS = %w(us-ascii utf-8).freeze
82
82
 
83
83
  sig { returns(T.nilable(String)) }
84
84
  attr_reader :repo_contents_path
@@ -1,4 +1,4 @@
1
- # typed: strict
1
+ # typed: strong
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "sorbet-runtime"
@@ -79,7 +79,7 @@ module Dependabot
79
79
  def requirement_changed?(file, dependency)
80
80
  changed_requirements = dependency.requirements - T.must(dependency.previous_requirements)
81
81
 
82
- changed_requirements.any? { |f| f[:file] == file.name }
82
+ changed_requirements.any? { |f| f.file == file.name }
83
83
  end
84
84
 
85
85
  sig { params(file: Dependabot::DependencyFile, content: String).returns(Dependabot::DependencyFile) }
@@ -62,10 +62,7 @@ module Dependabot
62
62
  require_relative "commits_finder"
63
63
 
64
64
  # Earlier entries are preferred
65
- CHANGELOG_NAMES = T.let(
66
- %w(changelog news changes history release whatsnew releases).freeze,
67
- T::Array[String]
68
- )
65
+ CHANGELOG_NAMES = %w(changelog news changes history release whatsnew releases).freeze
69
66
 
70
67
  sig { returns(T.nilable(Dependabot::Source)) }
71
68
  attr_reader :source
@@ -452,7 +449,7 @@ module Dependabot
452
449
  sig { returns(T.nilable(String)) }
453
450
  def previous_ref
454
451
  previous_refs = dependency.previous_requirements&.filter_map do |r|
455
- r.dig(:source, "ref") || r.dig(:source, :ref)
452
+ r.source_string("ref")
456
453
  end&.uniq
457
454
  previous_refs.first if previous_refs&.one?
458
455
  end
@@ -460,7 +457,7 @@ module Dependabot
460
457
  sig { returns(T.nilable(String)) }
461
458
  def new_ref
462
459
  new_refs = dependency.requirements.filter_map do |r|
463
- r.dig(:source, "ref") || r.dig(:source, :ref)
460
+ r.source_string("ref")
464
461
  end.uniq
465
462
  new_refs.first if new_refs.one?
466
463
  end
@@ -479,7 +476,7 @@ module Dependabot
479
476
  return false if dependency.package_manager == "composer"
480
477
 
481
478
  requirements = dependency.requirements
482
- sources = requirements.map { |r| r.fetch(:source) }.uniq.compact
479
+ sources = requirements.map(&:source_hash).uniq.compact
483
480
  return false if sources.empty?
484
481
 
485
482
  sources.all? { |s| s[:type] == "git" || s["type"] == "git" }
@@ -169,7 +169,7 @@ module Dependabot
169
169
  sig { returns(T.nilable(String)) }
170
170
  def previous_ref
171
171
  previous_refs = T.must(dependency.previous_requirements).filter_map do |r|
172
- r.dig(:source, "ref") || r.dig(:source, :ref)
172
+ r.source_string("ref")
173
173
  end.uniq
174
174
  previous_refs.first if previous_refs.one?
175
175
  end
@@ -177,7 +177,7 @@ module Dependabot
177
177
  sig { returns(T.nilable(String)) }
178
178
  def new_ref
179
179
  new_refs = dependency.requirements.filter_map do |r|
180
- r.dig(:source, "ref") || r.dig(:source, :ref)
180
+ r.source_string("ref")
181
181
  end.uniq
182
182
  new_refs.first if new_refs.one?
183
183
  end
@@ -190,7 +190,7 @@ module Dependabot
190
190
  return false if dependency.package_manager == "composer"
191
191
 
192
192
  requirements = dependency.requirements
193
- sources = requirements.map { |r| r.fetch(:source) }.uniq.compact
193
+ sources = requirements.map(&:source_hash).uniq.compact
194
194
  return false if sources.empty?
195
195
 
196
196
  sources.all? { |s| s[:type] == "git" || s["type"] == "git" }
@@ -136,10 +136,11 @@ module Dependabot
136
136
  sig { params(version: T.nilable(Dependabot::Version)).returns(T::Boolean) }
137
137
  def satisfies_previous_reqs?(version)
138
138
  T.must(dependency.previous_requirements).all? do |req|
139
- next true unless req.fetch(:requirement)
139
+ requirement = req.requirement_string
140
+ next true unless requirement
140
141
 
141
142
  requirement_class
142
- .requirements_array(req.fetch(:requirement))
143
+ .requirements_array(requirement)
143
144
  .all? { |r| r.satisfied_by?(version) }
144
145
  end
145
146
  end
@@ -151,7 +152,7 @@ module Dependabot
151
152
  # internally
152
153
  return false if dependency.package_manager == "composer"
153
154
 
154
- sources = requirements&.map { |r| r.fetch(:source) }&.uniq&.compact
155
+ sources = requirements&.map(&:source_hash)&.uniq&.compact
155
156
  return false if sources.nil? || sources.empty?
156
157
 
157
158
  sources.all? { |s| s[:type] == "git" || s["type"] == "git" }
@@ -168,7 +169,7 @@ module Dependabot
168
169
  return unless git_source?(dependency.previous_requirements)
169
170
 
170
171
  previous_refs = T.must(dependency.previous_requirements).filter_map do |r|
171
- r.dig(:source, "ref") || r.dig(:source, :ref)
172
+ r.source_string("ref")
172
173
  end.uniq
173
174
  previous_refs.first if previous_refs.one?
174
175
  end
@@ -178,7 +179,7 @@ module Dependabot
178
179
  return unless git_source?(dependency.previous_requirements)
179
180
 
180
181
  new_refs = dependency.requirements.filter_map do |r|
181
- r.dig(:source, "ref") || r.dig(:source, :ref)
182
+ r.source_string("ref")
182
183
  end.uniq
183
184
  new_refs.first if new_refs.one?
184
185
  end
@@ -198,15 +198,9 @@ module Dependabot
198
198
  sig { params(releases: T::Array[ReleaseType], conservative: T::Boolean).returns(T::Array[ReleaseType]) }
199
199
  def filter_releases_using_previous_version(releases, conservative:)
200
200
  releases.reject do |release|
201
- cleaned_tag = release.tag_name.gsub(/^[^0-9]*/, "")
202
- cleaned_name = release.name&.gsub(/^[^0-9]*/, "")
203
- dot_count = [cleaned_tag, cleaned_name].compact.reject(&:empty?)
204
- .map { |nm| nm.chars.count(".") }.max
201
+ next false if release_tag_matches_version?(release, new_version)
205
202
 
206
- tag_version = [cleaned_tag, cleaned_name].compact.reject(&:empty?)
207
- .select { |nm| version_class.correct?(nm) }
208
- .select { |nm| nm.chars.count(".") == dot_count }
209
- .map { |nm| version_class.new(nm) }.max
203
+ tag_version = possible_versions(release).max
210
204
 
211
205
  next conservative unless tag_version
212
206
 
@@ -221,15 +215,9 @@ module Dependabot
221
215
  updated_version = version_class.new(new_version)
222
216
 
223
217
  releases.reject do |release|
224
- cleaned_tag = release.tag_name.gsub(/^[^0-9]*/, "")
225
- cleaned_name = release.name&.gsub(/^[^0-9]*/, "")
226
- dot_count = [cleaned_tag, cleaned_name].compact.reject(&:empty?)
227
- .map { |nm| nm.chars.count(".") }.max
218
+ next false if release_tag_matches_version?(release, new_version)
228
219
 
229
- tag_version = [cleaned_tag, cleaned_name].compact.reject(&:empty?)
230
- .select { |nm| version_class.correct?(nm) }
231
- .select { |nm| nm.chars.count(".") == dot_count }
232
- .map { |nm| version_class.new(nm) }.min
220
+ tag_version = possible_versions(release).min
233
221
 
234
222
  next conservative unless tag_version
235
223
 
@@ -239,6 +227,26 @@ module Dependabot
239
227
  end
240
228
  end
241
229
 
230
+ sig { params(release: ReleaseType).returns(T::Array[Dependabot::Version]) }
231
+ def possible_versions(release)
232
+ candidates = [release.tag_name, release.name].compact
233
+ .map { |name| name.gsub(/^[^0-9]*/, "") }
234
+ .reject(&:empty?)
235
+ .select { |name| version_class.correct?(name) }
236
+ dot_count = candidates.map { |name| name.chars.count(".") }.max
237
+ return [] unless dot_count
238
+
239
+ candidates.select { |name| name.chars.count(".") == dot_count }
240
+ .map { |name| version_class.new(name) }
241
+ end
242
+
243
+ sig { params(release: ReleaseType, version: T.nilable(String)).returns(T::Boolean) }
244
+ def release_tag_matches_version?(release, version)
245
+ return false unless version
246
+
247
+ release.tag_name.gsub(/^[^0-9]*/, "") == version.gsub(/^[^0-9]*/, "")
248
+ end
249
+
242
250
  sig { returns(T.nilable(ReleaseType)) }
243
251
  def updated_release
244
252
  release_for_version(new_version)
@@ -15,7 +15,7 @@ module Dependabot
15
15
  require "dependabot/metadata_finders/base/release_finder"
16
16
  require "dependabot/metadata_finders/base/commits_finder"
17
17
 
18
- PACKAGE_MANAGERS_WITH_RELIABLE_DIRECTORIES = T.let(%w(bun npm_and_yarn pub).freeze, T::Array[String])
18
+ PACKAGE_MANAGERS_WITH_RELIABLE_DIRECTORIES = %w(bun npm_and_yarn pub).freeze
19
19
 
20
20
  sig { returns(Dependabot::Dependency) }
21
21
  attr_reader :dependency
@@ -20,12 +20,12 @@ module Dependabot
20
20
  ).void
21
21
  end
22
22
  def initialize(dependency:, releases: [], dist_tags: nil)
23
- @dependency = T.let(dependency, Dependabot::Dependency)
23
+ @dependency = dependency
24
24
  @releases = T.let(
25
25
  releases.sort_by(&:version).reverse,
26
26
  T::Array[Dependabot::Package::PackageRelease]
27
27
  )
28
- @dist_tags = T.let(dist_tags, T.nilable(T::Hash[String, String]))
28
+ @dist_tags = dist_tags
29
29
  end
30
30
 
31
31
  sig { returns(Dependabot::Dependency) }
@@ -15,9 +15,9 @@ module Dependabot
15
15
  ).void
16
16
  end
17
17
  def initialize(name:, version: nil, requirement: nil)
18
- @name = T.let(name, String)
19
- @version = T.let(version, T.nilable(Dependabot::Version))
20
- @requirement = T.let(requirement, T.nilable(Dependabot::Requirement))
18
+ @name = name
19
+ @version = version
20
+ @requirement = requirement
21
21
  end
22
22
 
23
23
  sig { returns(String) }
@@ -290,9 +290,10 @@ module Dependabot
290
290
  end
291
291
  def filter_out_of_range_versions(releases)
292
292
  reqs = dependency.requirements.filter_map do |r|
293
- next if r.fetch(:requirement).nil?
293
+ requirement = r.requirement_string
294
+ next if requirement.nil?
294
295
 
295
- requirement_class.requirements_array(r.fetch(:requirement))
296
+ requirement_class.requirements_array(requirement)
296
297
  end
297
298
 
298
299
  releases
@@ -325,7 +326,7 @@ module Dependabot
325
326
  return true if dependency.numeric_version&.prerelease?
326
327
 
327
328
  dependency.requirements.any? do |req|
328
- req_string = req.fetch(:requirement) || ""
329
+ req_string = req.requirement_string || ""
329
330
  req_string.split(",").map(&:strip).any? do |r|
330
331
  version_str = r.gsub(/^\s*[!<>=~^]+\s*/, "").strip
331
332
  next false unless version_class.correct?(version_str)
@@ -40,17 +40,17 @@ module Dependabot
40
40
  tag: nil,
41
41
  details: {}
42
42
  )
43
- @version = T.let(version, Dependabot::Version)
44
- @released_at = T.let(released_at, T.nilable(Time))
45
- @latest = T.let(latest, T::Boolean)
46
- @yanked = T.let(yanked, T::Boolean)
47
- @yanked_reason = T.let(yanked_reason, T.nilable(String))
48
- @downloads = T.let(downloads, T.nilable(Integer))
49
- @url = T.let(url, T.nilable(String))
50
- @package_type = T.let(package_type, T.nilable(String))
51
- @language = T.let(language, T.nilable(Dependabot::Package::PackageLanguage))
52
- @tag = T.let(tag, T.nilable(String))
53
- @details = T.let(details, T::Hash[String, T.anything])
43
+ @version = version
44
+ @released_at = released_at
45
+ @latest = latest
46
+ @yanked = yanked
47
+ @yanked_reason = yanked_reason
48
+ @downloads = downloads
49
+ @url = url
50
+ @package_type = package_type
51
+ @language = language
52
+ @tag = tag
53
+ @details = details
54
54
  end
55
55
 
56
56
  sig { returns(Dependabot::Version) }
@@ -13,18 +13,9 @@ module Dependabot
13
13
 
14
14
  class Error < Dependabot::DependabotError; end
15
15
 
16
- SOLO_PLACEHOLDERS = T.let(
17
- %w(prefix package_manager directory target_branch dependency version name).freeze,
18
- T::Array[String]
19
- )
20
- GROUP_PLACEHOLDERS = T.let(
21
- %w(prefix package_manager directory target_branch group_name name).freeze,
22
- T::Array[String]
23
- )
24
- MULTI_ECO_PLACEHOLDERS = T.let(
25
- %w(prefix target_branch group_name name).freeze,
26
- T::Array[String]
27
- )
16
+ SOLO_PLACEHOLDERS = %w(prefix package_manager directory target_branch dependency version name).freeze
17
+ GROUP_PLACEHOLDERS = %w(prefix package_manager directory target_branch group_name name).freeze
18
+ MULTI_ECO_PLACEHOLDERS = %w(prefix target_branch group_name name).freeze
28
19
 
29
20
  # ---------------------------------------------------------------
30
21
  # 1. validate_template(template, strategy:)
@@ -1,4 +1,4 @@
1
- # typed: strict
1
+ # typed: strong
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "digest"
@@ -88,14 +88,14 @@ module Dependabot
88
88
  def updating_a_property?
89
89
  T.must(dependencies.first)
90
90
  .requirements
91
- .any? { |r| r.dig(:metadata, :property_name) }
91
+ .any? { |r| r.metadata_string("property_name") }
92
92
  end
93
93
 
94
94
  sig { returns(T::Boolean) }
95
95
  def updating_a_dependency_set?
96
96
  T.must(dependencies.first)
97
97
  .requirements
98
- .any? { |r| r.dig(:metadata, :dependency_set) }
98
+ .any? { |r| r.metadata_string_hash("dependency_set") }
99
99
  end
100
100
 
101
101
  sig { returns(String) }
@@ -103,8 +103,8 @@ module Dependabot
103
103
  @property_name ||=
104
104
  T.let(
105
105
  T.must(dependencies.first).requirements
106
- .find { |r| r.dig(:metadata, :property_name) }
107
- &.dig(:metadata, :property_name),
106
+ .find { |r| r.metadata_string("property_name") }
107
+ &.metadata_string("property_name"),
108
108
  T.nilable(String)
109
109
  )
110
110
 
@@ -118,9 +118,9 @@ module Dependabot
118
118
  @dependency_set ||=
119
119
  T.let(
120
120
  T.must(dependencies.first).requirements
121
- .find { |r| r.dig(:metadata, :dependency_set) }
122
- &.dig(:metadata, :dependency_set),
123
- T.nilable(T::Hash[String, String])
121
+ .find { |r| r.metadata_string_hash("dependency_set") }
122
+ &.metadata_string_hash("dependency_set"),
123
+ T.nilable(T::Hash[Symbol, String])
124
124
  )
125
125
 
126
126
  raise "No dependency set!" unless @dependency_set
@@ -172,9 +172,11 @@ module Dependabot
172
172
  T.must(dependency.version)[0..6]
173
173
  elsif dependency.version == dependency.previous_version &&
174
174
  package_manager == "docker"
175
- dependency.requirements
176
- .filter_map { |r| r.dig(:source, "digest") || r.dig(:source, :digest) }
177
- .first.split(":").last[0..6]
175
+ T.must(
176
+ dependency.requirements
177
+ .filter_map { |r| r.source_string("digest") }
178
+ .first
179
+ ).split(":").last&.[](0..6)
178
180
  else
179
181
  dependency.version
180
182
  end
@@ -183,7 +185,7 @@ module Dependabot
183
185
  sig { params(dependency: Dependabot::Dependency).returns(T.nilable(String)) }
184
186
  def previous_ref(dependency)
185
187
  previous_refs = T.must(dependency.previous_requirements).filter_map do |r|
186
- r.dig(:source, "ref") || r.dig(:source, :ref)
188
+ r.source_string("ref")
187
189
  end.uniq
188
190
  previous_refs.first if previous_refs.one?
189
191
  end
@@ -191,7 +193,7 @@ module Dependabot
191
193
  sig { params(dependency: Dependabot::Dependency).returns(T.nilable(String)) }
192
194
  def new_ref(dependency)
193
195
  new_refs = dependency.requirements.filter_map do |r|
194
- r.dig(:source, "ref") || r.dig(:source, :ref)
196
+ r.source_string("ref")
195
197
  end.uniq
196
198
  new_refs.first if new_refs.one?
197
199
  end
@@ -208,10 +210,10 @@ module Dependabot
208
210
  dependency.requirements - T.must(dependency.previous_requirements)
209
211
 
210
212
  gemspec =
211
- updated_reqs.find { |r| r[:file].match?(%r{^[^/]*\.gemspec$}) }
212
- return gemspec[:requirement] if gemspec
213
+ updated_reqs.find { |r| T.must(r.file).match?(%r{^[^/]*\.gemspec$}) }
214
+ return gemspec.requirement_string if gemspec
213
215
 
214
- updated_reqs.first&.fetch(:requirement)
216
+ updated_reqs.first&.requirement_string
215
217
  end
216
218
 
217
219
  # TODO: Bring this in line with existing library checks that we do in the
@@ -165,43 +165,36 @@ module Dependabot
165
165
  )
166
166
  end
167
167
 
168
- # rubocop:disable Metrics/PerceivedComplexity
169
168
  sig { params(dep: Dependabot::Dependency).returns(T.nilable(String)) }
170
169
  def version(dep)
171
170
  return dep.version if version_class.correct?(dep.version)
172
171
 
173
- source = dep.requirements.find { |r| r.fetch(:source) }&.fetch(:source)
174
- type = source&.fetch("type", nil) || source&.fetch(:type)
175
- return dep.version unless type == "git"
172
+ source = dep.requirements.find(&:source)
173
+ return dep.version if source.nil?
174
+ return dep.version unless source.source_string("type") == "git"
176
175
 
177
- ref = source.fetch("ref", nil) || source.fetch(:ref)
178
- version_from_ref = ref&.gsub(/^v/, "")
176
+ version_from_ref = source.source_string("ref")&.gsub(/^v/, "")
179
177
  return dep.version unless version_from_ref
180
178
  return dep.version unless version_class.correct?(version_from_ref)
181
179
 
182
180
  version_from_ref
183
181
  end
184
- # rubocop:enable Metrics/PerceivedComplexity
185
182
 
186
- # rubocop:disable Metrics/PerceivedComplexity
187
183
  sig { params(dep: Dependabot::Dependency).returns(T.nilable(String)) }
188
184
  def previous_version(dep)
189
185
  version_str = dep.previous_version
190
186
  return version_str if version_class.correct?(version_str)
191
187
 
192
- source = T.must(dep.previous_requirements)
193
- .find { |r| r.fetch(:source) }&.fetch(:source)
194
- type = source&.fetch("type", nil) || source&.fetch(:type)
195
- return version_str unless type == "git"
188
+ source = T.must(dep.previous_requirements).find(&:source)
189
+ return version_str if source.nil?
190
+ return version_str unless source.source_string("type") == "git"
196
191
 
197
- ref = source.fetch("ref", nil) || source.fetch(:ref)
198
- version_from_ref = ref&.gsub(/^v/, "")
192
+ version_from_ref = source.source_string("ref")&.gsub(/^v/, "")
199
193
  return version_str unless version_from_ref
200
194
  return version_str unless version_class.correct?(version_from_ref)
201
195
 
202
196
  version_from_ref
203
197
  end
204
- # rubocop:enable Metrics/PerceivedComplexity
205
198
 
206
199
  sig { returns(T.nilable(T::Array[String])) }
207
200
  def create_default_dependencies_label_if_required
@@ -636,14 +636,14 @@ module Dependabot
636
636
  def updating_a_property?
637
637
  T.must(dependencies.first)
638
638
  .requirements
639
- .any? { |r| r.dig(:metadata, :property_name) }
639
+ .any? { |r| r.metadata_string("property_name") }
640
640
  end
641
641
 
642
642
  sig { returns(T::Boolean) }
643
643
  def updating_a_dependency_set?
644
644
  T.must(dependencies.first)
645
645
  .requirements
646
- .any? { |r| r.dig(:metadata, :dependency_set) }
646
+ .any? { |r| r.metadata_string_hash("dependency_set") }
647
647
  end
648
648
 
649
649
  sig { returns(T::Boolean) }
@@ -663,8 +663,8 @@ module Dependabot
663
663
  T.let(
664
664
  dependencies.first
665
665
  &.requirements
666
- &.find { |r| r.dig(:metadata, :property_name) }
667
- &.dig(:metadata, :property_name),
666
+ &.find { |r| r.metadata_string("property_name") }
667
+ &.metadata_string("property_name"),
668
668
  T.nilable(String)
669
669
  )
670
670
 
@@ -679,9 +679,9 @@ module Dependabot
679
679
  T.let(
680
680
  dependencies.first
681
681
  &.requirements
682
- &.find { |r| r.dig(:metadata, :dependency_set) }
683
- &.dig(:metadata, :dependency_set),
684
- T.nilable(T.nilable(T::Hash[Symbol, String]))
682
+ &.find { |r| r.metadata_string_hash("dependency_set") }
683
+ &.metadata_string_hash("dependency_set"),
684
+ T.nilable(T::Hash[Symbol, String])
685
685
  )
686
686
 
687
687
  raise "No dependency set!" unless @dependency_set
@@ -910,10 +910,10 @@ module Dependabot
910
910
  T.must(dependency.previous_requirements) - dependency.requirements
911
911
 
912
912
  gemspec =
913
- old_reqs.find { |r| r[:file].match?(%r{^[^/]*\.gemspec$}) }
914
- return gemspec.fetch(:requirement) if gemspec
913
+ old_reqs.find { |r| T.must(r.file).match?(%r{^[^/]*\.gemspec$}) }
914
+ return gemspec.requirement_string if gemspec
915
915
 
916
- req = T.must(old_reqs.first).fetch(:requirement)
916
+ req = T.must(old_reqs.first).requirement_string
917
917
  return req if req
918
918
 
919
919
  dependency.previous_ref if dependency.ref_changed?
@@ -925,10 +925,10 @@ module Dependabot
925
925
  dependency.requirements - T.must(dependency.previous_requirements)
926
926
 
927
927
  gemspec =
928
- updated_reqs.find { |r| r[:file].match?(%r{^[^/]*\.gemspec$}) }
929
- return gemspec.fetch(:requirement) if gemspec
928
+ updated_reqs.find { |r| T.must(r.file).match?(%r{^[^/]*\.gemspec$}) }
929
+ return T.must(gemspec.requirement_string) if gemspec
930
930
 
931
- req = T.must(updated_reqs.first).fetch(:requirement)
931
+ req = T.must(updated_reqs.first).requirement_string
932
932
  return req if req
933
933
  return T.must(dependency.new_ref) if dependency.ref_changed? && dependency.new_ref
934
934
 
@@ -16,23 +16,16 @@ module Dependabot
16
16
  class PrNamePrefixer # rubocop:disable Metrics/ClassLength
17
17
  extend T::Sig
18
18
 
19
- ANGULAR_PREFIXES = T.let(
20
- %w(build chore ci docs feat fix perf refactor style test).freeze,
21
- T::Array[String]
22
- )
23
- ESLINT_PREFIXES = T.let(
24
- %w(Breaking Build Chore Docs Fix New Update Upgrade).freeze,
25
- T::Array[String]
26
- )
27
- GITMOJI_PREFIXES = T.let(
28
- %w(alien ambulance apple arrow_down arrow_up art beers bento bookmark boom bug building_construction bulb
29
- busts_in_silhouette camera_flash card_file_box chart_with_upwards_trend checkered_flag children_crossing
30
- clown_face construction construction_worker egg fire globe_with_meridians green_apple green_heart hankey
31
- heavy_minus_sign heavy_plus_sign iphone lipstick lock loud_sound memo mute ok_hand package page_facing_up
32
- pencil2 penguin pushpin recycle rewind robot rocket rotating_light see_no_evil sparkles speech_balloon tada
33
- truck twisted_rightwards_arrows whale wheelchair white_check_mark wrench zap).freeze,
34
- T::Array[String]
35
- )
19
+ ANGULAR_PREFIXES = %w(build chore ci docs feat fix perf refactor style test).freeze
20
+ ESLINT_PREFIXES = %w(Breaking Build Chore Docs Fix New Update Upgrade).freeze
21
+ GITMOJI_PREFIXES = %w(
22
+ alien ambulance apple arrow_down arrow_up art beers bento bookmark boom bug building_construction
23
+ bulb busts_in_silhouette camera_flash card_file_box chart_with_upwards_trend checkered_flag children_crossing
24
+ clown_face construction construction_worker egg fire globe_with_meridians green_apple green_heart hankey
25
+ heavy_minus_sign heavy_plus_sign iphone lipstick lock loud_sound memo mute ok_hand package page_facing_up
26
+ pencil2 penguin pushpin recycle rewind robot rocket rotating_light see_no_evil sparkles speech_balloon tada
27
+ truck twisted_rightwards_arrows whale wheelchair white_check_mark wrench zap
28
+ ).freeze
36
29
 
37
30
  sig do
38
31
  params(
@@ -70,7 +70,7 @@ module Dependabot
70
70
  @pull_request_number = pull_request_number
71
71
  @author_details = author_details
72
72
  @signature_key = signature_key
73
- @commit_message = T.let(commit_message, T.nilable(String))
73
+ @commit_message = commit_message
74
74
  end
75
75
 
76
76
  sig { returns(T.nilable(Sawyer::Resource)) }
@@ -63,10 +63,7 @@ module Dependabot
63
63
  (?:#{CODECOMMIT_SOURCE})
64
64
  /x
65
65
 
66
- IGNORED_PROVIDER_HOSTS = T.let(
67
- %w(gitbox.apache.org svn.apache.org fuchsia.googlesource.com).freeze,
68
- T::Array[String]
69
- )
66
+ IGNORED_PROVIDER_HOSTS = %w(gitbox.apache.org svn.apache.org fuchsia.googlesource.com).freeze
70
67
 
71
68
  sig { returns(String) }
72
69
  attr_accessor :provider
@@ -379,7 +379,7 @@ module Dependabot
379
379
  return false
380
380
  end
381
381
 
382
- updated_requirements.none? { |r| r[:requirement] == :unfixable }
382
+ updated_requirements.none? { |r| r.requirement == :unfixable }
383
383
  end
384
384
 
385
385
  sig { returns(T::Boolean) }
@@ -415,7 +415,7 @@ module Dependabot
415
415
  def version_from_requirements
416
416
  @version_from_requirements ||=
417
417
  T.let(
418
- dependency.requirements.filter_map { |r| r.fetch(:requirement) }
418
+ dependency.requirements.filter_map(&:requirement_string)
419
419
  .flat_map { |req_str| requirement_class.requirements_array(req_str) }
420
420
  .flat_map(&:requirements)
421
421
  .reject { |req_array| req_array.first.start_with?("<") }
@@ -429,7 +429,7 @@ module Dependabot
429
429
  def requirements_can_update?
430
430
  return false if changed_requirements.none?
431
431
 
432
- changed_requirements.none? { |r| r[:requirement] == :unfixable }
432
+ changed_requirements.none? { |r| r.requirement == :unfixable }
433
433
  end
434
434
  end
435
435
  end
@@ -97,8 +97,7 @@ module Dependabot
97
97
  end
98
98
 
99
99
  # https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
100
- SEMVER_REGEX = T.let(
101
- /
100
+ SEMVER_REGEX = /
102
101
  # major.minor.patch
103
102
  ^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)
104
103
  # pre-release
@@ -109,9 +108,7 @@ module Dependabot
109
108
  # build metadata
110
109
  (?:\+(
111
110
  [0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*
112
- ))?$/x,
113
- Regexp
114
- )
111
+ ))?$/x
115
112
 
116
113
  sig { params(version: String).returns(T::Boolean) }
117
114
  def self.valid_semver?(version)
data/lib/dependabot.rb CHANGED
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Dependabot
5
- VERSION = "0.390.0"
5
+ VERSION = "0.391.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.390.0
4
+ version: 0.391.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
@@ -625,7 +625,7 @@ licenses:
625
625
  - MIT
626
626
  metadata:
627
627
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
628
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.390.0
628
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.391.0
629
629
  rdoc_options: []
630
630
  require_paths:
631
631
  - lib