From 1666945e4b7e094b3c49b2122928e19901d1c06f Mon Sep 17 00:00:00 2001 From: John Mair Date: Mon, 10 Jan 2011 19:29:26 +1300 Subject: [PATCH] moved input select logic to Pry#readline; updated tests to reflect that Pry.input and Pry.output now accept duck-typed IOs --- lib/pry/input.rb | 9 -------- lib/pry/output.rb | 15 +------------ lib/pry/pry_instance.rb | 35 ++++++++++++++++++++--------- test/test.rb | 49 +++++++++++++++++++++-------------------- 4 files changed, 50 insertions(+), 58 deletions(-) diff --git a/lib/pry/input.rb b/lib/pry/input.rb index db86aad3..5e048d2e 100644 --- a/lib/pry/input.rb +++ b/lib/pry/input.rb @@ -2,15 +2,6 @@ require 'readline' class Pry - # default input class - uses Readline. - class Input - trap('INT') { exit } - - def readline(prompt) - Readline.readline(prompt, true) - end - end - # read from any IO-alike class IOInput def initialize(io) diff --git a/lib/pry/output.rb b/lib/pry/output.rb index a87b6ed7..da181ae8 100644 --- a/lib/pry/output.rb +++ b/lib/pry/output.rb @@ -1,20 +1,7 @@ class Pry - # default output class - just writes to STDOUT - class Output - attr_reader :out - - def initialize(out=STDOUT) - @out = out - end - - def puts(value) - out.puts value - end - end - # null output class - doesn't write anywwhere. class NullOutput - def puts(*) end + def self.puts(*) end end end diff --git a/lib/pry/pry_instance.rb b/lib/pry/pry_instance.rb index c75f4c52..594e53f2 100644 --- a/lib/pry/pry_instance.rb +++ b/lib/pry/pry_instance.rb @@ -83,7 +83,7 @@ class Pry exec_hook :after_session, output, target_self - # we only enter here if :breakout has been thrown + # keep throwing until we reach the desired nesting level if nesting_level != break_level throw :breakout, break_level end @@ -137,18 +137,11 @@ class Pry def r(target=TOPLEVEL_BINDING) target = binding_for(target) eval_string = "" + loop do + current_prompt = select_prompt(eval_string.empty?, target.eval('self')) - val = if input == Readline - input.readline(select_prompt(eval_string.empty?, target.eval('self')), true) - else - if input.method(:readline).arity == 1 - input.readline(select_prompt(eval_string.empty?, target.eval('self'))) - else - input.readline - end - end - + val = readline(current_prompt) val.chomp! process_commands(val, eval_string, target) @@ -188,6 +181,26 @@ class Pry end end + # Returns the next line of input to be used by the pry instance. + # This method should not need to be invoked directly. + # @param [String] current_prompt The prompt to use for input. + # @return [String] The next line of input. + def readline(current_prompt) + + if input == Readline + + # Readline must be treated differently + # as it has a second parameter. + input.readline(current_prompt, true) + else + if input.method(:readline).arity == 1 + input.readline(current_prompt) + else + input.readline + end + end + end + # Returns the appropriate prompt to use. # This method should not need to be invoked directly. # @param [Boolean] first_line Whether this is the first line of input diff --git a/test/test.rb b/test/test.rb index 6235f824..89a68e91 100644 --- a/test/test.rb +++ b/test/test.rb @@ -30,7 +30,7 @@ describe Pry do input = InputTester.new(input_string) o = Object.new - pry_tester = Pry.new(:input => input, :output => Pry::NullOutput.new) + pry_tester = Pry.new(:input => input, :output => Pry::NullOutput) pry_tester.rep(o) o.instance_variable_get(:@x).should == 10 end @@ -39,7 +39,7 @@ describe Pry do o = Object.new str_output = StringIO.new - pry_tester = Pry.new(:input => InputTester.new("self"), :output => Pry::Output.new(str_output)) + pry_tester = Pry.new(:input => InputTester.new("self"), :output => str_output) pry_tester.rep(o) str_output.string.should =~ /#{o.to_s}/ end @@ -48,13 +48,13 @@ describe Pry do o = Object.new str_output = StringIO.new - pry_tester = Pry.new(:input => InputTester.new("x = ", "1 + 4"), :output => Pry::Output.new(str_output)) + pry_tester = Pry.new(:input => InputTester.new("x = ", "1 + 4"), :output => str_output) pry_tester.rep(o) str_output.string.should =~ /5/ end it 'should define a nested class under Hello and not on top-level or Pry' do - pry_tester = Pry.new(:input => InputTester.new("class Nested", "end"), :output => Pry::NullOutput.new) + pry_tester = Pry.new(:input => InputTester.new("class Nested", "end"), :output => Pry::NullOutput) pry_tester.rep(Hello) Hello.const_defined?(:Nested).should == true end @@ -68,7 +68,7 @@ describe Pry do o = Object.new - pry_tester = Pry.start(o, :input => input, :output => Pry::NullOutput.new) + pry_tester = Pry.start(o, :input => input, :output => Pry::NullOutput) o.instance_variable_get(:@x).should == 10 end @@ -78,26 +78,27 @@ describe Pry do str_output = StringIO.new o = Object.new - pry_tester = Pry.start(o, :input => input, :output => Pry::Output.new(str_output)) + pry_tester = Pry.start(o, :input => input, :output => str_output) str_output.string.should =~ /Beginning.*#{o}/ str_output.string.should =~ /Ending.*#{o}/ end end describe "nesting" do + after do + Pry.reset_defaults + end + it 'should nest properly' do Pry.input = InputTester.new("pry", "pry", "pry", "\"nest:\#\{Pry.nesting.level\}\"", "exit_all") str_output = StringIO.new - Pry.output = Pry::Output.new(str_output) + Pry.output = str_output o = Object.new pry_tester = o.pry str_output.string.should =~ /nest:3/ - - Pry.input = Pry::Input.new - Pry.output = Pry::Output.new end end @@ -109,7 +110,7 @@ describe Pry do pry_tester.commands = CommandTester.new str_output = StringIO.new - pry_tester.output = Pry::Output.new(str_output) + pry_tester.output = str_output pry_tester.rep @@ -123,7 +124,7 @@ describe Pry do pry_tester.commands = CommandTester.new str_output = StringIO.new - pry_tester.output = Pry::Output.new(str_output) + pry_tester.output = str_output pry_tester.rep @@ -141,7 +142,7 @@ describe Pry do Pry.input = InputTester.new("self", "exit") str_output = StringIO.new - Pry.output = Pry::Output.new(str_output) + Pry.output = str_output 20.pry @@ -152,7 +153,7 @@ describe Pry do Pry.input = InputTester.new("self", "exit") str_output = StringIO.new - Pry.output = Pry::Output.new(str_output) + Pry.output = str_output pry 20 @@ -160,7 +161,7 @@ describe Pry do end it "should error if more than one argument is passed to Object#pry" do - lambda { pry(20, :input => Pry::Input.new) }.should.raise ArgumentError + lambda { pry(20, :input => Readline) }.should.raise ArgumentError end end @@ -184,7 +185,7 @@ describe Pry do Pry.input = InputTester.new("5") str_output = StringIO.new - Pry.output = Pry::Output.new(str_output) + Pry.output = str_output Pry.new.rep str_output.string.should =~ /5/ @@ -196,7 +197,7 @@ describe Pry do Pry.input = InputTester.new("5", "6", "7") str_output = StringIO.new - Pry.output = Pry::Output.new(str_output) + Pry.output = str_output Pry.new.rep str_output.string.should =~ /5/ @@ -205,7 +206,7 @@ describe Pry do str_output.string.should =~ /5\n.*6/ str_output2 = StringIO.new - Pry.new(:output => Pry::Output.new(str_output2)).rep + Pry.new(:output => str_output2).rep str_output2.string.should.not =~ /5\n.*6/ str_output2.string.should =~ /7/ end @@ -220,7 +221,7 @@ describe Pry do Pry.commands = commands str_output = StringIO.new - Pry.new(:input => InputTester.new("hello"), :output => Pry::Output.new(str_output)).rep + Pry.new(:input => InputTester.new("hello"), :output => str_output).rep str_output.string.should =~ /hello world/ commands = { @@ -230,7 +231,7 @@ describe Pry do def commands.commands() self end str_output = StringIO.new - Pry.new(:input => InputTester.new("goodbye"), :output => Pry::Output.new(str_output), :commands => commands).rep + Pry.new(:input => InputTester.new("goodbye"), :output => str_output, :commands => commands).rep str_output.string.should =~ /goodbye world/ end @@ -303,14 +304,14 @@ describe Pry do } str_output = StringIO.new - Pry.new(:output => Pry::Output.new(str_output)).repl + Pry.new(:output => str_output).repl str_output.string.should =~ /HELLO/ str_output.string.should =~ /BYE/ Pry.input.rewind str_output = StringIO.new - Pry.new(:output => Pry::Output.new(str_output), + Pry.new(:output => str_output, :hooks => { :before_session => proc { |out,_| out.puts "MORNING" }, :after_session => proc { |out,_| out.puts "EVENING" } @@ -323,7 +324,7 @@ describe Pry do # try below with just defining one hook Pry.input.rewind str_output = StringIO.new - Pry.new(:output => Pry::Output.new(str_output), + Pry.new(:output => str_output, :hooks => { :before_session => proc { |out,_| out.puts "OPEN" } } @@ -333,7 +334,7 @@ describe Pry do Pry.input.rewind str_output = StringIO.new - Pry.new(:output => Pry::Output.new(str_output), + Pry.new(:output => str_output, :hooks => { :after_session => proc { |out,_| out.puts "CLOSE" } }