Add tests
This commit is contained in:
parent
5888cd8607
commit
68cce23e15
@ -539,7 +539,7 @@ class Homebrew::CLI::Args
|
|||||||
sig { returns(T::Boolean) }
|
sig { returns(T::Boolean) }
|
||||||
def online?; end
|
def online?; end
|
||||||
|
|
||||||
sig { returns(T.nilable(String)) }
|
sig { returns(T.nilable(T::Array[String])) }
|
||||||
def only; end
|
def only; end
|
||||||
|
|
||||||
sig { returns(T.nilable(T::Array[String])) }
|
sig { returns(T.nilable(T::Array[String])) }
|
||||||
|
@ -3,11 +3,6 @@
|
|||||||
|
|
||||||
require_relative "../../../global"
|
require_relative "../../../global"
|
||||||
|
|
||||||
# require all the commands
|
|
||||||
["cmd", "dev-cmd"].each do |dir|
|
|
||||||
Dir[File.join(__dir__, "../../../#{dir}", "*.rb")].each { require(_1) }
|
|
||||||
end
|
|
||||||
|
|
||||||
module Tapioca
|
module Tapioca
|
||||||
module Compilers
|
module Compilers
|
||||||
class Args < Tapioca::Dsl::Compiler
|
class Args < Tapioca::Dsl::Compiler
|
||||||
@ -25,7 +20,13 @@ module Tapioca
|
|||||||
# rubocop:enable Style/MutableConstant
|
# rubocop:enable Style/MutableConstant
|
||||||
|
|
||||||
sig { override.returns(T::Enumerable[T.class_of(Homebrew::CLI::Args)]) }
|
sig { override.returns(T::Enumerable[T.class_of(Homebrew::CLI::Args)]) }
|
||||||
def self.gather_constants = [Homebrew::CLI::Args]
|
def self.gather_constants
|
||||||
|
# require all the commands to ensure the _arg methods are defined
|
||||||
|
["cmd", "dev-cmd"].each do |dir|
|
||||||
|
Dir[File.join(__dir__, "../../../#{dir}", "*.rb")].each { require(_1) }
|
||||||
|
end
|
||||||
|
[Homebrew::CLI::Args]
|
||||||
|
end
|
||||||
|
|
||||||
sig { override.void }
|
sig { override.void }
|
||||||
def decorate
|
def decorate
|
||||||
@ -35,18 +36,29 @@ module Tapioca
|
|||||||
|
|
||||||
parser = Homebrew.method(args_method_name).call
|
parser = Homebrew.method(args_method_name).call
|
||||||
comma_array_methods = comma_arrays(parser)
|
comma_array_methods = comma_arrays(parser)
|
||||||
args = parser.instance_variable_get(:@args)
|
args_table(parser).each do |method_name, value|
|
||||||
args.instance_variable_get(:@table).each do |method_name, value|
|
|
||||||
# some args are used in multiple commands (this is ok as long as they have the same type)
|
# some args are used in multiple commands (this is ok as long as they have the same type)
|
||||||
next if klass.nodes.any? { T.cast(_1, RBI::Method).name == method_name } || value == []
|
next if klass.nodes.any? { T.cast(_1, RBI::Method).name.to_sym == method_name }
|
||||||
|
|
||||||
return_type = get_return_type(method_name, value, comma_array_methods)
|
return_type = get_return_type(method_name, value, comma_array_methods)
|
||||||
klass.create_method(method_name, return_type:)
|
klass.create_method(method_name.to_s, return_type:)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { params(parser: Homebrew::CLI::Parser).returns(T::Hash[Symbol, T.untyped]) }
|
||||||
|
def args_table(parser)
|
||||||
|
# we exclude non-args from the table, such as :named and :remaining
|
||||||
|
parser.instance_variable_get(:@args).instance_variable_get(:@table).except(:named, :remaining)
|
||||||
|
end
|
||||||
|
|
||||||
|
sig { params(parser: Homebrew::CLI::Parser).returns(T::Array[Symbol]) }
|
||||||
|
def comma_arrays(parser)
|
||||||
|
parser.instance_variable_get(:@non_global_processed_options)
|
||||||
|
.filter_map { |k, v| parser.option_to_name(k).to_sym if v == :comma_array }
|
||||||
|
end
|
||||||
|
|
||||||
sig { params(method_name: Symbol, value: T.untyped, comma_array_methods: T::Array[Symbol]).returns(String) }
|
sig { params(method_name: Symbol, value: T.untyped, comma_array_methods: T::Array[Symbol]).returns(String) }
|
||||||
def get_return_type(method_name, value, comma_array_methods)
|
def get_return_type(method_name, value, comma_array_methods)
|
||||||
if comma_array_methods.include?(method_name)
|
if comma_array_methods.include?(method_name)
|
||||||
@ -57,12 +69,6 @@ module Tapioca
|
|||||||
"T.nilable(String)"
|
"T.nilable(String)"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
sig { params(parser: Homebrew::CLI::Parser).returns(T::Array[Symbol]) }
|
|
||||||
def comma_arrays(parser)
|
|
||||||
parser.instance_variable_get(:@non_global_processed_options)
|
|
||||||
.filter_map { |k, v| parser.option_to_name(k).to_sym if v == :comma_array }
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
94
Library/Homebrew/test/sorbet/tapioca/compilers/args_spec.rb
Normal file
94
Library/Homebrew/test/sorbet/tapioca/compilers/args_spec.rb
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
# require 'tapioca'
|
||||||
|
require "tapioca/dsl"
|
||||||
|
require_relative "../../../../sorbet/tapioca/compilers/args"
|
||||||
|
|
||||||
|
RSpec.describe Tapioca::Compilers::Args do
|
||||||
|
let(:compiler) { described_class.new(Tapioca::Dsl::Pipeline.new(requested_constants: []), RBI::Tree.new, Homebrew) }
|
||||||
|
let(:list_parser) do
|
||||||
|
require "cmd/list"
|
||||||
|
Homebrew.list_args
|
||||||
|
end
|
||||||
|
# good testing candidate, bc it has multiple for each of switch, flag, and comma_array args:
|
||||||
|
let(:update_python_resources_parser) do
|
||||||
|
require "dev-cmd/update-python-resources"
|
||||||
|
Homebrew.update_python_resources_args
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#args_table" do
|
||||||
|
it "returns a mapping of list args to default values" do
|
||||||
|
expect(compiler.args_table(list_parser)).to eq({
|
||||||
|
"1?": false,
|
||||||
|
cask?: false,
|
||||||
|
casks?: false,
|
||||||
|
d?: false,
|
||||||
|
debug?: false,
|
||||||
|
formula?: false,
|
||||||
|
formulae?: false,
|
||||||
|
full_name?: false,
|
||||||
|
h?: false,
|
||||||
|
help?: false,
|
||||||
|
l?: false,
|
||||||
|
multiple?: false,
|
||||||
|
pinned?: false,
|
||||||
|
q?: false,
|
||||||
|
quiet?: false,
|
||||||
|
r?: false,
|
||||||
|
t?: false,
|
||||||
|
v?: false,
|
||||||
|
verbose?: false,
|
||||||
|
versions?: false,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
it "rreturns a mapping of update-python-resources args to default values" do
|
||||||
|
expect(compiler.args_table(update_python_resources_parser)).to eq({
|
||||||
|
d?: false,
|
||||||
|
debug?: false,
|
||||||
|
exclude_packages: nil,
|
||||||
|
extra_packages: nil,
|
||||||
|
h?: false,
|
||||||
|
help?: false,
|
||||||
|
ignore_non_pypi_packages?: false,
|
||||||
|
install_dependencies?: false,
|
||||||
|
p?: false,
|
||||||
|
package_name: nil,
|
||||||
|
print_only?: false,
|
||||||
|
q?: false,
|
||||||
|
quiet?: false,
|
||||||
|
s?: false,
|
||||||
|
silent?: false,
|
||||||
|
v?: false,
|
||||||
|
verbose?: false,
|
||||||
|
version: nil,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#comma_arrays" do
|
||||||
|
it "returns an empty list when there are no comma_array args" do
|
||||||
|
expect(compiler.comma_arrays(list_parser)).to eq([])
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns the comma_array args when they exist" do
|
||||||
|
expect(compiler.comma_arrays(update_python_resources_parser)).to eq([:extra_packages, :exclude_packages])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#get_return_type" do
|
||||||
|
let(:comma_arrays) { compiler.comma_arrays(update_python_resources_parser) }
|
||||||
|
|
||||||
|
it "returns the correct type for switches" do
|
||||||
|
expect(compiler.get_return_type(:silent?, false, comma_arrays)).to eq("T::Boolean")
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns the correct type for flags" do
|
||||||
|
expect(compiler.get_return_type(:package_name, nil, comma_arrays)).to eq("T.nilable(String)")
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns the correct type for comma_arrays" do
|
||||||
|
expect(compiler.get_return_type(:extra_packages, nil, comma_arrays)).to eq("T.nilable(T::Array[String])")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
x
Reference in New Issue
Block a user