[ruby/irb] Implement ls command
https://github.com/ruby/irb/commit/19b6c20604
This commit is contained in:
parent
d36ac283d1
commit
5f72962a09
48
lib/irb/cmd/ls.rb
Normal file
48
lib/irb/cmd/ls.rb
Normal 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:
|
@ -14,11 +14,17 @@ module IRB
|
|||||||
module ExtendCommand
|
module ExtendCommand
|
||||||
class Nop
|
class Nop
|
||||||
|
|
||||||
|
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)
|
def self.execute(conf, *opts, &block)
|
||||||
command = new(conf)
|
command = new(conf)
|
||||||
command.execute(*opts, &block)
|
command.execute(*opts, &block)
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def initialize(conf)
|
def initialize(conf)
|
||||||
@irb_context = conf
|
@irb_context = conf
|
||||||
|
@ -125,6 +125,11 @@ module IRB # :nodoc:
|
|||||||
:irb_info, :Info, "irb/cmd/info"
|
:irb_info, :Info, "irb/cmd/info"
|
||||||
],
|
],
|
||||||
|
|
||||||
|
[
|
||||||
|
:irb_ls, :Ls, "irb/cmd/ls",
|
||||||
|
[:ls, NO_OVERRIDE],
|
||||||
|
],
|
||||||
|
|
||||||
[
|
[
|
||||||
:irb_measure, :Measure, "irb/cmd/measure",
|
:irb_measure, :Measure, "irb/cmd/measure",
|
||||||
[:measure, NO_OVERRIDE],
|
[:measure, NO_OVERRIDE],
|
||||||
@ -169,12 +174,13 @@ module IRB # :nodoc:
|
|||||||
end
|
end
|
||||||
|
|
||||||
if load_file
|
if load_file
|
||||||
|
kwargs = ", **kwargs" if RUBY_ENGINE == "ruby" && RUBY_VERSION >= "2.7.0"
|
||||||
line = __LINE__; eval %[
|
line = __LINE__; eval %[
|
||||||
def #{cmd_name}(*opts, &b)
|
def #{cmd_name}(*opts#{kwargs}, &b)
|
||||||
require "#{load_file}"
|
require "#{load_file}"
|
||||||
arity = ExtendCommand::#{cmd_class}.instance_method(:execute).arity
|
arity = ExtendCommand::#{cmd_class}.instance_method(:execute).arity
|
||||||
args = (1..(arity < 0 ? ~arity : arity)).map {|i| "arg" + i.to_s }
|
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 << "&block"
|
||||||
args = args.join(", ")
|
args = args.join(", ")
|
||||||
line = __LINE__; eval %[
|
line = __LINE__; eval %[
|
||||||
@ -185,7 +191,7 @@ module IRB # :nodoc:
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
], nil, __FILE__, line
|
], nil, __FILE__, line
|
||||||
__send__ :#{cmd_name}_, *opts, &b
|
__send__ :#{cmd_name}_, *opts#{kwargs}, &b
|
||||||
end
|
end
|
||||||
], nil, __FILE__, line
|
], nil, __FILE__, line
|
||||||
else
|
else
|
||||||
|
@ -374,5 +374,22 @@ module TestIRB
|
|||||||
/=> "bug17564"\n/,
|
/=> "bug17564"\n/,
|
||||||
], out)
|
], out)
|
||||||
end
|
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
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user