class Pry::Command::ShowInfo
Public Class Methods
new(*)
click to toggle source
Calls superclass method
Pry::Command::new
# File lib/pry/commands/show_info.rb, line 7 def initialize(*) super @used_super = nil end
Public Instance Methods
code_object_header(code_object, line_num)
click to toggle source
# File lib/pry/commands/show_info.rb, line 103 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 46 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
Calls superclass method
Pry::ClassCommand#complete
# File lib/pry/commands/show_info.rb, line 185 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 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 66 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 70 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 177 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 93 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 146 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 116 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 138 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 125 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 87 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 158 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 13 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 20 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) _pry_.pager.page result end
show_all_modules?(code_object)
click to toggle source
# File lib/pry/commands/show_info.rb, line 154 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 166 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 162 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 62 def valid_superclass?(code_object) code_object.super && code_object.super.wrapped != Object end