pry 0.10.2-i386-mingw32 → 1.0.0.pre1-i386-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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,27 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe "exit-all" do
|
4
|
+
before { @pry = Pry.new }
|
5
|
+
|
6
|
+
it "should break out of the repl and return nil" do
|
7
|
+
@pry.eval("exit-all").should.be.false
|
8
|
+
@pry.exit_value.should.be.nil
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should break out of the repl wth a user specified value" do
|
12
|
+
@pry.eval("exit-all 'message'").should.be.false
|
13
|
+
@pry.exit_value.should == "message"
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should break out of the repl even if multiple bindings still on stack" do
|
17
|
+
["cd 1", "cd 2"].each { |line| @pry.eval(line).should.be.true }
|
18
|
+
@pry.eval("exit-all 'message'").should.be.false
|
19
|
+
@pry.exit_value.should == "message"
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should have empty binding_stack after breaking out of the repl" do
|
23
|
+
["cd 1", "cd 2"].each { |line| @pry.eval(line).should.be.true }
|
24
|
+
@pry.eval("exit-all").should.be.false
|
25
|
+
@pry.binding_stack.should.be.empty
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe "exit-program" do
|
4
|
+
it 'should raise SystemExit' do
|
5
|
+
proc {
|
6
|
+
pry_eval('exit-program')
|
7
|
+
}.should.raise SystemExit
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'should exit the program with the provided value' do
|
11
|
+
begin
|
12
|
+
pry_eval 'exit-program 66'
|
13
|
+
rescue SystemExit => e
|
14
|
+
e.status.should == 66
|
15
|
+
else
|
16
|
+
raise "Failed to raise SystemExit"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe "exit" do
|
4
|
+
before { @pry = Pry.new(:target => :outer, :output => StringIO.new) }
|
5
|
+
|
6
|
+
it "should pop a binding" do
|
7
|
+
@pry.eval "cd :inner"
|
8
|
+
@pry.evaluate_ruby("self").should == :inner
|
9
|
+
@pry.eval "exit"
|
10
|
+
@pry.evaluate_ruby("self").should == :outer
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should break out of the repl when binding_stack has only one binding" do
|
14
|
+
@pry.eval("exit").should.be.false
|
15
|
+
@pry.exit_value.should.be.nil
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should break out of the repl and return user-given value" do
|
19
|
+
@pry.eval("exit :john").should.be.false
|
20
|
+
@pry.exit_value.should == :john
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should break out of the repl even after an exception" do
|
24
|
+
@pry.eval "exit = 42"
|
25
|
+
@pry.output.string.should =~ /^SyntaxError/
|
26
|
+
@pry.eval("exit").should.be.false
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
# we turn off the test for MRI 1.8 because our source_location hack
|
4
|
+
# for C methods actually runs the methods - and since it runs ALL
|
5
|
+
# methods (in an attempt to find a match) it runs 'exit' and aborts
|
6
|
+
# the test, causing a failure. We should fix this in the future by
|
7
|
+
# blacklisting certain methods for 1.8 MRI (such as exit, fork, and so on)
|
8
|
+
unless Pry::Helpers::BaseHelpers.mri_18?
|
9
|
+
MyKlass = Class.new do
|
10
|
+
def hello
|
11
|
+
"timothy"
|
12
|
+
end
|
13
|
+
def goodbye
|
14
|
+
"jenny"
|
15
|
+
end
|
16
|
+
def tea_tim?
|
17
|
+
"timothy"
|
18
|
+
end
|
19
|
+
def tea_time?
|
20
|
+
"polly"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "find-method" do
|
25
|
+
describe "find matching methods by name regex (-n option)" do
|
26
|
+
it "should find a method by regex" do
|
27
|
+
pry_eval("find-method hell MyKlass").should =~
|
28
|
+
/MyKlass.*?hello/m
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should NOT match a method that does not match the regex" do
|
32
|
+
pry_eval("find-method hell MyKlass").should.not =~
|
33
|
+
/MyKlass.*?goodbye/m
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "find matching methods by content regex (-c option)" do
|
38
|
+
it "should find a method by regex" do
|
39
|
+
pry_eval("find-method -c timothy MyKlass").should =~
|
40
|
+
/MyKlass.*?hello/m
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should NOT match a method that does not match the regex" do
|
44
|
+
pry_eval("find-method timothy MyKlass").should.not =~
|
45
|
+
/MyKlass.*?goodbye/m
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should work with badly behaved constants" do
|
50
|
+
MyKlass::X = Object.new
|
51
|
+
def (MyKlass::X).hash
|
52
|
+
raise "mooo"
|
53
|
+
end
|
54
|
+
|
55
|
+
pry_eval("find-method -c timothy MyKlass").should =~
|
56
|
+
/MyKlass.*?hello/m
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should escape regexes correctly" do
|
60
|
+
good = /tea_time\?/
|
61
|
+
bad = /tea_tim\?/
|
62
|
+
pry_eval('find-method tea_time? MyKlass').should =~ good
|
63
|
+
pry_eval('find-method tea_time? MyKlass').should =~ good
|
64
|
+
pry_eval('find-method tea_time\? MyKlass').should.not =~ bad
|
65
|
+
pry_eval('find-method tea_time\? MyKlass').should =~ good
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
Object.remove_const(:MyKlass)
|
70
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe "gem-list" do
|
4
|
+
# fixing bug for 1.8 compat
|
5
|
+
it 'should not raise when invoked' do
|
6
|
+
proc {
|
7
|
+
pry_eval(self, 'gem-list')
|
8
|
+
}.should.not.raise
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should work arglessly' do
|
12
|
+
list = pry_eval('gem-list')
|
13
|
+
list.should =~ /slop \(/
|
14
|
+
list.should =~ /bacon \(/
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should find arg' do
|
18
|
+
prylist = pry_eval('gem-list slop')
|
19
|
+
prylist.should =~ /slop \(/
|
20
|
+
prylist.should.not =~ /bacon/
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should return non-results as silence' do
|
24
|
+
pry_eval('gem-list aoeuoueouaou').should.empty?
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# These tests are out of date.
|
2
|
+
# THey need to be updated for the new 'gist' API, but im too sleepy to
|
3
|
+
# do that now.
|
4
|
+
|
5
|
+
require 'helper'
|
6
|
+
|
7
|
+
describe 'gist' do
|
8
|
+
it 'has a dependency on the jist gem' do
|
9
|
+
Pry::Command::Gist.command_options[:requires_gem].should == "jist"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
# before do
|
14
|
+
# Pad.jist_calls = {}
|
15
|
+
# end
|
16
|
+
|
17
|
+
# # In absence of normal mocking, just monkeysmash these with no undoing after.
|
18
|
+
# module Jist
|
19
|
+
# class << self
|
20
|
+
# def login!; Pad.jist_calls[:login!] = true end
|
21
|
+
# def gist(*args)
|
22
|
+
# Pad.jist_calls[:gist_args] = args
|
23
|
+
# {'html_url' => 'http://gist.blahblah'}
|
24
|
+
# end
|
25
|
+
# def copy(content); Pad.jist_calls[:copy_args] = content end
|
26
|
+
# end
|
27
|
+
# end
|
28
|
+
|
29
|
+
# module Pry::Gist
|
30
|
+
# # a) The actual require fails for jruby for some odd reason.
|
31
|
+
# # b) 100% of jist should be stubbed by the above, so this ensures that.
|
32
|
+
# def self.require_jist; 'nope' end
|
33
|
+
# end
|
34
|
+
|
35
|
+
# it 'nominally logs in' do
|
36
|
+
# pry_eval 'gist --login'
|
37
|
+
# Pad.jist_calls[:login!].should.not.be.nil
|
38
|
+
# end
|
39
|
+
|
40
|
+
# EXAMPLE_REPL_METHOD = <<-EOT
|
41
|
+
# # docdoc
|
42
|
+
# def my_method
|
43
|
+
# # line 1
|
44
|
+
# 'line 2'
|
45
|
+
# line 3
|
46
|
+
# Line.four
|
47
|
+
# end
|
48
|
+
# EOT
|
49
|
+
|
50
|
+
# RANDOM_COUPLE_OF_LINES = %w(a=1 b=2)
|
51
|
+
# run_case = proc do |sym|
|
52
|
+
# actual_command = Pry::Gist.example_code(sym)
|
53
|
+
# pry_eval EXAMPLE_REPL_METHOD, RANDOM_COUPLE_OF_LINES, actual_command
|
54
|
+
# end
|
55
|
+
|
56
|
+
# it 'deduces filenames' do
|
57
|
+
# Pry::Gist::INVOCATIONS.keys.each do |e|
|
58
|
+
# run_case.call(e)
|
59
|
+
# if Pad.jist_calls[:gist_args]
|
60
|
+
# text, args = Pad.jist_calls[:gist_args]
|
61
|
+
# args[:filename].should.not == '(pry)'
|
62
|
+
# end
|
63
|
+
# Pad.jist_calls[:copy_args].should.not.be.nil
|
64
|
+
# end
|
65
|
+
# end
|
66
|
+
|
67
|
+
# it 'equates aliae' do
|
68
|
+
# run_case.call(:clipit).should == run_case.call(:cliponly)
|
69
|
+
# run_case.call(:jist).should == run_case.call(:class)
|
70
|
+
# end
|
71
|
+
|
72
|
+
# it 'has a reasonable --help' do
|
73
|
+
# help = pry_eval('gist --help')
|
74
|
+
# Pry::Gist::INVOCATIONS.keys.each do |e|
|
75
|
+
# help.should.include? Pry::Gist.example_code(e)
|
76
|
+
# help.should.include? Pry::Gist.example_description(e)
|
77
|
+
# end
|
78
|
+
# end
|
79
|
+
# end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe "help" do
|
4
|
+
before do
|
5
|
+
@oldset = Pry.config.commands
|
6
|
+
@set = Pry.config.commands = Pry::CommandSet.new do
|
7
|
+
import Pry::Commands
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
after do
|
12
|
+
Pry.config.commands = @oldset
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should display help for a specific command' do
|
16
|
+
pry_eval('help ls').should =~ /Usage: ls/
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should display help for a regex command with a "listing"' do
|
20
|
+
@set.command /bar(.*)/, "Test listing", :listing => "foo" do; end
|
21
|
+
pry_eval('help foo').should =~ /Test listing/
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should display help for a command with a spaces in its name' do
|
25
|
+
@set.command "cmd with spaces", "desc of a cmd with spaces" do; end
|
26
|
+
pry_eval('help "cmd with spaces"').should =~ /desc of a cmd with spaces/
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should display help for all commands with a description' do
|
30
|
+
@set.command /bar(.*)/, "Test listing", :listing => "foo" do; end
|
31
|
+
@set.command "b", "description for b", :listing => "foo" do; end
|
32
|
+
@set.command "c" do;end
|
33
|
+
@set.command "d", "" do;end
|
34
|
+
|
35
|
+
output = pry_eval('help')
|
36
|
+
output.should =~ /Test listing/
|
37
|
+
output.should =~ /description for b/
|
38
|
+
output.should =~ /No description/
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should sort the output of the 'help' command" do
|
42
|
+
@set.command 'faa', "Fooerizes" do; end
|
43
|
+
@set.command 'gaa', "Gooerizes" do; end
|
44
|
+
@set.command 'maa', "Mooerizes" do; end
|
45
|
+
@set.command 'baa', "Booerizes" do; end
|
46
|
+
|
47
|
+
doc = pry_eval('help')
|
48
|
+
|
49
|
+
order = [doc.index("baa"),
|
50
|
+
doc.index("faa"),
|
51
|
+
doc.index("gaa"),
|
52
|
+
doc.index("maa")]
|
53
|
+
|
54
|
+
order.should == order.sort
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,172 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe "hist" do
|
4
|
+
before do
|
5
|
+
Pry.history.clear
|
6
|
+
@hist = Pry.history
|
7
|
+
|
8
|
+
@str_output = StringIO.new
|
9
|
+
@t = pry_tester :history => @hist do
|
10
|
+
# For looking at what hist pushes into the input stack. The
|
11
|
+
# implementation of this helper will definitely have to change at some
|
12
|
+
# point.
|
13
|
+
def next_input
|
14
|
+
@pry.input.string
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should display the correct history' do
|
20
|
+
@hist.push "hello"
|
21
|
+
@hist.push "world"
|
22
|
+
|
23
|
+
@t.eval('hist').should =~ /hello\n.*world/
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should replay history correctly (single item)' do
|
27
|
+
o = Object.new
|
28
|
+
@hist.push "@x = 10"
|
29
|
+
@hist.push "@y = 20"
|
30
|
+
@hist.push "@z = 30"
|
31
|
+
|
32
|
+
@t.push_binding o
|
33
|
+
@t.eval 'hist --replay -1'
|
34
|
+
|
35
|
+
o.instance_variable_get(:@z).should == 30
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should replay a range of history correctly (range of items)' do
|
39
|
+
o = Object.new
|
40
|
+
@hist.push "@x = 10"
|
41
|
+
@hist.push "@y = 20"
|
42
|
+
|
43
|
+
@t.push_binding o
|
44
|
+
@t.eval 'hist --replay 0..2'
|
45
|
+
@t.eval('[@x, @y]').should == [10, 20]
|
46
|
+
end
|
47
|
+
|
48
|
+
# this is to prevent a regression where input redirection is
|
49
|
+
# replaced by just appending to `eval_string`
|
50
|
+
it 'should replay a range of history correctly (range of commands)' do
|
51
|
+
o = Object.new
|
52
|
+
@hist.push "cd 1"
|
53
|
+
@hist.push "cd 2"
|
54
|
+
|
55
|
+
@t.eval("hist --replay 0..2")
|
56
|
+
stack = @t.eval("Pad.stack = _pry_.binding_stack.dup")
|
57
|
+
stack.map{ |b| b.eval("self") }.should == [TOPLEVEL_BINDING.eval("self"), 1, 2]
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should grep for correct lines in history' do
|
61
|
+
@hist.push "abby"
|
62
|
+
@hist.push "box"
|
63
|
+
@hist.push "button"
|
64
|
+
@hist.push "pepper"
|
65
|
+
@hist.push "orange"
|
66
|
+
@hist.push "grape"
|
67
|
+
@hist.push "def blah 1"
|
68
|
+
@hist.push "def boink 2"
|
69
|
+
@hist.push "place holder"
|
70
|
+
|
71
|
+
@t.eval('hist --grep o').should =~ /\d:.*?box\n\d:.*?button\n\d:.*?orange/
|
72
|
+
|
73
|
+
# test more than one word in a regex match (def blah)
|
74
|
+
@t.eval('hist --grep def blah').should =~ /def blah 1/
|
75
|
+
|
76
|
+
# test more than one word with leading white space in a regex match (def boink)
|
77
|
+
@t.eval('hist --grep def boink').should =~ /def boink 2/
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'should return last N lines in history with --tail switch' do
|
81
|
+
("a".."z").each do |v|
|
82
|
+
@hist.push v
|
83
|
+
end
|
84
|
+
|
85
|
+
out = @t.eval 'hist --tail 3'
|
86
|
+
out.each_line.count.should == 3
|
87
|
+
out.should =~ /x\n\d+:.*y\n\d+:.*z/
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'should apply --tail after --grep' do
|
91
|
+
@hist.push "print 1"
|
92
|
+
@hist.push "print 2"
|
93
|
+
@hist.push "puts 3"
|
94
|
+
@hist.push "print 4"
|
95
|
+
@hist.push "puts 5"
|
96
|
+
|
97
|
+
out = @t.eval 'hist --tail 2 --grep print'
|
98
|
+
out.each_line.count.should == 2
|
99
|
+
out.should =~ /\d:.*?print 2\n\d:.*?print 4/
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'should apply --head after --grep' do
|
103
|
+
@hist.push "puts 1"
|
104
|
+
@hist.push "print 2"
|
105
|
+
@hist.push "puts 3"
|
106
|
+
@hist.push "print 4"
|
107
|
+
@hist.push "print 5"
|
108
|
+
|
109
|
+
out = @t.eval 'hist --head 2 --grep print'
|
110
|
+
out.each_line.count.should == 2
|
111
|
+
out.should =~ /\d:.*?print 2\n\d:.*?print 4/
|
112
|
+
end
|
113
|
+
|
114
|
+
# strangeness in this test is due to bug in Readline::HISTORY not
|
115
|
+
# always registering first line of input
|
116
|
+
it 'should return first N lines in history with --head switch' do
|
117
|
+
("a".."z").each do |v|
|
118
|
+
@hist.push v
|
119
|
+
end
|
120
|
+
|
121
|
+
out = @t.eval 'hist --head 4'
|
122
|
+
out.each_line.count.should == 4
|
123
|
+
out.should =~ /a\n\d+:.*b\n\d+:.*c/
|
124
|
+
end
|
125
|
+
|
126
|
+
# strangeness in this test is due to bug in Readline::HISTORY not
|
127
|
+
# always registering first line of input
|
128
|
+
it 'should show lines between lines A and B with the --show switch' do
|
129
|
+
("a".."z").each do |v|
|
130
|
+
@hist.push v
|
131
|
+
end
|
132
|
+
|
133
|
+
out = @t.eval 'hist --show 1..4'
|
134
|
+
out.each_line.count.should == 4
|
135
|
+
out.should =~ /b\n\d+:.*c\n\d+:.*d/
|
136
|
+
end
|
137
|
+
|
138
|
+
it "should store a call with `--replay` flag" do
|
139
|
+
@t.eval ":banzai"
|
140
|
+
@t.eval "hist --replay 1"
|
141
|
+
@t.eval("hist").should =~ /hist --replay 1/
|
142
|
+
end
|
143
|
+
|
144
|
+
it "should not contain lines produced by `--replay` flag" do
|
145
|
+
@t.eval ":banzai"
|
146
|
+
@t.eval ":geronimo"
|
147
|
+
@t.eval ":huzzah"
|
148
|
+
@t.eval("hist --replay 1..3")
|
149
|
+
|
150
|
+
output = @t.eval("hist")
|
151
|
+
output.should == "1: :banzai\n2: :geronimo\n3: :huzzah\n4: hist --replay 1..3\n"
|
152
|
+
end
|
153
|
+
|
154
|
+
it "should raise CommandError when index of `--replay` points out to another `hist --replay`" do
|
155
|
+
@t.eval ":banzai"
|
156
|
+
@t.eval "hist --replay 1"
|
157
|
+
lambda do
|
158
|
+
@t.eval "hist --replay 2"
|
159
|
+
end.should.raise(Pry::CommandError, /Replay index 4 points out to another replay call: `hist --replay 1`/)
|
160
|
+
end
|
161
|
+
|
162
|
+
it "should disallow execution of `--replay <i>` when CommandError raised" do
|
163
|
+
@t.eval "a = 0"
|
164
|
+
@t.eval "a += 1"
|
165
|
+
@t.eval "hist --replay 2"
|
166
|
+
lambda{
|
167
|
+
@t.eval "hist --replay 3"
|
168
|
+
}.should.raise(Pry::CommandError)
|
169
|
+
@t.eval("a").should == 2
|
170
|
+
@t.eval("hist").lines.to_a.size.should == 5
|
171
|
+
end
|
172
|
+
end
|