Merge pull request #20391 from Homebrew/dug/service-refactor

Simplify Service attr helper methods
This commit is contained in:
Mike McQuaid 2025-08-11 13:36:01 +00:00 committed by GitHub
commit 278271c969
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -23,7 +23,7 @@ module Homebrew
PROCESS_TYPE_ADAPTIVE = :adaptive PROCESS_TYPE_ADAPTIVE = :adaptive
KEEP_ALIVE_KEYS = [:always, :successful_exit, :crashed, :path].freeze KEEP_ALIVE_KEYS = [:always, :successful_exit, :crashed, :path].freeze
SOCKET_STRING_REGEX = %r{^([a-z]+)://(.+):([0-9]+)$}i SOCKET_STRING_REGEX = %r{^(?<type>[a-z]+)://(?<host>.+):(?<port>[0-9]+)$}i
RunParam = T.type_alias { T.nilable(T.any(T::Array[T.any(String, Pathname)], String, Pathname)) } RunParam = T.type_alias { T.nilable(T.any(T::Array[T.any(String, Pathname)], String, Pathname)) }
Sockets = T.type_alias { T::Hash[Symbol, { host: String, port: String, type: String }] } Sockets = T.type_alias { T::Hash[Symbol, { host: String, port: String, type: String }] }
@ -107,61 +107,56 @@ module Homebrew
end end
end end
sig { params(path: T.nilable(T.any(String, Pathname))).returns(T.nilable(String)) } sig { params(path: T.any(String, Pathname)).returns(T.nilable(String)) }
def working_dir(path = nil) def working_dir(path = T.unsafe(nil))
case path if path
when nil
@working_dir
when String, Pathname
@working_dir = path.to_s @working_dir = path.to_s
else
@working_dir
end end
end end
sig { params(path: T.nilable(T.any(String, Pathname))).returns(T.nilable(String)) } sig { params(path: T.any(String, Pathname)).returns(T.nilable(String)) }
def root_dir(path = nil) def root_dir(path = T.unsafe(nil))
case path if path
when nil
@root_dir
when String, Pathname
@root_dir = path.to_s @root_dir = path.to_s
else
@root_dir
end end
end end
sig { params(path: T.nilable(T.any(String, Pathname))).returns(T.nilable(String)) } sig { params(path: T.any(String, Pathname)).returns(T.nilable(String)) }
def input_path(path = nil) def input_path(path = T.unsafe(nil))
case path if path
when nil
@input_path
when String, Pathname
@input_path = path.to_s @input_path = path.to_s
else
@input_path
end end
end end
sig { params(path: T.nilable(T.any(String, Pathname))).returns(T.nilable(String)) } sig { params(path: T.any(String, Pathname)).returns(T.nilable(String)) }
def log_path(path = nil) def log_path(path = T.unsafe(nil))
case path if path
when nil
@log_path
when String, Pathname
@log_path = path.to_s @log_path = path.to_s
else
@log_path
end end
end end
sig { params(path: T.nilable(T.any(String, Pathname))).returns(T.nilable(String)) } sig { params(path: T.any(String, Pathname)).returns(T.nilable(String)) }
def error_log_path(path = nil) def error_log_path(path = T.unsafe(nil))
case path if path
when nil
@error_log_path
when String, Pathname
@error_log_path = path.to_s @error_log_path = path.to_s
else
@error_log_path
end end
end end
sig { sig {
params(value: T.nilable(T.any(T::Boolean, T::Hash[Symbol, T.untyped]))) params(value: T.any(T::Boolean, T::Hash[Symbol, T.untyped]))
.returns(T.nilable(T::Hash[Symbol, T.untyped])) .returns(T.nilable(T::Hash[Symbol, T.untyped]))
} }
def keep_alive(value = nil) def keep_alive(value = T.unsafe(nil))
case value case value
when nil when nil
@keep_alive @keep_alive
@ -176,12 +171,11 @@ module Homebrew
end end
end end
sig { params(value: T.nilable(T::Boolean)).returns(T::Boolean) } sig { params(value: T::Boolean).returns(T::Boolean) }
def require_root(value = nil) def require_root(value = T.unsafe(nil))
case value if value.nil?
when nil
@require_root @require_root
when TrueClass, FalseClass else
@require_root = value @require_root = value
end end
end end
@ -192,43 +186,40 @@ module Homebrew
@require_root.present? && @require_root == true @require_root.present? && @require_root == true
end end
sig { params(value: T.nilable(T::Boolean)).returns(T.nilable(T::Boolean)) } sig { params(value: T::Boolean).returns(T.nilable(T::Boolean)) }
def run_at_load(value = nil) def run_at_load(value = T.unsafe(nil))
case value if value.nil?
when nil
@run_at_load @run_at_load
when TrueClass, FalseClass else
@run_at_load = value @run_at_load = value
end end
end end
sig { sig {
params(value: T.nilable(T.any(String, T::Hash[Symbol, String]))) params(value: T.any(String, T::Hash[Symbol, String]))
.returns(T::Hash[Symbol, T::Hash[Symbol, String]]) .returns(T::Hash[Symbol, T::Hash[Symbol, String]])
} }
def sockets(value = nil) def sockets(value = T.unsafe(nil))
return @sockets if value.nil? return @sockets if value.nil?
@sockets = case value value_hash = case value
when String when String
{ listeners: value } { listeners: value }
when Hash when Hash
value value
end.transform_values do |socket_string| end
@sockets = T.must(value_hash).transform_values do |socket_string|
match = socket_string.match(SOCKET_STRING_REGEX) match = socket_string.match(SOCKET_STRING_REGEX)
raise TypeError, "Service#sockets a formatted socket definition as <type>://<host>:<port>" unless match raise TypeError, "Service#sockets a formatted socket definition as <type>://<host>:<port>" unless match
type = T.must(match[1])
host = T.must(match[2])
port = T.must(match[3])
begin begin
IPAddr.new(host) IPAddr.new(match[:host])
rescue IPAddr::InvalidAddressError rescue IPAddr::InvalidAddressError
raise TypeError, "Service#sockets expects a valid ipv4 or ipv6 host address" raise TypeError, "Service#sockets expects a valid ipv4 or ipv6 host address"
end end
{ host:, port:, type: } { host: match[:host], port: match[:port], type: match[:type] }
end end
end end
@ -238,28 +229,26 @@ module Homebrew
!@keep_alive.empty? && @keep_alive[:always] != false !@keep_alive.empty? && @keep_alive[:always] != false
end end
sig { params(value: T.nilable(T::Boolean)).returns(T::Boolean) } sig { params(value: T::Boolean).returns(T::Boolean) }
def launch_only_once(value = nil) def launch_only_once(value = T.unsafe(nil))
case value if value.nil?
when nil
@launch_only_once @launch_only_once
when TrueClass, FalseClass else
@launch_only_once = value @launch_only_once = value
end end
end end
sig { params(value: T.nilable(Integer)).returns(T.nilable(Integer)) } sig { params(value: Integer).returns(T.nilable(Integer)) }
def restart_delay(value = nil) def restart_delay(value = T.unsafe(nil))
case value if value
when nil
@restart_delay
when Integer
@restart_delay = value @restart_delay = value
else
@restart_delay
end end
end end
sig { params(value: T.nilable(Symbol)).returns(T.nilable(Symbol)) } sig { params(value: Symbol).returns(T.nilable(Symbol)) }
def process_type(value = nil) def process_type(value = T.unsafe(nil))
case value case value
when nil when nil
@process_type @process_type
@ -272,8 +261,8 @@ module Homebrew
end end
end end
sig { params(value: T.nilable(Symbol)).returns(T.nilable(Symbol)) } sig { params(value: Symbol).returns(T.nilable(Symbol)) }
def run_type(value = nil) def run_type(value = T.unsafe(nil))
case value case value
when nil when nil
@run_type @run_type
@ -284,23 +273,21 @@ module Homebrew
end end
end end
sig { params(value: T.nilable(Integer)).returns(T.nilable(Integer)) } sig { params(value: Integer).returns(T.nilable(Integer)) }
def interval(value = nil) def interval(value = T.unsafe(nil))
case value if value
when nil
@interval
when Integer
@interval = value @interval = value
else
@interval
end end
end end
sig { params(value: T.nilable(String)).returns(T::Hash[Symbol, T.any(Integer, String)]) } sig { params(value: String).returns(T::Hash[Symbol, T.any(Integer, String)]) }
def cron(value = nil) def cron(value = T.unsafe(nil))
case value if value
when nil
@cron
when String
@cron = parse_cron(value) @cron = parse_cron(value)
else
@cron
end end
end end
@ -352,18 +339,14 @@ module Homebrew
sig { params(variables: T::Hash[Symbol, String]).returns(T.nilable(T::Hash[Symbol, String])) } sig { params(variables: T::Hash[Symbol, String]).returns(T.nilable(T::Hash[Symbol, String])) }
def environment_variables(variables = {}) def environment_variables(variables = {})
case variables @environment_variables = variables.transform_values(&:to_s)
when Hash
@environment_variables = variables.transform_values(&:to_s)
end
end end
sig { params(value: T.nilable(T::Boolean)).returns(T::Boolean) } sig { params(value: T::Boolean).returns(T::Boolean) }
def macos_legacy_timers(value = nil) def macos_legacy_timers(value = T.unsafe(nil))
case value if value.nil?
when nil
@macos_legacy_timers @macos_legacy_timers
when TrueClass, FalseClass else
@macos_legacy_timers = value @macos_legacy_timers = value
end end
end end