mirror of
https://github.com/pry/pry.git
synced 2022-11-09 12:35:05 -05:00
Save before major refactor to split up Pry into pry_class and pry_instance
This commit is contained in:
parent
294d46c02a
commit
f11806d2da
3 changed files with 112 additions and 128 deletions
78
lib/pry.rb
78
lib/pry.rb
|
@ -8,15 +8,21 @@ require "#{direc}/pry/version"
|
||||||
require "#{direc}/pry/input"
|
require "#{direc}/pry/input"
|
||||||
require "#{direc}/pry/output"
|
require "#{direc}/pry/output"
|
||||||
require "#{direc}/pry/commands"
|
require "#{direc}/pry/commands"
|
||||||
|
require "#{direc}/pry/prompts"
|
||||||
|
|
||||||
class Pry
|
class Pry
|
||||||
def self.start(target=TOPLEVEL_BINDING, options={})
|
|
||||||
options = {
|
|
||||||
:input => Pry.input,
|
|
||||||
:output => Pry.output
|
|
||||||
}.merge!(options)
|
|
||||||
|
|
||||||
new(options[:input], options[:output]).repl(target)
|
# class accessors
|
||||||
|
class << self
|
||||||
|
attr_reader :nesting
|
||||||
|
attr_accessor :last_result
|
||||||
|
attr_accessor :input, :output
|
||||||
|
attr_accessor :commands
|
||||||
|
attr_accessor :default_prompt, :wait_prompt
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.start(target=TOPLEVEL_BINDING, options={})
|
||||||
|
new(options).repl(target)
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.view(obj)
|
def self.view(obj)
|
||||||
|
@ -31,32 +37,9 @@ class Pry
|
||||||
def self.reset_defaults
|
def self.reset_defaults
|
||||||
self.input = Input.new
|
self.input = Input.new
|
||||||
self.output = Output.new
|
self.output = Output.new
|
||||||
self.commands = Commands.new(self.output)
|
self.commands = COMMANDS
|
||||||
|
self.default_prompt = DEFAULT_PROMPT
|
||||||
self.default_prompt = proc do |v, nest|
|
self.wait_prompt = WAIT_PROMPT
|
||||||
if nest == 0
|
|
||||||
"pry(#{Pry.view(v)})> "
|
|
||||||
else
|
|
||||||
"pry(#{Pry.view(v)}):#{Pry.view(nest)}> "
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
self.wait_prompt = proc do |v, nest|
|
|
||||||
if nest == 0
|
|
||||||
"pry(#{Pry.view(v)})* "
|
|
||||||
else
|
|
||||||
"pry(#{Pry.view(v)}):#{Pry.view(nest)}* "
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# class accessors
|
|
||||||
class << self
|
|
||||||
attr_reader :nesting
|
|
||||||
attr_accessor :last_result
|
|
||||||
attr_accessor :default_prompt, :wait_prompt
|
|
||||||
attr_accessor :input, :output
|
|
||||||
attr_accessor :commands
|
|
||||||
end
|
end
|
||||||
|
|
||||||
self.reset_defaults
|
self.reset_defaults
|
||||||
|
@ -68,17 +51,25 @@ class Pry
|
||||||
end
|
end
|
||||||
|
|
||||||
attr_accessor :input, :output
|
attr_accessor :input, :output
|
||||||
attr_accessor :default_prompt, :wait_prompt
|
|
||||||
attr_accessor :commands
|
attr_accessor :commands
|
||||||
|
attr_accessor :default_prompt, :wait_prompt
|
||||||
attr_reader :last_result
|
attr_reader :last_result
|
||||||
|
|
||||||
def initialize(input = Pry.input, output = Pry.output)
|
def initialize(options={})
|
||||||
@input = input
|
|
||||||
@output = output
|
|
||||||
|
|
||||||
@default_prompt = Pry.default_prompt
|
options = {
|
||||||
@wait_prompt = Pry.wait_prompt
|
:input => Pry.input,
|
||||||
@commands = Commands.new(output)
|
:output => Pry.output,
|
||||||
|
:commands => Pry.commands,
|
||||||
|
:default_prompt => Pry.default_prompt,
|
||||||
|
:wait_prompt => Pry.wait_prompt
|
||||||
|
}.merge!(options)
|
||||||
|
|
||||||
|
@input = options[:input]
|
||||||
|
@output = options[:output]
|
||||||
|
@commands = options[:commands]
|
||||||
|
@default_prompt = options[:default_prompt]
|
||||||
|
@wait_prompt = options[:wait_prompt]
|
||||||
end
|
end
|
||||||
|
|
||||||
def nesting
|
def nesting
|
||||||
|
@ -151,8 +142,9 @@ class Pry
|
||||||
def process_commands(val, eval_string, target)
|
def process_commands(val, eval_string, target)
|
||||||
def eval_string.clear() replace("") end
|
def eval_string.clear() replace("") end
|
||||||
|
|
||||||
if action = commands.commands.find { |k, v| Array(k).any? { |a| a === val } }
|
pattern, action = commands.find { |k, v| Array(k).any? { |a| a === val } }
|
||||||
|
|
||||||
|
if pattern
|
||||||
options = {
|
options = {
|
||||||
:captures => $~ ? $~.captures : nil,
|
:captures => $~ ? $~.captures : nil,
|
||||||
:eval_string => eval_string,
|
:eval_string => eval_string,
|
||||||
|
@ -162,7 +154,7 @@ class Pry
|
||||||
:output => output
|
:output => output
|
||||||
}
|
}
|
||||||
|
|
||||||
action.last.call(options)
|
action.call(options)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -208,8 +200,8 @@ class Pry
|
||||||
end
|
end
|
||||||
|
|
||||||
module ObjectExtensions
|
module ObjectExtensions
|
||||||
def pry(target=self)
|
def pry(target=self, options={})
|
||||||
Pry.start(target)
|
Pry.start(target, options)
|
||||||
end
|
end
|
||||||
|
|
||||||
def __binding__
|
def __binding__
|
||||||
|
|
|
@ -1,82 +1,74 @@
|
||||||
class Pry
|
class Pry
|
||||||
class Commands
|
COMMANDS = {
|
||||||
attr_reader :commands, :output
|
["exit_program", "quit_program"] => proc { opts[:output].exit_program; exit },
|
||||||
|
"!" => proc { |opts| opts[:output].refresh; opts[:eval_string].clear },
|
||||||
def initialize(out)
|
"help" => proc { |opts| opts[:output].show_help; opts[:eval_string].clear },
|
||||||
@output = out
|
"nesting" => proc { |opts| opts[:output].show_nesting(opts[:nesting]); opts[:eval_string].clear },
|
||||||
|
"status" => proc do |opts|
|
||||||
@commands = {
|
opts[:output].show_status(opts[:nesting], opts[:target])
|
||||||
["exit_program", "quit_program"] => proc { opts[:output].exit_program; exit },
|
opts[:eval_string].clear
|
||||||
"!" => proc { |opts| opts[:output].refresh; opts[:eval_string].clear },
|
end,
|
||||||
"help" => proc { |opts| opts[:output].show_help; opts[:eval_string].clear },
|
"exit_all" => proc { throw(:breakout, 0) },
|
||||||
"nesting" => proc { |opts| opts[:output].show_nesting(opts[:nesting]); opts[:eval_string].clear },
|
["exit", "quit", "back", "cd .."] => proc do |opts|
|
||||||
"status" => proc do |opts|
|
output.exit
|
||||||
opts[:output].show_status(opts[:nesting], opts[:target])
|
throw(:breakout, opts[:nesting].level)
|
||||||
opts[:eval_string].clear
|
end,
|
||||||
end,
|
"ls" => proc do |opts|
|
||||||
"exit_all" => proc { throw(:breakout, 0) },
|
opts[:output].ls(opts[:target])
|
||||||
["exit", "quit", "back", "cd .."] => proc do |opts|
|
opts[:eval_string].clear
|
||||||
output.exit
|
end,
|
||||||
throw(:breakout, opts[:nesting].level)
|
/^cat\s+(.+)/ => proc do |opts|
|
||||||
end,
|
obj = opts[:captures].first
|
||||||
"ls" => proc do |opts|
|
opts[:output].cat(opts[:target], obj)
|
||||||
opts[:output].ls(opts[:target])
|
opts[:eval_string].clear
|
||||||
opts[:eval_string].clear
|
end,
|
||||||
end,
|
/^cd\s+(.+)/ => proc do |opts|
|
||||||
/^cat\s+(.+)/ => proc do |opts|
|
obj = opts[:captures].first
|
||||||
obj = opts[:captures].first
|
opts[:target].eval("#{obj}.pry")
|
||||||
opts[:output].cat(opts[:target], obj)
|
opts[:output].cd obj
|
||||||
opts[:eval_string].clear
|
opts[:eval_string].clear
|
||||||
end,
|
end,
|
||||||
/^cd\s+(.+)/ => proc do |opts|
|
/^show_doc\s*(.+)/ => proc do |opts|
|
||||||
obj = opts[:captures].first
|
meth_name = opts[:captures].first
|
||||||
opts[:target].eval("#{obj}.pry")
|
doc = opts[:target].eval("method(:#{meth_name})").comment
|
||||||
opts[:output].cd obj
|
opts[:output].show_doc doc
|
||||||
opts[:eval_string].clear
|
opts[:eval_string].clear
|
||||||
end,
|
end,
|
||||||
/^show_doc\s*(.+)/ => proc do |opts|
|
/^show_idoc\s*(.+)/ => proc do |opts|
|
||||||
meth_name = opts[:captures].first
|
meth_name = opts[:captures].first
|
||||||
doc = opts[:target].eval("method(:#{meth_name})").comment
|
doc = opts[:target].eval("instance_method(:#{meth_name})").comment
|
||||||
opts[:output].show_doc doc
|
opts[:output].show_doc doc
|
||||||
opts[:eval_string].clear
|
opts[:eval_string].clear
|
||||||
end,
|
end,
|
||||||
/^show_idoc\s*(.+)/ => proc do |opts|
|
/^show_method\s*(.+)/ => proc do |opts|
|
||||||
meth_name = opts[:captures].first
|
meth_name = opts[:captures].first
|
||||||
doc = opts[:target].eval("instance_method(:#{meth_name})").comment
|
code = opts[:target].eval("method(:#{meth_name})").source
|
||||||
opts[:output].show_doc doc
|
opts[:output].show_method code
|
||||||
opts[:eval_string].clear
|
opts[:eval_string].clear
|
||||||
end,
|
end,
|
||||||
/^show_method\s*(.+)/ => proc do |opts|
|
/^show_imethod\s*(.+)/ => proc do |opts|
|
||||||
meth_name = opts[:captures].first
|
meth_name = opts[:captures].first
|
||||||
code = opts[:target].eval("method(:#{meth_name})").source
|
code = opts[:target].eval("instance_method(:#{meth_name})").source
|
||||||
opts[:output].show_method code
|
opts[:output].show_method code
|
||||||
opts[:eval_string].clear
|
opts[:eval_string].clear
|
||||||
end,
|
end,
|
||||||
/^show_imethod\s*(.+)/ => proc do |opts|
|
/^jump_to\s*(\d*)/ => proc do |opts|
|
||||||
meth_name = opts[:captures].first
|
break_level = opts[:captures].first.to_i
|
||||||
code = opts[:target].eval("instance_method(:#{meth_name})").source
|
opts[:output].jump_to(break_level)
|
||||||
output.show_method code
|
nesting = opts[:nesting]
|
||||||
opts[:eval_string].clear
|
|
||||||
end,
|
|
||||||
/^jump_to\s*(\d*)/ => proc do |opts|
|
|
||||||
break_level = opts[:captures].first.to_i
|
|
||||||
opts[:output].jump_to(break_level)
|
|
||||||
nesting = opts[:nesting]
|
|
||||||
|
|
||||||
case break_level
|
case break_level
|
||||||
when nesting.level
|
when nesting.level
|
||||||
opts[:output].warn_already_at_level(nesting.level)
|
opts[:output].warn_already_at_level(nesting.level)
|
||||||
opts[:eval_string].clear
|
opts[:eval_string].clear
|
||||||
when (0...nesting.level)
|
when (0...nesting.level)
|
||||||
throw(:breakout, break_level + 1)
|
throw(:breakout, break_level + 1)
|
||||||
else
|
else
|
||||||
opts[:output].err_invalid_nest_level(break_level,
|
opts[:output].err_invalid_nest_level(break_level,
|
||||||
nestingn.level - 1)
|
nestingn.level - 1)
|
||||||
opts[:eval_string].clear
|
opts[:eval_string].clear
|
||||||
end
|
end
|
||||||
end
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
end
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
14
test/test.rb
14
test/test.rb
|
@ -31,7 +31,7 @@ describe Pry do
|
||||||
output = OutputTester.new
|
output = OutputTester.new
|
||||||
o = Object.new
|
o = Object.new
|
||||||
|
|
||||||
pry_tester = Pry.new(input, output)
|
pry_tester = Pry.new(:input => input, :output => output)
|
||||||
pry_tester.rep(o)
|
pry_tester.rep(o)
|
||||||
o.instance_variable_get(:@x).should == 10
|
o.instance_variable_get(:@x).should == 10
|
||||||
end
|
end
|
||||||
|
@ -40,21 +40,21 @@ describe Pry do
|
||||||
output = OutputTester.new
|
output = OutputTester.new
|
||||||
o = Object.new
|
o = Object.new
|
||||||
|
|
||||||
pry_tester = Pry.new(InputTester.new("self"), output)
|
pry_tester = Pry.new(:input => InputTester.new("self"), :output => output)
|
||||||
pry_tester.rep(o)
|
pry_tester.rep(o)
|
||||||
output.output_buffer.should == o
|
output.output_buffer.should == o
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'should work with multi-line input' do
|
it 'should work with multi-line input' do
|
||||||
output = OutputTester.new
|
output = OutputTester.new
|
||||||
pry_tester = Pry.new(InputTester.new("x = ", "1 + 4"), output)
|
pry_tester = Pry.new(:input => InputTester.new("x = ", "1 + 4"), :output => output)
|
||||||
pry_tester.rep(Hello)
|
pry_tester.rep(Hello)
|
||||||
output.output_buffer.should == 5
|
output.output_buffer.should == 5
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'should define a nested class under Hello and not on top-level or Pry' do
|
it 'should define a nested class under Hello and not on top-level or Pry' do
|
||||||
output = OutputTester.new
|
output = OutputTester.new
|
||||||
pry_tester = Pry.new(InputTester.new("class Nested", "end"), output)
|
pry_tester = Pry.new(:input => InputTester.new("class Nested", "end"), :output => output)
|
||||||
pry_tester.rep(Hello)
|
pry_tester.rep(Hello)
|
||||||
Hello.const_defined?(:Nested).should == true
|
Hello.const_defined?(:Nested).should == true
|
||||||
end
|
end
|
||||||
|
@ -69,7 +69,7 @@ describe Pry do
|
||||||
|
|
||||||
o = Object.new
|
o = Object.new
|
||||||
|
|
||||||
pry_tester = Pry.new(input, output)
|
pry_tester = Pry.new(:input => input, :output => output)
|
||||||
pry_tester.repl(o)
|
pry_tester.repl(o)
|
||||||
|
|
||||||
o.instance_variable_get(:@x).should == 10
|
o.instance_variable_get(:@x).should == 10
|
||||||
|
@ -135,7 +135,7 @@ describe Pry do
|
||||||
output = OutputTester.new
|
output = OutputTester.new
|
||||||
o = Class.new
|
o = Class.new
|
||||||
|
|
||||||
pry_tester = Pry.new(input, output)
|
pry_tester = Pry.new(:input => input, :output => output)
|
||||||
pry_tester.repl(o)
|
pry_tester.repl(o)
|
||||||
|
|
||||||
output.#{meth}_invoked.should == true
|
output.#{meth}_invoked.should == true
|
||||||
|
@ -157,7 +157,7 @@ describe Pry do
|
||||||
output = OutputTester.new
|
output = OutputTester.new
|
||||||
o = Class.new
|
o = Class.new
|
||||||
|
|
||||||
pry_tester = Pry.new(input, output)
|
pry_tester = Pry.new(:input => input, :output => output)
|
||||||
pry_tester.repl(o)
|
pry_tester.repl(o)
|
||||||
|
|
||||||
if "#{command}" != "!"
|
if "#{command}" != "!"
|
||||||
|
|
Loading…
Add table
Reference in a new issue