class Pry::Command::ShowInfo

Public Instance Methods

code_object_header(code_object, line_num) click to toggle source
# File lib/pry/commands/show_info.rb, line 102
def code_object_header(code_object, line_num)
  if code_object.real_method_object?
    method_header(code_object, line_num)

    # It sucks we have to test for both Pry::WrappedModule and WrappedModule::Candidate,
    # probably indicates a deep refactor needs to happen in those classes.
  elsif code_object.is_a?(Pry::WrappedModule) || code_object.is_a?(Pry::WrappedModule::Candidate)
    module_header(code_object, line_num)
  else
    ""
  end
end
code_object_with_accessible_source(code_object) click to toggle source

This method checks whether the `code_object` is a WrappedModule, if it is, then it returns the first candidate (monkeypatch) with accessible source (or docs). If `code_object` is not a WrappedModule (i.e a method or a command) then the `code_object` itself is just returned.

@return [Pry::WrappedModule, Pry::Method, Pry::Command]

# File lib/pry/commands/show_info.rb, line 45
def code_object_with_accessible_source(code_object)
  if code_object.is_a?(WrappedModule)
    candidate = code_object.candidates.find(&:source)
    if candidate
      return candidate
    else
      raise CommandError, no_definition_message if !valid_superclass?(code_object)

      @used_super = true
      code_object_with_accessible_source(code_object.super)
    end
  else
    code_object
  end
end
complete(input) click to toggle source
# File lib/pry/commands/show_info.rb, line 184
def complete(input)
  if input =~ /([^ ]*)#([a-z0-9_]*)\z/
    prefix, search = [$1, $2]
    methods = begin
                Pry::Method.all_from_class(binding.eval(prefix))
              rescue RescuableException => e
                return super
              end
    methods.map do |method|
      [prefix, method.name].join('#') if method.name.start_with?(search)
    end.compact
  else
    super
  end
end
content_and_header_for_code_object(code_object) click to toggle source
# File lib/pry/commands/show_info.rb, line 65
def content_and_header_for_code_object(code_object)
  header(code_object) + content_for(code_object)
end
content_and_headers_for_all_module_candidates(mod) click to toggle source
# File lib/pry/commands/show_info.rb, line 69
def content_and_headers_for_all_module_candidates(mod)
  result = "Found #{mod.number_of_candidates} candidates for `#{mod.name}` definition:\n"
  mod.number_of_candidates.times do |v|
    candidate = mod.candidate(v)
    begin
      result << "\nCandidate #{v+1}/#{mod.number_of_candidates}: #{candidate.source_file} @ line #{candidate.source_line}:\n"
      content = content_for(candidate)

      result << "Number of lines: #{content.lines.count}\n\n" << content
    rescue Pry::RescuableException
      result << "\nNo content found.\n"
      next
    end
  end
  result
end
file_and_line_for(code_object) click to toggle source

