Class: Pry::REPLFileLoader
Overview
A class to manage the loading of files through the REPL loop. This is an interesting trick as it processes your file as if it was user input in an interactive session. As a result, all Pry commands are available, and they are executed non-interactively. Furthermore the session becomes interactive when the repl loop processes a ‘make-interactive’ command in the file. The session also becomes interactive when an exception is encountered, enabling you to fix the error before returning to non-interactive processing with the ‘make-non-interactive’ command.
Instance Method Summary collapse
-
#define_additional_commands ⇒ Object
Define a few extra commands useful for flipping back & forth between interactive/non-interactive modes.
-
#initialize(file_name) ⇒ REPLFileLoader
constructor
A new instance of REPLFileLoader.
-
#interactive_mode(_pry_) ⇒ Object
Switch to interactive mode, i.e take input from the user and use the regular print and exception handlers.
-
#load ⇒ Object
Actually load the file through the REPL by setting file content as the REPL input stream.
-
#non_interactive_mode(_pry_, content) ⇒ Object
Switch to non-interactive mode.
Constructor Details
#initialize(file_name) ⇒ REPLFileLoader
Returns a new instance of REPLFileLoader.
14 15 16 17 18 19 20 |
# File 'lib/pry/repl_file_loader.rb', line 14 def initialize(file_name) full_name = File.(file_name) raise RuntimeError, "No such file: #{full_name}" if !File.exists?(full_name) define_additional_commands @content = File.read(full_name) end |
Instance Method Details
#define_additional_commands ⇒ Object
Define a few extra commands useful for flipping back & forth between interactive/non-interactive modes
56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/pry/repl_file_loader.rb', line 56 def define_additional_commands s = self Pry::Commands.command "make-interactive", "Make the session interactive" do s.interactive_mode(_pry_) end Pry::Commands.command "load-file", "Load another file through the repl" do |file_name| s.non_interactive_mode(_pry_, File.read(File.(file_name))) end end |
#interactive_mode(_pry_) ⇒ Object
Switch to interactive mode, i.e take input from the user and use the regular print and exception handlers.
25 26 27 28 29 30 |
# File 'lib/pry/repl_file_loader.rb', line 25 def interactive_mode(_pry_) _pry_.config.input = Pry.config.input _pry_.config.print = Pry.config.print _pry_.config.exception_handler = Pry.config.exception_handler Pry::REPL.new(_pry_).start end |
#load ⇒ Object
Actually load the file through the REPL by setting file content as the REPL input stream.
70 71 72 |
# File 'lib/pry/repl_file_loader.rb', line 70 def load non_interactive_mode(Pry.new, @content) end |
#non_interactive_mode(_pry_, content) ⇒ Object
Switch to non-interactive mode. Essentially this means there is no result output and that the session becomes interactive when an exception is encountered.
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/pry/repl_file_loader.rb', line 36 def non_interactive_mode(_pry_, content) _pry_.print = proc {} _pry_.exception_handler = proc do |o, e, _p_| _p_.run_command "cat --ex" o.puts "...exception encountered, going interactive!" interactive_mode(_pry_) end content.lines.each do |line| break unless _pry_.eval line, :generated => true end unless _pry_.eval_string.empty? _pry_.output.puts "#{_pry_.eval_string}...exception encountered, going interactive!" interactive_mode(_pry_) end end |