Skip to content

Commit

Permalink
Enable Sorbet after running a developer command
Browse files Browse the repository at this point in the history
We have no commands with Sorbet disabled and have had Sorbet enabled
for developers for a decent amount of time. As a result, we can enable
it for everyone who has run a developer command.

This also allows a bunch of `raise TypeError`s to be removed in favour
of relying on Sorbet here instead.
  • Loading branch information
MikeMcQuaid committed Sep 2, 2023
1 parent ec9bb2f commit 8775465
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 85 deletions.
27 changes: 6 additions & 21 deletions Library/Homebrew/brew.sh
Original file line number Diff line number Diff line change
Expand Up @@ -912,27 +912,6 @@ then
export HOMEBREW_DEVELOPER_COMMAND="1"
fi

if [[ -n "${HOMEBREW_DEVELOPER}" || -n "${HOMEBREW_DEVELOPER_COMMAND}" ]]
then
# Always run with Sorbet for Homebrew developers or Homebrew developer commands.
export HOMEBREW_SORBET_RUNTIME="1"
fi

# NO_SORBET_RUNTIME_COMMANDS are currently failing with Sorbet for homebrew/core.
# TODO: fix this and remove this if block.
if [[ -n "${HOMEBREW_SORBET_RUNTIME}" ]]
then
NO_SORBET_RUNTIME_COMMANDS=(
)

if check-array-membership "${HOMEBREW_COMMAND}" "${NO_SORBET_RUNTIME_COMMANDS[@]}"
then
unset HOMEBREW_SORBET_RUNTIME
fi

unset NO_SORBET_RUNTIME_COMMANDS
fi

# Provide a (temporary, undocumented) way to disable Sorbet globally if needed
# to avoid reverting the above.
if [[ -n "${HOMEBREW_NO_SORBET_RUNTIME}" ]]
Expand All @@ -957,6 +936,12 @@ EOS
export HOMEBREW_DEV_CMD_RUN="1"
fi

if [[ -n "${HOMEBREW_DEVELOPER}" || -n "${HOMEBREW_DEV_CMD_RUN}" ]]
then
# Always run with Sorbet for Homebrew developers or when a Homebrew developer command has been run.
export HOMEBREW_SORBET_RUNTIME="1"
fi

if [[ -f "${HOMEBREW_LIBRARY}/Homebrew/cmd/${HOMEBREW_COMMAND}.sh" ]]
then
HOMEBREW_BASH_COMMAND="${HOMEBREW_LIBRARY}/Homebrew/cmd/${HOMEBREW_COMMAND}.sh"
Expand Down
6 changes: 4 additions & 2 deletions Library/Homebrew/dependency_collector.rb
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,10 @@ def self.tar_needs_xz_dependency?
sig { void }
def init_global_dep_tree_if_needed!; end

sig {
params(spec: T.any(String, Resource, Symbol, Requirement, Dependency, Class),
tags: T::Array[Symbol]).returns(T.any(Dependency, Requirement, NilClass))
}
def parse_spec(spec, tags)
raise ArgumentError, "Implicit dependencies cannot be manually specified" if tags.include?(:implicit)

Expand All @@ -140,8 +144,6 @@ def parse_spec(spec, tags)
spec
when Class
parse_class_spec(spec, tags)
else
raise TypeError, "Unsupported type #{spec.class.name} for #{spec.inspect}"
end
end

Expand Down
5 changes: 1 addition & 4 deletions Library/Homebrew/resource.rb
Original file line number Diff line number Diff line change
Expand Up @@ -194,14 +194,11 @@ def url(val = nil, **specs)
def version(val = nil)
return super() if val.nil?

@version = case T.unsafe(val)
@version = case val
when String
val.blank? ? Version::NULL : Version.new(val)
when Version
val
else
# TODO: This can probably go if/when typechecking is enforced in taps.
raise TypeError, "version '#{val.inspect}' should be a string"
end
end

