pry-moves 0.1.13 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/Gemfile.lock +6 -4
- data/README.md +15 -7
- data/lib/commands/debug.rb +17 -0
- data/lib/commands/finish.rb +26 -0
- data/lib/commands/goto.rb +19 -0
- data/lib/commands/iterate.rb +22 -0
- data/lib/commands/next.rb +37 -0
- data/lib/commands/next_breakpoint.rb +22 -0
- data/lib/commands/step.rb +83 -0
- data/lib/commands/trace_command.rb +87 -0
- data/lib/commands/trace_helpers.rb +49 -0
- data/lib/commands/traced_method.rb +71 -0
- data/lib/debug_sugar.rb +72 -0
- data/lib/pry-moves/add_suffix.rb +88 -0
- data/lib/pry-moves/backtrace.rb +67 -43
- data/lib/pry-moves/bindings_stack.rb +97 -0
- data/lib/pry-moves/commands.rb +42 -3
- data/lib/pry-moves/formatter.rb +74 -0
- data/lib/pry-moves/painter.rb +3 -2
- data/lib/pry-moves/pry_ext.rb +64 -16
- data/lib/pry-moves/pry_wrapper.rb +30 -17
- data/lib/pry-moves/restartable.rb +38 -0
- data/lib/pry-moves/version.rb +1 -1
- data/lib/pry-moves/watch.rb +3 -0
- data/lib/pry-moves.rb +65 -6
- data/lib/pry-stack_explorer/frame_manager.rb +6 -9
- data/lib/pry-stack_explorer/pry-stack_explorer.rb +1 -16
- data/lib/pry-stack_explorer/{commands.rb → stack_commands.rb} +10 -6
- data/lib/pry-stack_explorer/when_started_hook.rb +10 -65
- data/playground/Gemfile.lock +6 -4
- data/playground/README.md +1 -0
- data/playground/playground.rb +94 -9
- data/playground/test.rb +5 -1
- data/playground/test.sh +1 -0
- data/pry-moves.gemspec +3 -2
- data/publish.sh +2 -1
- data/spec/backtrace_spec.rb +11 -13
- data/spec/blocks_spec.rb +41 -8
- data/spec/commands_spec.rb +26 -25
- data/spec/pry_debugger.rb +5 -1
- data/spec/redirection_spec.rb +7 -0
- data/spec/spec_helper.rb +9 -4
- data/spec/step_spec.rb +51 -0
- metadata +43 -13
- data/lib/pry-moves/helpers.rb +0 -56
- data/lib/pry-moves/trace_commands.rb +0 -109
- data/lib/pry-moves/traced_method.rb +0 -61
- data/lib/pry-moves/tracer.rb +0 -140
- data/lib/pry-moves/traversing.rb +0 -69
    
        data/lib/pry-moves/commands.rb
    CHANGED
    
    | @@ -21,6 +21,11 @@ module PryMoves | |
| 21 21 | 
             
                  breakout_navigation :next, 'blockless'
         | 
| 22 22 | 
             
                end
         | 
| 23 23 |  | 
| 24 | 
            +
                block_command 'next_breakpoint', 'Go to next breakpoint' do |param|
         | 
| 25 | 
            +
                  breakout_navigation :next_breakpoint, param
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
                alias_command 'b', 'next_breakpoint'
         | 
| 28 | 
            +
             | 
| 24 29 | 
             
                block_command 'iterate', 'Go to next iteration of current block' do |param|
         | 
| 25 30 | 
             
                  breakout_navigation :iterate, param
         | 
| 26 31 | 
             
                end
         | 
| @@ -41,7 +46,7 @@ module PryMoves | |
| 41 46 | 
             
                end
         | 
| 42 47 |  | 
| 43 48 | 
             
                block_command 'bt', 'Backtrace' do |param, param2|
         | 
