dependabot-bundler 0.333.0 → 0.334.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.
@@ -1,4 +1,4 @@
1
- # typed: true
1
+ # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "sorbet-runtime"
@@ -23,21 +23,36 @@ module Dependabot
23
23
  T::Array[Dependabot::RequirementsUpdateStrategy]
24
24
  )
25
25
 
26
+ sig do
27
+ params(
28
+ requirements: T::Array[T::Hash[Symbol, T.untyped]],
29
+ update_strategy: Dependabot::RequirementsUpdateStrategy,
30
+ updated_source: T.nilable(T::Hash[Symbol, T.untyped]),
31
+ latest_version: T.nilable(String),
32
+ latest_resolvable_version: T.nilable(String)
33
+ ).void
34
+ end
26
35
  def initialize(requirements:, update_strategy:, updated_source:,
27
36
  latest_version:, latest_resolvable_version:)
28
37
  @requirements = requirements
29
- @latest_version = Dependabot::Bundler::Version.new(latest_version) if latest_version
38
+ @latest_version = T.let(
39
+ (T.cast(Dependabot::Bundler::Version.new(latest_version), Dependabot::Bundler::Version) if latest_version),
40
+ T.nilable(Dependabot::Bundler::Version)
41
+ )
30
42
  @updated_source = updated_source
31
43
  @update_strategy = update_strategy
32
44
 
33
45
  check_update_strategy
34
46
 
35
- return unless latest_resolvable_version
36
-
37
- @latest_resolvable_version =
38
- Dependabot::Bundler::Version.new(latest_resolvable_version)
47
+ @latest_resolvable_version = T.let(
48
+ if latest_resolvable_version
49
+ T.cast(Dependabot::Bundler::Version.new(latest_resolvable_version), Dependabot::Bundler::Version)
50
+ end,
51
+ T.nilable(Dependabot::Bundler::Version)
52
+ )
39
53
  end
40
54
 
55
+ sig { returns(T::Array[T::Hash[Symbol, T.untyped]]) }
41
56
  def updated_requirements
42
57
  return requirements if update_strategy.lockfile_only?
43
58
 
@@ -54,18 +69,25 @@ module Dependabot
54
69
 
55
70
  private
56
71
 
72
+ sig { returns(T::Array[T::Hash[Symbol, T.untyped]]) }
57
73
  attr_reader :requirements
74
+ sig { returns(T.nilable(T::Hash[Symbol, T.untyped])) }
58
75
  attr_reader :updated_source
76
+ sig { returns(T.nilable(Dependabot::Bundler::Version)) }
59
77
  attr_reader :latest_version
78
+ sig { returns(T.nilable(Dependabot::Bundler::Version)) }
60
79
  attr_reader :latest_resolvable_version
80
+ sig { returns(Dependabot::RequirementsUpdateStrategy) }
61
81
  attr_reader :update_strategy
62
82
 
83
+ sig { void }
63
84
  def check_update_strategy
64
85
  return if ALLOWED_UPDATE_STRATEGIES.include?(update_strategy)
65
86
 
66
87
  raise "Unknown update strategy: #{update_strategy}"
67
88
  end
68
89
 
90
+ sig { params(req: T::Hash[Symbol, T.untyped]).returns(T::Hash[Symbol, T.untyped]) }
69
91
  def update_gemfile_requirement(req)
70
92
  req = req.merge(source: updated_source)
71
93
  return req unless latest_resolvable_version
@@ -79,12 +101,14 @@ module Dependabot
79
101
  end
80
102
  end
81
103
 
104
+ sig { params(req: T::Hash[Symbol, T.untyped]).returns(T::Hash[Symbol, T.untyped]) }
82
105
  def update_version_requirement_if_needed(req)
83
106
  return req if new_version_satisfies?(req)
84
107
 
85
108
  update_version_requirement(req)
86
109
  end
87
110
 
111
+ sig { params(req: T::Hash[Symbol, T.untyped]).returns(T::Hash[Symbol, T.untyped]) }
88
112
  def update_version_requirement(req)
89
113
  requirements =
90
114
  req[:requirement].split(",").map { |r| Gem::Requirement.new(r) }
@@ -93,7 +117,7 @@ module Dependabot
93
117
  if requirements.any?(&:exact?) then latest_resolvable_version.to_s
94
118
  elsif requirements.any? { |r| r.to_s.start_with?("~>") }
95
119
  tw_req = requirements.find { |r| r.to_s.start_with?("~>") }
96
- update_twiddle_version(tw_req, latest_resolvable_version).to_s
120
+ update_twiddle_version(tw_req, T.must(latest_resolvable_version)).to_s
97
121
  else
98
122
  update_gemfile_range(requirements).map(&:to_s).join(", ")
99
123
  end
@@ -101,10 +125,14 @@ module Dependabot
101
125
  req.merge(requirement: new_requirement)
102
126
  end
103
127
 
