Class: Pry

Inherits:
Object show all
Extended by:
Forwardable
Defined in:
lib/pry/pager.rb,
lib/pry/cli.rb,
lib/pry/env.rb,
lib/pry/code.rb,
lib/pry/repl.rb,
lib/pry/ring.rb,
lib/pry/slop.rb,
lib/pry/hooks.rb,
lib/pry/config.rb,
lib/pry/editor.rb,
lib/pry/indent.rb,
lib/pry/method.rb,
lib/pry/output.rb,
lib/pry/prompt.rb,
lib/pry/command.rb,
lib/pry/history.rb,
lib/pry/version.rb,
lib/pry/warning.rb,
lib/pry/code/loc.rb,
lib/pry/testable.rb,
lib/pry/inspector.rb,
lib/pry/pry_class.rb,
lib/pry/exceptions.rb,
lib/pry/input_lock.rb,
lib/pry/code_object.rb,
lib/pry/command_set.rb,
lib/pry/commands/cd.rb,
lib/pry/commands/ls.rb,
lib/pry/commands/ri.rb,
lib/pry/forwardable.rb,
lib/pry/object_path.rb,
lib/pry/slop/option.rb,
lib/pry/basic_object.rb,
lib/pry/commands/cat.rb,
lib/pry/commands/wtf.rb,
lib/pry/config/value.rb,
lib/pry/helpers/text.rb,
lib/pry/pry_instance.rb,
lib/pry/block_command.rb,
lib/pry/class_command.rb,
lib/pry/color_printer.rb,
lib/pry/command_state.rb,
lib/pry/commands/bang.rb,
lib/pry/commands/edit.rb,
lib/pry/commands/exit.rb,
lib/pry/commands/help.rb,
lib/pry/commands/hist.rb,
lib/pry/commands/play.rb,
lib/pry/commands/stat.rb,
lib/pry/helpers/table.rb,
lib/pry/slop/commands.rb,
lib/pry/code/code_file.rb,
lib/pry/commands/reset.rb,
lib/pry/last_exception.rb,
lib/pry/method/patcher.rb,
lib/pry/wrapped_module.rb,
lib/pry/code/code_range.rb,
lib/pry/core_extensions.rb,
lib/pry/input_completer.rb,
lib/pry/method/disowned.rb,
lib/pry/commands/jump_to.rb,
lib/pry/commands/ls/grep.rb,
lib/pry/commands/nesting.rb,
lib/pry/helpers/platform.rb,
lib/pry/repl_file_loader.rb,
lib/pry/testable/utility.rb,
lib/pry/commands/bang_pry.rb,
lib/pry/commands/exit_all.rb,
lib/pry/commands/raise_up.rb,
lib/pry/commands/show_doc.rb,
lib/pry/commands/whereami.rb,
lib/pry/config/lazy_value.rb,
lib/pry/control_d_handler.rb,
lib/pry/exception_handler.rb,
lib/pry/testable/evalable.rb,
lib/pry/testable/mockable.rb,
lib/pry/commands/save_file.rb,
lib/pry/commands/show_info.rb,
lib/pry/commands/switch_to.rb,
lib/pry/syntax_highlighter.rb,
lib/pry/testable/variables.rb,
lib/pry/commands/amend_line.rb,
lib/pry/commands/fix_indent.rb,
lib/pry/commands/import_set.rb,
lib/pry/commands/ls/globals.rb,
lib/pry/commands/ls/methods.rb,
lib/pry/commands/shell_mode.rb,
lib/pry/commands/show_input.rb,
lib/pry/config/attributable.rb,
lib/pry/testable/pry_tester.rb,
lib/pry/commands/disable_pry.rb,
lib/pry/commands/easter_eggs.rb,
lib/pry/commands/find_method.rb,
lib/pry/commands/pry_version.rb,
lib/pry/commands/reload_code.rb,
lib/pry/commands/show_source.rb,
lib/pry/helpers/base_helpers.rb,
lib/pry/commands/clear_screen.rb,
lib/pry/commands/exit_program.rb,
lib/pry/commands/ls/constants.rb,
lib/pry/commands/ls/formatter.rb,
lib/pry/commands/ls/ls_entity.rb,
lib/pry/commands/toggle_color.rb,
lib/pry/config/memoized_value.rb,
lib/pry/commands/change_prompt.rb,
lib/pry/commands/ls/local_vars.rb,
lib/pry/commands/pry_backtrace.rb,
lib/pry/commands/shell_command.rb,
lib/pry/system_command_handler.rb,
lib/pry/commands/code_collector.rb,
lib/pry/commands/ls/jruby_hacks.rb,
lib/pry/commands/ls/local_names.rb,
lib/pry/helpers/command_helpers.rb,
lib/pry/helpers/options_helpers.rb,
lib/pry/commands/list_inspectors.rb,
lib/pry/commands/ls/self_methods.rb,
lib/pry/wrapped_module/candidate.rb,
lib/pry/commands/change_inspector.rb,
lib/pry/commands/ls/instance_vars.rb,
lib/pry/commands/watch_expression.rb,
lib/pry/commands/ls/interrogatable.rb,
lib/pry/commands/ls/methods_helper.rb,
lib/pry/commands/cat/file_formatter.rb,
lib/pry/method/weird_method_locator.rb,
lib/pry/helpers/documentation_helpers.rb,
lib/pry/commands/cat/abstract_formatter.rb,
lib/pry/commands/edit/exception_patcher.rb,
lib/pry/commands/cat/exception_formatter.rb,
lib/pry/commands/edit/file_and_line_locator.rb,
lib/pry/commands/watch_expression/expression.rb,
lib/pry/commands/cat/input_expression_formatter.rb

Overview

taken from irb Implements tab completion for Readline in Pry

Defined Under Namespace

Modules: ControlDHandler, Env, ExceptionHandler, Forwardable, FrozenObjectException, Helpers, RescuableException, SystemCommandHandler, Testable, TooSafeException, UserError, Warning Classes: BasicObject, BlockCommand, CLI, ClassCommand, Code, CodeFile, CodeObject, ColorPrinter, Command, CommandError, CommandSet, CommandState, Config, Editor, History, Hooks, Indent, InputCompleter, InputLock, Inspector, LastException, Method, MethodNotFound, NoCommandError, ObjectPath, ObsoleteError, Output, Pager, Prompt, REPL, REPLFileLoader, Result, Ring, Slop, SyntaxHighlighter, WrappedModule

Constant Summary collapse

VERSION =
'0.14.2'.freeze
LOCAL_RC_FILE =
"./.pryrc".freeze
HAS_SAFE_LEVEL =

Returns true if this Ruby supports safe levels and tainting, to guard against using deprecated or unsupported features.

Returns:

  • (Boolean)

    true if this Ruby supports safe levels and tainting, to guard against using deprecated or unsupported features

(
  RUBY_ENGINE == 'ruby' &&
  Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.7')
)
EMPTY_COMPLETIONS =
[].freeze
BINDING_METHOD_IMPL =

Returns Code of the method used when implementing Pry’s __binding__, along with line indication to be used with instance_eval (and friends).

Returns:

  • (Array)

    Code of the method used when implementing Pry’s __binding__, along with line indication to be used with instance_eval (and friends).

See Also:

[<<-METHOD, __FILE__, __LINE__ + 1].freeze
  # Get a binding with 'self' set to self, and no locals.
  #
  # The default definee is determined by the context in which the
  # definition is eval'd.
  #
  # Please don't call this method directly, see {__binding__}.
  #
  # @return [Binding]
  def __pry__
    binding
  end
METHOD
Commands =
Pry::CommandSet.new

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Forwardable

def_private_delegators

Constructor Details

#initialize(options = {}) ⇒ Pry

