Skip to content

Commit bddc65f

Browse files
committed
update filters to support release array
1 parent 96f8f65 commit bddc65f

File tree

5 files changed

+182
-100
lines changed

5 files changed

+182
-100
lines changed

bun/lib/dependabot/bun/update_checker/latest_version_finder.rb

+19-11
Original file line numberDiff line numberDiff line change
@@ -123,10 +123,14 @@ def fetch_latest_version_with_no_unlock(language_version: nil)
123123
end
124124
end
125125

126-
sig { override.params(versions: T::Array[Dependabot::Version]).returns(T::Array[Dependabot::Version]) }
127-
def apply_post_fetch_latest_versions_filter(versions)
128-
original_count = versions.count
129-
filtered_versions = lazy_filter_yanked_versions_by_min_max(versions, check_max: true)
126+
sig do
127+
override
128+
.params(releases: T::Array[Dependabot::Package::PackageRelease])
129+
.returns(T::Array[Dependabot::Package::PackageRelease])
130+
end
131+
def apply_post_fetch_latest_versions_filter(releases)
132+
original_count = releases.count
133+
filtered_versions = lazy_filter_yanked_versions_by_min_max(releases, check_max: true)
130134

131135
# Log the filter if any versions were removed
132136
if original_count > filtered_versions.count
@@ -141,26 +145,30 @@ def apply_post_fetch_latest_versions_filter(versions)
141145

142146
sig do
143147
params(
144-
versions: T::Array[Dependabot::Version],
148+
releases: T::Array[Dependabot::Package::PackageRelease],
145149
check_max: T::Boolean
146-
).returns(T::Array[Dependabot::Version])
150+
).returns(T::Array[Dependabot::Package::PackageRelease])
147151
end
148-
def lazy_filter_yanked_versions_by_min_max(versions, check_max: true)
152+
def lazy_filter_yanked_versions_by_min_max(releases, check_max: true)
149153
# Sort the versions based on the check_max flag (max -> descending, min -> ascending)
150-
sorted_versions = check_max ? versions.sort.reverse : versions.sort
154+
sorted_releases = if check_max
155+
releases.sort_by(&:version).reverse
156+
else
157+
releases.sort_by(&:version)
158+
end
151159

152160
filtered_versions = []
153161

154162
not_yanked = T.let(false, T::Boolean)
155163

156164
# Iterate through the sorted versions lazily, filtering out yanked versions
157-
sorted_versions.each do |version|
158-
next if !not_yanked && yanked_version?(version)
165+
sorted_releases.each do |release|
166+
next if !not_yanked && yanked_version?(release.version)
159167

160168
not_yanked = true
161169

162170
# Once we find a valid (non-yanked) version, add it to the filtered list
163-
filtered_versions << version
171+
filtered_versions << release
164172
break
165173
end
166174

bundler/lib/dependabot/bundler/update_checker/latest_version_finder.rb

+43-7
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# typed: true
1+
# typed: strict
22
# frozen_string_literal: true
33

44
require "excon"
@@ -20,6 +20,33 @@ class UpdateChecker
2020
class LatestVersionFinder < Dependabot::Package::PackageLatestVersionFinder
2121
extend T::Sig
2222

23+
sig do
24+
params(
25+
dependency: Dependabot::Dependency,
26+
dependency_files: T::Array[Dependabot::DependencyFile],
27+
credentials: T::Array[Dependabot::Credential],
28+
ignored_versions: T::Array[String],
29+
security_advisories: T::Array[Dependabot::SecurityAdvisory],
30+
cooldown_options: T.nilable(Dependabot::Package::ReleaseCooldownOptions),
31+
raise_on_ignored: T::Boolean,
32+
options: T::Hash[Symbol, T.untyped]
33+
).void
34+
end
35+
def initialize(
36+
dependency:,
37+
dependency_files:,
38+
credentials:,
39+
ignored_versions:,
40+
security_advisories:,
41+
cooldown_options: nil,
42+
raise_on_ignored: false,
43+
options: {}
44+
)
45+
@package_details = T.let(nil, T.nilable(Dependabot::Package::PackageDetails))
46+
@latest_version_details = T.let(nil, T.nilable(T::Hash[Symbol, T.untyped]))
47+
super
48+
end
49+
2350
sig { override.returns(T.nilable(Dependabot::Package::PackageDetails)) }
2451
def package_details
2552
@package_details ||= Package::PackageDetailsFetcher.new(
@@ -29,6 +56,7 @@ def package_details
2956
).fetch
3057
end
3158