takes into account possible yard docs, and returns yard_file / yard_line Also adjusts for start line of comments (using #start_line_for), which it has to infer by subtracting number of lines of comment from start line of code_object

# File lib/pry/commands/show_info.rb, line 176
def file_and_line_for(code_object)
  if code_object.module_with_yard_docs?
    [code_object.yard_file, code_object.yard_line]
  else
    [code_object.source_file, start_line_for(code_object)]
  end
end
header(code_object) click to toggle source

Generate a header (meta-data information) for all the code object types: methods, modules, commands, procs...

# File lib/pry/commands/show_info.rb, line 92
def header(code_object)
  file_name, line_num = file_and_line_for(code_object)
  h = "\n#{Pry::Helpers::Text.bold('From:')} #{file_name} "
  h << code_object_header(code_object, line_num)
  h << "\n#{Pry::Helpers::Text.bold('Number of lines:')} " <<
    "#{content_for(code_object).lines.count}\n\n"
  h << Helpers::Text.bold('** Warning:') + " Cannot find code for #{@original_code_object.nonblank_name}. Showing superclass #{code_object.nonblank_name} instead. **\n\n" if @used_super
  h
end
header_options() click to toggle source
# File lib/pry/commands/show_info.rb, line 145
def header_options
  {
    :owner => true,
    :visibility => true,
    :signature => nil
  }
end
method_header(code_object, line_num) click to toggle source
# File lib/pry/commands/show_info.rb, line 115
def method_header(code_object, line_num)
  h = ""
  h << (code_object.c_method? ? "(C Method):" : "@ line #{line_num}:")
  h << method_sections(code_object)[:owner]
  h << method_sections(code_object)[:visibility]
  h << method_sections(code_object)[:signature]
  h
end
method_sections(code_object) click to toggle source
# File lib/pry/commands/show_info.rb, line 137
def method_sections(code_object)
  {
    :owner => "\n#{text.bold("Owner:")} #{code_object.owner || "N/A"}\n",
    :visibility => "#{text.bold("Visibility:")} #{code_object.visibility}",
    :signature => "\n#{text.bold("Signature:")} #{code_object.signature}"
  }.merge(header_options) { |key, old, new| (new && old).to_s }
end
module_header(code_object, line_num) click to toggle source
# File lib/pry/commands/show_info.rb, line 124
def module_header(code_object, line_num)
  h = ""
  h << "@ line #{line_num}:\n"
  h << text.bold(code_object.module? ? "Module" : "Class")
  h << " #{text.bold('name:')} #{code_object.nonblank_name}"

  if code_object.number_of_candidates > 1
    h << (text.bold("\nNumber of monkeypatches: ") + code_object.number_of_candidates.to_s)
    h << ". Use the `-a` option to display all available monkeypatches"
  end
  h
end
no_definition_message() click to toggle source
# File lib/pry/commands/show_info.rb, line 86
def no_definition_message
  "Couldn't locate a definition for #{obj_name}!"
end
obj_name() click to toggle source
# File lib/pry/commands/show_info.rb, line 157
def obj_name
  @obj_name ||= args.empty? ? nil : args.join(" ")
end
options(opt) click to toggle source
# File lib/pry/commands/show_info.rb, line 12
def options(opt)
  opt.on :s, :super, "Select the 'super' method. Can be repeated to traverse the ancestors", :as => :count
  opt.on :l, "line-numbers", "Show line numbers"
  opt.on :b, "base-one", "Show line numbers but start numbering at 1 (useful for `amend-line` and `play` commands)"
  opt.on :a, :all,   "Show all definitions and monkeypatches of the module/class"
end
process() click to toggle source
# File lib/pry/commands/show_info.rb, line 19
def process
  code_object = Pry::CodeObject.lookup(obj_name, _pry_, :super => opts[:super])
  raise CommandError, no_definition_message if !code_object
  @original_code_object = code_object

  if show_all_modules?(code_object)
    # show all monkey patches for a module

    result = content_and_headers_for_all_module_candidates(code_object)
  else
    # show a specific code object
    co = code_object_with_accessible_source(code_object)
    result = content_and_header_for_code_object(co)
  end

  set_file_and_dir_locals(code_object.source_file)
  stagger_output result
end
setup() click to toggle source
# File lib/pry/commands/show_info.rb, line 8
def setup
  require 'ruby18_source_location' if mri_18?
end
show_all_modules?(code_object) click to toggle source
# File lib/pry/commands/show_info.rb, line 153
def show_all_modules?(code_object)
  code_object.is_a?(Pry::WrappedModule) && opts.present?(:all)
end
start_line_for(code_object) click to toggle source
# File lib/pry/commands/show_info.rb, line 165
def start_line_for(code_object)
  if opts.present?(:'base-one')
    1
  else
    code_object.source_line || 1
  end
end
use_line_numbers?() click to toggle source
# File lib/pry/commands/show_info.rb, line 161
def use_line_numbers?
  opts.present?(:b) || opts.present?(:l)
end
valid_superclass?(code_object) click to toggle source
# File lib/pry/commands/show_info.rb, line 61
def valid_superclass?(code_object)
  code_object.super && code_object.super.wrapped != Object
end