class Pry::REPLFileLoader
def define_additional_commands
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_)
-
_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
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_)
-
_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