pry 0.12.1-java → 0.14.1-java
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 +166 -1
- data/LICENSE +1 -1
- data/README.md +331 -269
- data/bin/pry +5 -0
- data/lib/pry.rb +132 -118
- data/lib/pry/basic_object.rb +8 -4
- data/lib/pry/block_command.rb +22 -0
- data/lib/pry/class_command.rb +194 -0
- data/lib/pry/cli.rb +43 -54
- data/lib/pry/code.rb +40 -28
- data/lib/pry/code/code_file.rb +28 -24
- data/lib/pry/code/code_range.rb +4 -2
- data/lib/pry/code/loc.rb +15 -8
- data/lib/pry/code_object.rb +40 -38
- data/lib/pry/color_printer.rb +47 -46
- data/lib/pry/command.rb +162 -360
- data/lib/pry/command_set.rb +76 -73
- data/lib/pry/command_state.rb +31 -0
- data/lib/pry/commands/amend_line.rb +86 -81
- data/lib/pry/commands/bang.rb +18 -14
- data/lib/pry/commands/bang_pry.rb +15 -11
- data/lib/pry/commands/cat.rb +61 -54
- data/lib/pry/commands/cat/abstract_formatter.rb +23 -18
- data/lib/pry/commands/cat/exception_formatter.rb +71 -60
- data/lib/pry/commands/cat/file_formatter.rb +55 -49
- data/lib/pry/commands/cat/input_expression_formatter.rb +35 -30
- data/lib/pry/commands/cd.rb +40 -35
- data/lib/pry/commands/change_inspector.rb +29 -22
- data/lib/pry/commands/change_prompt.rb +44 -39
- data/lib/pry/commands/clear_screen.rb +16 -10
- data/lib/pry/commands/code_collector.rb +148 -133
- data/lib/pry/commands/disable_pry.rb +23 -19
- data/lib/pry/commands/easter_eggs.rb +19 -30
- data/lib/pry/commands/edit.rb +184 -161
- data/lib/pry/commands/edit/exception_patcher.rb +21 -17
- data/lib/pry/commands/edit/file_and_line_locator.rb +34 -23
- data/lib/pry/commands/exit.rb +39 -35
- data/lib/pry/commands/exit_all.rb +24 -20
- data/lib/pry/commands/exit_program.rb +20 -16
- data/lib/pry/commands/find_method.rb +168 -160
- data/lib/pry/commands/fix_indent.rb +16 -12
- data/lib/pry/commands/help.rb +140 -133
- data/lib/pry/commands/hist.rb +151 -150
- data/lib/pry/commands/import_set.rb +20 -16
- data/lib/pry/commands/jump_to.rb +25 -21
- data/lib/pry/commands/list_inspectors.rb +35 -28
- data/lib/pry/commands/ls.rb +124 -102
- data/lib/pry/commands/ls/constants.rb +59 -42
- data/lib/pry/commands/ls/formatter.rb +50 -46
- data/lib/pry/commands/ls/globals.rb +38 -34
- data/lib/pry/commands/ls/grep.rb +17 -13
- data/lib/pry/commands/ls/instance_vars.rb +29 -27
- data/lib/pry/commands/ls/interrogatable.rb +18 -12
- data/lib/pry/commands/ls/jruby_hacks.rb +47 -41
- data/lib/pry/commands/ls/local_names.rb +26 -22
- data/lib/pry/commands/ls/local_vars.rb +38 -28
- data/lib/pry/commands/ls/ls_entity.rb +47 -51
- data/lib/pry/commands/ls/methods.rb +44 -43
- data/lib/pry/commands/ls/methods_helper.rb +46 -42
- data/lib/pry/commands/ls/self_methods.rb +23 -22
- data/lib/pry/commands/nesting.rb +21 -17
- data/lib/pry/commands/play.rb +93 -82
- data/lib/pry/commands/pry_backtrace.rb +22 -17
- data/lib/pry/commands/pry_version.rb +15 -11
- data/lib/pry/commands/raise_up.rb +27 -22
- data/lib/pry/commands/reload_code.rb +60 -48
- data/lib/pry/commands/reset.rb +16 -12
- data/lib/pry/commands/ri.rb +55 -45
- data/lib/pry/commands/save_file.rb +45 -43
- data/lib/pry/commands/shell_command.rb +51 -51
- data/lib/pry/commands/shell_mode.rb +21 -17
- data/lib/pry/commands/show_doc.rb +80 -68
- data/lib/pry/commands/show_info.rb +189 -171
- data/lib/pry/commands/show_input.rb +16 -11
- data/lib/pry/commands/show_source.rb +110 -45
- data/lib/pry/commands/stat.rb +35 -31
- data/lib/pry/commands/switch_to.rb +21 -15
- data/lib/pry/commands/toggle_color.rb +20 -16
- data/lib/pry/commands/watch_expression.rb +89 -86
- data/lib/pry/commands/watch_expression/expression.rb +32 -27
- data/lib/pry/commands/whereami.rb +156 -148
- data/lib/pry/commands/wtf.rb +75 -50
- data/lib/pry/config.rb +307 -25
- 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/control_d_handler.rb +28 -0
- data/lib/pry/core_extensions.rb +9 -7
- data/lib/pry/editor.rb +48 -21
- data/lib/pry/env.rb +18 -0
- data/lib/pry/exception_handler.rb +43 -0
- data/lib/pry/exceptions.rb +13 -16
- data/lib/pry/forwardable.rb +5 -1
- data/lib/pry/helpers.rb +2 -0
- data/lib/pry/helpers/base_helpers.rb +58 -59
- data/lib/pry/helpers/command_helpers.rb +50 -61
- data/lib/pry/helpers/documentation_helpers.rb +21 -13
- data/lib/pry/helpers/options_helpers.rb +14 -7
- data/lib/pry/helpers/platform.rb +7 -5
- data/lib/pry/helpers/table.rb +33 -26
- data/lib/pry/helpers/text.rb +22 -19
- data/lib/pry/history.rb +48 -56
- data/lib/pry/hooks.rb +17 -8
- data/lib/pry/indent.rb +54 -50
- data/lib/pry/input_completer.rb +248 -230
- data/lib/pry/input_lock.rb +8 -9
- data/lib/pry/inspector.rb +36 -24
- data/lib/pry/last_exception.rb +45 -45
- data/lib/pry/method.rb +141 -85
- data/lib/pry/method/disowned.rb +16 -4
- data/lib/pry/method/patcher.rb +12 -3
- data/lib/pry/method/weird_method_locator.rb +68 -44
- data/lib/pry/object_path.rb +33 -25
- data/lib/pry/output.rb +121 -35
- data/lib/pry/pager.rb +41 -42
- data/lib/pry/prompt.rb +108 -46
- data/lib/pry/pry_class.rb +61 -103
- data/lib/pry/pry_instance.rb +217 -185
- data/lib/pry/repl.rb +18 -22
- data/lib/pry/repl_file_loader.rb +27 -21
- data/lib/pry/ring.rb +11 -6
- data/lib/pry/slop.rb +574 -563
- data/lib/pry/slop/commands.rb +164 -169
- data/lib/pry/slop/option.rb +172 -168
- data/lib/pry/syntax_highlighter.rb +26 -0
- data/lib/pry/system_command_handler.rb +17 -0
- data/lib/pry/testable.rb +59 -61
- data/lib/pry/testable/evalable.rb +21 -12
- data/lib/pry/testable/mockable.rb +18 -10
- data/lib/pry/testable/pry_tester.rb +71 -56
- data/lib/pry/testable/utility.rb +29 -21
- data/lib/pry/testable/variables.rb +49 -43
- data/lib/pry/version.rb +3 -1
- data/lib/pry/warning.rb +27 -0
- data/lib/pry/wrapped_module.rb +51 -42
- data/lib/pry/wrapped_module/candidate.rb +21 -14
- metadata +34 -33
- data/lib/pry/commands.rb +0 -6
- 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 -32
- data/lib/pry/commands/gem_list.rb +0 -33
- data/lib/pry/commands/gem_open.rb +0 -29
- data/lib/pry/commands/gem_readme.rb +0 -25
- data/lib/pry/commands/gem_search.rb +0 -40
- data/lib/pry/commands/gem_stats.rb +0 -83
- data/lib/pry/commands/gist.rb +0 -102
- data/lib/pry/commands/install_command.rb +0 -54
- data/lib/pry/config/behavior.rb +0 -255
- data/lib/pry/config/convenience.rb +0 -28
- data/lib/pry/config/default.rb +0 -159
- data/lib/pry/config/memoization.rb +0 -48
- data/lib/pry/plugins.rb +0 -122
- data/lib/pry/rubygem.rb +0 -84
- data/lib/pry/terminal.rb +0 -91
data/lib/pry/pry_instance.rb
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
#
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'method_source'
|
|
4
|
+
require 'ostruct'
|
|
5
|
+
|
|
2
6
|
##
|
|
3
7
|
# Pry is a powerful alternative to the standard IRB shell for Ruby. It
|
|
4
8
|
# features syntax highlighting, a flexible plugin architecture, runtime
|
|
@@ -23,6 +27,8 @@
|
|
|
23
27
|
|
|
24
28
|
# rubocop:disable Metrics/ClassLength
|
|
25
29
|
class Pry
|
|
30
|
+
extend Pry::Forwardable
|
|
31
|
+
|
|
26
32
|
attr_accessor :binding_stack
|
|
27
33
|
attr_accessor :custom_completions
|
|
28
34
|
attr_accessor :eval_string
|
|
@@ -33,7 +39,6 @@ class Pry
|
|
|
33
39
|
attr_accessor :last_dir
|
|
34
40
|
|
|
35
41
|
attr_reader :last_exception
|
|
36
|
-
attr_reader :command_state
|
|
37
42
|
attr_reader :exit_value
|
|
38
43
|
|
|
39
44
|
# @since v0.12.0
|
|
@@ -44,8 +49,13 @@ class Pry
|
|
|
44
49
|
|
|
45
50
|
attr_reader :config
|
|
46
51
|
|
|
47
|
-
|
|
48
|
-
|
|
52
|
+
def_delegators(
|
|
53
|
+
:@config, :input, :input=, :output, :output=, :commands,
|
|
54
|
+
:commands=, :print, :print=, :exception_handler, :exception_handler=,
|
|
55
|
+
:hooks, :hooks=, :color, :color=, :pager, :pager=, :editor, :editor=,
|
|
56
|
+
:memory_size, :memory_size=, :extra_sticky_locals, :extra_sticky_locals=
|
|
57
|
+
)
|
|
58
|
+
|
|
49
59
|
EMPTY_COMPLETIONS = [].freeze
|
|
50
60
|
|
|
51
61
|
# Create a new {Pry} instance.
|
|
@@ -58,7 +68,7 @@ class Pry
|
|
|
58
68
|
# The object to use for commands.
|
|
59
69
|
# @option options [Hash] :hooks
|
|
60
70
|
# The defined hook Procs.
|
|
61
|
-
# @option options [
|
|
71
|
+
# @option options [Pry::Prompt] :prompt
|
|
62
72
|
# The array of Procs to use for prompts.
|
|
63
73
|
# @option options [Proc] :print
|
|
64
74
|
# The Proc to use for printing return values.
|
|
@@ -70,13 +80,11 @@ class Pry
|
|
|
70
80
|
# The initial context for this session.
|
|
71
81
|
def initialize(options = {})
|
|
72
82
|
@binding_stack = []
|
|
73
|
-
@indent = Pry::Indent.new
|
|
74
|
-
@
|
|
75
|
-
@eval_string = ""
|
|
83
|
+
@indent = Pry::Indent.new(self)
|
|
84
|
+
@eval_string = ''.dup
|
|
76
85
|
@backtrace = options.delete(:backtrace) || caller
|
|
77
86
|
target = options.delete(:target)
|
|
78
|
-
@config =
|
|
79
|
-
config.merge!(options)
|
|
87
|
+
@config = self.class.config.merge(options)
|
|
80
88
|
push_prompt(config.prompt)
|
|
81
89
|
@input_ring = Pry::Ring.new(config.memory_size)
|
|
82
90
|
@output_ring = Pry::Ring.new(config.memory_size)
|
|
@@ -85,14 +93,18 @@ class Pry
|
|
|
85
93
|
@input_ring << nil
|
|
86
94
|
push_initial_binding(target)
|
|
87
95
|
exec_hook(:when_started, target, options, self)
|
|
96
|
+
@prompt_warn = false
|
|
88
97
|
end
|
|
89
98
|
|
|
90
99
|
# This is the prompt at the top of the prompt stack.
|
|
91
|
-
# @return [
|
|
100
|
+
# @return [Pry::Prompt] the current prompt
|
|
92
101
|
def prompt
|
|
93
102
|
prompt_stack.last
|
|
94
103
|
end
|
|
95
104
|
|
|
105
|
+
# Sets the Pry prompt.
|
|
106
|
+
# @param [Pry::Prompt] new_prompt
|
|
107
|
+
# @return [void]
|
|
96
108
|
def prompt=(new_prompt)
|
|
97
109
|
if prompt_stack.empty?
|
|
98
110
|
push_prompt new_prompt
|
|
@@ -135,7 +147,11 @@ class Pry
|
|
|
135
147
|
|
|
136
148
|
Pry.critical_section do
|
|
137
149
|
completer = config.completer.new(config.input, self)
|
|
138
|
-
completer.call
|
|
150
|
+
completer.call(
|
|
151
|
+
str,
|
|
152
|
+
target: current_binding,
|
|
153
|
+
custom_completions: custom_completions.call.push(*sticky_locals.keys)
|
|
154
|
+
)
|
|
139
155
|
end
|
|
140
156
|
end
|
|
141
157
|
|
|
@@ -148,20 +164,20 @@ class Pry
|
|
|
148
164
|
# @param [Object] value
|
|
149
165
|
# The value to set the local to.
|
|
150
166
|
#
|
|
151
|
-
# @param [Binding]
|
|
167
|
+
# @param [Binding] binding
|
|
152
168
|
# The binding to set the local on.
|
|
153
169
|
#
|
|
154
170
|
# @return [Object]
|
|
155
171
|
# The value the local was set to.
|
|
156
172
|
#
|
|
157
|
-
def inject_local(name, value,
|
|
158
|
-
value = Proc
|
|
159
|
-
if
|
|
160
|
-
|
|
173
|
+
def inject_local(name, value, binding)
|
|
174
|
+
value = value.is_a?(Proc) ? value.call : value
|
|
175
|
+
if binding.respond_to?(:local_variable_set)
|
|
176
|
+
binding.local_variable_set name, value
|
|
161
177
|
else # < 2.1
|
|
162
178
|
begin
|
|
163
179
|
Pry.current[:pry_local] = value
|
|
164
|
-
|
|
180
|
+
binding.eval "#{name} = ::Pry.current[:pry_local]"
|
|
165
181
|
ensure
|
|
166
182
|
Pry.current[:pry_local] = nil
|
|
167
183
|
end
|
|
@@ -198,9 +214,10 @@ class Pry
|
|
|
198
214
|
end
|
|
199
215
|
|
|
200
216
|
def sticky_locals
|
|
201
|
-
{
|
|
217
|
+
{
|
|
218
|
+
_in_: input_ring,
|
|
202
219
|
_out_: output_ring,
|
|
203
|
-
|
|
220
|
+
pry_instance: self,
|
|
204
221
|
_ex_: last_exception && last_exception.wrapped_exception,
|
|
205
222
|
_file_: last_file,
|
|
206
223
|
_dir_: last_dir,
|
|
@@ -212,7 +229,7 @@ class Pry
|
|
|
212
229
|
# Reset the current eval string. If the user has entered part of a multiline
|
|
213
230
|
# expression, this discards that input.
|
|
214
231
|
def reset_eval_string
|
|
215
|
-
@eval_string =
|
|
232
|
+
@eval_string = ''.dup
|
|
216
233
|
end
|
|
217
234
|
|
|
218
235
|
# Pass a line of input to Pry.
|
|
@@ -243,7 +260,7 @@ class Pry
|
|
|
243
260
|
exit_value = catch(:breakout) do
|
|
244
261
|
handle_line(line, options)
|
|
245
262
|
# We use 'return !@stopped' here instead of 'return true' so that if
|
|
246
|
-
# handle_line has stopped this pry instance (e.g. by opening
|
|
263
|
+
# handle_line has stopped this pry instance (e.g. by opening pry_instance.repl and
|
|
247
264
|
# then popping all the bindings) we still exit immediately.
|
|
248
265
|
return !@stopped
|
|
249
266
|
end
|
|
@@ -256,94 +273,10 @@ class Pry
|
|
|
256
273
|
# TODO: make this configurable?
|
|
257
274
|
raise exception if exception
|
|
258
275
|
|
|
259
|
-
|
|
276
|
+
false
|
|
260
277
|
end
|
|
261
278
|
|
|
262
|
-
|
|
263
|
-
if line.nil?
|
|
264
|
-
config.control_d_handler.call(@eval_string, self)
|
|
265
|
-
return
|
|
266
|
-
end
|
|
267
|
-
|
|
268
|
-
ensure_correct_encoding!(line)
|
|
269
|
-
Pry.history << line unless options[:generated]
|
|
270
|
-
|
|
271
|
-
@suppress_output = false
|
|
272
|
-
inject_sticky_locals!
|
|
273
|
-
begin
|
|
274
|
-
if !process_command_safely(line)
|
|
275
|
-
@eval_string << "#{line.chomp}\n" if !line.empty? || !@eval_string.empty?
|
|
276
|
-
end
|
|
277
|
-
rescue RescuableException => e
|
|
278
|
-
self.last_exception = e
|
|
279
|
-
result = e
|
|
280
|
-
|
|
281
|
-
Pry.critical_section do
|
|
282
|
-
show_result(result)
|
|
283
|
-
end
|
|
284
|
-
return
|
|
285
|
-
end
|
|
286
|
-
|
|
287
|
-
# This hook is supposed to be executed after each line of ruby code
|
|
288
|
-
# has been read (regardless of whether eval_string is yet a complete expression)
|
|
289
|
-
exec_hook :after_read, eval_string, self
|
|
290
|
-
|
|
291
|
-
begin
|
|
292
|
-
complete_expr = Pry::Code.complete_expression?(@eval_string)
|
|
293
|
-
rescue SyntaxError => e
|
|
294
|
-
output.puts "SyntaxError: #{e.message.sub(/.*syntax error, */m, '')}"
|
|
295
|
-
reset_eval_string
|
|
296
|
-
end
|
|
297
|
-
|
|
298
|
-
if complete_expr
|
|
299
|
-
if @eval_string =~ /;\Z/ || @eval_string.empty? || @eval_string =~ /\A *#.*\n\z/
|
|
300
|
-
@suppress_output = true
|
|
301
|
-
end
|
|
302
|
-
|
|
303
|
-
# A bug in jruby makes java.lang.Exception not rescued by
|
|
304
|
-
# `rescue Pry::RescuableException` clause.
|
|
305
|
-
#
|
|
306
|
-
# * https://github.com/pry/pry/issues/854
|
|
307
|
-
# * https://jira.codehaus.org/browse/JRUBY-7100
|
|
308
|
-
#
|
|
309
|
-
# Until that gets fixed upstream, treat java.lang.Exception
|
|
310
|
-
# as an additional exception to be rescued explicitly.
|
|
311
|
-
#
|
|
312
|
-
# This workaround has a side effect: java exceptions specified
|
|
313
|
-
# in `Pry.config.exception_whitelist` are ignored.
|
|
314
|
-
jruby_exceptions = []
|
|
315
|
-
if Helpers::Platform.jruby?
|
|
316
|
-
jruby_exceptions << Java::JavaLang::Exception
|
|
317
|
-
end
|
|
318
|
-
|
|
319
|
-
begin
|
|
320
|
-
# Reset eval string, in case we're evaluating Ruby that does something
|
|
321
|
-
# like open a nested REPL on this instance.
|
|
322
|
-
eval_string = @eval_string
|
|
323
|
-
reset_eval_string
|
|
324
|
-
|
|
325
|
-
result = evaluate_ruby(eval_string)
|
|
326
|
-
rescue RescuableException, *jruby_exceptions => e
|
|
327
|
-
# Eliminate following warning:
|
|
328
|
-
# warning: singleton on non-persistent Java type X
|
|
329
|
-
# (http://wiki.jruby.org/Persistence)
|
|
330
|
-
if Helpers::Platform.jruby? && e.class.respond_to?('__persistent__')
|
|
331
|
-
e.class.__persistent__ = true
|
|
332
|
-
end
|
|
333
|
-
self.last_exception = e
|
|
334
|
-
result = e
|
|
335
|
-
end
|
|
336
|
-
|
|
337
|
-
Pry.critical_section do
|
|
338
|
-
show_result(result)
|
|
339
|
-
end
|
|
340
|
-
end
|
|
341
|
-
|
|
342
|
-
throw(:breakout) if current_binding.nil?
|
|
343
|
-
end
|
|
344
|
-
private :handle_line
|
|
345
|
-
|
|
346
|
-
# Potentially deprecated — Use `Pry::REPL.new(pry, :target => target).start`
|
|
279
|
+
# Potentially deprecated. Use `Pry::REPL.new(pry, :target => target).start`
|
|
347
280
|
# (If nested sessions are going to exist, this method is fine, but a goal is
|
|
348
281
|
# to come up with an alternative to nested sessions altogether.)
|
|
349
282
|
def repl(target = nil)
|
|
@@ -367,8 +300,6 @@ class Pry
|
|
|
367
300
|
exception_handler.call(output, result, self)
|
|
368
301
|
elsif should_print?
|
|
369
302
|
print.call(output, result, self)
|
|
370
|
-
else
|
|
371
|
-
# nothin'
|
|
372
303
|
end
|
|
373
304
|
rescue RescuableException => e
|
|
374
305
|
# Being uber-paranoid here, given that this exception arose because we couldn't
|
|
@@ -376,7 +307,7 @@ class Pry
|
|
|
376
307
|
# the exception either.
|
|
377
308
|
begin
|
|
378
309
|
output.puts "(pry) output error: #{e.inspect}\n#{e.backtrace.join("\n")}"
|
|
379
|
-
rescue RescuableException
|
|
310
|
+
rescue RescuableException
|
|
380
311
|
if last_result_is_exception?
|
|
381
312
|
output.puts "(pry) output error: failed to show exception"
|
|
382
313
|
else
|
|
@@ -387,16 +318,6 @@ class Pry
|
|
|
387
318
|
output.flush if output.respond_to?(:flush)
|
|
388
319
|
end
|
|
389
320
|
|
|
390
|
-
# Force `eval_string` into the encoding of `val`. [Issue #284]
|
|
391
|
-
def ensure_correct_encoding!(val)
|
|
392
|
-
if @eval_string.empty? &&
|
|
393
|
-
val.respond_to?(:encoding) &&
|
|
394
|
-
val.encoding != @eval_string.encoding
|
|
395
|
-
@eval_string.force_encoding(val.encoding)
|
|
396
|
-
end
|
|
397
|
-
end
|
|
398
|
-
private :ensure_correct_encoding!
|
|
399
|
-
|
|
400
321
|
# If the given line is a valid command, process it in the context of the
|
|
401
322
|
# current `eval_string` and binding.
|
|
402
323
|
# @param [String] val The line to process.
|
|
@@ -404,7 +325,8 @@ class Pry
|
|
|
404
325
|
def process_command(val)
|
|
405
326
|
val = val.lstrip if /^\s\S/ !~ val
|
|
406
327
|
val = val.chomp
|
|
407
|
-
result = commands.process_line(
|
|
328
|
+
result = commands.process_line(
|
|
329
|
+
val,
|
|
408
330
|
target: current_binding,
|
|
409
331
|
output: output,
|
|
410
332
|
eval_string: @eval_string,
|
|
@@ -419,11 +341,11 @@ class Pry
|
|
|
419
341
|
# command was matched and invoked then `result.command?` returns true,
|
|
420
342
|
# otherwise it returns false.
|
|
421
343
|
if result.command?
|
|
422
|
-
|
|
344
|
+
unless result.void_command?
|
|
423
345
|
# the command that was invoked was non-void (had a return value) and so we make
|
|
424
346
|
# the value of the current expression equal to the return value
|
|
425
347
|
# of the command.
|
|
426
|
-
@eval_string
|
|
348
|
+
@eval_string = "::Pry.current[:pry_cmd_result].retval\n"
|
|
427
349
|
end
|
|
428
350
|
true
|
|
429
351
|
else
|
|
@@ -437,7 +359,9 @@ class Pry
|
|
|
437
359
|
# @return [Boolean] `true` if `val` is a command, `false` otherwise
|
|
438
360
|
def process_command_safely(val)
|
|
439
361
|
process_command(val)
|
|
440
|
-
rescue CommandError,
|
|
362
|
+
rescue CommandError,
|
|
363
|
+
Pry::Slop::InvalidOptionError,
|
|
364
|
+
MethodSource::SourceNotFoundError => e
|
|
441
365
|
Pry.last_internal_error = e
|
|
442
366
|
output.puts "Error: #{e.message}"
|
|
443
367
|
true
|
|
@@ -449,7 +373,8 @@ class Pry
|
|
|
449
373
|
# @example
|
|
450
374
|
# pry_instance.run_command("ls -m")
|
|
451
375
|
def run_command(val)
|
|
452
|
-
commands.process_line(
|
|
376
|
+
commands.process_line(
|
|
377
|
+
val,
|
|
453
378
|
eval_string: @eval_string,
|
|
454
379
|
target: current_binding,
|
|
455
380
|
pry_instance: self,
|
|
@@ -471,8 +396,8 @@ class Pry
|
|
|
471
396
|
hooks.exec_hook(name, *args, &block).tap do
|
|
472
397
|
hooks.errors[e_before..-1].each do |e|
|
|
473
398
|
output.puts "#{name} hook failed: #{e.class}: #{e.message}"
|
|
474
|
-
output.puts
|
|
475
|
-
output.puts "(see
|
|
399
|
+
output.puts e.backtrace.first.to_s
|
|
400
|
+
output.puts "(see pry_instance.hooks.errors to debug)"
|
|
476
401
|
end
|
|
477
402
|
end
|
|
478
403
|
end
|
|
@@ -488,15 +413,11 @@ class Pry
|
|
|
488
413
|
self.last_result = result unless code =~ /\A\s*\z/
|
|
489
414
|
end
|
|
490
415
|
|
|
491
|
-
#
|
|
492
416
|
# Set the last exception for a session.
|
|
493
|
-
#
|
|
494
|
-
|
|
495
|
-
# the last exception.
|
|
496
|
-
#
|
|
497
|
-
def last_exception=(e)
|
|
498
|
-
last_exception = Pry::LastException.new(e)
|
|
417
|
+
# @param [Exception] exception The last exception.
|
|
418
|
+
def last_exception=(exception)
|
|
499
419
|
@last_result_is_exception = true
|
|
420
|
+
last_exception = Pry::LastException.new(exception)
|
|
500
421
|
@output_ring << last_exception
|
|
501
422
|
@last_exception = last_exception
|
|
502
423
|
end
|
|
@@ -507,10 +428,10 @@ class Pry
|
|
|
507
428
|
def update_input_history(code)
|
|
508
429
|
# Always push to the @input_ring as the @output_ring is always pushed to.
|
|
509
430
|
@input_ring << code
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
431
|
+
return unless code
|
|
432
|
+
|
|
433
|
+
Pry.line_buffer.push(*code.each_line)
|
|
434
|
+
Pry.current_line += code.lines.count
|
|
514
435
|
end
|
|
515
436
|
|
|
516
437
|
# @return [Boolean] True if the last result is an exception that was raised,
|
|
@@ -533,21 +454,37 @@ class Pry
|
|
|
533
454
|
object = current_binding.eval('self')
|
|
534
455
|
open_token = @indent.open_delimiters.last || @indent.stack.last
|
|
535
456
|
|
|
536
|
-
c =
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
457
|
+
c = OpenStruct.new(
|
|
458
|
+
object: object,
|
|
459
|
+
nesting_level: binding_stack.size - 1,
|
|
460
|
+
open_token: open_token,
|
|
461
|
+
session_line: Pry.history.session_line_count + 1,
|
|
462
|
+
history_line: Pry.history.history_line_count + 1,
|
|
463
|
+
expr_number: input_ring.count,
|
|
464
|
+
pry_instance: self,
|
|
465
|
+
binding_stack: binding_stack,
|
|
466
|
+
input_ring: input_ring,
|
|
467
|
+
eval_string: @eval_string,
|
|
468
|
+
cont: !@eval_string.empty?
|
|
469
|
+
)
|
|
549
470
|
|
|
550
471
|
Pry.critical_section do
|
|
472
|
+
# If input buffer is empty, then use normal prompt. Otherwise use the wait
|
|
473
|
+
# prompt (indicating multi-line expression).
|
|
474
|
+
if prompt.is_a?(Pry::Prompt)
|
|
475
|
+
prompt_proc = eval_string.empty? ? prompt.wait_proc : prompt.incomplete_proc
|
|
476
|
+
return prompt_proc.call(c.object, c.nesting_level, c.pry_instance)
|
|
477
|
+
end
|
|
478
|
+
|
|
479
|
+
unless @prompt_warn
|
|
480
|
+
@prompt_warn = true
|
|
481
|
+
Kernel.warn(
|
|
482
|
+
"warning: setting prompt with help of " \
|
|
483
|
+
"`Pry.config.prompt = [proc {}, proc {}]` is deprecated. " \
|
|
484
|
+
"Use Pry::Prompt API instead"
|
|
485
|
+
)
|
|
486
|
+
end
|
|
487
|
+
|
|
551
488
|
# If input buffer is empty then use normal prompt
|
|
552
489
|
if eval_string.empty?
|
|
553
490
|
generate_prompt(Array(prompt).first, c)
|
|
@@ -558,44 +495,30 @@ class Pry
|
|
|
558
495
|
end
|
|
559
496
|
end
|
|
560
497
|
|
|
561
|
-
def generate_prompt(prompt_proc, conf)
|
|
562
|
-
if prompt_proc.arity == 1
|
|
563
|
-
prompt_proc.call(conf)
|
|
564
|
-
else
|
|
565
|
-
prompt_proc.call(conf.object, conf.nesting_level, conf._pry_)
|
|
566
|
-
end
|
|
567
|
-
end
|
|
568
|
-
private :generate_prompt
|
|
569
|
-
|
|
570
|
-
# the array that the prompt stack is stored in
|
|
571
|
-
def prompt_stack
|
|
572
|
-
@prompt_stack ||= Array.new
|
|
573
|
-
end
|
|
574
|
-
private :prompt_stack
|
|
575
|
-
|
|
576
498
|
# Pushes the current prompt onto a stack that it can be restored from later.
|
|
577
499
|
# Use this if you wish to temporarily change the prompt.
|
|
578
|
-
#
|
|
579
|
-
# @return [Array<Proc>] new_prompt
|
|
500
|
+
#
|
|
580
501
|
# @example
|
|
581
|
-
#
|
|
582
|
-
#
|
|
502
|
+
# push_prompt(Pry::Prompt[:my_prompt])
|
|
503
|
+
#
|
|
504
|
+
# @param [Pry::Prompt] new_prompt
|
|
505
|
+
# @return [Pry::Prompt] new_prompt
|
|
583
506
|
def push_prompt(new_prompt)
|
|
584
507
|
prompt_stack.push new_prompt
|
|
585
508
|
end
|
|
586
509
|
|
|
587
|
-
# Pops the current prompt off of the prompt stack.
|
|
588
|
-
#
|
|
589
|
-
#
|
|
590
|
-
#
|
|
510
|
+
# Pops the current prompt off of the prompt stack. If the prompt you are
|
|
511
|
+
# popping is the last prompt, it will not be popped. Use this to restore the
|
|
512
|
+
# previous prompt.
|
|
513
|
+
#
|
|
591
514
|
# @example
|
|
592
|
-
#
|
|
593
|
-
#
|
|
594
|
-
# pry = Pry.new :prompt => prompt1
|
|
595
|
-
# pry.push_prompt(prompt2)
|
|
515
|
+
# pry = Pry.new(prompt: Pry::Prompt[:my_prompt1])
|
|
516
|
+
# pry.push_prompt(Pry::Prompt[:my_prompt2])
|
|
596
517
|
# pry.pop_prompt # => prompt2
|
|
597
518
|
# pry.pop_prompt # => prompt1
|
|
598
519
|
# pry.pop_prompt # => prompt1
|
|
520
|
+
#
|
|
521
|
+
# @return [Pry::Prompt] the prompt being popped
|
|
599
522
|
def pop_prompt
|
|
600
523
|
prompt_stack.size > 1 ? prompt_stack.pop : prompt
|
|
601
524
|
end
|
|
@@ -603,7 +526,7 @@ class Pry
|
|
|
603
526
|
undef :pager if method_defined? :pager
|
|
604
527
|
# Returns the currently configured pager
|
|
605
528
|
# @example
|
|
606
|
-
#
|
|
529
|
+
# pry_instance.pager.page text
|
|
607
530
|
def pager
|
|
608
531
|
Pry::Pager.new(self)
|
|
609
532
|
end
|
|
@@ -611,7 +534,7 @@ class Pry
|
|
|
611
534
|
undef :output if method_defined? :output
|
|
612
535
|
# Returns an output device
|
|
613
536
|
# @example
|
|
614
|
-
#
|
|
537
|
+
# pry_instance.output.puts "ohai!"
|
|
615
538
|
def output
|
|
616
539
|
Pry::Output.new(self)
|
|
617
540
|
end
|
|
@@ -637,7 +560,7 @@ class Pry
|
|
|
637
560
|
raise ArgumentError, "wrong number of arguments"
|
|
638
561
|
elsif !args.first.respond_to?(:exception)
|
|
639
562
|
raise TypeError, "exception class/object expected"
|
|
640
|
-
elsif args.
|
|
563
|
+
elsif args.size == 1
|
|
641
564
|
args.first.exception
|
|
642
565
|
else
|
|
643
566
|
args.first.exception(args[1])
|
|
@@ -645,7 +568,7 @@ class Pry
|
|
|
645
568
|
|
|
646
569
|
raise TypeError, "exception object expected" unless exception.is_a? Exception
|
|
647
570
|
|
|
648
|
-
exception.set_backtrace(args.
|
|
571
|
+
exception.set_backtrace(args.size == 3 ? args[2] : caller(1))
|
|
649
572
|
|
|
650
573
|
if force || binding_stack.one?
|
|
651
574
|
binding_stack.clear
|
|
@@ -656,14 +579,123 @@ class Pry
|
|
|
656
579
|
end
|
|
657
580
|
end
|
|
658
581
|
|
|
659
|
-
def raise_up(*args)
|
|
582
|
+
def raise_up(*args)
|
|
583
|
+
raise_up_common(false, *args)
|
|
584
|
+
end
|
|
660
585
|
|
|
661
|
-
def raise_up!(*args)
|
|
586
|
+
def raise_up!(*args)
|
|
587
|
+
raise_up_common(true, *args)
|
|
588
|
+
end
|
|
662
589
|
|
|
663
590
|
# Convenience accessor for the `quiet` config key.
|
|
664
591
|
# @return [Boolean]
|
|
665
592
|
def quiet?
|
|
666
593
|
config.quiet
|
|
667
594
|
end
|
|
595
|
+
|
|
596
|
+
private
|
|
597
|
+
|
|
598
|
+
def handle_line(line, options)
|
|
599
|
+
if line.nil?
|
|
600
|
+
config.control_d_handler.call(self)
|
|
601
|
+
return
|
|
602
|
+
end
|
|
603
|
+
|
|
604
|
+
ensure_correct_encoding!(line)
|
|
605
|
+
Pry.history << line unless options[:generated]
|
|
606
|
+
|
|
607
|
+
@suppress_output = false
|
|
608
|
+
inject_sticky_locals!
|
|
609
|
+
begin
|
|
610
|
+
unless process_command_safely(line)
|
|
611
|
+
@eval_string += "#{line.chomp}\n" if !line.empty? || !@eval_string.empty?
|
|
612
|
+
end
|
|
613
|
+
rescue RescuableException => e
|
|
614
|
+
self.last_exception = e
|
|
615
|
+
result = e
|
|
616
|
+
|
|
617
|
+
Pry.critical_section do
|
|
618
|
+
show_result(result)
|
|
619
|
+
end
|
|
620
|
+
return
|
|
621
|
+
end
|
|
622
|
+
|
|
623
|
+
# This hook is supposed to be executed after each line of ruby code
|
|
624
|
+
# has been read (regardless of whether eval_string is yet a complete expression)
|
|
625
|
+
exec_hook :after_read, eval_string, self
|
|
626
|
+
|
|
627
|
+
begin
|
|
628
|
+
complete_expr = Pry::Code.complete_expression?(@eval_string)
|
|
629
|
+
rescue SyntaxError => e
|
|
630
|
+
output.puts e.message.gsub(/^.*syntax error, */, "SyntaxError: ")
|
|
631
|
+
reset_eval_string
|
|
632
|
+
end
|
|
633
|
+
|
|
634
|
+
if complete_expr
|
|
635
|
+
if @eval_string =~ /;\Z/ || @eval_string.empty? || @eval_string =~ /\A *#.*\n\z/
|
|
636
|
+
@suppress_output = true
|
|
637
|
+
end
|
|
638
|
+
|
|
639
|
+
# A bug in jruby makes java.lang.Exception not rescued by
|
|
640
|
+
# `rescue Pry::RescuableException` clause.
|
|
641
|
+
#
|
|
642
|
+
# * https://github.com/pry/pry/issues/854
|
|
643
|
+
# * https://jira.codehaus.org/browse/JRUBY-7100
|
|
644
|
+
#
|
|
645
|
+
# Until that gets fixed upstream, treat java.lang.Exception
|
|
646
|
+
# as an additional exception to be rescued explicitly.
|
|
647
|
+
#
|
|
648
|
+
# This workaround has a side effect: java exceptions specified
|
|
649
|
+
# in `Pry.config.unrescued_exceptions` are ignored.
|
|
650
|
+
jruby_exceptions = []
|
|
651
|
+
jruby_exceptions << Java::JavaLang::Exception if Helpers::Platform.jruby?
|
|
652
|
+
|
|
653
|
+
begin
|
|
654
|
+
# Reset eval string, in case we're evaluating Ruby that does something
|
|
655
|
+
# like open a nested REPL on this instance.
|
|
656
|
+
eval_string = @eval_string
|
|
657
|
+
reset_eval_string
|
|
658
|
+
|
|
659
|
+
result = evaluate_ruby(eval_string)
|
|
660
|
+
rescue RescuableException, *jruby_exceptions => e
|
|
661
|
+
# Eliminate following warning:
|
|
662
|
+
# warning: singleton on non-persistent Java type X
|
|
663
|
+
# (http://wiki.jruby.org/Persistence)
|
|
664
|
+
if Helpers::Platform.jruby? && e.class.respond_to?('__persistent__')
|
|
665
|
+
e.class.__persistent__ = true
|
|
666
|
+
end
|
|
667
|
+
self.last_exception = e
|
|
668
|
+
result = e
|
|
669
|
+
end
|
|
670
|
+
|
|
671
|
+
Pry.critical_section do
|
|
672
|
+
show_result(result)
|
|
673
|
+
end
|
|
674
|
+
end
|
|
675
|
+
|
|
676
|
+
throw(:breakout) if current_binding.nil?
|
|
677
|
+
end
|
|
678
|
+
|
|
679
|
+
# Force `eval_string` into the encoding of `val`. [Issue #284]
|
|
680
|
+
def ensure_correct_encoding!(val)
|
|
681
|
+
if @eval_string.empty? &&
|
|
682
|
+
val.respond_to?(:encoding) &&
|
|
683
|
+
val.encoding != @eval_string.encoding
|
|
684
|
+
@eval_string.force_encoding(val.encoding)
|
|
685
|
+
end
|
|
686
|
+
end
|
|
687
|
+
|
|
688
|
+
def generate_prompt(prompt_proc, conf)
|
|
689
|
+
if prompt_proc.arity == 1
|
|
690
|
+
prompt_proc.call(conf)
|
|
691
|
+
else
|
|
692
|
+
prompt_proc.call(conf.object, conf.nesting_level, conf.pry_instance)
|
|
693
|
+
end
|
|
694
|
+
end
|
|
695
|
+
|
|
696
|
+
# the array that the prompt stack is stored in
|
|
697
|
+
def prompt_stack
|
|
698
|
+
@prompt_stack ||= []
|
|
699
|
+
end
|
|
668
700
|
end
|
|
669
701
|
# rubocop:enable Metrics/ClassLength
|