pry 0.12.2 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (158) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +110 -1
  3. data/LICENSE +1 -1
  4. data/README.md +331 -269
  5. data/bin/pry +5 -0
  6. data/lib/pry.rb +133 -119
  7. data/lib/pry/basic_object.rb +8 -4
  8. data/lib/pry/block_command.rb +22 -0
  9. data/lib/pry/class_command.rb +194 -0
  10. data/lib/pry/cli.rb +40 -31
  11. data/lib/pry/code.rb +39 -27
  12. data/lib/pry/code/code_file.rb +28 -24
  13. data/lib/pry/code/code_range.rb +4 -2
  14. data/lib/pry/code/loc.rb +15 -8
  15. data/lib/pry/code_object.rb +40 -38
  16. data/lib/pry/color_printer.rb +47 -46
  17. data/lib/pry/command.rb +166 -369
  18. data/lib/pry/command_set.rb +76 -73
  19. data/lib/pry/command_state.rb +31 -0
  20. data/lib/pry/commands/amend_line.rb +86 -81
  21. data/lib/pry/commands/bang.rb +18 -14
  22. data/lib/pry/commands/bang_pry.rb +15 -11
  23. data/lib/pry/commands/cat.rb +61 -54
  24. data/lib/pry/commands/cat/abstract_formatter.rb +23 -18
  25. data/lib/pry/commands/cat/exception_formatter.rb +71 -60
  26. data/lib/pry/commands/cat/file_formatter.rb +55 -49
  27. data/lib/pry/commands/cat/input_expression_formatter.rb +35 -30
  28. data/lib/pry/commands/cd.rb +40 -35
  29. data/lib/pry/commands/change_inspector.rb +29 -22
  30. data/lib/pry/commands/change_prompt.rb +44 -39
  31. data/lib/pry/commands/clear_screen.rb +16 -10
  32. data/lib/pry/commands/code_collector.rb +148 -133
  33. data/lib/pry/commands/disable_pry.rb +23 -19
  34. data/lib/pry/commands/easter_eggs.rb +19 -30
  35. data/lib/pry/commands/edit.rb +184 -161
  36. data/lib/pry/commands/edit/exception_patcher.rb +21 -17
  37. data/lib/pry/commands/edit/file_and_line_locator.rb +34 -23
  38. data/lib/pry/commands/exit.rb +39 -35
  39. data/lib/pry/commands/exit_all.rb +24 -20
  40. data/lib/pry/commands/exit_program.rb +20 -16
  41. data/lib/pry/commands/find_method.rb +168 -160
  42. data/lib/pry/commands/fix_indent.rb +16 -12
  43. data/lib/pry/commands/help.rb +140 -133
  44. data/lib/pry/commands/hist.rb +151 -150
  45. data/lib/pry/commands/import_set.rb +20 -16
  46. data/lib/pry/commands/jump_to.rb +25 -21
  47. data/lib/pry/commands/list_inspectors.rb +35 -28
  48. data/lib/pry/commands/ls.rb +124 -102
  49. data/lib/pry/commands/ls/constants.rb +59 -42
  50. data/lib/pry/commands/ls/formatter.rb +50 -46
  51. data/lib/pry/commands/ls/globals.rb +38 -34
  52. data/lib/pry/commands/ls/grep.rb +17 -13
  53. data/lib/pry/commands/ls/instance_vars.rb +29 -27
  54. data/lib/pry/commands/ls/interrogatable.rb +18 -12
  55. data/lib/pry/commands/ls/jruby_hacks.rb +47 -41
  56. data/lib/pry/commands/ls/local_names.rb +26 -22
  57. data/lib/pry/commands/ls/local_vars.rb +38 -28
  58. data/lib/pry/commands/ls/ls_entity.rb +47 -51
  59. data/lib/pry/commands/ls/methods.rb +44 -43
  60. data/lib/pry/commands/ls/methods_helper.rb +46 -42
  61. data/lib/pry/commands/ls/self_methods.rb +23 -22
  62. data/lib/pry/commands/nesting.rb +21 -17
  63. data/lib/pry/commands/play.rb +93 -82
  64. data/lib/pry/commands/pry_backtrace.rb +24 -17
  65. data/lib/pry/commands/pry_version.rb +15 -11
  66. data/lib/pry/commands/raise_up.rb +27 -22
  67. data/lib/pry/commands/reload_code.rb +60 -48
  68. data/lib/pry/commands/reset.rb +16 -12
  69. data/lib/pry/commands/ri.rb +55 -45
  70. data/lib/pry/commands/save_file.rb +45 -43
  71. data/lib/pry/commands/shell_command.rb +51 -51
  72. data/lib/pry/commands/shell_mode.rb +21 -17
  73. data/lib/pry/commands/show_doc.rb +81 -68
  74. data/lib/pry/commands/show_info.rb +189 -171
  75. data/lib/pry/commands/show_input.rb +16 -11
  76. data/lib/pry/commands/show_source.rb +109 -45
  77. data/lib/pry/commands/stat.rb +35 -31
  78. data/lib/pry/commands/switch_to.rb +21 -15
  79. data/lib/pry/commands/toggle_color.rb +20 -16
  80. data/lib/pry/commands/watch_expression.rb +89 -86
  81. data/lib/pry/commands/watch_expression/expression.rb +32 -27
  82. data/lib/pry/commands/whereami.rb +156 -148
  83. data/lib/pry/commands/wtf.rb +75 -50
  84. data/lib/pry/config.rb +311 -25
  85. data/lib/pry/config/attributable.rb +22 -0
  86. data/lib/pry/config/lazy_value.rb +29 -0
  87. data/lib/pry/config/memoized_value.rb +34 -0
  88. data/lib/pry/config/value.rb +24 -0
  89. data/lib/pry/control_d_handler.rb +28 -0
  90. data/lib/pry/core_extensions.rb +9 -7
  91. data/lib/pry/editor.rb +48 -21
  92. data/lib/pry/env.rb +18 -0
  93. data/lib/pry/exception_handler.rb +43 -0
  94. data/lib/pry/exceptions.rb +13 -16
  95. data/lib/pry/forwardable.rb +5 -1
  96. data/lib/pry/helpers.rb +2 -0
  97. data/lib/pry/helpers/base_helpers.rb +68 -197
  98. data/lib/pry/helpers/command_helpers.rb +50 -61
  99. data/lib/pry/helpers/documentation_helpers.rb +20 -13
  100. data/lib/pry/helpers/options_helpers.rb +14 -7
  101. data/lib/pry/helpers/platform.rb +7 -5
  102. data/lib/pry/helpers/table.rb +33 -26
  103. data/lib/pry/helpers/text.rb +17 -14
  104. data/lib/pry/history.rb +48 -56
  105. data/lib/pry/hooks.rb +21 -12
  106. data/lib/pry/indent.rb +54 -50
  107. data/lib/pry/input_completer.rb +248 -230
  108. data/lib/pry/input_lock.rb +8 -9
  109. data/lib/pry/inspector.rb +36 -24
  110. data/lib/pry/last_exception.rb +45 -45
  111. data/lib/pry/method.rb +141 -94
  112. data/lib/pry/method/disowned.rb +16 -4
  113. data/lib/pry/method/patcher.rb +12 -3
  114. data/lib/pry/method/weird_method_locator.rb +68 -44
  115. data/lib/pry/object_path.rb +33 -25
  116. data/lib/pry/output.rb +121 -35
  117. data/lib/pry/pager.rb +41 -42
  118. data/lib/pry/plugins.rb +25 -8
  119. data/lib/pry/prompt.rb +123 -54
  120. data/lib/pry/pry_class.rb +61 -98
  121. data/lib/pry/pry_instance.rb +217 -215
  122. data/lib/pry/repl.rb +18 -22
  123. data/lib/pry/repl_file_loader.rb +27 -21
  124. data/lib/pry/ring.rb +11 -6
  125. data/lib/pry/slop.rb +574 -563
  126. data/lib/pry/slop/commands.rb +164 -169
  127. data/lib/pry/slop/option.rb +172 -168
  128. data/lib/pry/syntax_highlighter.rb +26 -0
  129. data/lib/pry/system_command_handler.rb +17 -0
  130. data/lib/pry/testable.rb +59 -61
  131. data/lib/pry/testable/evalable.rb +21 -12
  132. data/lib/pry/testable/mockable.rb +18 -10
  133. data/lib/pry/testable/pry_tester.rb +71 -56
  134. data/lib/pry/testable/utility.rb +29 -21
  135. data/lib/pry/testable/variables.rb +49 -43
  136. data/lib/pry/version.rb +3 -1
  137. data/lib/pry/warning.rb +27 -0
  138. data/lib/pry/wrapped_module.rb +51 -42
  139. data/lib/pry/wrapped_module/candidate.rb +21 -14
  140. metadata +31 -30
  141. data/lib/pry/commands.rb +0 -6
  142. data/lib/pry/commands/disabled_commands.rb +0 -2
  143. data/lib/pry/commands/gem_cd.rb +0 -26
  144. data/lib/pry/commands/gem_install.rb +0 -32
  145. data/lib/pry/commands/gem_list.rb +0 -33
  146. data/lib/pry/commands/gem_open.rb +0 -29
  147. data/lib/pry/commands/gem_readme.rb +0 -25
  148. data/lib/pry/commands/gem_search.rb +0 -40
  149. data/lib/pry/commands/gem_stats.rb +0 -83
  150. data/lib/pry/commands/gist.rb +0 -102
  151. data/lib/pry/commands/install_command.rb +0 -54
  152. data/lib/pry/config/behavior.rb +0 -255
  153. data/lib/pry/config/convenience.rb +0 -28
  154. data/lib/pry/config/default.rb +0 -159
  155. data/lib/pry/config/memoization.rb +0 -48
  156. data/lib/pry/platform.rb +0 -91
  157. data/lib/pry/rubygem.rb +0 -84
  158. data/lib/pry/terminal.rb +0 -91
