pry 0.9.8pre4-i386-mingw32 → 0.9.8pre5-i386-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/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 +74 -76
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
|
+
|