128
+ sig { params(req: T::Hash[Symbol, T.untyped]).returns(T::Boolean) }
104
129
  def new_version_satisfies?(req)
105
- Requirement.satisfied_by?(req, latest_resolvable_version)
130
+ return false unless latest_resolvable_version
131
+
132
+ Requirement.satisfied_by?(req, T.must(latest_resolvable_version))
106
133
  end
107
134
 
135
+ sig { params(requirements: T::Array[Gem::Requirement]).returns(T::Array[Gem::Requirement]) }
108
136
  def update_gemfile_range(requirements)
109
137
  updated_requirements =
110
138
  requirements.flat_map do |r|
@@ -112,7 +140,7 @@ module Dependabot
112
140
 
113
141
  case op = r.requirements.first.first
114
142
  when "<", "<="
115
- [update_greatest_version(r, latest_resolvable_version)]
143
+ [update_greatest_version(r, T.must(latest_resolvable_version))]
116
144
  when "!="
117
145
  []
118
146
  else
@@ -124,6 +152,7 @@ module Dependabot
124
152
  binding_requirements(updated_requirements)
125
153
  end
126
154
 
155
+ sig { params(new_version: Dependabot::Bundler::Version, old_version: Gem::Version).returns(String) }
127
156
  def at_same_precision(new_version, old_version)
128
157
  release_precision = old_version.to_s.split(".")
129
158
  .take_while { |i| i.match?(/^\d+$/) }.count
@@ -141,6 +170,7 @@ module Dependabot
141
170
  end
142
171
 
143
172
  # rubocop:disable Metrics/PerceivedComplexity
173
+ sig { params(req: T::Hash[Symbol, T.untyped]).returns(T::Hash[Symbol, T.untyped]) }
144
174
  def update_gemspec_requirement(req)
145
175
  req = req.merge(source: updated_source) if req.fetch(:source)
146
176
  return req unless latest_version && latest_resolvable_version
@@ -169,14 +199,16 @@ module Dependabot
169
199
  end
170
200
  # rubocop:enable Metrics/PerceivedComplexity
171
201
 
202
+ sig { params(req: Gem::Requirement, groups: T::Array[String]).returns(T::Boolean) }
172
203
  def requirement_satisfied?(req, groups)
173
204
  if groups == ["development"]
174
- req.satisfied_by?(latest_resolvable_version)
205
+ req.satisfied_by?(T.must(latest_resolvable_version))
175
206
  else
176
- req.satisfied_by?(latest_version)
207
+ req.satisfied_by?(T.must(latest_version))
177
208
  end
178
209
  end
179
210
 
211
+ sig { params(requirements: T::Array[Gem::Requirement]).returns(T::Array[Gem::Requirement]) }
180
212
  def binding_requirements(requirements)
181
213
  grouped_by_operator =
182
214
  requirements.group_by { |r| r.requirements.first.first }
@@ -187,12 +219,13 @@ module Dependabot
187
219
  when ">", ">=" then reqs.max_by { |r| r.requirements.first.last }
188
220
  else requirements
189
221
  end
190
- end.uniq
222
+ end.compact.uniq
191
223
 
192
224
  binding_reqs << Gem::Requirement.new if binding_reqs.empty?
193
225
  binding_reqs.sort_by { |r| r.requirements.first.last }
194
226
  end
195
227
 
228
+ sig { params(req: Gem::Requirement).returns(T.any(T::Array[Gem::Requirement], Gem::Requirement)) }
196
229
  def widened_requirements(req)
197
230
  op, version = req.requirements.first
198
231
 
@@ -203,61 +236,75 @@ module Dependabot
203
236
  else
204
237
  req
205
238
  end
206
- when "<", "<=" then [update_greatest_version(req, latest_version)]
207
- when "~>" then convert_twiddle_to_range(req, latest_version)
239
+ when "<", "<=" then [update_greatest_version(req, T.must(latest_version))]
240
+ when "~>" then convert_twiddle_to_range(req, T.must(latest_version))
208
241
  when "!=" then []
209
242
  when ">", ">=" then raise UnfixableRequirement
210
243
  else raise "Unexpected operation for requirement: #{op}"
211
244
  end
212
245
  end
213
246
 
247
+ sig { params(req: Gem::Requirement).returns(T.any(T::Array[Gem::Requirement], Gem::Requirement)) }
214
248
  def bumped_requirements(req)
215
249
  op, version = req.requirements.first
216
250
 
217
251
  case op
218
252
  when "=", nil
219
- if version < latest_resolvable_version
253
+ if version < T.must(latest_resolvable_version)
220
254
  [Gem::Requirement.new("#{op} #{latest_resolvable_version}")]
221
255
  else
222
256
  req
223
257
  end
224
258
  when "~>"
225
- [update_twiddle_version(req, latest_resolvable_version)]
226
- when "<", "<=" then [update_greatest_version(req, latest_version)]
259
+ [update_twiddle_version(req, T.must(latest_resolvable_version))]
260
+ when "<", "<=" then [update_greatest_version(req, T.must(latest_version))]
227
261
  when "!=" then []
