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,4 +1,4 @@
1
- require 'pry/module_candidate'
1
+ # frozen_string_literal: true
2
2
 
3
3
  class Pry
4
4
  class << self
@@ -26,12 +26,8 @@ class Pry
26
26
  # @return [Module, nil] The module or `nil` (if conversion failed).
27
27
  # @example
28
28
  # Pry::WrappedModule.from_str("Pry::Code")
29
- def self.from_str(mod_name, target=TOPLEVEL_BINDING)
30
- if safe_to_evaluate?(mod_name, target)
31
- Pry::WrappedModule.new(target.eval(mod_name))
32
- else
33
- nil
34
- end
29
+ def self.from_str(mod_name, target = TOPLEVEL_BINDING)
30
+ Pry::WrappedModule.new(target.eval(mod_name)) if safe_to_evaluate?(mod_name, target)
35
31
  rescue RescuableException
36
32
  nil
37
33
  end
@@ -48,6 +44,8 @@ class Pry
48
44
  # @return [Boolean]
49
45
  def safe_to_evaluate?(str, target)
50
46
  return true if str.strip == "self"
47
+ return false if str =~ /%/
48
+
51
49
  kind = target.eval("defined?(#{str})")
52
50
  kind =~ /variable|constant/
53
51
  end
@@ -56,37 +54,27 @@ class Pry
56
54
  # @raise [ArgumentError] if the argument is not a `Module`
57
55
  # @param [Module] mod
58
56
  def initialize(mod)
59
- raise ArgumentError, "Tried to initialize a WrappedModule with a non-module #{mod.inspect}" unless ::Module === mod
57
+ unless mod.is_a?(Module)
58
+ raise ArgumentError, "Tried to initialize a WrappedModule with a " \
59
+ "non-module #{mod.inspect}"
60
+ end
61
+
60
62
  @wrapped = mod
61
63
  @memoized_candidates = []
62
64
  @host_file_lines = nil
63
65
  @source = nil
64
66
  @source_location = nil
65
67
  @doc = nil
68
+ @all_source_locations_by_popularity = nil
66
69
  end
67
70
 
68
71
  # Returns an array of the names of the constants accessible in the wrapped
69
- # module. This provides a consistent interface between 1.8 and 1.9 and also
70
- # avoids the problem of accidentally calling the singleton method
71
- # `Module.constants`.
72
- # @param [Boolean] inherit (true) Include the names of constants from
73
- # included modules?
72
+ # module. This avoids the problem of accidentally calling the singleton
73
+ # method `Module.constants`.
74
+ # @param [Boolean] inherit Include the names of constants from included
75
+ # modules?
74
76
  def constants(inherit = true)
75
- method = Module.instance_method(:constants).bind(@wrapped)
76
-
77
- # If we're on 1.8, we have to manually remove ancestors' constants. If
78
- # we're on 1.9, though, it's better to use the built-in `inherit` param,
79
- # since it doesn't do things like incorrectly remove Pry::Config.
80
- if method.arity == 0
81
- consts = method.call
82
- if !inherit
83
- consts -= (@wrapped.ancestors - [@wrapped]).map(&:constants).flatten
84
- end
85
- else
86
- consts = method.call(inherit)
87
- end
88
-
89
- consts
77
+ Module.instance_method(:constants).bind(@wrapped).call(inherit)
90
78
  end
91
79
 
92
80
  # The prefix that would appear before methods defined on this class.
@@ -96,7 +84,7 @@ class Pry
96
84
  # @return String
97
85
  def method_prefix
98
86
  if singleton_class?
99
- if Module === singleton_instance
87
+ if Module === singleton_instance # rubocop:disable Style/CaseEquality
100
88
  "#{WrappedModule.new(singleton_instance).nonblank_name}."
101
89
  else
102
90
  "self."
@@ -120,7 +108,11 @@ class Pry
120
108
  # Is this a singleton class?
121
109
  # @return [Boolean]
122
110
  def singleton_class?
123
- wrapped != wrapped.ancestors.first
111
+ if Pry::Method.safe_send(wrapped, :respond_to?, :singleton_class?)
112
+ Pry::Method.safe_send(wrapped, :singleton_class?)
113
+ else
114
+ wrapped != Pry::Method.safe_send(wrapped, :ancestors).first
115
+ end
124
116
  end
125
117
 
126
118
  # Is this strictly a module? (does not match classes)
@@ -141,29 +133,36 @@ class Pry
141
133
  #
142
134
  # @return [Object]
143
135
  def singleton_instance
144
- raise ArgumentError, "tried to get instance of non singleton class" unless singleton_class?
136
+ unless singleton_class?
137
+ raise ArgumentError, "tried to get instance of non singleton class"
138
+ end
145
139
 
146
- if Helpers::BaseHelpers.jruby?
140
+ if Helpers::Platform.jruby?
147
141
  wrapped.to_java.attached
148
142
  else
