Skip to content

Commit a7c610f

Browse files
Merge pull request #12027 from dependabot/ssandhu/adds-cooldown-for-cargo
Adds cooldown options to Cargo ecosystem latest version finder
2 parents b17a9af + c141bba commit a7c610f

File tree

4 files changed

+133
-21
lines changed

4 files changed

+133
-21
lines changed

cargo/lib/dependabot/cargo/update_checker.rb

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -116,14 +116,16 @@ def library?
116116
end
117117

118118
def latest_version_finder
119-
@latest_version_finder ||= LatestVersionFinder.new(
120-
dependency: dependency,
121-
dependency_files: dependency_files,
122-
credentials: credentials,
123-
ignored_versions: ignored_versions,
124-
raise_on_ignored: raise_on_ignored,
125-
security_advisories: security_advisories
126-
)
119+
@latest_version_finder ||=
120+
LatestVersionFinder.new(
121+
dependency: dependency,
122+
dependency_files: dependency_files,
123+
credentials: credentials,
124+
ignored_versions: ignored_versions,
125+
security_advisories: security_advisories,
126+
cooldown_options: update_cooldown,
127+
raise_on_ignored: raise_on_ignored
128+
)
127129
end
128130

129131
def latest_version_for_git_dependency

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

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,6 @@ class UpdateChecker
1515
class LatestVersionFinder < Dependabot::Package::PackageLatestVersionFinder
1616
extend T::Sig
1717

18-
def initialize(dependency:, dependency_files:, credentials:,
19-
ignored_versions:, raise_on_ignored: false,
20-
security_advisories:)
21-
@dependency = dependency
22-
@dependency_files = dependency_files
23-
@credentials = credentials
24-
@ignored_versions = ignored_versions
25-
@raise_on_ignored = raise_on_ignored
26-
@security_advisories = security_advisories
27-
end
28-
2918
sig do
3019
override.returns(T.nilable(Dependabot::Package::PackageDetails))
3120
end
@@ -57,6 +46,11 @@ def wants_prerelease?
5746
end
5847
end
5948

49+
sig { override.returns(T::Boolean) }
50+
def cooldown_enabled?
51+
Dependabot::Experiments.enabled?(:enable_cooldown_for_cargo)
52+
end
53+
6054
private
6155

6256
attr_reader :dependency

