pry 0.10.2-i386-mingw32 → 1.0.0.pre1-i386-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +2 -0
- data/.gitignore +16 -0
- data/.travis.yml +21 -0
- data/.yardopts +3 -0
- data/CHANGELOG +503 -0
- data/CONTRIBUTORS +55 -0
- data/Gemfile +9 -0
- data/Guardfile +62 -0
- data/LICENSE +2 -2
- data/{README.md → README.markdown} +31 -37
- data/Rakefile +144 -0
- data/TODO +117 -0
- data/lib/pry.rb +146 -33
- data/lib/pry/cli.rb +13 -35
- data/lib/pry/code.rb +63 -24
- data/lib/pry/code/loc.rb +2 -2
- data/lib/pry/code_object.rb +21 -40
- data/lib/pry/command.rb +6 -9
- data/lib/pry/command_set.rb +37 -80
- data/lib/pry/commands.rb +1 -1
- data/lib/pry/commands/amend_line.rb +1 -1
- data/lib/pry/commands/bang.rb +1 -1
- data/lib/pry/commands/cat.rb +2 -11
- data/lib/pry/commands/cat/abstract_formatter.rb +1 -1
- data/lib/pry/commands/cat/exception_formatter.rb +7 -6
- data/lib/pry/commands/cat/file_formatter.rb +32 -15
- data/lib/pry/commands/cat/input_expression_formatter.rb +1 -1
- data/lib/pry/commands/cd.rb +3 -14
- data/lib/pry/commands/code_collector.rb +4 -4
- data/lib/pry/commands/easter_eggs.rb +3 -3
- data/lib/pry/commands/edit.rb +22 -10
- data/lib/pry/commands/edit/exception_patcher.rb +1 -1
- data/lib/pry/commands/edit/file_and_line_locator.rb +2 -0
- data/lib/pry/{method/patcher.rb → commands/edit/method_patcher.rb} +37 -40
- data/lib/pry/commands/find_method.rb +22 -16
- data/lib/pry/commands/gem_install.rb +2 -5
- data/lib/pry/commands/gem_open.rb +1 -1
- data/lib/pry/commands/gist.rb +11 -10
- data/lib/pry/commands/help.rb +14 -14
- data/lib/pry/commands/hist.rb +5 -24
- data/lib/pry/commands/ls.rb +287 -56
- data/lib/pry/commands/play.rb +10 -44
- data/lib/pry/commands/pry_backtrace.rb +2 -1
- data/lib/pry/commands/raise_up.rb +1 -1
- data/lib/pry/commands/reload_code.rb +15 -31
- data/lib/pry/commands/ri.rb +3 -7
- data/lib/pry/commands/shell_command.rb +12 -17
- data/lib/pry/commands/shell_mode.rb +2 -2
- data/lib/pry/commands/show_doc.rb +0 -5
- data/lib/pry/commands/show_info.rb +10 -11
- data/lib/pry/commands/show_source.rb +3 -15
- data/lib/pry/commands/simple_prompt.rb +1 -1
- data/lib/pry/commands/toggle_color.rb +4 -8
- data/lib/pry/commands/whereami.rb +10 -18
- data/lib/pry/completion.rb +293 -0
- data/lib/pry/config.rb +233 -20
- data/lib/pry/core_extensions.rb +19 -29
- data/lib/pry/custom_completions.rb +6 -0
- data/lib/pry/editor.rb +103 -109
- data/lib/pry/helpers/base_helpers.rb +109 -22
- data/lib/pry/helpers/command_helpers.rb +8 -10
- data/lib/pry/helpers/documentation_helpers.rb +2 -1
- data/lib/pry/helpers/text.rb +5 -4
- data/lib/pry/history.rb +10 -21
- data/lib/pry/history_array.rb +0 -5
- data/lib/pry/hooks.rb +29 -9
- data/lib/pry/indent.rb +10 -5
- data/lib/pry/method.rb +86 -81
- data/lib/pry/method/weird_method_locator.rb +2 -4
- data/lib/pry/module_candidate.rb +14 -5
- data/lib/pry/pager.rb +48 -193
- data/lib/pry/plugins.rb +2 -2
- data/lib/pry/pry_class.rb +193 -104
- data/lib/pry/pry_instance.rb +154 -152
- data/lib/pry/rbx_method.rb +13 -0
- data/lib/pry/rbx_path.rb +1 -1
- data/lib/pry/repl.rb +14 -17
- data/lib/pry/repl_file_loader.rb +3 -8
- data/lib/pry/rubygem.rb +3 -3
- data/lib/pry/terminal.rb +3 -4
- data/lib/pry/test/helper.rb +11 -6
- data/lib/pry/version.rb +1 -1
- data/lib/pry/wrapped_module.rb +56 -49
- data/man/pry.1 +195 -0
- data/man/pry.1.html +204 -0
- data/man/pry.1.ronn +141 -0
- data/pry.gemspec +31 -0
- data/spec/Procfile +3 -0
- data/spec/cli_spec.rb +78 -0
- data/spec/code_object_spec.rb +277 -0
- data/spec/code_spec.rb +219 -0
- data/spec/command_helpers_spec.rb +29 -0
- data/spec/command_integration_spec.rb +562 -0
- data/spec/command_set_spec.rb +627 -0
- data/spec/command_spec.rb +821 -0
- data/spec/commands/amend_line_spec.rb +247 -0
- data/spec/commands/bang_spec.rb +18 -0
- data/spec/commands/cat_spec.rb +164 -0
- data/spec/commands/cd_spec.rb +250 -0
- data/spec/commands/disable_pry_spec.rb +25 -0
- data/spec/commands/edit_spec.rb +725 -0
- data/spec/commands/exit_all_spec.rb +27 -0
- data/spec/commands/exit_program_spec.rb +19 -0
- data/spec/commands/exit_spec.rb +28 -0
- data/spec/commands/find_method_spec.rb +70 -0
- data/spec/commands/gem_list_spec.rb +26 -0
- data/spec/commands/gist_spec.rb +79 -0
- data/spec/commands/help_spec.rb +56 -0
- data/spec/commands/hist_spec.rb +172 -0
- data/spec/commands/jump_to_spec.rb +15 -0
- data/spec/commands/ls_spec.rb +189 -0
- data/spec/commands/play_spec.rb +136 -0
- data/spec/commands/raise_up_spec.rb +56 -0
- data/spec/commands/save_file_spec.rb +177 -0
- data/spec/commands/show_doc_spec.rb +488 -0
- data/spec/commands/show_input_spec.rb +17 -0
- data/spec/commands/show_source_spec.rb +760 -0
- data/spec/commands/whereami_spec.rb +203 -0
- data/spec/completion_spec.rb +221 -0
- data/spec/control_d_handler_spec.rb +62 -0
- data/spec/documentation_helper_spec.rb +73 -0
- data/spec/editor_spec.rb +79 -0
- data/spec/exception_whitelist_spec.rb +21 -0
- data/spec/fixtures/candidate_helper1.rb +11 -0
- data/spec/fixtures/candidate_helper2.rb +8 -0
- data/spec/fixtures/example.erb +5 -0
- data/spec/fixtures/example_nesting.rb +33 -0
- data/spec/fixtures/show_source_doc_examples.rb +15 -0
- data/spec/fixtures/testlinkrc +2 -0
- data/spec/fixtures/testrc +2 -0
- data/spec/fixtures/testrcbad +2 -0
- data/spec/fixtures/whereami_helper.rb +6 -0
- data/spec/helper.rb +35 -0
- data/spec/helpers/bacon.rb +86 -0
- data/spec/helpers/mock_pry.rb +44 -0
- data/spec/helpers/repl_tester.rb +112 -0
- data/spec/helpers/table_spec.rb +105 -0
- data/spec/history_array_spec.rb +67 -0
- data/spec/hooks_spec.rb +522 -0
- data/spec/indent_spec.rb +301 -0
- data/spec/method_spec.rb +482 -0
- data/spec/prompt_spec.rb +61 -0
- data/spec/pry_defaults_spec.rb +420 -0
- data/spec/pry_history_spec.rb +69 -0
- data/spec/pry_output_spec.rb +95 -0
- data/spec/pry_repl_spec.rb +86 -0
- data/spec/pry_spec.rb +394 -0
- data/spec/pryrc_spec.rb +97 -0
- data/spec/run_command_spec.rb +25 -0
- data/spec/sticky_locals_spec.rb +147 -0
- data/spec/syntax_checking_spec.rb +81 -0
- data/spec/wrapped_module_spec.rb +261 -0
- data/wiki/Customizing-pry.md +397 -0
- data/wiki/Home.md +4 -0
- metadata +272 -61
- checksums.yaml +0 -7
- data/CHANGELOG.md +0 -714
- data/lib/pry/code/code_file.rb +0 -103
- data/lib/pry/color_printer.rb +0 -55
- data/lib/pry/commands/change_inspector.rb +0 -27
- data/lib/pry/commands/change_prompt.rb +0 -26
- data/lib/pry/commands/list_inspectors.rb +0 -35
- data/lib/pry/commands/list_prompts.rb +0 -35
- data/lib/pry/commands/ls/constants.rb +0 -47
- data/lib/pry/commands/ls/formatter.rb +0 -49
- data/lib/pry/commands/ls/globals.rb +0 -48
- data/lib/pry/commands/ls/grep.rb +0 -21
- data/lib/pry/commands/ls/instance_vars.rb +0 -39
- data/lib/pry/commands/ls/interrogatable.rb +0 -18
- data/lib/pry/commands/ls/jruby_hacks.rb +0 -49
- data/lib/pry/commands/ls/local_names.rb +0 -35
- data/lib/pry/commands/ls/local_vars.rb +0 -39
- data/lib/pry/commands/ls/ls_entity.rb +0 -70
- data/lib/pry/commands/ls/methods.rb +0 -57
- data/lib/pry/commands/ls/methods_helper.rb +0 -46
- data/lib/pry/commands/ls/self_methods.rb +0 -32
- data/lib/pry/commands/watch_expression.rb +0 -105
- data/lib/pry/commands/watch_expression/expression.rb +0 -38
- data/lib/pry/config/behavior.rb +0 -139
- data/lib/pry/config/convenience.rb +0 -25
- data/lib/pry/config/default.rb +0 -161
- data/lib/pry/exceptions.rb +0 -78
- data/lib/pry/input_completer.rb +0 -242
- data/lib/pry/input_lock.rb +0 -132
- data/lib/pry/inspector.rb +0 -27
- data/lib/pry/last_exception.rb +0 -61
- data/lib/pry/object_path.rb +0 -82
- data/lib/pry/output.rb +0 -50
- data/lib/pry/prompt.rb +0 -26
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'tempfile'
|
3
|
+
|
4
|
+
describe Pry do
|
5
|
+
before do
|
6
|
+
Pry.history.clear
|
7
|
+
|
8
|
+
@saved_history = "1\n2\n3\n"
|
9
|
+
|
10
|
+
Pry.history.loader = proc do |&blk|
|
11
|
+
@saved_history.lines.each { |l| blk.call(l) }
|
12
|
+
end
|
13
|
+
|
14
|
+
Pry.load_history
|
15
|
+
end
|
16
|
+
|
17
|
+
after do
|
18
|
+
Pry.history.clear
|
19
|
+
Pry.history.restore_default_behavior
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#push' do
|
23
|
+
it "should not record duplicated lines" do
|
24
|
+
Pry.history << '3'
|
25
|
+
Pry.history << '_ += 1'
|
26
|
+
Pry.history << '_ += 1'
|
27
|
+
Pry.history.to_a.grep('_ += 1').count.should == 1
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should not record empty lines" do
|
31
|
+
c = Pry.history.to_a.count
|
32
|
+
Pry.history << ''
|
33
|
+
Pry.history.to_a.count.should == c
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe ".load_history" do
|
38
|
+
it "should read the contents of the file" do
|
39
|
+
Pry.history.to_a[-2..-1].should == %w(2 3)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "saving to a file" do
|
44
|
+
before do
|
45
|
+
@histfile = Tempfile.new(["pryhistory", "txt"])
|
46
|
+
@history = Pry::History.new(:file_path => @histfile.path)
|
47
|
+
Pry.config.history.should_save = true
|
48
|
+
@history.pusher = proc{ }
|
49
|
+
end
|
50
|
+
|
51
|
+
after do
|
52
|
+
@histfile.close(true)
|
53
|
+
Pry.config.history.should_save = false
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should save lines to a file as they are written" do
|
57
|
+
@history.push "5"
|
58
|
+
File.read(@histfile.path).should == "5\n"
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should interleave lines from many places" do
|
62
|
+
@history.push "5"
|
63
|
+
File.open(@histfile.path, 'a'){ |f| f.puts "6" }
|
64
|
+
@history.push "7"
|
65
|
+
|
66
|
+
File.read(@histfile.path).should == "5\n6\n7\n"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe Pry do
|
4
|
+
describe "output failsafe" do
|
5
|
+
after do
|
6
|
+
Pry.config.print = Pry::DEFAULT_PRINT
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should catch serialization exceptions" do
|
10
|
+
Pry.config.print = lambda { |*a| raise "catch-22" }
|
11
|
+
|
12
|
+
lambda {
|
13
|
+
mock_pry("1")
|
14
|
+
}.should.not.raise
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should display serialization exceptions" do
|
18
|
+
Pry.config.print = lambda { |*a| raise "catch-22" }
|
19
|
+
|
20
|
+
mock_pry("1").should =~ /\(pry\) output error: #<RuntimeError: catch-22>/
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should catch errors serializing exceptions" do
|
24
|
+
Pry.config.print = lambda do |*a|
|
25
|
+
raise Exception.new("catch-22").tap{ |e| class << e; def inspect; raise e; end; end }
|
26
|
+
end
|
27
|
+
|
28
|
+
mock_pry("1").should =~ /\(pry\) output error: failed to show result/
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "DEFAULT_PRINT" do
|
33
|
+
it "should output the right thing" do
|
34
|
+
mock_pry("[1]").should =~ /^=> \[1\]/
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should include the =>" do
|
38
|
+
accumulator = StringIO.new
|
39
|
+
Pry.config.print.call(accumulator, [1])
|
40
|
+
accumulator.string.should == "=> \[1\]\n"
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should not be phased by un-inspectable things" do
|
44
|
+
mock_pry("class NastyClass; undef pretty_inspect; end", "NastyClass.new").should =~ /#<.*NastyClass:0x.*?>/
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "color" do
|
49
|
+
before do
|
50
|
+
Pry.color = true
|
51
|
+
end
|
52
|
+
|
53
|
+
after do
|
54
|
+
Pry.color = false
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should colorize strings as though they were ruby" do
|
58
|
+
accumulator = StringIO.new
|
59
|
+
Pry.config.print.call(accumulator, [1])
|
60
|
+
accumulator.string.should == "=> [\e[1;34m1\e[0m]\e[0m\n"
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should not colorize strings that already include color" do
|
64
|
+
f = Object.new
|
65
|
+
def f.inspect
|
66
|
+
"\e[1;31mFoo\e[0m"
|
67
|
+
end
|
68
|
+
accumulator = StringIO.new
|
69
|
+
Pry.config.print.call(accumulator, f)
|
70
|
+
# We add an extra \e[0m to prevent color leak
|
71
|
+
accumulator.string.should == "=> \e[1;31mFoo\e[0m\e[0m\n"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "output suppression" do
|
76
|
+
before do
|
77
|
+
@t = pry_tester
|
78
|
+
end
|
79
|
+
it "should normally output the result" do
|
80
|
+
mock_pry("1 + 2").should == "=> 3\n"
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should not output anything if the input ends with a semicolon" do
|
84
|
+
mock_pry("1 + 2;").should == ""
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should output something if the input ends with a comment" do
|
88
|
+
mock_pry("1 + 2 # basic addition").should == "=> 3\n"
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should not output something if the input is only a comment" do
|
92
|
+
mock_pry("# basic addition").should == ""
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe "The whole thing" do
|
4
|
+
it "should let you run commands in the middle of multiline expressions" do
|
5
|
+
ReplTester.start do
|
6
|
+
input 'def a'
|
7
|
+
input '!'
|
8
|
+
output /^Input buffer cleared/
|
9
|
+
|
10
|
+
input '5'
|
11
|
+
output '=> 5'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "eval_string and binding_stack" do
|
16
|
+
it "shouldn't break if we start a nested REPL" do
|
17
|
+
ReplTester.start do
|
18
|
+
input 'Pry::REPL.new(_pry_, :target => 10).start'
|
19
|
+
output ''
|
20
|
+
prompt /10.*> $/
|
21
|
+
|
22
|
+
input 'self'
|
23
|
+
output '=> 10'
|
24
|
+
|
25
|
+
input nil # Ctrl-D
|
26
|
+
output ''
|
27
|
+
|
28
|
+
input 'self'
|
29
|
+
output '=> main'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
it "shouldn't break if we start a nested instance" do
|
34
|
+
ReplTester.start do
|
35
|
+
input 'Pry.start(10)'
|
36
|
+
output ''
|
37
|
+
prompt /10.*> $/
|
38
|
+
|
39
|
+
input 'self'
|
40
|
+
output '=> 10'
|
41
|
+
|
42
|
+
input nil # Ctrl-D
|
43
|
+
output '=> nil' # return value of Pry session
|
44
|
+
|
45
|
+
input 'self'
|
46
|
+
output '=> main'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
it "shouldn't break if we pop bindings in Ruby" do
|
51
|
+
ReplTester.start do
|
52
|
+
input 'cd 10'
|
53
|
+
output ''
|
54
|
+
prompt /10.*> $/
|
55
|
+
|
56
|
+
input '_pry_.binding_stack.pop'
|
57
|
+
output /^=> #<Binding/
|
58
|
+
prompt /main.*> $/
|
59
|
+
|
60
|
+
input '_pry_.binding_stack.pop'
|
61
|
+
output /^=> #<Binding/
|
62
|
+
assert_exited
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should immediately evaluate eval_string after cmd if complete" do
|
67
|
+
set = Pry::CommandSet.new do
|
68
|
+
import Pry::Commands
|
69
|
+
|
70
|
+
command 'hello!' do
|
71
|
+
eval_string.replace('"hello"')
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
ReplTester.start(:commands => set) do
|
76
|
+
input 'def x'
|
77
|
+
output ''
|
78
|
+
prompt /\* $/
|
79
|
+
|
80
|
+
input 'hello!'
|
81
|
+
output '=> "hello"'
|
82
|
+
prompt /> $/
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
data/spec/pry_spec.rb
ADDED
@@ -0,0 +1,394 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe Pry do
|
4
|
+
before do
|
5
|
+
@str_output = StringIO.new
|
6
|
+
end
|
7
|
+
|
8
|
+
if RUBY_VERSION =~ /1.9/
|
9
|
+
describe "Exotic object support" do
|
10
|
+
# regression test for exotic object support
|
11
|
+
it "Should not error when return value is a BasicObject instance" do
|
12
|
+
|
13
|
+
ReplTester.start do
|
14
|
+
input('BasicObject.new').should =~ /^=> #<BasicObject:/
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe 'DISABLE_PRY' do
|
22
|
+
before do
|
23
|
+
ENV['DISABLE_PRY'] = 'true'
|
24
|
+
end
|
25
|
+
|
26
|
+
after do
|
27
|
+
ENV.delete 'DISABLE_PRY'
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should not binding.pry' do
|
31
|
+
binding.pry.should == nil
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should not Pry.start' do
|
35
|
+
Pry.start.should == nil
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "Pry.critical_section" do
|
40
|
+
it "should prevent Pry being called" do
|
41
|
+
output = StringIO.new
|
42
|
+
Pry.output = output
|
43
|
+
Pry.critical_section do
|
44
|
+
Pry.start
|
45
|
+
end
|
46
|
+
output.string.should =~ /Pry started inside Pry/
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "Pry.binding_for" do
|
51
|
+
|
52
|
+
# regression test for burg's bug (see git history)
|
53
|
+
it "Should not error when object doesn't have a valid == method" do
|
54
|
+
o = Object.new
|
55
|
+
def o.==(other)
|
56
|
+
raise
|
57
|
+
end
|
58
|
+
|
59
|
+
lambda { Pry.binding_for(o) }.should.not.raise Exception
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should not leak local variables" do
|
63
|
+
[Object.new, Array, 3].each do |obj|
|
64
|
+
Pry.binding_for(obj).eval("local_variables").should.be.empty
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "open a Pry session on an object" do
|
70
|
+
describe "rep" do
|
71
|
+
before do
|
72
|
+
class Hello
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
after do
|
77
|
+
Object.send(:remove_const, :Hello)
|
78
|
+
end
|
79
|
+
|
80
|
+
# bug fix for https://github.com/banister/pry/issues/93
|
81
|
+
it 'should not leak pry constants into Object namespace' do
|
82
|
+
lambda{
|
83
|
+
pry_eval(Object.new, "Command")
|
84
|
+
}.should.raise(NameError)
|
85
|
+
end
|
86
|
+
|
87
|
+
if defined?(BasicObject)
|
88
|
+
it 'should be able to operate inside the BasicObject class' do
|
89
|
+
pry_eval(BasicObject, ":foo", "Pad.obj = _")
|
90
|
+
Pad.obj.should == :foo
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'should set an ivar on an object' do
|
95
|
+
o = Object.new
|
96
|
+
pry_eval(o, "@x = 10")
|
97
|
+
o.instance_variable_get(:@x).should == 10
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'should display error if Pry instance runs out of input' do
|
101
|
+
redirect_pry_io(StringIO.new, @str_output) do
|
102
|
+
Pry.start
|
103
|
+
end
|
104
|
+
@str_output.string.should =~ /Error: Pry ran out of things to read/
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'should make self evaluate to the receiver of the rep session' do
|
108
|
+
o = :john
|
109
|
+
pry_eval(o, "self").should == o
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'should define a nested class under Hello and not on top-level or Pry' do
|
113
|
+
mock_pry(Pry.binding_for(Hello), "class Nested", "end")
|
114
|
+
Hello.const_defined?(:Nested).should == true
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'should suppress output if input ends in a ";" and is an Exception object (single line)' do
|
118
|
+
mock_pry("Exception.new;").should == ""
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'should suppress output if input ends in a ";" (single line)' do
|
122
|
+
mock_pry("x = 5;").should == ""
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'should be able to evaluate exceptions normally' do
|
126
|
+
was_called = false
|
127
|
+
mock_pry("RuntimeError.new", :exception_handler => proc{ was_called = true })
|
128
|
+
was_called.should == false
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'should notice when exceptions are raised' do
|
132
|
+
was_called = false
|
133
|
+
mock_pry("raise RuntimeError", :exception_handler => proc{ was_called = true })
|
134
|
+
was_called.should == true
|
135
|
+
end
|
136
|
+
|
137
|
+
it 'should not try to catch intended exceptions' do
|
138
|
+
lambda { mock_pry("raise SystemExit") }.should.raise SystemExit
|
139
|
+
# SIGTERM
|
140
|
+
lambda { mock_pry("raise SignalException.new(15)") }.should.raise SignalException
|
141
|
+
end
|
142
|
+
|
143
|
+
describe "multi-line input" do
|
144
|
+
it "works" do
|
145
|
+
mock_pry('x = ', '1 + 4').should =~ /5/
|
146
|
+
end
|
147
|
+
|
148
|
+
it 'should suppress output if input ends in a ";" (multi-line)' do
|
149
|
+
mock_pry('def self.blah', ':test', 'end;').should == ''
|
150
|
+
end
|
151
|
+
|
152
|
+
describe "newline stripping from an empty string" do
|
153
|
+
it "with double quotes" do
|
154
|
+
mock_pry('"', '"').should =~ %r|"\\n"|
|
155
|
+
mock_pry('"', "\n", "\n", "\n", '"').should =~ %r|"\\n\\n\\n\\n"|
|
156
|
+
end
|
157
|
+
|
158
|
+
it "with single quotes" do
|
159
|
+
mock_pry("'", "'").should =~ %r|"\\n"|
|
160
|
+
mock_pry("'", "\n", "\n", "\n", "'").should =~ %r|"\\n\\n\\n\\n"|
|
161
|
+
end
|
162
|
+
|
163
|
+
it "with fancy delimiters" do
|
164
|
+
mock_pry('%(', ')').should =~ %r|"\\n"|
|
165
|
+
mock_pry('%|', "\n", "\n", '|').should =~ %r|"\\n\\n\\n"|
|
166
|
+
mock_pry('%q[', "\n", "\n", ']').should =~ %r|"\\n\\n\\n"|
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
describe "newline stripping from an empty regexp" do
|
171
|
+
it "with regular regexp delimiters" do
|
172
|
+
mock_pry('/', '/').should =~ %r{/\n/}
|
173
|
+
end
|
174
|
+
|
175
|
+
it "with fancy delimiters" do
|
176
|
+
mock_pry('%r{', "\n", "\n", '}').should =~ %r{/\n\n\n/}
|
177
|
+
mock_pry('%r<', "\n", '>').should =~ %r{/\n\n/}
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
describe "newline from an empty heredoc" do
|
182
|
+
it "works" do
|
183
|
+
mock_pry('<<HERE', 'HERE').should =~ %r|""|
|
184
|
+
mock_pry("<<'HERE'", "\n", 'HERE').should =~ %r|"\\n"|
|
185
|
+
mock_pry("<<-'HERE'", "\n", "\n", 'HERE').should =~ %r|"\\n\\n"|
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
describe "repl" do
|
192
|
+
describe "basic functionality" do
|
193
|
+
it 'should set an ivar on an object and exit the repl' do
|
194
|
+
input_strings = ["@x = 10", "exit-all"]
|
195
|
+
input = InputTester.new(*input_strings)
|
196
|
+
|
197
|
+
o = Object.new
|
198
|
+
|
199
|
+
pry_tester = Pry.start(o, :input => input, :output => StringIO.new)
|
200
|
+
|
201
|
+
o.instance_variable_get(:@x).should == 10
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
describe "complete_expression?" do
|
206
|
+
it "should not mutate the input!" do
|
207
|
+
clean = "puts <<-FOO\nhi\nFOO\n"
|
208
|
+
a = clean.dup
|
209
|
+
Pry::Code.complete_expression?(a)
|
210
|
+
a.should == clean
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
describe "history arrays" do
|
215
|
+
it 'sets _ to the last result' do
|
216
|
+
t = pry_tester
|
217
|
+
t.eval ":foo"
|
218
|
+
t.eval("_").should == :foo
|
219
|
+
t.eval "42"
|
220
|
+
t.eval("_").should == 42
|
221
|
+
end
|
222
|
+
|
223
|
+
it 'sets out to an array with the result' do
|
224
|
+
t = pry_tester
|
225
|
+
t.eval ":foo"
|
226
|
+
t.eval "42"
|
227
|
+
res = t.eval "_out_"
|
228
|
+
|
229
|
+
res.should.be.kind_of Pry::HistoryArray
|
230
|
+
res[1..2].should == [:foo, 42]
|
231
|
+
end
|
232
|
+
|
233
|
+
it 'sets _in_ to an array with the entered lines' do
|
234
|
+
t = pry_tester
|
235
|
+
t.eval ":foo"
|
236
|
+
t.eval "42"
|
237
|
+
res = t.eval "_in_"
|
238
|
+
|
239
|
+
res.should.be.kind_of Pry::HistoryArray
|
240
|
+
res[1..2].should == [":foo\n", "42\n"]
|
241
|
+
end
|
242
|
+
|
243
|
+
it 'uses 100 as the size of _in_ and _out_' do
|
244
|
+
pry_tester.eval("[_in_.max_size, _out_.max_size]").should == [100, 100]
|
245
|
+
end
|
246
|
+
|
247
|
+
it 'can change the size of the history arrays' do
|
248
|
+
pry_tester(:memory_size => 1000).eval("[_out_, _in_].map(&:max_size)").should == [1000, 1000]
|
249
|
+
end
|
250
|
+
|
251
|
+
it 'store exceptions' do
|
252
|
+
mock_pry("foo!", "Pad.in = _in_[-1]; Pad.out = _out_[-1]")
|
253
|
+
|
254
|
+
Pad.in.should == "foo!\n"
|
255
|
+
Pad.out.should.be.kind_of NoMethodError
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
259
|
+
describe "last_result" do
|
260
|
+
it "should be set to the most recent value" do
|
261
|
+
pry_eval("2", "_ + 82").should == 84
|
262
|
+
end
|
263
|
+
|
264
|
+
# This test needs mock_pry because the command retvals work by
|
265
|
+
# replacing the eval_string, so _ won't be modified without Pry doing
|
266
|
+
# a REPL loop.
|
267
|
+
it "should be set to the result of a command with :keep_retval" do
|
268
|
+
Pry::Commands.block_command '++', '', :keep_retval => true do |a|
|
269
|
+
a.to_i + 1
|
270
|
+
end
|
271
|
+
|
272
|
+
mock_pry('++ 86', '++ #{_}').should =~ /88/
|
273
|
+
end
|
274
|
+
|
275
|
+
it "should be preserved over an empty line" do
|
276
|
+
pry_eval("2 + 2", " ", "\t", " ", "_ + 92").should == 96
|
277
|
+
end
|
278
|
+
|
279
|
+
it "should be preserved when evalling a command without :keep_retval" do
|
280
|
+
pry_eval("2 + 2", "ls -l", "_ + 96").should == 100
|
281
|
+
end
|
282
|
+
end
|
283
|
+
|
284
|
+
describe "nesting" do
|
285
|
+
after do
|
286
|
+
Pry.reset_defaults
|
287
|
+
Pry.color = false
|
288
|
+
end
|
289
|
+
|
290
|
+
it 'should nest properly' do
|
291
|
+
Pry.input = InputTester.new("cd 1", "cd 2", "cd 3", "\"nest:\#\{(_pry_.binding_stack.size - 1)\}\"", "exit-all")
|
292
|
+
|
293
|
+
Pry.output = @str_output
|
294
|
+
|
295
|
+
o = Object.new
|
296
|
+
|
297
|
+
pry_tester = o.pry
|
298
|
+
@str_output.string.should =~ /nest:3/
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
describe "defining methods" do
|
303
|
+
it 'should define a method on the singleton class of an object when performing "def meth;end" inside the object' do
|
304
|
+
[Object.new, {}, []].each do |val|
|
305
|
+
pry_eval(val, 'def hello; end')
|
306
|
+
val.methods(false).map(&:to_sym).include?(:hello).should == true
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
it 'should define an instance method on the module when performing "def meth;end" inside the module' do
|
311
|
+
hello = Module.new
|
312
|
+
pry_eval(hello, "def hello; end")
|
313
|
+
hello.instance_methods(false).map(&:to_sym).include?(:hello).should == true
|
314
|
+
end
|
315
|
+
|
316
|
+
it 'should define an instance method on the class when performing "def meth;end" inside the class' do
|
317
|
+
hello = Class.new
|
318
|
+
pry_eval(hello, "def hello; end")
|
319
|
+
hello.instance_methods(false).map(&:to_sym).include?(:hello).should == true
|
320
|
+
end
|
321
|
+
|
322
|
+
it 'should define a method on the class of an object when performing "def meth;end" inside an immediate value or Numeric' do
|
323
|
+
# should include float in here, but test fails for some reason
|
324
|
+
# on 1.8.7, no idea why!
|
325
|
+
[:test, 0, true, false, nil].each do |val|
|
326
|
+
pry_eval(val, "def hello; end");
|
327
|
+
val.class.instance_methods(false).map(&:to_sym).include?(:hello).should == true
|
328
|
+
end
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
describe "Object#pry" do
|
333
|
+
|
334
|
+
after do
|
335
|
+
Pry.reset_defaults
|
336
|
+
Pry.color = false
|
337
|
+
end
|
338
|
+
|
339
|
+
it "should start a pry session on the receiver (first form)" do
|
340
|
+
Pry.input = InputTester.new("self", "exit-all")
|
341
|
+
|
342
|
+
str_output = StringIO.new
|
343
|
+
Pry.output = str_output
|
344
|
+
|
345
|
+
20.pry
|
346
|
+
|
347
|
+
str_output.string.should =~ /20/
|
348
|
+
end
|
349
|
+
|
350
|
+
it "should start a pry session on the receiver (second form)" do
|
351
|
+
Pry.input = InputTester.new("self", "exit-all")
|
352
|
+
|
353
|
+
str_output = StringIO.new
|
354
|
+
Pry.output = str_output
|
355
|
+
|
356
|
+
pry 20
|
357
|
+
|
358
|
+
str_output.string.should =~ /20/
|
359
|
+
end
|
360
|
+
|
361
|
+
it "should raise if more than two arguments are passed to Object#pry" do
|
362
|
+
lambda { pry(20, :quiet, :input => Readline) }.should.raise ArgumentError
|
363
|
+
end
|
364
|
+
end
|
365
|
+
|
366
|
+
describe "Pry.binding_for" do
|
367
|
+
it 'should return TOPLEVEL_BINDING if parameter self is main' do
|
368
|
+
_main_ = lambda { TOPLEVEL_BINDING.eval('self') }
|
369
|
+
Pry.binding_for(_main_.call).is_a?(Binding).should == true
|
370
|
+
Pry.binding_for(_main_.call).should == TOPLEVEL_BINDING
|
371
|
+
Pry.binding_for(_main_.call).should == Pry.binding_for(_main_.call)
|
372
|
+
end
|
373
|
+
end
|
374
|
+
end
|
375
|
+
end
|
376
|
+
|
377
|
+
describe 'setting custom options' do
|
378
|
+
it 'should not raise for unrecognized options' do
|
379
|
+
should.not.raise?(NoMethodError) {
|
380
|
+
instance = Pry.new(:custom_option => 'custom value')
|
381
|
+
}
|
382
|
+
end
|
383
|
+
end
|
384
|
+
|
385
|
+
describe "a fresh instance" do
|
386
|
+
it "should use `caller` as its backtrace" do
|
387
|
+
location = "#{__FILE__}:#{__LINE__ + 1}"
|
388
|
+
backtrace = Pry.new.backtrace
|
389
|
+
|
390
|
+
backtrace.should.not.be.nil
|
391
|
+
backtrace.any? { |l| l.include?(location) }.should.be.true
|
392
|
+
end
|
393
|
+
end
|
394
|
+
end
|