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/plugins.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, PluginManager, Prompt, REPL, REPLFileLoader, Result, Ring, Slop, SyntaxHighlighter, WrappedModule

Constant Summary collapse

VERSION =
'0.12.2'.freeze
LOCAL_RC_FILE =
"./.pryrc".freeze
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:

["# Get a binding with 'self' set to self, and no locals.\n#\n# The default definee is determined by the context in which the\n# definition is eval'd.\n#\n# Please don't call this method directly, see {__binding__}.\n#\n# @return [Binding]\ndef __pry__\nbinding\nend\n", __FILE__, __LINE__ + 1].freeze
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


15
16
17
# File 'lib/pry/pry_class.rb', line 15

def cli
  @cli
end

.configObject

Returns the value of attribute config


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

def config
  @config
end

.current_lineObject

Returns the value of attribute current_line


12
13
14
# File 'lib/pry/pry_class.rb', line 12

def current_line
  @current_line
end

.custom_completionsObject

Returns the value of attribute custom_completions


11
12
13
# File 'lib/pry/pry_class.rb', line 11

def custom_completions
  @custom_completions
end

.eval_pathObject

Returns the value of attribute eval_path


14
15
16
# File 'lib/pry/pry_class.rb', line 14

def eval_path
  @eval_path
end

.last_internal_errorObject

Returns the value of attribute last_internal_error


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

def last_internal_error
  @last_internal_error
end

.line_bufferObject

Returns the value of attribute line_buffer


13
14
15
# File 'lib/pry/pry_class.rb', line 13

def line_buffer
  @line_buffer
end

.quietObject

Returns the value of attribute quiet


16
17
18
# File 'lib/pry/pry_class.rb', line 16

def quiet
  @quiet
end

.toplevel_bindingObject


346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
# File 'lib/pry/pry_class.rb', line 346

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 "def self.__pry__\nbinding\nend\nPry.toplevel_binding = __pry__\nclass << self; undef __pry__; end\n"
  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


284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
# File 'lib/pry/pry_class.rb', line 284

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("Readline version \#{Readline::VERSION} detected - will not auto_resize! correctly.\nFor the fix, use GNU Readline instead:\nhttps://github.com/guard/guard/wiki/Add-Readline-support-to-Ruby-on-Mac-OS-X\n")
    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.


339
340
341
342
343
344
# File 'lib/pry/pry_class.rb', line 339

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:


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

def configure
  yield config
end

.critical_sectionObject


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

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.


58
59
60
# File 'lib/pry/pry_class.rb', line 58

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

.final_session_setupObject


134
135
136
137
138
139
140
141
142
143
# File 'lib/pry/pry_class.rb', line 134

def self.final_session_setup
  return if @session_finalized

  @session_finalized = true
  load_plugins if Pry.config.should_load_plugins
  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)

367
368
369
370
# File 'lib/pry/pry_class.rb', line 367

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

.initObject

Basic initialization.


328
329
330
331
332
# File 'lib/pry/pry_class.rb', line 328

def self.init
  @plugin_manager ||= PluginManager.new
  reset_defaults
  locate_plugins
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.


247
248
249
# File 'lib/pry/pry_class.rb', line 247

def self.initial_session?
  @initial_session
end

.initial_session_setupObject

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


124
125
126
127
128
129
130
131
132
# File 'lib/pry/pry_class.rb', line 124

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.


64
65
66
67
68
# File 'lib/pry/pry_class.rb', line 64

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.


192
193
194
# File 'lib/pry/pry_class.rb', line 192

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

.load_historyObject

Load Readline history if required.


241
242
243
# File 'lib/pry/pry_class.rb', line 241

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.


72
73
74
75
76
77
78
# File 'lib/pry/pry_class.rb', line 72

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.


96
97
98
99
100
# File 'lib/pry/pry_class.rb', line 96

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.


104
105
106
# File 'lib/pry/pry_class.rb', line 104

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

.load_win32consoleObject


108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/pry/pry_class.rb', line 108

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 "For a better Pry experience on Windows, please use ansicon:\nhttps://github.com/adoxa/ansicon\nIf you use an alternative to ansicon and don't want to see this warning again,\nyou can add \"Pry.config.windows_console_warning = false\" to your pryrc.\n" if Pry.config.windows_console_warning
end

.mainmain

