dependabot-common 0.298.0 → 0.299.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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 308edc0918501450c0bbf3e4e47ad300066c0af1aa9bb7c09048aa9482a1736a
|
4
|
+
data.tar.gz: 0b4374edc5cbda986cb5f0fab59853dac8fff8a9eb7f97b5759515c2aca7e25f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0fb7b5d7bebf9e30e936cda11c42dd7b0ed0cd92df6da8cdb0a3363f744f26f8c7bdbcc293855f794694220606823aa1f4b6a8ac222d70624d8b25de65a03ec4
|
7
|
+
data.tar.gz: 1a61dc7795d49209fc3808a62da372f06167471c4405e6aca232cb593ecdb232dd8d7d5dd42acea097bbee2e0653c305c9d2da5618e4fce054ccf1d787290b57
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# typed: strong
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "json"
|
5
|
+
require "time"
|
6
|
+
require "sorbet-runtime"
|
7
|
+
require "dependabot/package/package_release"
|
8
|
+
|
9
|
+
# Stores metadata for a package, including all its available versions
|
10
|
+
module Dependabot
|
11
|
+
module Package
|
12
|
+
class PackageDetails
|
13
|
+
extend T::Sig
|
14
|
+
|
15
|
+
sig do
|
16
|
+
params(
|
17
|
+
dependency: Dependabot::Dependency,
|
18
|
+
releases: T::Array[Dependabot::Package::PackageRelease]
|
19
|
+
).void
|
20
|
+
end
|
21
|
+
def initialize(dependency:, releases: [])
|
22
|
+
@dependency = T.let(dependency, Dependabot::Dependency)
|
23
|
+
@releases = T.let(
|
24
|
+
releases.sort_by(&:version).reverse,
|
25
|
+
T::Array[Dependabot::Package::PackageRelease]
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
sig { returns(Dependabot::Dependency) }
|
30
|
+
attr_reader :dependency
|
31
|
+
|
32
|
+
sig { returns(T::Array[Dependabot::Package::PackageRelease]) }
|
33
|
+
attr_reader :releases
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# typed: strong
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
# Represents a single package version
|
5
|
+
module Dependabot
|
6
|
+
module Package
|
7
|
+
class PackageLanguage
|
8
|
+
extend T::Sig
|
9
|
+
|
10
|
+
sig do
|
11
|
+
params(
|
12
|
+
name: String,
|
13
|
+
version: T.nilable(Dependabot::Version),
|
14
|
+
requirement: T.nilable(Dependabot::Requirement)
|
15
|
+
).void
|
16
|
+
end
|
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))
|
21
|
+
end
|
22
|
+
|
23
|
+
sig { returns(String) }
|
24
|
+
attr_reader :name
|
25
|
+
|
26
|
+
sig { returns(T.nilable(Dependabot::Version)) }
|
27
|
+
attr_reader :version
|
28
|
+
|
29
|
+
sig { returns(T.nilable(Dependabot::Requirement)) }
|
30
|
+
attr_reader :requirement
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,286 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "cgi"
|
5
|
+
require "excon"
|
6
|
+
require "nokogiri"
|
7
|
+
require "sorbet-runtime"
|
8
|
+
|
9
|
+
require "dependabot/security_advisory"
|
10
|
+
require "dependabot/dependency"
|
11
|
+
require "dependabot/update_checkers/version_filters"
|
12
|
+
require "dependabot/registry_client"
|
13
|
+
require "dependabot/bundler"
|
14
|
+
require "dependabot/package/package_details"
|
15
|
+
|
16
|
+
module Dependabot
|
17
|
+
module Package
|
18
|
+
class PackageLatestVersionFinder
|
19
|
+
extend T::Sig
|
20
|
+
extend T::Helpers
|
21
|
+
|
22
|
+
abstract!
|
23
|
+
|
24
|
+
sig { returns(Dependabot::Dependency) }
|
25
|
+
attr_reader :dependency
|
26
|
+
|
27
|
+
sig { returns(T::Array[T.untyped]) }
|
28
|
+
attr_reader :dependency_files
|
29
|
+
|
30
|
+
sig { returns(T::Array[T.untyped]) }
|
31
|
+
attr_reader :credentials
|
32
|
+
|
33
|
+
sig { returns(T::Array[String]) }
|
34
|
+
attr_reader :ignored_versions
|
35
|
+
|
36
|
+
sig { returns(T::Array[SecurityAdvisory]) }
|
37
|
+
attr_reader :security_advisories
|
38
|
+
|
39
|
+
sig { returns(T::Hash[Symbol, T.untyped]) }
|
40
|
+
attr_reader :options
|
41
|
+
|
42
|
+
sig do
|
43
|
+
params(
|
44
|
+
dependency: Dependabot::Dependency,
|
45
|
+
dependency_files: T::Array[Dependabot::DependencyFile],
|
46
|
+
credentials: T::Array[Dependabot::Credential],
|
47
|
+
ignored_versions: T::Array[String],
|
48
|
+
security_advisories: T::Array[Dependabot::SecurityAdvisory],
|
49
|
+
raise_on_ignored: T::Boolean,
|
50
|
+
options: T::Hash[Symbol, T.untyped]
|
51
|
+
).void
|
52
|
+
end
|
53
|
+
def initialize(
|
54
|
+
dependency:,
|
55
|
+
dependency_files:,
|
56
|
+
credentials:,
|
57
|
+
ignored_versions:,
|
58
|
+
security_advisories:,
|
59
|
+
raise_on_ignored: false,
|
60
|
+
options: {}
|
61
|
+
)
|
62
|
+
@dependency = dependency
|
63
|
+
@dependency_files = dependency_files
|
64
|
+
@credentials = credentials
|
65
|
+
@ignored_versions = ignored_versions
|
66
|
+
@security_advisories = security_advisories
|
67
|
+
@raise_on_ignored = raise_on_ignored
|
68
|
+
# It can be used by sub classes to pass options to the registry client
|
69
|
+
@options = options
|
70
|
+
|
71
|
+
@latest_version = T.let(nil, T.nilable(Dependabot::Version))
|
72
|
+
@latest_version_with_no_unlock = T.let(nil, T.nilable(Dependabot::Version))
|
73
|
+
@lowest_security_fix_version = T.let(nil, T.nilable(Dependabot::Version))
|
74
|
+
@package_details = T.let(nil, T.nilable(Dependabot::Package::PackageDetails))
|
75
|
+
end
|
76
|
+
|
77
|
+
sig do
|
78
|
+
params(language_version: T.nilable(T.any(String, Version)))
|
79
|
+
.returns(T.nilable(Gem::Version))
|
80
|
+
end
|
81
|
+
def latest_version(language_version: nil)
|
82
|
+
@latest_version ||= fetch_latest_version(language_version: language_version)
|
83
|
+
end
|
84
|
+
|
85
|
+
sig do
|
86
|
+
params(language_version: T.nilable(T.any(String, Version)))
|
87
|
+
.returns(T.nilable(Gem::Version))
|
88
|
+
end
|
89
|
+
def latest_version_with_no_unlock(language_version: nil)
|
90
|
+
@latest_version_with_no_unlock ||= fetch_latest_version_with_no_unlock(language_version: language_version)
|
91
|
+
end
|
92
|
+
|
93
|
+
sig do
|
94
|
+
params(language_version: T.nilable(T.any(String, Version)))
|
95
|
+
.returns(T.nilable(Gem::Version))
|
96
|
+
end
|
97
|
+
def lowest_security_fix_version(language_version: nil)
|
98
|
+
@lowest_security_fix_version ||= fetch_lowest_security_fix_version(language_version: language_version)
|
99
|
+
end
|
100
|
+
|
101
|
+
sig { abstract.returns(T.nilable(Dependabot::Package::PackageDetails)) }
|
102
|
+
def package_details; end
|
103
|
+
|
104
|
+
sig do
|
105
|
+
returns(T.nilable(T::Array[Dependabot::Package::PackageRelease]))
|
106
|
+
end
|
107
|
+
def available_versions
|
108
|
+
package_details&.releases
|
109
|
+
end
|
110
|
+
|
111
|
+
protected
|
112
|
+
|
113
|
+
sig do
|
114
|
+
params(language_version: T.nilable(T.any(String, Version)))
|
115
|
+
.returns(T.nilable(Dependabot::Version))
|
116
|
+
end
|
117
|
+
def fetch_latest_version(language_version:)
|
118
|
+
version_hashes = available_versions
|
119
|
+
return unless version_hashes
|
120
|
+
|
121
|
+
version_hashes = filter_yanked_versions(version_hashes)
|
122
|
+
versions = filter_unsupported_versions(version_hashes, language_version)
|
123
|
+
versions = filter_prerelease_versions(versions)
|
124
|
+
versions = filter_ignored_versions(versions)
|
125
|
+
|
126
|
+
versions.max
|
127
|
+
end
|
128
|
+
|
129
|
+
sig do
|
130
|
+
params(language_version: T.nilable(T.any(String, Version)))
|
131
|
+
.returns(T.nilable(Dependabot::Version))
|
132
|
+
end
|
133
|
+
def fetch_latest_version_with_no_unlock(language_version:)
|
134
|
+
version_hashes = available_versions
|
135
|
+
return unless version_hashes
|
136
|
+
|
137
|
+
version_hashes = filter_yanked_versions(version_hashes)
|
138
|
+
versions = filter_unsupported_versions(version_hashes, language_version)
|
139
|
+
versions = filter_prerelease_versions(versions)
|
140
|
+
versions = filter_ignored_versions(versions)
|
141
|
+
versions = filter_out_of_range_versions(versions)
|
142
|
+
|
143
|
+
versions.max
|
144
|
+
end
|
145
|
+
|
146
|
+
sig do
|
147
|
+
params(language_version: T.nilable(T.any(String, Version)))
|
148
|
+
.returns(T.nilable(Dependabot::Version))
|
149
|
+
end
|
150
|
+
def fetch_lowest_security_fix_version(language_version:)
|
151
|
+
version_hashes = available_versions
|
152
|
+
return unless version_hashes
|
153
|
+
|
154
|
+
version_hashes = filter_yanked_versions(version_hashes)
|
155
|
+
versions = filter_unsupported_versions(version_hashes, language_version)
|
156
|
+
# versions = filter_prerelease_versions(versions)
|
157
|
+
versions = Dependabot::UpdateCheckers::VersionFilters.filter_vulnerable_versions(
|
158
|
+
versions,
|
159
|
+
security_advisories
|
160
|
+
)
|
161
|
+
versions = filter_ignored_versions(versions)
|
162
|
+
versions = filter_lower_versions(versions)
|
163
|
+
|
164
|
+
versions.min
|
165
|
+
end
|
166
|
+
|
167
|
+
sig do
|
168
|
+
params(releases: T::Array[Dependabot::Package::PackageRelease])
|
169
|
+
.returns(T::Array[Dependabot::Package::PackageRelease])
|
170
|
+
end
|
171
|
+
def filter_yanked_versions(releases)
|
172
|
+
filtered = releases.reject(&:yanked?)
|
173
|
+
if releases.count > filtered.count
|
174
|
+
Dependabot.logger.info("Filtered out #{releases.count - filtered.count} yanked versions")
|
175
|
+
end
|
176
|
+
filtered
|
177
|
+
end
|
178
|
+
|
179
|
+
sig do
|
180
|
+
params(
|
181
|
+
releases: T::Array[Dependabot::Package::PackageRelease],
|
182
|
+
language_version: T.nilable(T.any(String, Version))
|
183
|
+
)
|
184
|
+
.returns(T::Array[Dependabot::Version])
|
185
|
+
end
|
186
|
+
def filter_unsupported_versions(releases, language_version)
|
187
|
+
filtered = releases.filter_map do |release|
|
188
|
+
language_requirement = release.language&.requirement
|
189
|
+
next release.version unless language_version
|
190
|
+
next release.version unless language_requirement
|
191
|
+
next unless language_requirement.satisfied_by?(language_version)
|
192
|
+
|
193
|
+
release.version
|
194
|
+
end
|
195
|
+
if releases.count > filtered.count
|
196
|
+
delta = releases.count - filtered.count
|
197
|
+
Dependabot.logger.info("Filtered out #{delta} unsupported Language #{language_version} versions")
|
198
|
+
end
|
199
|
+
filtered
|
200
|
+
end
|
201
|
+
|
202
|
+
sig do
|
203
|
+
params(versions_array: T::Array[Dependabot::Version])
|
204
|
+
.returns(T::Array[Dependabot::Version])
|
205
|
+
end
|
206
|
+
def filter_prerelease_versions(versions_array)
|
207
|
+
return versions_array if wants_prerelease?
|
208
|
+
|
209
|
+
filtered = versions_array.reject(&:prerelease?)
|
210
|
+
|
211
|
+
if versions_array.count > filtered.count
|
212
|
+
Dependabot.logger.info("Filtered out #{versions_array.count - filtered.count} pre-release versions")
|
213
|
+
end
|
214
|
+
|
215
|
+
filtered
|
216
|
+
end
|
217
|
+
|
218
|
+
sig do
|
219
|
+
params(versions_array: T::Array[Dependabot::Version])
|
220
|
+
.returns(T::Array[Dependabot::Version])
|
221
|
+
end
|
222
|
+
def filter_ignored_versions(versions_array)
|
223
|
+
filtered = versions_array
|
224
|
+
.reject { |v| ignore_requirements.any? { |r| r.satisfied_by?(v) } }
|
225
|
+
if @raise_on_ignored && filter_lower_versions(filtered).empty? && filter_lower_versions(versions_array).any?
|
226
|
+
raise Dependabot::AllVersionsIgnored
|
227
|
+
end
|
228
|
+
|
229
|
+
if versions_array.count > filtered.count
|
230
|
+
Dependabot.logger.info("Filtered out #{versions_array.count - filtered.count} ignored versions")
|
231
|
+
end
|
232
|
+
filtered
|
233
|
+
end
|
234
|
+
|
235
|
+
sig do
|
236
|
+
params(versions_array: T::Array[Dependabot::Version])
|
237
|
+
.returns(T::Array[Dependabot::Version])
|
238
|
+
end
|
239
|
+
def filter_lower_versions(versions_array)
|
240
|
+
return versions_array unless dependency.numeric_version
|
241
|
+
|
242
|
+
versions_array.select { |version| version > dependency.numeric_version }
|
243
|
+
end
|
244
|
+
|
245
|
+
sig do
|
246
|
+
params(versions_array: T::Array[Dependabot::Version])
|
247
|
+
.returns(T::Array[Dependabot::Version])
|
248
|
+
end
|
249
|
+
def filter_out_of_range_versions(versions_array)
|
250
|
+
reqs = dependency.requirements.filter_map do |r|
|
251
|
+
next if r.fetch(:requirement).nil?
|
252
|
+
|
253
|
+
requirement_class.requirements_array(r.fetch(:requirement))
|
254
|
+
end
|
255
|
+
|
256
|
+
versions_array
|
257
|
+
.select { |v| reqs.all? { |r| r.any? { |o| o.satisfied_by?(v) } } }
|
258
|
+
end
|
259
|
+
|
260
|
+
sig { returns(T::Boolean) }
|
261
|
+
def wants_prerelease?
|
262
|
+
return version_class.new(dependency.version).prerelease? if dependency.version
|
263
|
+
|
264
|
+
dependency.requirements.any? do |req|
|
265
|
+
reqs = (req.fetch(:requirement) || "").split(",").map(&:strip)
|
266
|
+
reqs.any? { |r| r.match?(/[A-Za-z]/) }
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
270
|
+
sig { returns(T::Array[T.untyped]) }
|
271
|
+
def ignore_requirements
|
272
|
+
ignored_versions.flat_map { |req| requirement_class.requirements_array(req) }
|
273
|
+
end
|
274
|
+
|
275
|
+
sig { returns(T.class_of(Dependabot::Version)) }
|
276
|
+
def version_class
|
277
|
+
dependency.version_class
|
278
|
+
end
|
279
|
+
|
280
|
+
sig { returns(T.class_of(Dependabot::Requirement)) }
|
281
|
+
def requirement_class
|
282
|
+
dependency.requirement_class
|
283
|
+
end
|
284
|
+
end
|
285
|
+
end
|
286
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# typed: strong
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "json"
|
5
|
+
require "time"
|
6
|
+
require "sorbet-runtime"
|
7
|
+
require "dependabot/package/package_language"
|
8
|
+
|
9
|
+
# Represents a single package version
|
10
|
+
module Dependabot
|
11
|
+
module Package
|
12
|
+
class PackageRelease
|
13
|
+
extend T::Sig
|
14
|
+
|
15
|
+
sig do
|
16
|
+
params(
|
17
|
+
version: Dependabot::Version,
|
18
|
+
released_at: T.nilable(Time),
|
19
|
+
yanked: T::Boolean,
|
20
|
+
yanked_reason: T.nilable(String),
|
21
|
+
downloads: T.nilable(Integer),
|
22
|
+
url: T.nilable(String),
|
23
|
+
package_type: T.nilable(String),
|
24
|
+
language: T.nilable(Dependabot::Package::PackageLanguage)
|
25
|
+
)
|
26
|
+
.void
|
27
|
+
end
|
28
|
+
def initialize(
|
29
|
+
version:,
|
30
|
+
released_at: nil,
|
31
|
+
yanked: false,
|
32
|
+
yanked_reason: nil,
|
33
|
+
downloads: nil,
|
34
|
+
url: nil,
|
35
|
+
package_type: nil,
|
36
|
+
language: nil
|
37
|
+
)
|
38
|
+
@version = T.let(version, Dependabot::Version)
|
39
|
+
@released_at = T.let(released_at, T.nilable(Time))
|
40
|
+
@yanked = T.let(yanked, T::Boolean)
|
41
|
+
@yanked_reason = T.let(yanked_reason, T.nilable(String))
|
42
|
+
@downloads = T.let(downloads, T.nilable(Integer))
|
43
|
+
@url = T.let(url, T.nilable(String))
|
44
|
+
@package_type = T.let(package_type, T.nilable(String))
|
45
|
+
@language = T.let(language, T.nilable(Dependabot::Package::PackageLanguage))
|
46
|
+
end
|
47
|
+
|
48
|
+
sig { returns(Dependabot::Version) }
|
49
|
+
attr_reader :version
|
50
|
+
|
51
|
+
sig { returns(T.nilable(Time)) }
|
52
|
+
attr_reader :released_at
|
53
|
+
|
54
|
+
sig { returns(T::Boolean) }
|
55
|
+
attr_reader :yanked
|
56
|
+
|
57
|
+
sig { returns(T.nilable(String)) }
|
58
|
+
attr_reader :yanked_reason
|
59
|
+
|
60
|
+
sig { returns(T.nilable(Integer)) }
|
61
|
+
attr_reader :downloads
|
62
|
+
|
63
|
+
sig { returns(T.nilable(String)) }
|
64
|
+
attr_reader :url
|
65
|
+
|
66
|
+
sig { returns(T.nilable(String)) }
|
67
|
+
attr_reader :package_type
|
68
|
+
|
69
|
+
sig { returns(T.nilable(Dependabot::Package::PackageLanguage)) }
|
70
|
+
attr_reader :language
|
71
|
+
|
72
|
+
sig { returns(T::Boolean) }
|
73
|
+
def yanked?
|
74
|
+
@yanked
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
data/lib/dependabot.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dependabot-common
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.299.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dependabot
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-02-
|
11
|
+
date: 2025-02-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk-codecommit
|
@@ -568,6 +568,10 @@ files:
|
|
568
568
|
- lib/dependabot/metadata_finders/base/commits_finder.rb
|
569
569
|
- lib/dependabot/metadata_finders/base/release_finder.rb
|
570
570
|
- lib/dependabot/notices.rb
|
571
|
+
- lib/dependabot/package/package_details.rb
|
572
|
+
- lib/dependabot/package/package_language.rb
|
573
|
+
- lib/dependabot/package/package_latest_version_finder.rb
|
574
|
+
- lib/dependabot/package/package_release.rb
|
571
575
|
- lib/dependabot/pull_request_creator.rb
|
572
576
|
- lib/dependabot/pull_request_creator/azure.rb
|
573
577
|
- lib/dependabot/pull_request_creator/bitbucket.rb
|
@@ -615,7 +619,7 @@ licenses:
|
|
615
619
|
- MIT
|
616
620
|
metadata:
|
617
621
|
bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
|
618
|
-
changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.
|
622
|
+
changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.299.0
|
619
623
|
post_install_message:
|
620
624
|
rdoc_options: []
|
621
625
|
require_paths:
|