cargo/spec/dependabot/cargo/update_checker/latest_version_finder_spec.rb

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,11 @@
2020
credentials: credentials,
2121
ignored_versions: ignored_versions,
2222
raise_on_ignored: raise_on_ignored,
23-
security_advisories: security_advisories
23+
security_advisories: security_advisories,
24+
cooldown_options: cooldown_options
2425
)
2526
end
27+
let(:cooldown_options) { nil }
2628
let(:credentials) do
2729
[{
2830
"type" => "git_source",
@@ -467,5 +469,78 @@
467469
end
468470
end
469471
end
472+
473+
describe "#latest_version with cooldown options" do
474+
subject(:latest_version) { finder.latest_version }
475+
476+
before do
477+
allow(Dependabot::Experiments).to receive(:enabled?)
478+
.with(:enable_cooldown_for_cargo).and_return(true)
479+
stub_request(:get, sparse_registry_url).to_return(status: 200, body: sparse_registry_response)
480+
end
481+
482+
let(:cooldown_options) do
483+
Dependabot::Package::ReleaseCooldownOptions.new(default_days: 7)
484+
end
485+
let(:expected_cooldown_options) do
486+
Dependabot::Package::ReleaseCooldownOptions.new(
487+
default_days: 7,
488+
semver_major_days: 7,
489+
semver_minor_days: 7,
490+
semver_patch_days: 7,
491+
include: [],
492+
exclude: []
493+
)
494+
end
495+
496+
context "when the latest version is released" do
497+
let(:sparse_registry_response) do
498+
<<~BODY
499+
{"name": "hello-world", "vers": "1.0.0", "created_at": "2024-12-02T20:07:38.990663Z", "deps": [], "cksum": "b2c263921f1114820f4acc6b542d72bbc859ce7023c5b235346b157074dcccc7", "features": {}, "yanked": false, "links": null}
500+
{"name": "hello-world", "vers": "2.0.0", "created_at": "#{Time.now}", "deps": [], "cksum": "8a55b58def1ecc7aa8590c7078f379ec9a85328363ffb81d4354314b132b95c4", "features": {}, "yanked": false, "links": null}
501+
BODY
502+
end
503+
504+
context "when new version is released but it is filtered out due to cooldown period" do
505+
let(:requirements) do
506+
[{
507+
file: "Cargo.toml",
508+
requirement: "~2.0.0",
509+
groups: ["dependencies"],
510+
source: {
511+
type: "registry",
512+
name: "honeyankit-test",
513+
index: "sparse+https://cargo.cloudsmith.io/honeyankit/test/",
514+
dl: "https://dl.cloudsmith.io/basic/honeyankit/test/cargo/{crate}-{version}.crate",
515+
api: "https://cargo.cloudsmith.io/honeyankit/test"
516+
}
517+
}]
518+
end
519+
520+
it { is_expected.to eq(Gem::Version.new("1.0.0")) }
521+
end
522+
523+
context "when new version is released but and cooldown is disabled" do
524+
let(:cooldown_options) { nil }
525+
526+
let(:requirements) do
527+
[{
528+
file: "Cargo.toml",
529+
requirement: "~2.0.0",
530+
groups: ["dependencies"],
531+
source: {
532+
type: "registry",
533+
name: "honeyankit-test",
534+
index: "sparse+https://cargo.cloudsmith.io/honeyankit/test/",
535+
dl: "https://dl.cloudsmith.io/basic/honeyankit/test/cargo/{crate}-{version}.crate",
536+
api: "https://cargo.cloudsmith.io/honeyankit/test"
537+
}
538+
}]
539+
end
540+
541+
it { is_expected.to eq(Gem::Version.new("2.0.0")) }
542+
end
543+
end
544+
end
470545
end
471546
end

cargo/spec/dependabot/cargo/update_checker_spec.rb

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
let(:security_advisories) { [] }
5050
let(:raise_on_ignored) { false }
5151
let(:ignored_versions) { [] }
52+
let(:update_cooldown) { nil }
5253
let(:checker) do
5354
described_class.new(
5455
dependency: dependency,
@@ -57,7 +58,8 @@
5758
ignored_versions: ignored_versions,
5859
raise_on_ignored: raise_on_ignored,
5960
security_advisories: security_advisories,
60-
requirements_update_strategy: requirements_update_strategy
61+
requirements_update_strategy: requirements_update_strategy,
62+
update_cooldown: update_cooldown
6163
)
6264
end
6365
let(:crates_fixture_name) { "#{dependency_name}.json" }
@@ -508,4 +510,43 @@
508510
it { is_expected.to be(false) }
509511
end
510512
end
513+
514+
describe "with cooldown options" do
515+
let(:update_cooldown) do
516+
Dependabot::Package::ReleaseCooldownOptions.new(default_days: 7)
517+
end
518+
let(:expected_cooldown_options) do
519+
Dependabot::Package::ReleaseCooldownOptions.new(
520+
default_days: 7,
521+
semver_major_days: 7,
522+
semver_minor_days: 7,
523+
semver_patch_days: 7,
524+
include: [],
525+
exclude: []
526+
)
527+
end
528+
529+
before do
530+
latest_version = instance_double(Dependabot::Cargo::UpdateChecker::LatestVersionFinder)
531+
allow(latest_version)
532+
.to receive(:latest_version).and_return({ version: Gem::Version.new("1.5.0") })
533+
allow(Dependabot::Cargo::UpdateChecker::LatestVersionFinder)
534+
.to receive(:new).and_return(latest_version)
535+
end
536+
537+
it "passes cooldown_options to LatestVersionFinder" do
538+
checker.latest_version
539+
540+
expect(Dependabot::Cargo::UpdateChecker::LatestVersionFinder).to have_received(:new).with(
541+
hash_including(cooldown_options: an_object_having_attributes(
542+
default_days: expected_cooldown_options.default_days,
543+
semver_major_days: expected_cooldown_options.semver_major_days,
544+
semver_minor_days: expected_cooldown_options.semver_minor_days,
545+
semver_patch_days: expected_cooldown_options.semver_patch_days,
546+
include: expected_cooldown_options.include,
547+
exclude: expected_cooldown_options.exclude
548+
))
549+
)
550+
end
551+
end
511552
end

0 commit comments

Comments
 (0)