pry 0.9.7.4-i386-mswin32 → 0.9.8-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 (65) hide show
  1. data/.gitignore +2 -3
  2. data/CHANGELOG +43 -0
  3. data/README.markdown +3 -1
  4. data/Rakefile +51 -32
  5. data/bin/pry +2 -80
  6. data/lib/pry.rb +33 -26
  7. data/lib/pry/cli.rb +152 -0
  8. data/lib/pry/code.rb +351 -0
  9. data/lib/pry/command.rb +422 -0
  10. data/lib/pry/command_set.rb +259 -129
  11. data/lib/pry/commands.rb +0 -1
  12. data/lib/pry/config.rb +43 -9
  13. data/lib/pry/default_commands/context.rb +109 -92
  14. data/lib/pry/default_commands/documentation.rb +174 -63
  15. data/lib/pry/default_commands/easter_eggs.rb +26 -2
  16. data/lib/pry/default_commands/gems.rb +65 -37
  17. data/lib/pry/default_commands/input.rb +175 -243
  18. data/lib/pry/default_commands/introspection.rb +173 -112
  19. data/lib/pry/default_commands/ls.rb +96 -114
  20. data/lib/pry/default_commands/shell.rb +175 -70
  21. data/lib/pry/helpers/base_helpers.rb +7 -2
  22. data/lib/pry/helpers/command_helpers.rb +71 -77
  23. data/lib/pry/helpers/options_helpers.rb +10 -41
  24. data/lib/pry/helpers/text.rb +24 -4
  25. data/lib/pry/history.rb +55 -17
  26. data/lib/pry/history_array.rb +2 -0
  27. data/lib/pry/hooks.rb +252 -0
  28. data/lib/pry/indent.rb +9 -5
  29. data/lib/pry/method.rb +149 -50
  30. data/lib/pry/plugins.rb +12 -4
  31. data/lib/pry/pry_class.rb +69 -26
  32. data/lib/pry/pry_instance.rb +187 -115
  33. data/lib/pry/version.rb +1 -1
  34. data/lib/pry/wrapped_module.rb +73 -0
  35. data/man/pry.1 +195 -0
  36. data/man/pry.1.html +204 -0
  37. data/man/pry.1.ronn +141 -0
  38. data/pry.gemspec +29 -32
  39. data/test/helper.rb +32 -36
  40. data/test/test_cli.rb +78 -0
  41. data/test/test_code.rb +201 -0
  42. data/test/test_command.rb +327 -0
  43. data/test/test_command_integration.rb +512 -0
  44. data/test/test_command_set.rb +338 -12
  45. data/test/test_completion.rb +1 -1
  46. data/test/test_default_commands.rb +1 -2
  47. data/test/test_default_commands/test_context.rb +27 -5
  48. data/test/test_default_commands/test_documentation.rb +20 -8
  49. data/test/test_default_commands/test_input.rb +84 -45
  50. data/test/test_default_commands/test_introspection.rb +74 -17
  51. data/test/test_default_commands/test_ls.rb +9 -36
  52. data/test/test_default_commands/test_shell.rb +240 -13
  53. data/test/test_hooks.rb +490 -0
  54. data/test/test_indent.rb +2 -0
  55. data/test/test_method.rb +60 -0
  56. data/test/test_pry.rb +29 -904
  57. data/test/test_pry_defaults.rb +380 -0
  58. data/test/test_pry_history.rb +24 -24
  59. data/test/test_syntax_checking.rb +63 -0
  60. data/test/test_wrapped_module.rb +71 -0
  61. metadata +50 -39
  62. data/lib/pry/command_context.rb +0 -53
  63. data/lib/pry/command_processor.rb +0 -181
  64. data/lib/pry/extended_commands/user_command_api.rb +0 -65
  65. data/test/test_command_processor.rb +0 -176