@@ -1,215 +1,233 @@
1
- class Pry
2
- class Command::ShowInfo < Pry::ClassCommand
3
- extend Pry::Helpers::BaseHelpers
4
-
5
- command_options shellwords: false, interpolate: false
1
+ # frozen_string_literal: true
6
2
 
7
- def initialize(*)
8
- super
3
+ class Pry
4
+ class Command
5
+ class ShowInfo < Pry::ClassCommand
6
+ extend Pry::Helpers::BaseHelpers
9
7
 
10
- @used_super = nil
11
- end
8
+ command_options shellwords: false, interpolate: false
12
9
 
13
- def options(opt)
14
- opt.on :s, :super, "Select the 'super' method. Can be repeated to traverse the ancestors", as: :count
15
- opt.on :l, "line-numbers", "Show line numbers"
16
- opt.on :b, "base-one", "Show line numbers but start numbering at 1 (useful for `amend-line` and `play` commands)"
17
- opt.on :a, :all, "Show all definitions and monkeypatches of the module/class"
18
- end
10
+ def initialize(*)
11
+ super
19
12
 
20
- def process
21
- code_object = Pry::CodeObject.lookup(obj_name, _pry_, super: opts[:super])
22
- raise CommandError, no_definition_message if !code_object
13
+ @used_super = nil
14
+ end
23
15
 
24
- @original_code_object = code_object
16
+ def options(opt)
17
+ opt.on :s, :super, "Select the 'super' method. Can be repeated to " \
18
+ "traverse the ancestors", as: :count
19
+ opt.on :l, "line-numbers", "Show line numbers"
20
+ opt.on :b, "base-one", "Show line numbers but start numbering at 1 " \
21
+ "(useful for `amend-line` and `play` commands)"
22
+ opt.on :a, :all, "Show all definitions and monkeypatches of the " \
23
+ "module/class"
24
+ end
25
25
 
26
- if !obj_name && code_object.c_module? && !opts[:all]
27
- result = "Warning: You're inside an object, whose class is defined by means\n" +
28
- " of the C Ruby API. Pry cannot display the information for\n" +
29
- " this class."
30
- if code_object.candidates.any?
31
- result += "\n However, you can view monkey-patches applied to this class.\n" +
32
- " Just execute the same command with the '--all' switch."
26
+ def process
27
+ code_object = Pry::CodeObject.lookup(obj_name, pry_instance, super: opts[:super])
28
+ raise CommandError, no_definition_message unless code_object
29
+
30
+ @original_code_object = code_object
31
+
32
+ if !obj_name && code_object.c_module? && !opts[:all]
33
+ result = "You're inside an object, whose class is defined by means of " \
34
+ "the C Ruby API.\nPry cannot display the information for this " \
35
+ "class."
36
+ if code_object.candidates.any?
37
+ result += "\nHowever, you can view monkey-patches applied to this " \
38
+ "class.\n.Just execute the same command with the '--all' " \
39
+ "switch."
40
+ end
41
+ elsif show_all_modules?(code_object)
42
+ # show all monkey patches for a module
43
+
44
+ result = content_and_headers_for_all_module_candidates(code_object)
45
+ else
46
+ # show a specific code object
47
+ co = code_object_with_accessible_source(code_object)
48
+ result = content_and_header_for_code_object(co)
33
49
  end
