pry 0.8.4pre1-i386-mingw32 → 0.9.0-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/.gitignore +1 -0
- data/CHANGELOG +25 -6
- data/README.markdown +11 -4
- data/Rakefile +15 -19
- data/TODO +28 -2
- data/bin/pry +28 -11
- data/examples/example_basic.rb +2 -4
- data/examples/example_command_override.rb +2 -5
- data/examples/example_commands.rb +1 -4
- data/examples/example_hooks.rb +2 -5
- data/examples/example_image_edit.rb +4 -8
- data/examples/example_input.rb +1 -4
- data/examples/example_input2.rb +1 -4
- data/examples/example_output.rb +1 -4
- data/examples/example_print.rb +2 -5
- data/examples/example_prompt.rb +2 -5
- data/examples/helper.rb +6 -0
- data/lib/pry.rb +59 -3
- data/lib/pry/command_context.rb +10 -9
- data/lib/pry/command_processor.rb +51 -73
- data/lib/pry/command_set.rb +79 -28
- data/lib/pry/commands.rb +9 -123
- data/lib/pry/completion.rb +30 -29
- data/lib/pry/config.rb +100 -0
- data/lib/pry/default_commands/basic.rb +37 -0
- data/lib/pry/default_commands/context.rb +16 -15
- data/lib/pry/default_commands/documentation.rb +73 -54
- data/lib/pry/default_commands/easter_eggs.rb +1 -20
- data/lib/pry/default_commands/gems.rb +31 -40
- data/lib/pry/default_commands/input.rb +223 -15
- data/lib/pry/default_commands/introspection.rb +108 -73
- data/lib/pry/default_commands/ls.rb +25 -11
- data/lib/pry/default_commands/shell.rb +29 -39
- data/lib/pry/extended_commands/experimental.rb +17 -0
- data/lib/pry/extended_commands/user_command_api.rb +22 -0
- data/lib/pry/helpers.rb +1 -0
- data/lib/pry/helpers/base_helpers.rb +15 -104
- data/lib/pry/helpers/command_helpers.rb +96 -59
- data/lib/pry/helpers/text.rb +83 -0
- data/lib/pry/history_array.rb +105 -0
- data/lib/pry/plugins.rb +79 -0
- data/lib/pry/pry_class.rb +102 -114
- data/lib/pry/pry_instance.rb +123 -55
- data/lib/pry/version.rb +1 -1
- data/pry.gemspec +45 -0
- data/test/helper.rb +57 -7
- data/test/test_command_processor.rb +205 -0
- data/test/{test_commandset.rb → test_command_set.rb} +18 -12
- data/test/test_default_commands.rb +59 -0
- data/test/test_default_commands/test_context.rb +64 -0
- data/test/test_default_commands/test_documentation.rb +31 -0
- data/test/test_default_commands/test_gems.rb +14 -0
- data/test/test_default_commands/test_input.rb +327 -0
- data/test/test_default_commands/test_introspection.rb +155 -0
- data/test/test_history_array.rb +65 -0
- data/test/test_pry.rb +548 -313
- metadata +48 -15
- data/lib/pry/hooks.rb +0 -17
- data/lib/pry/print.rb +0 -16
- data/lib/pry/prompts.rb +0 -31
@@ -0,0 +1,205 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe "Pry::CommandProcessor" do
|
4
|
+
before do
|
5
|
+
@pry = Pry.new
|
6
|
+
@pry.commands = Pry::CommandSet.new
|
7
|
+
@command_processor = Pry::CommandProcessor.new(@pry)
|
8
|
+
end
|
9
|
+
|
10
|
+
after do
|
11
|
+
@pry.commands = Pry::CommandSet.new
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should accurately determine if a command is valid' do
|
15
|
+
@pry.commands.command("test-command") {}
|
16
|
+
valid = @command_processor.valid_command? "test-command"
|
17
|
+
valid.should == true
|
18
|
+
|
19
|
+
valid = @command_processor.valid_command? "blah"
|
20
|
+
valid.should == false
|
21
|
+
|
22
|
+
|
23
|
+
a = "test-command"
|
24
|
+
|
25
|
+
# not passing in a binding so 'a' shouldn't exist and no command
|
26
|
+
# will be matched
|
27
|
+
valid = @command_processor.valid_command?('#{a}')
|
28
|
+
valid.should == false
|
29
|
+
|
30
|
+
# passing in the optional binding (against which interpolation is performed)
|
31
|
+
valid = @command_processor.valid_command? '#{a}', binding
|
32
|
+
valid.should == true
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should correctly match a simple string command' do
|
36
|
+
@pry.commands.command("test-command") {}
|
37
|
+
command, captures, pos = @command_processor.command_matched "test-command", binding
|
38
|
+
|
39
|
+
command.name.should == "test-command"
|
40
|
+
captures.should == []
|
41
|
+
pos.should == "test-command".length
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should correctly match a simple string command with parameters' do
|
45
|
+
@pry.commands.command("test-command") { |arg|}
|
46
|
+
command, captures, pos = @command_processor.command_matched "test-command hello", binding
|
47
|
+
|
48
|
+
command.name.should == "test-command"
|
49
|
+
captures.should == []
|
50
|
+
pos.should == "test-command".length
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'should not match when the relevant command does not exist' do
|
54
|
+
command, captures, pos = @command_processor.command_matched "test-command", binding
|
55
|
+
|
56
|
+
command.should == nil
|
57
|
+
captures.should == nil
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should correctly match a regex command' do
|
61
|
+
@pry.commands.command(/rue(.?)/) { }
|
62
|
+
command, captures, pos = @command_processor.command_matched "rue hello", binding
|
63
|
+
|
64
|
+
command.name.should == /rue(.?)/
|
65
|
+
captures.should == [""]
|
66
|
+
pos.should == 3
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'should correctly match a regex command and extract the capture groups' do
|
70
|
+
@pry.commands.command(/rue(.?)/) { }
|
71
|
+
command, captures, pos = @command_processor.command_matched "rue5 hello", binding
|
72
|
+
|
73
|
+
command.name.should == /rue(.?)/
|
74
|
+
captures.should == ["5"]
|
75
|
+
pos.should == 4
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'should correctly match a string command with spaces in its name' do
|
79
|
+
@pry.commands.command("test command") {}
|
80
|
+
command, captures, pos = @command_processor.command_matched "test command", binding
|
81
|
+
|
82
|
+
command.name.should == "test command"
|
83
|
+
captures.should == []
|
84
|
+
pos.should == command.name.length
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'should correctly match a string command with spaces in its name with parameters' do
|
88
|
+
@pry.commands.command("test command") {}
|
89
|
+
command, captures, pos = @command_processor.command_matched "test command param1 param2", binding
|
90
|
+
|
91
|
+
command.name.should == "test command"
|
92
|
+
captures.should == []
|
93
|
+
pos.should == command.name.length
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'should correctly match a regex command with spaces in its name' do
|
97
|
+
regex_command_name = /test\s+(.+)\s+command/
|
98
|
+
@pry.commands.command(regex_command_name) {}
|
99
|
+
|
100
|
+
sample_text = "test friendship command"
|
101
|
+
command, captures, pos = @command_processor.command_matched sample_text, binding
|
102
|
+
|
103
|
+
command.name.should == regex_command_name
|
104
|
+
captures.should == ["friendship"]
|
105
|
+
pos.should == sample_text.size
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'should correctly match a complex regex command' do
|
109
|
+
regex_command_name = /\.(.*)/
|
110
|
+
@pry.commands.command(regex_command_name) {}
|
111
|
+
|
112
|
+
sample_text = ".cd ~/pry"
|
113
|
+
command, captures, pos = @command_processor.command_matched sample_text, binding
|
114
|
+
|
115
|
+
command.name.should == regex_command_name
|
116
|
+
captures.should == ["cd ~/pry"]
|
117
|
+
pos.should == sample_text.size
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'should correctly match a command whose name is interpolated' do
|
121
|
+
@pry.commands.command("blah") {}
|
122
|
+
a = "bl"
|
123
|
+
b = "ah"
|
124
|
+
command, captures, pos = @command_processor.command_matched '#{a}#{b}', binding
|
125
|
+
|
126
|
+
command.name.should == "blah"
|
127
|
+
captures.should == []
|
128
|
+
pos.should == command.name.length
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'should correctly match a regex command and interpolation should not break the regex' do
|
132
|
+
regex_command_name = /blah(\d)/
|
133
|
+
@pry.commands.command(regex_command_name) {}
|
134
|
+
|
135
|
+
sample_text = "blah5"
|
136
|
+
a = "5"
|
137
|
+
command, captures, pos = @command_processor.command_matched 'blah#{a}', binding
|
138
|
+
|
139
|
+
command.name.should == regex_command_name
|
140
|
+
captures.should == ["5"]
|
141
|
+
pos.should == sample_text.size
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'should NOT match a regex command that is interpolated when :interpolate => false' do
|
145
|
+
regex_command_name = /blah(\d)/
|
146
|
+
@pry.commands.command(regex_command_name, "", :interpolate => false) {}
|
147
|
+
|
148
|
+
sample_text = "blah5"
|
149
|
+
a = "5"
|
150
|
+
command, captures, pos = @command_processor.command_matched 'blah#{a}', binding
|
151
|
+
|
152
|
+
command.should == nil
|
153
|
+
end
|
154
|
+
|
155
|
+
it 'should correctly match a regex command and interpolation should not break the regex where entire regex command is interpolated' do
|
156
|
+
regex_command_name = /blah(\d)/
|
157
|
+
@pry.commands.command(regex_command_name) {}
|
158
|
+
|
159
|
+
sample_text = "blah5"
|
160
|
+
a = "bl"
|
161
|
+
b = "ah"
|
162
|
+
c = "5"
|
163
|
+
|
164
|
+
command, captures, pos = @command_processor.command_matched '#{a}#{b}#{c}', binding
|
165
|
+
|
166
|
+
command.name.should == regex_command_name
|
167
|
+
captures.should == ["5"]
|
168
|
+
pos.should == sample_text.size
|
169
|
+
end
|
170
|
+
|
171
|
+
it 'should NOT match a regex command where entire regex command is interpolated and :interpolate => false' do
|
172
|
+
regex_command_name = /blah(\d)/
|
173
|
+
@pry.commands.command(regex_command_name, "", :interpolate => false) {}
|
174
|
+
|
175
|
+
sample_text = "blah5"
|
176
|
+
a = "bl"
|
177
|
+
b = "ah"
|
178
|
+
c = "5"
|
179
|
+
|
180
|
+
command, captures, pos = @command_processor.command_matched '#{a}#{b}#{c}', binding
|
181
|
+
command.should == nil
|
182
|
+
end
|
183
|
+
|
184
|
+
it 'should NOT match a command whose name is interpolated when :interpolate => false' do
|
185
|
+
@pry.commands.command("boast", "", :interpolate => false) {}
|
186
|
+
a = "boa"
|
187
|
+
b = "st"
|
188
|
+
|
189
|
+
# remember to use '' instead of "" when testing interpolation or
|
190
|
+
# you'll cause yourself incredible confusion
|
191
|
+
command, captures, pos = @command_processor.command_matched '#{a}#{b}', binding
|
192
|
+
|
193
|
+
command.should == nil
|
194
|
+
end
|
195
|
+
|
196
|
+
|
197
|
+
it 'commands that have :interpolate => false should not be interpolated (interpolate_string should *not* be called)' do
|
198
|
+
@pry.commands.command("boast", "", :interpolate => false) {}
|
199
|
+
|
200
|
+
# remember to use '' instead of "" when testing interpolation or
|
201
|
+
# you'll cause yourself incredible confusion
|
202
|
+
lambda { @command_processor.command_matched('boast #{c}', binding) }.should.not.raise NameError
|
203
|
+
end
|
204
|
+
|
205
|
+
end
|
@@ -2,11 +2,7 @@ require 'helper'
|
|
2
2
|
|
3
3
|
describe Pry::CommandSet do
|
4
4
|
before do
|
5
|
-
@set = Pry::CommandSet.new
|
6
|
-
end
|
7
|
-
|
8
|
-
it 'should use the name specified at creation' do
|
9
|
-
@set.name.should == :some_name
|
5
|
+
@set = Pry::CommandSet.new
|
10
6
|
end
|
11
7
|
|
12
8
|
it 'should call the block used for the command when it is called' do
|
@@ -35,7 +31,7 @@ describe Pry::CommandSet do
|
|
35
31
|
@set.run_command true, 'foo'
|
36
32
|
end
|
37
33
|
|
38
|
-
it 'should raise an error when calling an undefined
|
34
|
+
it 'should raise an error when calling an undefined command' do
|
39
35
|
@set.command('foo') {}
|
40
36
|
lambda {
|
41
37
|
@set.run_command nil, 'bar'
|
@@ -54,7 +50,7 @@ describe Pry::CommandSet do
|
|
54
50
|
it 'should be able to import some commands from other sets' do
|
55
51
|
run = false
|
56
52
|
|
57
|
-
other_set = Pry::CommandSet.new
|
53
|
+
other_set = Pry::CommandSet.new do
|
58
54
|
command('foo') { run = true }
|
59
55
|
command('bar') {}
|
60
56
|
end
|
@@ -72,7 +68,7 @@ describe Pry::CommandSet do
|
|
72
68
|
it 'should be able to import a whole set' do
|
73
69
|
run = []
|
74
70
|
|
75
|
-
other_set = Pry::CommandSet.new
|
71
|
+
other_set = Pry::CommandSet.new do
|
76
72
|
command('foo') { run << true }
|
77
73
|
command('bar') { run << true }
|
78
74
|
end
|
@@ -88,7 +84,7 @@ describe Pry::CommandSet do
|
|
88
84
|
run = false
|
89
85
|
@set.command('foo') { run = true }
|
90
86
|
|
91
|
-
Pry::CommandSet.new(
|
87
|
+
Pry::CommandSet.new(@set).run_command nil, 'foo'
|
92
88
|
run.should == true
|
93
89
|
end
|
94
90
|
|
@@ -139,7 +135,7 @@ describe Pry::CommandSet do
|
|
139
135
|
Pry::CommandContext.new.should.not.respond_to :my_helper
|
140
136
|
end
|
141
137
|
|
142
|
-
it 'should not recreate a new
|
138
|
+
it 'should not recreate a new helper module when helpers is called' do
|
143
139
|
@set.command('foo') do
|
144
140
|
should.respond_to :my_helper
|
145
141
|
should.respond_to :my_other_helper
|
@@ -157,7 +153,7 @@ describe Pry::CommandSet do
|
|
157
153
|
end
|
158
154
|
|
159
155
|
it 'should import helpers from imported sets' do
|
160
|
-
imported_set = Pry::CommandSet.new
|
156
|
+
imported_set = Pry::CommandSet.new do
|
161
157
|
helpers do
|
162
158
|
def imported_helper_method; end
|
163
159
|
end
|
@@ -169,7 +165,7 @@ describe Pry::CommandSet do
|
|
169
165
|
end
|
170
166
|
|
171
167
|
it 'should import helpers even if only some commands are imported' do
|
172
|
-
imported_set = Pry::CommandSet.new
|
168
|
+
imported_set = Pry::CommandSet.new do
|
173
169
|
helpers do
|
174
170
|
def imported_helper_method; end
|
175
171
|
end
|
@@ -181,4 +177,14 @@ describe Pry::CommandSet do
|
|
181
177
|
@set.command('foo') { should.respond_to :imported_helper_method }
|
182
178
|
@set.run_command(Pry::CommandContext.new, 'foo')
|
183
179
|
end
|
180
|
+
|
181
|
+
it 'should provide a :listing for a command that defaults to its name' do
|
182
|
+
@set.command 'foo', "" do;end
|
183
|
+
@set.commands['foo'].options[:listing].should == 'foo'
|
184
|
+
end
|
185
|
+
|
186
|
+
it 'should provide a :listing for a command that differs from its name' do
|
187
|
+
@set.command 'foo', "", :listing => 'bar' do;end
|
188
|
+
@set.commands['foo'].options[:listing].should == 'bar'
|
189
|
+
end
|
184
190
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe "Pry::Commands" do
|
4
|
+
describe "help" do
|
5
|
+
it 'should display help for a specific command' do
|
6
|
+
str_output = StringIO.new
|
7
|
+
redirect_pry_io(InputTester.new("help ls", "exit-all"), str_output) do
|
8
|
+
pry
|
9
|
+
end
|
10
|
+
str_output.string.each_line.count.should == 1
|
11
|
+
str_output.string.should =~ /ls --help/
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should display help for a regex command with a "listing"' do
|
15
|
+
set = Pry::CommandSet.new do
|
16
|
+
command /bar(.*)/, "Test listing", :listing => "foo" do
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
str_output = StringIO.new
|
21
|
+
redirect_pry_io(InputTester.new("help foo"), str_output) do
|
22
|
+
Pry.new(:commands => set).rep
|
23
|
+
end
|
24
|
+
str_output.string.each_line.count.should == 1
|
25
|
+
str_output.string.should =~ /Test listing/
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should display help for a command with a spaces in its name' do
|
29
|
+
set = Pry::CommandSet.new do
|
30
|
+
command "command with spaces", "description of a command with spaces" do
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
str_output = StringIO.new
|
35
|
+
redirect_pry_io(InputTester.new("help \"command with spaces\""), str_output) do
|
36
|
+
Pry.new(:commands => set).rep
|
37
|
+
end
|
38
|
+
str_output.string.each_line.count.should == 1
|
39
|
+
str_output.string.should =~ /description of a command with spaces/
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'should display help for all commands with a description' do
|
43
|
+
set = Pry::CommandSet.new do
|
44
|
+
command /bar(.*)/, "Test listing", :listing => "foo" do; end
|
45
|
+
command "b", "description for b", :listing => "foo" do; end
|
46
|
+
command "c" do;end
|
47
|
+
command "d", "" do;end
|
48
|
+
end
|
49
|
+
|
50
|
+
str_output = StringIO.new
|
51
|
+
redirect_pry_io(InputTester.new("help"), str_output) do
|
52
|
+
Pry.new(:commands => set).rep
|
53
|
+
end
|
54
|
+
str_output.string.should =~ /Test listing/
|
55
|
+
str_output.string.should =~ /description for b/
|
56
|
+
str_output.string.should =~ /No description/
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe "Pry::DefaultCommands::Context" do
|
4
|
+
describe "cd" do
|
5
|
+
after do
|
6
|
+
$obj = nil
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should cd into simple input' do
|
10
|
+
b = Pry.binding_for(Object.new)
|
11
|
+
b.eval("x = :mon_ouie")
|
12
|
+
|
13
|
+
redirect_pry_io(InputTester.new("cd x", "$obj = self", "exit-all"), StringIO.new) do
|
14
|
+
b.pry
|
15
|
+
end
|
16
|
+
|
17
|
+
$obj.should == :mon_ouie
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should break out of session with cd ..' do
|
21
|
+
b = Pry.binding_for(:outer)
|
22
|
+
b.eval("x = :inner")
|
23
|
+
|
24
|
+
redirect_pry_io(InputTester.new("cd x", "$inner = self;", "cd ..", "$outer = self", "exit-all"), StringIO.new) do
|
25
|
+
b.pry
|
26
|
+
end
|
27
|
+
$inner.should == :inner
|
28
|
+
$outer.should == :outer
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should break out to outer-most session with cd /' do
|
32
|
+
b = Pry.binding_for(:outer)
|
33
|
+
b.eval("x = :inner")
|
34
|
+
|
35
|
+
redirect_pry_io(InputTester.new("cd x", "$inner = self;", "cd 5", "$five = self", "cd /", "$outer = self", "exit-all"), StringIO.new) do
|
36
|
+
b.pry
|
37
|
+
end
|
38
|
+
$inner.should == :inner
|
39
|
+
$five.should == 5
|
40
|
+
$outer.should == :outer
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should start a session on TOPLEVEL_BINDING with cd ::' do
|
44
|
+
b = Pry.binding_for(:outer)
|
45
|
+
|
46
|
+
redirect_pry_io(InputTester.new("cd ::", "$obj = self", "exit-all"), StringIO.new) do
|
47
|
+
5.pry
|
48
|
+
end
|
49
|
+
$obj.should == TOPLEVEL_BINDING.eval('self')
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'should cd into complex input (with spaces)' do
|
53
|
+
o = Object.new
|
54
|
+
def o.hello(x, y, z)
|
55
|
+
:mon_ouie
|
56
|
+
end
|
57
|
+
|
58
|
+
redirect_pry_io(InputTester.new("cd hello 1, 2, 3", "$obj = self", "exit-all"), StringIO.new) do
|
59
|
+
o.pry
|
60
|
+
end
|
61
|
+
$obj.should == :mon_ouie
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe "Pry::DefaultCommands::Documentation" do
|
4
|
+
describe "show-doc" do
|
5
|
+
it 'should output a method\'s documentation' do
|
6
|
+
str_output = StringIO.new
|
7
|
+
redirect_pry_io(InputTester.new("show-doc sample_method", "exit-all"), str_output) do
|
8
|
+
pry
|
9
|
+
end
|
10
|
+
|
11
|
+
str_output.string.should =~ /sample doc/
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should output a method\'s documentation if inside method without needing to use method name' do
|
15
|
+
$str_output = StringIO.new
|
16
|
+
|
17
|
+
o = Object.new
|
18
|
+
|
19
|
+
# sample comment
|
20
|
+
def o.sample
|
21
|
+
redirect_pry_io(InputTester.new("show-doc", "exit-all"), $str_output) do
|
22
|
+
binding.pry
|
23
|
+
end
|
24
|
+
end
|
25
|
+
o.sample
|
26
|
+
|
27
|
+
$str_output.string.should =~ /sample comment/
|
28
|
+
$str_output = nil
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|