Skip to content

Commit c0b00ef

Browse files
authored
Add support for python 3.8 deprecation warning and unsupported error (#11166)
1 parent ec380a2 commit c0b00ef

File tree

2 files changed

+155
-1
lines changed

2 files changed

+155
-1
lines changed

python/lib/dependabot/python/language.rb

+34-1
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,43 @@ module Python
1111

1212
class Language < Dependabot::Ecosystem::VersionManager
1313
extend T::Sig
14+
# These versions should match the versions specified at the top of `python/Dockerfile`
15+
PYTHON_3_13 = "3.13"
16+
PYTHON_3_12 = "3.12"
17+
PYTHON_3_11 = "3.11"
18+
PYTHON_3_10 = "3.10"
19+
PYTHON_3_9 = "3.9"
20+
PYTHON_3_8 = "3.8"
21+
22+
DEPRECATED_VERSIONS = T.let([Version.new(PYTHON_3_8)].freeze, T::Array[Dependabot::Version])
23+
24+
# Keep versions in ascending order
25+
SUPPORTED_VERSIONS = T.let([
26+
Version.new(PYTHON_3_9),
27+
Version.new(PYTHON_3_10),
28+
Version.new(PYTHON_3_11),
29+
Version.new(PYTHON_3_12),
30+
Version.new(PYTHON_3_13)
31+
].freeze, T::Array[Dependabot::Version])
1432

1533
sig { params(raw_version: String, requirement: T.nilable(Requirement)).void }
1634
def initialize(raw_version, requirement = nil)
17-
super(LANGUAGE, Version.new(raw_version), [], [], requirement)
35+
super(LANGUAGE, Version.new(raw_version), DEPRECATED_VERSIONS, SUPPORTED_VERSIONS, requirement)
36+
end
37+
38+
sig { override.returns(T::Boolean) }
39+
def deprecated?
40+
return false if unsupported?
41+
return false unless Dependabot::Experiments.enabled?(:python_3_8_deprecation_warning)
42+
43+
deprecated_versions.include?(version)
44+
end
45+
46+
sig { override.returns(T::Boolean) }
47+
def unsupported?
48+
return false unless Dependabot::Experiments.enabled?(:python_3_8_unsupported_error)
49+
50+
supported_versions.all? { |supported| supported > version }
1851
end
1952
end
2053
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
# typed: false
2+
# frozen_string_literal: true
3+
4+
require "dependabot/python/language"
5+
require "dependabot/ecosystem"
6+
require_relative "../../spec_helper"
7+
8+
RSpec.describe Dependabot::Python::Language do
9+
subject(:language) { described_class.new(version) }
10+
11+
describe "#deprecated?" do
12+
let(:version) { "3.8" }
13+
14+
before do
15+
allow(::Dependabot::Experiments).to receive(:enabled?)
16+
.with(:python_3_8_deprecation_warning)
17+
.and_return(deprecation_enabled)
18+
allow(::Dependabot::Experiments).to receive(:enabled?)
19+
.with(:python_3_8_unsupported_error)
20+
.and_return(unsupported_enabled)
21+
end
22+
23+
context "when python_3_8_deprecation_warning is enabled and version is deprecated" do
24+
let(:deprecation_enabled) { true }
25+
let(:unsupported_enabled) { false }
26+
27+
it "returns true" do
28+
expect(language.deprecated?).to be true
29+
end
30+
end
31+
32+
context "when python_3_8_deprecation_warning is enabled but version is not deprecated" do
33+
let(:version) { "3.13" }
34+
let(:deprecation_enabled) { true }
35+
let(:unsupported_enabled) { false }
36+
37+
it "returns false" do
38+
expect(language.deprecated?).to be false
39+
end
40+
end
41+
42+
context "when python_3_8_deprecation_warning is disabled" do
43+
let(:deprecation_enabled) { false }
44+
let(:unsupported_enabled) { false }
45+
46+
it "returns false" do
47+
expect(language.deprecated?).to be false
48+
end
49+
end
50+
51+
context "when version is unsupported" do
52+
let(:deprecation_enabled) { true }
53+
let(:unsupported_enabled) { true }
54+
55+
it "returns false, as unsupported takes precedence" do
56+
expect(language.deprecated?).to be false
57+
end
58+
end
59+
end
60+
61+
describe "#unsupported?" do
62+
let(:version) { "3.8" }
63+
64+
before do
65+
allow(::Dependabot::Experiments).to receive(:enabled?)
66+
.with(:python_3_8_unsupported_error)
67+
.and_return(unsupported_enabled)
68+
end
69+
70+
context "when python_3_8_unsupported_error is enabled and version is unsupported" do
71+
let(:unsupported_enabled) { true }
72+
73+
it "returns true" do
74+
expect(language.unsupported?).to be true
75+
end
76+
end
77+
78+
context "when python_3_8_unsupported_error is enabled but version is supported" do
79+
let(:version) { "3.13" }
80+
let(:unsupported_enabled) { true }
81+
82+
it "returns false" do
83+
expect(language.unsupported?).to be false
84+
end
85+
end
86+
87+
context "when python_3_8_unsupported_error is disabled" do
88+
let(:unsupported_enabled) { false }
89+
90+
it "returns false" do
91+
expect(language.unsupported?).to be false
92+
end
93+
end
94+
end
95+
96+
describe "#raise_if_unsupported!" do
97+
let(:version) { "3.8" }
98+
99+
before do
100+
allow(Dependabot::Experiments).to receive(:enabled?)
101+
.with(:python_3_8_unsupported_error)
102+
.and_return(unsupported_enabled)
103+
end
104+
105+
context "when python_3_8_unsupported_error is enabled and version is unsupported" do
106+
let(:unsupported_enabled) { true }
107+
108+
it "raises a ToolVersionNotSupported error" do
109+
expect { language.raise_if_unsupported! }.to raise_error(Dependabot::ToolVersionNotSupported)
110+
end
111+
end
112+
113+
context "when python_3_8_unsupported_error is disabled" do
114+
let(:unsupported_enabled) { false }
115+
116+
it "does not raise an error" do
117+
expect { language.raise_if_unsupported! }.not_to raise_error
118+
end
119+
end
120+
end
121+
end

0 commit comments

Comments
 (0)