149
- @singleton_instance ||= ObjectSpace.each_object(wrapped).detect{ |x| (class << x; self; end) == wrapped }
143
+ @singleton_instance ||= ObjectSpace.each_object(wrapped).detect do |x|
144
+ (class << x; self; end) == wrapped
145
+ end
150
146
  end
151
147
  end
152
148
 
153
149
  # Forward method invocations to the wrapped module
154
150
  def method_missing(method_name, *args, &block)
155
- wrapped.send(method_name, *args, &block)
151
+ if wrapped.respond_to?(method_name)
152
+ wrapped.send(method_name, *args, &block)
153
+ else
154
+ super
155
+ end
156
156
  end
157
157
 
158
- def respond_to?(method_name)
159
- super || wrapped.respond_to?(method_name)
158
+ def respond_to_missing?(method_name, include_private = false)
159
+ wrapped.respond_to?(method_name, include_private) || super
160
160
  end
161
161
 
162
162
  # Retrieve the source location of a module. Return value is in same
163
163
  # format as Method#source_location. If the source location
164
164
  # cannot be found this method returns `nil`.
165
165
  #
166
- # @param [Module] mod The module (or class).
167
166
  # @return [Array<String, Fixnum>, nil] The source location of the
168
167
  # module (or class), or `nil` if no source location found.
169
168
  def source_location
@@ -177,14 +176,14 @@ class Pry
177
176
  def file
178
177
  Array(source_location).first
179
178
  end
180
- alias_method :source_file, :file
179
+ alias source_file file
181
180
 
182
181
  # @return [Fixnum, nil] The associated line for the module (i.e
183
182
  # the primary candidate: highest ranked monkeypatch).
184
183
  def line
185
184
  Array(source_location).last
186
185
  end
187
- alias_method :source_line, :line
186
+ alias source_line line
188
187
 
189
188
  # Returns documentation for the module.
190
189
  # This documentation is for the primary candidate, if
@@ -238,7 +237,7 @@ class Pry
238
237
  # @param [Fixnum] rank
239
238
  # @return [Pry::WrappedModule::Candidate]
240
239
  def candidate(rank)
241
- @memoized_candidates[rank] ||= Candidate.new(self, rank)
240
+ @memoized_candidates[rank] ||= WrappedModule::Candidate.new(self, rank)
242
241
  end
243
242
 
244
243
  # @return [Fixnum] The number of candidate definitions for the
@@ -247,19 +246,14 @@ class Pry
247
246
  method_candidates.count
248
247
  end
249
248
 
250
- # @note On JRuby 1.9 and higher, in certain conditions, this method chucks
251
- # away its ability to be quick (when there are lots of monkey patches,
252
- # like in Rails). However, it should be efficient enough on other rubies.
253
- # @see https://github.com/jruby/jruby/issues/525
254
- # @return [Enumerator, Array] on JRuby 1.9 and higher returns Array, on
255
- # other rubies returns Enumerator
249
+ # @return [Array]
256
250
  def candidates
257
- enum = generator.new do |y|
258
- (0...number_of_candidates).each do |num|
259
- y.yield candidate(num)
260
- end
261
- end
262
- Pry::Helpers::BaseHelpers.jruby_19? ? enum.to_a : enum
251
+ enum = Enumerator.new do |y|
252
+ (0...number_of_candidates).each do |num|
253
+ y.yield candidate(num)
254
+ end
255
+ end
256
+ enum
263
257
  end
264
258
 
265
259
  # @return [Boolean] Whether YARD docs are available for this module.
@@ -273,38 +267,30 @@ class Pry
273
267
  # When `self` is a `Module` then return the
274
268
  # nth ancestor, otherwise (in the case of classes) return the
275
269
  # nth ancestor that is a class.
276
- def super(times=1)
270
+ def super(times = 1)
277
271
  return self if times.zero?
278
272
 
279
- if wrapped.is_a?(Class)
280
- sup = ancestors.select { |v| v.is_a?(Class) }[times]
281
- else
282
- sup = ancestors[times]
283
- end
273
+ sup =
274
+ if wrapped.is_a?(Class)
275
+ ancestors.select { |v| v.is_a?(Class) }[times]
276
+ else
277
+ ancestors[times]
278
+ end
284
279
 
285
280
  Pry::WrappedModule(sup) if sup
286
281
  end
287
282
 
288
283
  private
289
284
 
290
- # Ruby 1.8 doesn't support `Enumerator` (it's called Generator instead)
291
- #
292
- # @return [Object] Return the appropriate generator class.
293
- def generator
294
- @generator ||= if defined?(Enumerator)
295
- Enumerator
296
- else
297
- require 'generator'
298
- Generator
299
- end
300
- end
301
-
302
- # @return [Pry::WrappedModule::Candidate] The candidate of rank 0,
303
- # that is the 'monkey patch' of this module with the highest
304
- # number of methods. It is considered the 'canonical' definition
305
- # for the module.
285
+ # @return [Pry::WrappedModule::Candidate] The candidate with the
286
+ # highest rank, that is the 'monkey patch' of this module with the
287
+ # highest number of methods, which contains a source code line that
288
+ # defines the module. It is considered the 'canonical' definition
289
+ # for the module. In the absense of a suitable candidate, the
290
+ # candidate of rank 0 will be returned, or a CommandError raised if
291
+ # there are no candidates at all.
306
292
  def primary_candidate
