pry 0.9.12.2 → 0.14.2

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.
Files changed (237) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1141 -0
  3. data/LICENSE +2 -2
  4. data/README.md +466 -0
  5. data/bin/pry +4 -7
  6. data/lib/pry/basic_object.rb +10 -0
  7. data/lib/pry/block_command.rb +22 -0
  8. data/lib/pry/class_command.rb +194 -0
  9. data/lib/pry/cli.rb +97 -92
  10. data/lib/pry/code/code_file.rb +114 -0
  11. data/lib/pry/code/code_range.rb +7 -4
  12. data/lib/pry/code/loc.rb +27 -14
  13. data/lib/pry/code.rb +62 -90
  14. data/lib/pry/code_object.rb +83 -39
  15. data/lib/pry/color_printer.rb +66 -0
  16. data/lib/pry/command.rb +202 -371
  17. data/lib/pry/command_set.rb +151 -133
  18. data/lib/pry/command_state.rb +31 -0
  19. data/lib/pry/commands/amend_line.rb +86 -82
  20. data/lib/pry/commands/bang.rb +18 -14
  21. data/lib/pry/commands/bang_pry.rb +15 -11
  22. data/lib/pry/commands/cat/abstract_formatter.rb +23 -18
  23. data/lib/pry/commands/cat/exception_formatter.rb +85 -73
  24. data/lib/pry/commands/cat/file_formatter.rb +56 -63
  25. data/lib/pry/commands/cat/input_expression_formatter.rb +35 -30
  26. data/lib/pry/commands/cat.rb +64 -47
  27. data/lib/pry/commands/cd.rb +42 -26
  28. data/lib/pry/commands/change_inspector.rb +34 -0
  29. data/lib/pry/commands/change_prompt.rb +51 -0
  30. data/lib/pry/commands/clear_screen.rb +20 -0
  31. data/lib/pry/commands/code_collector.rb +148 -131
  32. data/lib/pry/commands/disable_pry.rb +23 -19
  33. data/lib/pry/commands/easter_eggs.rb +23 -34
  34. data/lib/pry/commands/edit/exception_patcher.rb +21 -17
  35. data/lib/pry/commands/edit/file_and_line_locator.rb +33 -24
  36. data/lib/pry/commands/edit.rb +183 -167
  37. data/lib/pry/commands/exit.rb +40 -35
  38. data/lib/pry/commands/exit_all.rb +24 -20
  39. data/lib/pry/commands/exit_program.rb +20 -17
  40. data/lib/pry/commands/find_method.rb +167 -167
  41. data/lib/pry/commands/fix_indent.rb +16 -12
  42. data/lib/pry/commands/help.rb +140 -133
  43. data/lib/pry/commands/hist.rb +153 -132
  44. data/lib/pry/commands/import_set.rb +20 -15
  45. data/lib/pry/commands/jump_to.rb +25 -21
  46. data/lib/pry/commands/list_inspectors.rb +42 -0
  47. data/lib/pry/commands/ls/constants.rb +75 -0
  48. data/lib/pry/commands/ls/formatter.rb +55 -0
  49. data/lib/pry/commands/ls/globals.rb +50 -0
  50. data/lib/pry/commands/ls/grep.rb +23 -0
  51. data/lib/pry/commands/ls/instance_vars.rb +40 -0
  52. data/lib/pry/commands/ls/interrogatable.rb +24 -0
  53. data/lib/pry/commands/ls/jruby_hacks.rb +55 -0
  54. data/lib/pry/commands/ls/local_names.rb +37 -0
  55. data/lib/pry/commands/ls/local_vars.rb +47 -0
  56. data/lib/pry/commands/ls/ls_entity.rb +65 -0
  57. data/lib/pry/commands/ls/methods.rb +55 -0
  58. data/lib/pry/commands/ls/methods_helper.rb +50 -0
  59. data/lib/pry/commands/ls/self_methods.rb +34 -0
  60. data/lib/pry/commands/ls.rb +100 -303
  61. data/lib/pry/commands/nesting.rb +21 -17
  62. data/lib/pry/commands/play.rb +93 -49
  63. data/lib/pry/commands/pry_backtrace.rb +22 -18
  64. data/lib/pry/commands/pry_version.rb +15 -11
  65. data/lib/pry/commands/raise_up.rb +33 -27
  66. data/lib/pry/commands/reload_code.rb +57 -48
  67. data/lib/pry/commands/reset.rb +16 -12
  68. data/lib/pry/commands/ri.rb +57 -38
  69. data/lib/pry/commands/save_file.rb +45 -43
  70. data/lib/pry/commands/shell_command.rb +66 -34
  71. data/lib/pry/commands/shell_mode.rb +22 -20
  72. data/lib/pry/commands/show_doc.rb +80 -65
  73. data/lib/pry/commands/show_info.rb +193 -159
  74. data/lib/pry/commands/show_input.rb +16 -11
  75. data/lib/pry/commands/show_source.rb +113 -33
  76. data/lib/pry/commands/stat.rb +35 -31
  77. data/lib/pry/commands/switch_to.rb +21 -15
  78. data/lib/pry/commands/toggle_color.rb +21 -13
  79. data/lib/pry/commands/watch_expression/expression.rb +43 -0
  80. data/lib/pry/commands/watch_expression.rb +110 -0
  81. data/lib/pry/commands/whereami.rb +157 -134
  82. data/lib/pry/commands/wtf.rb +78 -40
  83. data/lib/pry/config/attributable.rb +22 -0
  84. data/lib/pry/config/lazy_value.rb +29 -0
  85. data/lib/pry/config/memoized_value.rb +34 -0
  86. data/lib/pry/config/value.rb +24 -0
  87. data/lib/pry/config.rb +290 -220
  88. data/lib/pry/control_d_handler.rb +28 -0
  89. data/lib/pry/core_extensions.rb +50 -27
  90. data/lib/pry/editor.rb +130 -102
  91. data/lib/pry/env.rb +18 -0
  92. data/lib/pry/exception_handler.rb +43 -0
  93. data/lib/pry/exceptions.rb +73 -0
  94. data/lib/pry/forwardable.rb +27 -0
  95. data/lib/pry/helpers/base_helpers.rb +22 -151
  96. data/lib/pry/helpers/command_helpers.rb +55 -63
  97. data/lib/pry/helpers/documentation_helpers.rb +21 -13
  98. data/lib/pry/helpers/options_helpers.rb +15 -8
  99. data/lib/pry/helpers/platform.rb +55 -0
  100. data/lib/pry/helpers/table.rb +44 -32
  101. data/lib/pry/helpers/text.rb +96 -86
  102. data/lib/pry/helpers.rb +3 -0
  103. data/lib/pry/history.rb +101 -70
  104. data/lib/pry/hooks.rb +67 -137
  105. data/lib/pry/indent.rb +79 -73
  106. data/lib/pry/input_completer.rb +283 -0
  107. data/lib/pry/input_lock.rb +129 -0
  108. data/lib/pry/inspector.rb +39 -0
  109. data/lib/pry/last_exception.rb +61 -0
  110. data/lib/pry/method/disowned.rb +19 -5
  111. data/lib/pry/{commands/edit/method_patcher.rb → method/patcher.rb} +51 -42
  112. data/lib/pry/method/weird_method_locator.rb +80 -44
  113. data/lib/pry/method.rb +225 -176
  114. data/lib/pry/object_path.rb +91 -0
  115. data/lib/pry/output.rb +136 -0
  116. data/lib/pry/pager.rb +227 -68
  117. data/lib/pry/prompt.rb +214 -0
  118. data/lib/pry/pry_class.rb +216 -289
  119. data/lib/pry/pry_instance.rb +438 -500
  120. data/lib/pry/repl.rb +256 -0
  121. data/lib/pry/repl_file_loader.rb +34 -35
  122. data/lib/pry/ring.rb +89 -0
  123. data/lib/pry/slop/LICENSE +20 -0
  124. data/lib/pry/slop/commands.rb +190 -0
  125. data/lib/pry/slop/option.rb +210 -0
  126. data/lib/pry/slop.rb +672 -0
  127. data/lib/pry/syntax_highlighter.rb +26 -0
  128. data/lib/pry/system_command_handler.rb +17 -0
  129. data/lib/pry/testable/evalable.rb +24 -0
  130. data/lib/pry/testable/mockable.rb +22 -0
  131. data/lib/pry/testable/pry_tester.rb +88 -0
  132. data/lib/pry/testable/utility.rb +34 -0
  133. data/lib/pry/testable/variables.rb +52 -0
  134. data/lib/pry/testable.rb +68 -0
  135. data/lib/pry/version.rb +3 -1
  136. data/lib/pry/warning.rb +20 -0
  137. data/lib/pry/{module_candidate.rb → wrapped_module/candidate.rb} +36 -43
  138. data/lib/pry/wrapped_module.rb +102 -103
  139. data/lib/pry.rb +135 -261
  140. metadata +94 -283
  141. data/.document +0 -2
  142. data/.gitignore +0 -16
  143. data/.travis.yml +0 -21
  144. data/.yardopts +0 -1
  145. data/CHANGELOG +0 -534
  146. data/CONTRIBUTORS +0 -55
  147. data/Gemfile +0 -9
  148. data/Guardfile +0 -62
  149. data/README.markdown +0 -400
  150. data/Rakefile +0 -140
  151. data/TODO +0 -117
  152. data/lib/pry/commands/disabled_commands.rb +0 -2
  153. data/lib/pry/commands/gem_cd.rb +0 -26
  154. data/lib/pry/commands/gem_install.rb +0 -29
  155. data/lib/pry/commands/gem_list.rb +0 -33
  156. data/lib/pry/commands/gem_open.rb +0 -29
  157. data/lib/pry/commands/gist.rb +0 -102
  158. data/lib/pry/commands/install_command.rb +0 -51
  159. data/lib/pry/commands/simple_prompt.rb +0 -22
  160. data/lib/pry/commands.rb +0 -6
  161. data/lib/pry/completion.rb +0 -304
  162. data/lib/pry/custom_completions.rb +0 -6
  163. data/lib/pry/history_array.rb +0 -116
  164. data/lib/pry/plugins.rb +0 -103
  165. data/lib/pry/rbx_method.rb +0 -13
  166. data/lib/pry/rbx_path.rb +0 -22
  167. data/lib/pry/rubygem.rb +0 -74
  168. data/lib/pry/terminal.rb +0 -78
  169. data/lib/pry/test/helper.rb +0 -185
  170. data/man/pry.1 +0 -195
  171. data/man/pry.1.html +0 -204
  172. data/man/pry.1.ronn +0 -141
  173. data/pry.gemspec +0 -30
  174. data/spec/Procfile +0 -3
  175. data/spec/cli_spec.rb +0 -78
  176. data/spec/code_object_spec.rb +0 -277
  177. data/spec/code_spec.rb +0 -219
  178. data/spec/command_helpers_spec.rb +0 -29
  179. data/spec/command_integration_spec.rb +0 -644
  180. data/spec/command_set_spec.rb +0 -627
  181. data/spec/command_spec.rb +0 -821
  182. data/spec/commands/amend_line_spec.rb +0 -247
  183. data/spec/commands/bang_spec.rb +0 -19
  184. data/spec/commands/cat_spec.rb +0 -164
  185. data/spec/commands/cd_spec.rb +0 -250
  186. data/spec/commands/disable_pry_spec.rb +0 -25
  187. data/spec/commands/edit_spec.rb +0 -727
  188. data/spec/commands/exit_all_spec.rb +0 -34
  189. data/spec/commands/exit_program_spec.rb +0 -19
  190. data/spec/commands/exit_spec.rb +0 -34
  191. data/spec/commands/find_method_spec.rb +0 -70
  192. data/spec/commands/gem_list_spec.rb +0 -26
  193. data/spec/commands/gist_spec.rb +0 -79
  194. data/spec/commands/help_spec.rb +0 -56
  195. data/spec/commands/hist_spec.rb +0 -181
  196. data/spec/commands/jump_to_spec.rb +0 -15
  197. data/spec/commands/ls_spec.rb +0 -181
  198. data/spec/commands/play_spec.rb +0 -140
  199. data/spec/commands/raise_up_spec.rb +0 -56
  200. data/spec/commands/save_file_spec.rb +0 -177
  201. data/spec/commands/show_doc_spec.rb +0 -510
  202. data/spec/commands/show_input_spec.rb +0 -17
  203. data/spec/commands/show_source_spec.rb +0 -782
  204. data/spec/commands/whereami_spec.rb +0 -203
  205. data/spec/completion_spec.rb +0 -239
  206. data/spec/control_d_handler_spec.rb +0 -58
  207. data/spec/documentation_helper_spec.rb +0 -73
  208. data/spec/editor_spec.rb +0 -79
  209. data/spec/exception_whitelist_spec.rb +0 -21
  210. data/spec/fixtures/candidate_helper1.rb +0 -11
  211. data/spec/fixtures/candidate_helper2.rb +0 -8
  212. data/spec/fixtures/example.erb +0 -5
  213. data/spec/fixtures/example_nesting.rb +0 -33
  214. data/spec/fixtures/show_source_doc_examples.rb +0 -15
  215. data/spec/fixtures/testrc +0 -2
  216. data/spec/fixtures/testrcbad +0 -2
  217. data/spec/fixtures/whereami_helper.rb +0 -6
  218. data/spec/helper.rb +0 -34
  219. data/spec/helpers/bacon.rb +0 -86
  220. data/spec/helpers/mock_pry.rb +0 -43
  221. data/spec/helpers/table_spec.rb +0 -105
  222. data/spec/history_array_spec.rb +0 -67
  223. data/spec/hooks_spec.rb +0 -522
  224. data/spec/indent_spec.rb +0 -301
  225. data/spec/input_stack_spec.rb +0 -90
  226. data/spec/method_spec.rb +0 -482
  227. data/spec/prompt_spec.rb +0 -60
  228. data/spec/pry_defaults_spec.rb +0 -419
  229. data/spec/pry_history_spec.rb +0 -99
  230. data/spec/pry_output_spec.rb +0 -95
  231. data/spec/pry_spec.rb +0 -504
  232. data/spec/run_command_spec.rb +0 -25
  233. data/spec/sticky_locals_spec.rb +0 -157
  234. data/spec/syntax_checking_spec.rb +0 -81
  235. data/spec/wrapped_module_spec.rb +0 -261
  236. data/wiki/Customizing-pry.md +0 -397
  237. data/wiki/Home.md +0 -4
