Class: Pry::Command::ShowSource

Inherits:
ShowInfo show all
Includes:
Helpers::DocumentationHelpers
Defined in:
lib/pry/commands/show_source.rb

Constant Summary

Constants included from Helpers::DocumentationHelpers

Helpers::DocumentationHelpers::YARD_TAGS

Constants inherited from Pry::Command

VOID_VALUE

Constants included from Helpers::Text

Helpers::Text::COLORS

Instance Attribute Summary

Attributes inherited from Pry::ClassCommand

#args, #opts

Attributes inherited from Pry::Command

#arg_string, #captures, #command_block, #command_set, #context, #eval_string, #hooks, #output, #pry_instance, #target

Instance Method Summary collapse

Methods included from Helpers::DocumentationHelpers

#get_comment_content, get_comment_content, process_comment_markup, #process_comment_markup, #process_rdoc, process_rdoc, #process_yardoc, process_yardoc, process_yardoc_tag, #process_yardoc_tag, #strip_comments_from_c_code, strip_comments_from_c_code, #strip_leading_whitespace, strip_leading_whitespace

Methods inherited from ShowInfo

#code_object_header, #code_object_with_accessible_source, #complete, #content_and_header_for_code_object, #content_and_headers_for_all_module_candidates, #file_and_line_for, #header, #initialize, #method_header, #method_sections, #module_header, #no_definition_message, #obj_name, #show_all_modules?, #use_line_numbers?, #valid_superclass?

Methods included from Helpers::BaseHelpers

#colorize_code, #find_command, #heading, #highlight, #not_a_real_file?, #safe_send, #silence_warnings, #stagger_output, #use_ansi_codes?

Methods inherited from Pry::ClassCommand

#call, #complete, doc, #help, inherited, #setup, #slop, source, source_file, source_line, source_location, source_object, #subcommands

Methods inherited from Pry::Command

#_pry_, #after_hooks, banner, #before_hooks, #block, #call_safely, #call_with_hooks, #check_for_command_collision, command_name, #command_name, #command_options, command_regex, #commands, #complete, convert_to_regex, default_options, #description, doc, #find_hooks, group, #initialize, inspect, #interpolate_string, #match, match_score, matches?, name, #name, #normalize_method_args, options, #pass_block, #process_line, #run, #source, source, source_file, source_line, #state, state, subclass, #target_self, #tokenize, #use_unpatched_symbol, #void

Methods included from Pry::CodeObject::Helpers

#c_method?, #c_module?, #command?, #module_with_yard_docs?, #real_method_object?

Methods included from Helpers::Text

#bold, #default, #indent, #no_color, #no_pager, #strip_color, #with_line_numbers

Methods included from Helpers::CommandHelpers

#absolute_index_number, #absolute_index_range, #get_method_or_raise, #internal_binding?, #one_index_number, #one_index_range, #one_index_range_or_number, #restrict_to_lines, #set_file_and_dir_locals, #temp_file, #unindent

Methods included from Helpers::OptionsHelpers

method_object, #method_object, method_options, #method_options

Constructor Details

This class inherits a constructor from Pry::Command::ShowInfo

Instance Method Details

#content_for(code_object) ⇒ Object

The source for code_object prepared for display.


48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/pry/commands/show_source.rb', line 48

def content_for(code_object)
  content = ''
  if opts.present?(:d)
    code = Code.new(
      render_doc_markup_for(code_object), start_line_for(code_object), :text
    )
    content += code.with_line_numbers(use_line_numbers?).to_s
    content += "\n"
  end

  code = Code.new(
    code_object.source || [], start_line_for(code_object)
  )
  content += code.with_line_numbers(use_line_numbers?).highlighted
  content
end

#docs_for(code_object) ⇒ Object

Return docs for the code_object, adjusting for whether the code_object has yard docs available, in which case it returns those. (note we only have to check yard docs for modules since they can have multiple docs, but methods can only be doc'd once so we dont need to check them)


86
87
88
89
90
91
92
93
94
# File 'lib/pry/commands/show_source.rb', line 86

def docs_for(code_object)
  if code_object.module_with_yard_docs?
    # yard docs
    code_object.yard_doc
  else
    # normal docs (i.e comments above method/module/command)
    code_object.doc
  end
end

#header_optionsObject

Which sections to include in the 'header', can toggle: :owner, :signature and visibility.


98
99
100
# File 'lib/pry/commands/show_source.rb', line 98

def header_options
  super.merge signature: true
end

#options(opt) ⇒ Object


31
32
33
34
35
36
# File 'lib/pry/commands/show_source.rb', line 31

def options(opt)
  opt.on :e, :eval, "evaluate the command's argument as a ruby " \
                    "expression and show the class its return value"
  opt.on :d, :doc, 'include documentation in the output'
  super(opt)
end

#processObject


38
39
40
41
42
43
44
45
# File 'lib/pry/commands/show_source.rb', line 38

def process
  if opts.present?(:e)
    obj = target.eval(args.first)
    self.args = Array.new(1) { obj.is_a?(Module) ? obj.name : obj.class.name }
  end

  super
end

#render_doc_markup_for(code_object) ⇒ Object

process the markup (if necessary) and apply colors


66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/pry/commands/show_source.rb', line 66

def render_doc_markup_for(code_object)
  docs = docs_for(code_object)

  if code_object.command?
    # command '--help' shouldn't use markup highlighting
    docs
  else
    if docs.empty?
      raise CommandError, "No docs found for: #{obj_name || 'current context'}"
    end

    process_comment_markup(docs)
  end
end

#start_line_for(code_object) ⇒ Fixnum

figure out start line of docs by back-calculating based on number of lines in the comment and the start line of the code_object

Returns:

  • (Fixnum)

    start line of docs


105
106
107
108
109
110
# File 'lib/pry/commands/show_source.rb', line 105

def start_line_for(code_object)
  return 1 if code_object.command? || opts.present?(:'base-one')
  return 1 unless code_object.source_line

  code_object.source_line - code_object.doc.lines.count
end