34
- elsif show_all_modules?(code_object)
35
- # show all monkey patches for a module
36
50
 
37
- result = content_and_headers_for_all_module_candidates(code_object)
38
- else
39
- # show a specific code object
40
- co = code_object_with_accessible_source(code_object)
41
- result = content_and_header_for_code_object(co)
51
+ set_file_and_dir_locals(code_object.source_file)
52
+ pry_instance.pager.page result
42
53
  end
43
54
 
44
- set_file_and_dir_locals(code_object.source_file)
45
- _pry_.pager.page result
46
- end
55
+ # This method checks whether the `code_object` is a WrappedModule, if it
56
+ # is, then it returns the first candidate (monkeypatch) with accessible
57
+ # source (or docs). If `code_object` is not a WrappedModule (i.e a method
58
+ # or a command) then the `code_object` itself is just returned.
59
+ #
60
+ # @return [Pry::WrappedModule, Pry::Method, Pry::Command]
61
+ def code_object_with_accessible_source(code_object)
62
+ return code_object unless code_object.is_a?(WrappedModule)
47
63
 
48
- # This method checks whether the `code_object` is a WrappedModule,
49
- # if it is, then it returns the first candidate (monkeypatch) with
50
- # accessible source (or docs). If `code_object` is not a WrappedModule (i.e a
51
- # method or a command) then the `code_object` itself is just
52
- # returned.
53
- #
54
- # @return [Pry::WrappedModule, Pry::Method, Pry::Command]
55
- def code_object_with_accessible_source(code_object)
56
- if code_object.is_a?(WrappedModule)
57
64
  candidate = code_object.candidates.find(&:source)
58
- if candidate
59
- return candidate
60
- else
61
- raise CommandError, no_definition_message if !valid_superclass?(code_object)
65
+ return candidate if candidate
62
66
 
63
- @used_super = true
64
- code_object_with_accessible_source(code_object.super)
65
- end
66
- else
67
- code_object
67
+ raise CommandError, no_definition_message unless valid_superclass?(code_object)
68
+
69
+ @used_super = true
70
+ code_object_with_accessible_source(code_object.super)
68
71
  end
69
- end
70
72
 
71
- def valid_superclass?(code_object)
72
- code_object.super && code_object.super.wrapped != Object
73
- end
73
+ def valid_superclass?(code_object)
74
+ code_object.super && code_object.super.wrapped != Object
75
+ end
74
76
 
75
- def content_and_header_for_code_object(code_object)
76
- header(code_object) << content_for(code_object)
77
- end
77
+ def content_and_header_for_code_object(code_object)
78
+ header(code_object) + content_for(code_object)
79
+ end
78
80
 
79
- def content_and_headers_for_all_module_candidates(mod)
80
- result = "Found #{mod.number_of_candidates} candidates for `#{mod.name}` definition:\n"
81
- mod.number_of_candidates.times do |v|
82
- candidate = mod.candidate(v)
83
- begin
84
- result << "\nCandidate #{v + 1}/#{mod.number_of_candidates}: #{candidate.source_file} @ line #{candidate.source_line}:\n"
85
- content = content_for(candidate)
86
-
87
- result << "Number of lines: #{content.lines.count}\n\n" << content
88
- rescue Pry::RescuableException
89
- result << "\nNo content found.\n"
90
- next
81
+ def content_and_headers_for_all_module_candidates(mod)
82
+ result = "Found #{mod.number_of_candidates} candidates for " \
83
+ "`#{mod.name}` definition:\n"
84
+ mod.number_of_candidates.times do |v|
85
+ candidate = mod.candidate(v)
86
+ begin
87
+ result += "\nCandidate #{v + 1}/#{mod.number_of_candidates}: " \
88
+ "#{candidate.source_file}:#{candidate.source_line}\n"
89
+ content = content_for(candidate)
90
+
91
+ result += "Number of lines: #{content.lines.count}\n\n" + content
92
+ rescue Pry::RescuableException
93
+ result += "\nNo content found.\n"
94
+ next
95
+ end
91
96
  end