59+
sig { returns(T.nilable(T::Hash[Symbol, T.untyped])) }
3260
def latest_version_details
3361
@latest_version_details ||= if cooldown_enabled?
3462
latest_version = fetch_latest_version(language_version: nil)
@@ -57,20 +85,28 @@ def available_versions
5785

5886
private
5987

88+
sig { returns(T.nilable(T::Hash[Symbol, Dependabot::Version])) }
6089
def fetch_latest_version_details
6190
return dependency_source.latest_git_version_details if dependency_source.git?
6291

63-
relevant_versions = dependency_source.versions
92+
relevant_versions = available_versions || []
6493
relevant_versions = filter_prerelease_versions(relevant_versions)
6594
relevant_versions = filter_ignored_versions(relevant_versions)
6695

67-
relevant_versions.empty? ? nil : { version: relevant_versions.max }
96+
return if relevant_versions.empty?
97+
98+
release = relevant_versions.max_by(&:version)
99+
100+
return if release.nil?
101+
102+
{ version: release.version }
68103
end
69104

70-
def fetch_lowest_security_fix_version(*)
105+
sig { returns(T.nilable(Dependabot::Version)) }
106+
def fetch_lowest_security_fix_version
71107
return if dependency_source.git?
72108

73-
relevant_versions = dependency_source.versions
109+
relevant_versions = available_versions || []
74110
relevant_versions = filter_prerelease_versions(relevant_versions)
75111
relevant_versions = Dependabot::UpdateCheckers::VersionFilters
76112
.filter_vulnerable_versions(
@@ -80,7 +116,7 @@ def fetch_lowest_security_fix_version(*)
80116
relevant_versions = filter_ignored_versions(relevant_versions)
81117
relevant_versions = filter_lower_versions(relevant_versions)
82118

83-
relevant_versions.min
119+
relevant_versions.min_by(&:version)&.version
84120
end
85121

86122
sig { returns(T::Boolean) }
@@ -99,7 +135,7 @@ def wants_prerelease?
99135
)
100136
end
101137

102-
# sig { returns(DependencySource) }
138+
sig { returns(DependencySource) }
103139
def dependency_source
104140
@dependency_source ||= T.let(
105141
DependencySource.new(

cargo/lib/dependabot/cargo/update_checker/latest_version_finder.rb

+24-7
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# typed: true
1+
# typed: strict
22
# frozen_string_literal: true
33

44
require "excon"
@@ -26,12 +26,20 @@ def package_details
2626
).fetch
2727
end
2828

29-
def latest_version
30-
@latest_version ||= fetch_latest_version
29+
sig do
30+
override.params(language_version: T.nilable(T.any(String, Dependabot::Version)))
31+
.returns(T.nilable(Dependabot::Version))
32+
end
33+
def latest_version(language_version: nil)
34+
@latest_version ||= fetch_latest_version(language_version: language_version)
3135
end
3236

33-
def lowest_security_fix_version
34-
@lowest_security_fix_version ||= fetch_lowest_security_fix_version(language_version: nil)
37+
sig do
38+
override.params(language_version: T.nilable(T.any(String, Dependabot::Version)))
39+
.returns(T.nilable(Dependabot::Version))
40+
end
41+
def lowest_security_fix_version(language_version: nil)
42+
@lowest_security_fix_version ||= fetch_lowest_security_fix_version(language_version: language_version)
3543
end
3644

3745
protected
@@ -53,14 +61,23 @@ def cooldown_enabled?
5361

5462
private
5563

64+
sig { returns(Dependabot::Dependency) }
5665
attr_reader :dependency
66+
sig { returns(T::Array[Dependabot::DependencyFile]) }
5767
attr_reader :dependency_files
68+
sig { returns(T::Array[Dependabot::Credential]) }
5869
attr_reader :credentials
70+
sig { returns(T::Array[String]) }
5971
attr_reader :ignored_versions
72+
sig { returns(T::Array[Dependabot::SecurityAdvisory]) }
6073
attr_reader :security_advisories
6174

62-
def apply_post_fetch_lowest_security_fix_versions_filter(versions)
63-
filter_prerelease_versions(versions)
75+
sig do
76+
override.params(releases: T::Array[Dependabot::Package::PackageRelease])
77+
.returns(T::Array[Dependabot::Package::PackageRelease])
78+
end
79+
def apply_post_fetch_lowest_security_fix_versions_filter(releases)
80+
filter_prerelease_versions(releases)
6481
end
6582
end
6683
end

0 commit comments

Comments
 (0)