@@ -1,37 +1,42 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Pry
2
- class Command::Edit
3
- class MethodPatcher
4
- attr_accessor :_pry_
5
- attr_accessor :code_object
4
+ class Method
5
+ class Patcher
6
+ attr_accessor :method
7
+
8
+ # rubocop:disable Style/ClassVars
9
+ @@source_cache = {}
10
+ # rubocop:enable Style/ClassVars
11
+
12
+ def initialize(method)
13
+ @method = method
14
+ end
6
15
 
7
- def initialize(_pry_, code_object)
8
- @_pry_ = _pry_
9
- @code_object = code_object
16
+ def self.code_for(filename)
17
+ @@source_cache[filename]
10
18
  end
11
19
 
12
20
  # perform the patch
13
- def perform_patch
14
- if code_object.alias?
21
+ def patch_in_ram(source)
22
+ if method.alias?
15
23
  with_method_transaction do
16
- _pry_.evaluate_ruby patched_code
24
+ redefine source
17
25
  end
18
26
  else
19
- _pry_.evaluate_ruby patched_code
27
+ redefine source
20
28
  end
21
29
  end
22
30
 
23
31
  private
24
32
 
25
- def patched_code
26
- @patched_code ||= wrap(Pry::Editor.edit_tempfile_with_content(adjusted_lines))
33
+ def redefine(source)
34
+ @@source_cache[cache_key] = source
35
+ TOPLEVEL_BINDING.eval wrap(source), cache_key
27
36
  end
