pry 0.9.8pre4 → 0.9.8pre5
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/pry/command_set.rb +3 -1
- data/lib/pry/hooks.rb +8 -9
- data/lib/pry/pry_class.rb +6 -2
- data/lib/pry/pry_instance.rb +16 -7
- data/lib/pry/version.rb +1 -1
- data/pry.gemspec +13 -13
- data/test/test_command_integration.rb +512 -0
- data/test/test_hooks.rb +81 -0
- data/test/test_pry.rb +25 -899
- data/test/test_pry_defaults.rb +380 -0
- data/test/test_syntax_checking.rb +5 -0
- metadata +67 -69
data/lib/pry/command_set.rb
CHANGED
@@ -82,6 +82,7 @@ class Pry
|
|
82
82
|
# # pry(main)> help number
|
83
83
|
# # number-N regex command
|
84
84
|
def block_command(name, description="No description.", options={}, &block)
|
85
|
+
description, options = ["No description.", description] if description.is_a?(Hash)
|
85
86
|
options = default_options(name).merge!(options)
|
86
87
|
|
87
88
|
commands[name] = Pry::BlockCommand.subclass(name, description, options, helper_module, &block)
|
@@ -114,6 +115,7 @@ class Pry
|
|
114
115
|
# end
|
115
116
|
#
|
116
117
|
def create_command(name, description="No description.", options={}, &block)
|
118
|
+
description, options = ["No description.", description] if description.is_a?(Hash)
|
117
119
|
options = default_options(name).merge!(options)
|
118
120
|
|
119
121
|
commands[name] = Pry::ClassCommand.subclass(name, description, options, helper_module, &block)
|
@@ -336,7 +338,7 @@ class Pry
|
|
336
338
|
|
337
339
|
help_text << commands.map do |key, command|
|
338
340
|
if command.description && !command.description.empty?
|
339
|
-
"#{command.options[:listing]
|
341
|
+
"#{command.options[:listing].to_s.ljust(18)} #{command.description}"
|
340
342
|
end
|
341
343
|
end.compact.sort.join("\n")
|
342
344
|
|
data/lib/pry/hooks.rb
CHANGED
@@ -37,18 +37,17 @@ class Pry
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def merge_arrays(array1, array2)
|
40
|
-
|
41
|
-
hash = {}
|
42
|
-
array1.each{|(k,v)| hash[k]=v}
|
43
|
-
keys.push(*array2.map {|(k,v)| k})
|
44
|
-
array2.each{|(k,v)| hash[k]=v}
|
45
|
-
result = []
|
46
|
-
keys.uniq!
|
47
|
-
keys.each{|k| result.push([k,hash[k]]) }
|
48
|
-
result
|
40
|
+
uniq_keeping_last(array1 + array2, &:first)
|
49
41
|
end
|
50
42
|
private :merge_arrays
|
51
43
|
|
44
|
+
def uniq_keeping_last(input, &block)
|
45
|
+
hash, output = {}, []
|
46
|
+
input.reverse.each{ |i| hash[block[i]] ||= (output.unshift i) }
|
47
|
+
output
|
48
|
+
end
|
49
|
+
private :uniq_keeping_last
|
50
|
+
|
52
51
|
# Return a new `Pry::Hooks` instance containing a merge of the contents of two `Pry:Hooks` instances,
|
53
52
|
# @param [Pry::Hooks] other The `Pry::Hooks` instance to merge
|
54
53
|
# @return [Pry::Hooks] The new hash.
|
data/lib/pry/pry_class.rb
CHANGED
@@ -123,8 +123,12 @@ class Pry
|
|
123
123
|
pry_instance
|
124
124
|
)
|
125
125
|
|
126
|
-
|
127
|
-
|
126
|
+
if pry_instance.binding_stack.empty?
|
127
|
+
head, *tail = binding_stack
|
128
|
+
pry_instance.binding_stack.push(*tail)
|
129
|
+
else
|
130
|
+
head = pry_instance.binding_stack.pop
|
131
|
+
end
|
128
132
|
|
129
133
|
# Enter the matrix
|
130
134
|
pry_instance.repl(head)
|
data/lib/pry/pry_instance.rb
CHANGED
@@ -181,8 +181,9 @@ class Pry
|
|
181
181
|
end
|
182
182
|
end
|
183
183
|
|
184
|
-
repl_epilogue(target)
|
185
184
|
break_data || nil
|
185
|
+
ensure
|
186
|
+
repl_epilogue(target)
|
186
187
|
end
|
187
188
|
|
188
189
|
# Perform a read-eval-print.
|
@@ -225,7 +226,9 @@ class Pry
|
|
225
226
|
|
226
227
|
code = r(target)
|
227
228
|
|
228
|
-
result =
|
229
|
+
result = target.eval(code, Pry.eval_path, Pry.current_line)
|
230
|
+
set_last_result(result, target, code)
|
231
|
+
|
229
232
|
result
|
230
233
|
rescue RescuableException => e
|
231
234
|
result = set_last_exception(e, target)
|
@@ -257,7 +260,12 @@ class Pry
|
|
257
260
|
output.puts "Error: #{e.message}"
|
258
261
|
end
|
259
262
|
|
260
|
-
|
263
|
+
begin
|
264
|
+
break if complete_expression?(eval_string)
|
265
|
+
rescue SyntaxError => e
|
266
|
+
output.puts "SyntaxError: #{e.message.sub(/.*syntax error, */m, '')}"
|
267
|
+
eval_string = ""
|
268
|
+
end
|
261
269
|
end
|
262
270
|
|
263
271
|
@suppress_output = true if eval_string =~ /;\Z/ || eval_string.empty?
|
@@ -398,11 +406,12 @@ class Pry
|
|
398
406
|
# This method should not need to be invoked directly.
|
399
407
|
# @param [Object] result The result.
|
400
408
|
# @param [Binding] target The binding to set `_` on.
|
401
|
-
|
409
|
+
# @param [String] code The code that was run.
|
410
|
+
def set_last_result(result, target, code="")
|
402
411
|
@last_result_is_exception = false
|
403
412
|
@output_array << result
|
404
413
|
|
405
|
-
self.last_result = result
|
414
|
+
self.last_result = result unless code =~ /\A\s*\z/
|
406
415
|
end
|
407
416
|
|
408
417
|
# Set the last exception for a session.
|
@@ -565,8 +574,8 @@ class Pry
|
|
565
574
|
}
|
566
575
|
end
|
567
576
|
|
568
|
-
# Assert that a line which ends with a ,
|
569
|
-
str !~ /[
|
577
|
+
# Assert that a line which ends with a , is incomplete.
|
578
|
+
str !~ /[,]\z/
|
570
579
|
rescue SyntaxError => e
|
571
580
|
if incomplete_user_input_exception?(e)
|
572
581
|
false
|
data/lib/pry/version.rb
CHANGED
data/pry.gemspec
CHANGED
@@ -1,21 +1,21 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
|
-
s.name =
|
5
|
-
s.version = "0.9.
|
4
|
+
s.name = %q{pry}
|
5
|
+
s.version = "0.9.8pre5"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
|
8
|
-
s.authors = [
|
9
|
-
s.date =
|
10
|
-
s.description =
|
11
|
-
s.email =
|
12
|
-
s.executables = [
|
13
|
-
s.files = [
|
14
|
-
s.homepage =
|
15
|
-
s.require_paths = [
|
16
|
-
s.rubygems_version =
|
17
|
-
s.summary =
|
18
|
-
s.test_files = [
|
8
|
+
s.authors = [%q{John Mair (banisterfiend)}]
|
9
|
+
s.date = %q{2012-01-19}
|
10
|
+
s.description = %q{An IRB alternative and runtime developer console}
|
11
|
+
s.email = %q{jrmair@gmail.com}
|
12
|
+
s.executables = [%q{pry}]
|
13
|
+
s.files = [%q{.document}, %q{.gemtest}, %q{.gitignore}, %q{.travis.yml}, %q{.yardopts}, %q{CHANGELOG}, %q{CONTRIBUTORS}, %q{Gemfile}, %q{LICENSE}, %q{README.markdown}, %q{Rakefile}, %q{TODO}, %q{bin/pry}, %q{examples/example_basic.rb}, %q{examples/example_command_override.rb}, %q{examples/example_commands.rb}, %q{examples/example_hooks.rb}, %q{examples/example_image_edit.rb}, %q{examples/example_input.rb}, %q{examples/example_input2.rb}, %q{examples/example_output.rb}, %q{examples/example_print.rb}, %q{examples/example_prompt.rb}, %q{examples/helper.rb}, %q{lib/pry.rb}, %q{lib/pry/cli.rb}, %q{lib/pry/command.rb}, %q{lib/pry/command_set.rb}, %q{lib/pry/commands.rb}, %q{lib/pry/completion.rb}, %q{lib/pry/config.rb}, %q{lib/pry/core_extensions.rb}, %q{lib/pry/custom_completions.rb}, %q{lib/pry/default_commands/basic.rb}, %q{lib/pry/default_commands/context.rb}, %q{lib/pry/default_commands/documentation.rb}, %q{lib/pry/default_commands/easter_eggs.rb}, %q{lib/pry/default_commands/gems.rb}, %q{lib/pry/default_commands/input.rb}, %q{lib/pry/default_commands/introspection.rb}, %q{lib/pry/default_commands/ls.rb}, %q{lib/pry/default_commands/shell.rb}, %q{lib/pry/extended_commands/experimental.rb}, %q{lib/pry/extended_commands/user_command_api.rb}, %q{lib/pry/helpers.rb}, %q{lib/pry/helpers/base_helpers.rb}, %q{lib/pry/helpers/command_helpers.rb}, %q{lib/pry/helpers/options_helpers.rb}, %q{lib/pry/helpers/text.rb}, %q{lib/pry/history.rb}, %q{lib/pry/history_array.rb}, %q{lib/pry/hooks.rb}, %q{lib/pry/indent.rb}, %q{lib/pry/method.rb}, %q{lib/pry/plugins.rb}, %q{lib/pry/pry_class.rb}, %q{lib/pry/pry_instance.rb}, %q{lib/pry/rbx_method.rb}, %q{lib/pry/rbx_path.rb}, %q{lib/pry/version.rb}, %q{lib/pry/wrapped_module.rb}, %q{man/pry.1}, %q{man/pry.1.html}, %q{man/pry.1.ronn}, %q{pry.gemspec}, %q{test/helper.rb}, %q{test/test_cli.rb}, %q{test/test_command.rb}, %q{test/test_command_helpers.rb}, %q{test/test_command_integration.rb}, %q{test/test_command_set.rb}, %q{test/test_completion.rb}, %q{test/test_default_commands.rb}, %q{test/test_default_commands/test_context.rb}, %q{test/test_default_commands/test_documentation.rb}, %q{test/test_default_commands/test_gems.rb}, %q{test/test_default_commands/test_input.rb}, %q{test/test_default_commands/test_introspection.rb}, %q{test/test_default_commands/test_ls.rb}, %q{test/test_default_commands/test_shell.rb}, %q{test/test_exception_whitelist.rb}, %q{test/test_history_array.rb}, %q{test/test_hooks.rb}, %q{test/test_indent.rb}, %q{test/test_input_stack.rb}, %q{test/test_method.rb}, %q{test/test_pry.rb}, %q{test/test_pry_defaults.rb}, %q{test/test_pry_history.rb}, %q{test/test_pry_output.rb}, %q{test/test_special_locals.rb}, %q{test/test_syntax_checking.rb}, %q{test/test_wrapped_module.rb}, %q{test/testrc}, %q{test/testrcbad}, %q{wiki/Customizing-pry.md}, %q{wiki/Home.md}]
|
14
|
+
s.homepage = %q{http://pry.github.com}
|
15
|
+
s.require_paths = [%q{lib}]
|
16
|
+
s.rubygems_version = %q{1.8.6}
|
17
|
+
s.summary = %q{An IRB alternative and runtime developer console}
|
18
|
+
s.test_files = [%q{test/helper.rb}, %q{test/test_cli.rb}, %q{test/test_command.rb}, %q{test/test_command_helpers.rb}, %q{test/test_command_integration.rb}, %q{test/test_command_set.rb}, %q{test/test_completion.rb}, %q{test/test_default_commands.rb}, %q{test/test_default_commands/test_context.rb}, %q{test/test_default_commands/test_documentation.rb}, %q{test/test_default_commands/test_gems.rb}, %q{test/test_default_commands/test_input.rb}, %q{test/test_default_commands/test_introspection.rb}, %q{test/test_default_commands/test_ls.rb}, %q{test/test_default_commands/test_shell.rb}, %q{test/test_exception_whitelist.rb}, %q{test/test_history_array.rb}, %q{test/test_hooks.rb}, %q{test/test_indent.rb}, %q{test/test_input_stack.rb}, %q{test/test_method.rb}, %q{test/test_pry.rb}, %q{test/test_pry_defaults.rb}, %q{test/test_pry_history.rb}, %q{test/test_pry_output.rb}, %q{test/test_special_locals.rb}, %q{test/test_syntax_checking.rb}, %q{test/test_wrapped_module.rb}, %q{test/testrc}, %q{test/testrcbad}]
|
19
19
|
|
20
20
|
if s.respond_to? :specification_version then
|
21
21
|
s.specification_version = 3
|
@@ -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.rstrip.should == "help to the music"
|
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
|
+
|