Returns the special instance of Object, "main".

Returns:

  • (main)

    returns the special instance of Object, "main".


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

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)


81
82
83
84
85
86
# File 'lib/pry/pry_class.rb', line 81

def self.rc_files_to_load
  files = []
  files << Pry.config.rc_file if 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)


89
90
91
92
93
# File 'lib/pry/pry_class.rb', line 89

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


316
317
318
319
320
321
322
323
324
325
# File 'lib/pry/pry_class.rb', line 316

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)

267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
# File 'lib/pry/pry_class.rb', line 267

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.


152
153
154
155
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
# File 'lib/pry/pry_class.rb', line 152

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

  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 `# 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.


215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
# File 'lib/pry/pry_class.rb', line 215

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

#ensure_correct_encoding!(val) ⇒ Object (private)

Force eval_string into the encoding of val. [Issue #284]


680
681
682
683
684
685
686
# File 'lib/pry/pry_instance.rb', line 680

def ensure_correct_encoding!(val)
  if @eval_string.empty? &&
     val.respond_to?(:encoding) &&
     val.encoding != @eval_string.encoding
    @eval_string.force_encoding(val.encoding)
  end
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 [email protected]' 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

#generate_prompt(prompt_proc, conf) ⇒ Object (private)


688
689
690
691
692
693
694
# File 'lib/pry/pry_instance.rb', line 688

def generate_prompt(prompt_proc, conf)
  if prompt_proc.arity == 1
    prompt_proc.call(conf)
  else
    prompt_proc.call(conf.object, conf.nesting_level, conf.pry_instance)
  end
end

#handle_line(line, options) ⇒ Object (private)


598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
# File 'lib/pry/pry_instance.rb', line 598

def handle_line(line, options)
  if line.nil?
    config.control_d_handler.call(self)
    return
  end

  ensure_correct_encoding!(line)
  Pry.history << line unless options[:generated]

  @suppress_output = false
  inject_sticky_locals!
  begin
    unless process_command_safely(line)
      @eval_string += "#{line.chomp}\n" if !line.empty? || !@eval_string.empty?
    end
  rescue RescuableException => e
    self.last_exception = e
    result = e

    Pry.critical_section do
      show_result(result)
    end
    return
  end

  # This hook is supposed to be executed after each line of ruby code
  # has been read (regardless of whether eval_string is yet a complete expression)
  exec_hook :after_read, eval_string, self

  begin
    complete_expr = Pry::Code.complete_expression?(@eval_string)
  rescue SyntaxError => e
    output.puts "SyntaxError: #{e.message.sub(/.*syntax error, */m, '')}"
    reset_eval_string
  end

  if complete_expr
    if @eval_string =~ /;\Z/ || @eval_string.empty? || @eval_string =~ /\A *#.*\n\z/
      @suppress_output = true
    end

    # A bug in jruby makes java.lang.Exception not rescued by
    # `rescue Pry::RescuableException` clause.
    #
    # * https://github.com/pry/pry/issues/854
    # * https://jira.codehaus.org/browse/JRUBY-7100
    #
    # Until that gets fixed upstream, treat java.lang.Exception
    # as an additional exception to be rescued explicitly.
    #
    # This workaround has a side effect: java exceptions specified
    # in `Pry.config.unrescued_exceptions` are ignored.
    jruby_exceptions = []
    jruby_exceptions << Java::JavaLang::Exception if Helpers::Platform.jruby?

    begin
      # Reset eval string, in case we're evaluating Ruby that does something
      # like open a nested REPL on this instance.
      eval_string = @eval_string
      reset_eval_string

      result = evaluate_ruby(eval_string)
    rescue RescuableException, *jruby_exceptions => e
      # Eliminate following warning:
      # warning: singleton on non-persistent Java type X
      # (http://wiki.jruby.org/Persistence)
      if Helpers::Platform.jruby? && e.class.respond_to?('__persistent__')
        e.class.__persistent__ = true
      end
      self.last_exception = e
      result = e
    end

    Pry.critical_section do
      show_result(result)
    end
  end

  throw(:breakout) if current_binding.nil?
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)

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

#prompt_stackObject (private)

the array that the prompt stack is stored in


697
698
699
# File 'lib/pry/pry_instance.rb', line 697

def prompt_stack
  @prompt_stack ||= []
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