| 44 | 
            -
                  PryMoves::Backtrace.new( | 
| 49 | 
            +
                  PryMoves::Backtrace.new(_pry_).run_command param, param2
         | 
| 45 50 | 
             
                end
         | 
| 46 51 |  | 
| 47 52 | 
             
                block_command 'debug', '' do
         | 
| @@ -49,6 +54,23 @@ module PryMoves | |
| 49 54 | 
             
                  breakout_navigation :debug, cmd
         | 
| 50 55 | 
             
                end
         | 
| 51 56 |  | 
| 57 | 
            +
                block_command :restart, '' do
         | 
| 58 | 
            +
                  PryMoves.restart_requested = true
         | 
| 59 | 
            +
                  run 'continue'
         | 
| 60 | 
            +
                end
         | 
| 61 | 
            +
                alias_command '@', 'restart'
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                block_command :reload, '' do
         | 
| 64 | 
            +
                  PryMoves.reload_requested = true
         | 
| 65 | 
            +
                  run 'continue'
         | 
| 66 | 
            +
                end
         | 
| 67 | 
            +
                alias_command '#', 'reload'
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                block_command /^\\(\w+)$/, 'Execute command explicitly' do |param|
         | 
| 70 | 
            +
                  Pry.config.ignore_once_var_precedence = true
         | 
| 71 | 
            +
                  run param
         | 
| 72 | 
            +
                end
         | 
| 73 | 
            +
             | 
| 52 74 | 
             
                block_command '!', 'exit' do
         | 
| 53 75 | 
             
                  PryMoves.unlock
         | 
| 54 76 | 
             
                  Pry.config.exit_requested = true
         | 
| @@ -62,16 +84,32 @@ module PryMoves | |
| 62 84 |  | 
| 63 85 | 
             
                helpers do
         | 
| 64 86 | 
             
                  def breakout_navigation(action, param)
         | 
| 87 | 
            +
                    return if var_precedence action
         | 
| 88 | 
            +
             | 
| 65 89 | 
             
                    check_file_context
         | 
| 66 90 | 
             
                    _pry_.binding_stack.clear     # Clear the binding stack.
         | 
| 67 91 | 
             
                    throw :breakout_nav, {        # Break out of the REPL loop and
         | 
| 68 92 | 
             
                      action: action,          #   signal the tracer.
         | 
| 69 93 | 
             
                      param:  param,
         | 
| 70 | 
            -
                      binding: target | 
| 71 | 
            -
                      pry: _pry_
         | 
| 94 | 
            +
                      binding: target
         | 
| 72 95 | 
             
                    }
         | 
| 73 96 | 
             
                  end
         | 
| 74 97 |  | 
| 98 | 
            +
                  def var_precedence action
         | 
| 99 | 
            +
                    if Pry.config.ignore_once_var_precedence
         | 
| 100 | 
            +
                      Pry.config.ignore_once_var_precedence = false
         | 
| 101 | 
            +
                      return
         | 
| 102 | 
            +
                    end
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                    input = Pry.config.original_user_input || action
         | 
| 105 | 
            +
                    binding_value = target.eval(input) rescue nil
         | 
| 106 | 
            +
                    unless binding_value.nil?
         | 
| 107 | 
            +
                      puts "ℹ️️  Variable \"#{input}\" found. To execute command type its alias or \\#{input}"
         | 
| 108 | 
            +
                      puts PryMoves::Painter.colorize binding_value
         | 
| 109 | 
            +
                      true
         | 
| 110 | 
            +
                    end
         | 
| 111 | 
            +
                  end
         | 
| 112 | 
            +
             | 
| 75 113 | 
             
                  # Ensures that a command is executed in a local file context.
         | 
| 76 114 | 
             
                  def check_file_context
         | 
| 77 115 | 
             
                    unless PryMoves.check_file_context(target)
         | 
| @@ -79,6 +117,7 @@ module PryMoves | |
| 79 117 | 
             
                    end
         | 
| 80 118 | 
             
                  end
         | 
| 81 119 | 
             
                end
         | 
| 120 | 
            +
             | 
| 82 121 | 
             
              end
         | 
| 83 122 | 
             
            end
         | 
| 84 123 |  | 
| @@ -0,0 +1,74 @@ | |
| 1 | 
            +
            class PryMoves::Formatter
         | 
| 2 | 
            +
             | 
| 3 | 
            +
              attr_accessor :colorize
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              def initialize colorize = true
         | 
| 6 | 
            +
                @colorize = colorize
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              def method_signature(binding)
         | 
| 10 | 
            +
                meth = binding.eval('__method__')
         | 
| 11 | 
            +
                meth_obj = meth ? Pry::Method.from_binding(binding) : nil
         | 
| 12 | 
            +
                if !meth_obj
         | 
| 13 | 
            +
                  ""
         | 
| 14 | 
            +
                elsif meth_obj.undefined?
         | 
| 15 | 
            +
                  "#{meth_obj.name}(UNKNOWN) (undefined method)"
         | 
| 16 | 
            +
                else
         | 
| 17 | 
            +
                  args = meth_obj.parameters.map.with_index do |(type, name), i|
         | 
| 18 | 
            +
                    if name
         | 
| 19 | 
            +
                      value = format_arg binding, name.to_s
         | 
| 20 | 
            +
                      show_value = true
         | 
| 21 | 
            +
                    else
         | 
| 22 | 
            +
                      name = (type == :block ? 'block' : "arg#{i + 1}")
         | 
| 23 | 
            +
                    end
         | 
| 24 | 
            +
                    name = case type
         | 
| 25 | 
            +
                      when :req   then "#{name} ="
         | 
| 26 | 
            +
                      when :key   then "#{name}:"
         | 
| 27 | 
            +
                      when :opt   then "#{name}=?"
         | 
| 28 | 
            +
                      when :rest  then "*#{name}"
         | 
| 29 | 
            +
                      when :block then "&#{name}"
         | 
| 30 | 
            +
                      else '?'
         | 
| 31 | 
            +
                    end
         | 
| 32 | 
            +
                    show_value ? "#{name} #{value}" : name
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
                  "#{meth_obj.name}(#{args.join(', ')})"
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
              end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
              def format_arg binding, arg_name
         | 
| 39 | 
            +
                arg = binding.eval(arg_name.to_s)
         | 
| 40 | 
            +
                format_obj arg
         | 
| 41 | 
            +
              end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
              def first_line str
         | 
| 44 | 
            +
                str.split("\n").first
         | 
| 45 | 
            +
              end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
              def cut_string str
         | 
| 48 | 
            +
                str.length > 50 ? "#{str.first 50}..." : str
         | 
| 49 | 
            +
              end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
              PATH_TRASH = defined?(Rails) ? Rails.root.to_s : Dir.pwd
         | 
| 52 | 
            +
             | 
| 53 | 
            +
              def shorten_path(path)
         | 
| 54 | 
            +
                path.gsub( /^#{PATH_TRASH}\//, '')
         | 
| 55 | 
            +
              end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
              def format_obj(obj)
         | 
| 58 | 
            +
                if obj.is_a? String
         | 
| 59 | 
            +
                  format_obj2 cut_string first_line obj
         | 
| 60 | 
            +
                else
         | 
| 61 | 
            +
                  first_line format_obj2 obj
         | 
| 62 | 
            +
                end
         | 
| 63 | 
            +
              end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
              def format_obj2(obj)
         | 
| 66 | 
            +
                if @colorize
         | 
| 67 | 
            +
                  PryMoves::Painter.colorize obj
         | 
| 68 | 
            +
                else
         | 
| 69 | 
            +
                  i = obj.inspect
         | 
| 70 | 
            +
                  i.start_with?('#<') ? obj.class.to_s : i
         | 
| 71 | 
            +
                end
         | 
| 72 | 
            +
              end
         | 
| 73 | 
            +
             | 
| 74 | 
            +
            end
         | 
    
        data/lib/pry-moves/painter.rb
    CHANGED
    
    | @@ -14,13 +14,14 @@ module PryMoves::Painter | |
| 14 14 |  | 
| 15 15 | 
             
              def self.colorize(obj)
         | 
| 16 16 | 
             
                colored_str = Canvas.new
         | 
| 17 | 
            -
                 | 
| 17 | 
            +
                i = obj.inspect
         | 
| 18 | 
            +
                obj = obj.class if i.is_a?(String) && i.start_with?("#<")
         | 
| 18 19 | 
             
                catch (:cut) do
         | 
| 19 20 | 
             
                  Pry::ColorPrinter.pp obj, colored_str
         | 
| 20 21 | 
             
                end
         | 
| 21 22 | 
             
                colored_str.chomp
         | 
| 22 23 | 
             
              rescue => e
         | 
| 23 | 
            -
                "Inspect error: #{e}\n" +
         | 
| 24 | 
            +
                "⛔️ Inspect error: #{e}\n" +
         | 
| 24 25 | 
             
                  "#{e.backtrace.first(3).join("\n")}"
         | 
| 25 26 | 
             
              end
         | 
| 26 27 |  | 
    
        data/lib/pry-moves/pry_ext.rb
    CHANGED
    
    | @@ -1,31 +1,31 @@ | |
| 1 1 | 
             
            class << Pry
         | 
| 2 | 
            -
               | 
| 3 | 
            -
             | 
| 4 | 
            -
              def start_with_pry_nav(target = TOPLEVEL_BINDING, options = {})
         | 
| 5 | 
            -
                old_options = options.reject { |k, _| k == :pry_remote }
         | 
| 2 | 
            +
              alias pry_moves_origin_start start
         | 
| 6 3 |  | 
| 4 | 
            +
              def start(target = TOPLEVEL_BINDING, options = {})
         | 
| 7 5 | 
             
                if target.is_a?(Binding) && PryMoves.check_file_context(target)
         | 
| 8 6 | 
             
                  # Wrap the tracer around the usual Pry.start
         | 
| 9 | 
            -
                   | 
| 10 | 
            -
             | 
| 11 | 
            -
                   | 
| 7 | 
            +
                  original_verbosity = $VERBOSE
         | 
| 8 | 
            +
                  $VERBOSE = nil # Disable warnings for pry-moves
         | 
| 9 | 
            +
                  PryMoves::PryWrapper.new(target, options, self).run
         | 
| 10 | 
            +
                  $VERBOSE = original_verbosity
         | 
| 12 11 | 
             
                else
         | 
| 13 12 | 
             
                  # No need for the tracer unless we have a file context to step through
         | 
| 14 | 
            -
                   | 
| 13 | 
            +
                  pry_moves_origin_start(target, options)
         | 
| 15 14 | 
             
                end
         | 
| 16 15 | 
             
              end
         | 
| 17 16 |  | 
| 18 | 
            -
              alias_method :start, :start_with_pry_nav
         | 
| 19 17 | 
             
            end
         | 
| 20 18 |  | 
| 21 19 | 
             
            Binding.class_eval do
         | 
| 22 20 |  | 
| 21 | 
            +
              attr_accessor :index
         | 
| 22 | 
            +
             | 
| 23 23 | 
             
              alias pry_forced pry
         | 
| 24 24 |  | 
| 25 25 | 
             
              def pry
         | 
| 26 | 
            -
                 | 
| 27 | 
            -
             | 
| 28 | 
            -
                     | 
| 26 | 
            +
                if !Pry.config.disable_breakpoints and
         | 
| 27 | 
            +
                    # Don't start binding.pry when semaphore locked by current thread
         | 
| 28 | 
            +
                    PryMoves.synchronize_threads
         | 
| 29 29 | 
             
                  pry_forced
         | 
| 30 30 | 
             
                end
         | 
| 31 31 | 
             
              end
         | 
| @@ -34,6 +34,32 @@ end | |
| 34 34 |  | 
| 35 35 | 
             
            Pry.config.pager = false
         | 
| 36 36 |  | 
| 37 | 
            +
            Pry::Command.class_eval do
         | 
| 38 | 
            +
              class << self
         | 
| 39 | 
            +
                attr_accessor :original_user_input
         | 
| 40 | 
            +
              end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
              alias run_origin_for_pry_moves run
         | 
| 43 | 
            +
              def run(command_string, *args)
         | 
| 44 | 
            +
                Pry.config.original_user_input = self.class.original_user_input
         | 
| 45 | 
            +
                result = run_origin_for_pry_moves command_string, *args
         | 
| 46 | 
            +
                Pry.config.original_user_input = nil
         | 
| 47 | 
            +
                result
         | 
| 48 | 
            +
              end
         | 
| 49 | 
            +
            end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
            Pry::CommandSet.class_eval do
         | 
| 52 | 
            +
             | 
| 53 | 
            +
              alias alias_command_origin_for_pry_moves alias_command
         | 
| 54 | 
            +
             | 
| 55 | 
            +
              def alias_command(match, action, options = {})
         | 
| 56 | 
            +
                cmd = alias_command_origin_for_pry_moves match, action, options
         | 
| 57 | 
            +
                cmd.original_user_input = match
         | 
| 58 | 
            +
                cmd
         | 
| 59 | 
            +
              end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
            end
         | 
| 62 | 
            +
             | 
| 37 63 | 
             
            Pry::Command::Whereami.class_eval do
         | 
| 38 64 | 
             
              # Negligent function from Pry - evidently poor output format
         | 
| 39 65 | 
             
              # would be wanted to be changed often by developers,
         | 
| @@ -56,11 +82,19 @@ Pry::Command::Whereami.class_eval do | |
| 56 82 | 
             
              end
         | 
| 57 83 |  | 
| 58 84 | 
             
              def build_output
         | 
| 59 | 
            -
                lines = []
         | 
| 60 | 
            -
             | 
| 61 | 
            -
                 | 
| 85 | 
            +
                lines = ['']
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                formatter = PryMoves::Formatter.new
         | 
| 88 | 
            +
                prefix = Thread.current[:pry_moves_debug] ? "👾 " : ""
         | 
| 89 | 
            +
                lines << "#{prefix}#{formatter.shorten_path location}"
         | 
| 90 | 
            +
                lines << "   ." + formatter.method_signature(target)
         | 
| 62 91 | 
             
                lines << ''
         | 
| 63 92 | 
             
                lines << "#{code.with_line_numbers(use_line_numbers?).with_marker(marker).highlighted}"
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                lines << PryMoves::Watch.instance.output(target) unless PryMoves::Watch.instance.empty?
         | 
| 95 | 
            +
                lines.concat PryMoves.messages
         | 
| 96 | 
            +
                PryMoves.messages.clear
         | 
| 97 | 
            +
             | 
| 64 98 | 
             
                lines << ''
         | 
| 65 99 | 
             
                lines.join "\n"
         | 
| 66 100 | 
             
              end
         | 
| @@ -82,4 +116,18 @@ Pry::Code::LOC.class_eval do | |
| 82 116 | 
             
                tuple[0] = " #{marker} #{ line }"
         | 
| 83 117 | 
             
              end
         | 
| 84 118 |  | 
| 85 | 
            -
            end
         | 
| 119 | 
            +
            end
         | 
| 120 | 
            +
             | 
| 121 | 
            +
            Pry::Output.class_eval do
         | 
| 122 | 
            +
             | 
| 123 | 
            +
              alias pry_moves_origin_for_puts puts
         | 
| 124 | 
            +
             | 
| 125 | 
            +
              def puts *args
         | 
| 126 | 
            +
                first = args[0]
         | 
| 127 | 
            +
                if first.is_a? String and first.start_with? "(pry) output error"
         | 
| 128 | 
            +
                  first.slice! 400..-1
         | 
| 129 | 
            +
                end
         | 
| 130 | 
            +
                pry_moves_origin_for_puts *args
         | 
| 131 | 
            +
              end
         | 
| 132 | 
            +
             | 
| 133 | 
            +
            end if defined? Pry::Output
         | 
| @@ -2,24 +2,24 @@ require 'pry' unless defined? Pry | |
| 2 2 |  | 
| 3 3 | 
             
            module PryMoves
         | 
| 4 4 | 
             
            class PryWrapper
         | 
| 5 | 
            -
              def initialize(binding_, pry_start_options  | 
| 5 | 
            +
              def initialize(binding_, pry_start_options, pry)
         | 
| 6 6 | 
             
                @init_binding = binding_
         | 
| 7 7 | 
             
                @pry_start_options = pry_start_options   # Options to use for Pry.start
         | 
| 8 | 
            +
                @pry = pry
         | 
| 8 9 | 
             
              end
         | 
| 9 10 |  | 
| 10 | 
            -
              def run | 
| 11 | 
            +
              def run
         | 
| 11 12 | 
             
                PryMoves.lock
         | 
| 12 13 |  | 
| 13 | 
            -
                 | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
                   | 
| 19 | 
            -
             | 
| 14 | 
            +
                initial_frame = PryMoves::BindingsStack.new.initial_frame
         | 
| 15 | 
            +
                if not @pry_start_options[:pry_moves_loop] and
         | 
| 16 | 
            +
                    initial_frame.local_variable_defined? :debug_redirect
         | 
| 17 | 
            +
                  debug_redirect = initial_frame.local_variable_get(:debug_redirect)
         | 
| 18 | 
            +
                  PryMoves.messages << "⏩ redirected to #{debug_redirect}"
         | 
| 19 | 
            +
                  @command = {action: :step, binding: initial_frame}
         | 
| 20 | 
            +
                else
         | 
| 21 | 
            +
                  start_pry
         | 
| 20 22 | 
             
                end
         | 
| 21 | 
            -
                PryMoves.is_open = false
         | 
| 22 | 
            -
                Pry.config.marker = "=>"
         | 
| 23 23 |  | 
| 24 24 | 
             
                if @command
         | 
| 25 25 | 
             
                  trace_command
         | 
| @@ -30,11 +30,24 @@ class PryWrapper | |
| 30 30 | 
             
                  end
         | 
| 31 31 | 
             
                end
         | 
| 32 32 |  | 
| 33 | 
            -
                return_value
         | 
| 33 | 
            +
                @return_value
         | 
| 34 34 | 
             
              end
         | 
| 35 35 |  | 
| 36 36 | 
             
              private
         | 
| 37 37 |  | 
| 38 | 
            +
              def start_pry
         | 
| 39 | 
            +
                Pry.config.marker = "⛔️" if @pry_start_options[:exit_from_method]
         | 
| 40 | 
            +
                PryMoves.is_open = true
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                @command = catch(:breakout_nav) do      # Coordinates with PryMoves::Commands
         | 
| 43 | 
            +
                  @return_value = @pry.pry_moves_origin_start(@init_binding, @pry_start_options)
         | 
| 44 | 
            +
                  nil    # Nothing thrown == no navigational command
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                PryMoves.is_open = false
         | 
| 48 | 
            +
                Pry.config.marker = "=>"
         | 
| 49 | 
            +
              end
         | 
| 50 | 
            +
             | 
| 38 51 | 
             
              def trace_command
         | 
| 39 52 | 
             
                if @command[:action] == :debug
         | 
| 40 53 | 
             
                  wrap_debug
         | 
| @@ -61,9 +74,9 @@ class PryWrapper | |
| 61 74 | 
             
                  tracer = start_tracing
         | 
| 62 75 | 
             
                  begin
         | 
| 63 76 | 
             
                    @command[:binding].eval @command[:param]
         | 
| 64 | 
            -
                  rescue => e
         | 
| 77 | 
            +
                  rescue StandardError, SyntaxError => e
         | 
| 65 78 | 
             
                    Thread.current.set_trace_func nil
         | 
| 66 | 
            -
                    puts e
         | 
| 79 | 
            +
                    puts "❌️ #{e}"
         | 
| 67 80 | 
             
                  end
         | 
| 68 81 | 
             
                  tracer.stop_tracing
         | 
| 69 82 | 
             
                end.join
         | 
| @@ -73,9 +86,9 @@ class PryWrapper | |
| 73 86 |  | 
| 74 87 | 
             
              def start_tracing
         | 
| 75 88 | 
             
                @last_runtime_binding = @command[:binding]
         | 
| 76 | 
            -
                 | 
| 77 | 
            -
             | 
| 78 | 
            -
                 | 
| 89 | 
            +
                PryMoves::TraceCommand.trace @command, @pry_start_options do |binding|
         | 
| 90 | 
            +
                  Pry.start(binding, @pry_start_options)
         | 
| 91 | 
            +
                end
         | 
| 79 92 | 
             
              end
         | 
| 80 93 |  | 
| 81 94 | 
             
            end
         | 
| @@ -0,0 +1,38 @@ | |
| 1 | 
            +
            module PryMoves::Restartable
         | 
| 2 | 
            +
             | 
| 3 | 
            +
              attr_accessor :restart_requested, :reload_requested,
         | 
| 4 | 
            +
                :reload_rake_tasks
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              def restartable
         | 
| 7 | 
            +
                trigger :new_run
         | 
| 8 | 
            +
                yield
         | 
| 9 | 
            +
                re_execution
         | 
| 10 | 
            +
              rescue PryMoves::Restart
         | 
| 11 | 
            +
                self.restart_requested = false
         | 
| 12 | 
            +
                PryMoves.reset
         | 
| 13 | 
            +
                trigger :restart
         | 
| 14 | 
            +
                retry
         | 
| 15 | 
            +
              rescue PryMoves::Reload
         | 
| 16 | 
            +
                puts "🔮  try to use @ with reload"
         | 
| 17 | 
            +
                exit 3
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              def re_execution
         | 
| 21 | 
            +
                raise PryMoves::Restart if restart_requested
         | 
| 22 | 
            +
                raise PryMoves::Reload if reload_requested
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
             | 
| 26 | 
            +
            end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            class PryMoves::Restart < RuntimeError
         | 
| 29 | 
            +
            end
         | 
| 30 | 
            +
            class PryMoves::Reload < RuntimeError
         | 
| 31 | 
            +
            end
         | 
| 32 | 
            +
            RSpec::Support::AllExceptionsExceptOnesWeMustNotRescue::AVOID_RESCUING.concat [PryMoves::Restart, PryMoves::Reload] if defined? RSpec
         | 
| 33 | 
            +
             | 
| 34 | 
            +
            Pry.config.hooks.add_hook(:after_eval, :exit_on_re_execution) do |_, _, _pry_|
         | 
| 35 | 
            +
              if PryMoves.restart_requested or PryMoves.reload_requested
         | 
| 36 | 
            +
                Pry.run_command 'exit-all'
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
            end
         | 
    
        data/lib/pry-moves/version.rb
    CHANGED
    
    
    
        data/lib/pry-moves/watch.rb
    CHANGED
    
    | @@ -1,4 +1,5 @@ | |
| 1 1 | 
             
            require 'singleton'
         | 
| 2 | 
            +
            require 'set'
         | 
| 2 3 |  | 
| 3 4 | 
             
            class PryMoves::Watch
         | 
| 4 5 |  | 
| @@ -44,6 +45,8 @@ class PryMoves::Watch | |
| 44 45 | 
             
                "\033[1m#{cmd}\033[0m: #{format binding_.eval(cmd)}"
         | 
| 45 46 | 
             
              rescue NameError
         | 
| 46 47 | 
             
                "\033[1m#{cmd}\033[0m: <undefined>"
         | 
| 48 | 
            +
              rescue => e
         | 
| 49 | 
            +
                "\033[1m#{cmd}\033[0m: <#{e}>"
         | 
| 47 50 | 
             
              end
         | 
| 48 51 |  | 
| 49 52 | 
             
              def format(text)
         | 
    
        data/lib/pry-moves.rb
    CHANGED
    
    | @@ -1,19 +1,30 @@ | |
| 1 1 | 
             
            require 'pry' unless defined? Pry
         | 
| 2 2 |  | 
| 3 3 | 
             
            require 'pry-moves/version'
         | 
| 4 | 
            -
            require 'pry-moves/trace_commands'
         | 
| 5 | 
            -
            require 'pry-moves/traced_method'
         | 
| 6 | 
            -
            require 'pry-moves/tracer'
         | 
| 7 4 | 
             
            require 'pry-moves/pry_ext'
         | 
| 8 5 | 
             
            require 'pry-moves/commands'
         | 
| 9 | 
            -
            require 'pry-moves/ | 
| 6 | 
            +
            require 'pry-moves/add_suffix'
         | 
| 10 7 | 
             
            require 'pry-moves/pry_wrapper'
         | 
| 8 | 
            +
            require 'pry-moves/bindings_stack'
         | 
| 9 | 
            +
            require 'pry-moves/formatter'
         | 
| 11 10 | 
             
            require 'pry-moves/backtrace'
         | 
| 12 11 | 
             
            require 'pry-moves/watch'
         | 
| 13 | 
            -
            require 'pry-moves/helpers'
         | 
| 14 12 | 
             
            require 'pry-moves/painter'
         | 
| 13 | 
            +
            require 'pry-moves/restartable'
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            require 'commands/traced_method'
         | 
| 16 | 
            +
            require 'commands/trace_helpers'
         | 
| 17 | 
            +
            require 'commands/trace_command'
         | 
| 18 | 
            +
            require 'commands/debug'
         | 
| 19 | 
            +
            require 'commands/finish'
         | 
| 20 | 
            +
            require 'commands/goto'
         | 
| 21 | 
            +
            require 'commands/iterate'
         | 
| 22 | 
            +
            require 'commands/next'
         | 
| 23 | 
            +
            require 'commands/next_breakpoint'
         | 
| 24 | 
            +
            require 'commands/step'
         | 
| 15 25 |  | 
| 16 26 | 
             
            require 'pry-stack_explorer/pry-stack_explorer'
         | 
| 27 | 
            +
            require 'debug_sugar'
         | 
| 17 28 |  | 
| 18 29 | 
             
            # Optionally load pry-remote monkey patches
         | 
| 19 30 | 
             
            require 'pry-moves/pry_remote_ext' if defined? PryRemote
         | 
| @@ -22,8 +33,30 @@ module PryMoves | |
| 22 33 | 
             
              TRACE_IGNORE_FILES = Dir[File.join(File.dirname(__FILE__), '**', '*.rb')].map { |f| File.expand_path(f) }
         | 
| 23 34 |  | 
| 24 35 | 
             
              extend self
         | 
| 36 | 
            +
              extend PryMoves::Restartable
         | 
| 37 | 
            +
             | 
| 38 | 
            +
              attr_accessor :is_open, :trace,
         | 
| 39 | 
            +
                :stop_on_breakpoints, :launched_specs_examples, :debug_called_times
         | 
| 40 | 
            +
             | 
| 41 | 
            +
              def reset
         | 
| 42 | 
            +
                self.launched_specs_examples = 0
         | 
| 43 | 
            +
                self.stop_on_breakpoints = true
         | 
| 44 | 
            +
                self.debug_called_times = 0
         | 
| 45 | 
            +
              end
         | 
| 25 46 |  | 
| 26 | 
            -
               | 
| 47 | 
            +
              def debug(message = nil, at: nil)
         | 
| 48 | 
            +
                pry_moves_stack_root = true
         | 
| 49 | 
            +
                PryMoves.re_execution
         | 
| 50 | 
            +
                if PryMoves.stop_on_breakpoints
         | 
| 51 | 
            +
                  if at
         | 
| 52 | 
            +
                    self.debug_called_times += 1
         | 
| 53 | 
            +
                    return unless self.debug_called_times == at
         | 
| 54 | 
            +
                  end
         | 
| 55 | 
            +
                  PryMoves.messages << message if message
         | 
| 56 | 
            +
                  binding.pry
         | 
| 57 | 
            +
                  PryMoves.re_execution
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
              end
         | 
| 27 60 |  | 
| 28 61 | 
             
              # Checks that a binding is in a local file context. Extracted from
         | 
| 29 62 | 
             
              # https://github.com/pry/pry/blob/master/lib/pry/default_commands/context.rb
         | 
| @@ -36,9 +69,18 @@ module PryMoves | |
| 36 69 | 
             
                @semaphore ||= Mutex.new
         | 
| 37 70 | 
             
              end
         | 
| 38 71 |  | 
| 72 | 
            +
              def messages
         | 
| 73 | 
            +
                @messages ||= []
         | 
| 74 | 
            +
              end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
              def add_command(command, &block)
         | 
| 77 | 
            +
                Pry.commands.block_command command, "", &block
         | 
| 78 | 
            +
              end
         | 
| 79 | 
            +
             | 
| 39 80 | 
             
              def locked?
         | 
| 40 81 | 
             
                semaphore.locked?
         | 
| 41 82 | 
             
              end
         | 
| 83 | 
            +
              alias tracing? locked?
         | 
| 42 84 |  | 
| 43 85 | 
             
              def lock
         | 
| 44 86 | 
             
                semaphore.lock unless semaphore.locked?
         | 
| @@ -59,6 +101,23 @@ module PryMoves | |
| 59 101 | 
             
                true
         | 
| 60 102 | 
             
              end
         | 
| 61 103 |  | 
| 104 | 
            +
              def trigger(event)
         | 
| 105 | 
            +
                triggers[event].each &:call
         | 
| 106 | 
            +
              end
         | 
| 107 | 
            +
             | 
| 108 | 
            +
              def triggers
         | 
| 109 | 
            +
                @triggers ||= Hash.new do |hash, key|
         | 
| 110 | 
            +
                  hash[key] = []
         | 
| 111 | 
            +
                end
         | 
| 112 | 
            +
              end
         | 
| 113 | 
            +
             | 
| 114 | 
            +
              def on(trigger, &block)
         | 
| 115 | 
            +
                triggers[trigger] << block
         | 
| 116 | 
            +
              end
         | 
| 117 | 
            +
             | 
| 62 118 | 
             
              # Reference to currently running pry-remote server. Used by the tracer.
         | 
| 63 119 | 
             
              attr_accessor :current_remote_server
         | 
| 64 120 | 
             
            end
         | 
| 121 | 
            +
             | 
| 122 | 
            +
            PryMoves.reset
         | 
| 123 | 
            +
            PryMoves.trace = true if ENV['TRACE_MOVES']
         |