97
+ result
92
98
  end
93
- result
94
- end
95
99
 
96
- def no_definition_message
97
- "Couldn't locate a definition for #{obj_name}"
98
- end
100
+ def no_definition_message
101
+ "Couldn't locate a definition for #{obj_name}"
102
+ end
99
103
 
100
- # Generate a header (meta-data information) for all the code
101
- # object types: methods, modules, commands, procs...
102
- def header(code_object)
103
- file_name, line_num = file_and_line_for(code_object)
104
- content = content_for(code_object)
104
+ # Generate a header (meta-data information) for all the code
105
+ # object types: methods, modules, commands, procs...
106
+ def header(code_object)
107
+ file_name, line_num = file_and_line_for(code_object)
108
+ content = content_for(code_object)
109
+
110
+ h = "\n#{bold('From:')} #{file_name}"
111
+ h += code_object_header(code_object, line_num)
112
+ h += "\n#{bold('Number of lines:')} " + "#{content.lines.count}\n\n"
113
+ if @used_super
114
+ h += bold('** Warning:')
115
+ h += " Cannot find code for #{@original_code_object.nonblank_name}. " \
116
+ "Showing superclass #{code_object.nonblank_name} instead. **\n\n"
117
+ end
105
118
 
106
- h = "\n#{bold('From:')} #{file_name} "
107
- h << code_object_header(code_object, line_num)
108
- h << "\n#{bold('Number of lines:')} " << "#{content.lines.count}\n\n"
109
- h << bold('** Warning:') << " Cannot find code for #{@original_code_object.nonblank_name}. Showing superclass #{code_object.nonblank_name} instead. **\n\n" if @used_super
119
+ if content.lines.none?
120
+ h += bold('** Warning:')
121
+ h += " Cannot find code for '#{code_object.name}' (source_location is nil)"
122
+ end
110
123
 
111
- if content.lines.none?
112
- h << bold('** Warning:') << " Cannot find code for '#{code_object.name}' (source_location is nil)"
124
+ h
113
125
  end
114
126
 
115
- h
116
- end
117
-
118
- def code_object_header(code_object, line_num)
119
- if code_object.real_method_object?
120
- method_header(code_object, line_num)
127
+ def code_object_header(code_object, line_num)
128
+ if code_object.real_method_object?
129
+ method_header(code_object, line_num)
121
130
 
122
- # It sucks we have to test for both Pry::WrappedModule and WrappedModule::Candidate,
123
- # probably indicates a deep refactor needs to happen in those classes.
124
- elsif code_object.is_a?(Pry::WrappedModule) || code_object.is_a?(Pry::WrappedModule::Candidate)
125
- module_header(code_object, line_num)
126
- else
127
- ""
131
+ # It sucks we have to test for both Pry::WrappedModule and
132
+ # WrappedModule::Candidate, probably indicates a deep refactor needs
133
+ # to happen in those classes.
134
+ elsif code_object.is_a?(Pry::WrappedModule) ||
135
+ code_object.is_a?(Pry::WrappedModule::Candidate)
136
+ module_header(code_object, line_num)
137
+ else
138
+ ""
139
+ end
128
140
  end
129
- end
130
141
 
131
- def method_header(code_object, line_num)
132
- h = ""
133
- h << (code_object.c_method? ? "(C Method):" : "@ line #{line_num}:")
134
- h << method_sections(code_object)[:owner]
135
- h << method_sections(code_object)[:visibility]
136
- h << method_sections(code_object)[:signature]
137
- h
138
- end
142
+ def method_header(code_object, line_num)
143
+ h = ""
144
+ h += (code_object.c_method? ? ' (C Method):' : ":#{line_num}:")
145
+ h += method_sections(code_object)[:owner]
146
+ h += method_sections(code_object)[:visibility]
147
+ h += method_sections(code_object)[:signature]
148
+ h
149
+ end
139
150
 