Expand Down
72 changes: 18 additions & 54 deletions Library/Homebrew/service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -80,75 +80,63 @@ def run(command = nil, macos: nil, linux: nil)
end

command ||= on_system_conditional(macos: macos, linux: linux)
case T.unsafe(command)
case command
when nil
@run
when String, Pathname
@run = [command]
when Array
@run = command
else
raise TypeError, "Service#run expects an Array"
end
end

sig { params(path: T.nilable(T.any(String, Pathname))).returns(T.nilable(String)) }
def working_dir(path = nil)
case T.unsafe(path)
case path
when nil
@working_dir
when String, Pathname
@working_dir = path.to_s
else
raise TypeError, "Service#working_dir expects a String"
end
end

sig { params(path: T.nilable(T.any(String, Pathname))).returns(T.nilable(String)) }
def root_dir(path = nil)
case T.unsafe(path)
case path
when nil
@root_dir
when String, Pathname
@root_dir = path.to_s
else
raise TypeError, "Service#root_dir expects a String or Pathname"
end
end

sig { params(path: T.nilable(T.any(String, Pathname))).returns(T.nilable(String)) }
def input_path(path = nil)
case T.unsafe(path)
case path
when nil
@input_path
when String, Pathname
@input_path = path.to_s
else
raise TypeError, "Service#input_path expects a String or Pathname"
end
end

sig { params(path: T.nilable(T.any(String, Pathname))).returns(T.nilable(String)) }
def log_path(path = nil)
case T.unsafe(path)
case path
when nil
@log_path
when String, Pathname
@log_path = path.to_s
else
raise TypeError, "Service#log_path expects a String"
end
end

sig { params(path: T.nilable(T.any(String, Pathname))).returns(T.nilable(String)) }
def error_log_path(path = nil)
case T.unsafe(path)
case path
when nil
@error_log_path
when String, Pathname
@error_log_path = path.to_s
else
raise TypeError, "Service#error_log_path expects a String"
end
end

Expand All @@ -157,7 +145,7 @@ def error_log_path(path = nil)
.returns(T.nilable(T::Hash[Symbol, T.untyped]))
}
def keep_alive(value = nil)
case T.unsafe(value)
case value
when nil
@keep_alive
when true, false
Expand All @@ -169,20 +157,16 @@ def keep_alive(value = nil)
end

@keep_alive = value
else
raise TypeError, "Service#keep_alive expects a Boolean or Hash"
end
end

sig { params(value: T.nilable(T::Boolean)).returns(T.nilable(T::Boolean)) }
def require_root(value = nil)
case T.unsafe(value)
case value
when nil
@require_root
when true, false
@require_root = value
else
raise TypeError, "Service#require_root expects a Boolean"
end
end

Expand All @@ -195,19 +179,17 @@ def requires_root?

sig { params(value: T.nilable(T::Boolean)).returns(T.nilable(T::Boolean)) }
def run_at_load(value = nil)
case T.unsafe(value)
case value
when nil
@run_at_load
when true, false
@run_at_load = value
else
raise TypeError, "Service#run_at_load expects a Boolean"
end
end

sig { params(value: T.nilable(String)).returns(T.nilable(T::Hash[Symbol, String])) }
def sockets(value = nil)
case T.unsafe(value)
case value
when nil
@sockets
when String
Expand All @@ -216,8 +198,6 @@ def sockets(value = nil)

type, host, port = match.captures
@sockets = { host: host, port: port, type: type }
else
raise TypeError, "Service#sockets expects a String"
end
end

Expand All @@ -230,31 +210,27 @@ def keep_alive?

sig { params(value: T.nilable(T::Boolean)).returns(T.nilable(T::Boolean)) }
def launch_only_once(value = nil)
case T.unsafe(value)
case value
when nil
@launch_only_once
when true, false
@launch_only_once = value
else
raise TypeError, "Service#launch_only_once expects a Boolean"
end
end

