Skip to content

Commit d1b6f01

Browse files
committed
Apply strict sorbet typings for python files
1 parent c3799f6 commit d1b6f01

9 files changed

+198
-67
lines changed

python/lib/dependabot/python/authed_url_builder.rb

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
1-
# typed: true
1+
# typed: strict
22
# frozen_string_literal: true
33

4+
require "sorbet-runtime"
5+
46
module Dependabot
57
module Python
68
class AuthedUrlBuilder
9+
extend T::Sig
10+
11+
sig { params(credential: Credential).returns(T.nilable(String)) }
712
def self.authed_url(credential:)
813
token = credential.fetch("token", nil)
914
url = credential.fetch("index-url", nil)

python/lib/dependabot/python/file_updater.rb

+4-3
Original file line numberDiff line numberDiff line change
@@ -135,12 +135,13 @@ def updated_requirement_based_files
135135
sig { returns(T::Array[String]) }
136136
def pip_compile_index_urls
137137
if credentials.any?(&:replaces_base?)
138-
credentials.select(&:replaces_base?).map { |cred| AuthedUrlBuilder.authed_url(credential: cred) }
138+
credentials.select(&:replaces_base?)
139+
.filter_map { |cred| AuthedUrlBuilder.authed_url(credential: cred) }
139140
else
140-
urls = credentials.map { |cred| AuthedUrlBuilder.authed_url(credential: cred) }
141+
urls = credentials.filter_map { |cred| AuthedUrlBuilder.authed_url(credential: cred) }
141142
# If there are no credentials that replace the base, we need to
142143
# ensure that the base URL is included in the list of extra-index-urls.
143-
[nil, *urls]
144+
urls
144145
end
145146
end
146147

python/lib/dependabot/python/file_updater/pip_compile_file_updater.rb

+17-9
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
require "dependabot/python/native_helpers"
1313
require "dependabot/python/name_normaliser"
1414
require "dependabot/python/authed_url_builder"
15+
require "sorbet-runtime"
1516

1617
module Dependabot
1718
module Python
@@ -303,16 +304,20 @@ def setup_cfg(file)
303304

304305
sig { params(file: Dependabot::DependencyFile).returns(T.nilable(String)) }
305306
def freeze_dependency_requirement(file)
306-
return file.content unless file.name.end_with?(".in")
307+
content = file.content
308+
return content unless file.name.end_with?(".in")
307309

308310
old_req = T.must(T.must(dependency).previous_requirements)
309311
.find { |r| r[:file] == file.name }
310312

311-
return file.content unless old_req
312-
return file.content if old_req == "==#{T.must(dependency).version}"
313+
content = file.content
314+
return content unless old_req
315+
return content if old_req == "==#{T.must(dependency).version}"
316+
317+
return unless content
313318

