Class: Pry::Command::ShowInfo
Constant Summary
Constants inherited
from Pry::Command
VOID_VALUE
Helpers::DocumentationHelpers::YARD_TAGS
Helpers::Text::COLORS
Instance Attribute Summary
#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
-
#code_object_header(code_object, line_num) ⇒ Object
-
#code_object_with_accessible_source(code_object) ⇒ Pry::WrappedModule, ...
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).
-
#complete(input) ⇒ Object
-
#content_and_header_for_code_object(code_object) ⇒ Object
-
#content_and_headers_for_all_module_candidates(mod) ⇒ Object
-
#file_and_line_for(code_object) ⇒ Object
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.
-
#header(code_object) ⇒ Object
Generate a header (meta-data information) for all the code object types: methods, modules, commands, procs…
-
#header_options ⇒ Object
-
#initialize ⇒ ShowInfo
constructor
A new instance of ShowInfo.
-
#method_header(code_object, line_num) ⇒ Object
-
#method_sections(code_object) ⇒ Object
-
#module_header(code_object, line_num) ⇒ Object
-
#no_definition_message ⇒ Object
-
#obj_name ⇒ Object
-
#options(opt) ⇒ Object
-
#process ⇒ Object
-
#show_all_modules?(code_object) ⇒ Boolean
-
#start_line_for(code_object) ⇒ Object
-
#use_line_numbers? ⇒ Boolean
-
#valid_superclass?(code_object) ⇒ Boolean
colorize_code, find_command, heading, highlight, not_a_real_file?, safe_send, silence_warnings, stagger_output, use_ansi_codes?
#call, doc, #help, inherited, #setup, #slop, source, source_file, source_line, source_location, #subcommands
#_pry_, banner, #block, #check_for_command_collision, command_name, #command_name, #command_options, command_regex, #commands, convert_to_regex, default_options, #description, doc, group, inspect, #interpolate_string, #match, match_score, matches?, name, #name, options, #process_line, #run, #source, source, source_file, source_line, state, #state, subclass, #target_self, #tokenize, #void
get_comment_content, process_comment_markup, process_rdoc, process_yardoc, process_yardoc_tag, strip_comments_from_c_code, strip_leading_whitespace
#c_method?, #c_module?, #command?, #module_with_yard_docs?, #real_method_object?
#bold, #default, #indent, #no_color, #no_pager, #strip_color, #with_line_numbers
#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
method_object, method_options
Constructor Details
Returns a new instance of ShowInfo.
10
11
12
13
14
|
# File 'lib/pry/commands/show_info.rb', line 10
def initialize(*)
super
@used_super = nil
end
|
Instance Method Details
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
# File 'lib/pry/commands/show_info.rb', line 127
def (code_object, line_num)
if code_object.real_method_object?
(code_object, line_num)
elsif code_object.is_a?(Pry::WrappedModule) ||
code_object.is_a?(Pry::WrappedModule::Candidate)
(code_object, line_num)
else
""
end
end
|
#code_object_with_accessible_source(code_object) ⇒ Pry::WrappedModule, ...
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.
61
62
63
64
65
66
67
68
69
70
71
|
# File 'lib/pry/commands/show_info.rb', line 61
def code_object_with_accessible_source(code_object)
return code_object unless code_object.is_a?(WrappedModule)
candidate = code_object.candidates.find(&:source)
return candidate if candidate
raise CommandError, no_definition_message unless valid_superclass?(code_object)
@used_super = true
code_object_with_accessible_source(code_object.super)
end
|
#complete(input) ⇒ Object
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
|
# File 'lib/pry/commands/show_info.rb', line 213
def complete(input)
if input =~ /([^ ]*)#([a-z0-9_]*)\z/
prefix = Regexp.last_match(1)
search = Regexp.last_match(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) ⇒ Object
77
78
79
|
# File 'lib/pry/commands/show_info.rb', line 77
def content_and_header_for_code_object(code_object)
(code_object) + content_for(code_object)
end
|
#content_and_headers_for_all_module_candidates(mod) ⇒ Object
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
# File 'lib/pry/commands/show_info.rb', line 81
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}:#{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) ⇒ Object
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
205
206
207
208
209
210
211
|
# File 'lib/pry/commands/show_info.rb', line 205
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
|
Generate a header (meta-data information) for all the code object types: methods, modules, commands, procs…
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
# File 'lib/pry/commands/show_info.rb', line 106
def (code_object)
file_name, line_num = file_and_line_for(code_object)
content = content_for(code_object)
h = "\n#{bold('From:')} #{file_name}"
h += (code_object, line_num)
h += "\n#{bold('Number of lines:')} " + "#{content.lines.count}\n\n"
if @used_super
h += bold('** Warning:')
h += " Cannot find code for #{@original_code_object.nonblank_name}. " \
"Showing superclass #{code_object.nonblank_name} instead. **\n\n"
end
if content.lines.none?
h += bold('** Warning:')
h += " Cannot find code for '#{code_object.name}' (source_location is nil)"
end
h
end
|
173
174
175
176
177
178
179
|
# File 'lib/pry/commands/show_info.rb', line 173
def
{
owner: true,
visibility: true,
signature: nil
}
end
|
142
143
144
145
146
147
148
149
|
# File 'lib/pry/commands/show_info.rb', line 142
def (code_object, line_num)
h = ""
h += (code_object.c_method? ? ' (C Method):' : ":#{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) ⇒ Object
165
166
167
168
169
170
171
|
# File 'lib/pry/commands/show_info.rb', line 165
def method_sections(code_object)
{
owner: "\n#{bold('Owner:')} #{code_object.owner || 'N/A'}\n",
visibility: "#{bold('Visibility:')} #{code_object.visibility}",
signature: "\n#{bold('Signature:')} #{code_object.signature}"
}.merge() { |_key, old, new| (new && old).to_s }
end
|
151
152
153
154
155
156
157
158
159
160
161
162
163
|
# File 'lib/pry/commands/show_info.rb', line 151
def (code_object, line_num)
h = ""
h += ":#{line_num}\n"
h += bold(code_object.module? ? "Module" : "Class")
h += " #{bold('name:')} #{code_object.nonblank_name}"
if code_object.number_of_candidates > 1
h += bold("\nNumber of monkeypatches: ")
h += code_object.number_of_candidates.to_s
h += ". Use the `-a` option to display all available monkeypatches"
end
h
end
|
#no_definition_message ⇒ Object
100
101
102
|
# File 'lib/pry/commands/show_info.rb', line 100
def no_definition_message
"Couldn't locate a definition for #{obj_name}"
end
|
185
186
187
|
# File 'lib/pry/commands/show_info.rb', line 185
def obj_name
@obj_name ||= args.empty? ? nil : args.join(' ')
end
|
#options(opt) ⇒ Object
16
17
18
19
20
21
22
23
24
|
# File 'lib/pry/commands/show_info.rb', line 16
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
|
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
# File 'lib/pry/commands/show_info.rb', line 26
def process
code_object = Pry::CodeObject.lookup(obj_name, pry_instance, super: opts[:super])
raise CommandError, no_definition_message unless code_object
@original_code_object = code_object
if !obj_name && code_object.c_module? && !opts[:all]
result = "You're inside an object, whose class is defined by means of " \
"the C Ruby API.\nPry cannot display the information for this " \
"class."
if code_object.candidates.any?
result += "\nHowever, you can view monkey-patches applied to this " \
"class.\n.Just execute the same command with the '--all' " \
"switch."
end
elsif show_all_modules?(code_object)
result = content_and_headers_for_all_module_candidates(code_object)
else
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_instance..page result
end
|
#show_all_modules?(code_object) ⇒ Boolean
181
182
183
|
# File 'lib/pry/commands/show_info.rb', line 181
def show_all_modules?(code_object)
code_object.is_a?(Pry::WrappedModule) && opts.present?(:all)
end
|
#start_line_for(code_object) ⇒ Object
193
194
195
196
197
198
199
|
# File 'lib/pry/commands/show_info.rb', line 193
def start_line_for(code_object)
if opts.present?(:'base-one')
1
else
code_object.source_line || 1
end
end
|
#use_line_numbers? ⇒ Boolean
189
190
191
|
# File 'lib/pry/commands/show_info.rb', line 189
def use_line_numbers?
opts.present?(:b) || opts.present?(:l)
end
|
#valid_superclass?(code_object) ⇒ Boolean
73
74
75
|
# File 'lib/pry/commands/show_info.rb', line 73
def valid_superclass?(code_object)
code_object.super && code_object.super.wrapped != Object
end
|