sig { params(value: T.nilable(Integer)).returns(T.nilable(Integer)) }
def restart_delay(value = nil)
case T.unsafe(value)
case value
when nil
@restart_delay
when Integer
@restart_delay = value
else
raise TypeError, "Service#restart_delay expects an Integer"
end
end

sig { params(value: T.nilable(Symbol)).returns(T.nilable(Symbol)) }
def process_type(value = nil)
case T.unsafe(value)
case value
when nil
@process_type
when :background, :standard, :interactive, :adaptive
Expand All @@ -263,46 +239,38 @@ def process_type(value = nil)
raise TypeError, "Service#process_type allows: " \
"'#{PROCESS_TYPE_BACKGROUND}'/'#{PROCESS_TYPE_STANDARD}'/" \
"'#{PROCESS_TYPE_INTERACTIVE}'/'#{PROCESS_TYPE_ADAPTIVE}'"
else
raise TypeError, "Service#process_type expects a Symbol"
end
end

sig { params(value: T.nilable(Symbol)).returns(T.nilable(Symbol)) }
def run_type(value = nil)
case T.unsafe(value)
case value
when nil
@run_type
when :immediate, :interval, :cron
@run_type = value
when Symbol
raise TypeError, "Service#run_type allows: '#{RUN_TYPE_IMMEDIATE}'/'#{RUN_TYPE_INTERVAL}'/'#{RUN_TYPE_CRON}'"
else
raise TypeError, "Service#run_type expects a Symbol"
end
end

sig { params(value: T.nilable(Integer)).returns(T.nilable(Integer)) }
def interval(value = nil)
case T.unsafe(value)
case value
when nil
@interval
when Integer
@interval = value
else
raise TypeError, "Service#interval expects an Integer"
end
end

sig { params(value: T.nilable(String)).returns(T.nilable(Hash)) }
def cron(value = nil)
case T.unsafe(value)
case value
when nil
@cron
when String
@cron = parse_cron(T.must(value))
else
raise TypeError, "Service#cron expects a String"
end
end

Expand Down Expand Up @@ -354,23 +322,19 @@ def parse_cron(cron_statement)

sig { params(variables: T::Hash[Symbol, String]).returns(T.nilable(T::Hash[Symbol, String])) }
def environment_variables(variables = {})
case T.unsafe(variables)
case variables
when Hash
@environment_variables = variables.transform_values(&:to_s)
else
raise TypeError, "Service#environment_variables expects a hash"
end
end

sig { params(value: T.nilable(T::Boolean)).returns(T.nilable(T::Boolean)) }
def macos_legacy_timers(value = nil)
case T.unsafe(value)
case value
when nil
@macos_legacy_timers
when true, false
@macos_legacy_timers = value
else
raise TypeError, "Service#macos_legacy_timers expects a Boolean"
end
end

Expand Down
4 changes: 0 additions & 4 deletions Library/Homebrew/version.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,6 @@ class Token

sig { params(val: String).returns(Token) }
def self.create(val)
raise TypeError, "Token value must be a string; got a #{val.class} (#{val})" unless val.respond_to?(:to_str)

case val
when /\A#{AlphaToken::PATTERN}\z/o then AlphaToken
when /\A#{BetaToken::PATTERN}\z/o then BetaToken
Expand Down Expand Up @@ -492,8 +490,6 @@ def self.parse(spec, detected_from_url: false)

sig { params(val: T.any(PkgVersion, String, Version), detected_from_url: T::Boolean).void }
def initialize(val, detected_from_url: false)
raise TypeError, "Version value must be a string; got a #{val.class} (#{val})" unless val.respond_to?(:to_str)

version = val.to_str
raise ArgumentError, "Version must not be empty" if version.blank?

Expand Down

0 comments on commit 8775465

Please sign in to comment.