1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

[ruby/irb] Implement ls command

https://github.com/ruby/irb/commit/19b6c20604
This commit is contained in:
Takashi Kokubun 2021-03-18 00:28:04 -07:00 committed by git
parent d36ac283d1
commit 5f72962a09
4 changed files with 84 additions and 7 deletions

48
lib/irb/cmd/ls.rb Normal file
View file

@ -0,0 +1,48 @@
# frozen_string_literal: true
require_relative "nop"
require_relative "../color"
# :stopdoc:
module IRB
module ExtendCommand
class Ls < Nop
def execute(*arg, grep: nil)
o = Output.new(grep: grep)
obj = arg.empty? ? irb_context.workspace.main : arg.first
locals = arg.empty? ? irb_context.workspace.binding.local_variables : []
klass = (obj.class == Class || obj.class == Module ? obj : obj.class)
o.dump("constants", obj.constants) if obj.respond_to?(:constants)
o.dump("#{klass}.methods", obj.singleton_methods(false))
o.dump("#{klass}#methods", klass.public_instance_methods(false))
o.dump("instance variables", obj.instance_variables)
o.dump("class variables", klass.class_variables)
o.dump("locals", locals)
end
class Output
def initialize(grep: nil)
@grep = grep
end
def dump(name, strs)
strs = strs.grep(@grep) if @grep
strs = strs.sort
return if strs.empty?
print "#{Color.colorize(name, [:BOLD, :BLUE])}: "
if strs.size > 7
len = [strs.map(&:length).max, 16].min
puts; strs.each_slice(7) { |ss| puts " #{ss.map { |s| "%-#{len}s" % s }.join(" ")}" }
else
puts strs.join(" ")
end
end
end
private_constant :Output
end
end
end
# :startdoc:

View file

@ -14,10 +14,16 @@ module IRB
module ExtendCommand
class Nop
def self.execute(conf, *opts, &block)
command = new(conf)
command.execute(*opts, &block)
if RUBY_ENGINE == "ruby" && RUBY_VERSION >= "2.7.0"
def self.execute(conf, *opts, **kwargs, &block)
command = new(conf)
command.execute(*opts, **kwargs, &block)
end
else
def self.execute(conf, *opts, &block)
command = new(conf)
command.execute(*opts, &block)
end
end
def initialize(conf)

View file

@ -125,6 +125,11 @@ module IRB # :nodoc:
:irb_info, :Info, "irb/cmd/info"
],
[
:irb_ls, :Ls, "irb/cmd/ls",
[:ls, NO_OVERRIDE],
],
[
:irb_measure, :Measure, "irb/cmd/measure",
[:measure, NO_OVERRIDE],
@ -169,12 +174,13 @@ module IRB # :nodoc:
end
if load_file
kwargs = ", **kwargs" if RUBY_ENGINE == "ruby" && RUBY_VERSION >= "2.7.0"
line = __LINE__; eval %[
def #{cmd_name}(*opts, &b)
def #{cmd_name}(*opts#{kwargs}, &b)
require "#{load_file}"
arity = ExtendCommand::#{cmd_class}.instance_method(:execute).arity
args = (1..(arity < 0 ? ~arity : arity)).map {|i| "arg" + i.to_s }
args << "*opts" if arity < 0
args << "*opts#{kwargs}" if arity < 0
args << "&block"
args = args.join(", ")
line = __LINE__; eval %[
@ -185,7 +191,7 @@ module IRB # :nodoc:
end
end
], nil, __FILE__, line
__send__ :#{cmd_name}_, *opts, &b
__send__ :#{cmd_name}_, *opts#{kwargs}, &b
end
], nil, __FILE__, line
else

View file

@ -374,5 +374,22 @@ module TestIRB
/=> "bug17564"\n/,
], out)
end
def test_ls
IRB.init_config(nil)
workspace = IRB::WorkSpace.new(self)
irb = IRB::Irb.new(workspace)
IRB.conf[:MAIN_CONTEXT] = irb.context
input = TestInputMethod.new([
"ls Object.new.tap { |o| o.instance_variable_set(:@a, 1) }\n",
])
irb = IRB::Irb.new(IRB::WorkSpace.new(Object.new), input)
irb.context.return_format = "=> %s\n"
out, err = capture_output do
irb.eval_input
end
assert_empty err
assert_match(/^instance variables: @a\n/, out)
end
end
end