pry 0.10.2-i386-mingw32 → 1.0.0.pre1-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/.document +2 -0
- data/.gitignore +16 -0
- data/.travis.yml +21 -0
- data/.yardopts +3 -0
- data/CHANGELOG +503 -0
- data/CONTRIBUTORS +55 -0
- data/Gemfile +9 -0
- data/Guardfile +62 -0
- data/LICENSE +2 -2
- data/{README.md → README.markdown} +31 -37
- data/Rakefile +144 -0
- data/TODO +117 -0
- data/lib/pry.rb +146 -33
- data/lib/pry/cli.rb +13 -35
- data/lib/pry/code.rb +63 -24
- data/lib/pry/code/loc.rb +2 -2
- data/lib/pry/code_object.rb +21 -40
- data/lib/pry/command.rb +6 -9
- data/lib/pry/command_set.rb +37 -80
- data/lib/pry/commands.rb +1 -1
- data/lib/pry/commands/amend_line.rb +1 -1
- data/lib/pry/commands/bang.rb +1 -1
- data/lib/pry/commands/cat.rb +2 -11
- data/lib/pry/commands/cat/abstract_formatter.rb +1 -1
- data/lib/pry/commands/cat/exception_formatter.rb +7 -6
- data/lib/pry/commands/cat/file_formatter.rb +32 -15
- data/lib/pry/commands/cat/input_expression_formatter.rb +1 -1
- data/lib/pry/commands/cd.rb +3 -14
- data/lib/pry/commands/code_collector.rb +4 -4
- data/lib/pry/commands/easter_eggs.rb +3 -3
- data/lib/pry/commands/edit.rb +22 -10
- data/lib/pry/commands/edit/exception_patcher.rb +1 -1
- data/lib/pry/commands/edit/file_and_line_locator.rb +2 -0
- data/lib/pry/{method/patcher.rb → commands/edit/method_patcher.rb} +37 -40
- data/lib/pry/commands/find_method.rb +22 -16
- data/lib/pry/commands/gem_install.rb +2 -5
- data/lib/pry/commands/gem_open.rb +1 -1
- data/lib/pry/commands/gist.rb +11 -10
- data/lib/pry/commands/help.rb +14 -14
- data/lib/pry/commands/hist.rb +5 -24
- data/lib/pry/commands/ls.rb +287 -56
- data/lib/pry/commands/play.rb +10 -44
- data/lib/pry/commands/pry_backtrace.rb +2 -1
- data/lib/pry/commands/raise_up.rb +1 -1
- data/lib/pry/commands/reload_code.rb +15 -31
- data/lib/pry/commands/ri.rb +3 -7
- data/lib/pry/commands/shell_command.rb +12 -17
- data/lib/pry/commands/shell_mode.rb +2 -2
- data/lib/pry/commands/show_doc.rb +0 -5
- data/lib/pry/commands/show_info.rb +10 -11
- data/lib/pry/commands/show_source.rb +3 -15
- data/lib/pry/commands/simple_prompt.rb +1 -1
- data/lib/pry/commands/toggle_color.rb +4 -8
- data/lib/pry/commands/whereami.rb +10 -18
- data/lib/pry/completion.rb +293 -0
- data/lib/pry/config.rb +233 -20
- data/lib/pry/core_extensions.rb +19 -29
- data/lib/pry/custom_completions.rb +6 -0
- data/lib/pry/editor.rb +103 -109
- data/lib/pry/helpers/base_helpers.rb +109 -22
- data/lib/pry/helpers/command_helpers.rb +8 -10
- data/lib/pry/helpers/documentation_helpers.rb +2 -1
- data/lib/pry/helpers/text.rb +5 -4
- data/lib/pry/history.rb +10 -21
- data/lib/pry/history_array.rb +0 -5
- data/lib/pry/hooks.rb +29 -9
- data/lib/pry/indent.rb +10 -5
- data/lib/pry/method.rb +86 -81
- data/lib/pry/method/weird_method_locator.rb +2 -4
- data/lib/pry/module_candidate.rb +14 -5
- data/lib/pry/pager.rb +48 -193
- data/lib/pry/plugins.rb +2 -2
- data/lib/pry/pry_class.rb +193 -104
- data/lib/pry/pry_instance.rb +154 -152
- data/lib/pry/rbx_method.rb +13 -0
- data/lib/pry/rbx_path.rb +1 -1
- data/lib/pry/repl.rb +14 -17
- data/lib/pry/repl_file_loader.rb +3 -8
- data/lib/pry/rubygem.rb +3 -3
- data/lib/pry/terminal.rb +3 -4
- data/lib/pry/test/helper.rb +11 -6
- data/lib/pry/version.rb +1 -1
- data/lib/pry/wrapped_module.rb +56 -49
- data/man/pry.1 +195 -0
- data/man/pry.1.html +204 -0
- data/man/pry.1.ronn +141 -0
- data/pry.gemspec +31 -0
- data/spec/Procfile +3 -0
- data/spec/cli_spec.rb +78 -0
- data/spec/code_object_spec.rb +277 -0
- data/spec/code_spec.rb +219 -0
- data/spec/command_helpers_spec.rb +29 -0
- data/spec/command_integration_spec.rb +562 -0
- data/spec/command_set_spec.rb +627 -0
- data/spec/command_spec.rb +821 -0
- data/spec/commands/amend_line_spec.rb +247 -0
- data/spec/commands/bang_spec.rb +18 -0
- data/spec/commands/cat_spec.rb +164 -0
- data/spec/commands/cd_spec.rb +250 -0
- data/spec/commands/disable_pry_spec.rb +25 -0
- data/spec/commands/edit_spec.rb +725 -0
- data/spec/commands/exit_all_spec.rb +27 -0
- data/spec/commands/exit_program_spec.rb +19 -0
- data/spec/commands/exit_spec.rb +28 -0
- data/spec/commands/find_method_spec.rb +70 -0
- data/spec/commands/gem_list_spec.rb +26 -0
- data/spec/commands/gist_spec.rb +79 -0
- data/spec/commands/help_spec.rb +56 -0
- data/spec/commands/hist_spec.rb +172 -0
- data/spec/commands/jump_to_spec.rb +15 -0
- data/spec/commands/ls_spec.rb +189 -0
- data/spec/commands/play_spec.rb +136 -0
- data/spec/commands/raise_up_spec.rb +56 -0
- data/spec/commands/save_file_spec.rb +177 -0
- data/spec/commands/show_doc_spec.rb +488 -0
- data/spec/commands/show_input_spec.rb +17 -0
- data/spec/commands/show_source_spec.rb +760 -0
- data/spec/commands/whereami_spec.rb +203 -0
- data/spec/completion_spec.rb +221 -0
- data/spec/control_d_handler_spec.rb +62 -0
- data/spec/documentation_helper_spec.rb +73 -0
- data/spec/editor_spec.rb +79 -0
- data/spec/exception_whitelist_spec.rb +21 -0
- data/spec/fixtures/candidate_helper1.rb +11 -0
- data/spec/fixtures/candidate_helper2.rb +8 -0
- data/spec/fixtures/example.erb +5 -0
- data/spec/fixtures/example_nesting.rb +33 -0
- data/spec/fixtures/show_source_doc_examples.rb +15 -0
- data/spec/fixtures/testlinkrc +2 -0
- data/spec/fixtures/testrc +2 -0
- data/spec/fixtures/testrcbad +2 -0
- data/spec/fixtures/whereami_helper.rb +6 -0
- data/spec/helper.rb +35 -0
- data/spec/helpers/bacon.rb +86 -0
- data/spec/helpers/mock_pry.rb +44 -0
- data/spec/helpers/repl_tester.rb +112 -0
- data/spec/helpers/table_spec.rb +105 -0
- data/spec/history_array_spec.rb +67 -0
- data/spec/hooks_spec.rb +522 -0
- data/spec/indent_spec.rb +301 -0
- data/spec/method_spec.rb +482 -0
- data/spec/prompt_spec.rb +61 -0
- data/spec/pry_defaults_spec.rb +420 -0
- data/spec/pry_history_spec.rb +69 -0
- data/spec/pry_output_spec.rb +95 -0
- data/spec/pry_repl_spec.rb +86 -0
- data/spec/pry_spec.rb +394 -0
- data/spec/pryrc_spec.rb +97 -0
- data/spec/run_command_spec.rb +25 -0
- data/spec/sticky_locals_spec.rb +147 -0
- data/spec/syntax_checking_spec.rb +81 -0
- data/spec/wrapped_module_spec.rb +261 -0
- data/wiki/Customizing-pry.md +397 -0
- data/wiki/Home.md +4 -0
- metadata +272 -61
- checksums.yaml +0 -7
- data/CHANGELOG.md +0 -714
- data/lib/pry/code/code_file.rb +0 -103
- data/lib/pry/color_printer.rb +0 -55
- data/lib/pry/commands/change_inspector.rb +0 -27
- data/lib/pry/commands/change_prompt.rb +0 -26
- data/lib/pry/commands/list_inspectors.rb +0 -35
- data/lib/pry/commands/list_prompts.rb +0 -35
- data/lib/pry/commands/ls/constants.rb +0 -47
- data/lib/pry/commands/ls/formatter.rb +0 -49
- data/lib/pry/commands/ls/globals.rb +0 -48
- data/lib/pry/commands/ls/grep.rb +0 -21
- data/lib/pry/commands/ls/instance_vars.rb +0 -39
- data/lib/pry/commands/ls/interrogatable.rb +0 -18
- data/lib/pry/commands/ls/jruby_hacks.rb +0 -49
- data/lib/pry/commands/ls/local_names.rb +0 -35
- data/lib/pry/commands/ls/local_vars.rb +0 -39
- data/lib/pry/commands/ls/ls_entity.rb +0 -70
- data/lib/pry/commands/ls/methods.rb +0 -57
- data/lib/pry/commands/ls/methods_helper.rb +0 -46
- data/lib/pry/commands/ls/self_methods.rb +0 -32
- data/lib/pry/commands/watch_expression.rb +0 -105
- data/lib/pry/commands/watch_expression/expression.rb +0 -38
- data/lib/pry/config/behavior.rb +0 -139
- data/lib/pry/config/convenience.rb +0 -25
- data/lib/pry/config/default.rb +0 -161
- data/lib/pry/exceptions.rb +0 -78
- data/lib/pry/input_completer.rb +0 -242
- data/lib/pry/input_lock.rb +0 -132
- data/lib/pry/inspector.rb +0 -27
- data/lib/pry/last_exception.rb +0 -61
- data/lib/pry/object_path.rb +0 -82
- data/lib/pry/output.rb +0 -50
- data/lib/pry/prompt.rb +0 -26
@@ -15,6 +15,14 @@ class Pry
|
|
15
15
|
file.close(true) if file
|
16
16
|
end
|
17
17
|
|
18
|
+
def render_output(str, opts={})
|
19
|
+
if opts[:flood]
|
20
|
+
output.puts str
|
21
|
+
else
|
22
|
+
stagger_output str
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
18
26
|
def internal_binding?(target)
|
19
27
|
m = target.eval("::Kernel.__method__").to_s
|
20
28
|
# class_eval is here because of http://jira.codehaus.org/browse/JRUBY-6753
|
@@ -141,16 +149,6 @@ class Pry
|
|
141
149
|
|
142
150
|
Range.new(a, b)
|
143
151
|
end
|
144
|
-
|
145
|
-
def set_file_and_dir_locals(file_name, _pry_=_pry_(), target=target())
|
146
|
-
return if !target or !file_name
|
147
|
-
_pry_.last_file = File.expand_path(file_name)
|
148
|
-
_pry_.inject_local("_file_", _pry_.last_file, target)
|
149
|
-
|
150
|
-
_pry_.last_dir = File.dirname(_pry_.last_file)
|
151
|
-
_pry_.inject_local("_dir_", _pry_.last_dir, target)
|
152
|
-
end
|
153
152
|
end
|
154
|
-
|
155
153
|
end
|
156
154
|
end
|
@@ -8,6 +8,7 @@ class Pry
|
|
8
8
|
module_function
|
9
9
|
|
10
10
|
def process_rdoc(comment)
|
11
|
+
return comment unless Pry.color
|
11
12
|
comment = comment.dup
|
12
13
|
comment.gsub(/<code>(?:\s*\n)?(.*?)\s*<\/code>/m) { CodeRay.scan($1, :ruby).term }.
|
13
14
|
gsub(/<em>(?:\s*\n)?(.*?)\s*<\/em>/m) { "\e[1m#{$1}\e[0m" }.
|
@@ -36,7 +37,7 @@ class Pry
|
|
36
37
|
yard_tags = ["param", "return", "option", "yield", "attr", "attr_reader", "attr_writer",
|
37
38
|
"deprecate", "example", "raise"]
|
38
39
|
(yard_tags - ["example"]).inject(comment) { |a, v| process_yardoc_tag(a, v) }.
|
39
|
-
gsub(/^@(#{yard_tags.join("|")})/) { "\e[33m#{$1}\e[0m" }
|
40
|
+
gsub(/^@(#{yard_tags.join("|")})/) { Pry.color ? "\e[33m#{$1}\e[0m": $1 }
|
40
41
|
end
|
41
42
|
|
42
43
|
def process_comment_markup(comment)
|
data/lib/pry/helpers/text.rb
CHANGED
@@ -21,11 +21,11 @@ class Pry
|
|
21
21
|
|
22
22
|
COLORS.each_pair do |color, value|
|
23
23
|
define_method color do |text|
|
24
|
-
"\033[0;#{30+value}m#{text}\033[0m"
|
24
|
+
Pry.color ? "\033[0;#{30+value}m#{text}\033[0m" : text.to_s
|
25
25
|
end
|
26
26
|
|
27
27
|
define_method "bright_#{color}" do |text|
|
28
|
-
"\033[1;#{30+value}m#{text}\033[0m"
|
28
|
+
Pry.color ? "\033[1;#{30+value}m#{text}\033[0m" : text.to_s
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -38,11 +38,12 @@ class Pry
|
|
38
38
|
end
|
39
39
|
|
40
40
|
# Returns _text_ as bold text for use on a terminal.
|
41
|
+
# _Pry.color_ must be true for this method to perform any transformations.
|
41
42
|
#
|
42
43
|
# @param [String, #to_s] text
|
43
44
|
# @return [String] _text_
|
44
45
|
def bold(text)
|
45
|
-
"\e[1m#{text}\e[0m"
|
46
|
+
Pry.color ? "\e[1m#{text}\e[0m" : text.to_s
|
46
47
|
end
|
47
48
|
|
48
49
|
# Returns `text` in the default foreground colour.
|
@@ -55,7 +56,7 @@ class Pry
|
|
55
56
|
end
|
56
57
|
alias_method :bright_default, :bold
|
57
58
|
|
58
|
-
# Executes the block with `Pry.
|
59
|
+
# Executes the block with `Pry.color` set to false.
|
59
60
|
# @yield
|
60
61
|
# @return [void]
|
61
62
|
def no_color(&block)
|
data/lib/pry/history.rb
CHANGED
@@ -16,18 +16,10 @@ class Pry
|
|
16
16
|
|
17
17
|
# Assign the default methods for loading, saving, pushing, and clearing.
|
18
18
|
def restore_default_behavior
|
19
|
-
|
20
|
-
|
21
|
-
@
|
22
|
-
@
|
23
|
-
|
24
|
-
if defined?(Readline)
|
25
|
-
@pusher = method(:push_to_readline)
|
26
|
-
@clearer = method(:clear_readline)
|
27
|
-
else
|
28
|
-
@pusher = proc { }
|
29
|
-
@clearer = proc { }
|
30
|
-
end
|
19
|
+
@loader = method(:read_from_file)
|
20
|
+
@saver = method(:save_to_file)
|
21
|
+
@pusher = method(:push_to_readline)
|
22
|
+
@clearer = method(:clear_readline)
|
31
23
|
end
|
32
24
|
|
33
25
|
# Load the input history using `History.loader`.
|
@@ -36,7 +28,6 @@ class Pry
|
|
36
28
|
@loader.call do |line|
|
37
29
|
@pusher.call(line.chomp)
|
38
30
|
@history << line.chomp
|
39
|
-
@original_lines += 1
|
40
31
|
end
|
41
32
|
end
|
42
33
|
|
@@ -81,10 +72,10 @@ class Pry
|
|
81
72
|
|
82
73
|
# The default loader. Yields lines from `Pry.history.config.file`.
|
83
74
|
def read_from_file
|
84
|
-
|
75
|
+
filename = File.expand_path(Pry.config.history.file)
|
85
76
|
|
86
|
-
if File.exists?(
|
87
|
-
File.foreach(
|
77
|
+
if File.exists?(filename)
|
78
|
+
File.foreach(filename) { |line| yield(line) }
|
88
79
|
end
|
89
80
|
rescue => error
|
90
81
|
warn "History file not loaded: #{error.message}"
|
@@ -111,17 +102,15 @@ class Pry
|
|
111
102
|
if defined?(@history_file)
|
112
103
|
@history_file
|
113
104
|
else
|
114
|
-
@history_file = File.open(
|
115
|
-
file.sync = true
|
116
|
-
end
|
105
|
+
@history_file = File.open(file_path, 'a').tap { |f| f.sync = true }
|
117
106
|
end
|
118
107
|
rescue Errno::EACCES
|
119
108
|
warn 'History not saved; unable to open your history file for writing.'
|
120
109
|
@history_file = false
|
121
110
|
end
|
122
111
|
|
123
|
-
def
|
124
|
-
|
112
|
+
def file_path
|
113
|
+
@file_path || Pry.config.history.file
|
125
114
|
end
|
126
115
|
end
|
127
116
|
end
|
data/lib/pry/history_array.rb
CHANGED
data/lib/pry/hooks.rb
CHANGED
@@ -18,11 +18,11 @@ class Pry
|
|
18
18
|
# @param [Hash] hash The hash to convert to `Pry::Hooks`.
|
19
19
|
# @return [Pry::Hooks] The resulting `Pry::Hooks` instance.
|
20
20
|
def self.from_hash(hash)
|
21
|
-
return hash if hash.instance_of?(self)
|
22
21
|
instance = new
|
23
22
|
hash.each do |k, v|
|
24
23
|
instance.add_hook(k, nil, v)
|
25
24
|
end
|
25
|
+
|
26
26
|
instance
|
27
27
|
end
|
28
28
|
|
@@ -49,6 +49,22 @@ class Pry
|
|
49
49
|
@errors ||= []
|
50
50
|
end
|
51
51
|
|
52
|
+
# FIXME:
|
53
|
+
# This is a hack to alert people of the new API.
|
54
|
+
def [](event_name)
|
55
|
+
warn "`Pry.hooks[]` is deprecated! Please use the new `Pry::Hooks` API! http://rubydoc.info/github/pry/pry/master/Pry/Hooks"
|
56
|
+
|
57
|
+
get_hook(event_name, nil)
|
58
|
+
end
|
59
|
+
|
60
|
+
# FIXME:
|
61
|
+
# This is a hack to alert people of the new API.
|
62
|
+
def []=(event_name, callable)
|
63
|
+
warn "`Pry.hooks[]=` is deprecated! Please use the new `Pry::Hooks` API! http://rubydoc.info/github/pry/pry/master/Pry/Hooks"
|
64
|
+
|
65
|
+
add_hook(event_name, nil, callable)
|
66
|
+
end
|
67
|
+
|
52
68
|
# Destructively merge the contents of two `Pry:Hooks` instances.
|
53
69
|
# @param [Pry::Hooks] other The `Pry::Hooks` instance to merge
|
54
70
|
# @return [Pry:Hooks] Returns the receiver.
|
@@ -130,14 +146,18 @@ class Pry
|
|
130
146
|
def exec_hook(event_name, *args, &block)
|
131
147
|
@hooks[event_name] ||= []
|
132
148
|
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
149
|
+
# silence warnings to get rid of 1.8's "warning: multiple values
|
150
|
+
# for a block parameter" warnings
|
151
|
+
Pry::Helpers::BaseHelpers.silence_warnings do
|
152
|
+
@hooks[event_name].map do |hook_name, callable|
|
153
|
+
begin
|
154
|
+
callable.call(*args, &block)
|
155
|
+
rescue RescuableException => e
|
156
|
+
errors << e
|
157
|
+
e
|
158
|
+
end
|
159
|
+
end.last
|
160
|
+
end
|
141
161
|
end
|
142
162
|
|
143
163
|
# Return the number of hook functions registered for the `event_name` event.
|
data/lib/pry/indent.rb
CHANGED
@@ -94,8 +94,8 @@ class Pry
|
|
94
94
|
indent = new
|
95
95
|
lines = str.split("\n")
|
96
96
|
n = line_number - 1
|
97
|
-
to_indent = lines[0...n]
|
98
|
-
indent.indent(to_indent.join("\n")
|
97
|
+
to_indent = lines[0...n] + (lines[n] || "").split("def").first(1)
|
98
|
+
indent.indent(to_indent.join("\n") + "\n")
|
99
99
|
indent.module_nesting
|
100
100
|
end
|
101
101
|
|
@@ -320,7 +320,7 @@ class Pry
|
|
320
320
|
# [ ["class", "Foo"], ["module", "Bar::Baz"], ["class <<", "self"] ]
|
321
321
|
#
|
322
322
|
# A nil value in the @module_nesting array happens in two places: either
|
323
|
-
# when @
|
323
|
+
# when @awaiting_token is true and we're still waiting for the string to
|
324
324
|
# fill that space, or when a parse was rejected.
|
325
325
|
#
|
326
326
|
# At the moment this function is quite restricted about what formats it will
|
@@ -341,7 +341,7 @@ class Pry
|
|
341
341
|
@module_nesting.last[1] = token if kind == :class
|
342
342
|
@awaiting_class = false
|
343
343
|
else
|
344
|
-
# leave @
|
344
|
+
# leave @nesting[-1][
|
345
345
|
@awaiting_class = false
|
346
346
|
end
|
347
347
|
end
|
@@ -384,7 +384,7 @@ class Pry
|
|
384
384
|
# @return [String]
|
385
385
|
def correct_indentation(prompt, code, overhang=0)
|
386
386
|
prompt = prompt.delete("\001\002")
|
387
|
-
line_to_measure = Pry::Helpers::Text.strip_color(prompt)
|
387
|
+
line_to_measure = Pry::Helpers::Text.strip_color(prompt) + code
|
388
388
|
whitespace = ' ' * overhang
|
389
389
|
|
390
390
|
_, cols = Terminal.screen_size
|
@@ -402,5 +402,10 @@ class Pry
|
|
402
402
|
|
403
403
|
"#{move_up}#{prompt}#{colorize_code(code)}#{whitespace}#{move_down}"
|
404
404
|
end
|
405
|
+
|
406
|
+
# Given the current Pry environment, should we try to correct indentation?
|
407
|
+
def should_correct_indentation?
|
408
|
+
Pry::Helpers::BaseHelpers.use_ansi_codes? && Pry.config.correct_indent
|
409
|
+
end
|
405
410
|
end
|
406
411
|
end
|
data/lib/pry/method.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
1
2
|
require 'pry/helpers/documentation_helpers'
|
2
3
|
|
3
4
|
class Pry
|
@@ -18,10 +19,10 @@ class Pry
|
|
18
19
|
class Method
|
19
20
|
require 'pry/method/weird_method_locator'
|
20
21
|
require 'pry/method/disowned'
|
21
|
-
require 'pry/method/patcher'
|
22
22
|
|
23
23
|
extend Helpers::BaseHelpers
|
24
24
|
include Helpers::BaseHelpers
|
25
|
+
include RbxMethod if rbx?
|
25
26
|
include Helpers::DocumentationHelpers
|
26
27
|
include CodeObject::Helpers
|
27
28
|
|
@@ -30,7 +31,8 @@ class Pry
|
|
30
31
|
# search in, find and return the requested method wrapped in a `Pry::Method`
|
31
32
|
# instance.
|
32
33
|
#
|
33
|
-
# @param [String] name The name of the method to retrieve
|
34
|
+
# @param [String, nil] name The name of the method to retrieve, or `nil` to
|
35
|
+
# delegate to `from_binding` instead.
|
34
36
|
# @param [Binding] target The context in which to search for the method.
|
35
37
|
# @param [Hash] options
|
36
38
|
# @option options [Boolean] :instance Look for an instance method if `name` doesn't
|
@@ -38,16 +40,13 @@ class Pry
|
|
38
40
|
# @option options [Boolean] :methods Look for a bound/singleton method if `name` doesn't
|
39
41
|
# contain any context.
|
40
42
|
# @return [Pry::Method, nil] A `Pry::Method` instance containing the requested
|
41
|
-
# method, or `nil` if
|
43
|
+
# method, or `nil` if no method could be located matching the parameters.
|
42
44
|
def from_str(name, target=TOPLEVEL_BINDING, options={})
|
43
45
|
if name.nil?
|
44
|
-
|
46
|
+
from_binding(target)
|
45
47
|
elsif name.to_s =~ /(.+)\#(\S+)\Z/
|
46
48
|
context, meth_name = $1, $2
|
47
49
|
from_module(target.eval(context), meth_name, target)
|
48
|
-
elsif name.to_s =~ /(.+)(\[\])\Z/
|
49
|
-
context, meth_name = $1, $2
|
50
|
-
from_obj(target.eval(context), meth_name, target)
|
51
50
|
elsif name.to_s =~ /(.+)(\.|::)(\S+)\Z/
|
52
51
|
context, meth_name = $1, $3
|
53
52
|
from_obj(target.eval(context), meth_name, target)
|
@@ -140,34 +139,15 @@ class Pry
|
|
140
139
|
# @param [Boolean] include_super Whether to include methods from ancestors.
|
141
140
|
# @return [Array[Pry::Method]]
|
142
141
|
def all_from_class(klass, include_super=true)
|
143
|
-
|
144
|
-
safe_send(klass, :"#{visibility}_instance_methods", include_super).map do |method_name|
|
145
|
-
new(safe_send(klass, :instance_method, method_name), :visibility => visibility.to_sym)
|
146
|
-
end
|
147
|
-
end.flatten(1)
|
142
|
+
all_from_common(klass, :instance_method, include_super)
|
148
143
|
end
|
149
144
|
|
150
|
-
#
|
151
145
|
# Get all of the methods on an `Object`
|
152
|
-
#
|
153
146
|
# @param [Object] obj
|
154
|
-
#
|
155
|
-
# @param [Boolean] include_super
|
156
|
-
# indicates whether or not to include methods from ancestors.
|
157
|
-
#
|
147
|
+
# @param [Boolean] include_super Whether to include methods from ancestors.
|
158
148
|
# @return [Array[Pry::Method]]
|
159
|
-
#
|
160
149
|
def all_from_obj(obj, include_super=true)
|
161
|
-
|
162
|
-
end
|
163
|
-
|
164
|
-
#
|
165
|
-
# @deprecated
|
166
|
-
# please use {#all_from_obj} instead.
|
167
|
-
# the `method_type` argument is ignored.
|
168
|
-
#
|
169
|
-
def all_from_common(obj, method_type = nil, include_super=true)
|
170
|
-
all_from_obj(obj, include_super)
|
150
|
+
all_from_common(obj, :method, include_super)
|
171
151
|
end
|
172
152
|
|
173
153
|
# Get every `Class` and `Module`, in order, that will be checked when looking
|
@@ -178,7 +158,7 @@ class Pry
|
|
178
158
|
if Class === obj
|
179
159
|
singleton_class_resolution_order(obj) + instance_resolution_order(Class)
|
180
160
|
else
|
181
|
-
klass =
|
161
|
+
klass = singleton_class(obj) rescue obj.class
|
182
162
|
instance_resolution_order(klass)
|
183
163
|
end
|
184
164
|
end
|
@@ -199,11 +179,26 @@ class Pry
|
|
199
179
|
end
|
200
180
|
|
201
181
|
def singleton_method_definition?(name, definition_line)
|
202
|
-
/^define_singleton_method\(?\s*[:\"\']#{
|
182
|
+
/^define_singleton_method\(?\s*[:\"\']#{name}|^def\s*self\.#{name}/ =~ definition_line.strip
|
203
183
|
end
|
204
184
|
|
205
185
|
def instance_method_definition?(name, definition_line)
|
206
|
-
/^define_method\(?\s*[:\"\']#{
|
186
|
+
/^define_method\(?\s*[:\"\']#{name}|^def\s*#{name}/ =~ definition_line.strip
|
187
|
+
end
|
188
|
+
|
189
|
+
private
|
190
|
+
|
191
|
+
# See all_from_class and all_from_obj.
|
192
|
+
# If method_type is :instance_method, obj must be a `Class` or a `Module`
|
193
|
+
# If method_type is :method, obj can be any `Object`
|
194
|
+
#
|
195
|
+
# N.B. we pre-cache the visibility here to avoid O(N²) behaviour in "ls".
|
196
|
+
def all_from_common(obj, method_type, include_super=true)
|
197
|
+
%w(public protected private).map do |visibility|
|
198
|
+
safe_send(obj, :"#{visibility}_#{method_type}s", include_super).map do |method_name|
|
199
|
+
new(safe_send(obj, method_type, method_name), :visibility => visibility.to_sym)
|
200
|
+
end
|
201
|
+
end.flatten(1)
|
207
202
|
end
|
208
203
|
|
209
204
|
# Get the singleton classes of superclasses that could define methods on
|
@@ -211,21 +206,14 @@ class Pry
|
|
211
206
|
# If a module is included at multiple points in the ancestry, only
|
212
207
|
# the lowest copy will be returned.
|
213
208
|
def singleton_class_resolution_order(klass)
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
end.flatten(1)
|
209
|
+
resolution_order = Pry::Method.safe_send(klass, :ancestors).map do |anc|
|
210
|
+
[singleton_class(anc)] + singleton_class(anc).included_modules if anc.is_a?(Class)
|
211
|
+
end.compact.flatten(1)
|
218
212
|
|
219
213
|
resolution_order.reverse.uniq.reverse - Class.included_modules
|
220
214
|
end
|
221
215
|
|
222
|
-
def
|
223
|
-
begin
|
224
|
-
class << obj; self; end
|
225
|
-
rescue TypeError # can't define singleton. Fixnum, Symbol, Float, ...
|
226
|
-
obj.class
|
227
|
-
end
|
228
|
-
end
|
216
|
+
def singleton_class(obj); class << obj; self; end end
|
229
217
|
end
|
230
218
|
|
231
219
|
# A new instance of `Pry::Method` wrapping the given `::Method`, `UnboundMethod`, or `Proc`.
|
@@ -275,18 +263,26 @@ class Pry
|
|
275
263
|
def source
|
276
264
|
@source ||= case source_type
|
277
265
|
when :c
|
278
|
-
|
266
|
+
info = pry_doc_info
|
267
|
+
if info and info.source
|
268
|
+
code = strip_comments_from_c_code(info.source)
|
269
|
+
end
|
279
270
|
when :ruby
|
280
|
-
|
271
|
+
# clone of MethodSource.source_helper that knows to use our
|
272
|
+
# hacked version of source_location for rbx core methods, and
|
273
|
+
# our input buffer for methods defined in (pry)
|
274
|
+
file, line = *source_location
|
275
|
+
raise SourceNotFoundError, "Could not locate source for #{name_with_owner}!" unless file
|
276
|
+
|
277
|
+
begin
|
278
|
+
code = Pry::Code.from_file(file).expression_at(line)
|
279
|
+
rescue SyntaxError => e
|
280
|
+
raise MethodSource::SourceNotFoundError.new(e.message)
|
281
|
+
end
|
282
|
+
strip_leading_whitespace(code)
|
281
283
|
end
|
282
284
|
end
|
283
285
|
|
284
|
-
# Update the live copy of the method's source.
|
285
|
-
def redefine(source)
|
286
|
-
Patcher.new(self).patch_in_ram source
|
287
|
-
Pry::Method(owner.instance_method(name))
|
288
|
-
end
|
289
|
-
|
290
286
|
# Can we get the source code for this method?
|
291
287
|
# @return [Boolean]
|
292
288
|
def source?
|
@@ -297,13 +293,20 @@ class Pry
|
|
297
293
|
|
298
294
|
# @return [String, nil] The documentation for the method, or `nil` if it's
|
299
295
|
# unavailable.
|
296
|
+
# @raise [CommandError] Raises when the method was defined in the REPL.
|
300
297
|
def doc
|
301
298
|
@doc ||= case source_type
|
302
299
|
when :c
|
303
300
|
info = pry_doc_info
|
304
301
|
info.docstring if info
|
305
302
|
when :ruby
|
306
|
-
|
303
|
+
if rbx? && !pry_method?
|
304
|
+
get_comment_content(core_doc)
|
305
|
+
elsif pry_method?
|
306
|
+
get_comment_content(doc_for_pry_method)
|
307
|
+
else
|
308
|
+
get_comment_content(@method.comment)
|
309
|
+
end
|
307
310
|
end
|
308
311
|
end
|
309
312
|
|
@@ -313,6 +316,15 @@ class Pry
|
|
313
316
|
source_location.nil? ? :c : :ruby
|
314
317
|
end
|
315
318
|
|
319
|
+
def source_location
|
320
|
+
if @method.source_location && rbx?
|
321
|
+
file, line = @method.source_location
|
322
|
+
[RbxPath.convert_path_to_full(file), line]
|
323
|
+
else
|
324
|
+
@method.source_location
|
325
|
+
end
|
326
|
+
end
|
327
|
+
|
316
328
|
# @return [String, nil] The name of the file the method is defined in, or
|
317
329
|
# `nil` if the filename is unavailable.
|
318
330
|
def source_file
|
@@ -422,14 +434,15 @@ class Pry
|
|
422
434
|
end
|
423
435
|
|
424
436
|
# @return [Array<String>] All known aliases for the method.
|
437
|
+
# @note On Ruby 1.8 this method always returns an empty Array for methods
|
438
|
+
# implemented in C.
|
425
439
|
def aliases
|
426
440
|
owner = @method.owner
|
427
441
|
# Avoid using `to_sym` on {Method#name}, which returns a `String`, because
|
428
442
|
# it won't be garbage collected.
|
429
443
|
name = @method.name
|
430
444
|
|
431
|
-
|
432
|
-
alias_list = all_methods_to_compare.combination(2).select do |pair|
|
445
|
+
alias_list = owner.instance_methods.combination(2).select do |pair|
|
433
446
|
pair.include?(name) &&
|
434
447
|
owner.instance_method(pair.first) == owner.instance_method(pair.last)
|
435
448
|
end.flatten
|
@@ -470,10 +483,6 @@ class Pry
|
|
470
483
|
@method.send(method_name, *args, &block)
|
471
484
|
end
|
472
485
|
|
473
|
-
def comment
|
474
|
-
Pry::Code.from_file(source_file).comment_describing(source_line)
|
475
|
-
end
|
476
|
-
|
477
486
|
private
|
478
487
|
|
479
488
|
# @return [YARD::CodeObjects::MethodObject]
|
@@ -483,13 +492,31 @@ class Pry
|
|
483
492
|
Pry::MethodInfo.info_for(@method) or raise CommandError, "Cannot locate this method: #{name}. (source_location returns nil)"
|
484
493
|
else
|
485
494
|
fail_msg = "Cannot locate this method: #{name}."
|
486
|
-
if
|
495
|
+
if mri_18? || mri_19?
|
487
496
|
fail_msg += ' Try `gem-install pry-doc` to get access to Ruby Core documentation.'
|
488
497
|
end
|
489
498
|
raise CommandError, fail_msg
|
490
499
|
end
|
491
500
|
end
|
492
501
|
|
502
|
+
# FIXME: a very similar method to this exists on WrappedModule: extract_doc_for_candidate
|
503
|
+
def doc_for_pry_method
|
504
|
+
_, line_num = source_location
|
505
|
+
|
506
|
+
buffer = ""
|
507
|
+
Pry.line_buffer[0..(line_num - 1)].each do |line|
|
508
|
+
# Add any line that is a valid ruby comment,
|
509
|
+
# but clear as soon as we hit a non comment line.
|
510
|
+
if (line =~ /^\s*#/) || (line =~ /^\s*$/)
|
511
|
+
buffer << line.lstrip
|
512
|
+
else
|
513
|
+
buffer.replace("")
|
514
|
+
end
|
515
|
+
end
|
516
|
+
|
517
|
+
buffer
|
518
|
+
end
|
519
|
+
|
493
520
|
# @param [Class, Module] ancestors The ancestors to investigate
|
494
521
|
# @return [Method] The unwrapped super-method
|
495
522
|
def super_using_ancestors(ancestors, times=1)
|
@@ -520,27 +547,5 @@ class Pry
|
|
520
547
|
|
521
548
|
nil
|
522
549
|
end
|
523
|
-
|
524
|
-
def c_source
|
525
|
-
info = pry_doc_info
|
526
|
-
if info and info.source
|
527
|
-
strip_comments_from_c_code(info.source)
|
528
|
-
end
|
529
|
-
end
|
530
|
-
|
531
|
-
def ruby_source
|
532
|
-
# clone of MethodSource.source_helper that knows to use our
|
533
|
-
# hacked version of source_location for rbx core methods, and
|
534
|
-
# our input buffer for methods defined in (pry)
|
535
|
-
file, line = *source_location
|
536
|
-
raise SourceNotFoundError, "Could not locate source for #{name_with_owner}!" unless file
|
537
|
-
|
538
|
-
begin
|
539
|
-
code = Pry::Code.from_file(file).expression_at(line)
|
540
|
-
rescue SyntaxError => e
|
541
|
-
raise MethodSource::SourceNotFoundError.new(e.message)
|
542
|
-
end
|
543
|
-
strip_leading_whitespace(code)
|
544
|
-
end
|
545
550
|
end
|
546
551
|
end
|