Module: PryStackExplorer
- Defined in:
- lib/pry-stack_explorer.rb,
lib/pry-stack_explorer/version.rb,
lib/pry-stack_explorer/commands.rb,
lib/pry-stack_explorer/frame_manager.rb,
lib/pry-stack_explorer/when_started_hook.rb
Defined Under Namespace
Modules: FrameHelpers Classes: FrameManager, WhenStartedHook
Constant Summary collapse
- VERSION =
"0.3.4"
- Commands =
Pry::CommandSet.new do create_command "up", "Go up to the caller's context. Accepts optional numeric parameter for how many frames to move up." do include FrameHelpers <<-BANNER Usage: up [OPTIONS] Go up to the caller's context. Accepts optional numeric parameter for how many frames to move up. e.g: up e.g: up 3 BANNER def process inc = args.first.nil? ? 1 : args.first.to_i if !frame_manager raise Pry::CommandError, "Nowhere to go!" else frame_manager.change_frame_to frame_manager.binding_index + inc end end end create_command "down", "Go down to the callee's context. Accepts optional numeric parameter for how many frames to move down." do include FrameHelpers <<-BANNER Usage: down [OPTIONS] Go down to the callee's context. Accepts optional numeric parameter for how many frames to move down. e.g: down e.g: down 3 BANNER def process inc = args.first.nil? ? 1 : args.first.to_i if !frame_manager raise Pry::CommandError, "Nowhere to go!" else if frame_manager.binding_index - inc < 0 raise Pry::CommandError, "At bottom of stack, cannot go further!" else frame_manager.change_frame_to frame_manager.binding_index - inc end end end end create_command "show-stack", "Show all frames" do include FrameHelpers <<-BANNER Usage: show-stack [OPTIONS] Show all accessible stack frames. e.g: show-stack -v BANNER def (opt) opt.on :v, :verbose, "Include extra information." end def process if !frame_manager output.puts "No caller stack available!" else if !frame_manager.user[:stack_content] content = "" content << "\n#{text.bold("Showing all accessible frames in stack (#{frame_manager.bindings.size} in total):")}\n--\n" frame_manager.each_with_index do |b, i| if i == frame_manager.binding_index content << "=> ##{i} #{frame_info(b, opts[:v])}\n" else content << " ##{i} #{frame_info(b, opts[:v])}\n" end end frame_manager.user[:stack_content] = content end stagger_output frame_manager.user[:stack_content] end end end 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 include FrameHelpers <<-BANNER Usage: frame [OPTIONS] Switch to a particular frame. Accepts numeric parameter for the target frame to switch to (use with show-stack). Negative frame numbers allowed. When given no parameter show information about the current frame. e.g: frame 4 #=> jump to the 4th frame e.g: frame -2 #=> jump to the second-to-last frame e.g: frame #=> show information info about current frame BANNER def process if !frame_manager raise Pry::CommandError, "nowhere to go!" else if args[0] frame_manager.change_frame_to args[0].to_i else output.puts "##{frame_manager.binding_index} #{frame_info(target, true)}" end end end end end
Class Method Summary collapse
-
.bindings_equal?(b1, b2) ⇒ Boolean
Simple test to check whether two
Binding
objects are equal. -
.clear_frame_managers(_pry_) ⇒ Object
(also: delete_frame_managers)
Clear the stack of frame managers for the Pry instance.
-
.create_and_push_frame_manager(bindings, _pry_, options = {}) ⇒ Object
Create a
Pry::FrameManager
object and push it onto the frame manager stack for the relevant_pry_
instance. -
.frame_hash ⇒ Hash
The hash storing all frames for all Pry instances for the current thread.
-
.frame_manager(_pry_) ⇒ PryStackExplorer::FrameManager
The currently active frame manager.
-
.frame_managers(_pry_) ⇒ Array
Return the complete frame manager stack for the Pry instance.
-
.pop_frame_manager(_pry_) ⇒ Pry::FrameManager
Delete the currently active frame manager.
-
.pop_helper(popped_fm, _pry_) ⇒ Object
Restore the Pry instance to operate on the previous binding.
-
.push_helper(fm, options = {}) ⇒ Object
Update the Pry instance to operate on the specified frame for the current frame manager.
Class Method Details
.bindings_equal?(b1, b2) ⇒ Boolean
Simple test to check whether two Binding
objects are equal.
109 110 111 112 113 114 |
# File 'lib/pry-stack_explorer.rb', line 109 def bindings_equal?(b1, b2) (b1.eval('self') == b2.eval('self')) && (b1.eval('__method__') == b2.eval('__method__')) && (b1.eval('local_variables').map { |v| b1.eval("#{v}") } == b2.eval('local_variables').map { |v| b2.eval("#{v}") }) end |
.clear_frame_managers(_pry_) ⇒ Object Also known as: delete_frame_managers
Clear the stack of frame managers for the Pry instance
93 94 95 96 |
# File 'lib/pry-stack_explorer.rb', line 93 def clear_frame_managers(_pry_) pop_frame_manager(_pry_) until frame_managers(_pry_).empty? frame_hash.delete(_pry_) # this line should be unnecessary! end |
.create_and_push_frame_manager(bindings, _pry_, options = {}) ⇒ Object
Create a Pry::FrameManager
object and push it onto the frame
manager stack for the relevant _pry_
instance.
35 36 37 38 39 40 |
# File 'lib/pry-stack_explorer.rb', line 35 def create_and_push_frame_manager(bindings, _pry_, ={}) fm = FrameManager.new(bindings, _pry_) frame_hash[_pry_].push fm push_helper(fm, ) fm end |
.frame_hash ⇒ Hash
Returns The hash storing all frames for all Pry instances for the current thread.
19 20 21 |
# File 'lib/pry-stack_explorer.rb', line 19 def frame_hash Thread.current[:__pry_frame_managers__] ||= Hash.new { |h, k| h[k] = [] } end |
.frame_manager(_pry_) ⇒ PryStackExplorer::FrameManager
Returns The currently active frame manager.
101 102 103 |
# File 'lib/pry-stack_explorer.rb', line 101 def frame_manager(_pry_) frame_hash[_pry_].last end |
.frame_managers(_pry_) ⇒ Array
Return the complete frame manager stack for the Pry instance
27 28 29 |
# File 'lib/pry-stack_explorer.rb', line 27 def frame_managers(_pry_) frame_hash[_pry_] end |
.pop_frame_manager(_pry_) ⇒ Pry::FrameManager
Delete the currently active frame manager
60 61 62 63 64 65 66 |
# File 'lib/pry-stack_explorer.rb', line 60 def pop_frame_manager(_pry_) return if frame_managers(_pry_).empty? popped_fm = frame_managers(_pry_).pop pop_helper(popped_fm, _pry_) popped_fm end |
.pop_helper(popped_fm, _pry_) ⇒ Object
Restore the Pry instance to operate on the previous binding. Also responsible for restoring Pry instance's backtrace.
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
# File 'lib/pry-stack_explorer.rb', line 72 def pop_helper(popped_fm, _pry_) if frame_managers(_pry_).empty? if _pry_.binding_stack.empty? _pry_.binding_stack.push popped_fm.prior_binding else _pry_.binding_stack[-1] = popped_fm.prior_binding end frame_hash.delete(_pry_) else frame_manager(_pry_).refresh_frame(false) end # restore backtrace _pry_.backtrace = popped_fm.prior_backtrace end |
.push_helper(fm, options = {}) ⇒ Object
Update the Pry instance to operate on the specified frame for the current frame manager.
46 47 48 49 50 51 52 |
# File 'lib/pry-stack_explorer.rb', line 46 def push_helper(fm, ={}) = { :initial_frame => 0 }.merge!() fm.change_frame_to([:initial_frame], false) end |