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

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.
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