1
- # typed: true # rubocop:todo Sorbet/StrictSigil
1
+ # typed: strict
2
2
# frozen_string_literal: true
3
3
4
4
require "utils/inreplace"
@@ -14,20 +14,20 @@ module PyPI
14
14
class Package
15
15
sig { params ( package_string : String , is_url : T ::Boolean , python_name : String ) . void }
16
16
def initialize ( package_string , is_url : false , python_name : "python" )
17
- @pypi_info = nil
17
+ @pypi_info = T . let ( nil , T . nilable ( T :: Array [ String ] ) )
18
18
@package_string = package_string
19
19
@is_url = is_url
20
- @is_pypi_url = package_string . start_with? PYTHONHOSTED_URL_PREFIX
20
+ @is_pypi_url = T . let ( package_string . start_with? ( PYTHONHOSTED_URL_PREFIX ) , T :: Boolean )
21
21
@python_name = python_name
22
22
end
23
23
24
- sig { returns ( String ) }
24
+ sig { returns ( T . nilable ( String ) ) }
25
25
def name
26
26
basic_metadata if @name . blank?
27
27
@name
28
28
end
29
29
30
- sig { returns ( T ::Array [ T . nilable ( String ) ] ) }
30
+ sig { returns ( T . nilable ( T ::Array [ String ] ) ) }
31
31
def extras
32
32
basic_metadata if @extras . blank?
33
33
@extras
@@ -43,7 +43,7 @@ def version
43
43
def version = ( new_version )
44
44
raise ArgumentError , "can't update version for non-PyPI packages" unless valid_pypi_package?
45
45
46
- @version = new_version
46
+ @version = T . let ( new_version , T . nilable ( String ) )
47
47
end
48
48
49
49
sig { returns ( T ::Boolean ) }
@@ -97,8 +97,10 @@ def pypi_info(new_version: nil)
97
97
sig { returns ( String ) }
98
98
def to_s
99
99
if valid_pypi_package?
100
- out = name
101
- out += "[#{ extras . join ( "," ) } ]" if extras . present?
100
+ out = T . must ( name )
101
+ if ( pypi_extras = extras . presence )
102
+ out += "[#{ pypi_extras . join ( "," ) } ]"
103
+ end
102
104
out += "==#{ version } " if version . present?
103
105
out
104
106
else
@@ -132,14 +134,15 @@ def <=>(other)
132
134
private
133
135
134
136
# Returns [name, [extras], version] for this package.
137
+ sig { returns ( T . nilable ( T . any ( String , T ::Array [ String ] ) ) ) }
135
138
def basic_metadata
136
139
if @is_pypi_url
137
140
match = File . basename ( @package_string ) . match ( /^(.+)-([a-z\d .]+?)(?:.tar.gz|.zip)$/ )
138
141
raise ArgumentError , "Package should be a valid PyPI URL" if match . blank?
139
142
140
- @name ||= PyPI . normalize_python_package match [ 1 ]
141
- @extras ||= [ ]
142
- @version ||= match [ 2 ]
143
+ @name ||= T . let ( PyPI . normalize_python_package ( T . must ( match [ 1 ] ) ) , T . nilable ( String ) )
144
+ @extras ||= T . let ( [ ] , T . nilable ( T :: Array [ String ] ) )
145
+ @version ||= T . let ( match [ 2 ] , T . nilable ( String ) )
143
146
elsif @is_url
144
147
ensure_formula_installed! ( @python_name )
145
148
@@ -162,9 +165,9 @@ def basic_metadata
162
165
163
166
metadata = JSON . parse ( pip_output ) [ "install" ] . first [ "metadata" ]
164
167
165
- @name ||= PyPI . normalize_python_package metadata [ "name" ]
166
- @extras ||= [ ]
167
- @version ||= metadata [ "version" ]
168
+ @name ||= T . let ( PyPI . normalize_python_package ( metadata [ "name" ] ) , T . nilable ( String ) )
169
+ @extras ||= T . let ( [ ] , T . nilable ( T :: Array [ String ] ) )
170
+ @version ||= T . let ( metadata [ "version" ] , T . nilable ( String ) )
168
171
else
169
172
if @package_string . include? "=="
170
173
name , version = @package_string . split ( "==" )
@@ -180,7 +183,7 @@ def basic_metadata
180
183
extras = [ ]
181
184
end
182
185
183
- @name ||= PyPI . normalize_python_package name
186
+ @name ||= T . let ( PyPI . normalize_python_package ( T . must ( name ) ) , T . nilable ( String ) )
184
187
@extras ||= extras
185
188
@version ||= version
186
189
end
@@ -248,7 +251,7 @@ def self.update_python_resources!(formula, version: nil, package_name: nil, extr
248
251
missing_msg = "formulae required to update \" #{ formula . name } \" resources: #{ missing_dependencies . join ( ", " ) } "
249
252
odie "Missing #{ missing_msg } " unless install_dependencies
250
253
ohai "Installing #{ missing_msg } "
251
- missing_dependencies . each ( &method ( :ensure_formula_installed! ) )
254
+ missing_dependencies . each ( &:ensure_formula_installed! )
252
255
end
253
256
254
257
python_deps = formula . deps
@@ -327,12 +330,21 @@ def self.update_python_resources!(formula, version: nil, package_name: nil, extr
327
330
# Resolve the dependency tree of all input packages
328
331
show_info = !print_only && !silent
329
332
ohai "Retrieving PyPI dependencies for \" #{ input_packages . join ( " " ) } \" ..." if show_info
330
- found_packages = pip_report ( input_packages , python_name :, print_stderr : verbose && show_info )
333
+
334
+ print_stderr = if verbose && show_info
335
+ true
336
+ else
337
+ false
338
+ end
339
+
340
+ found_packages = pip_report ( input_packages , python_name :, print_stderr :)
331
341
# Resolve the dependency tree of excluded packages to prune the above
332
342
exclude_packages . delete_if { |package | found_packages . exclude? package }
333
343
ohai "Retrieving PyPI dependencies for excluded \" #{ exclude_packages . join ( " " ) } \" ..." if show_info
334
- exclude_packages = pip_report ( exclude_packages , python_name :, print_stderr : verbose && show_info )
335
- exclude_packages += [ Package . new ( main_package . name ) ] unless main_package . nil?
344
+ exclude_packages = pip_report ( exclude_packages , python_name :, print_stderr :)
345
+ if ( main_package_name = main_package &.name )
346
+ exclude_packages += [ Package . new ( main_package_name ) ]
347
+ end
336
348
337
349
new_resource_blocks = ""
338
350
found_packages . sort . each do |package |
@@ -404,12 +416,18 @@ def self.update_python_resources!(formula, version: nil, package_name: nil, extr
404
416
true
405
417
end
406
418
419
+ sig { params ( name : String ) . returns ( String ) }
407
420
def self . normalize_python_package ( name )
408
421
# This normalization is defined in the PyPA packaging specifications;
409
422
# https://packaging.python.org/en/latest/specifications/name-normalization/#name-normalization
410
423
name . gsub ( /[-_.]+/ , "-" ) . downcase
411
424
end
412
425
426
+ sig {
427
+ params (
428
+ packages : T ::Array [ Package ] , python_name : String , print_stderr : T ::Boolean ,
429
+ ) . returns ( T ::Array [ Package ] )
430
+ }
413
431
def self . pip_report ( packages , python_name : "python" , print_stderr : false )
414
432
return [ ] if packages . blank?
415
433
@@ -430,6 +448,7 @@ def self.pip_report(packages, python_name: "python", print_stderr: false)
430
448
pip_report_to_packages ( JSON . parse ( pip_output ) ) . uniq
431
449
end
432
450
451
+ sig { params ( report : T ::Hash [ String , T . untyped ] ) . returns ( T ::Array [ Package ] ) }
433
452
def self . pip_report_to_packages ( report )
434
453
return [ ] if report . blank?
435
454
0 commit comments