Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion exe/rbs
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@ $LOAD_PATH << File.join(__dir__, "../lib")
require "rbs"
require "rbs/cli"

RBS::CLI.new(stdout: STDOUT, stderr: STDERR).run(ARGV.dup)
exit RBS::CLI.new(stdout: STDOUT, stderr: STDERR).run(ARGV.dup)
69 changes: 51 additions & 18 deletions lib/rbs/cli.rb
Original file line number Diff line number Diff line change
Expand Up @@ -136,10 +136,12 @@ def run(args)
case command
when :version
stdout.puts opts.ver
0
when *COMMANDS
__send__ :"run_#{command}", args, options
else
stdout.puts opts.help
0
end
end

Expand Down Expand Up @@ -191,6 +193,8 @@ def run_ast(args, options)

stdout.print JSON.generate(decls)
stdout.flush

0
end

def run_list(args, options)
Expand Down Expand Up @@ -254,6 +258,8 @@ def run_list(args, options)
stdout.puts "#{name} (interface)"
end
end

0
end

def run_ancestors(args, options)
Expand All @@ -279,7 +285,7 @@ def run_ancestors(args, options)

unless args.size == 1
stdout.puts "Expected one argument."
return
return 1
end

loader = options.loader()
Expand Down Expand Up @@ -317,6 +323,8 @@ def run_ancestors(args, options)
else
stdout.puts "Cannot find class: #{type_name}"
end

0
end

def run_methods(args, options)
Expand Down Expand Up @@ -344,7 +352,7 @@ def run_methods(args, options)

unless args.size == 1
stdout.puts "Expected one argument."
return
return 1
end

loader = options.loader()
Expand Down Expand Up @@ -373,6 +381,8 @@ def run_methods(args, options)
else
stdout.puts "Cannot find class: #{type_name}"
end

0
end

def run_method(args, options)
Expand All @@ -398,7 +408,7 @@ def run_method(args, options)

unless args.size == 2
stdout.puts "Expected two arguments, but given #{args.size}."
return
return 1
end

loader = options.loader()
Expand All @@ -410,7 +420,7 @@ def run_method(args, options)

unless env.module_name?(type_name)
stdout.puts "Cannot find class: #{type_name}"
return
return 1
end

definition = case kind
Expand All @@ -426,7 +436,7 @@ def run_method(args, options)

unless method
stdout.puts "Cannot find method: #{method_name}"
return
return 1
end

stdout.puts "#{type_name}#{kind == :instance ? "#" : "."}#{method_name}"
Expand All @@ -440,6 +450,8 @@ def run_method(args, options)
stdout.puts format(" %s %-#{length_max}s at %s", separator, type, type.location)
separator = "|"
end

0
end

def run_validate(args, options)
Expand Down Expand Up @@ -469,7 +481,7 @@ def run_constant(args, options)

unless args.size == 1
stdout.puts "Expected one argument."
return
return 1
end

loader = options.loader()
Expand Down Expand Up @@ -502,6 +514,8 @@ def run_constant(args, options)
else
stdout.puts " => [no constant]"
end

0
end

def run_paths(args, options)
Expand Down Expand Up @@ -544,6 +558,8 @@ def run_paths(args, options)
stdout.puts "#{dir} (#{kind_of[dir]}, library, name=#{source.name})"
end
end

0
end

def run_prototype(args, options)
Expand Down Expand Up @@ -647,6 +663,8 @@ def autoload(name, path)

writer = Writer.new(out: stdout)
writer.write decls

0
else
stdout.puts <<EOU
Usage: rbs prototype [generator...] [args...]
Expand All @@ -660,7 +678,7 @@ def autoload(name, path)
$ rbs prototype rbi foo.rbi
$ rbs prototype runtime String
EOU
exit 1
1
end
end

Expand Down Expand Up @@ -712,12 +730,12 @@ def run_prototype_file(format, args)

unless has_parser?
stdout.puts "Not supported on this interpreter (#{RUBY_ENGINE})."
exit 1
return 1
end

if args.empty?
stdout.puts opts
return nil
return 1
end

new_parser = -> do
Expand Down Expand Up @@ -827,6 +845,8 @@ def run_prototype_file(format, args)
writer = Writer.new(out: stdout)
writer.write parser.decls
end

0
end

def run_vendor(args, options)
Expand Down Expand Up @@ -880,6 +900,8 @@ def run_vendor(args, options)

stdout.puts " Copying RBS files..."
vendorer.copy!

0
end

def run_parse(args, options)
Expand Down Expand Up @@ -927,7 +949,11 @@ def run_parse(args, options)
syntax_error = true
end

exit 1 if syntax_error
if syntax_error
1
else
0
end
end

