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.
- checksums.yaml +4 -4
- data/lib/dependabot/bundler/file_updater/git_pin_replacer.rb +27 -6
- data/lib/dependabot/bundler/file_updater/git_source_remover.rb +14 -2
- data/lib/dependabot/bundler/file_updater/lockfile_updater.rb +85 -26
- data/lib/dependabot/bundler/file_updater/requirement_replacer.rb +74 -10
- data/lib/dependabot/bundler/file_updater.rb +48 -19
- data/lib/dependabot/bundler/metadata_finder.rb +50 -22
- data/lib/dependabot/bundler/requirement.rb +3 -2
- data/lib/dependabot/bundler/update_checker/file_preparer.rb +69 -19
- data/lib/dependabot/bundler/update_checker/force_updater.rb +1 -1
- data/lib/dependabot/bundler/update_checker/latest_version_finder/dependency_source.rb +47 -11
- data/lib/dependabot/bundler/update_checker/requirements_updater.rb +77 -29
- data/lib/dependabot/bundler/update_checker.rb +1 -1
- metadata +4 -4
@@ -1,4 +1,4 @@
|
|
1
|
-
# typed:
|
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 =
|
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
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
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
|
-
|
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]
|
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
|
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.
|
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.
|
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.
|
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.
|
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
|