pry 0.9.12.2 → 0.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1141 -0
  3. data/LICENSE +2 -2
  4. data/README.md +466 -0
  5. data/bin/pry +4 -7
  6. data/lib/pry/basic_object.rb +10 -0
  7. data/lib/pry/block_command.rb +22 -0
  8. data/lib/pry/class_command.rb +194 -0
  9. data/lib/pry/cli.rb +97 -92
  10. data/lib/pry/code/code_file.rb +114 -0
  11. data/lib/pry/code/code_range.rb +7 -4
  12. data/lib/pry/code/loc.rb +27 -14
  13. data/lib/pry/code.rb +62 -90
  14. data/lib/pry/code_object.rb +83 -39
  15. data/lib/pry/color_printer.rb +66 -0
  16. data/lib/pry/command.rb +202 -371
  17. data/lib/pry/command_set.rb +151 -133
  18. data/lib/pry/command_state.rb +31 -0
  19. data/lib/pry/commands/amend_line.rb +86 -82
  20. data/lib/pry/commands/bang.rb +18 -14
  21. data/lib/pry/commands/bang_pry.rb +15 -11
  22. data/lib/pry/commands/cat/abstract_formatter.rb +23 -18
  23. data/lib/pry/commands/cat/exception_formatter.rb +85 -73
  24. data/lib/pry/commands/cat/file_formatter.rb +56 -63
  25. data/lib/pry/commands/cat/input_expression_formatter.rb +35 -30
  26. data/lib/pry/commands/cat.rb +64 -47
  27. data/lib/pry/commands/cd.rb +42 -26
  28. data/lib/pry/commands/change_inspector.rb +34 -0
  29. data/lib/pry/commands/change_prompt.rb +51 -0
  30. data/lib/pry/commands/clear_screen.rb +20 -0
  31. data/lib/pry/commands/code_collector.rb +148 -131
  32. data/lib/pry/commands/disable_pry.rb +23 -19
  33. data/lib/pry/commands/easter_eggs.rb +23 -34
  34. data/lib/pry/commands/edit/exception_patcher.rb +21 -17
  35. data/lib/pry/commands/edit/file_and_line_locator.rb +33 -24
  36. data/lib/pry/commands/edit.rb +183 -167
  37. data/lib/pry/commands/exit.rb +40 -35
  38. data/lib/pry/commands/exit_all.rb +24 -20
  39. data/lib/pry/commands/exit_program.rb +20 -17
  40. data/lib/pry/commands/find_method.rb +167 -167
  41. data/lib/pry/commands/fix_indent.rb +16 -12
  42. data/lib/pry/commands/help.rb +140 -133
  43. data/lib/pry/commands/hist.rb +153 -132
  44. data/lib/pry/commands/import_set.rb +20 -15
  45. data/lib/pry/commands/jump_to.rb +25 -21
  46. data/lib/pry/commands/list_inspectors.rb +42 -0
  47. data/lib/pry/commands/ls/constants.rb +75 -0
  48. data/lib/pry/commands/ls/formatter.rb +55 -0
  49. data/lib/pry/commands/ls/globals.rb +50 -0
  50. data/lib/pry/commands/ls/grep.rb +23 -0
  51. data/lib/pry/commands/ls/instance_vars.rb +40 -0
  52. data/lib/pry/commands/ls/interrogatable.rb +24 -0
  53. data/lib/pry/commands/ls/jruby_hacks.rb +55 -0
  54. data/lib/pry/commands/ls/local_names.rb +37 -0
  55. data/lib/pry/commands/ls/local_vars.rb +47 -0
  56. data/lib/pry/commands/ls/ls_entity.rb +65 -0
  57. data/lib/pry/commands/ls/methods.rb +55 -0
  58. data/lib/pry/commands/ls/methods_helper.rb +50 -0
  59. data/lib/pry/commands/ls/self_methods.rb +34 -0
  60. data/lib/pry/commands/ls.rb +100 -303
  61. data/lib/pry/commands/nesting.rb +21 -17
  62. data/lib/pry/commands/play.rb +93 -49
  63. data/lib/pry/commands/pry_backtrace.rb +22 -18
  64. data/lib/pry/commands/pry_version.rb +15 -11
  65. data/lib/pry/commands/raise_up.rb +33 -27
  66. data/lib/pry/commands/reload_code.rb +57 -48
  67. data/lib/pry/commands/reset.rb +16 -12
  68. data/lib/pry/commands/ri.rb +57 -38
  69. data/lib/pry/commands/save_file.rb +45 -43
  70. data/lib/pry/commands/shell_command.rb +66 -34
  71. data/lib/pry/commands/shell_mode.rb +22 -20
  72. data/lib/pry/commands/show_doc.rb +80 -65
  73. data/lib/pry/commands/show_info.rb +193 -159
  74. data/lib/pry/commands/show_input.rb +16 -11
  75. data/lib/pry/commands/show_source.rb +113 -33
  76. data/lib/pry/commands/stat.rb +35 -31
  77. data/lib/pry/commands/switch_to.rb +21 -15
  78. data/lib/pry/commands/toggle_color.rb +21 -13
  79. data/lib/pry/commands/watch_expression/expression.rb +43 -0
  80. data/lib/pry/commands/watch_expression.rb +110 -0
  81. data/lib/pry/commands/whereami.rb +157 -134
  82. data/lib/pry/commands/wtf.rb +78 -40
  83. data/lib/pry/config/attributable.rb +22 -0
  84. data/lib/pry/config/lazy_value.rb +29 -0
  85. data/lib/pry/config/memoized_value.rb +34 -0
  86. data/lib/pry/config/value.rb +24 -0
  87. data/lib/pry/config.rb +290 -220
  88. data/lib/pry/control_d_handler.rb +28 -0
  89. data/lib/pry/core_extensions.rb +50 -27
  90. data/lib/pry/editor.rb +130 -102
  91. data/lib/pry/env.rb +18 -0
  92. data/lib/pry/exception_handler.rb +43 -0
  93. data/lib/pry/exceptions.rb +73 -0
  94. data/lib/pry/forwardable.rb +27 -0
  95. data/lib/pry/helpers/base_helpers.rb +22 -151
  96. data/lib/pry/helpers/command_helpers.rb +55 -63
  97. data/lib/pry/helpers/documentation_helpers.rb +21 -13
  98. data/lib/pry/helpers/options_helpers.rb +15 -8
  99. data/lib/pry/helpers/platform.rb +55 -0
  100. data/lib/pry/helpers/table.rb +44 -32
  101. data/lib/pry/helpers/text.rb +96 -86
  102. data/lib/pry/helpers.rb +3 -0
  103. data/lib/pry/history.rb +101 -70
  104. data/lib/pry/hooks.rb +67 -137
  105. data/lib/pry/indent.rb +79 -73
  106. data/lib/pry/input_completer.rb +283 -0
  107. data/lib/pry/input_lock.rb +129 -0
  108. data/lib/pry/inspector.rb +39 -0
  109. data/lib/pry/last_exception.rb +61 -0
  110. data/lib/pry/method/disowned.rb +19 -5
  111. data/lib/pry/{commands/edit/method_patcher.rb → method/patcher.rb} +51 -42
  112. data/lib/pry/method/weird_method_locator.rb +80 -44
  113. data/lib/pry/method.rb +225 -176
  114. data/lib/pry/object_path.rb +91 -0
  115. data/lib/pry/output.rb +136 -0
  116. data/lib/pry/pager.rb +227 -68
  117. data/lib/pry/prompt.rb +214 -0
  118. data/lib/pry/pry_class.rb +216 -289
  119. data/lib/pry/pry_instance.rb +438 -500
  120. data/lib/pry/repl.rb +256 -0
  121. data/lib/pry/repl_file_loader.rb +34 -35
  122. data/lib/pry/ring.rb +89 -0
  123. data/lib/pry/slop/LICENSE +20 -0
  124. data/lib/pry/slop/commands.rb +190 -0
  125. data/lib/pry/slop/option.rb +210 -0
  126. data/lib/pry/slop.rb +672 -0
  127. data/lib/pry/syntax_highlighter.rb +26 -0
  128. data/lib/pry/system_command_handler.rb +17 -0
  129. data/lib/pry/testable/evalable.rb +24 -0
  130. data/lib/pry/testable/mockable.rb +22 -0
  131. data/lib/pry/testable/pry_tester.rb +88 -0
  132. data/lib/pry/testable/utility.rb +34 -0
  133. data/lib/pry/testable/variables.rb +52 -0
  134. data/lib/pry/testable.rb +68 -0
  135. data/lib/pry/version.rb +3 -1
  136. data/lib/pry/warning.rb +20 -0
  137. data/lib/pry/{module_candidate.rb → wrapped_module/candidate.rb} +36 -43
  138. data/lib/pry/wrapped_module.rb +102 -103
  139. data/lib/pry.rb +135 -261
  140. metadata +94 -283
  141. data/.document +0 -2
  142. data/.gitignore +0 -16
  143. data/.travis.yml +0 -21
  144. data/.yardopts +0 -1
  145. data/CHANGELOG +0 -534
  146. data/CONTRIBUTORS +0 -55
  147. data/Gemfile +0 -9
  148. data/Guardfile +0 -62
  149. data/README.markdown +0 -400
  150. data/Rakefile +0 -140
  151. data/TODO +0 -117
  152. data/lib/pry/commands/disabled_commands.rb +0 -2
  153. data/lib/pry/commands/gem_cd.rb +0 -26
  154. data/lib/pry/commands/gem_install.rb +0 -29
  155. data/lib/pry/commands/gem_list.rb +0 -33
  156. data/lib/pry/commands/gem_open.rb +0 -29
  157. data/lib/pry/commands/gist.rb +0 -102
  158. data/lib/pry/commands/install_command.rb +0 -51
  159. data/lib/pry/commands/simple_prompt.rb +0 -22
  160. data/lib/pry/commands.rb +0 -6
  161. data/lib/pry/completion.rb +0 -304
  162. data/lib/pry/custom_completions.rb +0 -6
  163. data/lib/pry/history_array.rb +0 -116
  164. data/lib/pry/plugins.rb +0 -103
  165. data/lib/pry/rbx_method.rb +0 -13
  166. data/lib/pry/rbx_path.rb +0 -22
  167. data/lib/pry/rubygem.rb +0 -74
  168. data/lib/pry/terminal.rb +0 -78
  169. data/lib/pry/test/helper.rb +0 -185
  170. data/man/pry.1 +0 -195
  171. data/man/pry.1.html +0 -204
  172. data/man/pry.1.ronn +0 -141
  173. data/pry.gemspec +0 -30
  174. data/spec/Procfile +0 -3
  175. data/spec/cli_spec.rb +0 -78
  176. data/spec/code_object_spec.rb +0 -277
  177. data/spec/code_spec.rb +0 -219
  178. data/spec/command_helpers_spec.rb +0 -29
  179. data/spec/command_integration_spec.rb +0 -644
  180. data/spec/command_set_spec.rb +0 -627
  181. data/spec/command_spec.rb +0 -821
  182. data/spec/commands/amend_line_spec.rb +0 -247
  183. data/spec/commands/bang_spec.rb +0 -19
  184. data/spec/commands/cat_spec.rb +0 -164
  185. data/spec/commands/cd_spec.rb +0 -250
  186. data/spec/commands/disable_pry_spec.rb +0 -25
  187. data/spec/commands/edit_spec.rb +0 -727
  188. data/spec/commands/exit_all_spec.rb +0 -34
  189. data/spec/commands/exit_program_spec.rb +0 -19
  190. data/spec/commands/exit_spec.rb +0 -34
  191. data/spec/commands/find_method_spec.rb +0 -70
  192. data/spec/commands/gem_list_spec.rb +0 -26
  193. data/spec/commands/gist_spec.rb +0 -79
  194. data/spec/commands/help_spec.rb +0 -56
  195. data/spec/commands/hist_spec.rb +0 -181
  196. data/spec/commands/jump_to_spec.rb +0 -15
  197. data/spec/commands/ls_spec.rb +0 -181
  198. data/spec/commands/play_spec.rb +0 -140
  199. data/spec/commands/raise_up_spec.rb +0 -56
  200. data/spec/commands/save_file_spec.rb +0 -177
  201. data/spec/commands/show_doc_spec.rb +0 -510
  202. data/spec/commands/show_input_spec.rb +0 -17
  203. data/spec/commands/show_source_spec.rb +0 -782
  204. data/spec/commands/whereami_spec.rb +0 -203
  205. data/spec/completion_spec.rb +0 -239
  206. data/spec/control_d_handler_spec.rb +0 -58
  207. data/spec/documentation_helper_spec.rb +0 -73
  208. data/spec/editor_spec.rb +0 -79
  209. data/spec/exception_whitelist_spec.rb +0 -21
  210. data/spec/fixtures/candidate_helper1.rb +0 -11
  211. data/spec/fixtures/candidate_helper2.rb +0 -8
  212. data/spec/fixtures/example.erb +0 -5
  213. data/spec/fixtures/example_nesting.rb +0 -33
  214. data/spec/fixtures/show_source_doc_examples.rb +0 -15
  215. data/spec/fixtures/testrc +0 -2
  216. data/spec/fixtures/testrcbad +0 -2
  217. data/spec/fixtures/whereami_helper.rb +0 -6
  218. data/spec/helper.rb +0 -34
  219. data/spec/helpers/bacon.rb +0 -86
  220. data/spec/helpers/mock_pry.rb +0 -43
  221. data/spec/helpers/table_spec.rb +0 -105
  222. data/spec/history_array_spec.rb +0 -67
  223. data/spec/hooks_spec.rb +0 -522
  224. data/spec/indent_spec.rb +0 -301
  225. data/spec/input_stack_spec.rb +0 -90
  226. data/spec/method_spec.rb +0 -482
  227. data/spec/prompt_spec.rb +0 -60
  228. data/spec/pry_defaults_spec.rb +0 -419
  229. data/spec/pry_history_spec.rb +0 -99
  230. data/spec/pry_output_spec.rb +0 -95
  231. data/spec/pry_spec.rb +0 -504
  232. data/spec/run_command_spec.rb +0 -25
  233. data/spec/sticky_locals_spec.rb +0 -157
  234. data/spec/syntax_checking_spec.rb +0 -81
  235. data/spec/wrapped_module_spec.rb +0 -261
  236. data/wiki/Customizing-pry.md +0 -397
  237. data/wiki/Home.md +0 -4
@@ -1,22 +1,27 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Pry
2
- class Command::ImportSet < Pry::ClassCommand
3
- match 'import-set'
4
- group 'Commands'
5
- # TODO: Provide a better description with examples and a general conception
6
- # of this command.
7
- description 'Import a Pry command set.'
4
+ class Command
5
+ class ImportSet < Pry::ClassCommand
6
+ match 'import-set'
7
+ group 'Commands'
8
+ # TODO: Provide a better description with examples and a general conception
9
+ # of this command.
10
+ description 'Import a Pry command set.'
8
11
 
9
- banner <<-'BANNER'
10
- Import a Pry command set.
11
- BANNER
12
+ banner <<-'BANNER'
13
+ Import a Pry command set.
14
+ BANNER
12
15
 
13
- def process(command_set_name)
14
- raise CommandError, "Provide a command set name" if command_set.nil?
16
+ # TODO: resolve unused parameter.
17
+ def process(_command_set_name)
18
+ raise CommandError, "Provide a command set name" if command_set.nil?
15
19
 
16
- set = target.eval(arg_string)
17
- _pry_.commands.import set
20
+ set = target.eval(arg_string)
21
+ pry_instance.commands.import set
22
+ end
18
23
  end
19
- end
20
24
 
21
- Pry::Commands.add_command(Pry::Command::ImportSet)
25
+ Pry::Commands.add_command(Pry::Command::ImportSet)
26
+ end
22
27
  end