314319
RequirementReplacer.new(
315-
content: file.content,
320+
content: content,
316321
dependency_name: T.must(dependency).name,
317322
old_requirement: old_req[:requirement],
318323
new_requirement: "==#{T.must(dependency).version}",
@@ -322,17 +327,20 @@ def freeze_dependency_requirement(file)
322327

323328
sig { params(file: Dependabot::DependencyFile).returns(T.nilable(String)) }
324329
def update_dependency_requirement(file)
325-
return file.content unless file.name.end_with?(".in")
330+
content = file.content
331+
return content unless file.name.end_with?(".in")
326332

327333
old_req = T.must(T.must(dependency).previous_requirements)
328334
.find { |r| r[:file] == file.name }
329335
new_req = T.must(dependency).requirements
330336
.find { |r| r[:file] == file.name }
331-
return file.content unless old_req&.fetch(:requirement)
332-
return file.content if old_req == new_req
337+
return content unless old_req&.fetch(:requirement)
338+
return content if old_req == new_req
339+
340+
return unless content
333341

334342
RequirementReplacer.new(
335-
content: file.content,
343+
content: content,
336344
dependency_name: T.must(dependency).name,
337345
old_requirement: old_req[:requirement],
338346
new_requirement: T.must(new_req)[:requirement],
@@ -449,7 +457,7 @@ def deps_to_augment_hashes_for(updated_content, original_content)
449457

450458
sig { params(name: String, version: String, algorithm: String).returns(T::Array[String]) }
451459
def package_hashes_for(name:, version:, algorithm:)
452-
index_urls = @index_urls || [nil]
460+
index_urls = @index_urls&.any? ? @index_urls : [nil]
453461
hashes = []
454462

455463
index_urls.each do |index_url|

python/lib/dependabot/python/file_updater/pipfile_preparer.rb

+8-3
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,11 @@ def pipfile_sources
7575
end
7676

7777
sig do
78-
params(source: T::Hash[String, String],
79-
credentials: T::Array[Dependabot::Credential]).returns(T.nilable(T::Hash[String, String]))
78+
params(
79+
source: T::Hash[String, String],
80+
credentials: T::Array[Dependabot::Credential]
81+
)
82+
.returns(T.nilable(T::Hash[String, String]))
8083
end
8184
def sub_auth_url(source, credentials)
8285
if source["url"]&.include?("${")
@@ -88,7 +91,9 @@ def sub_auth_url(source, credentials)
8891

8992
return nil if source_cred.nil?
9093

91-
source["url"] = AuthedUrlBuilder.authed_url(credential: source_cred)
94+
source_url = AuthedUrlBuilder.authed_url(credential: source_cred)
95+
96+
source["url"] = source_url if source_url
9297
end
9398

9499
source

python/lib/dependabot/python/file_updater/requirement_file_updater.rb

+44-9
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,104 @@
1-
# typed: true
1+
# typed: strict
22
# frozen_string_literal: true
33

44
require "dependabot/python/requirement_parser"
55
require "dependabot/python/file_updater"
66
require "dependabot/shared_helpers"
77
require "dependabot/python/native_helpers"
8+
require "sorbet-runtime"
89

910
module Dependabot
1011
module Python
1112
class FileUpdater
1213
class RequirementFileUpdater
14+
extend T::Sig
15+
1316
require_relative "requirement_replacer"
1417

15-
attr_reader :dependencies
18+
sig { returns(T::Array[Dependabot::DependencyFile]) }
1619
attr_reader :dependency_files
20+
21+
sig { returns(T::Array[Dependabot::Credential]) }
1722
attr_reader :credentials
1823

24+
sig { returns(T::Array[Dependabot::Dependency]) }
25+
attr_reader :dependencies
26+
27+
sig do
28+
params(
29+
dependencies: T::Array[Dependabot::Dependency],
30+
dependency_files: T::Array[Dependabot::DependencyFile],
31+
credentials: T::Array[Dependabot::Credential],
32+
index_urls: T.nilable(T::Array[String])
33+
).void
34+
end
1935
def initialize(dependencies:, dependency_files:, credentials:, index_urls: nil)
2036
@dependencies = dependencies
2137
@dependency_files = dependency_files
2238
@credentials = credentials
2339
@index_urls = index_urls
2440
end
2541

42+
sig { returns(T::Array[Dependabot::DependencyFile]) }
2643
def updated_dependency_files
27-
@updated_dependency_files ||= fetch_updated_dependency_files
44+
@updated_dependency_files ||= T.let(
45+
fetch_updated_dependency_files,
46+
T.nilable(T::Array[DependencyFile])
47+
)
2848
end
2949

3050
private
3151

52+
sig { returns(Dependabot::Dependency) }
3253
def dependency
3354
# For now, we'll only ever be updating a single dependency
34-
dependencies.first
55+
T.must(dependencies.first)
3556
end
3657

58+
sig { returns(T::Array[Dependabot::DependencyFile]) }
3759
def fetch_updated_dependency_files
38-
reqs = dependency.requirements.zip(dependency.previous_requirements)
60+
reqs = dependency.requirements.zip(dependency.previous_requirements || [])
3961

4062
reqs.filter_map do |(new_req, old_req)|
4163
next if new_req == old_req
4264

4365
file = get_original_file(new_req.fetch(:file)).dup
4466
updated_content =
4567
updated_requirement_or_setup_file_content(new_req, old_req)
46-
next if updated_content == file.content
68+
next if updated_content == file&.content
4769

48-
file.content = updated_content
70+
file&.content = updated_content
4971
file
5072
end
5173
end
5274

75+
sig do
76+
params(
77+
new_req: T::Hash[Symbol, T.untyped],
78+
old_req: T.nilable(T::Hash[Symbol, T.untyped])
79+
).returns(T.nilable(String))
80+
end
5381
def updated_requirement_or_setup_file_content(new_req, old_req)
5482
original_file = get_original_file(new_req.fetch(:file))
5583
raise "Could not find a dependency file for #{new_req}" unless original_file
5684

85+
original_content = original_file.content
86+
return original_content if original_content.nil?
87+
5788
RequirementReplacer.new(
58-
content: original_file.content,
89+
content: original_content,
5990
dependency_name: dependency.name,
60-
old_requirement: old_req.fetch(:requirement),
91+
old_requirement: old_req&.fetch(:requirement),
6192
new_requirement: new_req.fetch(:requirement),
6293
new_hash_version: dependency.version,
6394
index_urls: @index_urls
6495
).updated_content
6596
end
6697

98+
sig do
99+
params(filename: String)
100+
.returns(T.nilable(Dependabot::DependencyFile))
101+
end
67102
def get_original_file(filename)
68103
dependency_files.find { |f| f.name == filename }
69104
end

0 commit comments

Comments
 (0)