140
- def module_header(code_object, line_num)
141
- h = ""
142
- h << "@ line #{line_num}:\n"
143
- h << bold(code_object.module? ? "Module" : "Class")
144
- h << " #{bold('name:')} #{code_object.nonblank_name}"
151
+ def module_header(code_object, line_num)
152
+ h = ""
153
+ h += ":#{line_num}\n"
154
+ h += bold(code_object.module? ? "Module" : "Class")
155
+ h += " #{bold('name:')} #{code_object.nonblank_name}"
145
156
 
146
- if code_object.number_of_candidates > 1
147
- h << (bold("\nNumber of monkeypatches: ") << code_object.number_of_candidates.to_s)
148
- h << ". Use the `-a` option to display all available monkeypatches"
157
+ if code_object.number_of_candidates > 1
158
+ h += bold("\nNumber of monkeypatches: ")
159
+ h += code_object.number_of_candidates.to_s
160
+ h += ". Use the `-a` option to display all available monkeypatches"
161
+ end
162
+ h
149
163
  end
150
- h
151
- end
152
164
 
153
- def method_sections(code_object)
154
- {
155
- owner: "\n#{bold("Owner:")} #{code_object.owner || "N/A"}\n",
156
- visibility: "#{bold("Visibility:")} #{code_object.visibility}",
157
- signature: "\n#{bold("Signature:")} #{code_object.signature}"
158
- }.merge(header_options) { |key, old, new| (new && old).to_s }
159
- end
165
+ def method_sections(code_object)
166
+ {
167
+ owner: "\n#{bold('Owner:')} #{code_object.owner || 'N/A'}\n",
168
+ visibility: "#{bold('Visibility:')} #{code_object.visibility}",
169
+ signature: "\n#{bold('Signature:')} #{code_object.signature}"
170
+ }.merge(header_options) { |_key, old, new| (new && old).to_s }
171
+ end
160
172
 
161
- def header_options
162
- {
163
- owner: true,
164
- visibility: true,
165
- signature: nil
166
- }
167
- end
173
+ def header_options
174
+ {
175
+ owner: true,
176
+ visibility: true,
177
+ signature: nil
178
+ }
179
+ end
168
180
 
169
- def show_all_modules?(code_object)
170
- code_object.is_a?(Pry::WrappedModule) && opts.present?(:all)
171
- end
181
+ def show_all_modules?(code_object)
182
+ code_object.is_a?(Pry::WrappedModule) && opts.present?(:all)
183
+ end
172
184
 
173
- def obj_name
174
- @obj_name ||= args.empty? ? nil : args.join(' ')
175
- end
185
+ def obj_name
186
+ @obj_name ||= args.empty? ? nil : args.join(' ')
187
+ end
176
188
 
177
- def use_line_numbers?
178
- opts.present?(:b) || opts.present?(:l)
179
- end
189
+ def use_line_numbers?
190
+ opts.present?(:b) || opts.present?(:l)
191
+ end
180
192
 
181
- def start_line_for(code_object)
182
- if opts.present?(:'base-one')
183
- 1
184
- else
185
- code_object.source_line || 1
193
+ def start_line_for(code_object)
194
+ if opts.present?(:'base-one')
195
+ 1
196
+ else
197
+ code_object.source_line || 1
198
+ end
186
199
  end
187
- end
188
200
 
189
- # takes into account possible yard docs, and returns yard_file / yard_line
190
- # Also adjusts for start line of comments (using start_line_for), which it has to infer
191
- # by subtracting number of lines of comment from start line of code_object
192
- def file_and_line_for(code_object)
193
- if code_object.module_with_yard_docs?
194
- [code_object.yard_file, code_object.yard_line]
195
- else
196
- [code_object.source_file, start_line_for(code_object)]
201
+ # takes into account possible yard docs, and returns yard_file / yard_line
202
+ # Also adjusts for start line of comments (using start_line_for), which it
203
+ # has to infer by subtracting number of lines of comment from start line
204
+ # of code_object
205
+ def file_and_line_for(code_object)
206
+ if code_object.module_with_yard_docs?
207
+ [code_object.yard_file, code_object.yard_line]
208
+ else
209
+ [code_object.source_file, start_line_for(code_object)]
210
+ end
197
211
  end