def run_annotate(args, options)
Expand Down Expand Up @@ -975,6 +1001,8 @@ def run_annotate(args, options)
annotator.annotate_file(path, preserve: preserve)
end
end

0
end

def test_opt options
Expand Down Expand Up @@ -1028,7 +1056,7 @@ def run_test(args, options)

if args.length.zero?
stdout.puts opts.help
exit 1
return 1
end

# @type var env_hash: Hash[String, String?]
Expand All @@ -1044,11 +1072,12 @@ def run_test(args, options)

# @type var out: String
# @type var err: String
# @type var status: Process::Status
out, err, status = __skip__ = Open3.capture3(env_hash, *args)
stdout.print(out)
stderr.print(err)

status
status.to_i
end

def run_collection(args, options)
Expand All @@ -1073,7 +1102,7 @@ def run_collection(args, options)
when 'init'
if config_path.exist?
puts "#{config_path} already exists"
exit 1
return 1
end

config_path.write(<<~'YAML')
Expand Down Expand Up @@ -1101,15 +1130,17 @@ def run_collection(args, options)
when 'clean'
unless lock_path.exist?
puts "#{lock_path} should exist to clean"
exit 1
return 1
end
Collection::Cleaner.new(lockfile_path: lock_path)
when 'help', 'hel', 'he', 'h'
puts opts.help
else
puts opts.help
exit 1
return 1
end

0
end

def collection_options(args)
Expand Down Expand Up @@ -1171,7 +1202,7 @@ def run_subtract(args, _)
*minuend_paths, subtrahend_path = args
unless subtrahend_path
stdout.puts opts.help
exit 1
return 1
end
subtrahend_paths << subtrahend_path
else
Expand All @@ -1180,7 +1211,7 @@ def run_subtract(args, _)

if minuend_paths.empty?
stdout.puts opts.help
exit 1
return 1
end

subtrahend = Environment.new.tap do |env|
Expand Down Expand Up @@ -1213,10 +1244,12 @@ def run_subtract(args, _)
end
end
end

0
end

def run_diff(argv, library_options)
Diff.new(argv: argv, library_options: library_options, stdout: stdout, stderr: stderr).run
Diff.new(stdout: stdout, stderr: stderr).run(argv: argv, library_options: library_options)
end
end
end
31 changes: 16 additions & 15 deletions lib/rbs/cli/diff.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,14 @@
module RBS
class CLI
class Diff
def initialize(argv:, library_options:, stdout: $stdout, stderr: $stderr)
@format = nil
def initialize(stdout: $stdout, stderr: $stderr)
@stdout = stdout
@stderr = stderr
end

# @type var type_name: String?
type_name = nil
def run(argv:, library_options:)
format = nil #: String?
type_name = nil #: String?
library_options = library_options
before_path = [] #: Array[String]
after_path = [] #: Array[String]
Expand All @@ -32,47 +33,47 @@ def initialize(argv:, library_options:, stdout: $stdout, stderr: $stderr)
# Confirmation of methods related to Time class added by including stdlib/time
$ rbs diff --format diff --type-name Time --after stdlib/time
HELP
o.on("--format NAME") { |arg| @format = arg }
o.on("--format NAME") { |arg| format = arg }
o.on("--type-name NAME") { |arg| type_name = arg }
o.on("--before DIR") { |arg| before_path << arg }
o.on("--after DIR") { |arg| after_path << arg }
o.on("--[no-]detail") { |arg| detail = arg }
end
opt.parse!(argv)

unless @format && type_name && ["markdown", "diff"].include?(@format)
unless format && type_name && ["markdown", "diff"].include?(format)
@stderr.puts opt.banner
exit 1
return 1
end

@diff = RBS::Diff.new(
diff = RBS::Diff.new(
type_name: TypeName.parse(type_name).absolute!,
library_options: library_options,
after_path: after_path,
before_path: before_path,
detail: detail,
)
end

def run
public_send("run_#{@format}")
public_send("run_#{format}", diff)

0
end

def run_diff
def run_diff(diff)
first = true
io = RBS::CLI::ColoredIO.new(stdout: @stdout)
@diff.each_diff do |before, after|
diff.each_diff do |before, after|
io.puts if !first
io.puts_red "- #{before}"
io.puts_green "+ #{after}"
first = false
end
end

def run_markdown
def run_markdown(diff)
@stdout.puts "| before | after |"
@stdout.puts "| --- | --- |"
@diff.each_diff do |before, after|
diff.each_diff do |before, after|
before.gsub!("|", "\\|")
after.gsub!("|", "\\|")
@stdout.puts "| `#{before}` | `#{after}` |"
Expand Down
Loading