pry 0.10.3 → 0.12.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 +4 -4
- data/CHANGELOG.md +251 -16
- data/LICENSE +1 -1
- data/README.md +35 -51
- data/bin/pry +3 -11
- data/lib/pry/basic_object.rb +6 -0
- data/lib/pry/cli.rb +50 -52
- data/lib/pry/code/code_file.rb +13 -6
- data/lib/pry/code/code_range.rb +3 -3
- data/lib/pry/code/loc.rb +14 -8
- data/lib/pry/code.rb +12 -5
- data/lib/pry/code_object.rb +27 -4
- data/lib/pry/color_printer.rb +20 -10
- data/lib/pry/command.rb +76 -45
- data/lib/pry/command_set.rb +17 -45
- data/lib/pry/commands/amend_line.rb +3 -4
- data/lib/pry/commands/bang.rb +1 -1
- data/lib/pry/commands/cat/exception_formatter.rb +10 -8
- data/lib/pry/commands/cat/file_formatter.rb +7 -3
- data/lib/pry/commands/cat/input_expression_formatter.rb +1 -1
- data/lib/pry/commands/cat.rb +7 -6
- data/lib/pry/commands/change_prompt.rb +29 -9
- data/lib/pry/commands/clear_screen.rb +14 -0
- data/lib/pry/commands/code_collector.rb +25 -23
- data/lib/pry/commands/easter_eggs.rb +12 -12
- data/lib/pry/commands/edit/file_and_line_locator.rb +1 -1
- data/lib/pry/commands/edit.rb +15 -10
- data/lib/pry/commands/exit.rb +2 -1
- data/lib/pry/commands/find_method.rb +12 -14
- data/lib/pry/commands/gem_cd.rb +1 -1
- data/lib/pry/commands/gem_install.rb +2 -2
- data/lib/pry/commands/gem_list.rb +2 -2
- data/lib/pry/commands/gem_open.rb +2 -2
- data/lib/pry/commands/gem_readme.rb +25 -0
- data/lib/pry/commands/gem_search.rb +40 -0
- data/lib/pry/commands/gem_stats.rb +83 -0
- data/lib/pry/commands/gist.rb +7 -6
- data/lib/pry/commands/help.rb +3 -3
- data/lib/pry/commands/hist.rb +11 -10
- data/lib/pry/commands/import_set.rb +2 -1
- data/lib/pry/commands/install_command.rb +7 -6
- data/lib/pry/commands/jump_to.rb +7 -7
- data/lib/pry/commands/list_inspectors.rb +2 -2
- data/lib/pry/commands/ls/constants.rb +14 -3
- data/lib/pry/commands/ls/formatter.rb +4 -2
- data/lib/pry/commands/ls/globals.rb +0 -2
- data/lib/pry/commands/ls/grep.rb +0 -2
- data/lib/pry/commands/ls/instance_vars.rb +0 -1
- data/lib/pry/commands/ls/jruby_hacks.rb +2 -2
- data/lib/pry/commands/ls/local_names.rb +0 -2
- data/lib/pry/commands/ls/local_vars.rb +0 -2
- data/lib/pry/commands/ls/ls_entity.rb +0 -1
- data/lib/pry/commands/ls/methods.rb +0 -3
- data/lib/pry/commands/ls/methods_helper.rb +1 -1
- data/lib/pry/commands/ls/self_methods.rb +2 -1
- data/lib/pry/commands/ls.rb +30 -31
- data/lib/pry/commands/play.rb +3 -4
- data/lib/pry/commands/pry_backtrace.rb +1 -1
- data/lib/pry/commands/raise_up.rb +2 -1
- data/lib/pry/commands/reload_code.rb +2 -2
- data/lib/pry/commands/ri.rb +9 -4
- data/lib/pry/commands/shell_command.rb +36 -9
- data/lib/pry/commands/shell_mode.rb +6 -6
- data/lib/pry/commands/show_doc.rb +5 -7
- data/lib/pry/commands/show_info.rb +41 -20
- data/lib/pry/commands/show_source.rb +5 -2
- data/lib/pry/commands/stat.rb +1 -1
- data/lib/pry/commands/watch_expression/expression.rb +1 -1
- data/lib/pry/commands/watch_expression.rb +9 -7
- data/lib/pry/commands/whereami.rb +16 -9
- data/lib/pry/commands/wtf.rb +15 -2
- data/lib/pry/config/behavior.rb +230 -114
- data/lib/pry/config/convenience.rb +24 -21
- data/lib/pry/config/default.rb +151 -153
- data/lib/pry/config/memoization.rb +48 -0
- data/lib/pry/config.rb +30 -19
- data/lib/pry/core_extensions.rb +15 -4
- data/lib/pry/editor.rb +5 -12
- data/lib/pry/exceptions.rb +1 -3
- data/lib/pry/forwardable.rb +23 -0
- data/lib/pry/helpers/base_helpers.rb +197 -110
- data/lib/pry/helpers/command_helpers.rb +5 -4
- data/lib/pry/helpers/documentation_helpers.rb +3 -2
- data/lib/pry/helpers/options_helpers.rb +6 -6
- data/lib/pry/helpers/platform.rb +58 -0
- data/lib/pry/helpers/table.rb +20 -15
- data/lib/pry/helpers/text.rb +82 -74
- data/lib/pry/helpers.rb +1 -0
- data/lib/pry/history.rb +44 -10
- data/lib/pry/hooks.rb +50 -109
- data/lib/pry/indent.rb +21 -19
- data/lib/pry/input_completer.rb +146 -123
- data/lib/pry/input_lock.rb +0 -2
- data/lib/pry/last_exception.rb +2 -2
- data/lib/pry/method/disowned.rb +3 -1
- data/lib/pry/method/patcher.rb +2 -5
- data/lib/pry/method/weird_method_locator.rb +21 -11
- data/lib/pry/method.rb +44 -38
- data/lib/pry/object_path.rb +5 -4
- data/lib/pry/output.rb +37 -37
- data/lib/pry/pager.rb +195 -181
- data/lib/pry/platform.rb +91 -0
- data/lib/pry/plugins.rb +27 -8
- data/lib/pry/prompt.rb +144 -25
- data/lib/pry/pry_class.rb +83 -33
- data/lib/pry/pry_instance.rb +94 -59
- data/lib/pry/repl.rb +70 -11
- data/lib/pry/repl_file_loader.rb +2 -3
- data/lib/pry/ring.rb +84 -0
- data/lib/pry/rubygem.rb +9 -7
- data/lib/pry/slop/LICENSE +20 -0
- data/lib/pry/slop/commands.rb +195 -0
- data/lib/pry/slop/option.rb +206 -0
- data/lib/pry/slop.rb +661 -0
- data/lib/pry/terminal.rb +18 -6
- data/lib/pry/testable/evalable.rb +15 -0
- data/lib/pry/testable/mockable.rb +14 -0
- data/lib/pry/testable/pry_tester.rb +73 -0
- data/lib/pry/testable/utility.rb +26 -0
- data/lib/pry/testable/variables.rb +46 -0
- data/lib/pry/testable.rb +70 -0
- data/lib/pry/version.rb +1 -1
- data/lib/pry/{module_candidate.rb → wrapped_module/candidate.rb} +9 -14
- data/lib/pry/wrapped_module.rb +22 -21
- data/lib/pry.rb +21 -50
- metadata +35 -46
- data/lib/pry/commands/list_prompts.rb +0 -35
- data/lib/pry/commands/simple_prompt.rb +0 -22
- data/lib/pry/history_array.rb +0 -121
- data/lib/pry/rbx_path.rb +0 -22
- data/lib/pry/test/helper.rb +0 -170
data/lib/pry/cli.rb
CHANGED
@@ -1,12 +1,9 @@
|
|
1
1
|
class Pry
|
2
|
-
|
3
2
|
# Manage the processing of command line options
|
4
3
|
class CLI
|
5
|
-
|
6
4
|
NoOptionsError = Class.new(StandardError)
|
7
5
|
|
8
6
|
class << self
|
9
|
-
|
10
7
|
# @return [Proc] The Proc defining the valid command line options.
|
11
8
|
attr_accessor :options
|
12
9
|
|
@@ -19,7 +16,7 @@ class Pry
|
|
19
16
|
# as CLI options.
|
20
17
|
attr_accessor :input_args
|
21
18
|
|
22
|
-
# Add another set of CLI options (a Slop block)
|
19
|
+
# Add another set of CLI options (a Pry::Slop block)
|
23
20
|
def add_options(&block)
|
24
21
|
if options
|
25
22
|
old_options = options
|
@@ -57,7 +54,7 @@ class Pry
|
|
57
54
|
self.option_processors = nil
|
58
55
|
end
|
59
56
|
|
60
|
-
def parse_options(args=ARGV)
|
57
|
+
def parse_options(args = ARGV)
|
61
58
|
unless options
|
62
59
|
raise NoOptionsError, "No command line options defined! Use Pry::CLI.add_options to add command line options."
|
63
60
|
end
|
@@ -65,39 +62,62 @@ class Pry
|
|
65
62
|
self.input_args = args
|
66
63
|
|
67
64
|
begin
|
68
|
-
opts = Slop.parse!(
|
65
|
+
opts = Pry::Slop.parse!(
|
69
66
|
args,
|
70
|
-
:
|
71
|
-
:
|
72
|
-
:
|
67
|
+
help: true,
|
68
|
+
multiple_switches: false,
|
69
|
+
strict: true,
|
73
70
|
&options
|
74
71
|
)
|
75
|
-
rescue Slop::InvalidOptionError
|
72
|
+
rescue Pry::Slop::InvalidOptionError
|
76
73
|
# Display help message on unknown switches and exit.
|
77
|
-
puts Slop.new(&options)
|
74
|
+
puts Pry::Slop.new(&options)
|
78
75
|
exit
|
79
76
|
end
|
80
77
|
|
78
|
+
Pry.initial_session_setup
|
79
|
+
Pry.final_session_setup
|
80
|
+
|
81
81
|
# Option processors are optional.
|
82
82
|
if option_processors
|
83
83
|
option_processors.each { |processor| processor.call(opts) }
|
84
84
|
end
|
85
85
|
|
86
|
-
|
86
|
+
opts
|
87
87
|
end
|
88
88
|
|
89
|
+
def start(opts)
|
90
|
+
exit if opts.help?
|
91
|
+
|
92
|
+
# invoked via cli
|
93
|
+
Pry.cli = true
|
94
|
+
|
95
|
+
# create the actual context
|
96
|
+
if opts[:context]
|
97
|
+
Pry.initial_session_setup
|
98
|
+
context = Pry.binding_for(eval(opts[:context]))
|
99
|
+
Pry.final_session_setup
|
100
|
+
else
|
101
|
+
context = Pry.toplevel_binding
|
102
|
+
end
|
103
|
+
|
104
|
+
if Pry::CLI.input_args.any? && Pry::CLI.input_args != ["pry"]
|
105
|
+
full_name = File.expand_path(Pry::CLI.input_args.first)
|
106
|
+
Pry.load_file_through_repl(full_name)
|
107
|
+
exit
|
108
|
+
end
|
109
|
+
|
110
|
+
# Start the session (running any code passed with -e, if there is any)
|
111
|
+
Pry.start(context, input: StringIO.new(Pry.config.exec_string))
|
112
|
+
end
|
89
113
|
end
|
90
114
|
|
91
115
|
reset
|
92
116
|
end
|
93
117
|
end
|
94
118
|
|
95
|
-
|
96
|
-
# String that is built to be executed on start (created by -e and -exec switches)
|
97
|
-
exec_string = ""
|
98
|
-
|
99
119
|
# Bring in options defined by plugins
|
100
|
-
Slop.new do
|
120
|
+
Pry::Slop.new do
|
101
121
|
on "no-plugins" do
|
102
122
|
Pry.config.should_load_plugins = false
|
103
123
|
end
|
@@ -109,14 +129,15 @@ end
|
|
109
129
|
|
110
130
|
# The default Pry command line options (before plugin options are included)
|
111
131
|
Pry::CLI.add_options do
|
112
|
-
banner
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
132
|
+
banner(
|
133
|
+
"Usage: pry [OPTIONS]\n" \
|
134
|
+
"Start a Pry session.\n" \
|
135
|
+
"See http://pryrepl.org/ for more information.\n"
|
136
|
+
)
|
137
|
+
|
118
138
|
on :e, :exec=, "A line of code to execute in context before the session starts" do |input|
|
119
|
-
exec_string
|
139
|
+
Pry.config.exec_string += "\n" if Pry.config.exec_string.length > 0
|
140
|
+
Pry.config.exec_string += input
|
120
141
|
end
|
121
142
|
|
122
143
|
on "no-pager", "Disable pager for long output" do
|
@@ -131,7 +152,7 @@ Copyright (c) 2013 John Mair (banisterfiend)
|
|
131
152
|
Pry.config.color = false
|
132
153
|
end
|
133
154
|
|
134
|
-
on :f, "Suppress loading of
|
155
|
+
on :f, "Suppress loading of pryrc" do
|
135
156
|
Pry.config.should_load_rc = false
|
136
157
|
Pry.config.should_load_local_rc = false
|
137
158
|
end
|
@@ -159,18 +180,18 @@ Copyright (c) 2013 John Mair (banisterfiend)
|
|
159
180
|
end
|
160
181
|
|
161
182
|
on "simple-prompt", "Enable simple prompt mode" do
|
162
|
-
Pry.config.prompt = Pry::
|
183
|
+
Pry.config.prompt = Pry::Prompt[:simple][:value]
|
163
184
|
end
|
164
185
|
|
165
186
|
on "noprompt", "No prompt mode" do
|
166
|
-
Pry.config.prompt = Pry::
|
187
|
+
Pry.config.prompt = Pry::Prompt[:none][:value]
|
167
188
|
end
|
168
189
|
|
169
190
|
on :r, :require=, "`require` a Ruby script at startup" do |file|
|
170
191
|
Pry.config.requires << file
|
171
192
|
end
|
172
193
|
|
173
|
-
on :I=, "Add a path to the $LOAD_PATH", :
|
194
|
+
on :I=, "Add a path to the $LOAD_PATH", as: Array, delimiter: ":" do |load_path|
|
174
195
|
load_path.map! do |path|
|
175
196
|
/\A\.\// =~ path ? path : File.expand_path(path)
|
176
197
|
end
|
@@ -192,29 +213,6 @@ Copyright (c) 2013 John Mair (banisterfiend)
|
|
192
213
|
|
193
214
|
on(:c, :context=,
|
194
215
|
"Start the session in the specified context. Equivalent to `context.pry` in a session.",
|
195
|
-
:
|
216
|
+
default: "Pry.toplevel_binding"
|
196
217
|
)
|
197
|
-
end.add_option_processor do |opts|
|
198
|
-
|
199
|
-
exit if opts.help?
|
200
|
-
|
201
|
-
# invoked via cli
|
202
|
-
Pry.cli = true
|
203
|
-
|
204
|
-
# create the actual context
|
205
|
-
if opts[:context]
|
206
|
-
Pry.initial_session_setup
|
207
|
-
context = Pry.binding_for(eval(opts[:context]))
|
208
|
-
else
|
209
|
-
context = Pry.toplevel_binding
|
210
|
-
end
|
211
|
-
|
212
|
-
if Pry::CLI.input_args.any? && Pry::CLI.input_args != ["pry"]
|
213
|
-
full_name = File.expand_path(Pry::CLI.input_args.first)
|
214
|
-
Pry.load_file_through_repl(full_name)
|
215
|
-
exit
|
216
|
-
end
|
217
|
-
|
218
|
-
# Start the session (running any code passed with -e, if there is any)
|
219
|
-
Pry.start(context, :input => StringIO.new(exec_string))
|
220
218
|
end
|
data/lib/pry/code/code_file.rb
CHANGED
@@ -17,10 +17,18 @@ class Pry
|
|
17
17
|
%w(.c .h) => :c,
|
18
18
|
%w(.rhtml) => :rhtml,
|
19
19
|
%w(.yaml .yml) => :yaml,
|
20
|
-
%w(.cpp .hpp .cc .h cxx) => :cpp,
|
21
|
-
%w(.rb .ru .irbrc .gemspec .pryrc) => :ruby,
|
20
|
+
%w(.cpp .hpp .cc .h .cxx) => :cpp,
|
21
|
+
%w(.rb .ru .irbrc .gemspec .pryrc .rake) => :ruby,
|
22
22
|
}
|
23
23
|
|
24
|
+
FILES = {
|
25
|
+
%w(Gemfile Rakefile Guardfile Capfile) => :ruby
|
26
|
+
}
|
27
|
+
|
28
|
+
# Store the current working directory. This allows show-source etc. to work if
|
29
|
+
# your process has changed directory since boot. [Issue #675]
|
30
|
+
INITIAL_PWD = Dir.pwd
|
31
|
+
|
24
32
|
# @return [Symbol] The type of code stored in this wrapper.
|
25
33
|
attr_reader :code_type
|
26
34
|
|
@@ -37,8 +45,6 @@ class Pry
|
|
37
45
|
Pry.line_buffer.drop(1)
|
38
46
|
elsif Pry::Method::Patcher.code_for(@filename)
|
39
47
|
Pry::Method::Patcher.code_for(@filename)
|
40
|
-
elsif RbxPath.is_core_path?(@filename)
|
41
|
-
File.read(RbxPath.convert_path_to_full(@filename))
|
42
48
|
else
|
43
49
|
path = abs_path
|
44
50
|
@code_type = type_from_filename(path)
|
@@ -79,6 +85,8 @@ class Pry
|
|
79
85
|
def type_from_filename(filename, default = :unknown)
|
80
86
|
_, @code_type = EXTENSIONS.find do |k, _|
|
81
87
|
k.any? { |ext| ext == File.extname(filename) }
|
88
|
+
end || FILES.find do |k, _|
|
89
|
+
k.any? { |file_name| file_name == File.basename(filename) }
|
82
90
|
end
|
83
91
|
|
84
92
|
code_type || default
|
@@ -91,13 +99,12 @@ class Pry
|
|
91
99
|
|
92
100
|
# @return [String]
|
93
101
|
def from_pry_init_pwd
|
94
|
-
File.expand_path(@filename,
|
102
|
+
File.expand_path(@filename, INITIAL_PWD)
|
95
103
|
end
|
96
104
|
|
97
105
|
# @return [String]
|
98
106
|
def from_load_path
|
99
107
|
$LOAD_PATH.map { |path| File.expand_path(@filename, path) }
|
100
108
|
end
|
101
|
-
|
102
109
|
end
|
103
110
|
end
|
data/lib/pry/code/code_range.rb
CHANGED
@@ -1,11 +1,9 @@
|
|
1
1
|
class Pry
|
2
2
|
class Code
|
3
|
-
|
4
3
|
# Represents a range of lines in a code listing.
|
5
4
|
#
|
6
5
|
# @api private
|
7
6
|
class CodeRange
|
8
|
-
|
9
7
|
# @param [Integer] start_line
|
10
8
|
# @param [Integer?] end_line
|
11
9
|
def initialize(start_line, end_line = nil)
|
@@ -23,6 +21,7 @@ class Pry
|
|
23
21
|
private
|
24
22
|
|
25
23
|
def start_line; @start_line; end
|
24
|
+
|
26
25
|
def end_line; @end_line; end
|
27
26
|
|
28
27
|
# If `end_line` is equal to `nil`, then calculate it from the first
|
@@ -48,12 +47,14 @@ class Pry
|
|
48
47
|
# @return [Integer]
|
49
48
|
def find_start_index(lines)
|
50
49
|
return start_line if start_line < 0
|
50
|
+
|
51
51
|
lines.index { |loc| loc.lineno >= start_line } || lines.length
|
52
52
|
end
|
53
53
|
|
54
54
|
# @return [Integer]
|
55
55
|
def find_end_index(lines)
|
56
56
|
return end_line if end_line < 0
|
57
|
+
|
57
58
|
(lines.index { |loc| loc.lineno > end_line } || 0) - 1
|
58
59
|
end
|
59
60
|
|
@@ -66,6 +67,5 @@ class Pry
|
|
66
67
|
@start_line = start_line.first
|
67
68
|
end
|
68
69
|
end
|
69
|
-
|
70
70
|
end
|
71
71
|
end
|
data/lib/pry/code/loc.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
class Pry
|
2
2
|
class Code
|
3
|
-
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
3
|
+
# Represents a line of code (which may, in fact, contain multiple lines if the
|
4
|
+
# entirety was eval'd as a single unit following the `edit` command).
|
5
|
+
#
|
6
|
+
# A line of code is a tuple, which consists of a line and a line number. A
|
7
|
+
# `LOC` object's state (namely, the line parameter) can be changed via
|
8
|
+
# instance methods. `Pry::Code` heavily uses this class.
|
8
9
|
#
|
9
10
|
# @api private
|
10
11
|
# @example
|
@@ -18,7 +19,6 @@ class Pry
|
|
18
19
|
# loc.indent(3)
|
19
20
|
# loc.line #=> " def example\n :example\nend"
|
20
21
|
class LOC
|
21
|
-
|
22
22
|
# @return [Array<String, Integer>]
|
23
23
|
attr_reader :tuple
|
24
24
|
|
@@ -62,7 +62,8 @@ class Pry
|
|
62
62
|
def add_line_number(max_width = 0, color = false)
|
63
63
|
padded = lineno.to_s.rjust(max_width)
|
64
64
|
colorized_lineno = color ? Pry::Helpers::BaseHelpers.colorize_code(padded) : padded
|
65
|
-
|
65
|
+
properly_padded_line = handle_multiline_entries_from_edit_command(line, max_width)
|
66
|
+
tuple[0] = "#{ colorized_lineno }: #{ properly_padded_line }"
|
66
67
|
end
|
67
68
|
|
68
69
|
# Prepends a marker "=>" or an empty marker to the +line+.
|
@@ -86,7 +87,12 @@ class Pry
|
|
86
87
|
def indent(distance)
|
87
88
|
tuple[0] = "#{ ' ' * distance }#{ line }"
|
88
89
|
end
|
89
|
-
end
|
90
90
|
|
91
|
+
def handle_multiline_entries_from_edit_command(line, max_width)
|
92
|
+
line.split("\n").map.with_index do |inner_line, i|
|
93
|
+
i.zero? ? inner_line : "#{' ' * (max_width + 2)}#{inner_line}"
|
94
|
+
end.join("\n")
|
95
|
+
end
|
96
|
+
end
|
91
97
|
end
|
92
98
|
end
|
data/lib/pry/code.rb
CHANGED
@@ -66,7 +66,7 @@ class Pry
|
|
66
66
|
# @param [Integer, nil] start_line The line number to start on, or nil to
|
67
67
|
# use the method's original line numbers.
|
68
68
|
# @return [Code]
|
69
|
-
def from_module(mod, candidate_rank = 0, start_line=nil)
|
69
|
+
def from_module(mod, candidate_rank = 0, start_line = nil)
|
70
70
|
candidate = Pry::WrappedModule(mod).candidate(candidate_rank)
|
71
71
|
start_line ||= candidate.line
|
72
72
|
new(candidate.source, start_line, :ruby)
|
@@ -91,6 +91,8 @@ class Pry
|
|
91
91
|
@lines = lines.each_with_index.map { |line, lineno|
|
92
92
|
LOC.new(line, lineno + start_line.to_i) }
|
93
93
|
@code_type = code_type
|
94
|
+
|
95
|
+
@with_marker = @with_indentation = @with_line_numbers = nil
|
94
96
|
end
|
95
97
|
|
96
98
|
# Append the given line. +lineno+ is one more than the last existing
|
@@ -199,6 +201,7 @@ class Pry
|
|
199
201
|
# @return [Code]
|
200
202
|
def grep(pattern)
|
201
203
|
return self unless pattern
|
204
|
+
|
202
205
|
pattern = Regexp.new(pattern)
|
203
206
|
|
204
207
|
select do |loc|
|
@@ -263,7 +266,7 @@ class Pry
|
|
263
266
|
|
264
267
|
# Writes a formatted representation (based on the configuration of the
|
265
268
|
# object) to the given output, which must respond to `#<<`.
|
266
|
-
def print_to_output(output, color=false)
|
269
|
+
def print_to_output(output, color = false)
|
267
270
|
@lines.each do |loc|
|
268
271
|
loc = loc.dup
|
269
272
|
loc.colorize(@code_type) if color
|
@@ -289,15 +292,14 @@ class Pry
|
|
289
292
|
# @param [Integer] line_number (1-based)
|
290
293
|
# @return [String] the code.
|
291
294
|
def expression_at(line_number, consume = 0)
|
292
|
-
self.class.expression_at(raw, line_number, :
|
295
|
+
self.class.expression_at(raw, line_number, consume: consume)
|
293
296
|
end
|
294
297
|
|
295
298
|
# Get the (approximate) Module.nesting at the give line number.
|
296
299
|
#
|
297
300
|
# @param [Integer] line_number line number starting from 1
|
298
|
-
# @param [Module] top_module the module in which this code exists
|
299
301
|
# @return [Array<Module>] a list of open modules.
|
300
|
-
def nesting_at(line_number
|
302
|
+
def nesting_at(line_number)
|
301
303
|
Pry::Indent.nesting_at(raw, line_number)
|
302
304
|
end
|
303
305
|
|
@@ -335,6 +337,11 @@ class Pry
|
|
335
337
|
end
|
336
338
|
undef =~
|
337
339
|
|
340
|
+
# Check whether String responds to missing methods.
|
341
|
+
def respond_to_missing?(name, include_all = false)
|
342
|
+
''.respond_to?(name, include_all)
|
343
|
+
end
|
344
|
+
|
338
345
|
protected
|
339
346
|
|
340
347
|
# An abstraction of the `dup.instance_eval` pattern used throughout this
|
data/lib/pry/code_object.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
class Pry
|
2
|
-
|
3
2
|
# This class is responsible for taking a string (identifying a
|
4
3
|
# command/class/method/etc) and returning the relevant type of object.
|
5
4
|
# For example, if the user looks up "show-source" then a
|
@@ -37,12 +36,34 @@ class Pry
|
|
37
36
|
def command?
|
38
37
|
is_a?(Module) && self <= Pry::Command
|
39
38
|
end
|
39
|
+
|
40
|
+
# @return [Boolean] `true` if this module was defined by means of the C API,
|
41
|
+
# `false` if it's a Ruby module.
|
42
|
+
# @note If a module defined by C was extended with a lot of methods written
|
43
|
+
# in Ruby, this method would fail.
|
44
|
+
def c_module?
|
45
|
+
if is_a?(WrappedModule)
|
46
|
+
|
47
|
+
method_locations = wrapped.methods(false).map do |m|
|
48
|
+
wrapped.method(m).source_location
|
49
|
+
end
|
50
|
+
|
51
|
+
method_locations.concat(wrapped.instance_methods(false).map do |m|
|
52
|
+
wrapped.instance_method(m).source_location
|
53
|
+
end)
|
54
|
+
|
55
|
+
c_methods = method_locations.grep(nil).count
|
56
|
+
ruby_methods = method_locations.count - c_methods
|
57
|
+
|
58
|
+
c_methods > ruby_methods
|
59
|
+
end
|
60
|
+
end
|
40
61
|
end
|
41
62
|
|
42
63
|
include Pry::Helpers::CommandHelpers
|
43
64
|
|
44
65
|
class << self
|
45
|
-
def lookup(str, _pry_, options={})
|
66
|
+
def lookup(str, _pry_, options = {})
|
46
67
|
co = new(str, _pry_, options)
|
47
68
|
|
48
69
|
co.default_lookup || co.method_or_class_lookup ||
|
@@ -55,9 +76,9 @@ class Pry
|
|
55
76
|
attr_accessor :_pry_
|
56
77
|
attr_accessor :super_level
|
57
78
|
|
58
|
-
def initialize(str, _pry_, options={})
|
79
|
+
def initialize(str, _pry_, options = {})
|
59
80
|
options = {
|
60
|
-
:
|
81
|
+
super: 0,
|
61
82
|
}.merge!(options)
|
62
83
|
|
63
84
|
@str = str
|
@@ -147,6 +168,8 @@ class Pry
|
|
147
168
|
# @return [Boolean]
|
148
169
|
def safe_to_evaluate?(str)
|
149
170
|
return true if str.strip == "self"
|
171
|
+
return false if str =~ /%/
|
172
|
+
|
150
173
|
kind = target.eval("defined?(#{str})")
|
151
174
|
kind =~ /variable|constant/
|
152
175
|
end
|
data/lib/pry/color_printer.rb
CHANGED
@@ -12,8 +12,8 @@ class Pry
|
|
12
12
|
|
13
13
|
CodeRay::Encoders::Terminal::TOKEN_COLORS[:comment][:self] = "\e[1;34m"
|
14
14
|
|
15
|
-
def self.pp(obj, out = $>, width = 79)
|
16
|
-
q = ColorPrinter.new(out, width)
|
15
|
+
def self.pp(obj, out = $>, width = 79, newline = "\n")
|
16
|
+
q = ColorPrinter.new(out, width, newline)
|
17
17
|
q.guard_inspect_key { q.pp obj }
|
18
18
|
q.flush
|
19
19
|
out << "\n"
|
@@ -31,17 +31,27 @@ class Pry
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def pp(obj)
|
34
|
-
|
34
|
+
if String === obj
|
35
|
+
# Avoid calling Ruby 2.4+ String#pretty_print that prints multiline
|
36
|
+
# Strings prettier
|
37
|
+
text(obj.inspect)
|
38
|
+
else
|
39
|
+
super
|
40
|
+
end
|
35
41
|
rescue => e
|
36
42
|
raise if e.is_a? Pry::Pager::StopPaging
|
37
43
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
44
|
+
begin
|
45
|
+
str = obj.inspect
|
46
|
+
rescue Exception
|
47
|
+
# Read the class name off of the singleton class to provide a default
|
48
|
+
# inspect.
|
49
|
+
singleton = class << obj; self; end
|
50
|
+
ancestors = Pry::Method.safe_send(singleton, :ancestors)
|
51
|
+
klass = ancestors.reject { |k| k == singleton }.first
|
52
|
+
obj_id = obj.__id__.to_s(16) rescue 0
|
53
|
+
str = "#<#{klass}:0x#{obj_id}>"
|
54
|
+
end
|
45
55
|
|
46
56
|
text highlight_object_literal(str)
|
47
57
|
end
|