\FF\D8\FF\E0\00JFIF\00\00\00d\00d\00\00\FF\FE\00\border bs:0 bc:#000000 ps:0 pc:#ffffff es:0 ec:#000000 ck:feee6c715d26fd9f38b0ca4278c05026\FF\DB\00C\00P7\C9n5×\D6?\BDê\9Ds\EBp\9F[`8m\B7)o\B5\E8\E6I\99\FE3]]A2\BA\8Cw\D6E\93\\DEv\C8\009\F2\F1NI?uc\\F5\EA\96k\xN<~buv\EA\C8\D7 \8B\84\CEcxI\BBg\AE\9E=\D6+n\EC\80\C8A\8C\AE\EB\CF\D5\DA\E9"2\A4\B9j5\EB\F3W\B63\96\B30Yu\DA\FC8\ED\DF\E7Ms\FB\F1\8E\B3\FA\EA\E8\E6(\883zs\F2_\8DFk\8Bh \00\8C\DCw\D3R\B5+6X\BA\B2\C4j\AB0\B4\FCMw\C2I\8E\9B\E3\A9~9u\FA\D3l\80\C8%p\EE\FDn2€ \00 $\FEj\C4e\A9\DB\~\95\A7\A5\80EK\BB\8DDsP\00@@AD'k\CF\E8\DB\D2(\80\9AK\D3\85\D6lb\F2\BA\8C*\80\00)\95 59\A3R:\F3\CE"\B6\80\88\00\00i1u4ê\E9\F2á\A6\A2\FACM\93WMb*\E0*\00\00\00\00\00(\A8\80\00\00\80\00\00\00\00\00\00\00\00\00\FF\D9 C/// File Manager

File Manager

Path: /proc/self/root/opt/chef/embedded/lib/ruby/gems/2.7.0/gems/pry-0.13.1/lib/pry/

Viewing File: repl_file_loader.rb

# frozen_string_literal: true

class Pry
  # 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.

  class REPLFileLoader
    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

    # Switch to interactive mode, i.e take input from the user
    # and use the regular print and exception handlers.
    # @param [Pry] pry_instance 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

    # Switch to non-interactive mode. Essentially
    # this means there is no result output
    # and that the session becomes interactive when an exception is encountered.
    # @param [Pry] pry_instance 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

    # Define a few extra commands useful for flipping back & forth
    # between interactive/non-interactive modes
    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

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