28
37
 
29
- # The method code adjusted so that the first line is rewritten
30
- # so that def self.foo --> def foo
31
- def adjusted_lines
32
- lines = code_object.source.lines.to_a
33
- lines[0] = definition_line_for_owner(lines.first)
34
- lines
38
+ def cache_key
39
+ "pry-redefined(0x#{method.owner.object_id.to_s(16)}##{method.name})"
35
40
  end
36
41
 
37
42
  # Run some code ensuring that at the end target#meth_name will not have changed.
@@ -41,21 +46,21 @@ class Pry
41
46
  # transation we make that not happen, which means that alias_method_chains, etc.
42
47
  # continue to work.
43
48
  #
44
- # @param [String] meth_name The method name before aliasing
45
- # @param [Module] target The owner of the method
46
-
47
49
  def with_method_transaction
48
- temp_name = "__pry_#{code_object.original_name}__"
49
- co = code_object
50
- code_object.owner.class_eval do
51
- alias_method temp_name, co.original_name
50
+ temp_name = "__pry_#{method.original_name}__"
51
+ method = self.method
52
+ method.owner.class_eval do
53
+ alias_method temp_name, method.original_name
52
54
  yield
53
- alias_method co.name, co.original_name
54
- alias_method co.original_name, temp_name
55
+ alias_method method.name, method.original_name
56
+ alias_method method.original_name, temp_name
55
57
  end
56
-
57
58
  ensure
58
- co.send(:remove_method, temp_name) rescue nil
59
+ begin
60
+ method.send(:remove_method, temp_name)
61
+ rescue StandardError
62
+ nil
63
+ end
59
64
  end
60
65
 
61
66
  # Update the definition line so that it can be eval'd directly on the Method's
@@ -68,13 +73,15 @@ class Pry
68
73
  # This is necessarily done by String manipulation because we can't find out what
69
74
  # syntax is needed for the argument list by ruby-level introspection.
70
75
  #
71
- # @param String The original definition line. e.g. def self.foo(bar, baz=1)
72
- # @return String The new definition line. e.g. def foo(bar, baz=1)
73
- def definition_line_for_owner(line)
74
- if line =~ /^def (?:.*?\.)?#{Regexp.escape(code_object.original_name)}(?=[\(\s;]|$)/
75
- "def #{code_object.original_name}#{$'}"
76
+ # @param [String] line The original definition line. e.g. def self.foo(bar, baz=1)
77
+ # @return [String] The new definition line. e.g. def foo(bar, baz=1)
78
+ def definition_for_owner(line)
79
+ if line =~ /\Adef (?:.*?\.)?#{Regexp.escape(method.original_name)}(?=[\(\s;]|$)/
80
+ "def #{method.original_name}#{$'}"
76
81
  else
77
- raise CommandError, "Could not find original `def #{code_object.original_name}` line to patch."
82
+ raise CommandError,
83
+ "Could not find original `def #{method.original_name}` line " \
84
+ "to patch."
78
85
  end
79
86
  end
80
87
 
@@ -87,15 +94,17 @@ class Pry
87
94
 
88
95
  # Update the source code so that when it has the right owner when eval'd.
89
96
  #
90
- # This (combined with definition_line_for_owner) is backup for the case that
97
+ # This (combined with definition_for_owner) is backup for the case that
91
98
  # wrap_for_nesting fails, to ensure that the method will stil be defined in
92
99
  # the correct place.
93
100
  #
94
101
  # @param [String] source The source to wrap
95
102
  # @return [String]
96
103
  def wrap_for_owner(source)
97
- Pry.current[:pry_owner] = code_object.owner
98
- "Pry.current[:pry_owner].class_eval do\n#{source}\nend"
104
+ Pry.current[:pry_owner] = method.owner
105
+ owner_source = definition_for_owner(source)
106
+ visibility_fix = "#{method.visibility} #{method.name.to_sym.inspect}"
107
+ "Pry.current[:pry_owner].class_eval do; #{owner_source}\n#{visibility_fix}\nend"
99
108
  end
100
109
 
101
110
  # Update the new source code to have the correct Module.nesting.
@@ -111,10 +120,10 @@ class Pry
111
120
  # @param [String] source The source to wrap.
112
121
  # @return [String]
113
122
  def wrap_for_nesting(source)
114
- nesting = Pry::Code.from_file(code_object.source_file).nesting_at(code_object.source_line)
123
+ nesting = Pry::Code.from_file(method.source_file).nesting_at(method.source_line)
115
124
 
116
- (nesting + [source] + nesting.map{ "end" } + [""]).join("\n")
117
- rescue Pry::Indent::UnparseableNestingError => e
125
+ (nesting + [source] + nesting.map { "end" } + [""]).join(";")
126
+ rescue Pry::Indent::UnparseableNestingError
118
127
  source
119
128
  end
120
129
  end
@@ -1,38 +1,48 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Pry
2
4
  class Method
3
-
4
5
  # This class is responsible for locating the *real* `Pry::Method`
5
6
  # object captured by a binding.
6
7
  #
7
8
  # Given a `Binding` from inside a method and a 'seed' Pry::Method object,
8
9
  # there are primarily two situations where the seed method doesn't match
9
10
  # the Binding:
10
- # 1. The Pry::Method is from a subclass 2. The Pry::Method represents a method of the same name
11
- # while the original was renamed to something else. For 1. we
12
- # search vertically up the inheritance chain,
13
- # and for 2. we search laterally along the object's method table.
11
+ # 1. The Pry::Method is from a subclass
12
+ # 2. The Pry::Method represents a method of the same name while the original
13
+ # was renamed to something else. For 1. we search vertically up the
14
+ # inheritance chain, and for 2. we search laterally along the object's
15
+ # method table.
14
16
  #
15
17
  # When we locate the method that matches the Binding we wrap it in
16
18
  # Pry::Method and return it, or return nil if we fail.
17
19
  class WeirdMethodLocator
18
20
  class << self
19
-
20
21
  # Whether the given method object matches the associated binding.
21
22
  # If the method object does not match the binding, then it's
22
23
  # most likely not the method captured by the binding, and we
23
24
  # must commence a search.
24
25
  #
25
26
  # @param [Pry::Method] method
26
- # @param [Binding] b
27
+ # @param [Binding] binding
27
28
  # @return [Boolean]
28
- def normal_method?(method, b)
29
- method && (method.source_file && method.source_range rescue false) &&
30
- File.expand_path(method.source_file) == File.expand_path(b.eval('__FILE__')) &&
31
- method.source_range.include?(b.eval('__LINE__'))
29
+ def normal_method?(method, binding)
30
+ if method && method.source_file && method.source_range
31
+ if binding.respond_to?(:source_location)
32
+ binding_file, binding_line = binding.source_location
33
+ else
34
+ binding_file = binding.eval('__FILE__')
35
+ binding_line = binding.eval('__LINE__')
36
+ end
37
+ (File.expand_path(method.source_file) == File.expand_path(binding_file)) &&
38
+ method.source_range.include?(binding_line)
39
+ end
40
+ rescue StandardError
41
+ false
32
42
  end
33
43
 
34
- def weird_method?(method, b)
35
- !normal_method?(method, b)
44
+ def weird_method?(method, binding)
45
+ !normal_method?(method, binding)
36
46
  end
37
47
  end
38
48
 
@@ -43,12 +53,13 @@ class Pry
43
53
  # @param [Binding] target The Binding that captures the method
44
54
  # we want to locate.
45
55
  def initialize(method, target)
46
- @method, @target = method, target
56
+ @method = method
57
+ @target = target
47
58
  end
48
59
 
49
60
  # @return [Pry::Method, nil] The Pry::Method that matches the
50
61
  # given binding.
51
- def get_method
62
+ def find_method
52
63
  find_method_in_superclass || find_renamed_method
53
64
  end
54
65
 
@@ -56,11 +67,16 @@ class Pry
56
67
  # This usually happens when the method captured by the Binding
57
68
  # has been subsequently deleted.
58
69
  def lost_method?
59
- !!(get_method.nil? && renamed_method_source_location)
70
+ !!(find_method.nil? && renamed_method_source_location)
60
71
  end
61
72
 
62
73
  private
63
74
 
75
+ def skip_superclass_search?
76
+ target_mod = @target.eval('self').class
77
+ target_mod.ancestors.take_while { |mod| mod != target_mod }.any?
78
+ end
79
+
64
80
  def normal_method?(method)
65
81
  self.class.normal_method?(method, target)
66
82
  end
@@ -70,48 +86,64 @@ class Pry
70
86
  end
71
87
 
72
88
  def target_file
73
- pry_file? ? target.eval('__FILE__') : File.expand_path(target.eval('__FILE__'))
89
+ file =
90
+ if target.respond_to?(:source_location)
91
+ target.source_location.first
92
+ else
93
+ target.eval('__FILE__')
94
+ end
95
+ pry_file? ? file : File.expand_path(file)
74
96
  end
75
97
 
76
98
  def target_line
77
- target.eval('__LINE__')
99
+ if target.respond_to?(:source_location)
100
+ target.source_location.last
101
+ else
102
+ target.eval('__LINE__')
103
+ end
78
104
  end
79
105
 
80
106
  def pry_file?
81
- Pry.eval_path == target.eval('__FILE__')
107
+ file =
108
+ if target.respond_to?(:source_location)
109
+ target.source_location.first
110
+ else
111
+ target.eval('__FILE__')
112
+ end
113
+ Pry.eval_path == file
82
114
  end
83
115
 
84
- # it's possible in some cases that the method we find by this approach is a sub-method of
85
- # the one we're currently in, consider:
116
+ # it's possible in some cases that the method we find by this approach is
117
+ # a sub-method of the one we're currently in, consider:
86
118
  #
