pry 0.8.4pre1-i386-mswin32 → 0.9.0-i386-mswin32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. data/.gitignore +1 -0
  2. data/CHANGELOG +25 -6
  3. data/README.markdown +11 -4
  4. data/Rakefile +15 -19
  5. data/TODO +28 -2
  6. data/bin/pry +28 -11
  7. data/examples/example_basic.rb +2 -4
  8. data/examples/example_command_override.rb +2 -5
  9. data/examples/example_commands.rb +1 -4
  10. data/examples/example_hooks.rb +2 -5
  11. data/examples/example_image_edit.rb +4 -8
  12. data/examples/example_input.rb +1 -4
  13. data/examples/example_input2.rb +1 -4
  14. data/examples/example_output.rb +1 -4
  15. data/examples/example_print.rb +2 -5
  16. data/examples/example_prompt.rb +2 -5
  17. data/examples/helper.rb +6 -0
  18. data/lib/pry.rb +59 -3
  19. data/lib/pry/command_context.rb +10 -9
  20. data/lib/pry/command_processor.rb +51 -73
  21. data/lib/pry/command_set.rb +79 -28
  22. data/lib/pry/commands.rb +9 -123
  23. data/lib/pry/completion.rb +30 -29
  24. data/lib/pry/config.rb +100 -0
  25. data/lib/pry/default_commands/basic.rb +37 -0
  26. data/lib/pry/default_commands/context.rb +16 -15
  27. data/lib/pry/default_commands/documentation.rb +73 -54
  28. data/lib/pry/default_commands/easter_eggs.rb +1 -20
  29. data/lib/pry/default_commands/gems.rb +31 -40
  30. data/lib/pry/default_commands/input.rb +223 -15
  31. data/lib/pry/default_commands/introspection.rb +108 -73
  32. data/lib/pry/default_commands/ls.rb +25 -11
  33. data/lib/pry/default_commands/shell.rb +29 -39
  34. data/lib/pry/extended_commands/experimental.rb +17 -0
  35. data/lib/pry/extended_commands/user_command_api.rb +22 -0
  36. data/lib/pry/helpers.rb +1 -0
  37. data/lib/pry/helpers/base_helpers.rb +15 -104
  38. data/lib/pry/helpers/command_helpers.rb +96 -59
  39. data/lib/pry/helpers/text.rb +83 -0
  40. data/lib/pry/history_array.rb +105 -0
  41. data/lib/pry/plugins.rb +79 -0
  42. data/lib/pry/pry_class.rb +102 -114
  43. data/lib/pry/pry_instance.rb +123 -55
  44. data/lib/pry/version.rb +1 -1
  45. data/pry.gemspec +45 -0
  46. data/test/helper.rb +57 -7
  47. data/test/test_command_processor.rb +205 -0
  48. data/test/{test_commandset.rb → test_command_set.rb} +18 -12
  49. data/test/test_default_commands.rb +59 -0
  50. data/test/test_default_commands/test_context.rb +64 -0
  51. data/test/test_default_commands/test_documentation.rb +31 -0
  52. data/test/test_default_commands/test_gems.rb +14 -0
  53. data/test/test_default_commands/test_input.rb +327 -0
  54. data/test/test_default_commands/test_introspection.rb +155 -0
  55. data/test/test_history_array.rb +65 -0
  56. data/test/test_pry.rb +548 -313
  57. metadata +48 -15
  58. data/lib/pry/hooks.rb +0 -17
  59. data/lib/pry/print.rb +0 -16
  60. data/lib/pry/prompts.rb +0 -31