@@ -1,29 +1,33 @@
1
- class Pry
2
- class Command::JumpTo < Pry::ClassCommand
3
- match 'jump-to'
4
- group 'Navigating Pry'
5
- description 'Jump to a binding further up the stack.'
6
-
7
- banner <<-'BANNER'
8
- Jump to a binding further up the stack, popping all bindings below.
9
- BANNER
1
+ # frozen_string_literal: true
10
2
 
11
- def process(break_level)
12
- break_level = break_level.to_i
13
- nesting_level = _pry_.binding_stack.size - 1
3
+ class Pry
4
+ class Command
5
+ class JumpTo < Pry::ClassCommand
6
+ match 'jump-to'
7
+ group 'Navigating Pry'
8
+ description 'Jump to a binding further up the stack.'
14
9
 
15
- case break_level
16
- when nesting_level
17
- output.puts "Already at nesting level #{nesting_level}"
18
- when (0...nesting_level)
19
- _pry_.binding_stack.slice!(break_level + 1, _pry_.binding_stack.size)
10
+ banner <<-'BANNER'
11
+ Jump to a binding further up the stack, popping all bindings below.
12
+ BANNER
20
13
 
21
- else
14
+ def process(break_level)
15
+ break_level = break_level.to_i
16
+ nesting_level = pry_instance.binding_stack.size - 1
22
17
  max_nest_level = nesting_level - 1
