mirror of
https://github.com/pry/pry.git
synced 2022-11-09 12:35:05 -05:00
commands now separated and pluggable as a hash, defined in commands.rb
This commit is contained in:
parent
00ec4c84d3
commit
294d46c02a
3 changed files with 46 additions and 91 deletions
85
lib/pry.rb
85
lib/pry.rb
|
@ -7,6 +7,7 @@ require "method_source"
|
|||
require "#{direc}/pry/version"
|
||||
require "#{direc}/pry/input"
|
||||
require "#{direc}/pry/output"
|
||||
require "#{direc}/pry/commands"
|
||||
|
||||
class Pry
|
||||
def self.start(target=TOPLEVEL_BINDING, options={})
|
||||
|
@ -30,6 +31,7 @@ class Pry
|
|||
def self.reset_defaults
|
||||
self.input = Input.new
|
||||
self.output = Output.new
|
||||
self.commands = Commands.new(self.output)
|
||||
|
||||
self.default_prompt = proc do |v, nest|
|
||||
if nest == 0
|
||||
|
@ -54,6 +56,7 @@ class Pry
|
|||
attr_accessor :last_result
|
||||
attr_accessor :default_prompt, :wait_prompt
|
||||
attr_accessor :input, :output
|
||||
attr_accessor :commands
|
||||
end
|
||||
|
||||
self.reset_defaults
|
||||
|
@ -66,6 +69,7 @@ class Pry
|
|||
|
||||
attr_accessor :input, :output
|
||||
attr_accessor :default_prompt, :wait_prompt
|
||||
attr_accessor :commands
|
||||
attr_reader :last_result
|
||||
|
||||
def initialize(input = Pry.input, output = Pry.output)
|
||||
|
@ -74,6 +78,7 @@ class Pry
|
|||
|
||||
@default_prompt = Pry.default_prompt
|
||||
@wait_prompt = Pry.wait_prompt
|
||||
@commands = Commands.new(output)
|
||||
end
|
||||
|
||||
def nesting
|
||||
|
@ -145,75 +150,19 @@ class Pry
|
|||
|
||||
def process_commands(val, eval_string, target)
|
||||
def eval_string.clear() replace("") end
|
||||
|
||||
case val
|
||||
when "exit_program", "quit_program"
|
||||
output.exit_program
|
||||
exit
|
||||
when "!"
|
||||
output.refresh
|
||||
eval_string.clear
|
||||
when "help"
|
||||
output.show_help
|
||||
eval_string.clear
|
||||
when "nesting"
|
||||
output.show_nesting(nesting)
|
||||
eval_string.clear
|
||||
when "status"
|
||||
output.show_status(nesting, target)
|
||||
eval_string.clear
|
||||
when "exit_all"
|
||||
throw(:breakout, 0)
|
||||
when "exit", "quit", "back", /^cd\s*\.\./
|
||||
output.exit
|
||||
throw(:breakout, nesting.level)
|
||||
when "ls"
|
||||
output.ls(target)
|
||||
eval_string.clear
|
||||
when /^cat\s+(.+)/
|
||||
var = $~.captures.first
|
||||
output.cat(target, var)
|
||||
eval_string.clear
|
||||
when /^cd\s+(.+)/
|
||||
obj = $~.captures.first
|
||||
output.cd(obj)
|
||||
target.eval("#{obj}.pry")
|
||||
eval_string.clear
|
||||
when /^show_doc\s*(.+)/
|
||||
meth_name = ($~.captures).first
|
||||
doc = target.eval("method(:#{meth_name})").comment
|
||||
output.show_doc doc
|
||||
eval_string.clear
|
||||
when /^show_idoc\s*(.+)/
|
||||
meth_name = ($~.captures).first
|
||||
doc = target.eval("instance_method(:#{meth_name})").comment
|
||||
output.show_doc doc
|
||||
eval_string.clear
|
||||
when /^show_method\s*(.+)/
|
||||
meth_name = ($~.captures).first
|
||||
code = target.eval("method(:#{meth_name})").source
|
||||
output.show_method code
|
||||
eval_string.clear
|
||||
when /^show_instance_method\s*(.+)/, /^show_imethod\s*(.+)/
|
||||
meth_name = ($~.captures).first
|
||||
code = target.eval("instance_method(:#{meth_name})").source
|
||||
output.show_method code
|
||||
eval_string.clear
|
||||
when /^jump_to\s*(\d*)/
|
||||
break_level = ($~.captures).first.to_i
|
||||
output.jump_to(break_level)
|
||||
|
||||
case break_level
|
||||
when nesting.level
|
||||
output.warn_already_at_level(nesting.level)
|
||||
eval_string.clear
|
||||
when (0...nesting.level)
|
||||
throw(:breakout, break_level + 1)
|
||||
else
|
||||
output.err_invalid_nest_level(break_level,
|
||||
nesting.level - 1)
|
||||
eval_string.clear
|
||||
end
|
||||
if action = commands.commands.find { |k, v| Array(k).any? { |a| a === val } }
|
||||
|
||||
options = {
|
||||
:captures => $~ ? $~.captures : nil,
|
||||
:eval_string => eval_string,
|
||||
:target => target,
|
||||
:val => val,
|
||||
:nesting => nesting,
|
||||
:output => output
|
||||
}
|
||||
|
||||
action.last.call(options)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -1,50 +1,55 @@
|
|||
class Pry
|
||||
class Commands
|
||||
def initialize(val, eval_string, target, output)
|
||||
attr_reader :commands, :output
|
||||
|
||||
def initialize(out)
|
||||
@output = out
|
||||
|
||||
@commands = {
|
||||
"exit_program" => proc { output.exit_program; exit },
|
||||
"!" => proc { |opts| output.refresh; opts[:eval_string].clear },
|
||||
"help" => proc { |opts| output.show_help; opts[:eval_string].clear },
|
||||
"nesting" => proc { |opts| output.show_nesting(opts[:nesting]); opts[:eval_string].clear },
|
||||
["exit_program", "quit_program"] => proc { opts[:output].exit_program; exit },
|
||||
"!" => proc { |opts| opts[:output].refresh; opts[:eval_string].clear },
|
||||
"help" => proc { |opts| opts[:output].show_help; opts[:eval_string].clear },
|
||||
"nesting" => proc { |opts| opts[:output].show_nesting(opts[:nesting]); opts[:eval_string].clear },
|
||||
"status" => proc do |opts|
|
||||
output.show_status(opts[:nesting], opts[:target])
|
||||
eval_string.clear
|
||||
opts[:output].show_status(opts[:nesting], opts[:target])
|
||||
opts[:eval_string].clear
|
||||
end,
|
||||
"exit_all" => proc { throw(:breakout, 0) },
|
||||
"exit" => proc do
|
||||
["exit", "quit", "back", "cd .."] => proc do |opts|
|
||||
output.exit
|
||||
throw(:breakout, opts[:nesting].level)
|
||||
end,
|
||||
"ls" => proc do |opts|
|
||||
output.ls(opts[:target])
|
||||
opts[:output].ls(opts[:target])
|
||||
opts[:eval_string].clear
|
||||
end,
|
||||
/^cat\s+(.+)/ => proc do |opts|
|
||||
obj = opts[:captures].first
|
||||
output.cat(opts[:target], obj)
|
||||
opts[:output].cat(opts[:target], obj)
|
||||
opts[:eval_string].clear
|
||||
end,
|
||||
/^cd\s+(.+)/ => proc do |opts|
|
||||
obj = opts[:captures].first
|
||||
opts[:target].eval("#{obj}.pry")
|
||||
opts[:output].cd obj
|
||||
opts[:eval_string].clear
|
||||
end,
|
||||
/^show_doc\s*(.+)/ => proc do |opts|
|
||||
meth_name = opts[:captures].first
|
||||
doc = opts[:target].eval("method(:#{meth_name})").comment
|
||||
output.show_doc doc
|
||||
opts[:output].show_doc doc
|
||||
opts[:eval_string].clear
|
||||
end,
|
||||
/^show_idoc\s*(.+)/ => proc do |opts|
|
||||
meth_name = opts[:captures].first
|
||||
doc = opts[:target].eval("instance_method(:#{meth_name})").comment
|
||||
output.show_doc doc
|
||||
opts[:output].show_doc doc
|
||||
opts[:eval_string].clear
|
||||
end,
|
||||
/^show_method\s*(.+)/ => proc do |opts|
|
||||
meth_name = opts[:captures].first
|
||||
code = opts[:target].eval("method(:#{meth_name})").source
|
||||
output.show_method code
|
||||
opts[:output].show_method code
|
||||
opts[:eval_string].clear
|
||||
end,
|
||||
/^show_imethod\s*(.+)/ => proc do |opts|
|
||||
|
@ -55,26 +60,22 @@ class Pry
|
|||
end,
|
||||
/^jump_to\s*(\d*)/ => proc do |opts|
|
||||
break_level = opts[:captures].first.to_i
|
||||
output.jump_to(break_level)
|
||||
opts[:output].jump_to(break_level)
|
||||
nesting = opts[:nesting]
|
||||
|
||||
case break_level
|
||||
when nesting.level
|
||||
output.warn_already_at_level(nesting.level)
|
||||
opts[:output].warn_already_at_level(nesting.level)
|
||||
opts[:eval_string].clear
|
||||
when (0...nesting.level)
|
||||
throw(:breakout, break_level + 1)
|
||||
else
|
||||
output.err_invalid_nest_level(break_level,
|
||||
nesting.level - 1)
|
||||
opts[:output].err_invalid_nest_level(break_level,
|
||||
nestingn.level - 1)
|
||||
opts[:eval_string].clear
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def process_commands(val, eval_string, target)
|
||||
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -7,6 +7,11 @@ require "#{direc}/test_helper"
|
|||
|
||||
NOT_FOR_RUBY_18 = [/show_doc/, /show_idoc/, /show_method/, /show_imethod/]
|
||||
|
||||
puts "Ruby Version #{RUBY_VERSION}"
|
||||
puts "Testing Pry #{Pry::VERSION}"
|
||||
puts "With method_source version #{MethodSource::VERSION}"
|
||||
puts "--"
|
||||
|
||||
describe Pry do
|
||||
describe "open a Pry session on an object" do
|
||||
describe "rep" do
|
||||
|
@ -124,7 +129,7 @@ describe Pry do
|
|||
end
|
||||
|
||||
eval %{
|
||||
it "should invoke output##{meth} when #{command} command entered" do
|
||||
it "should invoke output##{meth} when #{command} command entered" do
|
||||
input_strings = ["#{command}", "exit"]
|
||||
input = InputTester.new(*input_strings)
|
||||
output = OutputTester.new
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue