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.
- checksums.yaml +5 -5
- data/CHANGELOG.md +1141 -0
- data/LICENSE +2 -2
- data/README.md +466 -0
- data/bin/pry +4 -7
- data/lib/pry/basic_object.rb +10 -0
- data/lib/pry/block_command.rb +22 -0
- data/lib/pry/class_command.rb +194 -0
- data/lib/pry/cli.rb +97 -92
- data/lib/pry/code/code_file.rb +114 -0
- data/lib/pry/code/code_range.rb +7 -4
- data/lib/pry/code/loc.rb +27 -14
- data/lib/pry/code.rb +62 -90
- data/lib/pry/code_object.rb +83 -39
- data/lib/pry/color_printer.rb +66 -0
- data/lib/pry/command.rb +202 -371
- data/lib/pry/command_set.rb +151 -133
- data/lib/pry/command_state.rb +31 -0
- data/lib/pry/commands/amend_line.rb +86 -82
- data/lib/pry/commands/bang.rb +18 -14
- data/lib/pry/commands/bang_pry.rb +15 -11
- data/lib/pry/commands/cat/abstract_formatter.rb +23 -18
- data/lib/pry/commands/cat/exception_formatter.rb +85 -73
- data/lib/pry/commands/cat/file_formatter.rb +56 -63
- data/lib/pry/commands/cat/input_expression_formatter.rb +35 -30
- data/lib/pry/commands/cat.rb +64 -47
- data/lib/pry/commands/cd.rb +42 -26
- data/lib/pry/commands/change_inspector.rb +34 -0
- data/lib/pry/commands/change_prompt.rb +51 -0
- data/lib/pry/commands/clear_screen.rb +20 -0
- data/lib/pry/commands/code_collector.rb +148 -131
- data/lib/pry/commands/disable_pry.rb +23 -19
- data/lib/pry/commands/easter_eggs.rb +23 -34
- data/lib/pry/commands/edit/exception_patcher.rb +21 -17
- data/lib/pry/commands/edit/file_and_line_locator.rb +33 -24
- data/lib/pry/commands/edit.rb +183 -167
- data/lib/pry/commands/exit.rb +40 -35
- data/lib/pry/commands/exit_all.rb +24 -20
- data/lib/pry/commands/exit_program.rb +20 -17
- data/lib/pry/commands/find_method.rb +167 -167
- data/lib/pry/commands/fix_indent.rb +16 -12
- data/lib/pry/commands/help.rb +140 -133
- data/lib/pry/commands/hist.rb +153 -132
- data/lib/pry/commands/import_set.rb +20 -15
- data/lib/pry/commands/jump_to.rb +25 -21
- data/lib/pry/commands/list_inspectors.rb +42 -0
- data/lib/pry/commands/ls/constants.rb +75 -0
- data/lib/pry/commands/ls/formatter.rb +55 -0
- data/lib/pry/commands/ls/globals.rb +50 -0
- data/lib/pry/commands/ls/grep.rb +23 -0
- data/lib/pry/commands/ls/instance_vars.rb +40 -0
- data/lib/pry/commands/ls/interrogatable.rb +24 -0
- data/lib/pry/commands/ls/jruby_hacks.rb +55 -0
- data/lib/pry/commands/ls/local_names.rb +37 -0
- data/lib/pry/commands/ls/local_vars.rb +47 -0
- data/lib/pry/commands/ls/ls_entity.rb +65 -0
- data/lib/pry/commands/ls/methods.rb +55 -0
- data/lib/pry/commands/ls/methods_helper.rb +50 -0
- data/lib/pry/commands/ls/self_methods.rb +34 -0
- data/lib/pry/commands/ls.rb +100 -303
- data/lib/pry/commands/nesting.rb +21 -17
- data/lib/pry/commands/play.rb +93 -49
- data/lib/pry/commands/pry_backtrace.rb +22 -18
- data/lib/pry/commands/pry_version.rb +15 -11
- data/lib/pry/commands/raise_up.rb +33 -27
- data/lib/pry/commands/reload_code.rb +57 -48
- data/lib/pry/commands/reset.rb +16 -12
- data/lib/pry/commands/ri.rb +57 -38
- data/lib/pry/commands/save_file.rb +45 -43
- data/lib/pry/commands/shell_command.rb +66 -34
- data/lib/pry/commands/shell_mode.rb +22 -20
- data/lib/pry/commands/show_doc.rb +80 -65
- data/lib/pry/commands/show_info.rb +193 -159
- data/lib/pry/commands/show_input.rb +16 -11
- data/lib/pry/commands/show_source.rb +113 -33
- data/lib/pry/commands/stat.rb +35 -31
- data/lib/pry/commands/switch_to.rb +21 -15
- data/lib/pry/commands/toggle_color.rb +21 -13
- data/lib/pry/commands/watch_expression/expression.rb +43 -0
- data/lib/pry/commands/watch_expression.rb +110 -0
- data/lib/pry/commands/whereami.rb +157 -134
- data/lib/pry/commands/wtf.rb +78 -40
- data/lib/pry/config/attributable.rb +22 -0
- data/lib/pry/config/lazy_value.rb +29 -0
- data/lib/pry/config/memoized_value.rb +34 -0
- data/lib/pry/config/value.rb +24 -0
- data/lib/pry/config.rb +290 -220
- data/lib/pry/control_d_handler.rb +28 -0
- data/lib/pry/core_extensions.rb +50 -27
- data/lib/pry/editor.rb +130 -102
- data/lib/pry/env.rb +18 -0
- data/lib/pry/exception_handler.rb +43 -0
- data/lib/pry/exceptions.rb +73 -0
- data/lib/pry/forwardable.rb +27 -0
- data/lib/pry/helpers/base_helpers.rb +22 -151
- data/lib/pry/helpers/command_helpers.rb +55 -63
- data/lib/pry/helpers/documentation_helpers.rb +21 -13
- data/lib/pry/helpers/options_helpers.rb +15 -8
- data/lib/pry/helpers/platform.rb +55 -0
- data/lib/pry/helpers/table.rb +44 -32
- data/lib/pry/helpers/text.rb +96 -86
- data/lib/pry/helpers.rb +3 -0
- data/lib/pry/history.rb +101 -70
- data/lib/pry/hooks.rb +67 -137
- data/lib/pry/indent.rb +79 -73
- data/lib/pry/input_completer.rb +283 -0
- data/lib/pry/input_lock.rb +129 -0
- data/lib/pry/inspector.rb +39 -0
- data/lib/pry/last_exception.rb +61 -0
- data/lib/pry/method/disowned.rb +19 -5
- data/lib/pry/{commands/edit/method_patcher.rb → method/patcher.rb} +51 -42
- data/lib/pry/method/weird_method_locator.rb +80 -44
- data/lib/pry/method.rb +225 -176
- data/lib/pry/object_path.rb +91 -0
- data/lib/pry/output.rb +136 -0
- data/lib/pry/pager.rb +227 -68
- data/lib/pry/prompt.rb +214 -0
- data/lib/pry/pry_class.rb +216 -289
- data/lib/pry/pry_instance.rb +438 -500
- data/lib/pry/repl.rb +256 -0
- data/lib/pry/repl_file_loader.rb +34 -35
- data/lib/pry/ring.rb +89 -0
- data/lib/pry/slop/LICENSE +20 -0
- data/lib/pry/slop/commands.rb +190 -0
- data/lib/pry/slop/option.rb +210 -0
- data/lib/pry/slop.rb +672 -0
- data/lib/pry/syntax_highlighter.rb +26 -0
- data/lib/pry/system_command_handler.rb +17 -0
- data/lib/pry/testable/evalable.rb +24 -0
- data/lib/pry/testable/mockable.rb +22 -0
- data/lib/pry/testable/pry_tester.rb +88 -0
- data/lib/pry/testable/utility.rb +34 -0
- data/lib/pry/testable/variables.rb +52 -0
- data/lib/pry/testable.rb +68 -0
- data/lib/pry/version.rb +3 -1
- data/lib/pry/warning.rb +20 -0
- data/lib/pry/{module_candidate.rb → wrapped_module/candidate.rb} +36 -43
- data/lib/pry/wrapped_module.rb +102 -103
- data/lib/pry.rb +135 -261
- metadata +94 -283
- data/.document +0 -2
- data/.gitignore +0 -16
- data/.travis.yml +0 -21
- data/.yardopts +0 -1
- data/CHANGELOG +0 -534
- data/CONTRIBUTORS +0 -55
- data/Gemfile +0 -9
- data/Guardfile +0 -62
- data/README.markdown +0 -400
- data/Rakefile +0 -140
- data/TODO +0 -117
- data/lib/pry/commands/disabled_commands.rb +0 -2
- data/lib/pry/commands/gem_cd.rb +0 -26
- data/lib/pry/commands/gem_install.rb +0 -29
- data/lib/pry/commands/gem_list.rb +0 -33
- data/lib/pry/commands/gem_open.rb +0 -29
- data/lib/pry/commands/gist.rb +0 -102
- data/lib/pry/commands/install_command.rb +0 -51
- data/lib/pry/commands/simple_prompt.rb +0 -22
- data/lib/pry/commands.rb +0 -6
- data/lib/pry/completion.rb +0 -304
- data/lib/pry/custom_completions.rb +0 -6
- data/lib/pry/history_array.rb +0 -116
- data/lib/pry/plugins.rb +0 -103
- data/lib/pry/rbx_method.rb +0 -13
- data/lib/pry/rbx_path.rb +0 -22
- data/lib/pry/rubygem.rb +0 -74
- data/lib/pry/terminal.rb +0 -78
- data/lib/pry/test/helper.rb +0 -185
- data/man/pry.1 +0 -195
- data/man/pry.1.html +0 -204
- data/man/pry.1.ronn +0 -141
- data/pry.gemspec +0 -30
- data/spec/Procfile +0 -3
- data/spec/cli_spec.rb +0 -78
- data/spec/code_object_spec.rb +0 -277
- data/spec/code_spec.rb +0 -219
- data/spec/command_helpers_spec.rb +0 -29
- data/spec/command_integration_spec.rb +0 -644
- data/spec/command_set_spec.rb +0 -627
- data/spec/command_spec.rb +0 -821
- data/spec/commands/amend_line_spec.rb +0 -247
- data/spec/commands/bang_spec.rb +0 -19
- data/spec/commands/cat_spec.rb +0 -164
- data/spec/commands/cd_spec.rb +0 -250
- data/spec/commands/disable_pry_spec.rb +0 -25
- data/spec/commands/edit_spec.rb +0 -727
- data/spec/commands/exit_all_spec.rb +0 -34
- data/spec/commands/exit_program_spec.rb +0 -19
- data/spec/commands/exit_spec.rb +0 -34
- data/spec/commands/find_method_spec.rb +0 -70
- data/spec/commands/gem_list_spec.rb +0 -26
- data/spec/commands/gist_spec.rb +0 -79
- data/spec/commands/help_spec.rb +0 -56
- data/spec/commands/hist_spec.rb +0 -181
- data/spec/commands/jump_to_spec.rb +0 -15
- data/spec/commands/ls_spec.rb +0 -181
- data/spec/commands/play_spec.rb +0 -140
- data/spec/commands/raise_up_spec.rb +0 -56
- data/spec/commands/save_file_spec.rb +0 -177
- data/spec/commands/show_doc_spec.rb +0 -510
- data/spec/commands/show_input_spec.rb +0 -17
- data/spec/commands/show_source_spec.rb +0 -782
- data/spec/commands/whereami_spec.rb +0 -203
- data/spec/completion_spec.rb +0 -239
- data/spec/control_d_handler_spec.rb +0 -58
- data/spec/documentation_helper_spec.rb +0 -73
- data/spec/editor_spec.rb +0 -79
- data/spec/exception_whitelist_spec.rb +0 -21
- data/spec/fixtures/candidate_helper1.rb +0 -11
- data/spec/fixtures/candidate_helper2.rb +0 -8
- data/spec/fixtures/example.erb +0 -5
- data/spec/fixtures/example_nesting.rb +0 -33
- data/spec/fixtures/show_source_doc_examples.rb +0 -15
- data/spec/fixtures/testrc +0 -2
- data/spec/fixtures/testrcbad +0 -2
- data/spec/fixtures/whereami_helper.rb +0 -6
- data/spec/helper.rb +0 -34
- data/spec/helpers/bacon.rb +0 -86
- data/spec/helpers/mock_pry.rb +0 -43
- data/spec/helpers/table_spec.rb +0 -105
- data/spec/history_array_spec.rb +0 -67
- data/spec/hooks_spec.rb +0 -522
- data/spec/indent_spec.rb +0 -301
- data/spec/input_stack_spec.rb +0 -90
- data/spec/method_spec.rb +0 -482
- data/spec/prompt_spec.rb +0 -60
- data/spec/pry_defaults_spec.rb +0 -419
- data/spec/pry_history_spec.rb +0 -99
- data/spec/pry_output_spec.rb +0 -95
- data/spec/pry_spec.rb +0 -504
- data/spec/run_command_spec.rb +0 -25
- data/spec/sticky_locals_spec.rb +0 -157
- data/spec/syntax_checking_spec.rb +0 -81
- data/spec/wrapped_module_spec.rb +0 -261
- data/wiki/Customizing-pry.md +0 -397
- data/wiki/Home.md +0 -4
data/lib/pry/wrapped_module.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
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
|
-
|
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
|
70
|
-
#
|
71
|
-
#
|
72
|
-
#
|
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
|
-
|
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
|
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
|
-
|
136
|
+
unless singleton_class?
|
137
|
+
raise ArgumentError, "tried to get instance of non singleton class"
|
138
|
+
end
|
145
139
|
|
146
|
-
if Helpers::
|
140
|
+
if Helpers::Platform.jruby?
|
147
141
|
wrapped.to_java.attached
|
148
142
|
else
|
149
|
-
@singleton_instance ||= ObjectSpace.each_object(wrapped).detect
|
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.
|
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
|
159
|
-
|
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
|
-
|
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
|
-
|
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
|
-
# @
|
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 =
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
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
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
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
|
-
#
|
291
|
-
#
|
292
|
-
#
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
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
|
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
|
-
|
329
|
-
|
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
|
-
#
|
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|
|
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
|
-
|
346
|
-
end
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
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
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
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
|