pry 0.9.9.6pre2-i386-mingw32 → 0.9.10-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/CHANGELOG +41 -0
- data/CONTRIBUTORS +27 -26
- data/README.markdown +4 -4
- data/Rakefile +2 -2
- data/lib/pry.rb +25 -19
- data/lib/pry/cli.rb +31 -10
- data/lib/pry/code.rb +41 -83
- data/lib/pry/command.rb +87 -76
- data/lib/pry/command_set.rb +13 -20
- data/lib/pry/completion.rb +139 -121
- data/lib/pry/config.rb +4 -0
- data/lib/pry/core_extensions.rb +88 -31
- data/lib/pry/default_commands/cd.rb +31 -8
- data/lib/pry/default_commands/context.rb +4 -58
- data/lib/pry/default_commands/easter_eggs.rb +1 -1
- data/lib/pry/default_commands/editing.rb +21 -14
- data/lib/pry/default_commands/find_method.rb +5 -7
- data/lib/pry/default_commands/gist.rb +187 -0
- data/lib/pry/default_commands/hist.rb +6 -6
- data/lib/pry/default_commands/input_and_output.rb +73 -129
- data/lib/pry/default_commands/introspection.rb +107 -52
- data/lib/pry/default_commands/ls.rb +1 -1
- data/lib/pry/default_commands/misc.rb +0 -5
- data/lib/pry/default_commands/whereami.rb +92 -0
- data/lib/pry/helpers/base_helpers.rb +6 -1
- data/lib/pry/helpers/command_helpers.rb +30 -9
- data/lib/pry/helpers/documentation_helpers.rb +7 -7
- data/lib/pry/helpers/options_helpers.rb +1 -1
- data/lib/pry/helpers/text.rb +7 -9
- data/lib/pry/history.rb +15 -2
- data/lib/pry/hooks.rb +1 -1
- data/lib/pry/indent.rb +17 -10
- data/lib/pry/method.rb +35 -19
- data/lib/pry/module_candidate.rb +130 -0
- data/lib/pry/pry_class.rb +54 -22
- data/lib/pry/pry_instance.rb +71 -14
- data/lib/pry/repl_file_loader.rb +80 -0
- data/lib/pry/version.rb +1 -1
- data/lib/pry/wrapped_module.rb +121 -142
- data/pry.gemspec +13 -13
- data/test/candidate_helper1.rb +11 -0
- data/test/candidate_helper2.rb +8 -0
- data/test/helper.rb +16 -0
- data/test/test_code.rb +1 -1
- data/test/test_command.rb +364 -270
- data/test/test_command_integration.rb +235 -267
- data/test/test_completion.rb +36 -0
- data/test/test_control_d_handler.rb +45 -0
- data/test/test_default_commands/example.erb +5 -0
- data/test/test_default_commands/test_cd.rb +316 -11
- data/test/test_default_commands/test_context.rb +143 -192
- data/test/test_default_commands/test_documentation.rb +81 -14
- data/test/test_default_commands/test_find_method.rb +10 -2
- data/test/test_default_commands/test_input.rb +102 -111
- data/test/test_default_commands/test_introspection.rb +17 -12
- data/test/test_default_commands/test_ls.rb +8 -6
- data/test/test_default_commands/test_shell.rb +18 -15
- data/test/test_default_commands/test_show_source.rb +170 -44
- data/test/test_exception_whitelist.rb +6 -2
- data/test/test_hooks.rb +32 -0
- data/test/test_input_stack.rb +19 -16
- data/test/test_method.rb +0 -4
- data/test/test_prompt.rb +60 -0
- data/test/test_pry.rb +23 -31
- data/test/test_pry_defaults.rb +75 -57
- data/test/test_syntax_checking.rb +12 -11
- data/test/test_wrapped_module.rb +103 -0
- metadata +72 -26
@@ -4,14 +4,14 @@ class Pry
|
|
4
4
|
# This class contains methods useful for extracting
|
5
5
|
# documentation from methods and classes.
|
6
6
|
module DocumentationHelpers
|
7
|
-
def process_rdoc(comment
|
7
|
+
def process_rdoc(comment)
|
8
8
|
comment = comment.dup
|
9
|
-
comment.gsub(/<code>(?:\s*\n)?(.*?)\s*<\/code>/m) { Pry.color ? CodeRay.scan($1,
|
9
|
+
comment.gsub(/<code>(?:\s*\n)?(.*?)\s*<\/code>/m) { Pry.color ? CodeRay.scan($1, :ruby).term : $1 }.
|
10
10
|
gsub(/<em>(?:\s*\n)?(.*?)\s*<\/em>/m) { Pry.color ? "\e[1m#{$1}\e[0m": $1 }.
|
11
11
|
gsub(/<i>(?:\s*\n)?(.*?)\s*<\/i>/m) { Pry.color ? "\e[1m#{$1}\e[0m" : $1 }.
|
12
12
|
gsub(/\B\+(\w*?)\+\B/) { Pry.color ? "\e[32m#{$1}\e[0m": $1 }.
|
13
|
-
gsub(/((?:^[ \t]+.+(?:\n+|\Z))+)/) { Pry.color ? CodeRay.scan($1,
|
14
|
-
gsub(/`(?:\s*\n)?([^\e]*?)\s*`/) { "`#{Pry.color ? CodeRay.scan($1,
|
13
|
+
gsub(/((?:^[ \t]+.+(?:\n+|\Z))+)/) { Pry.color ? CodeRay.scan($1, :ruby).term : $1 }.
|
14
|
+
gsub(/`(?:\s*\n)?([^\e]*?)\s*`/) { "`#{Pry.color ? CodeRay.scan($1, :ruby).term : $1}`" }
|
15
15
|
end
|
16
16
|
|
17
17
|
def process_yardoc_tag(comment, tag)
|
@@ -31,13 +31,13 @@ class Pry
|
|
31
31
|
|
32
32
|
def process_yardoc(comment)
|
33
33
|
yard_tags = ["param", "return", "option", "yield", "attr", "attr_reader", "attr_writer",
|
34
|
-
"deprecate", "example"]
|
34
|
+
"deprecate", "example", "raise"]
|
35
35
|
(yard_tags - ["example"]).inject(comment) { |a, v| process_yardoc_tag(a, v) }.
|
36
36
|
gsub(/^@(#{yard_tags.join("|")})/) { Pry.color ? "\e[33m#{$1}\e[0m": $1 }
|
37
37
|
end
|
38
38
|
|
39
|
-
def process_comment_markup(comment
|
40
|
-
process_yardoc process_rdoc(comment
|
39
|
+
def process_comment_markup(comment)
|
40
|
+
process_yardoc process_rdoc(comment)
|
41
41
|
end
|
42
42
|
|
43
43
|
# @param [String] code
|
@@ -9,7 +9,7 @@ class Pry
|
|
9
9
|
opt.on :M, "instance-methods", "Operate on instance methods."
|
10
10
|
opt.on :m, :methods, "Operate on methods."
|
11
11
|
opt.on :s, :super, "Select the 'super' method. Can be repeated to traverse the ancestors.", :as => :count
|
12
|
-
opt.on :c, :context, "Select object context to run under.", true do |context|
|
12
|
+
opt.on :c, :context, "Select object context to run under.", :argument => true do |context|
|
13
13
|
@method_target = Pry.binding_for(target.eval(context))
|
14
14
|
end
|
15
15
|
end
|
data/lib/pry/helpers/text.rb
CHANGED
@@ -46,19 +46,18 @@ class Pry
|
|
46
46
|
Pry.color ? "\e[1m#{text}\e[0m" : text.to_s
|
47
47
|
end
|
48
48
|
|
49
|
-
# Returns
|
49
|
+
# Returns `text` in the default foreground colour.
|
50
50
|
# Use this instead of "black" or "white" when you mean absence of colour.
|
51
51
|
#
|
52
|
-
# @param [String, #to_s]
|
53
|
-
# @return [String]
|
52
|
+
# @param [String, #to_s] text
|
53
|
+
# @return [String]
|
54
54
|
def default(text)
|
55
55
|
text.to_s
|
56
56
|
end
|
57
57
|
alias_method :bright_default, :bold
|
58
58
|
|
59
|
-
# Executes
|
60
|
-
#
|
61
|
-
# @param [Proc]
|
59
|
+
# Executes the block with `Pry.color` set to false.
|
60
|
+
# @yield
|
62
61
|
# @return [void]
|
63
62
|
def no_color &block
|
64
63
|
boolean = Pry.config.color
|
@@ -68,9 +67,8 @@ class Pry
|
|
68
67
|
Pry.config.color = boolean
|
69
68
|
end
|
70
69
|
|
71
|
-
# Executes
|
72
|
-
#
|
73
|
-
# @param [Proc]
|
70
|
+
# Executes the block with `Pry.config.pager` set to false.
|
71
|
+
# @yield
|
74
72
|
# @return [void]
|
75
73
|
def no_pager &block
|
76
74
|
boolean = Pry.config.pager
|
data/lib/pry/history.rb
CHANGED
@@ -4,9 +4,13 @@ class Pry
|
|
4
4
|
class History
|
5
5
|
attr_accessor :loader, :saver, :pusher, :clearer
|
6
6
|
|
7
|
+
# @return [Fixnum] Number of lines in history when Pry first loaded.
|
8
|
+
attr_reader :original_lines
|
9
|
+
|
7
10
|
def initialize
|
8
11
|
@history = []
|
9
12
|
@saved_lines = 0
|
13
|
+
@original_lines = 0
|
10
14
|
restore_default_behavior
|
11
15
|
end
|
12
16
|
|
@@ -25,7 +29,7 @@ class Pry
|
|
25
29
|
@pusher.call(line.chomp)
|
26
30
|
@history << line.chomp
|
27
31
|
end
|
28
|
-
@saved_lines = @history.length
|
32
|
+
@saved_lines = @original_lines = @history.length
|
29
33
|
end
|
30
34
|
|
31
35
|
# Write this session's history using `History.saver`.
|
@@ -58,6 +62,15 @@ class Pry
|
|
58
62
|
@saved_lines = 0
|
59
63
|
end
|
60
64
|
|
65
|
+
# @return [Fixnum] The number of lines in history.
|
66
|
+
def history_line_count
|
67
|
+
@history.count
|
68
|
+
end
|
69
|
+
|
70
|
+
def session_line_count
|
71
|
+
@history.count - @original_lines
|
72
|
+
end
|
73
|
+
|
61
74
|
# Return an Array containing all stored history.
|
62
75
|
# @return [Array<String>] An Array containing all lines of history loaded
|
63
76
|
# or entered by the user in the current session.
|
@@ -89,7 +102,7 @@ class Pry
|
|
89
102
|
File.open(history_file, 'a') do |f|
|
90
103
|
lines.each { |ln| f.puts ln }
|
91
104
|
end
|
92
|
-
rescue Errno::EACCES
|
105
|
+
rescue Errno::EACCES
|
93
106
|
# We should probably create an option Pry.show_warnings?!?!?!
|
94
107
|
warn 'Unable to write to your history file, history not saved'
|
95
108
|
end
|
data/lib/pry/hooks.rb
CHANGED
@@ -173,7 +173,7 @@ class Pry
|
|
173
173
|
|
174
174
|
# Return a specific hook for a given event.
|
175
175
|
# @param [Symbol] event_name The name of the event.
|
176
|
-
# @param [Symbol
|
176
|
+
# @param [Symbol] hook_name The name of the hook
|
177
177
|
# @return [#call] The requested hook.
|
178
178
|
# @example
|
179
179
|
# my_hooks = Pry::Hooks.new.add_hook(:before_session, :say_hi) { puts "hi!" }
|
data/lib/pry/indent.rb
CHANGED
@@ -17,8 +17,11 @@ class Pry
|
|
17
17
|
class Indent
|
18
18
|
include Helpers::BaseHelpers
|
19
19
|
|
20
|
-
# String containing the spaces to be inserted before the next line.
|
20
|
+
# @return [String] String containing the spaces to be inserted before the next line.
|
21
21
|
attr_reader :indent_level
|
22
|
+
|
23
|
+
# @return [Array<String>] The stack of open tokens.
|
24
|
+
attr_reader :stack
|
22
25
|
|
23
26
|
# The amount of spaces to insert for each indent level.
|
24
27
|
SPACES = ' '
|
@@ -106,8 +109,7 @@ class Pry
|
|
106
109
|
# @return [String] The indented version of +input+.
|
107
110
|
#
|
108
111
|
def indent(input)
|
109
|
-
output
|
110
|
-
open_tokens = OPEN_TOKENS.keys
|
112
|
+
output = ''
|
111
113
|
prefix = indent_level
|
112
114
|
|
113
115
|
input.lines.each do |line|
|
@@ -234,8 +236,8 @@ class Pry
|
|
234
236
|
|
235
237
|
# Given a string of Ruby code, use CodeRay to export the tokens.
|
236
238
|
#
|
237
|
-
# @param String
|
238
|
-
# @return [Array]
|
239
|
+
# @param [String] string The Ruby to lex
|
240
|
+
# @return [Array] An Array of pairs of [token_value, token_type]
|
239
241
|
def tokenize(string)
|
240
242
|
tokens = CodeRay.scan(string, :ruby)
|
241
243
|
tokens = tokens.tokens.each_slice(2) if tokens.respond_to?(:tokens) # Coderay 1.0.0
|
@@ -248,7 +250,7 @@ class Pry
|
|
248
250
|
# normal strings (which can't be nested) we assume that CodeRay correctly pairs
|
249
251
|
# open-and-close delimiters so we don't bother checking what they are.
|
250
252
|
#
|
251
|
-
# @param String
|
253
|
+
# @param [String] token The token (of type :delimiter)
|
252
254
|
def track_delimiter(token)
|
253
255
|
case token
|
254
256
|
when /^<<-(["'`]?)(.*)\\1/
|
@@ -297,7 +299,7 @@ class Pry
|
|
297
299
|
cols = cols.to_i
|
298
300
|
lines = cols != 0 ? (full_line.length / cols + 1) : 1
|
299
301
|
|
300
|
-
if
|
302
|
+
if Pry::Helpers::BaseHelpers.windows_ansi?
|
301
303
|
move_up = "\e[#{lines}F"
|
302
304
|
move_down = "\e[#{lines}E"
|
303
305
|
else
|
@@ -320,9 +322,14 @@ class Pry
|
|
320
322
|
Readline.respond_to?(:get_screen_size) && Readline.get_screen_size,
|
321
323
|
|
322
324
|
# Otherwise try to use the environment (this may be out of date due
|
323
|
-
# to window resizing, but it better than nothing).
|
324
|
-
[ENV["ROWS"], ENV["COLUMNS"]
|
325
|
-
|
325
|
+
# to window resizing, but it's better than nothing).
|
326
|
+
[ENV["ROWS"], ENV["COLUMNS"],
|
327
|
+
|
328
|
+
# If the user is running within ansicon, then use the screen size
|
329
|
+
# that it reports (same caveats apply as with ROWS and COLUMNS)
|
330
|
+
ENV['ANSICON'] =~ /\((.*)x(.*)\)/ && [$2, $1]
|
331
|
+
]
|
332
|
+
].detect do |(_, cols)|
|
326
333
|
cols.to_i > 0
|
327
334
|
end
|
328
335
|
end
|
data/lib/pry/method.rb
CHANGED
@@ -63,7 +63,7 @@ class Pry
|
|
63
63
|
#
|
64
64
|
def from_binding(b)
|
65
65
|
meth_name = b.eval('__method__')
|
66
|
-
if [:__script__, nil
|
66
|
+
if [:__script__, nil].include?(meth_name)
|
67
67
|
nil
|
68
68
|
else
|
69
69
|
method = begin
|
@@ -210,7 +210,7 @@ class Pry
|
|
210
210
|
# A new instance of `Pry::Method` wrapping the given `::Method`, `UnboundMethod`, or `Proc`.
|
211
211
|
#
|
212
212
|
# @param [::Method, UnboundMethod, Proc] method
|
213
|
-
# @param [Hash] known_info
|
213
|
+
# @param [Hash] known_info Can be used to pre-cache expensive to compute stuff.
|
214
214
|
# @return [Pry::Method]
|
215
215
|
def initialize(method, known_info={})
|
216
216
|
@method = method
|
@@ -253,17 +253,29 @@ class Pry
|
|
253
253
|
code = strip_comments_from_c_code(info.source)
|
254
254
|
end
|
255
255
|
when :ruby
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
256
|
+
# clone of MethodSource.source_helper that knows to use our
|
257
|
+
# hacked version of source_location for rbx core methods, and
|
258
|
+
# our input buffer for methods defined in (pry)
|
259
|
+
file, line = *source_location
|
260
|
+
raise SourceNotFoundError, "Could not locate source for #{name_with_owner}!" unless file
|
261
|
+
|
262
|
+
begin
|
263
|
+
code = Pry::Code.from_file(file).expression_at(line)
|
264
|
+
rescue SyntaxError => e
|
265
|
+
raise MethodSource::SourceNotFoundError.new(e.message)
|
262
266
|
end
|
263
267
|
strip_leading_whitespace(code)
|
264
268
|
end
|
265
269
|
end
|
266
270
|
|
271
|
+
# Can we get the source code for this method?
|
272
|
+
# @return [Boolean]
|
273
|
+
def source?
|
274
|
+
!!source
|
275
|
+
rescue MethodSource::SourceNotFoundError
|
276
|
+
false
|
277
|
+
end
|
278
|
+
|
267
279
|
# @return [String, nil] The documentation for the method, or `nil` if it's
|
268
280
|
# unavailable.
|
269
281
|
# @raise [CommandError] Raises when the method was defined in the REPL.
|
@@ -273,12 +285,10 @@ class Pry
|
|
273
285
|
info = pry_doc_info
|
274
286
|
info.docstring if info
|
275
287
|
when :ruby
|
276
|
-
|
277
|
-
|
288
|
+
if Helpers::BaseHelpers.rbx? && !pry_method?
|
289
|
+
strip_leading_hash_and_whitespace_from_ruby_comments(core_doc)
|
278
290
|
elsif pry_method?
|
279
|
-
|
280
|
-
# method."
|
281
|
-
strip_leading_hash_and_whitespace_from_ruby_comments(doc_for_pry_method)
|
291
|
+
strip_leading_hash_and_whitespace_from_ruby_comments(doc_for_pry_method)
|
282
292
|
else
|
283
293
|
strip_leading_hash_and_whitespace_from_ruby_comments(@method.comment)
|
284
294
|
end
|
@@ -438,10 +448,10 @@ class Pry
|
|
438
448
|
|
439
449
|
# FIXME: a very similar method to this exists on WrappedModule: extract_doc_for_candidate
|
440
450
|
def doc_for_pry_method
|
441
|
-
_,
|
451
|
+
_, line_num = source_location
|
442
452
|
|
443
453
|
buffer = ""
|
444
|
-
Pry.line_buffer[0..(
|
454
|
+
Pry.line_buffer[0..(line_num - 1)].each do |line|
|
445
455
|
# Add any line that is a valid ruby comment,
|
446
456
|
# but clear as soon as we hit a non comment line.
|
447
457
|
if (line =~ /^\s*#/) || (line =~ /^\s*$/)
|
@@ -454,8 +464,8 @@ class Pry
|
|
454
464
|
buffer
|
455
465
|
end
|
456
466
|
|
457
|
-
# @param [Class,Module]
|
458
|
-
# @return [Method]
|
467
|
+
# @param [Class, Module] ancestors The ancestors to investigate
|
468
|
+
# @return [Method] The unwrapped super-method
|
459
469
|
def super_using_ancestors(ancestors, times=1)
|
460
470
|
next_owner = self.owner
|
461
471
|
times.times do
|
@@ -504,8 +514,8 @@ class Pry
|
|
504
514
|
#
|
505
515
|
# @param [Object] receiver
|
506
516
|
# @param [String] method_name
|
507
|
-
def initialize(
|
508
|
-
@receiver, @name =
|
517
|
+
def initialize(receiver, method_name)
|
518
|
+
@receiver, @name = receiver, method_name
|
509
519
|
end
|
510
520
|
|
511
521
|
# Is the method undefined? (aka `Disowned`)
|
@@ -514,6 +524,12 @@ class Pry
|
|
514
524
|
true
|
515
525
|
end
|
516
526
|
|
527
|
+
# Can we get the source for this method?
|
528
|
+
# @return [Boolean] false
|
529
|
+
def source?
|
530
|
+
false
|
531
|
+
end
|
532
|
+
|
517
533
|
# Get the hypothesized owner of the method.
|
518
534
|
#
|
519
535
|
# @return [Object]
|
@@ -0,0 +1,130 @@
|
|
1
|
+
require 'pry/helpers/documentation_helpers'
|
2
|
+
require 'forwardable'
|
3
|
+
|
4
|
+
class Pry
|
5
|
+
class WrappedModule
|
6
|
+
|
7
|
+
# This class represents a single candidate for a module/class definition.
|
8
|
+
# It provides access to the source, documentation, line and file
|
9
|
+
# for a monkeypatch (reopening) of a class/module.
|
10
|
+
class Candidate
|
11
|
+
extend Forwardable
|
12
|
+
|
13
|
+
# @return [String] The file where the module definition is located.
|
14
|
+
attr_reader :file
|
15
|
+
|
16
|
+
# @return [Fixnum] The line where the module definition is located.
|
17
|
+
attr_reader :line
|
18
|
+
|
19
|
+
# Methods to delegate to associated `Pry::WrappedModule instance`.
|
20
|
+
to_delegate = [:lines_for_file, :method_candidates, :name, :wrapped,
|
21
|
+
:yard_docs?, :number_of_candidates, :process_doc,
|
22
|
+
:strip_leading_whitespace]
|
23
|
+
|
24
|
+
def_delegators :@wrapper, *to_delegate
|
25
|
+
private(*to_delegate)
|
26
|
+
|
27
|
+
# @raise [Pry::CommandError] If `rank` is out of bounds.
|
28
|
+
# @param [Pry::WrappedModule] wrapper The associated
|
29
|
+
# `Pry::WrappedModule` instance that owns the candidates.
|
30
|
+
# @param [Fixnum] rank The rank of the candidate to
|
31
|
+
# retrieve. Passing 0 returns 'primary candidate' (the candidate with largest
|
32
|
+
# number of methods), passing 1 retrieves candidate with
|
33
|
+
# second largest number of methods, and so on, up to
|
34
|
+
# `Pry::WrappedModule#number_of_candidates() - 1`
|
35
|
+
def initialize(wrapper, rank)
|
36
|
+
@wrapper = wrapper
|
37
|
+
|
38
|
+
if number_of_candidates <= 0
|
39
|
+
raise CommandError, "Cannot find a definition for #{name} module!"
|
40
|
+
elsif rank > (number_of_candidates - 1)
|
41
|
+
raise CommandError, "No such module candidate. Allowed candidates range is from 0 to #{number_of_candidates - 1}"
|
42
|
+
end
|
43
|
+
|
44
|
+
@rank = rank
|
45
|
+
@file, @line = source_location
|
46
|
+
end
|
47
|
+
|
48
|
+
# @raise [Pry::CommandError] If source code cannot be found.
|
49
|
+
# @return [String] The source for the candidate, i.e the
|
50
|
+
# complete module/class definition.
|
51
|
+
def source
|
52
|
+
return @source if @source
|
53
|
+
raise CommandError, "Could not locate source for #{wrapped}!" if file.nil?
|
54
|
+
|
55
|
+
@source = strip_leading_whitespace(Pry::Code.from_file(file).expression_at(line, number_of_lines_in_first_chunk))
|
56
|
+
end
|
57
|
+
|
58
|
+
# @raise [Pry::CommandError] If documentation cannot be found.
|
59
|
+
# @return [String] The documentation for the candidate.
|
60
|
+
def doc
|
61
|
+
return @doc if @doc
|
62
|
+
raise CommandError, "Could not locate doc for #{wrapped}!" if file.nil?
|
63
|
+
|
64
|
+
@doc = process_doc(Pry::Code.from_file(file).comment_describing(line))
|
65
|
+
end
|
66
|
+
|
67
|
+
# @return [Array, nil] A `[String, Fixnum]` pair representing the
|
68
|
+
# source location (file and line) for the candidate or `nil`
|
69
|
+
# if no source location found.
|
70
|
+
def source_location
|
71
|
+
return @source_location if @source_location
|
72
|
+
|
73
|
+
mod_type_string = wrapped.class.to_s.downcase
|
74
|
+
file, line = first_method_source_location
|
75
|
+
|
76
|
+
return nil if !file.is_a?(String)
|
77
|
+
|
78
|
+
class_regexes = [/^\s*#{mod_type_string}\s*(\w*)(::)?#{wrapped.name.split(/::/).last}/,
|
79
|
+
/^\s*(::)?#{wrapped.name.split(/::/).last}\s*?=\s*?#{wrapped.class}/,
|
80
|
+
/^\s*(::)?#{wrapped.name.split(/::/).last}\.(class|instance)_eval/]
|
81
|
+
|
82
|
+
host_file_lines = lines_for_file(file)
|
83
|
+
|
84
|
+
search_lines = host_file_lines[0..(line - 2)]
|
85
|
+
idx = search_lines.rindex { |v| class_regexes.any? { |r| r =~ v } }
|
86
|
+
|
87
|
+
@source_location = [file, idx + 1]
|
88
|
+
rescue Pry::RescuableException
|
89
|
+
nil
|
90
|
+
end
|
91
|
+
|
92
|
+
private
|
93
|
+
|
94
|
+
# This method is used by `Candidate#source_location` as a
|
95
|
+
# starting point for the search for the candidate's definition.
|
96
|
+
# @return [Array] The source location of the base method used to
|
97
|
+
# calculate the source location of the candidate.
|
98
|
+
def first_method_source_location
|
99
|
+
@first_method_source_location ||= adjusted_source_location(method_candidates[@rank].first.source_location)
|
100
|
+
end
|
101
|
+
|
102
|
+
# @return [Array] The source location of the last method in this
|
103
|
+
# candidate's module definition.
|
104
|
+
def last_method_source_location
|
105
|
+
@end_method_source_location ||= adjusted_source_location(method_candidates[@rank].last.source_location)
|
106
|
+
end
|
107
|
+
|
108
|
+
# Return the number of lines between the start of the class definition
|
109
|
+
# and the start of the last method. We use this value so we can
|
110
|
+
# quickly grab these lines from the file (without having to
|
111
|
+
# check each intervening line for validity, which is expensive) speeding up source extraction.
|
112
|
+
# @return [Fixum] Number of lines.
|
113
|
+
def number_of_lines_in_first_chunk
|
114
|
+
end_method_line = last_method_source_location.last
|
115
|
+
|
116
|
+
end_method_line - line
|
117
|
+
end
|
118
|
+
|
119
|
+
def adjusted_source_location(sl)
|
120
|
+
file, line = sl
|
121
|
+
|
122
|
+
if file && RbxPath.is_core_path?(file)
|
123
|
+
file = RbxPath.convert_path_to_full(file)
|
124
|
+
end
|
125
|
+
|
126
|
+
[file, line]
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|