module PryStackExplorer::FrameHelpers

def find_frame_by_block(up_or_down)

def find_frame_by_block(up_or_down)
  start_index = frame_manager.binding_index
  if up_or_down == :down
    enum = frame_manager.bindings[0..start_index - 1].reverse_each
  else
    enum = frame_manager.bindings[start_index + 1..-1]
  end
  new_frame = enum.find do |b|
    yield(b)
  end
  frame_manager.bindings.index(new_frame)
end

def find_frame_by_object_regex(class_regex, method_regex, up_or_down)

def find_frame_by_object_regex(class_regex, method_regex, up_or_down)
  frame_index = find_frame_by_block(up_or_down) do |b|
    class_match = b.eval("self.class").to_s =~ class_regex
    meth_match = b.eval("__method__").to_s =~ method_regex
    class_match && meth_match
  end
  if frame_index
    frame_index
  else
    raise Pry::CommandError, "No frame that matches #{class_regex.source}" + '#' + "#{method_regex.source} found!"
  end
end

def find_frame_by_regex(regex, up_or_down)

Regexp.new(args[0])
def find_frame_by_regex(regex, up_or_down)
  frame_index = find_frame_by_block(up_or_down) do |b|
    b.eval("__method__").to_s =~ regex
  end
  if frame_index
    frame_index
  else
    raise Pry::CommandError, "No frame that matches #{regex.source} found!"
  end
end

def frame_description(b)

Returns:
  • (String) - A description of the frame (binding).

Parameters:
  • b (Binding) -- The binding.
def frame_description(b)
  b_self = b.eval('self')
  b_method = b.eval('__method__')
  if b_method && b_method != :__binding__ && b_method != :__binding_impl__
    b_method.to_s
  elsif b_self.instance_of?(Module)
    "<module:#{b_self}>"
  elsif b_self.instance_of?(Class)
    "<class:#{b_self}>"
  else
    "<main>"
  end
end

def frame_info(b, verbose = false)

Returns:
  • (String) - The description of the binding.

Parameters:
  • verbose (Boolean) -- Whether to generate a verbose description.
  • b (Binding) -- The binding.
def frame_info(b, verbose = false)
  meth = b.eval('__method__')
  b_self = b.eval('self')
  meth_obj = Pry::Method.from_binding(b) if meth
  type = b.frame_type ? "[#{b.frame_type}]".ljust(9) : ""
  desc = b.frame_description ? "#{b.frame_description}" : "#{frame_description(b)}"
  sig = meth_obj ? "<#{signature_with_owner(meth_obj)}>" : ""
  self_clipped = "#{Pry.view_clip(b_self)}"
  path = '@ ' + b.source_location.join(':')
  if !verbose
    "#{type} #{desc} #{sig}"
  else
    "#{type} #{desc} #{sig}\n      in #{self_clipped} #{path}"
  end
end

def frame_manager

Returns:
  • (PryStackExplorer::FrameManager) - The active frame manager for
def frame_manager
  PryStackExplorer.frame_manager(pry_instance)
end

def frame_managers

Returns:
  • (Array) - All the frame
def frame_managers
  PryStackExplorer.frame_managers(pry_instance)
end

def prior_context_exists?

Returns:
  • (Boolean) - Whether there is a context to return to once
def prior_context_exists?
  frame_managers.count > 1 || frame_manager.prior_binding
end

def signature_with_owner(meth_obj)

Returns:
  • (String) - Signature for the method object in Class#method format.

Parameters:
  • meth_obj (Pry::Method) -- The method object.
def signature_with_owner(meth_obj)
  if !meth_obj.undefined?
    args = meth_obj.parameters.inject([]) do |arr, (type, name)|
      name ||= (type == :block ? 'block' : "arg#{arr.size + 1}")
      arr << case type
             when :req   then name.to_s
             when :opt   then "#{name}=?"
             when :rest  then "*#{name}"
             when :block then "&#{name}"
             else '?'
             end
    end
    "#{meth_obj.name_with_owner}(#{args.join(', ')})"
  else
    "#{meth_obj.name_with_owner}(UNKNOWN) (undefined method)"
  end
end