198
- end
199
212
 
200
- def complete(input)
201
- if input =~ /([^ ]*)#([a-z0-9_]*)\z/
202
- prefix, search = [$1, $2]
203
- methods = begin
204
- Pry::Method.all_from_class(binding.eval(prefix))
205
- rescue RescuableException
206
- return super
207
- end
208
- methods.map do |method|
209
- [prefix, method.name].join('#') if method.name.start_with?(search)
210
- end.compact
211
- else
212
- super
213
+ def complete(input)
214
+ if input =~ /([^ ]*)#([a-z0-9_]*)\z/
215
+ prefix = Regexp.last_match(1)
216
+ search = Regexp.last_match(2)
217
+ methods =
218
+ begin
219
+ # rubocop:disable Security/Eval
220
+ Pry::Method.all_from_class(binding.eval(prefix))
221
+ # rubocop:enable Security/Eval
222
+ rescue RescuableException
223
+ return super
224
+ end
225
+ methods.map do |method|
226
+ [prefix, method.name].join('#') if method.name.start_with?(search)
227
+ end.compact
228
+ else
229
+ super
230
+ end
213
231
  end
214
232
  end
215
233
  end
@@ -1,17 +1,22 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Pry
2
- class Command::ShowInput < Pry::ClassCommand
3
- match 'show-input'
4
- group 'Editing'
5
- description 'Show the contents of the input buffer for the current multi-line expression.'
4
+ class Command
5
+ class ShowInput < Pry::ClassCommand
6
+ match 'show-input'
7
+ group 'Editing'
8
+ description 'Show the contents of the input buffer for the current ' \
9
+ 'multi-line expression.'
6
10
 
7
- banner <<-'BANNER'
8
- Show the contents of the input buffer for the current multi-line expression.
9
- BANNER
11
+ banner <<-'BANNER'
12
+ Show the contents of the input buffer for the current multi-line expression.
13
+ BANNER
10
14
 
11
- def process
12
- output.puts Code.new(eval_string).with_line_numbers
15
+ def process
16
+ output.puts Code.new(eval_string).with_line_numbers
17
+ end
13
18
  end
14
- end
15
19
 
16
- Pry::Commands.add_command(Pry::Command::ShowInput)
20
+ Pry::Commands.add_command(Pry::Command::ShowInput)
21
+ end
17
22
  end
@@ -1,53 +1,117 @@
1
- require 'pry/commands/show_info'
1
+ # frozen_string_literal: true
2
2
 
3
3
  class Pry
4
- class Command::ShowSource < Command::ShowInfo
5
- match 'show-source'
6
- group 'Introspection'
7
- description 'Show the source for a method or class.'
8
-
9
- banner <<-'BANNER'
10
- Usage: show-source [OPTIONS] [METH|CLASS]
11
- Aliases: $, show-method
12
-
13
- Show the source for a method or class. Tries instance methods first and then
14
- methods by default.
15
-
16
- show-source hi_method
17
- show-source hi_method
18
- show-source Pry#rep # source for Pry#rep method
19
- show-source Pry # for Pry class
20
- show-source Pry -a # for all Pry class definitions (all monkey patches)
21
- show-source Pry.foo -e # for class of the return value of expression `Pry.foo`
22
- show-source Pry --super # for superclass of Pry (Object class)
23
-
24
- https://github.com/pry/pry/wiki/Source-browsing#wiki-Show_method
25
- BANNER
26
-
27
- def options(opt)
28
- opt.on :e, :eval, "evaluate the command's argument as a ruby expression and show the class its return value"
29
- super(opt)
30
- end
4
+ class Command
5
+ class ShowSource < Command::ShowInfo
6
+ include Pry::Helpers::DocumentationHelpers
7
+
8
+ match 'show-source'
9
+ group 'Introspection'
10
+ description 'Show the source for a method or class.'
11
+
12
+ banner <<-'BANNER'
13
+ Usage: show-source [OPTIONS] [METH|CLASS]
14
+ Aliases: $, show-method
15
+
16
+ Show the source for a method or class. Tries instance methods first and then
17
+ methods by default.
31
18
 
