pry 0.9.6.2-i386-mingw32 → 0.9.7-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/.gitignore +6 -0
- data/CHANGELOG +19 -1
- data/CONTRIBUTORS +22 -16
- data/Rakefile +12 -6
- data/bin/pry +15 -12
- data/lib/pry.rb +39 -28
- data/lib/pry/command_context.rb +1 -0
- data/lib/pry/command_processor.rb +9 -2
- data/lib/pry/command_set.rb +7 -0
- data/lib/pry/config.rb +8 -0
- data/lib/pry/default_commands/basic.rb +7 -10
- data/lib/pry/default_commands/context.rb +36 -26
- data/lib/pry/default_commands/documentation.rb +31 -123
- data/lib/pry/default_commands/gems.rb +9 -4
- data/lib/pry/default_commands/input.rb +21 -11
- data/lib/pry/default_commands/introspection.rb +79 -88
- data/lib/pry/default_commands/ls.rb +165 -176
- data/lib/pry/default_commands/shell.rb +8 -8
- data/lib/pry/extended_commands/experimental.rb +1 -5
- data/lib/pry/extended_commands/user_command_api.rb +17 -5
- data/lib/pry/helpers.rb +1 -0
- data/lib/pry/helpers/base_helpers.rb +5 -1
- data/lib/pry/helpers/command_helpers.rb +22 -241
- data/lib/pry/helpers/options_helpers.rb +58 -0
- data/lib/pry/helpers/text.rb +10 -4
- data/lib/pry/history.rb +1 -1
- data/lib/pry/indent.rb +205 -0
- data/lib/pry/method.rb +412 -0
- data/lib/pry/pry_class.rb +56 -15
- data/lib/pry/pry_instance.rb +63 -16
- data/lib/pry/rbx_method.rb +20 -0
- data/lib/pry/rbx_path.rb +34 -0
- data/lib/pry/version.rb +1 -1
- data/pry.gemspec +16 -16
- data/test/helper.rb +8 -4
- data/test/test_command_helpers.rb +1 -69
- data/test/test_command_set.rb +29 -28
- data/test/test_default_commands/test_documentation.rb +23 -10
- data/test/test_default_commands/test_introspection.rb +58 -13
- data/test/test_default_commands/test_ls.rb +148 -0
- data/test/test_indent.rb +234 -0
- data/test/test_input_stack.rb +13 -0
- data/test/test_method.rb +291 -0
- data/test/test_pry.rb +10 -1
- metadata +88 -71
@@ -4,7 +4,9 @@ class Pry
|
|
4
4
|
UserCommandAPI = Pry::CommandSet.new do
|
5
5
|
|
6
6
|
command "define-command", "Define a command in the session, use same syntax as `command` method for command API" do |arg|
|
7
|
-
|
7
|
+
if arg.nil?
|
8
|
+
raise CommandError, "Provide an arg!"
|
9
|
+
end
|
8
10
|
|
9
11
|
prime_string = "command #{arg_string}\n"
|
10
12
|
command_string = _pry_.r(target, prime_string)
|
@@ -18,8 +20,13 @@ class Pry
|
|
18
20
|
end
|
19
21
|
|
20
22
|
command "reload-command", "Reload a command. reload-command CMD_NAME CMD_SET" do |command_name, set_name|
|
21
|
-
|
22
|
-
|
23
|
+
if command_name.nil?
|
24
|
+
raise CommandError, "Must provide command name"
|
25
|
+
end
|
26
|
+
|
27
|
+
if set_name.nil?
|
28
|
+
raise CommandError, "Must provide command set name"
|
29
|
+
end
|
23
30
|
|
24
31
|
cmd = Pry.config.commands.commands[command_name]
|
25
32
|
file_name = cmd.block.source_location.first
|
@@ -33,8 +40,13 @@ class Pry
|
|
33
40
|
end
|
34
41
|
|
35
42
|
command "edit-command", "Edit a command. edit-command CMD_NAME CMD_SET" do |command_name, set_name|
|
36
|
-
|
37
|
-
|
43
|
+
if command_name.nil?
|
44
|
+
raise CommandError, "Must provide command name"
|
45
|
+
end
|
46
|
+
|
47
|
+
if set_name.nil?
|
48
|
+
raise CommandError, "Must provide command set name"
|
49
|
+
end
|
38
50
|
|
39
51
|
cmd = Pry.config.commands.commands[command_name]
|
40
52
|
file_name = cmd.block.source_location.first
|
data/lib/pry/helpers.rb
CHANGED
@@ -35,7 +35,7 @@ class Pry
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def set_file_and_dir_locals(file_name)
|
38
|
-
return if !target
|
38
|
+
return if !target or !file_name
|
39
39
|
_pry_.last_file = File.expand_path(file_name)
|
40
40
|
_pry_.inject_local("_file_", _pry_.last_file, target)
|
41
41
|
|
@@ -65,6 +65,10 @@ class Pry
|
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
68
|
+
def use_ansi_codes?
|
69
|
+
defined?(Win32::Console) || ENV['TERM'] && ENV['TERM'] != "dumb"
|
70
|
+
end
|
71
|
+
|
68
72
|
def colorize_code(code)
|
69
73
|
if Pry.color
|
70
74
|
CodeRay.scan(code, :ruby).term
|
@@ -2,18 +2,10 @@ class Pry
|
|
2
2
|
module Helpers
|
3
3
|
|
4
4
|
module CommandHelpers
|
5
|
+
include OptionsHelpers
|
5
6
|
|
6
7
|
module_function
|
7
8
|
|
8
|
-
def meth_name_from_binding(b)
|
9
|
-
meth_name = b.eval('__method__')
|
10
|
-
if [:__script__, nil, :__binding__, :__binding_impl__].include?(meth_name)
|
11
|
-
nil
|
12
|
-
else
|
13
|
-
meth_name
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
9
|
# if start_line is not false then add line numbers starting with start_line
|
18
10
|
def render_output(should_flood, start_line, text, color=:blue)
|
19
11
|
if start_line
|
@@ -27,18 +19,6 @@ class Pry
|
|
27
19
|
end
|
28
20
|
end
|
29
21
|
|
30
|
-
def is_a_dynamically_defined_method?(meth)
|
31
|
-
file, _ = meth.source_location
|
32
|
-
!!(file =~ /(\(.*\))|<.*>/)
|
33
|
-
end
|
34
|
-
|
35
|
-
def check_for_dynamically_defined_method(meth)
|
36
|
-
file, _ = meth.source_location
|
37
|
-
if file =~ /(\(.*\))|<.*>/ && file != Pry.eval_path
|
38
|
-
raise "Cannot retrieve source for dynamically defined method."
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
22
|
# Open a temp file and yield it to the block, closing it after
|
43
23
|
# @return [String] The path of the temp file
|
44
24
|
def temp_file
|
@@ -48,223 +28,42 @@ class Pry
|
|
48
28
|
file.close
|
49
29
|
end
|
50
30
|
|
51
|
-
|
52
|
-
|
53
|
-
rbx? &&
|
54
|
-
path.start_with?("kernel")
|
55
|
-
end
|
56
|
-
|
57
|
-
def rbx_core?(meth)
|
58
|
-
meth.source_location &&
|
59
|
-
is_core_rbx_path?(meth.source_location.first)
|
60
|
-
end
|
61
|
-
|
62
|
-
def rvm_ruby?(path)
|
63
|
-
!!(path =~ /\.rvm/)
|
64
|
-
end
|
65
|
-
|
66
|
-
def rbx_core_code_for(meth)
|
67
|
-
rbx_core_code_or_doc_for(meth, :code)
|
68
|
-
end
|
69
|
-
|
70
|
-
def rbx_core_doc_for(meth)
|
71
|
-
rbx_core_code_or_doc_for(meth, :doc)
|
72
|
-
end
|
73
|
-
|
74
|
-
def rbx_core_code_or_doc_for(meth, code_or_doc)
|
75
|
-
path_line = rbx_core_path_line_for(meth)
|
31
|
+
def get_method_or_raise(name, target, opts={}, omit_help=false)
|
32
|
+
meth = Pry::Method.from_str(name, target, opts)
|
76
33
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
MethodSource.comment_helper(path_line)
|
34
|
+
if name && !meth
|
35
|
+
command_error("The method '#{name}' could not be found.", omit_help)
|
36
|
+
elsif !meth
|
37
|
+
command_error("No method name given, and context is not a method.", omit_help)
|
82
38
|
end
|
83
|
-
end
|
84
|
-
|
85
|
-
def rbx_convert_path_to_full(path)
|
86
|
-
if rvm_ruby?(Rubinius::BIN_PATH)
|
87
|
-
rbx_rvm_convert_path_to_full(path)
|
88
|
-
else
|
89
|
-
rbx_std_convert_path_to_full(path)
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
def rbx_rvm_convert_path_to_full(path)
|
94
|
-
ruby_name = File.dirname(Rubinius::BIN_PATH).split("/").last
|
95
|
-
source_path = File.join(File.dirname(File.dirname(File.dirname(Rubinius::BIN_PATH))), "src", ruby_name)
|
96
|
-
file_name = File.join(source_path, path)
|
97
|
-
raise "Cannot find rbx core source" if !File.exists?(file_name)
|
98
|
-
file_name
|
99
|
-
end
|
100
|
-
|
101
|
-
def rbx_std_convert_path_to_full(path)
|
102
|
-
file_name = File.join(Rubinius::BIN_PATH, "..", path)
|
103
|
-
raise "Cannot find rbx core source" if !File.exists?(file_name)
|
104
|
-
file_name
|
105
|
-
end
|
106
|
-
|
107
|
-
def rbx_core_path_line_for(meth)
|
108
|
-
if rvm_ruby?(Rubinius::BIN_PATH)
|
109
|
-
rvm_rbx_core_path_line_for(meth)
|
110
|
-
else
|
111
|
-
std_rbx_core_path_line_for(meth)
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
def std_rbx_core_path_line_for(meth)
|
116
|
-
file_name = rbx_std_convert_path_to_full(meth.source_location.first)
|
117
|
-
start_line = meth.source_location.last
|
118
|
-
|
119
|
-
[file_name, start_line]
|
120
|
-
end
|
121
|
-
|
122
|
-
def rvm_rbx_core_path_line_for(meth)
|
123
|
-
file_name = rbx_rvm_convert_path_to_full(meth.source_location.first)
|
124
|
-
start_line = meth.source_location.last
|
125
|
-
|
126
|
-
[file_name, start_line]
|
127
|
-
end
|
128
39
|
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
case code_type = code_type_for(meth)
|
133
|
-
when nil
|
134
|
-
return nil
|
135
|
-
when :c
|
136
|
-
code = Pry::MethodInfo.info_for(meth).source
|
137
|
-
code = strip_comments_from_c_code(code)
|
138
|
-
when :ruby
|
139
|
-
if meth.source_location.first == Pry.eval_path
|
140
|
-
start_line = meth.source_location.last
|
141
|
-
|
142
|
-
# FIXME this line below needs to be refactored, WAY too
|
143
|
-
# much of a hack. We pass nothing to prompt because if
|
144
|
-
# prompt uses #inspect (or #pretty_inspect) on the context
|
145
|
-
# it can hang the session if the object being inspected on
|
146
|
-
# is enormous see: https://github.com/pry/pry/issues/245
|
147
|
-
p = Pry.new(:input => StringIO.new(Pry.line_buffer[start_line..-1].join), :prompt => proc {""}, :hooks => {}).r(target)
|
148
|
-
code = strip_leading_whitespace(p)
|
40
|
+
(opts[:super] || 0).times do
|
41
|
+
if meth.super
|
42
|
+
meth = meth.super
|
149
43
|
else
|
150
|
-
|
151
|
-
code = strip_leading_whitespace(rbx_core_code_for(meth))
|
152
|
-
else
|
153
|
-
code = strip_leading_whitespace(meth.source)
|
154
|
-
end
|
44
|
+
command_error("The method '#{meth.name}' is not defined in a superclass of '#{class_name(meth.owner)}'.", omit_help)
|
155
45
|
end
|
156
|
-
set_file_and_dir_locals(path_line_for(meth).first)
|
157
46
|
end
|
158
47
|
|
159
|
-
|
48
|
+
set_file_and_dir_locals(meth.source_file)
|
49
|
+
meth
|
160
50
|
end
|
161
51
|
|
162
|
-
def
|
163
|
-
|
164
|
-
|
165
|
-
return nil
|
166
|
-
when :c
|
167
|
-
doc = Pry::MethodInfo.info_for(meth).docstring
|
168
|
-
when :ruby
|
169
|
-
if rbx_core?(meth)
|
170
|
-
doc = strip_leading_hash_and_whitespace_from_ruby_comments(rbx_core_doc_for(meth))
|
171
|
-
else
|
172
|
-
doc = strip_leading_hash_and_whitespace_from_ruby_comments(meth.comment)
|
173
|
-
end
|
174
|
-
set_file_and_dir_locals(path_line_for(meth).first)
|
175
|
-
end
|
176
|
-
|
177
|
-
[doc, code_type]
|
52
|
+
def command_error(message, omit_help)
|
53
|
+
message += " Type `#{command_name} --help` for help." unless omit_help
|
54
|
+
raise CommandError, message
|
178
55
|
end
|
179
56
|
|
180
|
-
def
|
181
|
-
|
182
|
-
end
|
57
|
+
def make_header(meth, content=meth.source)
|
58
|
+
header = "\n#{Pry::Helpers::Text.bold('From:')} #{meth.source_file} "
|
183
59
|
|
184
|
-
|
185
|
-
|
186
|
-
if meth_name =~ /(\S+)\#(\S+)\Z/
|
187
|
-
context, meth_name = $1, $2
|
188
|
-
target = Pry.binding_for(target.eval(context))
|
189
|
-
type = :instance
|
190
|
-
elsif meth_name =~ /(\S+)\.(\S+)\Z/
|
191
|
-
context, meth_name = $1, $2
|
192
|
-
target = Pry.binding_for(target.eval(context))
|
193
|
-
type = :singleton
|
194
|
-
elsif options["instance_methods"]
|
195
|
-
type = :instance
|
196
|
-
elsif options[:methods]
|
197
|
-
type = :singleton
|
198
|
-
else
|
199
|
-
type = nil
|
200
|
-
end
|
60
|
+
if meth.source_type == :c
|
61
|
+
header << "in Ruby Core (C Method):\n"
|
201
62
|
else
|
202
|
-
|
203
|
-
type = nil
|
63
|
+
header << "@ line #{meth.source_line}:\n"
|
204
64
|
end
|
205
|
-
[meth_name, target, type]
|
206
|
-
end
|
207
65
|
|
208
|
-
|
209
|
-
case type
|
210
|
-
when :instance
|
211
|
-
target.eval("instance_method(:#{meth_name})") rescue nil
|
212
|
-
when :singleton
|
213
|
-
target.eval("method(:#{meth_name})") rescue nil
|
214
|
-
else
|
215
|
-
get_method_object_from_target(meth_name, target, :instance) ||
|
216
|
-
get_method_object_from_target(meth_name, target, :singleton)
|
217
|
-
end
|
218
|
-
end
|
219
|
-
|
220
|
-
def path_line_for(meth)
|
221
|
-
if rbx_core?(meth)
|
222
|
-
rbx_core_path_line_for(meth)
|
223
|
-
else
|
224
|
-
meth.source_location
|
225
|
-
end
|
226
|
-
end
|
227
|
-
|
228
|
-
def make_header(meth, code_type, content)
|
229
|
-
num_lines = "Number of lines: #{Pry::Helpers::Text.bold(content.each_line.count.to_s)}"
|
230
|
-
case code_type
|
231
|
-
when :ruby
|
232
|
-
file, line = path_line_for(meth)
|
233
|
-
"\n#{Pry::Helpers::Text.bold('From:')} #{file} @ line #{line}:\n#{num_lines}\n\n"
|
234
|
-
else
|
235
|
-
file = Pry::MethodInfo.info_for(meth).file
|
236
|
-
"\n#{Pry::Helpers::Text.bold('From:')} #{file} in Ruby Core (C Method):\n#{num_lines}\n\n"
|
237
|
-
end
|
238
|
-
end
|
239
|
-
|
240
|
-
def is_a_c_method?(meth)
|
241
|
-
meth.source_location.nil?
|
242
|
-
end
|
243
|
-
|
244
|
-
def should_use_pry_doc?(meth)
|
245
|
-
Pry.config.has_pry_doc && is_a_c_method?(meth)
|
246
|
-
end
|
247
|
-
|
248
|
-
def code_type_for(meth)
|
249
|
-
# only C methods
|
250
|
-
if should_use_pry_doc?(meth)
|
251
|
-
info = Pry::MethodInfo.info_for(meth)
|
252
|
-
if info && info.source
|
253
|
-
code_type = :c
|
254
|
-
else
|
255
|
-
output.puts "Cannot find C method: #{meth.name}"
|
256
|
-
code_type = nil
|
257
|
-
end
|
258
|
-
else
|
259
|
-
if is_a_c_method?(meth)
|
260
|
-
output.puts "Cannot locate this method: #{meth.name}. Try `gem install pry-doc` to get access to Ruby Core documentation."
|
261
|
-
code_type = nil
|
262
|
-
else
|
263
|
-
check_for_dynamically_defined_method(meth)
|
264
|
-
code_type = :ruby
|
265
|
-
end
|
266
|
-
end
|
267
|
-
code_type
|
66
|
+
header << "#{Pry::Helpers::Text.bold("Number of lines:")} #{content.each_line.count.to_s}\n"
|
268
67
|
end
|
269
68
|
|
270
69
|
def file_map
|
@@ -357,24 +156,6 @@ class Pry
|
|
357
156
|
process_yardoc process_rdoc(comment, code_type)
|
358
157
|
end
|
359
158
|
|
360
|
-
# strip leading whitespace but preserve indentation
|
361
|
-
def strip_leading_whitespace(text)
|
362
|
-
return text if text.empty?
|
363
|
-
leading_spaces = text.lines.first[/^(\s+)/, 1]
|
364
|
-
text.gsub(/^#{leading_spaces}/, '')
|
365
|
-
end
|
366
|
-
|
367
|
-
def strip_leading_hash_and_whitespace_from_ruby_comments(comment)
|
368
|
-
comment = comment.dup
|
369
|
-
comment.gsub!(/\A\#+?$/, '')
|
370
|
-
comment.gsub!(/^\s*#/, '')
|
371
|
-
strip_leading_whitespace(comment)
|
372
|
-
end
|
373
|
-
|
374
|
-
def strip_comments_from_c_code(code)
|
375
|
-
code.sub(/\A\s*\/\*.*?\*\/\s*/m, '')
|
376
|
-
end
|
377
|
-
|
378
159
|
def invoke_editor(file, line)
|
379
160
|
if Pry.config.editor.respond_to?(:call)
|
380
161
|
editor_invocation = Pry.config.editor.call(file, line)
|
@@ -0,0 +1,58 @@
|
|
1
|
+
class Pry
|
2
|
+
module Helpers
|
3
|
+
module OptionsHelpers
|
4
|
+
module_function
|
5
|
+
|
6
|
+
# Use Slop to parse the arguments given.
|
7
|
+
#
|
8
|
+
# @param [Array] args The options are stripped out by Slop.
|
9
|
+
# @param [*Symbol] extras Extra features you want returned.
|
10
|
+
# @param [&Block] used to add custom arguments to Slop.
|
11
|
+
#
|
12
|
+
# @option [Extra] :method_object Returns a method object.
|
13
|
+
#
|
14
|
+
# @return Slop::Options iff you don't pass any extras.
|
15
|
+
# @return [Array] If you do pass extras, an array is returned where the first argument is the
|
16
|
+
# Slop::Options object, and the remainder are the extras you requested in order.
|
17
|
+
#
|
18
|
+
def parse_options!(args, *extras, &block)
|
19
|
+
opts = Slop.parse!(args) do |opt|
|
20
|
+
extras.each{ |extra| send(:"add_#{extra}_options", opt) }
|
21
|
+
|
22
|
+
yield opt
|
23
|
+
|
24
|
+
opt.on :h, :help, "This message" do
|
25
|
+
output.puts opt
|
26
|
+
throw :command_done
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
if extras.empty?
|
31
|
+
opts
|
32
|
+
else
|
33
|
+
[opts] + extras.map{ |extra| send(:"process_#{extra}_options", args, opts) }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# Add the method object options to an unused Slop instance.
|
38
|
+
def add_method_object_options(opt)
|
39
|
+
@method_target = target
|
40
|
+
opt.on :M, "instance-methods", "Operate on instance methods."
|
41
|
+
opt.on :m, :methods, "Operate on methods."
|
42
|
+
opt.on :s, :super, "Select the 'super' method. Can be repeated to traverse the ancestors."
|
43
|
+
opt.on :c, :context, "Select object context to run under.", true do |context|
|
44
|
+
@method_target = Pry.binding_for(target.eval(context))
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Add the derived :method_object option to a used Slop instance.
|
49
|
+
def process_method_object_options(args, opts)
|
50
|
+
opts[:instance] = opts['instance-methods'] if opts.m?
|
51
|
+
# TODO: de-hack when we upgrade Slop: https://github.com/injekt/slop/pull/30
|
52
|
+
opts.options[:super].force_argument_value opts.options[:super].count if opts.super?
|
53
|
+
|
54
|
+
get_method_or_raise(args.empty? ? nil : args.join(" "), @method_target, opts.to_hash(true))
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/lib/pry/helpers/text.rb
CHANGED
@@ -29,10 +29,6 @@ class Pry
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
alias_method :grey, :bright_black
|
33
|
-
alias_method :gray, :bright_black
|
34
|
-
|
35
|
-
|
36
32
|
# Remove any color codes from _text_.
|
37
33
|
#
|
38
34
|
# @param [String, #to_s] text
|
@@ -50,6 +46,16 @@ class Pry
|
|
50
46
|
Pry.color ? "\e[1m#{text}\e[0m" : text.to_s
|
51
47
|
end
|
52
48
|
|
49
|
+
# Returns _text_ in the default foreground colour.
|
50
|
+
# Use this instead of "black" or "white" when you mean absence of colour.
|
51
|
+
#
|
52
|
+
# @param [String, #to_s]
|
53
|
+
# @return [String] _text_
|
54
|
+
def default(text)
|
55
|
+
text.to_s
|
56
|
+
end
|
57
|
+
alias_method :bright_default, :bold
|
58
|
+
|
53
59
|
# Executes _block_ with _Pry.color_ set to false.
|
54
60
|
#
|
55
61
|
# @param [Proc]
|