1- # typed: true # rubocop:todo Sorbet/StrictSigil
1+ # typed: strict
22# frozen_string_literal: true
33
44require "resource"
55require "erb"
66require "utils/output"
77
8+ Owner = T . type_alias { T . any ( Formula , Resource , SoftwareSpec ) }
9+
810# Helper module for creating patches.
911module Patch
12+ sig {
13+ params (
14+ strip : T . any ( Symbol , String ) ,
15+ src : T . nilable ( T . any ( Symbol , String ) ) ,
16+ block : T . nilable ( T . proc . bind ( Resource ::Patch ) . void ) ,
17+ ) . returns ( T . any ( EmbeddedPatch , ExternalPatch ) )
18+ }
1019 def self . create ( strip , src , &block )
1120 case strip
1221 when :DATA
@@ -22,32 +31,38 @@ def self.create(strip, src, &block)
2231 else
2332 ExternalPatch . new ( strip , &block )
2433 end
25- when nil
26- raise ArgumentError , "nil value for strip"
27- else
28- raise ArgumentError , "Unexpected value for strip: #{ strip . inspect } "
2934 end
3035 end
3136end
3237
3338# An abstract class representing a patch embedded into a formula.
3439class EmbeddedPatch
3540 include Utils ::Output ::Mixin
41+ extend T ::Helpers
42+
43+ abstract!
3644
45+ sig { params ( owner : T . nilable ( Owner ) ) . returns ( T . nilable ( Owner ) ) }
3746 attr_writer :owner
47+
48+ sig { returns ( T . any ( String , Symbol ) ) }
3849 attr_reader :strip
3950
51+ sig { params ( strip : T . any ( String , Symbol ) ) . void }
4052 def initialize ( strip )
41- @strip = strip
53+ @strip = T . let ( strip , T . any ( String , Symbol ) )
54+ @owner = T . let ( nil , T . nilable ( Owner ) )
4255 end
4356
4457 sig { returns ( T ::Boolean ) }
4558 def external?
4659 false
4760 end
4861
62+ sig { abstract . returns ( String ) }
4963 def contents ; end
5064
65+ sig { void }
5166 def apply
5267 data = contents . gsub ( "@@HOMEBREW_PREFIX@@" , HOMEBREW_PREFIX )
5368 if data . gsub! ( "HOMEBREW_PREFIX" , HOMEBREW_PREFIX )
@@ -66,15 +81,20 @@ def inspect
6681
6782# A patch at the `__END__` of a formula file.
6883class DATAPatch < EmbeddedPatch
84+ sig { returns ( T . nilable ( Pathname ) ) }
6985 attr_accessor :path
7086
87+ sig { params ( strip : T . any ( String , Symbol ) ) . void }
7188 def initialize ( strip )
7289 super
73- @path = nil
90+ @path = T . let ( nil , T . nilable ( Pathname ) )
7491 end
7592
76- sig { returns ( String ) }
93+ sig { override . returns ( String ) }
7794 def contents
95+ path = self . path
96+ raise ArgumentError , "DATAPatch#contents called before path was set!" unless path
97+
7898 data = +""
7999 path . open ( "rb" ) do |f |
80100 loop do
@@ -91,11 +111,13 @@ def contents
91111
92112# A string containing a patch.
93113class StringPatch < EmbeddedPatch
114+ sig { params ( strip : T . any ( String , Symbol ) , str : String ) . void }
94115 def initialize ( strip , str )
95116 super ( strip )
96- @str = str
117+ @str = T . let ( str , String )
97118 end
98119
120+ sig { override . returns ( String ) }
99121 def contents
100122 @str
101123 end
@@ -107,27 +129,34 @@ class ExternalPatch
107129
108130 extend Forwardable
109131
110- attr_reader :resource , :strip
132+ sig { returns ( Resource ::Patch ) }
133+ attr_reader :resource
134+
135+ sig { returns ( T . any ( String , Symbol ) ) }
136+ attr_reader :strip
111137
112138 def_delegators :resource ,
113139 :url , :fetch , :patch_files , :verify_download_integrity ,
114140 :cached_download , :downloaded? , :clear_cache
115141
142+ sig { params ( strip : T . any ( String , Symbol ) , block : T . nilable ( T . proc . bind ( Resource ::Patch ) . void ) ) . void }
116143 def initialize ( strip , &block )
117- @strip = strip
118- @resource = Resource ::Patch . new ( &block )
144+ @strip = T . let ( strip , T . any ( String , Symbol ) )
145+ @resource = T . let ( Resource ::Patch . new ( &block ) , Resource :: Patch )
119146 end
120147
121148 sig { returns ( T ::Boolean ) }
122149 def external?
123150 true
124151 end
125152
153+ sig { params ( owner : T . nilable ( Owner ) ) . void }
126154 def owner = ( owner )
127155 resource . owner = owner
128156 resource . version ( resource . checksum &.hexdigest || ERB ::Util . url_encode ( resource . url ) )
129157 end
130158
159+ sig { void }
131160 def apply
132161 base_dir = Pathname . pwd
133162 resource . unpack do
0 commit comments