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: 0a5293ae603f618b6ff03ca6bf931ff8ab7f4a8860477de00f54359ffb563952
4
- data.tar.gz: 11ab4fd76cd68304297406047e1082155bd2addf4a09317780353b9cf32d34af
3
+ metadata.gz: 308edc0918501450c0bbf3e4e47ad300066c0af1aa9bb7c09048aa9482a1736a
4
+ data.tar.gz: 0b4374edc5cbda986cb5f0fab59853dac8fff8a9eb7f97b5759515c2aca7e25f
5
5
  SHA512:
6
- metadata.gz: 8d5ad662a18cf9b6e883f2183120570371120d623e3d84111e5e57190f24f3bf1b56813d33d7dc8ac3a402cf79a72d1c74eab0f49c0a3fc7f8a4262f8352355b
7
- data.tar.gz: 954c8dad52e75aaab8246b16ece65a889a07d8d66f479696996532403dbeda8ad868b3581944e3710c123f1baaa11a039a51b985afb3de10eafcedc33de5785f
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
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Dependabot
5
- VERSION = "0.298.0"
5
+ VERSION = "0.299.0"
6
6
  end
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.298.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-20 00:00:00.000000000 Z
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.298.0
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: