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
    s.interactive_mode(pry_instance)
  end
  Pry::Commands.command(
    "load-file", "Load another file through the repl"
  ) do |file_name|
    s.non_interactive_mode(pry_instance, File.read(File.expand_path(file_name)))
  end
end

def initialize(file_name)

def initialize(file_name)
  full_name = File.expand_path(file_name)
  raise "No such file: #{full_name}" unless File.exist?(full_name)
  define_additional_commands
  @content = File.read(full_name)
end

def interactive_mode(pry_instance)

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

def load

as the REPL input stream.
Actually load the file through the REPL by setting file content
def load
  non_interactive_mode(Pry.new, @content)
end

def non_interactive_mode(pry_instance, content)

Parameters:
  • pry_instance (Pry) -- the Pry instance to make non-interactive.
def non_interactive_mode(pry_instance, content)
  pry_instance.print = proc {}
  pry_instance.exception_handler = proc do |o, _e, p|
    p.run_command "cat --ex"
    o.puts "...exception encountered, going interactive!"
    interactive_mode(pry_instance)
  end
  content.lines.each do |line|
    break unless pry_instance.eval line, generated: true
  end
  return if pry_instance.eval_string.empty?
  pry_instance.output.puts(
    "#{pry_instance.eval_string}...exception encountered, going interactive!"
  )
  interactive_mode(pry_instance)
end