1
0
Fork 0
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:
John Mair 2010-12-26 01:05:48 +13:00
parent 00ec4c84d3
commit 294d46c02a
3 changed files with 46 additions and 91 deletions

View file

@ -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

View file

@ -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

View file

@ -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