@@ -0,0 +1,14 @@
1
+ require 'helper'
2
+
3
+ describe "Pry::DefaultCommands::Gems" do
4
+ describe "gem-list" do
5
+
6
+ # fixing bug for 1.8 compat
7
+ it 'should not raise when invoked' do
8
+ str_output = StringIO.new
9
+ Pry.start self, :input => InputTester.new("gem-list", "exit-all"), :output => str_output
10
+ str_output.string.should.not =~ /NoMethodError/
11
+ end
12
+ end
13
+ end
14
+
@@ -0,0 +1,327 @@
1
+ require 'helper'
2
+
3
+ describe "Pry::DefaultCommands::Input" do
4
+
5
+ describe "amend-line-N" do
6
+ it 'should correctly amend the last line of input when no line number specified ' do
7
+ str_output = StringIO.new
8
+ redirect_pry_io(InputTester.new("def hello", "puts :bing", "amend-line puts :blah", "show-input", "exit-all"), str_output) do
9
+ pry
10
+ end
11
+ str_output.string.should =~ /\A\d+: def hello\n\d+: puts :blah/
12
+ end
13
+
14
+ it 'should correctly amend the specified line of input when line number given ' do
15
+ str_output = StringIO.new
16
+ redirect_pry_io(InputTester.new("def hello", "puts :bing", "puts :bang", "amend-line 1 def goodbye", "show-input", "exit-all"), str_output) do
17
+ pry
18
+ end
19
+ str_output.string.should =~ /\A\d+: def goodbye\n\d+: puts :bing\n\d+: puts :bang/
20
+ end
21
+
22
+ it 'should correctly amend the specified line of input when line number given, 0 should behave as 1 ' do
23
+ str_output = StringIO.new
24
+ redirect_pry_io(InputTester.new("def hello", "puts :bing", "puts :bang", "amend-line 0 def goodbye", "show-input", "exit-all"), str_output) do
25
+ pry
26
+ end
27
+ str_output.string.should =~ /\A\d+: def goodbye\n\d+: puts :bing\n\d+: puts :bang/
28
+ end
29
+
30
+ it 'should correctly amend the specified line of input when line number given (negative number)' do
31
+ str_output = StringIO.new
32
+ redirect_pry_io(InputTester.new("def hello", "puts :bing", "puts :bang", "amend-line -1 puts :bink", "show-input", "exit-all"), str_output) do
33
+ pry
34
+ end
35
+ str_output.string.should =~ /\A\d+: def hello\n\d+: puts :bing\n\d+: puts :bink/
36
+
37
+ str_output = StringIO.new
38
+ redirect_pry_io(InputTester.new("def hello", "puts :bing", "puts :bang", "amend-line -2 puts :bink", "show-input", "exit-all"), str_output) do
39
+ pry
40
+ end
41
+ str_output.string.should =~ /\A\d+: def hello\n\d+: puts :bink\n\d+: puts :bang/
42
+ end
43
+
44
+ it 'should correctly amend the specified range of lines of input when range of negative numbers given (negative number)' do
45
+ str_output = StringIO.new
46
+ redirect_pry_io(InputTester.new("def hello", "puts :bing", "puts :bang", "puts :boat", "amend-line -3..-2 puts :bink", "show-input", "exit-all"), str_output) do
47
+ pry
48
+ end
49
+ str_output.string.should =~ /\A\d+: def hello\n\d+: puts :bink\n\d+: puts :boat/
50
+ end
51
+
52
+ it 'should correctly amend the specified line with string interpolated text' do
53
+ str_output = StringIO.new
54
+ redirect_pry_io(InputTester.new("def hello", "puts :bing", "puts :bang", 'amend-line puts "#{goodbye}"', "show-input", "exit-all"), str_output) do
55
+ pry
56
+ end
57
+
58
+ str_output.string.should =~ /\A\d+: def hello\n\d+: puts :bing\n\d+: puts \"\#{goodbye}\"/
59
+ end
60
+
61
+ it 'should display error if nothing to amend' do
62
+ str_output = StringIO.new
63
+ redirect_pry_io(InputTester.new("amend-line", "exit-all"), str_output) do
64
+ pry
65
+ end
66
+ str_output.string.should =~ /No input to amend/
67
+ end
68
+
69
+
70
+ it 'should correctly amend the specified range of lines' do
71
+ str_output = StringIO.new
72
+ redirect_pry_io(InputTester.new("def hello", "puts :bing", "puts :bang", "puts :heart", "amend-line 2..3 puts :bong", "show-input", "exit-all"), str_output) do
73
+ pry
74
+ end
75
+ str_output.string.should =~ /\A\d+: def hello\n\d+: puts :bong\n\d+: puts :heart/
76
+ end
77
+
78
+ it 'should correctly delete a specific line using the ! for content' do
79
+ str_output = StringIO.new
80
+ redirect_pry_io(InputTester.new("def hello", "puts :bing", "puts :bang", "puts :boast", "puts :heart", "amend-line 3 !", "show-input", "exit-all"), str_output) do
81
+ pry
82
+ end
83
+
84
+ str_output.string.should =~ /\d+: def hello\n\d+: puts :bing\n\d+: puts :boast\n\d+: puts :heart/
85
+ end
86
+
87
+ it 'should correctly delete a range of lines using the ! for content' do
88
+ str_output = StringIO.new
89
+ redirect_pry_io(InputTester.new("def hello", "puts :bing", "puts :bang", "puts :boast", "puts :heart", "amend-line 2..4 !", "show-input", "exit-all"), str_output) do
90
+ pry
91
+ end
92
+
93
+ str_output.string.should =~ /\d+: def hello\n\d+: puts :heart\n\Z/
94
+ end
95
+
96
+ it 'should correctly delete the previous line using the ! for content' do
97
+ str_output = StringIO.new
98
+ redirect_pry_io(InputTester.new("def hello", "puts :bing", "puts :bang", "puts :boast", "puts :heart", "amend-line !", "show-input", "exit-all"), str_output) do
99
+ pry
100
+ end
101
+
102
+ str_output.string.should =~ /\d+: def hello\n\d+: puts :bing\n\d+: puts :bang\n\d+: puts :boast\n\Z/
103
+ end
104
+
105
+ it 'should correctly amend the specified range of lines, using negative numbers in range' do
106
+ str_output = StringIO.new
107
+ redirect_pry_io(InputTester.new("def hello", "puts :bing", "puts :bang", "puts :boast", "puts :heart", "amend-line-2..-2 puts :bong", "show-input", "exit-all"), str_output) do
108
+ pry
109
+ end
110
+ str_output.string.should =~ /\d+: def hello\n\d+: puts :bong\n\d+: puts :heart/
111
+ end
112
+
113
+ it 'should correctly insert a new line of input before a specified line using the > syntax' do
114
+ str_output = StringIO.new
115
+ redirect_pry_io(InputTester.new("def hello", "puts :bing", "puts :bang", "amend-line 2 >puts :inserted", "show-input", "exit-all"), str_output) do
116
+ pry
117
+ end
118
+ str_output.string.should =~ /\d+: def hello\n\d+: puts :inserted\n\d+: puts :bing\n\d+: puts :bang/
119
+ end
120
+
121
+ it 'should correctly insert a new line of input before a specified line using the > syntax (should ignore second value of range)' do
122
+ str_output = StringIO.new
123
+ redirect_pry_io(InputTester.new("def hello", "puts :bing", "puts :bang", "amend-line 2..21 >puts :inserted", "show-input", "exit-all"), str_output) do
124
+ pry
125
+ end
126
+ str_output.string.should =~ /\d+: def hello\n\d+: puts :inserted\n\d+: puts :bing\n\d+: puts :bang/
127
+ end
128
+ end
129
+
130
+ describe "show-input" do
131
+ it 'should correctly show the current lines in the input buffer' do
132
+ str_output = StringIO.new
133
+ redirect_pry_io(InputTester.new("def hello", "puts :bing", "show-input", "exit-all"), str_output) do
134
+ pry
135
+ end
136
+ str_output.string.should =~ /\A\d+: def hello\n\d+: puts :bing/
137
+ end
138
+ end
139
+
140
+ describe "!" do
141
+ it 'should correctly clear the input buffer ' do
142
+ str_output = StringIO.new
143
+ redirect_pry_io(InputTester.new("def hello", "puts :bing", "!", "show-input", "exit-all"), str_output) do
144
+ pry
145
+ end
146
+ stripped_output = str_output.string.strip!
147
+ stripped_output.each_line.count.should == 1
148
+ stripped_output.should =~ /Input buffer cleared!/
149
+ end
150
+ end
151
+
152
+ describe "play" do
153
+ it 'should play a string of code (with no args)' do
154
+ redirect_pry_io(InputTester.new("play :test_string", "exit-all"), str_output = StringIO.new) do
155
+ pry
156
+ end
157
+ str_output.string.should =~ /:test_string/
158
+ end
159
+
160
+ it 'should play an interpolated string of code (with no args)' do
161
+ $obj = ":test_string_interpolated"
162
+ redirect_pry_io(InputTester.new('play #{$obj}', "exit-all"), str_output = StringIO.new) do
163
+ pry
164
+ end
165
+ str_output.string.should =~ /:test_string_interpolated/
166
+ end
167
+
168
+ it 'should play a method with the -m switch (a single line)' do
169
+ $o = Object.new
170
+ def $o.test_method
171
+ :test_method_content
172
+ end
173
+
174
+ redirect_pry_io(InputTester.new('play -m $o.test_method --lines 2', "exit-all"), str_output = StringIO.new) do
175
+ pry
176
+ end
177
+
178
+ str_output.string.should =~ /:test_method_content/
179
+ $o = nil
180
+ end
181
+
182
+ it 'should play a method with the -m switch (multiple line)' do
183
+ $o = Object.new
184
+ def $o.test_method
185
+ 1 + 102
186
+ 5 * 6
187
+ end
188
+
189
+ redirect_pry_io(InputTester.new('play -m $o.test_method --lines 2..3', "exit-all"), str_output = StringIO.new) do
190
+ pry
191
+ end
192
+
193
+ str_output.string.should =~ /103\n.*30/
194
+ $o = nil
195
+ end
196
+
197
+ end
198
+
199
+ describe "hist" do
200
+ push_first_hist_line = lambda do |hist, line|
201
+ hist.push line
202
+ end
203
+
204
+ before do
205
+ Readline::HISTORY.shift until Readline::HISTORY.empty?
206
+ @hist = Readline::HISTORY
207
+ end
208
+
209
+ it 'should display the correct history' do
210
+ push_first_hist_line.call(@hist, "'bug in 1.8 means this line is ignored'")
211
+ @hist.push "hello"
212
+ @hist.push "world"
213
+ str_output = StringIO.new
214
+ redirect_pry_io(InputTester.new("hist", "exit-all"), str_output) do
215
+ pry
216
+ end
217
+ str_output.string.should =~ /hello\n.*world/
218
+ end
219
+
220
+ it 'should replay history correctly (single item)' do
221
+ push_first_hist_line.call(@hist, ":hello")
222
+ @hist.push ":blah"
223
+ @hist.push ":bucket"
224
+ @hist.push ":ostrich"
225
+ str_output = StringIO.new
226
+ redirect_pry_io(InputTester.new("hist --replay -1", "exit-all"), str_output) do
227
+ pry
228
+ end
229
+ str_output.string.should =~ /ostrich/
230
+ end
231
+
232
+ it 'should replay a range of history correctly (range of items)' do
233
+ push_first_hist_line.call(@hist, "'bug in 1.8 means this line is ignored'")
234
+ @hist.push ":hello"
235
+ @hist.push ":carl"
236
+ str_output = StringIO.new
237
+ redirect_pry_io(InputTester.new("hist --replay 0..2", "exit-all"), str_output) do
238
+ pry
239
+ end
240
+ str_output.string.should =~ /:hello\n.*:carl/
241
+ end
242
+
243
+ it 'should grep for correct lines in history' do
244
+ push_first_hist_line.call(@hist, "apple")
245
+ @hist.push "abby"
246
+ @hist.push "box"
247
+ @hist.push "button"
248
+ @hist.push "pepper"
249
+ @hist.push "orange"
250
+ @hist.push "grape"
251
+ @hist.push "def blah 1"
252
+ @hist.push "def boink 2"
253
+ @hist.push "place holder"
254
+
255
+ str_output = StringIO.new
256
+ redirect_pry_io(InputTester.new("hist --grep o", "exit-all"), str_output) do
257
+ pry
258
+ end
259
+ str_output.string.should =~ /\d:.*?box\n\d:.*?button\n\d:.*?orange/
260
+
261
+ # test more than one word in a regex match (def blah)
262
+ str_output = StringIO.new
263
+ redirect_pry_io(InputTester.new("hist --grep def blah", "exit-all"), str_output) do
264
+ pry
265
+ end
266
+ str_output.string.should =~ /def blah 1/
267
+
268
+ # test more than one word with leading white space in a regex match (def boink)
269
+ str_output = StringIO.new
270
+ redirect_pry_io(InputTester.new("hist --grep def boink", "exit-all"), str_output) do
271
+ pry
272
+ end
273
+ str_output.string.should =~ /def boink 2/
274
+ end
275
+
276
+ it 'should return last N lines in history with --tail switch' do
277
+ push_first_hist_line.call(@hist, "0")
278
+ ("a".."z").each do |v|
279
+ @hist.push v
280
+ end
281
+
282
+ str_output = StringIO.new
283
+ redirect_pry_io(InputTester.new("hist --tail 3", "exit-all"), str_output) do
284
+ pry
285
+ end
286
+
287
+ str_output.string.each_line.count.should == 3
288
+ str_output.string.should =~ /x\n\d+:.*y\n\d+:.*z/
289
+ end
290
+
291
+ # strangeness in this test is due to bug in Readline::HISTORY not
292
+ # always registering first line of input
293
+ it 'should return first N lines in history with --head switch' do
294
+ push_first_hist_line.call(@hist, "0")
295
+ ("a".."z").each do |v|
296
+ @hist.push v
297
+ end
298
+
299
+ str_output = StringIO.new
300
+ redirect_pry_io(InputTester.new("hist --head 4", "exit-all"), str_output) do
301
+ pry
302
+ end
303
+
304
+ str_output.string.each_line.count.should == 4
305
+ str_output.string.should =~ /a\n\d+:.*b\n\d+:.*c/
306
+ end
307
+
308
+ # strangeness in this test is due to bug in Readline::HISTORY not
309
+ # always registering first line of input
310
+ it 'should show lines between lines A and B with the --show switch' do
311
+ push_first_hist_line.call(@hist, "0")
312
+ ("a".."z").each do |v|
313
+ @hist.push v
314
+ end
315
+
316
+ str_output = StringIO.new
317
+ redirect_pry_io(InputTester.new("hist --show 1..4", "exit-all"), str_output) do
318
+ pry
319
+ end
320
+
321
+ str_output.string.each_line.count.should == 4
322
+ str_output.string.should =~ /b\n\d+:.*c\n\d+:.*d/
323
+ end
324
+ end
325
+
326
+
327
+ end
@@ -0,0 +1,155 @@
1
+ require 'helper'
2
+
3
+ describe "Pry::DefaultCommands::Introspection" do
4
+ describe "show-method" do
5
+ it 'should output a method\'s source' do
6
+ str_output = StringIO.new
7
+ redirect_pry_io(InputTester.new("show-method sample_method", "exit-all"), str_output) do
8
+ pry
9
+ end
10
+
11
+ str_output.string.should =~ /def sample/
12
+ end
13
+
14
+ it 'should output a method\'s source with line numbers' do
15
+ str_output = StringIO.new
16
+ redirect_pry_io(InputTester.new("show-method -l sample_method", "exit-all"), str_output) do
17
+ pry
18
+ end
19
+
20
+ str_output.string.should =~ /\d+: def sample/
21
+ end
22
+
23
+ it 'should output a method\'s source with line numbers starting at 1' do
24
+ str_output = StringIO.new
25
+ redirect_pry_io(InputTester.new("show-method -b sample_method", "exit-all"), str_output) do
26
+ pry
27
+ end
28
+
29
+ str_output.string.should =~ /1: def sample/
30
+ end
31
+
32
+ it 'should output a method\'s source if inside method without needing to use method name' do
33
+ $str_output = StringIO.new
34
+
35
+ o = Object.new
36
+ def o.sample
37
+ redirect_pry_io(InputTester.new("show-method", "exit-all"), $str_output) do
38
+ binding.pry
39
+ end
40
+ end
41
+ o.sample
42
+
43
+ $str_output.string.should =~ /def o.sample/
44
+ $str_output = nil
45
+ end
46
+
47
+ it 'should output a method\'s source if inside method without needing to use method name, and using the -l switch' do
48
+ $str_output = StringIO.new
49
+
50
+ o = Object.new
51
+ def o.sample
52
+ redirect_pry_io(InputTester.new("show-method -l", "exit-all"), $str_output) do
53
+ binding.pry
54
+ end
55
+ end
56
+ o.sample
57
+
58
+ $str_output.string.should =~ /\d+: def o.sample/
59
+ $str_output = nil
60
+ end
61
+
62
+ # dynamically defined method source retrieval is only supported in
63
+ # 1.9 - where Method#source_location is native
64
+ if RUBY_VERSION =~ /1.9/
65
+ it 'should output a method\'s source for a method defined inside pry' do
66
+ str_output = StringIO.new
67
+ redirect_pry_io(InputTester.new("def dyna_method", ":testing", "end", "show-method dyna_method"), str_output) do
68
+ TOPLEVEL_BINDING.pry
69
+ end
70
+
71
+ str_output.string.should =~ /def dyna_method/
72
+ Object.remove_method :dyna_method
73
+ end
74
+
75
+ it 'should output a method\'s source for a method defined inside pry, even if exceptions raised before hand' do
76
+ str_output = StringIO.new
77
+ redirect_pry_io(InputTester.new("bad code", "123", "bad code 2", "1 + 2", "def dyna_method", ":testing", "end", "show-method dyna_method"), str_output) do
78
+ TOPLEVEL_BINDING.pry
79
+ end
80
+
81
+ str_output.string.should =~ /def dyna_method/
82
+ Object.remove_method :dyna_method
83
+ end
84
+
85
+ it 'should output an instance method\'s source for a method defined inside pry' do
86
+ str_output = StringIO.new
87
+ redirect_pry_io(InputTester.new("class A", "def yo", "end", "end", "show-method A#yo"), str_output) do
88
+ TOPLEVEL_BINDING.pry
89
+ end
90
+
91
+ str_output.string.should =~ /def yo/
92
+ Object.remove_const :A
93
+ end
94
+
95
+ it 'should output an instance method\'s source for a method defined inside pry using define_method' do
96
+ str_output = StringIO.new
97
+ redirect_pry_io(InputTester.new("class A", "define_method(:yup) {}", "end", "end", "show-method A#yup"), str_output) do
98
+ TOPLEVEL_BINDING.pry
99
+ end
100
+
101
+ str_output.string.should =~ /define_method\(:yup\)/
102
+ Object.remove_const :A
103
+ end
104
+ end
105
+ end
106
+
107
+ # show-command only works in implementations that support Proc#source_location
108
+ if Proc.method_defined?(:source_location)
109
+ describe "show-command" do
110
+ it 'should show source for an ordinary command' do
111
+ set = Pry::CommandSet.new do
112
+ import_from Pry::Commands, "show-command"
113
+ command "foo" do
114
+ :body_of_foo
115
+ end
116
+ end
117
+ str_output = StringIO.new
118
+ redirect_pry_io(InputTester.new("show-command foo"), str_output) do
119
+ Pry.new(:commands => set).rep
120
+ end
121
+ str_output.string.should =~ /:body_of_foo/
122
+ end
123
+
124
+ it 'should show source for a command with spaces in its name' do
125
+ set = Pry::CommandSet.new do
126
+ import_from Pry::Commands, "show-command"
127
+ command "foo bar" do
128
+ :body_of_foo_bar
129
+ end
130
+ end
131
+ str_output = StringIO.new
132
+ redirect_pry_io(InputTester.new("show-command \"foo bar\""), str_output) do
133
+ Pry.new(:commands => set).rep
134
+ end
135
+ str_output.string.should =~ /:body_of_foo_bar/
136
+ end
137
+
138
+ it 'should show source for a command by listing name' do
139
+ set = Pry::CommandSet.new do
140
+ import_from Pry::Commands, "show-command"
141
+ command /foo(.*)/, "", :listing => "bar" do
142
+ :body_of_foo_regex
143
+ end
144
+ end
145
+ str_output = StringIO.new
146
+ redirect_pry_io(InputTester.new("show-command bar"), str_output) do
147
+ Pry.new(:commands => set).rep
148
+ end
149
+ str_output.string.should =~ /:body_of_foo_regex/
150
+ end
151
+ end
152
+ end
153
+
154
+
155
+ end