228
262
  when ">", ">=" then raise UnfixableRequirement
229
263
  else raise "Unexpected operation for requirement: #{op}"
230
264
  end
231
265
  end
232
266
 
267
+ # rubocop:disable Metrics/AbcSize
268
+ sig do
269
+ params(
270
+ requirement: Gem::Requirement,
271
+ version_to_be_permitted: Dependabot::Bundler::Version
272
+ )
273
+ .returns(T::Array[Gem::Requirement])
274
+ end
233
275
  def convert_twiddle_to_range(requirement, version_to_be_permitted)
234
276
  version = requirement.requirements.first.last
235
277
  version = version.release if version.prerelease?
236
278
 
237
279
  index_to_update = [version.segments.count - 2, 0].max
238
280
 
239
- ub_segments = version_to_be_permitted.segments
240
- ub_segments << 0 while ub_segments.count <= index_to_update
241
- ub_segments = ub_segments[0..index_to_update]
242
- ub_segments[index_to_update] += 1
281
+ ub_segments = version_to_be_permitted.segments.map(&:to_s)
282
+ ub_segments << "0" while ub_segments.count <= index_to_update
283
+ ub_segments = T.must(ub_segments[0..index_to_update])
284
+ ub_segments[index_to_update] = (ub_segments[index_to_update].to_i + 1).to_s
243
285
 
244
- lb_segments = version.segments
245
- lb_segments.pop while lb_segments.any? && lb_segments.last.zero?
286
+ lb_segments = version.segments.map(&:to_s)
287
+ lb_segments.pop while lb_segments.any? && lb_segments.last == "0"
246
288
 
247
289
  return [Gem::Requirement.new("< #{ub_segments.join('.')}")] if lb_segments.none?
248
290
 
249
291
  # Ensure versions have the same length as each other (cosmetic)
250
292
  length = [lb_segments.count, ub_segments.count].max
251
- lb_segments.fill(0, lb_segments.count...length)
252
- ub_segments.fill(0, ub_segments.count...length)
293
+ lb_segments.fill("0", lb_segments.count...length)
294
+ ub_segments.fill("0", ub_segments.count...length)
253
295
 
254
296
  [
255
297
  Gem::Requirement.new(">= #{lb_segments.join('.')}"),
256
298
  Gem::Requirement.new("< #{ub_segments.join('.')}")
257
299
  ]
258
300
  end
301
+ # rubocop:enable Metrics/AbcSize
259
302
 
260
303
  # Updates the version in a "~>" constraint to allow the given version
304
+ sig do
305
+ params(requirement: Gem::Requirement,
306
+ version_to_be_permitted: Dependabot::Bundler::Version).returns(Gem::Requirement)
307
+ end
261
308
  def update_twiddle_version(requirement, version_to_be_permitted)
262
309
  old_version = requirement.requirements.first.last
263
310
  updated_v = at_same_precision(version_to_be_permitted, old_version)
@@ -266,10 +313,11 @@ module Dependabot
266
313
 
267
314
  # Updates the version in a "<" or "<=" constraint to allow the given
268
315
  # version
316
+ sig do
317
+ params(requirement: Gem::Requirement,
318
+ version_to_be_permitted: Dependabot::Bundler::Version).returns(Gem::Requirement)
319
+ end
269
320
  def update_greatest_version(requirement, version_to_be_permitted)
270
- if version_to_be_permitted.is_a?(String)
271
- version_to_be_permitted = Dependabot::Bundler::Version.new(version_to_be_permitted)
272
- end
273
321
  op, version = requirement.requirements.first
274
322
  version = version.release if version.prerelease?
275
323
 
@@ -282,7 +330,7 @@ module Dependabot
282
330
  if index < index_to_update
283
331
  version_to_be_permitted.segments[index]
284
332
  elsif index == index_to_update
285
- version_to_be_permitted.segments[index] + 1
333
+ (version_to_be_permitted.segments[index].to_i + 1)
286
334
  elsif index > version_to_be_permitted.segments.count - 1
287
335
  nil
288
336
  else
@@ -82,7 +82,7 @@ module Dependabot
82
82
 
83
83
  RequirementsUpdater.new(
84
84
  requirements: dependency.requirements,
85
- update_strategy: requirements_update_strategy,
85
+ update_strategy: T.must(requirements_update_strategy),
86
86
  updated_source: updated_source,
87
87
  latest_version: latest_version_for_req_updater,
88
88
  latest_resolvable_version: latest_resolvable_version_for_req_updater
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.333.0
4
+ version: 0.334.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.333.0
18
+ version: 0.334.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.333.0
25
+ version: 0.334.0
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: parallel
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -322,7 +322,7 @@ licenses:
322
322
  - MIT
323
323
  metadata:
324
324
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
325
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.333.0
325
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.334.0
326
326
  rdoc_options: []
327
327
  require_paths:
328
328
  - lib