Update Command API

This commit is contained in:
Douglas Eichelberger 2024-03-18 15:50:50 -07:00
parent 91d670c3fa
commit cae62e0175
3 changed files with 32 additions and 18 deletions

View File

@ -16,9 +16,6 @@ module Homebrew
abstract!
class << self
sig { returns(T.nilable(CLI::Parser)) }
attr_reader :parser
sig { returns(String) }
def command_name = T.must(name).split("::").fetch(-1).downcase
@ -26,11 +23,14 @@ module Homebrew
sig { params(name: String).returns(T.nilable(T.class_of(AbstractCommand))) }
def command(name) = subclasses.find { _1.command_name == name }
sig { returns(CLI::Parser) }
def parser = CLI::Parser.new(self, &@parser_block)
private
sig { params(block: T.proc.bind(CLI::Parser).void).void }
def cmd_args(&block)
@parser = T.let(CLI::Parser.new(&block), T.nilable(CLI::Parser))
@parser_block = T.let(block, T.nilable(T.proc.void))
end
end
@ -39,10 +39,7 @@ module Homebrew
sig { params(argv: T::Array[String]).void }
def initialize(argv = ARGV.freeze)
parser = self.class.parser
raise "Commands must include a `cmd_args` block" if parser.nil?
@args = T.let(parser.parse(argv), CLI::Args)
@args = T.let(self.class.parser.parse(argv), CLI::Args)
end
sig { abstract.void }

View File

@ -1,6 +1,7 @@
# typed: true
# frozen_string_literal: true
require "abstract_command"
require "env_config"
require "cask/config"
require "cli/args"
@ -19,9 +20,18 @@ module Homebrew
def self.from_cmd_path(cmd_path)
cmd_args_method_name = Commands.args_method_name(cmd_path)
cmd_name = cmd_args_method_name.to_s.delete_suffix("_args")
begin
Homebrew.send(cmd_args_method_name) if require?(cmd_path)
if require?(cmd_path)
cmd = Homebrew::AbstractCommand.command(cmd_name)
if cmd
cmd.parser
else
# TODO: remove once all commands inherit AbstractCommand
Homebrew.send(cmd_args_method_name)
end
end
rescue NoMethodError => e
raise if e.name.to_sym != cmd_args_method_name
@ -109,8 +119,8 @@ module Homebrew
]
end
sig { params(block: T.nilable(T.proc.bind(Parser).void)).void }
def initialize(&block)
sig { params(cmd: T.nilable(T.class_of(Homebrew::AbstractCommand)), block: T.nilable(T.proc.bind(Parser).void)).void }
def initialize(cmd = nil, &block)
@parser = OptionParser.new
@parser.summary_indent = " " * 2
@ -123,12 +133,18 @@ module Homebrew
@args = Homebrew::CLI::Args.new
# Filter out Sorbet runtime type checking method calls.
cmd_location = T.must(caller_locations).select do |location|
T.must(location.path).exclude?("/gems/sorbet-runtime-")
end.fetch(1)
@command_name = T.must(cmd_location.label).chomp("_args").tr("_", "-")
@is_dev_cmd = T.must(cmd_location.absolute_path).start_with?(Commands::HOMEBREW_DEV_CMD_PATH)
if cmd
@command_name = cmd.command_name
@is_dev_cmd = cmd.name&.start_with?("Homebrew::DevCmd")
else
# FIXME: remove once commands are all subclasses of `AbstractCommand`:
# Filter out Sorbet runtime type checking method calls.
cmd_location = T.must(caller_locations).select do |location|
T.must(location.path).exclude?("/gems/sorbet-runtime-")
end.fetch(1)
@command_name = T.must(cmd_location.label).chomp("_args").tr("_", "-")
@is_dev_cmd = T.must(cmd_location.absolute_path).start_with?(Commands::HOMEBREW_DEV_CMD_PATH)
end
@constraints = []
@conflicts = []

View File

@ -49,7 +49,8 @@ module Tapioca
end
else
root.create_path(Homebrew::CLI::Args) do |klass|
create_args_methods(klass, T.must(T.cast(constant, T.class_of(Homebrew::AbstractCommand)).parser))
parser = T.cast(constant, T.class_of(Homebrew::AbstractCommand)).parser
create_args_methods(klass, parser)
end
end
end