class Pry::REPLFileLoader

def define_additional_commands

between interactive/non-interactive modes
Define a few extra commands useful for flipping back & forth
def define_additional_commands
  s = self
  Pry::Commands.command "make-interactive", "Make the session interactive" do
    _pry_.input_stack.push _pry_.input
    s.interactive_mode(_pry_)
  end
  Pry::Commands.command "make-non-interactive", "Make the session non-interactive" do
    _pry_.input = _pry_.input_stack.pop
    s.non_interactive_mode(_pry_)
  end
  Pry::Commands.command "load-file", "Load another file through the repl" do |file_name|
    content = StringIO.new(File.read(File.expand_path(file_name)))
    _pry_.input_stack.push(_pry_.input)
    _pry_.input = content
  end
end

def initialize(file_name)

def initialize(file_name)
  full_name = File.expand_path(file_name)
  raise RuntimeError, "No such file: #{full_name}" if !File.exists?(full_name)
  @content = StringIO.new(File.read(full_name))
end

def interactive_mode(_pry_)

Parameters:
  • _pry_ (Pry) -- the Pry instance to make interactive.
def interactive_mode(_pry_)
  _pry_.input = Pry.config.input
  _pry_.print = Pry.config.print
  _pry_.exception_handler = Pry.config.exception_handler
end

def load

as the REPL input stream.
Actually load the file through the REPL by setting file content
def load
  Pry.initial_session_setup
  define_additional_commands
  Pry.config.hooks.add_hook(:when_started, :start_non_interactively) do |o, t, _pry_|
    non_interactive_mode(_pry_)
  end
  Pry.start(Pry.toplevel_binding,
            :input => @content,
            :input_stack => [StringIO.new("exit-all\n")])
end

def non_interactive_mode(_pry_)

Parameters:
  • _pry_ (Pry) -- the Pry instance to make non-interactive.
def non_interactive_mode(_pry_)
  _pry_.print = proc {}
  _pry_.exception_handler = proc do |o, e, _pry_|
    _pry_.run_command "cat --ex"
    o.puts "...exception encountered, going interactive!"
    interactive_mode(_pry_)
  end
end