pry-stack_explorer 0.3.9 → 0.4.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.
- data/README.md +1 -0
- data/lib/pry-stack_explorer/commands.rb +80 -51
- data/lib/pry-stack_explorer/version.rb +1 -1
- data/pry-stack_explorer.gemspec +2 -2
- data/test/test_commands.rb +79 -1
- metadata +2 -2
    
        data/README.md
    CHANGED
    
    | @@ -33,6 +33,7 @@ After installing `pry-stack_explorer`, just start Pry as normal (typically via a | |
| 33 33 | 
             
            * Install the [gem](https://rubygems.org/gems/pry-stack_explorer): `gem install pry-stack_explorer`
         | 
| 34 34 | 
             
            * Read the [documentation](http://rdoc.info/github/banister/pry-stack_explorer/master/file/README.md)
         | 
| 35 35 | 
             
            * See the [source code](http://github.com/pry/pry-stack_explorer)
         | 
| 36 | 
            +
            * See the [wiki](https://github.com/pry/pry-stack_explorer/wiki) for in-depth usage information.
         | 
| 36 37 |  | 
| 37 38 | 
             
            Example: Moving around between frames
         | 
| 38 39 | 
             
            --------
         | 
| @@ -85,50 +85,118 @@ module PryStackExplorer | |
| 85 85 | 
             
                    "#{meth_obj.name_with_owner}(UNKNOWN) (undefined method)"
         | 
| 86 86 | 
             
                  end
         | 
| 87 87 | 
             
                end
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                #  Regexp.new(args[0])
         | 
| 90 | 
            +
                def find_frame_by_regex(regex, up_or_down)
         | 
| 91 | 
            +
                  start_index = frame_manager.binding_index
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                  if up_or_down == :down
         | 
| 94 | 
            +
                    enum = frame_manager.bindings[0..start_index - 1].reverse_each
         | 
| 95 | 
            +
                  else
         | 
| 96 | 
            +
                    enum = frame_manager.bindings[start_index + 1..-1]
         | 
| 97 | 
            +
                  end
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                  new_frame = enum.find do |b|
         | 
| 100 | 
            +
                    b.eval("__method__").to_s =~ regex
         | 
| 101 | 
            +
                  end
         | 
| 102 | 
            +
             | 
| 103 | 
            +
                  frame_index = frame_manager.bindings.index(new_frame)
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                  if frame_index
         | 
| 106 | 
            +
                    frame_index
         | 
| 107 | 
            +
                  else
         | 
| 108 | 
            +
                    raise Pry::CommandError, "No frame that matches #{regex.source} found!"
         | 
| 109 | 
            +
                  end
         | 
| 110 | 
            +
                end
         | 
| 88 111 | 
             
              end
         | 
| 89 112 |  | 
| 90 113 | 
             
              Commands = Pry::CommandSet.new do
         | 
| 91 | 
            -
                create_command "up", "Go up to the caller's context. | 
| 114 | 
            +
                create_command "up", "Go up to the caller's context." do
         | 
| 92 115 | 
             
                  include FrameHelpers
         | 
| 93 116 |  | 
| 94 117 | 
             
                  banner <<-BANNER
         | 
| 95 118 | 
             
                    Usage: up [OPTIONS]
         | 
| 96 119 | 
             
                      Go up to the caller's context. Accepts optional numeric parameter for how many frames to move up.
         | 
| 97 | 
            -
                       | 
| 98 | 
            -
                      e.g: up  | 
| 120 | 
            +
                      Also accepts a string (regex) instead of numeric; for jumping to nearest parent method frame which matches the regex.
         | 
| 121 | 
            +
                      e.g: up      #=> Move up 1 stack frame.
         | 
| 122 | 
            +
                      e.g: up 3    #=> Move up 2 stack frames.
         | 
| 123 | 
            +
                      e.g: up meth #=> Jump to nearest parent stack frame whose method matches /meth/ regex, i.e `my_method`.
         | 
| 99 124 | 
             
                  BANNER
         | 
| 100 125 |  | 
| 101 126 | 
             
                  def process
         | 
| 102 | 
            -
                    inc = args.first.nil? ? 1 : args.first | 
| 127 | 
            +
                    inc = args.first.nil? ? "1" : args.first
         | 
| 103 128 |  | 
| 104 129 | 
             
                    if !frame_manager
         | 
| 105 130 | 
             
                      raise Pry::CommandError, "Nowhere to go!"
         | 
| 106 131 | 
             
                    else
         | 
| 107 | 
            -
                       | 
| 132 | 
            +
                      if inc =~ /\d+/
         | 
| 133 | 
            +
                        frame_manager.change_frame_to frame_manager.binding_index + inc.to_i
         | 
| 134 | 
            +
                      elsif inc =~ /^[^-].*$/
         | 
| 135 | 
            +
                        new_frame_index = find_frame_by_regex(Regexp.new(inc), :up)
         | 
| 136 | 
            +
                        frame_manager.change_frame_to new_frame_index
         | 
| 137 | 
            +
                      end
         | 
| 108 138 | 
             
                    end
         | 
| 109 139 | 
             
                  end
         | 
| 110 140 | 
             
                end
         | 
| 111 141 |  | 
| 112 | 
            -
                create_command "down", "Go down to the callee's context. | 
| 142 | 
            +
                create_command "down", "Go down to the callee's context." do
         | 
| 113 143 | 
             
                  include FrameHelpers
         | 
| 114 144 |  | 
| 115 145 | 
             
                  banner <<-BANNER
         | 
| 116 146 | 
             
                    Usage: down [OPTIONS]
         | 
| 117 147 | 
             
                      Go down to the callee's context. Accepts optional numeric parameter for how many frames to move down.
         | 
| 118 | 
            -
                       | 
| 119 | 
            -
                      e.g: down  | 
| 148 | 
            +
                      Also accepts a string (regex) instead of numeric; for jumping to nearest child method frame which matches the regex.
         | 
| 149 | 
            +
                      e.g: down      #=> Move down 1 stack frame.
         | 
| 150 | 
            +
                      e.g: down 3    #=> Move down 2 stack frames.
         | 
| 151 | 
            +
                      e.g: down meth #=> ump to nearest child stack frame whose method matches /meth/ regex, i.e `my_method`.
         | 
| 120 152 | 
             
                  BANNER
         | 
| 121 153 |  | 
| 122 154 | 
             
                  def process
         | 
| 123 | 
            -
                    inc = args.first.nil? ? 1 : args.first | 
| 155 | 
            +
                    inc = args.first.nil? ? "1" : args.first
         | 
| 124 156 |  | 
| 125 157 | 
             
                    if !frame_manager
         | 
| 126 158 | 
             
                      raise Pry::CommandError, "Nowhere to go!"
         | 
| 127 159 | 
             
                    else
         | 
| 128 | 
            -
                      if  | 
| 129 | 
            -
                         | 
| 160 | 
            +
                      if inc =~ /\d+/
         | 
| 161 | 
            +
                        if frame_manager.binding_index - inc.to_i < 0
         | 
| 162 | 
            +
                          raise Pry::CommandError, "At bottom of stack, cannot go further!"
         | 
| 163 | 
            +
                        else
         | 
| 164 | 
            +
                          frame_manager.change_frame_to frame_manager.binding_index - inc.to_i
         | 
| 165 | 
            +
                        end
         | 
| 166 | 
            +
                      elsif inc =~ /^[^-].*$/
         | 
| 167 | 
            +
                        new_frame_index = find_frame_by_regex(Regexp.new(inc), :down)
         | 
| 168 | 
            +
                        frame_manager.change_frame_to new_frame_index
         | 
| 169 | 
            +
                      end
         | 
| 170 | 
            +
                    end
         | 
| 171 | 
            +
                  end
         | 
| 172 | 
            +
                end
         | 
| 173 | 
            +
             | 
| 174 | 
            +
                create_command "frame", "Switch to a particular frame." do
         | 
| 175 | 
            +
                  include FrameHelpers
         | 
| 176 | 
            +
             | 
| 177 | 
            +
                  banner <<-BANNER
         | 
| 178 | 
            +
                    Usage: frame [OPTIONS]
         | 
| 179 | 
            +
                      Switch to a particular frame. Accepts numeric parameter (or regex for method name) for the target frame to switch to (use with show-stack).
         | 
| 180 | 
            +
                      Negative frame numbers allowed. When given no parameter show information about the current frame.
         | 
| 181 | 
            +
             | 
| 182 | 
            +
                      e.g: frame 4         #=> jump to the 4th frame
         | 
| 183 | 
            +
                      e.g: frame meth      #=> jump to nearest parent stack frame whose method matches /meth/ regex, i.e `my_method`
         | 
| 184 | 
            +
                      e.g: frame -2        #=> jump to the second-to-last frame
         | 
| 185 | 
            +
                      e.g: frame           #=> show information info about current frame
         | 
| 186 | 
            +
                  BANNER
         | 
| 187 | 
            +
             | 
| 188 | 
            +
                  def process
         | 
| 189 | 
            +
                    if !frame_manager
         | 
| 190 | 
            +
                      raise Pry::CommandError, "nowhere to go!"
         | 
| 191 | 
            +
                    else
         | 
| 192 | 
            +
             | 
| 193 | 
            +
                      if args[0] =~ /\d+/
         | 
| 194 | 
            +
                        frame_manager.change_frame_to args[0].to_i
         | 
| 195 | 
            +
                      elsif args[0] =~ /^[^-].*$/
         | 
| 196 | 
            +
                        new_frame_index = find_frame_by_regex(Regexp.new(args[0]), :up)
         | 
| 197 | 
            +
                        frame_manager.change_frame_to new_frame_index
         | 
| 130 198 | 
             
                      else
         | 
| 131 | 
            -
                         | 
| 199 | 
            +
                        output.puts "##{frame_manager.binding_index} #{frame_info(target, true)}"
         | 
| 132 200 | 
             
                      end
         | 
| 133 201 | 
             
                    end
         | 
| 134 202 | 
             
                  end
         | 
| @@ -212,44 +280,5 @@ module PryStackExplorer | |
| 212 280 |  | 
| 213 281 | 
             
                  end
         | 
| 214 282 | 
             
                end
         | 
| 215 | 
            -
             | 
| 216 | 
            -
                create_command "frame", "Switch to a particular frame. Accepts numeric parameter for the target frame to switch to (use with show-stack). Negative frame numbers allowed." do
         | 
| 217 | 
            -
                  include FrameHelpers
         | 
| 218 | 
            -
             | 
| 219 | 
            -
                  banner <<-BANNER
         | 
| 220 | 
            -
                    Usage: frame [OPTIONS]
         | 
| 221 | 
            -
                      Switch to a particular frame. Accepts numeric parameter (or regex for method name) for the target frame to switch to (use with show-stack).
         | 
| 222 | 
            -
                      Negative frame numbers allowed. When given no parameter show information about the current frame.
         | 
| 223 | 
            -
             | 
| 224 | 
            -
                      e.g: frame 4         #=> jump to the 4th frame
         | 
| 225 | 
            -
                      e.g: frame meth      #=> jump to nearest parent stack frame whose method matches /meth/ regex, i.e `my_method`
         | 
| 226 | 
            -
                      e.g: frame -2        #=> jump to the second-to-last frame
         | 
| 227 | 
            -
                      e.g: frame           #=> show information info about current frame
         | 
| 228 | 
            -
                  BANNER
         | 
| 229 | 
            -
             | 
| 230 | 
            -
                  def process
         | 
| 231 | 
            -
                    if !frame_manager
         | 
| 232 | 
            -
                      raise Pry::CommandError, "nowhere to go!"
         | 
| 233 | 
            -
                    else
         | 
| 234 | 
            -
             | 
| 235 | 
            -
                      if args[0] =~ /\d+/
         | 
| 236 | 
            -
                        frame_manager.change_frame_to args[0].to_i
         | 
| 237 | 
            -
                      elsif args[0] =~ /^[^-].*$/
         | 
| 238 | 
            -
                        new_frame_index = frame_manager.each_with_index.find_index do |b, i|
         | 
| 239 | 
            -
                          b.eval("__method__").to_s =~ Regexp.new(args[0]) && i > frame_manager.binding_index
         | 
| 240 | 
            -
                        end
         | 
| 241 | 
            -
             | 
| 242 | 
            -
                        if new_frame_index
         | 
| 243 | 
            -
                          frame_manager.change_frame_to new_frame_index
         | 
| 244 | 
            -
                        else
         | 
| 245 | 
            -
                          raise Pry::CommandError, "No parent frame that matches #{args[0]} found!"
         | 
| 246 | 
            -
                        end
         | 
| 247 | 
            -
             | 
| 248 | 
            -
                      else
         | 
| 249 | 
            -
                        output.puts "##{frame_manager.binding_index} #{frame_info(target, true)}"
         | 
| 250 | 
            -
                      end
         | 
| 251 | 
            -
                    end
         | 
| 252 | 
            -
                  end
         | 
| 253 | 
            -
                end
         | 
| 254 283 | 
             
              end
         | 
| 255 284 | 
             
            end
         | 
    
        data/pry-stack_explorer.gemspec
    CHANGED
    
    | @@ -2,11 +2,11 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            Gem::Specification.new do |s|
         | 
| 4 4 | 
             
              s.name = "pry-stack_explorer"
         | 
| 5 | 
            -
              s.version = "0. | 
| 5 | 
            +
              s.version = "0.4.0"
         | 
| 6 6 |  | 
| 7 7 | 
             
              s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
         | 
| 8 8 | 
             
              s.authors = ["John Mair (banisterfiend)"]
         | 
| 9 | 
            -
              s.date = "2012-02- | 
| 9 | 
            +
              s.date = "2012-02-17"
         | 
| 10 10 | 
             
              s.description = "Walk the stack in a Pry session"
         | 
| 11 11 | 
             
              s.email = "jrmair@gmail.com"
         | 
| 12 12 | 
             
              s.files = [".gemtest", ".gitignore", ".travis.yml", ".yardopts", "CHANGELOG", "Gemfile", "LICENSE", "README.md", "Rakefile", "examples/example.rb", "examples/example2.rb", "lib/pry-stack_explorer.rb", "lib/pry-stack_explorer/commands.rb", "lib/pry-stack_explorer/frame_manager.rb", "lib/pry-stack_explorer/version.rb", "lib/pry-stack_explorer/when_started_hook.rb", "pry-stack_explorer.gemspec", "test/helper.rb", "test/test_commands.rb", "test/test_frame_manager.rb", "test/test_stack_explorer.rb", "tester.rb"]
         | 
    
        data/test/test_commands.rb
    CHANGED
    
    | @@ -45,6 +45,44 @@ describe PryStackExplorer::Commands do | |
| 45 45 | 
             
                  @o.first_method.should  == :bang
         | 
| 46 46 | 
             
                  @o.second_method.should == :bing
         | 
| 47 47 | 
             
                end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                describe "by method name regex" do
         | 
| 50 | 
            +
                  it 'should move to the method name that matches the regex' do
         | 
| 51 | 
            +
                    redirect_pry_io(InputTester.new("@first_method = __method__",
         | 
| 52 | 
            +
                                                    "up bi",
         | 
| 53 | 
            +
                                                    "@second_method = __method__",
         | 
| 54 | 
            +
                                                    "exit-all"), out=StringIO.new) do
         | 
| 55 | 
            +
                      @o.bing
         | 
| 56 | 
            +
                    end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                    @o.first_method.should  == :bang
         | 
| 59 | 
            +
                    @o.second_method.should == :bing
         | 
| 60 | 
            +
                  end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                  it 'should move through all methods that match regex in order' do
         | 
| 63 | 
            +
                    redirect_pry_io(InputTester.new("@first_method = __method__",
         | 
| 64 | 
            +
                                                    "up b",
         | 
| 65 | 
            +
                                                    "@second_method = __method__",
         | 
| 66 | 
            +
                                                    "up b",
         | 
| 67 | 
            +
                                                    "@third_method = __method__",
         | 
| 68 | 
            +
                                                    "exit-all"), out=StringIO.new) do
         | 
| 69 | 
            +
                      @o.bing
         | 
| 70 | 
            +
                    end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                    @o.first_method.should  == :bang
         | 
| 73 | 
            +
                    @o.second_method.should == :bong
         | 
| 74 | 
            +
                    @o.third_method.should  == :bing
         | 
| 75 | 
            +
                  end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                  it 'should error if it cant find frame to match regex' do
         | 
| 78 | 
            +
                    redirect_pry_io(InputTester.new("up conrad_irwin",
         | 
| 79 | 
            +
                                                    "exit-all"), out=StringIO.new) do
         | 
| 80 | 
            +
                      @o.bing
         | 
| 81 | 
            +
                    end
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                    out.string.should =~ /Error: No frame that matches/
         | 
| 84 | 
            +
                  end
         | 
| 85 | 
            +
                end
         | 
| 48 86 | 
             
              end
         | 
| 49 87 |  | 
| 50 88 | 
             
              describe "down" do
         | 
| @@ -75,6 +113,46 @@ describe PryStackExplorer::Commands do | |
| 75 113 | 
             
                  @o.first_method.should  == :bing
         | 
| 76 114 | 
             
                  @o.second_method.should == :bang
         | 
| 77 115 | 
             
                end
         | 
| 116 | 
            +
             | 
| 117 | 
            +
                describe "by method name regex" do
         | 
| 118 | 
            +
                  it 'should move to the method name that matches the regex' do
         | 
| 119 | 
            +
                    redirect_pry_io(InputTester.new("frame -1",
         | 
| 120 | 
            +
                                                    "down bo",
         | 
| 121 | 
            +
                                                    "@first_method = __method__",
         | 
| 122 | 
            +
                                                    "exit-all"), out=StringIO.new) do
         | 
| 123 | 
            +
                      @o.bing
         | 
| 124 | 
            +
                    end
         | 
| 125 | 
            +
             | 
| 126 | 
            +
                    @o.first_method.should == :bong
         | 
| 127 | 
            +
                  end
         | 
| 128 | 
            +
             | 
| 129 | 
            +
                  it 'should move through all methods that match regex in order' do
         | 
| 130 | 
            +
                    redirect_pry_io(InputTester.new("frame bing",
         | 
| 131 | 
            +
                                                    "@first_method = __method__",
         | 
| 132 | 
            +
                                                    "down b",
         | 
| 133 | 
            +
                                                    "@second_method = __method__",
         | 
| 134 | 
            +
                                                    "down b",
         | 
| 135 | 
            +
                                                    "@third_method = __method__",
         | 
| 136 | 
            +
                                                    "exit-all"), out=StringIO.new) do
         | 
| 137 | 
            +
                      @o.bing
         | 
| 138 | 
            +
                    end
         | 
| 139 | 
            +
             | 
| 140 | 
            +
                    @o.first_method.should  == :bing
         | 
| 141 | 
            +
                    @o.second_method.should == :bong
         | 
| 142 | 
            +
                    @o.third_method.should  == :bang
         | 
| 143 | 
            +
                  end
         | 
| 144 | 
            +
             | 
| 145 | 
            +
                  it 'should error if it cant find frame to match regex' do
         | 
| 146 | 
            +
                    redirect_pry_io(InputTester.new("frame -1",
         | 
| 147 | 
            +
                                                    "down conrad_irwin",
         | 
| 148 | 
            +
                                                    "exit-all"), out=StringIO.new) do
         | 
| 149 | 
            +
                      @o.bing
         | 
| 150 | 
            +
                    end
         | 
| 151 | 
            +
             | 
| 152 | 
            +
                    out.string.should =~ /Error: No frame that matches/
         | 
| 153 | 
            +
                  end
         | 
| 154 | 
            +
                end
         | 
| 155 | 
            +
             | 
| 78 156 | 
             
              end
         | 
| 79 157 |  | 
| 80 158 | 
             
              describe "frame" do
         | 
| @@ -96,7 +174,7 @@ describe PryStackExplorer::Commands do | |
| 96 174 | 
             
                      @o.bing
         | 
| 97 175 | 
             
                    end
         | 
| 98 176 |  | 
| 99 | 
            -
                    out.string.should =~ /Error: No  | 
| 177 | 
            +
                    out.string.should =~ /Error: No frame that matches/
         | 
| 100 178 | 
             
                  end
         | 
| 101 179 |  | 
| 102 180 | 
             
                end
         | 
    
        metadata
    CHANGED
    
    | @@ -2,7 +2,7 @@ | |
| 2 2 | 
             
            name: pry-stack_explorer
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 4 | 
             
              prerelease: 
         | 
| 5 | 
            -
              version: 0. | 
| 5 | 
            +
              version: 0.4.0
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors: 
         | 
| 8 8 | 
             
            - John Mair (banisterfiend)
         | 
| @@ -10,7 +10,7 @@ autorequire: | |
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 12 |  | 
| 13 | 
            -
            date: 2012-02- | 
| 13 | 
            +
            date: 2012-02-17 00:00:00 Z
         | 
| 14 14 | 
             
            dependencies: 
         | 
| 15 15 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| 16 16 | 
             
              name: binding_of_caller
         |