23
- output.puts "Invalid nest level. Must be between 0 and #{max_nest_level}. Got #{break_level}."
18
+
19
+ case break_level
20
+ when nesting_level
21
+ output.puts "Already at nesting level #{nesting_level}"
22
+ when 0..max_nest_level
23
+ pry_instance.binding_stack = pry_instance.binding_stack[0..break_level]
24
+ else
25
+ output.puts "Invalid nest level. Must be between 0 and " \
26
+ "#{max_nest_level}. Got #{break_level}."
27
+ end
24
28
  end
25
29
  end
26
- end
27
30
 
28
- Pry::Commands.add_command(Pry::Command::JumpTo)
31
+ Pry::Commands.add_command(Pry::Command::JumpTo)
32
+ end
29
33
  end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Pry
4
+ class Command
5
+ class ListInspectors < Pry::ClassCommand
6
+ match 'list-inspectors'
7
+ group 'Input and Output'
8
+ description 'List the inspector procs available for use.'
9
+ banner <<-BANNER
10
+ Usage: list-inspectors
11
+
12
+ List the inspector procs available to print return values. You can use
13
+ change-inspector to switch between them.
14
+ BANNER
15
+
16
+ def process
17
+ output.puts heading("Available inspectors") + "\n"
18
+ inspector_map.each do |name, inspector|
19
+ output.write "Name: #{bold(name)}"
20
+ output.puts selected_inspector?(inspector) ? selected_text : ""
21
+ output.puts inspector[:description]
22
+ output.puts
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def inspector_map
29
+ Pry::Inspector::MAP
30
+ end
31
+
32
+ def selected_text
33
+ red " (selected) "
34
+ end
35
+
36
+ def selected_inspector?(inspector)
37
+ pry_instance.print == inspector[:value]
38
+ end
39
+ Pry::Commands.add_command(self)
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Pry
4
+ class Command
5
+ class Ls < Pry::ClassCommand
6
+ class Constants < Pry::Command::Ls::Formatter
7
+ DEPRECATED_CONSTANTS = %i[
8
+ Data Fixnum Bignum TimeoutError NIL FALSE TRUE
9
+ ].tap do |constants|
10
+ constants << :JavaPackageModuleTemplate if Helpers::Platform.jruby?
11
+ end
12
+ include Pry::Command::Ls::Interrogatable
13
+
14
+ def initialize(interrogatee, no_user_opts, opts, pry_instance)
15
+ super(pry_instance)
16
+ @interrogatee = interrogatee
17
+ @no_user_opts = no_user_opts
18
+ @default_switch = opts[:constants]
19
+ @verbose_switch = opts[:verbose]
20
+ @dconstants = opts.dconstants?
21
+ end
22
+
23
+ def correct_opts?
24
+ super || (@no_user_opts && interrogating_a_module?)
25
+ end
26
+
27
+ def output_self
28
+ mod = interrogatee_mod
29
+ constants = WrappedModule.new(mod).constants(@verbose_switch)
30
+ output_section('constants', grep.regexp[format(mod, constants)])
31
+ end
32
+
33
+ private
34
+
35
+ def show_deprecated_constants?
36
+ @dconstants == true
37
+ end
38
+
39
+ def format(mod, constants)
40
+ constants.sort_by(&:downcase).map do |name|
41
+ if Object.respond_to?(:deprecate_constant) &&
42
+ DEPRECATED_CONSTANTS.include?(name) &&
43
+ !show_deprecated_constants?
44
+ next
45
+ end
46
+
47
+ if (const = (begin
48
+ !mod.autoload?(name) && (mod.const_get(name) || true)
49
+ rescue StandardError
50
+ nil
51
+ end))
52
+ if begin
53
+ const < Exception
54
+ rescue StandardError
55
+ false
56
+ end
57
+ color(:exception_constant, name)
58
+ elsif begin
59
+ mod.const_get(name).is_a?(Module)
60
+ rescue StandardError
61
+ false
62
+ end
63
+ color(:class_constant, name)
64
+ else
65
+ color(:constant, name)
66
+ end
67
+ else
68
+ color(:unloaded_constant, name)
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Pry
4
+ class Command
5
+ class Ls < Pry::ClassCommand
6
+ class Formatter
7
+ attr_writer :grep
8
+ attr_reader :pry_instance
9
+
10
+ def initialize(pry_instance)
11
+ @pry_instance = pry_instance
12
+ @target = pry_instance.current_context
13
+ @default_switch = nil
14
+ end
15
+
16
+ def write_out
17
+ return false unless correct_opts?
18
+
19
+ output_self
20
+ end
21
+
22
+ private
23
+
24
+ def color(type, str)
25
+ Pry::Helpers::Text.send pry_instance.config.ls.send("#{type}_color"), str
26
+ end
27
+
28
+ # Add a new section to the output.
29
+ # Outputs nothing if the section would be empty.
30
+ def output_section(heading, body)
31
+ return '' if body.compact.empty?
32
+
33
+ fancy_heading = Pry::Helpers::Text.bold(color(:heading, heading))
34
+ Pry::Helpers.tablify_or_one_line(fancy_heading, body, @pry_instance)
35
+ end
36
+
37
+ def format_value(value)
38
+ Pry::ColorPrinter.pp(value, ''.dup)
39
+ end
40
+
41
+ def correct_opts?
42
+ @default_switch
43
+ end
44
+
45
+ def output_self
46
+ raise NotImplementedError
47
+ end
48
+
49
+ def grep
50
+ @grep || proc { |x| x }
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Pry
4
+ class Command
5
+ class Ls < Pry::ClassCommand
6
+ class Globals < Pry::Command::Ls::Formatter
7
+ # Taken from "puts global_variables.inspect".
8
+ BUILTIN_GLOBALS =
9
+ %w[$" $$ $* $, $-0 $-F $-I $-K $-W $-a $-d $-i $-l $-p $-v $-w $. $/ $\\
10
+ $: $; $< $= $> $0 $ARGV $CONSOLE $DEBUG $DEFAULT_INPUT $DEFAULT_OUTPUT
11
+ $FIELD_SEPARATOR $FILENAME $FS $IGNORECASE $INPUT_LINE_NUMBER
12
+ $INPUT_RECORD_SEPARATOR $KCODE $LOADED_FEATURES $LOAD_PATH $NR $OFS
13
+ $ORS $OUTPUT_FIELD_SEPARATOR $OUTPUT_RECORD_SEPARATOR $PID $PROCESS_ID
14
+ $PROGRAM_NAME $RS $VERBOSE $deferr $defout $stderr $stdin $stdout].freeze
15
+
16
+ # `$SAFE` and `$?` are thread-local, the exception stuff only works in a
17
+ # rescue clause, everything else is basically a local variable with a `$`
18
+ # in its name.
19
+ PSEUDO_GLOBALS =
20
+ %w[$! $' $& $` $@ $? $+ $_ $~ $1 $2 $3 $4 $5 $6 $7 $8 $9
21
+ $CHILD_STATUS $SAFE $ERROR_INFO $ERROR_POSITION $LAST_MATCH_INFO
22
+ $LAST_PAREN_MATCH $LAST_READ_LINE $MATCH $POSTMATCH $PREMATCH].freeze
23
+
24
+ def initialize(opts, pry_instance)
25
+ super(pry_instance)
26
+ @default_switch = opts[:globals]
27
+ end
28
+
29
+ def output_self
30
+ variables = format(@target.eval('global_variables'))
31
+ output_section('global variables', grep.regexp[variables])
32
+ end
33
+
34
+ private
35
+
36
+ def format(globals)
37
+ globals.map(&:to_s).sort_by(&:downcase).map do |name|
38
+ if PSEUDO_GLOBALS.include?(name)
39
+ color(:pseudo_global, name)
40
+ elsif BUILTIN_GLOBALS.include?(name)
41
+ color(:builtin_global, name)
42
+ else
43
+ color(:global_var, name)
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Pry
4
+ class Command
5
+ class Ls < Pry::ClassCommand
6
+ class Grep
7
+ def initialize(grep_regexp)
8
+ @grep_regexp = grep_regexp
9
+ end
10
+
11
+ def regexp
12
+ proc { |x|
13
+ if x.instance_of?(Array)
14
+ x.grep(@grep_regexp)
15
+ else
16
+ x =~ @grep_regexp
17
+ end
18
+ }
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Pry
4
+ class Command
5
+ class Ls < Pry::ClassCommand
6
+ class InstanceVars < Pry::Command::Ls::Formatter
7
+ include Pry::Command::Ls::Interrogatable
8
+
9
+ def initialize(interrogatee, no_user_opts, opts, pry_instance)
10
+ super(pry_instance)
11
+ @interrogatee = interrogatee
12
+ @no_user_opts = no_user_opts
13
+ @default_switch = opts[:ivars]
14
+ end
15
+
16
+ def correct_opts?
17
+ super || @no_user_opts
18
+ end
19
+
20
+ def output_self
21
+ ivars = if Object === @interrogatee # rubocop:disable Style/CaseEquality
22
+ Pry::Method.safe_send(@interrogatee, :instance_variables)
23
+ else
24
+ [] # TODO: BasicObject support
25
+ end
26
+ kvars = Pry::Method.safe_send(interrogatee_mod, :class_variables)
27
+ ivars_out = output_section('instance variables', format(:instance_var, ivars))
28
+ kvars_out = output_section('class variables', format(:class_var, kvars))
29
+ ivars_out + kvars_out
30
+ end
31
+
32
+ private
33
+
34
+ def format(type, vars)
35
+ vars.sort_by { |var| var.to_s.downcase }.map { |var| color(type, var) }
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Pry
4
+ class Command
5
+ class Ls < Pry::ClassCommand
6
+ module Interrogatable
7
+ private
8
+
9
+ def interrogating_a_module?
10
+ Module === @interrogatee # rubocop:disable Style/CaseEquality
11
+ end
12
+
13
+ def interrogatee_mod
14
+ if interrogating_a_module?
15
+ @interrogatee
16
+ else
17
+ singleton = Pry::Method.singleton_class_of(@interrogatee)
18
+ singleton.ancestors.grep(::Class).reject { |c| c == singleton }.first
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Pry
4
+ class Command
5
+ class Ls < Pry::ClassCommand
6
+ module JRubyHacks
7
+ private
8
+
9
+ # JRuby creates lots of aliases for methods imported from java in an attempt
10
+ # to make life easier for ruby programmers. (e.g. getFooBar becomes
11
+ # get_foo_bar and foo_bar, and maybe foo_bar? if it returns a Boolean). The
12
+ # full transformations are in the assignAliases method of:
13
+ # https://github.com/jruby/jruby/blob/master/src/org/jruby/javasupport/JavaClass.java
14
+ #
15
+ # This has the unfortunate side-effect of making the output of ls even more
16
+ # incredibly verbose than it normally would be for these objects; and so we
17
+ # filter out all but the nicest of these aliases here.
18
+ #
19
+ # TODO: This is a little bit vague, better heuristics could be used.
20
+ # JRuby also has a lot of scala-specific logic, which we don't copy.
21
+ def trim_jruby_aliases(methods)
22
+ grouped = methods.group_by do |m|
23
+ m.name.sub(/\A(is|get|set)(?=[A-Z_])/, '').gsub(/[_?=]/, '').downcase
24
+ end
25
+
26
+ grouped.flat_map do |_key, values|
27
+ values = values.sort_by do |m|
28
+ rubbishness(m.name)
29
+ end
30
+
31
+ found = []
32
+ values.select do |x|
33
+ (found.none? { |y| x == y }) && found << x
34
+ end
35
+ end
36
+ end
37
+
38
+ # When removing jruby aliases, we want to keep the alias that is
39
+ # "least rubbish" according to this metric.
40
+ def rubbishness(name)
41
+ name.each_char.map do |x|
42
+ case x
43
+ when /[A-Z]/
44
+ 1
45
+ when '?', '=', '!'
46
+ -2
47
+ else
48
+ 0
49
+ end
50
+ end.inject(&:+) + (name.size / 100.0)
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Pry
4
+ class Command
5
+ class Ls < Pry::ClassCommand
6
+ class LocalNames < Pry::Command::Ls::Formatter
7
+ def initialize(no_user_opts, args, pry_instance)
8
+ super(pry_instance)
9
+ @no_user_opts = no_user_opts
10
+ @args = args
11
+ @sticky_locals = pry_instance.sticky_locals
12
+ end
13
+
14
+ def correct_opts?
15
+ super || (@no_user_opts && @args.empty?)
16
+ end
17
+
18
+ def output_self
19
+ local_vars = grep.regexp[@target.eval('local_variables')]
20
+ output_section('locals', format(local_vars))
21
+ end
22
+
23
+ private
24
+
25
+ def format(locals)
26
+ locals.sort_by(&:downcase).map do |name|
27
+ if @sticky_locals.include?(name.to_sym)
28
+ color(:pry_var, name)
29
+ else
30
+ color(:local_var, name)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Pry
4
+ class Command
5
+ class Ls < Pry::ClassCommand
6
+ class LocalVars < Pry::Command::Ls::Formatter
7
+ def initialize(opts, pry_instance)
8
+ super(pry_instance)
9
+ @default_switch = opts[:locals]
10
+ @sticky_locals = pry_instance.sticky_locals
11
+ end
12
+
13
+ def output_self
14
+ locals = @target.eval('local_variables').reject do |e|
15
+ @sticky_locals.key?(e.to_sym)
16
+ end
17
+ name_value_pairs = locals.map do |name|
18
+ [name, @target.eval(name.to_s)]
19
+ end
20
+ format(name_value_pairs).join('')
21
+ end
22
+
23
+ private
24
+
25
+ def format(name_value_pairs)
26
+ sorted = name_value_pairs.sort_by do |_name, value|
27
+ value.to_s.size
28
+ end
29
+ sorted.reverse.map do |name, value|
30
+ colorized_assignment_style(name, format_value(value))
31
+ end
32
+ end
33
+
34
+ def colorized_assignment_style(lhs, rhs, desired_width = 7)
35
+ colorized_lhs = color(:local_var, lhs)
36
+ color_escape_padding = colorized_lhs.size - lhs.size
37
+ pad = desired_width + color_escape_padding
38
+ Kernel.format(
39
+ "%-#{pad}<name>s = %<value>s",
40
+ name: color(:local_var, colorized_lhs),
41
+ value: rhs
42
+ )
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Pry
4
+ class Command
5
+ class Ls < Pry::ClassCommand
6
+ class LsEntity
7
+ attr_reader :pry_instance
8
+
9
+ def initialize(opts)
10
+ @interrogatee = opts[:interrogatee]
11
+ @no_user_opts = opts[:no_user_opts]
12
+ @opts = opts[:opts]
13
+ @args = opts[:args]
14
+ @grep = Grep.new(Regexp.new(opts[:opts][:G] || '.'))
15
+ @pry_instance = opts.delete(:pry_instance)
16
+ end
17
+
18
+ def entities_table
19
+ entities.map(&:write_out).select { |o| o }.join('')
20
+ end
21
+
22
+ private
23
+
24
+ def grep(entity)
25
+ entity.tap { |o| o.grep = @grep }
26
+ end
27
+
28
+ def globals
29
+ grep Globals.new(@opts, pry_instance)
30
+ end
31
+
32
+ def constants
33
+ grep Constants.new(@interrogatee, @no_user_opts, @opts, pry_instance)
34
+ end
35
+
36
+ def methods
37
+ grep(Methods.new(@interrogatee, @no_user_opts, @opts, pry_instance))
38
+ end
39
+
40
+ def self_methods
41
+ grep SelfMethods.new(@interrogatee, @no_user_opts, @opts, pry_instance)
42
+ end
43
+
44
+ def instance_vars
45
+ grep InstanceVars.new(@interrogatee, @no_user_opts, @opts, pry_instance)
46
+ end
47
+
48
+ def local_names
49
+ grep LocalNames.new(@no_user_opts, @args, pry_instance)
50
+ end
51
+
52
+ def local_vars
53
+ LocalVars.new(@opts, pry_instance)
54
+ end
55
+
56
+ def entities
57
+ [
58
+ globals, constants, methods, self_methods, instance_vars, local_names,
59
+ local_vars
60
+ ]
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Pry
4
+ class Command
5
+ class Ls < Pry::ClassCommand
6
+ class Methods < Pry::Command::Ls::Formatter
7
+ include Pry::Command::Ls::Interrogatable
8
+ include Pry::Command::Ls::MethodsHelper
9
+
10
+ def initialize(interrogatee, no_user_opts, opts, pry_instance)
11
+ super(pry_instance)
12
+ @interrogatee = interrogatee
13
+ @no_user_opts = no_user_opts
14
+ @default_switch = opts[:methods]
15
+ @instance_methods_switch = opts['instance-methods']
16
+ @ppp_switch = opts[:ppp]
17
+ @jruby_switch = opts['all-java']
18
+ @quiet_switch = opts[:quiet]
19
+ @verbose_switch = opts[:verbose]
20
+ end
21
+
22
+ def output_self
23
+ methods = all_methods.group_by(&:owner)
24
+ # Reverse the resolution order so that the most useful information
25
+ # appears right by the prompt.
26
+ resolution_order.take_while(&below_ceiling).reverse.map do |klass|
27
+ methods_here = (methods[klass] || []).select { |m| grep.regexp[m.name] }
28
+ heading = "#{Pry::WrappedModule.new(klass).method_prefix}methods"
29
+ output_section(heading, format(methods_here))
30
+ end.join('')
31
+ end
32
+
33
+ private
34
+
35
+ def correct_opts?
36
+ super || @instance_methods_switch || @ppp_switch || @no_user_opts
37
+ end
38
+
39
+ # Get a lambda that can be used with `take_while` to prevent over-eager
40
+ # traversal of the Object's ancestry graph.
41
+ def below_ceiling
42
+ ceiling = if @quiet_switch
43
+ [Pry::Method.safe_send(interrogatee_mod, :ancestors)[1]] +
44
+ pry_instance.config.ls.ceiling
45
+ elsif @verbose_switch
46
+ []
47
+ else
48
+ pry_instance.config.ls.ceiling.dup
49
+ end
50
+ ->(klass) { !ceiling.include?(klass) }
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end