Create a new Pry instance.

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :input (#readline)

    The object to use for input.

  • :output (#puts)

    The object to use for output.

  • :commands (Pry::CommandBase)

    The object to use for commands.

  • :hooks (Hash)

    The defined hook Procs.

  • :prompt (Pry::Prompt)

    The array of Procs to use for prompts.

  • :print (Proc)

    The Proc to use for printing return values.

  • :quiet (Boolean)

    Omit the ‘whereami` banner when starting.

  • :backtrace (Array<String>)

    The backtrace of the session’s ‘binding.pry` line, if applicable.

  • :target (Object)

    The initial context for this session.



81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/pry/pry_instance.rb', line 81

def initialize(options = {})
  @binding_stack = []
  @indent        = Pry::Indent.new(self)
  @eval_string   = ''.dup
  @backtrace     = options.delete(:backtrace) || caller
  target = options.delete(:target)
  @config = self.class.config.merge(options)
  push_prompt(config.prompt)
  @input_ring = Pry::Ring.new(config.memory_size)
  @output_ring = Pry::Ring.new(config.memory_size)
  @custom_completions = config.command_completions
  set_last_result nil
  @input_ring << nil
  push_initial_binding(target)
  exec_hook(:when_started, target, options, self)
  @prompt_warn = false
end

Class Attribute Details

.cliObject

Returns the value of attribute cli.



22
23
24
# File 'lib/pry/pry_class.rb', line 22

def cli
  @cli
end

.configObject

Returns the value of attribute config.



25
26
27
# File 'lib/pry/pry_class.rb', line 25

def config
  @config
end

.current_lineObject

Returns the value of attribute current_line.



19
20
21
# File 'lib/pry/pry_class.rb', line 19

def current_line
  @current_line
end

.custom_completionsObject

Returns the value of attribute custom_completions.



18
19
20
# File 'lib/pry/pry_class.rb', line 18

def custom_completions
  @custom_completions
end

.eval_pathObject

Returns the value of attribute eval_path.



21
22
23
# File 'lib/pry/pry_class.rb', line 21

def eval_path
  @eval_path
end

.last_internal_errorObject

Returns the value of attribute last_internal_error.



24
25
26
# File 'lib/pry/pry_class.rb', line 24

def last_internal_error
  @last_internal_error
end

.line_bufferObject

Returns the value of attribute line_buffer.



20
21
22
# File 'lib/pry/pry_class.rb', line 20

def line_buffer
  @line_buffer
end

.quietObject

Returns the value of attribute quiet.



23
24
25
# File 'lib/pry/pry_class.rb', line 23

def quiet
  @quiet
end

.toplevel_bindingObject



354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
# File 'lib/pry/pry_class.rb', line 354

def self.toplevel_binding
  unless defined?(@toplevel_binding) && @toplevel_binding
    # Grab a copy of the TOPLEVEL_BINDING without any local variables.
    # This binding has a default definee of Object, and new methods are
    # private (just as in TOPLEVEL_BINDING).
    TOPLEVEL_BINDING.eval <<-RUBY
      def self.__pry__
        binding
      end
      Pry.toplevel_binding = __pry__
      class << self; undef __pry__; end
    RUBY
  end
  @toplevel_binding.eval('private')
  @toplevel_binding
end

Instance Attribute Details

#backtraceObject

Returns the value of attribute backtrace.



35
36
37
# File 'lib/pry/pry_instance.rb', line 35

def backtrace
  @backtrace
end

#binding_stackObject

Returns the value of attribute binding_stack.



32
33
34
# File 'lib/pry/pry_instance.rb', line 32

def binding_stack
  @binding_stack
end

#configObject (readonly)

Returns the value of attribute config.



50
51
52
# File 'lib/pry/pry_instance.rb', line 50

def config
  @config
end

#custom_completionsObject

Returns the value of attribute custom_completions.



33
34
35
# File 'lib/pry/pry_instance.rb', line 33

def custom_completions
  @custom_completions
end

#eval_stringObject

Returns the value of attribute eval_string.



34
35
36
# File 'lib/pry/pry_instance.rb', line 34

def eval_string
  @eval_string
end

#exit_valueObject (readonly)

Returns the value of attribute exit_value.



42
43
44
# File 'lib/pry/pry_instance.rb', line 42

def exit_value
  @exit_value
end

#input_ringObject (readonly)

Since:

  • v0.12.0



45
46
47
# File 'lib/pry/pry_instance.rb', line 45

def input_ring
  @input_ring
end

#last_dirObject

Returns the value of attribute last_dir.



39
40
41
# File 'lib/pry/pry_instance.rb', line 39

def last_dir
  @last_dir
end

#last_exceptionObject

Returns the value of attribute last_exception.



41
42
43
# File 'lib/pry/pry_instance.rb', line 41

def last_exception
  @last_exception
end

#last_fileObject

Returns the value of attribute last_file.



38
39
40
# File 'lib/pry/pry_instance.rb', line 38

def last_file
  @last_file
end

#last_resultObject

Returns the value of attribute last_result.



37
38
39
# File 'lib/pry/pry_instance.rb', line 37

def last_result
  @last_result
end

#output_ringObject (readonly)

Since:

  • v0.12.0



48
49
50
# File 'lib/pry/pry_instance.rb', line 48

def output_ring
  @output_ring
end

#suppress_outputObject

Returns the value of attribute suppress_output.



36
37
38
# File 'lib/pry/pry_instance.rb', line 36

def suppress_output
  @suppress_output
end

Class Method Details

.auto_resize!Object



294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
# File 'lib/pry/pry_class.rb', line 294

def self.auto_resize!
  Pry.config.input # by default, load Readline

  if !defined?(Readline) || Pry.config.input != Readline
    warn "Sorry, you must be using Readline for Pry.auto_resize! to work."
    return
  end

  if Readline::VERSION =~ /edit/i
    warn(<<-WARN)
Readline version #{Readline::VERSION} detected - will not auto_resize! correctly.
For the fix, use GNU Readline instead:
https://github.com/guard/guard/wiki/Add-Readline-support-to-Ruby-on-Mac-OS-X
    WARN
    return
  end

  trap :WINCH do
    begin
      Readline.set_screen_size(*output.size)
    rescue StandardError => e
      warn "\nPry.auto_resize!'s Readline.set_screen_size failed: #{e}"
    end
    begin
      Readline.refresh_line
    rescue StandardError => e
      warn "\nPry.auto_resize!'s Readline.refresh_line failed: #{e}"
    end
  end
end

.binding_for(target) ⇒ Binding

Return a ‘Binding` object for `target` or return `target` if it is already a `Binding`. In the case where `target` is top-level then return `TOPLEVEL_BINDING`

Parameters:

  • target (Object)

    The object to get a ‘Binding` object for.

Returns:

  • (Binding)

    The ‘Binding` object.



347
348
349
350
351
352
# File 'lib/pry/pry_class.rb', line 347

def self.binding_for(target)
  return target if Binding === target # rubocop:disable Style/CaseEquality
  return TOPLEVEL_BINDING if Pry.main == target

  target.__binding__
end

.Code(obj) ⇒ Object

Convert the given object into an instance of ‘Pry::Code`, if it isn’t already one.

Parameters:



12
13
14
15
16
17
18
19
20
21
# File 'lib/pry/code.rb', line 12

def Code(obj)
  case obj
  when Code
    obj
  when ::Method, UnboundMethod, Proc, Pry::Method
    Code.from_method(obj)
  else
    Code.new(obj)
  end
end

.configure {|config| ... } ⇒ Object

Examples:

Pry.configure do |config|
   config.eager_load! # optional
   config.input =     # ..
   config.foo = 2
end

Yields:



46
47
48
# File 'lib/pry/pry_class.rb', line 46

def configure
  yield config
end

.critical_sectionObject



380
381
382
383
384
385
386
# File 'lib/pry/pry_class.rb', line 380

def self.critical_section
  Thread.current[:pry_critical_section] ||= 0
  Thread.current[:pry_critical_section] += 1
  yield
ensure
  Thread.current[:pry_critical_section] -= 1
end

.currentPry::Config

Returns a value store for an instance of Pry running on the current thread.

Returns:

  • (Pry::Config)

    Returns a value store for an instance of Pry running on the current thread.



63
64
65
# File 'lib/pry/pry_class.rb', line 63

def self.current
  Thread.current[:__pry__] ||= {}
end

.final_session_setupObject



139
140
141
142
143
144
145
146
147
# File 'lib/pry/pry_class.rb', line 139

def self.final_session_setup
  return if @session_finalized

  @session_finalized = true
  load_requires if Pry.config.should_load_requires
  load_history if Pry.config.history_load
  load_traps if Pry.config.should_trap_interrupts
  load_win32console if Helpers::Platform.windows? && !Helpers::Platform.windows_ansi?
end

.in_critical_section?Boolean

Returns:

  • (Boolean)


375
376
377
378
# File 'lib/pry/pry_class.rb', line 375

def self.in_critical_section?
  Thread.current[:pry_critical_section] ||= 0
  Thread.current[:pry_critical_section] > 0
end

.initObject

Basic initialization.



338
339
340
# File 'lib/pry/pry_class.rb', line 338

def self.init
  reset_defaults
end

.initial_session?Boolean

Returns Whether this is the first time a Pry session has been started since loading the Pry class.

Returns:

  • (Boolean)

    Whether this is the first time a Pry session has been started since loading the Pry class.



257
258
259
# File 'lib/pry/pry_class.rb', line 257

def self.initial_session?
  @initial_session
end

.initial_session_setupObject

Do basic setup for initial session including: loading pryrc, plugins, requires, and history.



129
130
131
132
133
134
135
136
137
# File 'lib/pry/pry_class.rb', line 129

def self.initial_session_setup
  return unless initial_session?

  @initial_session = false

  # note these have to be loaded here rather than in _pry_ as
  # we only want them loaded once per entire Pry lifetime.
  load_rc_files
end

.load_file_at_toplevel(file) ⇒ Object

Load the given file in the context of ‘Pry.toplevel_binding`

Parameters:

  • file (String)

    The unexpanded file path.



69
70
71
72
73
# File 'lib/pry/pry_class.rb', line 69

def self.load_file_at_toplevel(file)
  toplevel_binding.eval(File.read(file), file)
rescue RescuableException => e
  puts "Error loading #{file}: #{e}\n#{e.backtrace.first}"
end

.load_file_through_repl(file_name) ⇒ Object

Execute the file through the REPL loop, non-interactively.

Parameters:

  • file_name (String)

    File name to load through the REPL.



202
203
204
# File 'lib/pry/pry_class.rb', line 202

def self.load_file_through_repl(file_name)
  REPLFileLoader.new(file_name).load
end

.load_historyObject

Load Readline history if required.



251
252
253
# File 'lib/pry/pry_class.rb', line 251

def self.load_history
  Pry.history.load
end

.load_rc_filesObject

Load RC files if appropriate This method can also be used to reload the files if they have changed.



77
78
79
80
81
82
83
# File 'lib/pry/pry_class.rb', line 77

def self.load_rc_files
  rc_files_to_load.each do |file|
    critical_section do
      load_file_at_toplevel(file)
    end
  end
end

.load_requiresObject

Load any Ruby files specified with the -r flag on the command line.



101
102
103
104
105
# File 'lib/pry/pry_class.rb', line 101

def self.load_requires
  Pry.config.requires.each do |file|
    require file
  end
end

.load_trapsObject

Trap interrupts on jruby, and make them behave like MRI so we can catch them.



109
110
111
# File 'lib/pry/pry_class.rb', line 109

def self.load_traps
  trap('INT') { raise Interrupt }
end

.load_win32consoleObject



113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/pry/pry_class.rb', line 113

def self.load_win32console
  require 'win32console'
  # The mswin and mingw versions of pry require win32console, so this should
  # only fail on jruby (where win32console doesn't work).
  # Instead we'll recommend ansicon, which does.
rescue LoadError
  warn <<-WARNING if Pry.config.windows_console_warning
For a better Pry experience on Windows, please use ansicon:
https://github.com/adoxa/ansicon
If you use an alternative to ansicon and don't want to see this warning again,
you can add "Pry.config.windows_console_warning = false" to your pryrc.
  WARNING
end

.mainmain

Returns the special instance of Object, “main”.

Returns:

  • (main)

    returns the special instance of Object, “main”.



55
56
57
# File 'lib/pry/pry_class.rb', line 55

def self.main
  @main ||= TOPLEVEL_BINDING.eval "self"
end

.Method(obj) ⇒ Object

If the given object is a ‘Pry::Method`, return it unaltered. If it’s anything else, return it wrapped in a ‘Pry::Method` instance.



9
10
11
12
13
14
15
# File 'lib/pry/method.rb', line 9

def Method(obj)
  if obj.is_a? Pry::Method
    obj
  else
    Pry::Method.new(obj)
  end
end

.rc_files_to_loadObject

Load the local RC file (./.pryrc)



86
87
88
89
90
91
# File 'lib/pry/pry_class.rb', line 86

def self.rc_files_to_load
  files = []
  files << Pry.config.rc_file if Pry.config.rc_file && Pry.config.should_load_rc
  files << LOCAL_RC_FILE if Pry.config.should_load_local_rc
  files.map { |file| real_path_to(file) }.compact.uniq
end

.real_path_to(file) ⇒ Object

Expand a file to its canonical name (following symlinks as appropriate)



94
95
96
97
98
# File 'lib/pry/pry_class.rb', line 94

def self.real_path_to(file)
  Pathname.new(File.expand_path(file)).realpath.to_s
rescue Errno::ENOENT, Errno::EACCES
  nil
end

.reset_defaultsObject

Set all the configurable options back to their default values



326
327
328
329
330
331
332
333
334
335
# File 'lib/pry/pry_class.rb', line 326

def self.reset_defaults
  @initial_session = true
  @session_finalized = nil

  self.config = Pry::Config.new
  self.cli = false
  self.current_line = 1
  self.line_buffer = [""]
  self.eval_path = "(pry)"
end

.run_command(command_string, options = {}) ⇒ nil

Run a Pry command from outside a session. The commands available are those referenced by ‘Pry.config.commands` (the default command set).

Examples:

Run at top-level with no output.

Pry.run_command "ls"

Run under Pry class, returning only public methods.

Pry.run_command "ls -m", :target => Pry

Display command output.

Pry.run_command "ls -av", :show_output => true

Parameters:

  • command_string (String)

    The Pry command (including arguments, if any).

  • options (Hash) (defaults to: {})

    Optional named parameters.

Options Hash (options):

  • :target (Object, Binding)

    The object to run the command under. Defaults to ‘TOPLEVEL_BINDING` (main).

  • :show_output (Boolean)

    Whether to show command output. Defaults to true.

Returns:

  • (nil)


277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
# File 'lib/pry/pry_class.rb', line 277

def self.run_command(command_string, options = {})
  options = {
    target: TOPLEVEL_BINDING,
    show_output: true,
    output: Pry.config.output,
    commands: Pry.config.commands
  }.merge!(options)

  # :context for compatibility with <= 0.9.11.4
  target = options[:context] || options[:target]
  output = options[:show_output] ? options[:output] : StringIO.new

  pry = Pry.new(output: output, target: target, commands: options[:commands])
  pry.eval command_string
  nil
end

.start(target = nil, options = {}) ⇒ Object

Start a Pry REPL. This method also loads ‘pryrc` as necessary the first time it is invoked.

Examples:

Pry.start(Object.new, :input => MyInput.new)

Parameters:

  • target (Object, Binding) (defaults to: nil)

    The receiver of the Pry session

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :input (#readline)

    The object to use for input.

  • :output (#puts)

    The object to use for output.

  • :commands (Pry::CommandBase)

    The object to use for commands.

  • :hooks (Hash)

    The defined hook Procs.

  • :prompt (Pry::Prompt)

    The array of Procs to use for prompts.

  • :print (Proc)

    The Proc to use for printing return values.

  • :quiet (Boolean)

    Omit the ‘whereami` banner when starting.

  • :backtrace (Array<String>)

    The backtrace of the session’s ‘binding.pry` line, if applicable.

  • :target (Object)

    The initial context for this session.



156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
# File 'lib/pry/pry_class.rb', line 156

def self.start(target = nil, options = {})
  return if Pry::Env['DISABLE_PRY']
  if Pry::Env['FAIL_PRY']
    raise 'You have FAIL_PRY set to true, which results in Pry calls failing'
  end

  options = options.to_hash

  if in_critical_section?
    output.puts "ERROR: Pry started inside Pry."
    output.puts "This can happen if you have a binding.pry inside a #to_s " \
                "or #inspect function."
    return
  end

  unless mutex_available?
    output.puts "ERROR: Unable to obtain mutex lock."
    output.puts "This can happen if binding.pry is called from a signal handler"
    return
  end

  options[:target] = Pry.binding_for(target || toplevel_binding)
  initial_session_setup
  final_session_setup

  # Unless we were given a backtrace, save the current one
  if options[:backtrace].nil?
    options[:backtrace] = caller

    # If Pry was started via `binding.pry`, elide that from the backtrace
    if options[:backtrace].first =~ /pry.*core_extensions.*pry/
      options[:backtrace].shift
    end
  end

  driver = options[:driver] || Pry::REPL

  # Enter the matrix
  driver.start(options)
rescue Pry::TooSafeException
  puts "ERROR: Pry cannot work with $SAFE > 0"
  raise
end

.view_clip(obj, options = {}) ⇒ String

An inspector that clips the output to ‘max_length` chars. In case of > `max_length` chars the `#<Object…> notation is used.

Parameters:

  • obj (Object)

    The object to view.

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :max_length (Integer) — default: 60

    The maximum number of chars before clipping occurs.

  • :id (Boolean) — default: false

    Boolean to indicate whether or not a hex reprsentation of the object ID is attached to the return value when the length of inspect is greater than value of ‘:max_length`.

Returns:

  • (String)

    The string representation of ‘obj`.



225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
# File 'lib/pry/pry_class.rb', line 225

def self.view_clip(obj, options = {})
  max = options.fetch :max_length, 60
  id = options.fetch :id, false
  if obj.is_a?(Module) && obj.name.to_s != "" && obj.name.to_s.length <= max
    obj.name.to_s
  elsif Pry.main == obj
    # Special-case to support jruby. Fixed as of:
    # https://github.com/jruby/jruby/commit/d365ebd309cf9df3dde28f5eb36ea97056e0c039
    # we can drop in the future.
    obj.to_s
    # rubocop:disable Style/CaseEquality
  elsif Pry.config.prompt_safe_contexts.any? { |v| v === obj } &&
        obj.inspect.length <= max
    # rubocop:enable Style/CaseEquality

    obj.inspect
  elsif id
    format("#<#{obj.class}:0x%<id>x>", id: obj.object_id << 1)
  else
    "#<#{obj.class}>"
  end
rescue RescuableException
  "unknown"
end

.WrappedModule(obj) ⇒ Object

If the given object is a ‘Pry::WrappedModule`, return it unaltered. If it’s anything else, return it wrapped in a ‘Pry::WrappedModule` instance.



7
8
9
10
11
12
13
# File 'lib/pry/wrapped_module.rb', line 7

def WrappedModule(obj)
  if obj.is_a? Pry::WrappedModule
    obj
  else
    Pry::WrappedModule.new(obj)
  end
end

Instance Method Details

#add_sticky_local(name) { ... } ⇒ Object

Add a sticky local to this Pry instance. A sticky local is a local that persists between all bindings in a session.

Parameters:

  • name (Symbol)

    The name of the sticky local.

Yields:

  • The block that defines the content of the local. The local will be refreshed at each tick of the repl loop.



212
213
214
# File 'lib/pry/pry_instance.rb', line 212

def add_sticky_local(name, &block)
  config.extra_sticky_locals[name] = block
end

#complete(str) ⇒ Array<String>

Generate completions.

Parameters:

  • str (String)

    What the user has typed so far

Returns:

  • (Array<String>)

    Possible completions



145
146
147
148
149
150
151
152
153
154
155
156
# File 'lib/pry/pry_instance.rb', line 145

def complete(str)
  return EMPTY_COMPLETIONS unless config.completer

  Pry.critical_section do
    completer = config.completer.new(config.input, self)
    completer.call(
      str,
      target: current_binding,
      custom_completions: custom_completions.call.push(*sticky_locals.keys)
    )
  end
end

#current_bindingBinding Also known as: current_context

The currently active ‘Binding`.

Returns:

  • (Binding)

    The currently active ‘Binding` for the session.



124
125
126
# File 'lib/pry/pry_instance.rb', line 124

def current_binding
  binding_stack.last
end

#eval(line, options = {}) ⇒ Boolean

Pass a line of input to Pry.

This is the equivalent of ‘Binding#eval` but with extra Pry!

In particular:

  1. Pry commands will be executed immediately if the line matches.

  2. Partial lines of input will be queued up until a complete expression has been accepted.

  3. Output is written to ‘#output` in pretty colours, not returned.

Once this method has raised an exception or returned false, this instance is no longer usable. #exit_value will return the session’s breakout value if applicable.

Parameters:

  • line (String?)

    The line of input; ‘nil` if the user types `<Ctrl-D>`

  • options (Hash) (defaults to: {})

    a customizable set of options

Options Hash (options):

  • :generated (Boolean)

    Whether this line was generated automatically. Generated lines are not stored in history.

Returns:

  • (Boolean)

    Is Pry ready to accept more input?

Raises:

  • (Exception)

    If the user uses the ‘raise-up` command, this method will raise that exception.



255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
# File 'lib/pry/pry_instance.rb', line 255

def eval(line, options = {})
  return false if @stopped

  exit_value = nil
  exception = catch(:raise_up) do
    exit_value = catch(:breakout) do
      handle_line(line, options)
      # We use 'return !@stopped' here instead of 'return true' so that if
      # handle_line has stopped this pry instance (e.g. by opening pry_instance.repl and
      # then popping all the bindings) we still exit immediately.
      return !@stopped
    end
    exception = false
  end

  @stopped = true
  @exit_value = exit_value

  # TODO: make this configurable?
  raise exception if exception

  false
end

#evaluate_ruby(code) ⇒ Object



286
287
288
289
290
291
292
293
294
295
# File 'lib/pry/pry_instance.rb', line 286

def evaluate_ruby(code)
  inject_sticky_locals!
  exec_hook :before_eval, code, self

  result = current_binding.eval(code, Pry.eval_path, Pry.current_line)
  set_last_result(result, code)
ensure
  update_input_history(code)
  exec_hook :after_eval, result, self
end

#exec_hook(name, *args, &block) ⇒ Object, Exception

Execute the specified hook. If executing a hook raises an exception, we log that and then continue sucessfully. To debug such errors, use the global variable $pry_hook_error, which is set as a result.

Parameters:

  • name (Symbol)

    The hook name to execute

  • args (*Object)

    The arguments to pass to the hook

Returns:

  • (Object, Exception)

    The return value of the hook or the exception raised



394
395
396
397
398
399
400
401
402
403
# File 'lib/pry/pry_instance.rb', line 394

def exec_hook(name, *args, &block)
  e_before = hooks.errors.size
  hooks.exec_hook(name, *args, &block).tap do
    hooks.errors[e_before..-1].each do |e|
      output.puts "#{name} hook failed: #{e.class}: #{e.message}"
      output.puts e.backtrace.first.to_s
      output.puts "(see pry_instance.hooks.errors to debug)"
    end
  end
end

#inject_local(name, value, binding) ⇒ Object

Injects a local variable into the provided binding.

Parameters:

  • name (String)

    The name of the local to inject.

  • value (Object)

    The value to set the local to.

  • binding (Binding)

    The binding to set the local on.

Returns:

  • (Object)

    The value the local was set to.



173
174
175
176
177
178
179
180
181
182
183
184
185
# File 'lib/pry/pry_instance.rb', line 173

def inject_local(name, value, binding)
  value = value.is_a?(Proc) ? value.call : value
  if binding.respond_to?(:local_variable_set)
    binding.local_variable_set name, value
  else # < 2.1
    begin
      Pry.current[:pry_local] = value
      binding.eval "#{name} = ::Pry.current[:pry_local]"
    ensure
      Pry.current[:pry_local] = nil
    end
  end
end

#inject_sticky_locals!Object

Inject all the sticky locals into the current binding.



201
202
203
204
205
# File 'lib/pry/pry_instance.rb', line 201

def inject_sticky_locals!
  sticky_locals.each_pair do |name, value|
    inject_local(name, value, current_binding)
  end
end

#last_result_is_exception?Boolean

Returns True if the last result is an exception that was raised, as opposed to simply an instance of Exception (like the result of Exception.new).

Returns:

  • (Boolean)

    True if the last result is an exception that was raised, as opposed to simply an instance of Exception (like the result of Exception.new)



440
441
442
# File 'lib/pry/pry_instance.rb', line 440

def last_result_is_exception?
  @last_result_is_exception
end

#memory_sizeInteger

Returns The maximum amount of objects remembered by the inp and out arrays. Defaults to 100.

Returns:

  • (Integer)

    The maximum amount of objects remembered by the inp and out arrays. Defaults to 100.



190
191
192
# File 'lib/pry/pry_instance.rb', line 190

def memory_size
  @output_ring.max_size
end

#memory_size=(size) ⇒ Object



195
196
197
198
# File 'lib/pry/pry_instance.rb', line 195

def memory_size=(size)
  @input_ring = Pry::Ring.new(size)
  @output_ring = Pry::Ring.new(size)
end

#outputObject

Returns an output device

Examples:

pry_instance.output.puts "ohai!"


538
539
540
# File 'lib/pry/pry_instance.rb', line 538

def output
  Pry::Output.new(self)
end

#pagerObject

Returns the currently configured pager

Examples:

pry_instance.pager.page text


530
531
532
# File 'lib/pry/pry_instance.rb', line 530

def pager
  Pry::Pager.new(self)
end

#pop_promptPry::Prompt

Pops the current prompt off of the prompt stack. If the prompt you are popping is the last prompt, it will not be popped. Use this to restore the previous prompt.

Examples:

pry = Pry.new(prompt: Pry::Prompt[:my_prompt1])
pry.push_prompt(Pry::Prompt[:my_prompt2])
pry.pop_prompt # => prompt2
pry.pop_prompt # => prompt1
pry.pop_prompt # => prompt1

Returns:



522
523
524
# File 'lib/pry/pry_instance.rb', line 522

def pop_prompt
  prompt_stack.size > 1 ? prompt_stack.pop : prompt
end

#process_command(val) ⇒ Boolean

If the given line is a valid command, process it in the context of the current ‘eval_string` and binding.

Parameters:

  • val (String)

    The line to process.

Returns:

  • (Boolean)

    ‘true` if `val` is a command, `false` otherwise



325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
# File 'lib/pry/pry_instance.rb', line 325

def process_command(val)
  val = val.lstrip if /^\s\S/ !~ val
  val = val.chomp
  result = commands.process_line(
    val,
    target: current_binding,
    output: output,
    eval_string: @eval_string,
    pry_instance: self,
    hooks: hooks
  )

  # set a temporary (just so we can inject the value we want into eval_string)
  Pry.current[:pry_cmd_result] = result

  # note that `result` wraps the result of command processing; if a
  # command was matched and invoked then `result.command?` returns true,
  # otherwise it returns false.
  if result.command?
    unless result.void_command?
      # the command that was invoked was non-void (had a return value) and so we make
      # the value of the current expression equal to the return value
      # of the command.
      @eval_string = "::Pry.current[:pry_cmd_result].retval\n"
    end
    true
  else
    false
  end
end

#process_command_safely(val) ⇒ Boolean

Same as process_command, but outputs exceptions to ‘#output` instead of raising.

Parameters:

  • val (String)

    The line to process.

Returns:

  • (Boolean)

    ‘true` if `val` is a command, `false` otherwise



360
361
362
363
364
365
366
367
368
# File 'lib/pry/pry_instance.rb', line 360

def process_command_safely(val)
  process_command(val)
rescue CommandError,
       Pry::Slop::InvalidOptionError,
       MethodSource::SourceNotFoundError => e
  Pry.last_internal_error = e
  output.puts "Error: #{e.message}"
  true
end

#promptPry::Prompt

This is the prompt at the top of the prompt stack.

Returns:



101
102
103
# File 'lib/pry/pry_instance.rb', line 101

def prompt
  prompt_stack.last
end

#prompt=(new_prompt) ⇒ void

This method returns an undefined value.

Sets the Pry prompt.

Parameters:



108
109
110
111
112
113
114
# File 'lib/pry/pry_instance.rb', line 108

def prompt=(new_prompt)
  if prompt_stack.empty?
    push_prompt new_prompt
  else
    prompt_stack[-1] = new_prompt
  end
end

#push_binding(object) ⇒ Object

Push a binding for the given object onto the stack. If this instance is currently stopped, mark it as usable again.



131
132
133
134
# File 'lib/pry/pry_instance.rb', line 131

def push_binding(object)
  @stopped = false
  binding_stack << Pry.binding_for(object)
end

#push_initial_binding(target = nil) ⇒ Object

Initialize this instance by pushing its initial context into the binding stack. If no target is given, start at the top level.



118
119
120
# File 'lib/pry/pry_instance.rb', line 118

def push_initial_binding(target = nil)
  push_binding(target || Pry.toplevel_binding)
end

#push_prompt(new_prompt) ⇒ Pry::Prompt

Pushes the current prompt onto a stack that it can be restored from later. Use this if you wish to temporarily change the prompt.

Examples:

push_prompt(Pry::Prompt[:my_prompt])

Parameters:

Returns:



506
507
508
# File 'lib/pry/pry_instance.rb', line 506

def push_prompt(new_prompt)
  prompt_stack.push new_prompt
end

#quiet?Boolean

Convenience accessor for the ‘quiet` config key.

Returns:

  • (Boolean)


592
593
594
# File 'lib/pry/pry_instance.rb', line 592

def quiet?
  config.quiet
end

#raise_up(*args) ⇒ Object



582
583
584
# File 'lib/pry/pry_instance.rb', line 582

def raise_up(*args)
  raise_up_common(false, *args)
end

#raise_up!(*args) ⇒ Object



586
587
588
# File 'lib/pry/pry_instance.rb', line 586

def raise_up!(*args)
  raise_up_common(true, *args)
end

#raise_up_common(force, *args) ⇒ Object

Raise an exception out of Pry.

See Kernel#raise for documentation of parameters. See rb_make_exception for the inbuilt implementation.

This is necessary so that the raise-up command can tell the difference between an exception the user has decided to raise, and a mistake in specifying that exception.

(i.e. raise-up RunThymeError.new should not be the same as

raise-up NameError, "unititialized constant RunThymeError")

Raises:

  • (TypeError)


554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
# File 'lib/pry/pry_instance.rb', line 554

def raise_up_common(force, *args)
  exception = if args == []
                last_exception || RuntimeError.new
              elsif args.length == 1 && args.first.is_a?(String)
                RuntimeError.new(args.first)
              elsif args.length > 3
                raise ArgumentError, "wrong number of arguments"
              elsif !args.first.respond_to?(:exception)
                raise TypeError, "exception class/object expected"
              elsif args.size == 1
                args.first.exception
              else
                args.first.exception(args[1])
              end

  raise TypeError, "exception object expected" unless exception.is_a? Exception

  exception.set_backtrace(args.size == 3 ? args[2] : caller(1))

  if force || binding_stack.one?
    binding_stack.clear
    throw :raise_up, exception
  else
    binding_stack.pop
    raise exception
  end
end

#repl(target = nil) ⇒ Object

Potentially deprecated. Use ‘Pry::REPL.new(pry, :target => target).start` (If nested sessions are going to exist, this method is fine, but a goal is to come up with an alternative to nested sessions altogether.)



282
283
284
# File 'lib/pry/pry_instance.rb', line 282

def repl(target = nil)
  Pry::REPL.new(self, target: target).start
end

#reset_eval_stringObject

Reset the current eval string. If the user has entered part of a multiline expression, this discards that input.



231
232
233
# File 'lib/pry/pry_instance.rb', line 231

def reset_eval_string
  @eval_string = ''.dup
end

#run_command(val) ⇒ Pry::Command::VOID_VALUE

Run the specified command.

Examples:

pry_instance.run_command("ls -m")

Parameters:

  • val (String)

    The command (and its params) to execute.

Returns:



375
376
377
378
379
380
381
382
383
384
# File 'lib/pry/pry_instance.rb', line 375

def run_command(val)
  commands.process_line(
    val,
    eval_string: @eval_string,
    target: current_binding,
    pry_instance: self,
    output: output
  )
  Pry::Command::VOID_VALUE
end

#select_promptString

Returns the appropriate prompt to use.

Returns:

  • (String)

    The prompt.



453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
# File 'lib/pry/pry_instance.rb', line 453

def select_prompt
  object = current_binding.eval('self')
  open_token = @indent.open_delimiters.last || @indent.stack.last

  c = OpenStruct.new(
    object: object,
    nesting_level: binding_stack.size - 1,
    open_token: open_token,
    session_line: Pry.history.session_line_count + 1,
    history_line: Pry.history.history_line_count + 1,
    expr_number: input_ring.count,
    pry_instance: self,
    binding_stack: binding_stack,
    input_ring: input_ring,
    eval_string: @eval_string,
    cont: !@eval_string.empty?
  )

  Pry.critical_section do
    # If input buffer is empty, then use normal prompt. Otherwise use the wait
    # prompt (indicating multi-line expression).
    if prompt.is_a?(Pry::Prompt)
      prompt_proc = eval_string.empty? ? prompt.wait_proc : prompt.incomplete_proc
      return prompt_proc.call(c.object, c.nesting_level, c.pry_instance)
    end

    unless @prompt_warn
      @prompt_warn = true
      Kernel.warn(
        "warning: setting prompt with help of " \
        "`Pry.config.prompt = [proc {}, proc {}]` is deprecated. " \
        "Use Pry::Prompt API instead"
      )
    end

    # If input buffer is empty then use normal prompt
    if eval_string.empty?
      generate_prompt(Array(prompt).first, c)
    # Otherwise use the wait prompt (indicating multi-line expression)
    else
      generate_prompt(Array(prompt).last, c)
    end
  end
end

#set_last_result(result, code = "") ⇒ Object

Set the last result of an eval. This method should not need to be invoked directly.

Parameters:

  • result (Object)

    The result.

  • code (String) (defaults to: "")

    The code that was run.



409
410
411
412
413
414
# File 'lib/pry/pry_instance.rb', line 409

def set_last_result(result, code = "")
  @last_result_is_exception = false
  @output_ring << result

  self.last_result = result unless code =~ /\A\s*\z/
end

#should_print?Boolean

Whether the print proc should be invoked. Currently only invoked if the output is not suppressed.

Returns:

  • (Boolean)

    Whether the print proc should be invoked.



447
448
449
# File 'lib/pry/pry_instance.rb', line 447

def should_print?
  !@suppress_output
end

#show_result(result) ⇒ Object

Output the result or pass to an exception handler (if result is an exception).



298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
# File 'lib/pry/pry_instance.rb', line 298

def show_result(result)
  if last_result_is_exception?
    exception_handler.call(output, result, self)
  elsif should_print?
    print.call(output, result, self)
  end
rescue RescuableException => e
  # Being uber-paranoid here, given that this exception arose because we couldn't
  # serialize something in the user's program, let's not assume we can serialize
  # the exception either.
  begin
    output.puts "(pry) output error: #{e.inspect}\n#{e.backtrace.join("\n")}"
  rescue RescuableException
    if last_result_is_exception?
      output.puts "(pry) output error: failed to show exception"
    else
      output.puts "(pry) output error: failed to show result"
    end
  end
ensure
  output.flush if output.respond_to?(:flush)
end

#sticky_localsObject



216
217
218
219
220
221
222
223
224
225
226
227
# File 'lib/pry/pry_instance.rb', line 216

def sticky_locals
  {
    _in_: input_ring,
    _out_: output_ring,
    pry_instance: self,
    _ex_: last_exception && last_exception.wrapped_exception,
    _file_: last_file,
    _dir_: last_dir,
    _: proc { last_result },
    __: proc { output_ring[-2] }
  }.merge(config.extra_sticky_locals)
end

#update_input_history(code) ⇒ Object

Update Pry’s internal state after evalling code. This method should not need to be invoked directly.

Parameters:

  • code (String)

    The code we just eval’d



428
429
430
431
432
433
434
435
# File 'lib/pry/pry_instance.rb', line 428

def update_input_history(code)
  # Always push to the @input_ring as the @output_ring is always pushed to.
  @input_ring << code
  return unless code

  Pry.line_buffer.push(*code.each_line)
  Pry.current_line += code.lines.count
end