307
- @primary_candidate ||= candidate(0)
293
+ @primary_candidate ||= candidates.find(&:file) || candidate(0)
308
294
  end
309
295
 
310
296
  # @return [Array<Array<Pry::Method>>] The array of `Pry::Method` objects,
@@ -315,7 +301,7 @@ class Pry
315
301
  # speed up source code extraction.
316
302
  def method_candidates
317
303
  @method_candidates ||= all_source_locations_by_popularity.map do |group|
318
- methods_sorted_by_source_line = group.last.sort_by(&:source_line)
304
+ methods_sorted_by_source_line = group.last.sort_by(&:source_line)
319
305
  [methods_sorted_by_source_line.first, methods_sorted_by_source_line.last]
320
306
  end
321
307
  end
@@ -324,40 +310,52 @@ class Pry
324
310
  def all_source_locations_by_popularity
325
311
  return @all_source_locations_by_popularity if @all_source_locations_by_popularity
326
312
 
327
- ims = all_relevant_methods_for(wrapped)
328
- @all_source_locations_by_popularity = ims.group_by { |v| Array(v.source_location).first }.
329
- sort_by { |k, v| -v.size }
313
+ ims = all_relevant_methods_for(wrapped).group_by do |v|
314
+ Array(v.source_location).first
315
+ end
316
+
317
+ @all_source_locations_by_popularity = ims.sort_by do |path, methods|
318
+ expanded = File.expand_path(path)
319
+ load_order = $LOADED_FEATURES.index { |file| expanded.end_with?(file) }
320
+
321
+ [-methods.size, load_order || (1.0 / 0.0)]
322
+ end
330
323
  end
331
324
 
332
325
  # We only want methods that have a non-nil `source_location`. We also
333
326
  # skip some spooky internal methods.
334
- # (i.e we skip `__class_init__` because it's an odd rbx specific thing that causes tests to fail.)
327
+ #
335
328
  # @return [Array<Pry::Method>]
336
329
  def all_relevant_methods_for(mod)
337
- all_methods_for(mod).select(&:source_location).
338
- reject{ |x| x.name == '__class_init__' || method_defined_by_forwardable_module?(x) }
330
+ methods = all_methods_for(mod).select(&:source_location)
331
+ .reject { |x| method_defined_by_forwardable_module?(x) }
332
+
333
+ return methods unless methods.empty?
334
+
335
+ safe_send(mod, :constants).flat_map do |const_name|
336
+ if (const = nested_module?(mod, const_name))
337
+ all_relevant_methods_for(const)
338
+ else
339
+ []
340
+ end
341
+ end
339
342
  end
340
343
 
341
344
  # Return all methods (instance methods and class methods) for a
342
345
  # given module.
343
346
  # @return [Array<Pry::Method>]
344
347
  def all_methods_for(mod)
345
- all_from_common(mod, :instance_method) + all_from_common(mod, :method)
346
- end
347
-
348
- # FIXME: a variant of this method is also found in Pry::Method
349
- def all_from_common(mod, method_type)
350
- %w(public protected private).map do |visibility|
351
- safe_send(mod, :"#{visibility}_#{method_type}s", false).select do |method_name|
352
- if method_type == :method
353
- safe_send(mod, method_type, method_name).owner == class << mod; self; end
354
- else
355
- safe_send(mod, method_type, method_name).owner == mod
356
- end
357
- end.map do |method_name|
358
- Pry::Method.new(safe_send(mod, method_type, method_name), :visibility => visibility.to_sym)
359
- end
360
- end.flatten
348
+ Pry::Method.all_from_obj(mod, false) + Pry::Method.all_from_class(mod, false)
349
+ end
350
+
351
+ def nested_module?(parent, name)
352
+ return if safe_send(parent, :autoload?, name)
353
+
354
+ child = safe_send(parent, :const_get, name)
355
+ return unless child.is_a?(Module)
356
+ return unless safe_send(child, :name) == "#{safe_send(parent, :name)}::#{name}"
357
+
358
+ child
361
359
  end
362
360
 
363
361
  # Detect methods that are defined with `def_delegator` from the Forwardable
@@ -373,11 +371,12 @@ class Pry
373
371
  def lines_for_file(file)
374
372
  @lines_for_file ||= {}
375
373
 
376
- if file == Pry.eval_path
377
- @lines_for_file[file] ||= Pry.line_buffer.drop(1)
378
- else
379
- @lines_for_file[file] ||= File.readlines(file)
380
- end
374
+ @lines_for_file[file] ||=
375
+ if file == Pry.eval_path
376
+ Pry.line_buffer.drop(1)
377
+ else
378
+ File.readlines(file)
379
+ end
381
380
  end
382
381
  end
383
382
  end