32
- def process
33
- if opts.present?(:e)
34
- obj = target.eval(args.first)
35
- self.args = Array.new(1) { Module === obj ? obj.name : obj.class.name }
19
+ show-source hi_method
20
+ show-source hi_method
21
+ show-source Pry#rep # source for Pry#rep method
22
+ show-source Pry # for Pry class
23
+ show-source Pry -a # for all Pry class definitions (all monkey patches)
24
+ show-source Pry.foo -e # for class of the return value of expression `Pry.foo`
25
+ show-source Pry --super # for superclass of Pry (Object class)
26
+ show-source Pry -d # include documentation
27
+
28
+ https://github.com/pry/pry/wiki/Source-browsing#wiki-Show_method
29
+ BANNER
30
+
31
+ def options(opt)
32
+ opt.on :e, :eval, "evaluate the command's argument as a ruby " \
33
+ "expression and show the class its return value"
34
+ opt.on :d, :doc, 'include documentation in the output'
35
+ super(opt)
36
+ end
37
+
38
+ def process
39
+ if opts.present?(:e)
40
+ obj = target.eval(args.first)
41
+ self.args = Array.new(1) { obj.is_a?(Module) ? obj.name : obj.class.name }
42
+ end
43
+
44
+ super
45
+ end
46
+
47
+ # The source for code_object prepared for display.
48
+ def content_for(code_object)
49
+ content = ''
50
+ if opts.present?(:d)
51
+ code = Code.new(
52
+ render_doc_markup_for(code_object), start_line_for(code_object), :text
53
+ )
54
+ content += code.with_line_numbers(use_line_numbers?).to_s
55
+ content += "\n"
56
+ end
57
+
58
+ code = Code.new(
59
+ code_object.source || [], start_line_for(code_object)
60
+ )
61
+ content += code.with_line_numbers(use_line_numbers?).highlighted
62
+ content
36
63
  end
37
- super
38
- end
39
64
 
40
- # The source for code_object prepared for display.
41
- def content_for(code_object)
42
- code = Code.new(
43
- code_object.source || [],
44
- start_line_for(code_object)
45
- )
46
- code.with_line_numbers(use_line_numbers?).highlighted
65
+ # process the markup (if necessary) and apply colors
66
+ def render_doc_markup_for(code_object)
67
+ docs = docs_for(code_object)
68
+
69
+ if code_object.command?
70
+ # command '--help' shouldn't use markup highlighting
71
+ docs
72
+ else
73
+ if docs.empty?
74
+ raise CommandError, "No docs found for: #{obj_name || 'current context'}"
75
+ end
76
+
77
+ process_comment_markup(docs)
78
+ end
79
+ end
80
+
81
+ # Return docs for the code_object, adjusting for whether the code_object
82
+ # has yard docs available, in which case it returns those.
83
+ # (note we only have to check yard docs for modules since they can
84
+ # have multiple docs, but methods can only be doc'd once so we
85
+ # dont need to check them)
86
+ def docs_for(code_object)
87
+ if code_object.module_with_yard_docs?
88
+ # yard docs
89
+ code_object.yard_doc
90
+ else
91
+ # normal docs (i.e comments above method/module/command)
92
+ code_object.doc
93
+ end
94
+ end
95
+
96
+ # Which sections to include in the 'header', can toggle: :owner,
97
+ # :signature and visibility.
98
+ def header_options
99
+ super.merge signature: true
100
+ end
101
+
102
+ # figure out start line of docs by back-calculating based on
103
+ # number of lines in the comment and the start line of the code_object
104
+ # @return [Fixnum] start line of docs
105
+ def start_line_for(code_object)
106
+ return 1 if code_object.command? || opts.present?(:'base-one')
107
+ return 1 unless code_object.source_line
108
+
109
+ code_object.source_line - code_object.doc.lines.count
110
+ end
47
111
  end
48
- end
49
112
 
50
- Pry::Commands.add_command(Pry::Command::ShowSource)
51
- Pry::Commands.alias_command 'show-method', 'show-source'
52
- Pry::Commands.alias_command '$', 'show-source'
113
+ Pry::Commands.add_command(Pry::Command::ShowSource)
114
+ Pry::Commands.alias_command 'show-method', 'show-source'
115
+ Pry::Commands.alias_command '$', 'show-source'
116
+ end
53
117
  end