@@ -0,0 +1,327 @@
1
+ require 'helper'
2
+
3
+ describe "Pry::Command" do
4
+
5
+ before do
6
+ @set = Pry::CommandSet.new
7
+ end
8
+
9
+ describe 'call_safely' do
10
+
11
+ it 'should display a message if gems are missing' do
12
+ cmd = @set.create_command "ford-prefect", "From a planet near Beetlegeuse", :requires_gem => %w(ghijkl) do
13
+ #
14
+ end
15
+
16
+ mock_command(cmd, %w(hello world)).output.should =~ /install-command ford-prefect/
17
+ end
18
+
19
+ it 'should abort early if arguments are required' do
20
+ cmd = @set.create_command 'arthur-dent', "Doesn't understand Thursdays", :argument_required => true do
21
+ #
22
+ end
23
+
24
+ lambda {
25
+ mock_command(cmd, %w())
26
+ }.should.raise(Pry::CommandError)
27
+ end
28
+
29
+ it 'should return VOID without keep_retval' do
30
+ cmd = @set.create_command 'zaphod-beeblebrox', "Likes pan-Galactic Gargle Blasters" do
31
+ def process
32
+ 3
33
+ end
34
+ end
35
+
36
+ mock_command(cmd).return.should == Pry::Command::VOID_VALUE
37
+ end
38
+
39
+ it 'should return the return value with keep_retval' do
40
+ cmd = @set.create_command 'tricia-mcmillian', "a.k.a Trillian", :keep_retval => true do
41
+ def process
42
+ 5
43
+ end
44
+ end
45
+
46
+ mock_command(cmd).return.should == 5
47
+ end
48
+
49
+ it 'should call hooks in the right order' do
50
+ cmd = @set.create_command 'marvin', "Pained by the diodes in his left side" do
51
+ def process
52
+ output.puts 3 + args[0].to_i
53
+ end
54
+ end
55
+
56
+ @set.before_command 'marvin' do |i|
57
+ output.puts 2 + i.to_i
58
+ end
59
+ @set.before_command 'marvin' do |i|
60
+ output.puts 1 + i.to_i
61
+ end
62
+
63
+ @set.after_command 'marvin' do |i|
64
+ output.puts 4 + i.to_i
65
+ end
66
+
67
+ @set.after_command 'marvin' do |i|
68
+ output.puts 5 + i.to_i
69
+ end
70
+
71
+ mock_command(cmd, %w(2)).output.should == "3\n4\n5\n6\n7\n"
72
+ end
73
+
74
+ # TODO: This strikes me as rather silly...
75
+ it 'should return the value from the last hook with keep_retval' do
76
+ cmd = @set.create_command 'slartibartfast', "Designs Fjords", :keep_retval => true do
77
+ def process
78
+ 22
79
+ end
80
+ end
81
+
82
+ @set.after_command 'slartibartfast' do
83
+ 10
84
+ end
85
+
86
+ mock_command(cmd).return.should == 10
87
+ end
88
+ end
89
+
90
+ describe 'help' do
91
+ it 'should default to the description for blocky commands' do
92
+ @set.command 'oolon-colluphid', "Raving Atheist" do
93
+ #
94
+ end
95
+
96
+ mock_command(@set.commands['help'], %w(oolon-colluphid), :command_set => @set).output.should =~ /Raving Atheist/
97
+ end
98
+
99
+ it 'should use slop to generate the help for classy commands' do
100
+ @set.create_command 'eddie', "The ship-board computer" do
101
+ def options(opt)
102
+ opt.banner "Over-cheerful, and makes a ticking noise."
103
+ end
104
+ end
105
+
106
+ mock_command(@set.commands['help'], %w(eddie), :command_set => @set).output.should =~ /Over-cheerful/
107
+ end
108
+
109
+ it 'should provide --help for classy commands' do
110
+ cmd = @set.create_command 'agrajag', "Killed many times by Arthur" do
111
+ def options(opt)
112
+ opt.on :r, :retaliate, "Try to get Arthur back"
113
+ end
114
+ end
115
+
116
+ mock_command(cmd, %w(--help)).output.should =~ /--retaliate/
117
+ end
118
+
119
+ it 'should provide a -h for classy commands' do
120
+ cmd = @set.create_command 'zarniwoop', "On an intergalactic cruise, in his office." do
121
+ def options(opt)
122
+ opt.on :e, :escape, "Help zaphod escape the Total Perspective Vortex"
123
+ end
124
+ end
125
+
126
+ mock_command(cmd, %w(--help)).output.should =~ /Total Perspective Vortex/
127
+ end
128
+
129
+ it 'should use the banner provided' do
130
+ cmd = @set.create_command 'deep-thought', "The second-best computer ever" do
131
+ banner <<-BANNER
132
+ Who's merest operational parameters, I am not worthy to compute.
133
+ BANNER
134
+ end
135
+
136
+ mock_command(cmd, %w(--help)).output.should =~ /Who\'s merest/
137
+ end
138
+ end
139
+
140
+
141
+ describe 'context' do
142
+ context = {
143
+ :target => binding,
144
+ :output => StringIO.new,
145
+ :eval_string => "eval-string",
146
+ :command_set => @set,
147
+ :pry_instance => Object.new
148
+ }
149
+
150
+ it 'should capture lots of stuff from the hash passed to new before setup' do
151
+ cmd = @set.create_command 'fenchurch', "Floats slightly off the ground" do
152
+ define_method(:setup) do
153
+ self.context.should == context
154
+ target.should == context[:target]
155
+ target_self.should == context[:target].eval('self')
156
+ output.should == context[:output]
157
+ end
158
+
159
+ define_method(:process) do
160
+ eval_string.should == "eval-string"
161
+ command_set.should == @set
162
+ _pry_.should == context[:pry_instance]
163
+ end
164
+ end
165
+
166
+ cmd.new(context).call
167
+ end
168
+ end
169
+
170
+ describe 'classy api' do
171
+
172
+ it 'should call setup, then options, then process' do
173
+ cmd = @set.create_command 'rooster', "Has a tasty towel" do
174
+ def setup
175
+ output.puts "setup"
176
+ end
177
+
178
+ def options(opt)
179
+ output.puts "options"
180
+ end
181
+
182
+ def process
183
+ output.puts "process"
184
+ end
185
+ end
186
+
187
+ mock_command(cmd).output.should == "setup\noptions\nprocess\n"
188
+ end
189
+
190
+ it 'should raise a command error if process is not overridden' do
191
+ cmd = @set.create_command 'jeltz', "Commander of a Vogon constructor fleet" do
192
+ def proccces
193
+ #
194
+ end
195
+ end
196
+
197
+ lambda {
198
+ mock_command(cmd)
199
+ }.should.raise(Pry::CommandError)
200
+ end
201
+
202
+ it 'should work if neither options, nor setup is overridden' do
203
+ cmd = @set.create_command 'wowbagger', "Immortal, insulting.", :keep_retval => true do
204
+ def process
205
+ 5
206
+ end
207
+ end
208
+
209
+ mock_command(cmd).return.should == 5
210
+ end
211
+
212
+ it 'should provide opts and args as provided by slop' do
213
+ cmd = @set.create_command 'lintilla', "One of 800,000,000 clones" do
214
+ def options(opt)
215
+ opt.on :f, :four, "A numeric four", :as => Integer, :optional => true
216
+ end
217
+
218
+ def process
219
+ args.should == ['four']
220
+ opts[:f].should == 4
221
+ end
222
+ end
223
+
224
+ mock_command(cmd, %w(--four 4 four))
225
+ end
226
+
227
+ it 'should allow overriding options after definition' do
228
+ cmd = @set.create_command /number-(one|two)/, "Lieutenants of the Golgafrinchan Captain", :shellwords => false do
229
+
230
+ command_options :listing => 'number-one'
231
+ end
232
+
233
+ cmd.command_options[:shellwords].should == false
234
+ cmd.command_options[:listing].should == 'number-one'
235
+ end
236
+ end
237
+
238
+ describe 'tokenize' do
239
+ it 'should interpolate string with #{} in them' do
240
+ cmd = @set.command 'random-dent' do |*args|
241
+ args.should == ["3", "8"]
242
+ end
243
+
244
+ foo = 5
245
+
246
+ cmd.new(:target => binding).process_line 'random-dent #{1 + 2} #{3 + foo}'
247
+ end
248
+
249
+ it 'should not fail if interpolation is not needed and target is not set' do
250
+ cmd = @set.command 'the-book' do |*args|
251
+ args.should == ['--help']
252
+ end
253
+
254
+ cmd.new.process_line 'the-book --help'
255
+ end
256
+
257
+ it 'should not interpolate commands with :interpolate => false' do
258
+ cmd = @set.command 'thor', 'norse god', :interpolate => false do |*args|
259
+ args.should == ['%(#{foo})']
260
+ end
261
+
262
+ cmd.new.process_line 'thor %(#{foo})'
263
+ end
264
+
265
+ it 'should use shell-words to split strings' do
266
+ cmd = @set.command 'eccentrica' do |*args|
267
+ args.should == ['gallumbits', 'eroticon', '6']
268
+ end
269
+
270
+ cmd.new.process_line %(eccentrica "gallumbits" 'erot''icon' 6)
271
+ end
272
+
273
+ it 'should split on spaces if shellwords is not used' do
274
+ cmd = @set.command 'bugblatter-beast', 'would eat its grandmother', :shellwords => false do |*args|
275
+ args.should == ['"of', 'traal"']
276
+ end
277
+
278
+ cmd.new.process_line %(bugblatter-beast "of traal")
279
+ end
280
+
281
+ it 'should add captures to arguments for regex commands' do
282
+ cmd = @set.command /perfectly (normal)( beast)?/i do |*args|
283
+ args.should == ['Normal', ' Beast', '(honest!)']
284
+ end
285
+
286
+ cmd.new.process_line %(Perfectly Normal Beast (honest!))
287
+ end
288
+ end
289
+
290
+ describe 'process_line' do
291
+ it 'should check for command name collisions if configured' do
292
+ old = Pry.config.collision_warning
293
+ Pry.config.collision_warning = true
294
+
295
+ cmd = @set.command 'frankie' do
296
+
297
+ end
298
+
299
+ frankie = 'boyle'
300
+ output = StringIO.new
301
+ cmd.new(:target => binding, :output => output).process_line %(frankie mouse)
302
+
303
+ output.string.should =~ /Command name collision/
304
+
305
+ Pry.config.collision_warning = old
306
+ end
307
+
308
+ it "should set the commands' arg_string and captures" do
309
+
310
+ cmd = @set.command /benj(ie|ei)/ do |*args|
311
+ self.arg_string.should == "mouse"
312
+ self.captures.should == ['ie']
313
+ args.should == ['ie', 'mouse']
314
+ end
315
+
316
+ cmd.new.process_line %(benjie mouse)
317
+ end
318
+
319
+ it "should raise an error if the line doesn't match the command" do
320
+ cmd = @set.command 'grunthos', 'the flatulent'
321
+
322
+ lambda {
323
+ cmd.new.process_line %(grumpos)
324
+ }.should.raise(Pry::CommandError)
325
+ end
326
+ end
327
+ end
@@ -0,0 +1,512 @@
1
+ require 'helper'
2
+ describe "commands" do
3
+ it 'should interpolate ruby code into commands' do
4
+ klass = Pry::CommandSet.new do
5
+ command "hello", "", :keep_retval => true do |arg|
6
+ arg
7
+ end
8
+ end
9
+
10
+ $test_interpolation = "bing"
11
+ str_output = StringIO.new
12
+ Pry.new(:input => StringIO.new('hello #{$test_interpolation}'), :output => str_output, :commands => klass).rep
13
+ str_output.string.should =~ /bing/
14
+ $test_interpolation = nil
15
+ end
16
+
17
+ # bug fix for https://github.com/pry/pry/issues/170
18
+ it 'should not choke on complex string interpolation when checking if ruby code is a command' do
19
+ redirect_pry_io(InputTester.new('/#{Regexp.escape(File.expand_path("."))}/'), str_output = StringIO.new) do
20
+ pry
21
+ end
22
+
23
+ str_output.string.should.not =~ /SyntaxError/
24
+ end
25
+
26
+ it 'should NOT interpolate ruby code into commands if :interpolate => false' do
27
+ klass = Pry::CommandSet.new do
28
+ command "hello", "", :keep_retval => true, :interpolate => false do |arg|
29
+ arg
30
+ end
31
+ end
32
+
33
+ $test_interpolation = "bing"
34
+ str_output = StringIO.new
35
+ Pry.new(:input => StringIO.new('hello #{$test_interpolation}'), :output => str_output, :commands => klass).rep
36
+ str_output.string.should =~ /test_interpolation/
37
+ $test_interpolation = nil
38
+ end
39
+
40
+ it 'should NOT try to interpolate pure ruby code (no commands) ' do
41
+ str_output = StringIO.new
42
+ Pry.new(:input => StringIO.new('format \'#{aggy}\''), :output => str_output).rep
43
+ str_output.string.should.not =~ /NameError/
44
+
45
+ Pry.new(:input => StringIO.new('format #{aggy}'), :output => str_output).rep
46
+ str_output.string.should.not =~ /NameError/
47
+
48
+ $test_interpolation = "blah"
49
+ Pry.new(:input => StringIO.new('format \'#{$test_interpolation}\''), :output => str_output).rep
50
+
51
+ str_output.string.should.not =~ /blah/
52
+ $test_interpolation = nil
53
+ end
54
+
55
+ it 'should create a command with a space in its name' do
56
+ set = Pry::CommandSet.new do
57
+ command "hello baby", "" do
58
+ output.puts "hello baby command"
59
+ end
60
+ end
61
+
62
+ str_output = StringIO.new
63
+ redirect_pry_io(InputTester.new("hello baby", "exit-all"), str_output) do
64
+ Pry.new(:commands => set).rep
65
+ end
66
+
67
+ str_output.string.should =~ /hello baby command/
68
+ end
69
+
70
+ it 'should create a command with a space in its name and pass an argument' do
71
+ set = Pry::CommandSet.new do
72
+ command "hello baby", "" do |arg|
73
+ output.puts "hello baby command #{arg}"
74
+ end
75
+ end
76
+
77
+ str_output = StringIO.new
78
+ redirect_pry_io(InputTester.new("hello baby john"), str_output) do
79
+ Pry.new(:commands => set).rep
80
+ end
81
+
82
+ str_output.string.should =~ /hello baby command john/
83
+ end
84
+
85
+ it 'should create a regex command and be able to invoke it' do
86
+ set = Pry::CommandSet.new do
87
+ command /hello(.)/, "" do
88
+ c = captures.first
89
+ output.puts "hello#{c}"
90
+ end
91
+ end
92
+
93
+ str_output = StringIO.new
94
+ redirect_pry_io(InputTester.new("hello1"), str_output) do
95
+ Pry.new(:commands => set).rep
96
+ end
97
+
98
+ str_output.string.should =~ /hello1/
99
+ end
100
+
101
+ it 'should create a regex command and pass captures into the args list before regular arguments' do
102
+ set = Pry::CommandSet.new do
103
+ command /hello(.)/, "" do |c1, a1|
104
+ output.puts "hello #{c1} #{a1}"
105
+ end
106
+ end
107
+
108
+ str_output = StringIO.new
109
+ redirect_pry_io(InputTester.new("hello1 baby"), str_output) do
110
+ Pry.new(:commands => set).rep
111
+ end
112
+
113
+ str_output.string.should =~ /hello 1 baby/
114
+ end
115
+
116
+ it 'should create a regex command and interpolate the captures' do
117
+ set = Pry::CommandSet.new do
118
+ command /hello (.*)/, "" do |c1|
119
+ output.puts "hello #{c1}"
120
+ end
121
+ end
122
+
123
+ str_output = StringIO.new
124
+ $obj = "bing"
125
+ redirect_pry_io(InputTester.new('hello #{$obj}'), str_output) do
126
+ Pry.new(:commands => set).rep
127
+ end
128
+
129
+ str_output.string.should =~ /hello bing/
130
+ $obj = nil
131
+ end
132
+
133
+ it 'should create a regex command and arg_string should be interpolated' do
134
+ set = Pry::CommandSet.new do
135
+ command /hello(\w+)/, "" do |c1, a1, a2, a3|
136
+ output.puts "hello #{c1} #{a1} #{a2} #{a3}"
137
+ end
138
+ end
139
+
140
+ str_output = StringIO.new
141
+ $a1 = "bing"
142
+ $a2 = "bong"
143
+ $a3 = "bang"
144
+ redirect_pry_io(InputTester.new('hellojohn #{$a1} #{$a2} #{$a3}'), str_output) do
145
+ Pry.new(:commands => set).rep
146
+ end
147
+
148
+ str_output.string.should =~ /hello john bing bong bang/
149
+
150
+ $a1 = nil
151
+ $a2 = nil
152
+ $a3 = nil
153
+ end
154
+
155
+
156
+ it 'if a regex capture is missing it should be nil' do
157
+ set = Pry::CommandSet.new do
158
+ command /hello(.)?/, "" do |c1, a1|
159
+ output.puts "hello #{c1.inspect} #{a1}"
160
+ end
161
+ end
162
+
163
+ str_output = StringIO.new
164
+ redirect_pry_io(InputTester.new("hello baby"), str_output) do
165
+ Pry.new(:commands => set).rep
166
+ end
167
+
168
+ str_output.string.should =~ /hello nil baby/
169
+ end
170
+
171
+ it 'should create a command in a nested context and that command should be accessible from the parent' do
172
+ str_output = StringIO.new
173
+ x = "@x=nil\ncd 7\n_pry_.commands.instance_eval {\ncommand('bing') { |arg| run arg }\n}\ncd ..\nbing ls\nexit-all"
174
+ redirect_pry_io(StringIO.new("@x=nil\ncd 7\n_pry_.commands.instance_eval {\ncommand('bing') { |arg| run arg }\n}\ncd ..\nbing ls\nexit-all"), str_output) do
175
+ Pry.new.repl(0)
176
+ end
177
+
178
+ str_output.string.should =~ /@x/
179
+ end
180
+
181
+ it 'should define a command that keeps its return value' do
182
+ klass = Pry::CommandSet.new do
183
+ command "hello", "", :keep_retval => true do
184
+ :kept_hello
185
+ end
186
+ end
187
+ str_output = StringIO.new
188
+ Pry.new(:input => StringIO.new("hello\n"), :output => str_output, :commands => klass).rep
189
+ str_output.string.should =~ /:kept_hello/
190
+ str_output.string.should =~ /=>/
191
+ end
192
+
193
+ it 'should define a command that does NOT keep its return value' do
194
+ klass = Pry::CommandSet.new do
195
+ command "hello", "", :keep_retval => false do
196
+ :kept_hello
197
+ end
198
+ end
199
+ str_output = StringIO.new
200
+ Pry.new(:input => StringIO.new("hello\n"), :output => str_output, :commands => klass).rep
201
+ (str_output.string =~ /:kept_hello/).should == nil
202
+ str_output.string !~ /=>/
203
+ end
204
+
205
+ it 'should define a command that keeps its return value even when nil' do
206
+ klass = Pry::CommandSet.new do
207
+ command "hello", "", :keep_retval => true do
208
+ nil
209
+ end
210
+ end
211
+ str_output = StringIO.new
212
+ Pry.new(:input => StringIO.new("hello\n"), :output => str_output, :commands => klass).rep
213
+ str_output.string.should =~ /nil/
214
+ str_output.string.should =~ /=>/
215
+ end
216
+
217
+ it 'should define a command that keeps its return value but does not return when value is void' do
218
+ klass = Pry::CommandSet.new do
219
+ command "hello", "", :keep_retval => true do
220
+ void
221
+ end
222
+ end
223
+ str_output = StringIO.new
224
+ Pry.new(:input => StringIO.new("hello\n"), :output => str_output, :commands => klass).rep
225
+ str_output.string.empty?.should == true
226
+ end
227
+
228
+ it 'a command (with :keep_retval => false) that replaces eval_string with a valid expression should not have the expression value suppressed' do
229
+ klass = Pry::CommandSet.new do
230
+ command "hello", "" do
231
+ eval_string.replace("6")
232
+ end
233
+ end
234
+ str_output = StringIO.new
235
+ Pry.new(:input => StringIO.new("def yo\nhello\n"), :output => str_output, :commands => klass).rep
236
+ str_output.string.should =~ /6/
237
+ end
238
+
239
+
240
+ it 'a command (with :keep_retval => true) that replaces eval_string with a valid expression should overwrite the eval_string with the return value' do
241
+ klass = Pry::CommandSet.new do
242
+ command "hello", "", :keep_retval => true do
243
+ eval_string.replace("6")
244
+ 7
245
+ end
246
+ end
247
+ str_output = StringIO.new
248
+ Pry.new(:input => StringIO.new("def yo\nhello\n"), :output => str_output, :commands => klass).rep
249
+ str_output.string.should =~ /7/
250
+ str_output.string.should.not =~ /6/
251
+ end
252
+
253
+ it 'a command that return a value in a multi-line expression should clear the expression and return the value' do
254
+ klass = Pry::CommandSet.new do
255
+ command "hello", "", :keep_retval => true do
256
+ 5
257
+ end
258
+ end
259
+ str_output = StringIO.new
260
+ Pry.new(:input => StringIO.new("def yo\nhello\n"), :output => str_output, :commands => klass).rep
261
+ str_output.string.should =~ /5/
262
+ end
263
+
264
+
265
+ it 'should set the commands default, and the default should be overridable' do
266
+ klass = Pry::CommandSet.new do
267
+ command "hello" do
268
+ output.puts "hello world"
269
+ end
270
+ end
271
+
272
+ Pry.commands = klass
273
+
274
+ str_output = StringIO.new
275
+ Pry.new(:input => InputTester.new("hello"), :output => str_output).rep
276
+ str_output.string.should =~ /hello world/
277
+
278
+ other_klass = Pry::CommandSet.new do
279
+ command "goodbye", "" do
280
+ output.puts "goodbye world"
281
+ end
282
+ end
283
+
284
+ str_output = StringIO.new
285
+
286
+ Pry.new(:input => InputTester.new("goodbye"), :output => str_output, :commands => other_klass).rep
287
+ str_output.string.should =~ /goodbye world/
288
+ end
289
+
290
+ it 'should inherit "help" command from Pry::CommandBase' do
291
+ klass = Pry::CommandSet.new do
292
+ command "h", "h command" do
293
+ end
294
+ end
295
+
296
+ klass.commands.keys.size.should == 3
297
+ klass.commands.keys.include?("help").should == true
298
+ klass.commands.keys.include?("install-command").should == true
299
+ klass.commands.keys.include?("h").should == true
300
+ end
301
+
302
+ it 'should inherit commands from Pry::Commands' do
303
+ klass = Pry::CommandSet.new Pry::Commands do
304
+ command "v" do
305
+ end
306
+ end
307
+
308
+ klass.commands.include?("nesting").should == true
309
+ klass.commands.include?("jump-to").should == true
310
+ klass.commands.include?("cd").should == true
311
+ klass.commands.include?("v").should == true
312
+ end
313
+
314
+ it 'should alias a command with another command' do
315
+ klass = Pry::CommandSet.new do
316
+ alias_command "help2", "help"
317
+ end
318
+ klass.commands["help2"].block.should == klass.commands["help"].block
319
+ end
320
+
321
+ it 'should change description of a command using desc' do
322
+ klass = Pry::CommandSet.new do; end
323
+ orig = klass.commands["help"].description
324
+ klass.instance_eval do
325
+ desc "help", "blah"
326
+ end
327
+ klass.commands["help"].description.should.not == orig
328
+ klass.commands["help"].description.should == "blah"
329
+ end
330
+
331
+ it 'should run a command from within a command' do
332
+ klass = Pry::CommandSet.new do
333
+ command "v" do
334
+ output.puts "v command"
335
+ end
336
+
337
+ command "run_v" do
338
+ run "v"
339
+ end
340
+ end
341
+
342
+ str_output = StringIO.new
343
+ Pry.new(:input => InputTester.new("run_v"), :output => str_output, :commands => klass).rep
344
+ str_output.string.should =~ /v command/
345
+ end
346
+
347
+ it 'should run a regex command from within a command' do
348
+ klass = Pry::CommandSet.new do
349
+ command /v(.*)?/ do |arg|
350
+ output.puts "v #{arg}"
351
+ end
352
+
353
+ command "run_v" do
354
+ run "vbaby"
355
+ end
356
+ end
357
+
358
+ str_output = StringIO.new
359
+ redirect_pry_io(InputTester.new("run_v"), str_output) do
360
+ Pry.new(:commands => klass).rep
361
+ end
362
+
363
+ str_output.string.should =~ /v baby/
364
+ end
365
+
366
+ it 'should run a command from within a command with arguments' do
367
+ klass = Pry::CommandSet.new do
368
+ command /v(\w+)/ do |arg1, arg2|
369
+ output.puts "v #{arg1} #{arg2}"
370
+ end
371
+
372
+ command "run_v_explicit_parameter" do
373
+ run "vbaby", "param"
374
+ end
375
+
376
+ command "run_v_embedded_parameter" do
377
+ run "vbaby param"
378
+ end
379
+ end
380
+
381
+ ["run_v_explicit_parameter", "run_v_embedded_parameter"].each do |cmd|
382
+ str_output = StringIO.new
383
+ redirect_pry_io(InputTester.new(cmd), str_output) do
384
+ Pry.new(:commands => klass).rep
385
+ end
386
+ str_output.string.should =~ /v baby param/
387
+ end
388
+ end
389
+
390
+ it 'should enable an inherited method to access opts and output and target, due to instance_exec' do
391
+ klass = Pry::CommandSet.new do
392
+ command "v" do
393
+ output.puts "#{target.eval('self')}"
394
+ end
395
+ end
396
+
397
+ child_klass = Pry::CommandSet.new klass do
398
+ end
399
+
400
+ str_output = StringIO.new
401
+ Pry.new(:print => proc {}, :input => InputTester.new("v"),
402
+ :output => str_output, :commands => child_klass).rep("john")
403
+
404
+ str_output.string.rstrip.should == "john"
405
+ end
406
+
407
+ it 'should import commands from another command object' do
408
+ klass = Pry::CommandSet.new do
409
+ import_from Pry::Commands, "ls", "jump-to"
410
+ end
411
+
412
+ klass.commands.include?("ls").should == true
413
+ klass.commands.include?("jump-to").should == true
414
+ end
415
+
416
+ it 'should delete some inherited commands when using delete method' do
417
+ klass = Pry::CommandSet.new Pry::Commands do
418
+ command "v" do
419
+ end
420
+
421
+ delete "show-doc", "show-method"
422
+ delete "ls"
423
+ end
424
+
425
+ klass.commands.include?("nesting").should == true
426
+ klass.commands.include?("jump-to").should == true
427
+ klass.commands.include?("cd").should == true
428
+ klass.commands.include?("v").should == true
429
+ klass.commands.include?("show-doc").should == false
430
+ klass.commands.include?("show-method").should == false
431
+ klass.commands.include?("ls").should == false
432
+ end
433
+
434
+ it 'should override some inherited commands' do
435
+ klass = Pry::CommandSet.new Pry::Commands do
436
+ command "jump-to" do
437
+ output.puts "jump-to the music"
438
+ end
439
+
440
+ command "help" do
441
+ output.puts "help to the music"
442
+ end
443
+ end
444
+
445
+ # suppress evaluation output
446
+ Pry.print = proc {}
447
+
448
+ str_output = StringIO.new
449
+ Pry.new(:input => InputTester.new("jump-to"), :output => str_output, :commands => klass).rep
450
+ str_output.string.rstrip.should == "jump-to the music"
451
+
452
+ str_output = StringIO.new
453
+ Pry.new(:input => InputTester.new("help"), :output => str_output, :commands => klass).rep
454
+ str_output.string.should == "help to the music\n"
455
+
456
+
457
+ Pry.reset_defaults
458
+ Pry.color = false
459
+ end
460
+
461
+ it 'should run a command with no parameter' do
462
+ pry_tester = Pry.new
463
+ pry_tester.commands = CommandTester
464
+ pry_tester.input = InputTester.new("command1", "exit-all")
465
+ pry_tester.commands = CommandTester
466
+
467
+ str_output = StringIO.new
468
+ pry_tester.output = str_output
469
+
470
+ pry_tester.rep
471
+
472
+ str_output.string.should =~ /command1/
473
+ end
474
+
475
+ it 'should run a command with one parameter' do
476
+ pry_tester = Pry.new
477
+ pry_tester.commands = CommandTester
478
+ pry_tester.input = InputTester.new("command2 horsey", "exit-all")
479
+ pry_tester.commands = CommandTester
480
+
481
+ str_output = StringIO.new
482
+ pry_tester.output = str_output
483
+
484
+ pry_tester.rep
485
+
486
+ str_output.string.should =~ /horsey/
487
+ end
488
+ end
489
+
490
+ describe "Pry#run_command" do
491
+ it 'should run a command in a specified context' do
492
+ b = Pry.binding_for(7)
493
+ p = Pry.new(:output => StringIO.new)
494
+ p.run_command("ls -m", "", b)
495
+ p.output.string.should =~ /divmod/
496
+ end
497
+
498
+ it 'should run a command that modifies the passed in eval_string' do
499
+ b = Pry.binding_for(7)
500
+ p = Pry.new(:output => StringIO.new)
501
+ eval_string = "def hello\npeter pan\n"
502
+ p.run_command("amend-line !", eval_string, b)
503
+ eval_string.should =~ /def hello/
504
+ eval_string.should.not =~ /peter pan/
505
+ end
506
+
507
+ it 'should run a command in the context of a session' do
508
+ mock_pry("@session_ivar = 10", "_pry_.run_command('ls')").should =~ /@session_ivar/
509
+ end
510
+ end
511
+
512
+