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.
- data/.gitignore +1 -0
- data/CHANGELOG +25 -6
- data/README.markdown +11 -4
- data/Rakefile +15 -19
- data/TODO +28 -2
- data/bin/pry +28 -11
- data/examples/example_basic.rb +2 -4
- data/examples/example_command_override.rb +2 -5
- data/examples/example_commands.rb +1 -4
- data/examples/example_hooks.rb +2 -5
- data/examples/example_image_edit.rb +4 -8
- data/examples/example_input.rb +1 -4
- data/examples/example_input2.rb +1 -4
- data/examples/example_output.rb +1 -4
- data/examples/example_print.rb +2 -5
- data/examples/example_prompt.rb +2 -5
- data/examples/helper.rb +6 -0
- data/lib/pry.rb +59 -3
- data/lib/pry/command_context.rb +10 -9
- data/lib/pry/command_processor.rb +51 -73
- data/lib/pry/command_set.rb +79 -28
- data/lib/pry/commands.rb +9 -123
- data/lib/pry/completion.rb +30 -29
- data/lib/pry/config.rb +100 -0
- data/lib/pry/default_commands/basic.rb +37 -0
- data/lib/pry/default_commands/context.rb +16 -15
- data/lib/pry/default_commands/documentation.rb +73 -54
- data/lib/pry/default_commands/easter_eggs.rb +1 -20
- data/lib/pry/default_commands/gems.rb +31 -40
- data/lib/pry/default_commands/input.rb +223 -15
- data/lib/pry/default_commands/introspection.rb +108 -73
- data/lib/pry/default_commands/ls.rb +25 -11
- data/lib/pry/default_commands/shell.rb +29 -39
- data/lib/pry/extended_commands/experimental.rb +17 -0
- data/lib/pry/extended_commands/user_command_api.rb +22 -0
- data/lib/pry/helpers.rb +1 -0
- data/lib/pry/helpers/base_helpers.rb +15 -104
- data/lib/pry/helpers/command_helpers.rb +96 -59
- data/lib/pry/helpers/text.rb +83 -0
- data/lib/pry/history_array.rb +105 -0
- data/lib/pry/plugins.rb +79 -0
- data/lib/pry/pry_class.rb +102 -114
- data/lib/pry/pry_instance.rb +123 -55
- data/lib/pry/version.rb +1 -1
- data/pry.gemspec +45 -0
- data/test/helper.rb +57 -7
- data/test/test_command_processor.rb +205 -0
- data/test/{test_commandset.rb → test_command_set.rb} +18 -12
- data/test/test_default_commands.rb +59 -0
- data/test/test_default_commands/test_context.rb +64 -0
- data/test/test_default_commands/test_documentation.rb +31 -0
- data/test/test_default_commands/test_gems.rb +14 -0
- data/test/test_default_commands/test_input.rb +327 -0
- data/test/test_default_commands/test_introspection.rb +155 -0
- data/test/test_history_array.rb +65 -0
- data/test/test_pry.rb +548 -313
- metadata +48 -15
- data/lib/pry/hooks.rb +0 -17
- data/lib/pry/print.rb +0 -16
- data/lib/pry/prompts.rb +0 -31
@@ -1,26 +1,7 @@
|
|
1
1
|
class Pry
|
2
2
|
module DefaultCommands
|
3
3
|
|
4
|
-
EasterEggs = Pry::CommandSet.new
|
5
|
-
|
6
|
-
command "game", "" do |highest|
|
7
|
-
highest = highest ? highest.to_i : 100
|
8
|
-
num = rand(highest)
|
9
|
-
output.puts "Guess the number between 0-#{highest}: ('.' to quit)"
|
10
|
-
count = 0
|
11
|
-
while(true)
|
12
|
-
count += 1
|
13
|
-
str = Readline.readline("game > ", true)
|
14
|
-
break if str == "." || !str
|
15
|
-
val = str.to_i
|
16
|
-
output.puts "Too large!" if val > num
|
17
|
-
output.puts "Too small!" if val < num
|
18
|
-
if val == num
|
19
|
-
output.puts "Well done! You guessed right! It took you #{count} guesses."
|
20
|
-
break
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
4
|
+
EasterEggs = Pry::CommandSet.new do
|
24
5
|
|
25
6
|
command "east-coker", "" do
|
26
7
|
text = %{
|
@@ -1,56 +1,47 @@
|
|
1
1
|
class Pry
|
2
2
|
module DefaultCommands
|
3
3
|
|
4
|
-
Gems = Pry::CommandSet.new
|
5
|
-
|
6
|
-
command "gem-install", "Install a gem and refresh the gem cache." do |gem_name|
|
7
|
-
gem_home = Gem.instance_variable_get(:@gem_home)
|
8
|
-
output.puts "Attempting to install gem: #{bold(gem_name)}"
|
4
|
+
Gems = Pry::CommandSet.new do
|
9
5
|
|
6
|
+
command "gem-install", "Install a gem and refresh the gem cache.", :argument_required => true do |gem|
|
10
7
|
begin
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
output.puts "Gem #{bold(gem_name)} successfully installed."
|
17
|
-
else
|
18
|
-
output.puts "Gem #{bold(gem_name)} could not be installed."
|
19
|
-
next
|
20
|
-
end
|
21
|
-
end
|
8
|
+
destination = File.writable?(Gem.dir) ? Gem.dir : Gem.user_dir
|
9
|
+
installer = Gem::DependencyInstaller.new :install_dir => destination
|
10
|
+
installer.install gem
|
11
|
+
rescue Errno::EACCES
|
12
|
+
output.puts "Insufficient permissions to install `#{text.green gem}`"
|
22
13
|
rescue Gem::GemNotFoundException
|
23
|
-
output.puts "
|
24
|
-
|
14
|
+
output.puts "Gem `#{text.green gem}` not found."
|
15
|
+
else
|
16
|
+
Gem.refresh
|
17
|
+
output.puts "Gem `#{text.green gem}` installed."
|
25
18
|
end
|
26
|
-
|
27
|
-
Gem.refresh
|
28
|
-
output.puts "Refreshed gem cache."
|
29
19
|
end
|
30
20
|
|
31
|
-
command "gem-cd", "Change working directory to specified gem's directory." do |
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
Dir.chdir(File.expand_path(gem_spec.full_gem_path))
|
21
|
+
command "gem-cd", "Change working directory to specified gem's directory.", :argument_required => true do |gem|
|
22
|
+
specs = Gem::Specification.respond_to?(:each) ? Gem::Specification.find_all_by_name(gem) : Gem.source_index.find_name(gem)
|
23
|
+
spec = specs.sort { |a,b| Gem::Version.new(b.version) <=> Gem::Version.new(a.version) }.first
|
24
|
+
spec ? Dir.chdir(spec.full_gem_path) : output.puts("Gem `#{gem}` not found.")
|
36
25
|
end
|
37
26
|
|
27
|
+
command "gem-list", "List/search installed gems. (Optional parameter: a regexp to limit the search)" do |pattern|
|
28
|
+
pattern = Regexp.new pattern.to_s, Regexp::IGNORECASE
|
29
|
+
gems = if Gem::Specification.respond_to?(:each)
|
30
|
+
Gem::Specification.select{|spec| spec.name =~ pattern }.group_by(&:name)
|
31
|
+
else
|
32
|
+
Gem.source_index.gems.values.group_by(&:name).select { |gemname, specs| gemname =~ pattern }
|
33
|
+
end
|
34
|
+
|
35
|
+
gems.each do |gem, specs|
|
36
|
+
specs.sort! do |a,b|
|
37
|
+
Gem::Version.new(b.version) <=> Gem::Version.new(a.version)
|
38
|
+
end
|
38
39
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
query = Regexp.new(arg, Regexp::IGNORECASE)
|
43
|
-
gems = gems.select { |gemname, specs| gemname =~ query }
|
44
|
-
end
|
45
|
-
|
46
|
-
gems.each do |gemname, specs|
|
47
|
-
versions = specs.map(&:version).sort.reverse.map(&:to_s)
|
48
|
-
versions = ["<bright_green>#{versions.first}</bright_green>"] +
|
49
|
-
versions[1..-1].map{|v| "<green>#{v}</green>" }
|
40
|
+
versions = specs.each_with_index.map do |spec, index|
|
41
|
+
index == 0 ? text.bright_green(spec.version.to_s) : text.green(spec.version.to_s)
|
42
|
+
end
|
50
43
|
|
51
|
-
|
52
|
-
result = "<white>#{gemname} <grey>(#{versions.join ', '})</grey>"
|
53
|
-
output.puts colorize(result)
|
44
|
+
output.puts "#{text.white gem} (#{versions.join ', '})"
|
54
45
|
end
|
55
46
|
end
|
56
47
|
|
@@ -1,37 +1,245 @@
|
|
1
1
|
class Pry
|
2
2
|
module DefaultCommands
|
3
3
|
|
4
|
-
Input = Pry::CommandSet.new
|
4
|
+
Input = Pry::CommandSet.new do
|
5
5
|
|
6
6
|
command "!", "Clear the input buffer. Useful if the parsing process goes wrong and you get stuck in the read loop." do
|
7
7
|
output.puts "Input buffer cleared!"
|
8
|
-
|
8
|
+
eval_string.replace("")
|
9
9
|
end
|
10
10
|
|
11
|
-
command "
|
12
|
-
|
11
|
+
command "show-input", "Show the contents of the input buffer for the current multi-line expression." do
|
12
|
+
render_output(false, 1, Pry.color ? CodeRay.scan(eval_string, :ruby).term : eval_string)
|
13
|
+
end
|
14
|
+
|
15
|
+
command(/amend-line.?(-?\d+)?(?:\.\.(-?\d+))?/, "Amend a line of input in multi-line mode. Type `amend-line --help` for more information. Aliases %",
|
16
|
+
:interpolate => false, :listing => "amend-line") do |*args|
|
17
|
+
start_line_number, end_line_number, replacement_line = *args
|
18
|
+
|
19
|
+
opts = Slop.parse!(args.compact) do |opt|
|
20
|
+
opt.banner %{Amend a line of input in multi-line mode. `amend-line N`, where the N in `amend-line N` represents line to replace.
|
21
|
+
|
22
|
+
Can also specify a range of lines using `amend-line N..M` syntax. Passing '!' as replacement content deletes the line(s) instead. Aliases: %N
|
23
|
+
e.g amend-line 1 puts 'hello world! # replace line 1'
|
24
|
+
e.g amend-line 1..4 ! # delete lines 1..4
|
25
|
+
e.g amend-line 3 >puts 'goodbye' # insert before line 3
|
26
|
+
e.g amend-line puts 'hello again' # no line number modifies immediately preceding line
|
27
|
+
}
|
28
|
+
opt.on :h, :help, "This message." do
|
29
|
+
output.puts opt
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
next if opts.h?
|
34
|
+
next output.puts "No input to amend." if eval_string.empty?
|
35
|
+
|
36
|
+
replacement_line = "" if !replacement_line
|
37
|
+
input_array = eval_string.each_line.to_a
|
13
38
|
|
14
|
-
if
|
15
|
-
|
16
|
-
|
17
|
-
|
39
|
+
end_line_number = start_line_number.to_i if !end_line_number
|
40
|
+
line_range = start_line_number ? (one_index_number(start_line_number.to_i)..one_index_number(end_line_number.to_i)) : input_array.size - 1
|
41
|
+
|
42
|
+
# delete selected lines if replacement line is '!'
|
43
|
+
if arg_string == "!"
|
44
|
+
input_array.slice!(line_range)
|
45
|
+
elsif arg_string.start_with?(">")
|
46
|
+
insert_slot = Array(line_range).first
|
47
|
+
input_array.insert(insert_slot, arg_string[1..-1] + "\n")
|
48
|
+
else
|
49
|
+
input_array[line_range] = arg_string + "\n"
|
18
50
|
end
|
51
|
+
eval_string.replace input_array.join
|
52
|
+
run "show-input"
|
53
|
+
end
|
54
|
+
|
55
|
+
alias_command(/%.?(-?\d+)?(?:\.\.(-?\d+))?/, /amend-line.?(-?\d+)?(?:\.\.(-?\d+))?/, "")
|
56
|
+
|
57
|
+
command "play", "Play back a string or a method or a file as input. Type `play --help` for more information." do |*args|
|
58
|
+
opts = Slop.parse!(args) do |opt|
|
59
|
+
opt.banner "Usage: play [OPTIONS] [--help]\nDefault action (no options) is to play the provided string\ne.g `play puts 'hello world'` #=> \"hello world\"\ne.g `play -m Pry#repl --lines 1..-1`\ne.g `play -f Rakefile --lines 5`\n"
|
60
|
+
|
61
|
+
opt.on :l, :lines, 'The line (or range of lines) to replay.', true, :as => Range
|
62
|
+
opt.on :m, :method, 'Play a method.', true
|
63
|
+
opt.on :f, "file", 'The line (or range of lines) to replay.', true
|
64
|
+
opt.on :o, "open", 'When used with the -m switch, it plays the entire method except the last line, leaving the method definition "open". `amend-line` can then be used to modify the method.'
|
65
|
+
opt.on :h, :help, "This message." do
|
66
|
+
output.puts opt
|
67
|
+
end
|
68
|
+
|
69
|
+
opt.on_noopts { Pry.active_instance.input = StringIO.new(arg_string) }
|
70
|
+
end
|
71
|
+
|
72
|
+
if opts.m?
|
73
|
+
meth_name = opts[:m]
|
74
|
+
if (meth = get_method_object(meth_name, target, {})).nil?
|
75
|
+
output.puts "Invalid method name: #{meth_name}."
|
76
|
+
next
|
77
|
+
end
|
78
|
+
code, code_type = code_and_code_type_for(meth)
|
79
|
+
next if !code
|
80
|
+
|
81
|
+
range = opts.l? ? one_index_range_or_number(opts[:l]) : (0..-1)
|
82
|
+
range = (0..-2) if opts.o?
|
83
|
+
|
84
|
+
Pry.active_instance.input = StringIO.new(Array(code.each_line.to_a[range]).join)
|
85
|
+
end
|
86
|
+
|
87
|
+
if opts.f?
|
88
|
+
file_name = File.expand_path(opts[:f])
|
89
|
+
next output.puts "No such file: #{opts[:f]}" if !File.exists?(file_name)
|
90
|
+
text_array = File.readlines(file_name)
|
91
|
+
range = opts.l? ? one_index_range_or_number(opts[:l]) : (0..-1)
|
92
|
+
range = (0..-2) if opts.o?
|
93
|
+
|
94
|
+
Pry.active_instance.input = StringIO.new(Array(text_array[range]).join)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
command "hist", "Show and replay Readline history. Type `hist --help` for more info." do |*args|
|
99
|
+
history = Readline::HISTORY.to_a
|
100
|
+
|
101
|
+
opts = Slop.parse!(args) do |opt|
|
102
|
+
opt.banner "Usage: hist [--replay START..END] [--clear] [--grep PATTERN] [--head N] [--tail N] [--help] [--save [START..END] file.txt]\n"
|
103
|
+
|
104
|
+
opt.on :g, :grep, 'A pattern to match against the history.', true do |pattern|
|
105
|
+
pattern = Regexp.new arg_string.strip.split(/ /, 2).last.strip
|
106
|
+
history.pop
|
107
|
+
|
108
|
+
history.map!.with_index do |element, index|
|
109
|
+
if element =~ pattern
|
110
|
+
"#{text.blue index}: #{element}"
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
stagger_output history.compact.join "\n"
|
115
|
+
end
|
116
|
+
|
117
|
+
opt.on :head, 'Display the first N items of history',
|
118
|
+
:optional => true,
|
119
|
+
:as => Integer,
|
120
|
+
:unless => :grep do |limit|
|
121
|
+
|
122
|
+
limit ||= 10
|
123
|
+
list = history.first limit
|
124
|
+
lines = text.with_line_numbers list.join("\n"), 0
|
125
|
+
stagger_output lines
|
126
|
+
end
|
19
127
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
128
|
+
opt.on :t, :tail, 'Display the last N items of history',
|
129
|
+
:optional => true,
|
130
|
+
:as => Integer,
|
131
|
+
:unless => :grep do |limit|
|
132
|
+
|
133
|
+
limit ||= 10
|
134
|
+
offset = history.size-limit
|
135
|
+
offset = offset < 0 ? 0 : offset
|
136
|
+
|
137
|
+
list = history.last limit
|
138
|
+
lines = text.with_line_numbers list.join("\n"), offset
|
139
|
+
stagger_output lines
|
140
|
+
end
|
141
|
+
|
142
|
+
opt.on :s, :show, 'Show the history corresponding to the history line (or range of lines).',
|
143
|
+
true,
|
144
|
+
:as => Range,
|
145
|
+
:unless => :grep do |range|
|
146
|
+
|
147
|
+
start_line = range.is_a?(Range) ? range.first : range
|
148
|
+
lines = text.with_line_numbers Array(history[range]).join("\n"), start_line
|
149
|
+
stagger_output lines
|
150
|
+
end
|
151
|
+
|
152
|
+
opt.on :e, :exclude, 'Exclude pry commands from the history.', :unless => :grep do
|
153
|
+
history.map!.with_index do |element, index|
|
154
|
+
unless command_processor.valid_command? element
|
155
|
+
"#{text.blue index}: #{element}"
|
156
|
+
end
|
157
|
+
end
|
158
|
+
stagger_output history.compact.join "\n"
|
159
|
+
end
|
160
|
+
|
161
|
+
opt.on :r, :replay, 'The line (or range of lines) to replay.',
|
162
|
+
true,
|
163
|
+
:as => Range,
|
164
|
+
:unless => :grep do |range|
|
165
|
+
actions = Array(history[range]).join("\n") + "\n"
|
166
|
+
Pry.active_instance.input = StringIO.new(actions)
|
167
|
+
end
|
168
|
+
|
169
|
+
opt.on "save", "Save history to a file. --save [start..end] output.txt. Pry commands are excluded from saved history.", true, :as => Range
|
170
|
+
|
171
|
+
opt.on :c, :clear, 'Clear the history', :unless => :grep do
|
172
|
+
Readline::HISTORY.shift until Readline::HISTORY.empty?
|
173
|
+
output.puts 'History cleared.'
|
174
|
+
end
|
175
|
+
|
176
|
+
opt.on :h, :help, 'Show this message.', :tail => true, :unless => :grep do
|
24
177
|
output.puts opt.help
|
25
178
|
end
|
179
|
+
|
180
|
+
opt.on_empty do
|
181
|
+
lines = text.with_line_numbers history.join("\n"), 0
|
182
|
+
stagger_output lines
|
183
|
+
end
|
26
184
|
end
|
27
185
|
|
28
|
-
|
186
|
+
# FIXME: hack to save history (this must be refactored)
|
187
|
+
if opts["save"]
|
188
|
+
file_name = nil
|
189
|
+
hist_array = nil
|
190
|
+
|
191
|
+
case opts["save"]
|
192
|
+
when Range
|
193
|
+
hist_array = Array(history[opts["save"]])
|
194
|
+
next output.puts "Must provide a file name." if !args.first
|
195
|
+
file_name = File.expand_path(args.first)
|
196
|
+
when String
|
197
|
+
hist_array = history
|
198
|
+
file_name = File.expand_path(opts["save"])
|
199
|
+
end
|
200
|
+
|
201
|
+
output.puts "Saving history in #{file_name} ..."
|
202
|
+
# exclude pry commands
|
203
|
+
hist_array.reject! do |element|
|
204
|
+
command_processor.valid_command?(element)
|
205
|
+
end
|
206
|
+
|
207
|
+
File.open(file_name, 'w') do |f|
|
208
|
+
f.write hist_array.join("\n")
|
209
|
+
end
|
210
|
+
|
211
|
+
output.puts "... history saved."
|
212
|
+
end
|
29
213
|
|
30
|
-
actions = Array(hist_array[opts[:replay]]).join("\n") + "\n"
|
31
|
-
Pry.active_instance.input = StringIO.new(actions)
|
32
214
|
end
|
33
215
|
|
34
216
|
|
217
|
+
helpers do
|
218
|
+
def one_index_number(line_number)
|
219
|
+
if line_number > 0
|
220
|
+
line_number - 1
|
221
|
+
elsif line_number < 0
|
222
|
+
line_number
|
223
|
+
else
|
224
|
+
line_number
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
def one_index_range(range)
|
229
|
+
Range.new(one_index_number(range.begin), one_index_number(range.end))
|
230
|
+
end
|
231
|
+
|
232
|
+
def one_index_range_or_number(range_or_number)
|
233
|
+
case range_or_number
|
234
|
+
when Range
|
235
|
+
one_index_range(range_or_number)
|
236
|
+
else
|
237
|
+
one_index_number(range_or_number)
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
end
|
242
|
+
|
35
243
|
end
|
36
244
|
|
37
245
|
end
|
@@ -1,26 +1,27 @@
|
|
1
1
|
class Pry
|
2
2
|
module DefaultCommands
|
3
3
|
|
4
|
-
Introspection = Pry::CommandSet.new
|
4
|
+
Introspection = Pry::CommandSet.new do
|
5
5
|
|
6
6
|
command "show-method", "Show the source for METH. Type `show-method --help` for more info. Aliases: $, show-source" do |*args|
|
7
7
|
target = target()
|
8
8
|
|
9
|
-
opts = Slop.parse!(args) do |
|
10
|
-
|
11
|
-
Show the source for method METH. Tries instance methods first and then methods by default
|
12
|
-
e.g: show-method hello_method
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
9
|
+
opts = Slop.parse!(args) do |opt|
|
10
|
+
opt.banner "Usage: show-method [OPTIONS] [METH]\n" \
|
11
|
+
"Show the source for method METH. Tries instance methods first and then methods by default.\n" \
|
12
|
+
"e.g: show-method hello_method"
|
13
|
+
|
14
|
+
opt.on :l, "line-numbers", "Show line numbers."
|
15
|
+
opt.on :b, "base-one", "Show line numbers but start numbering at 1 (useful for `amend-line` and `play` commands)."
|
16
|
+
|
17
|
+
opt.on :M, "instance-methods", "Operate on instance methods."
|
18
|
+
opt.on :m, :methods, "Operate on methods."
|
19
|
+
opt.on :f, :flood, "Do not use a pager to view text longer than one screen."
|
20
|
+
opt.on :c, :context, "Select object context to run under.", true do |context|
|
20
21
|
target = Pry.binding_for(target.eval(context))
|
21
22
|
end
|
22
|
-
|
23
|
-
output.puts
|
23
|
+
opt.on :h, :help, "This message." do
|
24
|
+
output.puts opt
|
24
25
|
end
|
25
26
|
end
|
26
27
|
|
@@ -45,6 +46,9 @@ e.g: show-method hello_method
|
|
45
46
|
start_line = meth.source_location ? meth.source_location.last : 1
|
46
47
|
end
|
47
48
|
|
49
|
+
start_line = opts.b? ? 1 : start_line
|
50
|
+
|
51
|
+
|
48
52
|
render_output(opts.flood?, start_line, code)
|
49
53
|
code
|
50
54
|
end
|
@@ -53,79 +57,103 @@ e.g: show-method hello_method
|
|
53
57
|
alias_command "$", "show-method", ""
|
54
58
|
|
55
59
|
command "show-command", "Show the source for CMD. Type `show-command --help` for more info." do |*args|
|
56
|
-
options = {}
|
57
60
|
target = target()
|
58
|
-
command_name = nil
|
59
|
-
|
60
|
-
OptionParser.new do |opts|
|
61
|
-
opts.banner = %{Usage: show-command [OPTIONS] [CMD]
|
62
|
-
Show the source for command CMD.
|
63
|
-
e.g: show-command show-method
|
64
|
-
--
|
65
|
-
}
|
66
|
-
opts.on("-l", "--line-numbers", "Show line numbers.") do |line|
|
67
|
-
options[:l] = true
|
68
|
-
end
|
69
61
|
|
70
|
-
|
71
|
-
|
72
|
-
|
62
|
+
opts = Slop.parse!(args) do |opt|
|
63
|
+
opt.banner = "Usage: show-command [OPTIONS] [CMD]\n" \
|
64
|
+
"Show the source for command CMD.\n" \
|
65
|
+
"e.g: show-command show-method"
|
73
66
|
|
74
|
-
|
75
|
-
|
76
|
-
|
67
|
+
opt.on :l, "line-numbers", "Show line numbers."
|
68
|
+
opt.on :f, :flood, "Do not use a pager to view text longer than one screen."
|
69
|
+
opt.on :h, :help, "This message." do
|
70
|
+
output.puts opt
|
77
71
|
end
|
78
|
-
end.order(args) do |v|
|
79
|
-
command_name = v
|
80
72
|
end
|
81
73
|
|
82
|
-
next if
|
74
|
+
next if opts.help?
|
83
75
|
|
76
|
+
command_name = args.shift
|
84
77
|
if !command_name
|
85
78
|
output.puts "You must provide a command name."
|
86
79
|
next
|
87
80
|
end
|
88
81
|
|
89
|
-
if
|
90
|
-
|
82
|
+
if find_command(command_name)
|
83
|
+
block = find_command(command_name).block
|
91
84
|
|
92
|
-
code =
|
93
|
-
|
94
|
-
set_file_and_dir_locals(file)
|
95
|
-
check_for_dynamically_defined_method(meth)
|
85
|
+
code, _ = code_and_code_type_for(block)
|
86
|
+
next if !code
|
96
87
|
|
97
|
-
output.puts make_header(
|
88
|
+
output.puts make_header(block, :ruby, code)
|
98
89
|
|
99
90
|
if Pry.color
|
100
91
|
code = CodeRay.scan(code, :ruby).term
|
101
92
|
end
|
102
93
|
|
103
|
-
|
94
|
+
start_line = false
|
95
|
+
if opts.l?
|
96
|
+
start_line = block.source_location ? block.source_location.last : 1
|
97
|
+
end
|
98
|
+
|
99
|
+
render_output(opts.flood?, opts.l? ? block.source_location.last : false, code)
|
104
100
|
code
|
105
101
|
else
|
106
102
|
output.puts "No such command: #{command_name}."
|
107
103
|
end
|
108
104
|
end
|
109
105
|
|
106
|
+
command "edit", "Invoke the default editor on a file. Type `edit --help` for more info" do |*args|
|
107
|
+
opts = Slop.parse!(args) do |opt|
|
108
|
+
opt.banner "Usage: edit [OPTIONS] [FILE]\n" \
|
109
|
+
"Edit the method FILE in an editor.\n" \
|
110
|
+
"Ensure #{text.bold("Pry.editor")} is set to your editor of choice.\n" \
|
111
|
+
"e.g: edit sample.rb"
|
112
|
+
|
113
|
+
opt.on :r, "reload", "Eval file content after editing (using `load`)"
|
114
|
+
opt.on :p, "play", "Use the pry `play` command to eval the file content after editing (instead of the `load` method)."
|
115
|
+
opt.on :l, "line", "Specify line number to jump to in file", true, :as => Integer
|
116
|
+
opt.on :h, :help, "This message." do
|
117
|
+
output.puts opt
|
118
|
+
end
|
119
|
+
end
|
120
|
+
next if opts.h?
|
121
|
+
|
122
|
+
next output.puts("Need to specify a file.") if !args.first
|
123
|
+
file_name = File.expand_path(args.first)
|
124
|
+
|
125
|
+
invoke_editor(file_name, opts[:l].to_i)
|
126
|
+
set_file_and_dir_locals(file_name)
|
127
|
+
|
128
|
+
if opts[:r]
|
129
|
+
silence_warnings do
|
130
|
+
load file_name
|
131
|
+
end
|
132
|
+
elsif opts[:p]
|
133
|
+
silence_warnings do
|
134
|
+
Pry.active_instance.input = StringIO.new(File.readlines(file_name).join)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
110
139
|
command "edit-method", "Edit a method. Type `edit-method --help` for more info." do |*args|
|
111
140
|
target = target()
|
112
141
|
|
113
|
-
opts = Slop.parse!(args) do |
|
114
|
-
|
115
|
-
Edit the method METH in an editor
|
116
|
-
Ensure #{bold("Pry.editor")} is set to your editor of choice
|
117
|
-
e.g: edit-method hello_method
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
opts.on :c, :context, "Select object context to run under.", true do |context|
|
142
|
+
opts = Slop.parse!(args) do |opt|
|
143
|
+
opt.banner "Usage: edit-method [OPTIONS] [METH]\n" \
|
144
|
+
"Edit the method METH in an editor.\n" \
|
145
|
+
"Ensure #{text.bold("Pry.editor")} is set to your editor of choice.\n" \
|
146
|
+
"e.g: edit-method hello_method"
|
147
|
+
|
148
|
+
opt.on :M, "instance-methods", "Operate on instance methods."
|
149
|
+
opt.on :m, :methods, "Operate on methods."
|
150
|
+
opt.on :n, "no-reload", "Do not automatically reload the method's file after editting."
|
151
|
+
opt.on "no-jump", "Do not fast forward editor to first line of method."
|
152
|
+
opt.on :c, :context, "Select object context to run under.", true do |context|
|
125
153
|
target = Pry.binding_for(target.eval(context))
|
126
154
|
end
|
127
|
-
|
128
|
-
output.puts
|
155
|
+
opt.on :h, :help, "This message." do
|
156
|
+
output.puts opt
|
129
157
|
end
|
130
158
|
end
|
131
159
|
|
@@ -137,7 +165,7 @@ e.g: edit-method hello_method
|
|
137
165
|
next
|
138
166
|
end
|
139
167
|
|
140
|
-
next output.puts "Error: No editor set!\nEnsure that #{bold("Pry.editor")} is set to your editor of choice." if !Pry.editor
|
168
|
+
next output.puts "Error: No editor set!\nEnsure that #{text.bold("Pry.editor")} is set to your editor of choice." if !Pry.editor
|
141
169
|
|
142
170
|
if is_a_c_method?(meth)
|
143
171
|
output.puts "Error: Can't edit a C method."
|
@@ -146,38 +174,45 @@ e.g: edit-method hello_method
|
|
146
174
|
|
147
175
|
# editor is invoked here
|
148
176
|
else
|
149
|
-
file, line = meth
|
177
|
+
file, line = path_line_for(meth)
|
150
178
|
set_file_and_dir_locals(file)
|
151
179
|
|
180
|
+
invoke_editor(file, opts["no-jump"] ? 0 : line)
|
181
|
+
silence_warnings do
|
182
|
+
load file if !opts.n?
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
helpers do
|
188
|
+
|
189
|
+
def invoke_editor(file, line)
|
152
190
|
if Pry.editor.respond_to?(:call)
|
153
191
|
editor_invocation = Pry.editor.call(file, line)
|
154
192
|
else
|
155
|
-
|
156
|
-
start_line_syntax = opts.n? ? "" : start_line_for_editor(line)
|
157
|
-
editor_invocation = "#{Pry.editor} #{start_line_syntax} #{file}"
|
193
|
+
editor_invocation = "#{Pry.editor} #{start_line_syntax_for_editor(file, line)}"
|
158
194
|
end
|
159
195
|
|
160
196
|
run ".#{editor_invocation}"
|
161
|
-
silence_warnings do
|
162
|
-
load file if !opts["no-reload"]
|
163
|
-
end
|
164
197
|
end
|
165
|
-
end
|
166
198
|
|
199
|
+
def start_line_syntax_for_editor(file_name, line_number)
|
200
|
+
file_name.gsub!(/\//, '\\') if RUBY_PLATFORM =~ /mswin|mingw/
|
167
201
|
|
168
|
-
helpers do
|
169
|
-
|
170
|
-
def start_line_for_editor(line_number)
|
171
202
|
case Pry.editor
|
172
203
|
when /^[gm]?vi/, /^emacs/, /^nano/, /^pico/, /^gedit/, /^kate/
|
173
|
-
"+#{line_number}"
|
204
|
+
"+#{line_number} #{file_name}"
|
174
205
|
when /^mate/, /^geany/
|
175
|
-
"-l #{line_number}"
|
206
|
+
"-l #{line_number} #{file_name}"
|
207
|
+
when /^uedit32/
|
208
|
+
"#{file_name}/#{line_number}"
|
209
|
+
when /^jedit/
|
210
|
+
"#{file_name} +#{line_number}"
|
176
211
|
else
|
177
212
|
if RUBY_PLATFORM =~ /mswin|mingw/
|
178
|
-
""
|
213
|
+
"#{file_name}"
|
179
214
|
else
|
180
|
-
"+#{line_number}"
|
215
|
+
"+#{line_number} #{file_name}"
|
181
216
|
end
|
182
217
|
end
|
183
218
|
end
|