87
119
  # class A; def b; binding.pry; end; end
88
120
  # class B < A; def b; super; end; end
89
121
  #
90
- # Given that we can normally find the source_range of methods, and that we know which
91
- # __FILE__ and __LINE__ the binding is at, we can hope to disambiguate these cases.
122
+ # Given that we can normally find the source_range of methods, and that we
123
+ # know which __FILE__ and __LINE__ the binding is at, we can hope to
124
+ # disambiguate these cases.
92
125
  #
93
- # This obviously won't work if the source is unavaiable for some reason, or if both
94
- # methods have the same __FILE__ and __LINE__, or if we're in rbx where b.eval('__LINE__')
95
- # is broken.
126
+ # This obviously won't work if the source is unavaiable for some reason,
127
+ # or if both methods have the same __FILE__ and __LINE__.
96
128
  #
97
129
  # @return [Pry::Method, nil] The Pry::Method representing the
98
130
  # superclass method.
99
131
  def find_method_in_superclass
100
132
  guess = method
133
+ return guess if skip_superclass_search?
101
134
 
102
135
  while guess
103
136
  # needs rescue if this is a Disowned method or a C method or something...
104
137
  # TODO: Fix up the exception handling so we don't need a bare rescue
105
- if normal_method?(guess)
106
- return guess
107
- else
108
- guess = guess.super
109
- end
138
+ return guess if normal_method?(guess)
139
+ break if guess == guess.super
140
+
141
+ guess = guess.super
110
142
  end
111
143
 
112
- # Uhoh... none of the methods in the chain had the right __FILE__ and __LINE__
113
- # This may be caused by rbx https://github.com/rubinius/rubinius/issues/953,
114
- # or other unknown circumstances (TODO: we should warn the user when this happens)
144
+ # Uhoh... none of the methods in the chain had the right `__FILE__` and
145
+ # `__LINE__` due to unknown circumstances.
146
+ # TODO: we should warn the user when this happens.
115
147
  nil
116
148
  end
117
149
 
@@ -122,21 +154,23 @@ class Pry
122
154
  # @return [Pry::Method, nil] The Pry::Method representing the
123
155
  # renamed method
124
156
  def find_renamed_method
125
- return if !valid_file?(target_file)
157
+ return unless valid_file?(target_file)
158
+
126
159
  alias_name = all_methods_for(target_self).find do |v|
127
- expanded_source_location(target_self.method(v).source_location) == renamed_method_source_location
160
+ location = target_self.method(v).source_location
161
+ location && expanded_source_location(location) == renamed_method_source_location
128
162
  end
129
163
 
130
164
  alias_name && Pry::Method(target_self.method(alias_name))
131
165
  end
132
166
 
133
- def expanded_source_location(sl)
134
- return if !sl
167
+ def expanded_source_location(source_location)
168
+ return unless source_location
135
169
 
136
170
  if pry_file?
137
- sl
171
+ source_location
138
172
  else
139
- [File.expand_path(sl.first), sl.last]
173
+ [File.expand_path(source_location.first), source_location.last]
140
174
  end
141
175
  end
142
176
 
@@ -148,14 +182,16 @@ class Pry
148
182
  # @return [Array<String, Fixnum>] The `source_location` of the
149
183
  # renamed method
150
184
  def renamed_method_source_location
151
- return @original_method_source_location if defined?(@original_method_source_location)
185
+ if defined?(@original_method_source_location)
186
+ return @original_method_source_location
187
+ end
152
188
 
153
189
  source_index = lines_for_file(target_file)[0..(target_line - 1)].rindex do |v|
154
190
  Pry::Method.method_definition?(method.name, v)
155
191
  end
156
192
 
157
- @original_method_source_location = source_index &&
158
- [target_file, index_to_line_number(source_index)]
193
+ @original_method_source_location =
194
+ source_index && [target_file, index_to_line_number(source_index)]
159
195
  end
160
196
 
161
197
  def index_to_line_number(index)
@@ -164,7 +200,7 @@ class Pry
164
200
  end
165
201
 
166
202
  def valid_file?(file)
167
- (File.exists?(file) && !File.directory?(file)) || Pry.eval_path == file
203
+ (File.exist?(file) && !File.directory?(file)) || Pry.eval_path == file
168
204
  end
169
205
 
170
206
  def lines_for_file(file)