dependabot-common 0.392.0 → 0.394.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/clients/azure.rb +42 -22
- data/lib/dependabot/clients/bitbucket.rb +52 -26
- data/lib/dependabot/clients/bitbucket_with_retries.rb +11 -12
- data/lib/dependabot/clients/codecommit.rb +73 -53
- data/lib/dependabot/clients/github_resource_parser.rb +70 -0
- data/lib/dependabot/clients/github_with_retries.rb +63 -23
- data/lib/dependabot/clients/gitlab_with_retries.rb +19 -17
- data/lib/dependabot/clients/json_response_parser.rb +103 -0
- data/lib/dependabot/command_helpers.rb +79 -11
- data/lib/dependabot/credential.rb +12 -3
- data/lib/dependabot/errors.rb +4 -1
- data/lib/dependabot/file_fetchers/base.rb +199 -151
- data/lib/dependabot/file_filtering.rb +0 -2
- data/lib/dependabot/file_updaters/vendor_updater.rb +8 -2
- data/lib/dependabot/git_tag_details.rb +8 -14
- data/lib/dependabot/metadata_finders/base/changelog_finder.rb +211 -110
- data/lib/dependabot/metadata_finders/base/commit_response_parser.rb +68 -0
- data/lib/dependabot/metadata_finders/base/commits_finder.rb +44 -38
- data/lib/dependabot/package/npm_package_manager_config.rb +72 -0
- data/lib/dependabot/package/npm_registry_package.rb +186 -0
- data/lib/dependabot/pull_request_creator/azure.rb +1 -1
- data/lib/dependabot/pull_request_creator/codecommit.rb +10 -12
- data/lib/dependabot/pull_request_creator/github.rb +55 -35
- data/lib/dependabot/pull_request_creator/gitlab.rb +37 -11
- data/lib/dependabot/pull_request_creator/labeler.rb +65 -15
- data/lib/dependabot/pull_request_creator/pr_name_prefixer.rb +179 -78
- data/lib/dependabot/pull_request_updater/azure.rb +63 -11
- data/lib/dependabot/pull_request_updater/github.rb +44 -34
- data/lib/dependabot/pull_request_updater/gitlab.rb +23 -12
- data/lib/dependabot/pull_request_updater.rb +3 -3
- data/lib/dependabot/shared_helpers.rb +77 -32
- data/lib/dependabot/update_checkers/base.rb +9 -5
- data/lib/dependabot/update_checkers/version_filters.rb +5 -0
- data/lib/dependabot/update_checkers/vulnerability_audit.rb +282 -0
- data/lib/dependabot/workspace/git.rb +35 -4
- data/lib/dependabot.rb +1 -1
- metadata +10 -4
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require "sorbet-runtime"
|
|
5
|
+
|
|
6
|
+
module Dependabot
|
|
7
|
+
module UpdateCheckers
|
|
8
|
+
Conflict = T.type_alias { T::Hash[String, Object] }
|
|
9
|
+
|
|
10
|
+
class VulnerabilityAudit < T::ImmutableStruct
|
|
11
|
+
extend T::Sig
|
|
12
|
+
|
|
13
|
+
module ValueParser
|
|
14
|
+
extend T::Sig
|
|
15
|
+
|
|
16
|
+
sig { params(value: Object, context: String).returns(T::Hash[String, Object]) }
|
|
17
|
+
def self.object_hash(value, context)
|
|
18
|
+
raise TypeError, "#{context} must be an object" unless value.is_a?(Hash)
|
|
19
|
+
|
|
20
|
+
result = T.let({}, T::Hash[String, Object])
|
|
21
|
+
value.each do |raw_key, raw_value|
|
|
22
|
+
key = T.cast(raw_key, Object)
|
|
23
|
+
raise TypeError, "#{context} keys must be strings" unless key.is_a?(String)
|
|
24
|
+
|
|
25
|
+
result[key] = T.cast(raw_value, Object)
|
|
26
|
+
end
|
|
27
|
+
result
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
sig { params(hash: T::Hash[String, Object], key: String, context: T.nilable(String)).returns(String) }
|
|
31
|
+
def self.string(hash, key, context: nil)
|
|
32
|
+
value = hash[key]
|
|
33
|
+
return value if value.is_a?(String)
|
|
34
|
+
|
|
35
|
+
raise TypeError, "#{field_name(context, key)} must be a string"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
sig do
|
|
39
|
+
params(
|
|
40
|
+
hash: T::Hash[String, Object],
|
|
41
|
+
key: String,
|
|
42
|
+
context: T.nilable(String)
|
|
43
|
+
).returns(T.nilable(String))
|
|
44
|
+
end
|
|
45
|
+
def self.optional_string(hash, key, context: nil)
|
|
46
|
+
value = hash[key]
|
|
47
|
+
return if value.nil?
|
|
48
|
+
return value if value.is_a?(String)
|
|
49
|
+
|
|
50
|
+
raise TypeError, "#{field_name(context, key)} must be a string or nil"
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
sig { params(hash: T::Hash[String, Object], key: String, context: T.nilable(String)).returns(T::Boolean) }
|
|
54
|
+
def self.boolean(hash, key, context: nil)
|
|
55
|
+
value = hash[key]
|
|
56
|
+
return value if value == true || value == false
|
|
57
|
+
|
|
58
|
+
raise TypeError, "#{field_name(context, key)} must be a boolean"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
sig { params(value: Object, context: String).returns(T::Array[String]) }
|
|
62
|
+
def self.string_array(value, context)
|
|
63
|
+
raise TypeError, "#{context} must be an array" unless value.is_a?(Array)
|
|
64
|
+
|
|
65
|
+
value.map do |item|
|
|
66
|
+
item = T.cast(item, Object)
|
|
67
|
+
raise TypeError, "#{context} must contain only strings" unless item.is_a?(String)
|
|
68
|
+
|
|
69
|
+
item
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
sig { params(context: T.nilable(String), key: String).returns(String) }
|
|
74
|
+
def self.field_name(context, key)
|
|
75
|
+
[context, key].compact.join(" ")
|
|
76
|
+
end
|
|
77
|
+
private_class_method :field_name
|
|
78
|
+
end
|
|
79
|
+
private_constant :ValueParser
|
|
80
|
+
|
|
81
|
+
class FixUpdate < T::ImmutableStruct
|
|
82
|
+
extend T::Sig
|
|
83
|
+
|
|
84
|
+
const :dependency_name, String
|
|
85
|
+
const :current_version, String
|
|
86
|
+
const :target_version, T.nilable(String), default: nil
|
|
87
|
+
const :target_version_provided, T::Boolean, default: false
|
|
88
|
+
const :top_level_ancestors, T::Array[String], default: []
|
|
89
|
+
const :top_level_ancestors_provided, T::Boolean, default: false
|
|
90
|
+
|
|
91
|
+
sig { params(value: Object).returns(FixUpdate) }
|
|
92
|
+
def self.from_object(value)
|
|
93
|
+
hash = ValueParser.object_hash(value, "fix update")
|
|
94
|
+
target_version_provided = hash.key?("target_version")
|
|
95
|
+
top_level_ancestors_provided = hash.key?("top_level_ancestors")
|
|
96
|
+
top_level_ancestors =
|
|
97
|
+
if top_level_ancestors_provided
|
|
98
|
+
ValueParser.string_array(hash["top_level_ancestors"], "fix update top_level_ancestors")
|
|
99
|
+
else
|
|
100
|
+
[]
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
new(
|
|
104
|
+
dependency_name: ValueParser.string(hash, "dependency_name", context: "fix update"),
|
|
105
|
+
current_version: ValueParser.string(hash, "current_version", context: "fix update"),
|
|
106
|
+
target_version: ValueParser.optional_string(hash, "target_version", context: "fix update"),
|
|
107
|
+
target_version_provided: target_version_provided,
|
|
108
|
+
top_level_ancestors: top_level_ancestors,
|
|
109
|
+
top_level_ancestors_provided: top_level_ancestors_provided
|
|
110
|
+
)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
sig { returns(T::Boolean) }
|
|
114
|
+
def target_version_provided?
|
|
115
|
+
target_version_provided
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
sig { returns(Conflict) }
|
|
119
|
+
def to_h
|
|
120
|
+
result = T.let(
|
|
121
|
+
{
|
|
122
|
+
"dependency_name" => dependency_name,
|
|
123
|
+
"current_version" => current_version
|
|
124
|
+
},
|
|
125
|
+
Conflict
|
|
126
|
+
)
|
|
127
|
+
result["target_version"] = target_version if target_version_provided?
|
|
128
|
+
result["top_level_ancestors"] = top_level_ancestors if top_level_ancestors_provided
|
|
129
|
+
result
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
class BlockingDependency < T::ImmutableStruct
|
|
134
|
+
extend T::Sig
|
|
135
|
+
|
|
136
|
+
const :name, String
|
|
137
|
+
const :version, String
|
|
138
|
+
const :requirement, String
|
|
139
|
+
const :top_level_ancestor, String
|
|
140
|
+
|
|
141
|
+
sig { params(value: Object).returns(BlockingDependency) }
|
|
142
|
+
def self.from_object(value)
|
|
143
|
+
hash = ValueParser.object_hash(value, "blocking dependency")
|
|
144
|
+
new(
|
|
145
|
+
name: ValueParser.string(hash, "name", context: "blocking dependency"),
|
|
146
|
+
version: ValueParser.string(hash, "version", context: "blocking dependency"),
|
|
147
|
+
requirement: ValueParser.string(hash, "requirement", context: "blocking dependency"),
|
|
148
|
+
top_level_ancestor: ValueParser.string(hash, "top_level_ancestor", context: "blocking dependency")
|
|
149
|
+
)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
sig { returns(Conflict) }
|
|
153
|
+
def to_h
|
|
154
|
+
{
|
|
155
|
+
"name" => name,
|
|
156
|
+
"version" => version,
|
|
157
|
+
"requirement" => requirement,
|
|
158
|
+
"top_level_ancestor" => top_level_ancestor
|
|
159
|
+
}
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
const :dependency_name, String
|
|
164
|
+
const :current_version, T.nilable(String), default: nil
|
|
165
|
+
const :current_version_provided, T::Boolean, default: false
|
|
166
|
+
const :target_version, T.nilable(String), default: nil
|
|
167
|
+
const :target_version_provided, T::Boolean, default: false
|
|
168
|
+
const :fix_available, T::Boolean
|
|
169
|
+
const :fix_updates, T::Array[FixUpdate]
|
|
170
|
+
const :top_level_ancestors, T::Array[String]
|
|
171
|
+
const :blocking_dependencies, T.nilable(T::Array[BlockingDependency]), default: nil
|
|
172
|
+
const :blocking_dependencies_provided, T::Boolean, default: false
|
|
173
|
+
const :explanation, T.nilable(String), default: nil
|
|
174
|
+
|
|
175
|
+
sig { params(value: Object).returns(VulnerabilityAudit) }
|
|
176
|
+
def self.from_object(value)
|
|
177
|
+
hash = ValueParser.object_hash(value, "audit result")
|
|
178
|
+
current_version_provided = hash.key?("current_version")
|
|
179
|
+
target_version_provided = hash.key?("target_version")
|
|
180
|
+
blocking_dependencies_provided = hash.key?("blocking_dependencies")
|
|
181
|
+
|
|
182
|
+
new(
|
|
183
|
+
dependency_name: ValueParser.string(hash, "dependency_name"),
|
|
184
|
+
current_version: ValueParser.optional_string(hash, "current_version"),
|
|
185
|
+
current_version_provided: current_version_provided,
|
|
186
|
+
target_version: ValueParser.optional_string(hash, "target_version"),
|
|
187
|
+
target_version_provided: target_version_provided,
|
|
188
|
+
fix_available: ValueParser.boolean(hash, "fix_available"),
|
|
189
|
+
fix_updates: parse_fix_updates(hash["fix_updates"]),
|
|
190
|
+
top_level_ancestors: ValueParser.string_array(hash["top_level_ancestors"], "top_level_ancestors"),
|
|
191
|
+
blocking_dependencies: parse_blocking_dependencies(hash["blocking_dependencies"]),
|
|
192
|
+
blocking_dependencies_provided: blocking_dependencies_provided
|
|
193
|
+
)
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
sig do
|
|
197
|
+
params(
|
|
198
|
+
dependency_name: String,
|
|
199
|
+
explanation: T.nilable(String),
|
|
200
|
+
blocking_dependencies: T.nilable(T::Array[BlockingDependency]),
|
|
201
|
+
blocking_dependencies_provided: T::Boolean
|
|
202
|
+
).returns(VulnerabilityAudit)
|
|
203
|
+
end
|
|
204
|
+
def self.unavailable(
|
|
205
|
+
dependency_name:,
|
|
206
|
+
explanation: nil,
|
|
207
|
+
blocking_dependencies: nil,
|
|
208
|
+
blocking_dependencies_provided: false
|
|
209
|
+
)
|
|
210
|
+
new(
|
|
211
|
+
dependency_name: dependency_name,
|
|
212
|
+
fix_available: false,
|
|
213
|
+
fix_updates: [],
|
|
214
|
+
top_level_ancestors: [],
|
|
215
|
+
blocking_dependencies: blocking_dependencies,
|
|
216
|
+
blocking_dependencies_provided: blocking_dependencies_provided,
|
|
217
|
+
explanation: explanation
|
|
218
|
+
)
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
sig { returns(T::Boolean) }
|
|
222
|
+
def current_version_provided?
|
|
223
|
+
current_version_provided
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
sig { returns(T::Boolean) }
|
|
227
|
+
def target_version_provided?
|
|
228
|
+
target_version_provided
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
sig { returns(T::Boolean) }
|
|
232
|
+
def blocking_dependencies_provided?
|
|
233
|
+
blocking_dependencies_provided
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
sig { params(message: String).returns(VulnerabilityAudit) }
|
|
237
|
+
def unavailable_with_explanation(message)
|
|
238
|
+
VulnerabilityAudit.unavailable(
|
|
239
|
+
dependency_name: dependency_name,
|
|
240
|
+
explanation: message,
|
|
241
|
+
blocking_dependencies: blocking_dependencies,
|
|
242
|
+
blocking_dependencies_provided: blocking_dependencies_provided?
|
|
243
|
+
)
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
sig { returns(Conflict) }
|
|
247
|
+
def to_h
|
|
248
|
+
result = T.let(
|
|
249
|
+
{
|
|
250
|
+
"dependency_name" => dependency_name,
|
|
251
|
+
"fix_available" => fix_available,
|
|
252
|
+
"fix_updates" => fix_updates.map(&:to_h),
|
|
253
|
+
"top_level_ancestors" => top_level_ancestors
|
|
254
|
+
},
|
|
255
|
+
Conflict
|
|
256
|
+
)
|
|
257
|
+
result["current_version"] = current_version if current_version_provided?
|
|
258
|
+
result["target_version"] = target_version if target_version_provided?
|
|
259
|
+
result["blocking_dependencies"] = blocking_dependencies&.map(&:to_h) if blocking_dependencies_provided?
|
|
260
|
+
result["explanation"] = explanation if explanation
|
|
261
|
+
result
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
sig { params(value: Object).returns(T::Array[FixUpdate]) }
|
|
265
|
+
def self.parse_fix_updates(value)
|
|
266
|
+
raise TypeError, "fix_updates must be an array" unless value.is_a?(Array)
|
|
267
|
+
|
|
268
|
+
value.map { |update| FixUpdate.from_object(T.cast(update, Object)) }
|
|
269
|
+
end
|
|
270
|
+
private_class_method :parse_fix_updates
|
|
271
|
+
|
|
272
|
+
sig { params(value: Object).returns(T.nilable(T::Array[BlockingDependency])) }
|
|
273
|
+
def self.parse_blocking_dependencies(value)
|
|
274
|
+
return if value.nil?
|
|
275
|
+
raise TypeError, "blocking_dependencies must be an array or nil" unless value.is_a?(Array)
|
|
276
|
+
|
|
277
|
+
value.map { |dependency| BlockingDependency.from_object(T.cast(dependency, Object)) }
|
|
278
|
+
end
|
|
279
|
+
private_class_method :parse_blocking_dependencies
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# typed:
|
|
1
|
+
# typed: strong
|
|
2
2
|
# frozen_string_literal: true
|
|
3
3
|
|
|
4
4
|
require "sorbet-runtime"
|
|
@@ -152,9 +152,40 @@ module Dependabot
|
|
|
152
152
|
run_shell_command("git clean -fx .")
|
|
153
153
|
end
|
|
154
154
|
|
|
155
|
-
sig
|
|
156
|
-
|
|
157
|
-
|
|
155
|
+
sig do
|
|
156
|
+
params(
|
|
157
|
+
command: SharedHelpers::Command,
|
|
158
|
+
allow_unsafe_shell_command: T::Boolean,
|
|
159
|
+
cwd: T.nilable(String),
|
|
160
|
+
env: T.nilable(T::Hash[String, String]),
|
|
161
|
+
fingerprint: T.nilable(String),
|
|
162
|
+
stderr_to_stdout: T::Boolean,
|
|
163
|
+
timeout: Integer,
|
|
164
|
+
output_observer: CommandHelpers::OutputObserver
|
|
165
|
+
).returns(String)
|
|
166
|
+
end
|
|
167
|
+
def run_shell_command(
|
|
168
|
+
command,
|
|
169
|
+
allow_unsafe_shell_command: false,
|
|
170
|
+
cwd: nil,
|
|
171
|
+
env: {},
|
|
172
|
+
fingerprint: nil,
|
|
173
|
+
stderr_to_stdout: true,
|
|
174
|
+
timeout: CommandHelpers::TIMEOUTS::DEFAULT,
|
|
175
|
+
output_observer: nil
|
|
176
|
+
)
|
|
177
|
+
Dir.chdir(path) do
|
|
178
|
+
SharedHelpers.run_shell_command(
|
|
179
|
+
command,
|
|
180
|
+
allow_unsafe_shell_command: allow_unsafe_shell_command,
|
|
181
|
+
cwd: cwd,
|
|
182
|
+
env: env,
|
|
183
|
+
fingerprint: fingerprint,
|
|
184
|
+
stderr_to_stdout: stderr_to_stdout,
|
|
185
|
+
timeout: timeout,
|
|
186
|
+
output_observer: output_observer
|
|
187
|
+
)
|
|
188
|
+
end
|
|
158
189
|
end
|
|
159
190
|
|
|
160
191
|
sig { params(message: String).void }
|
data/lib/dependabot.rb
CHANGED
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.
|
|
4
|
+
version: 0.394.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Dependabot
|
|
@@ -441,14 +441,14 @@ dependencies:
|
|
|
441
441
|
requirements:
|
|
442
442
|
- - "~>"
|
|
443
443
|
- !ruby/object:Gem::Version
|
|
444
|
-
version: '
|
|
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: '
|
|
451
|
+
version: '1.1'
|
|
452
452
|
- !ruby/object:Gem::Dependency
|
|
453
453
|
name: turbo_tests
|
|
454
454
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -519,8 +519,10 @@ files:
|
|
|
519
519
|
- lib/dependabot/clients/bitbucket_with_retries.rb
|
|
520
520
|
- lib/dependabot/clients/codecommit.rb
|
|
521
521
|
- lib/dependabot/clients/github_release.rb
|
|
522
|
+
- lib/dependabot/clients/github_resource_parser.rb
|
|
522
523
|
- lib/dependabot/clients/github_with_retries.rb
|
|
523
524
|
- lib/dependabot/clients/gitlab_with_retries.rb
|
|
525
|
+
- lib/dependabot/clients/json_response_parser.rb
|
|
524
526
|
- lib/dependabot/command_helpers.rb
|
|
525
527
|
- lib/dependabot/config.rb
|
|
526
528
|
- lib/dependabot/config/file.rb
|
|
@@ -566,9 +568,12 @@ files:
|
|
|
566
568
|
- lib/dependabot/metadata_finders/base.rb
|
|
567
569
|
- lib/dependabot/metadata_finders/base/changelog_finder.rb
|
|
568
570
|
- lib/dependabot/metadata_finders/base/changelog_pruner.rb
|
|
571
|
+
- lib/dependabot/metadata_finders/base/commit_response_parser.rb
|
|
569
572
|
- lib/dependabot/metadata_finders/base/commits_finder.rb
|
|
570
573
|
- lib/dependabot/metadata_finders/base/release_finder.rb
|
|
571
574
|
- lib/dependabot/notices.rb
|
|
575
|
+
- lib/dependabot/package/npm_package_manager_config.rb
|
|
576
|
+
- lib/dependabot/package/npm_registry_package.rb
|
|
572
577
|
- lib/dependabot/package/package_details.rb
|
|
573
578
|
- lib/dependabot/package/package_language.rb
|
|
574
579
|
- lib/dependabot/package/package_latest_version_finder.rb
|
|
@@ -613,6 +618,7 @@ files:
|
|
|
613
618
|
- lib/dependabot/update_checkers/base.rb
|
|
614
619
|
- lib/dependabot/update_checkers/cooldown_calculation.rb
|
|
615
620
|
- lib/dependabot/update_checkers/version_filters.rb
|
|
621
|
+
- lib/dependabot/update_checkers/vulnerability_audit.rb
|
|
616
622
|
- lib/dependabot/utils.rb
|
|
617
623
|
- lib/dependabot/version.rb
|
|
618
624
|
- lib/dependabot/workspace.rb
|
|
@@ -625,7 +631,7 @@ licenses:
|
|
|
625
631
|
- MIT
|
|
626
632
|
metadata:
|
|
627
633
|
bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
|
|
628
|
-
changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.
|
|
634
|
+
changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.394.0
|
|
629
635
|
rdoc_options: []
|
|
630
636
|
require_paths:
|
|
631
637
|
- lib
|