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
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Pry
4
+ class Command
5
+ class Ls < Pry::ClassCommand
6
+ module MethodsHelper
7
+ include Pry::Command::Ls::JRubyHacks
8
+
9
+ private
10
+
11
+ # Get all the methods that we'll want to output.
12
+ def all_methods(instance_methods = false)
13
+ methods = if instance_methods || @instance_methods_switch
14
+ Pry::Method.all_from_class(@interrogatee)
15
+ else
16
+ Pry::Method.all_from_obj(@interrogatee)
17
+ end
18
+
19
+ if Pry::Helpers::Platform.jruby? && !@jruby_switch
20
+ methods = trim_jruby_aliases(methods)
21
+ end
22
+
23
+ methods.select { |method| @ppp_switch || method.visibility == :public }
24
+ end
25
+
26
+ def resolution_order
27
+ if @instance_methods_switch
28
+ Pry::Method.instance_resolution_order(@interrogatee)
29
+ else
30
+ Pry::Method.resolution_order(@interrogatee)
31
+ end
32
+ end
33
+
34
+ def format(methods)
35
+ methods.sort_by(&:name).map do |method|
36
+ if method.name == 'method_missing'
37
+ color(:method_missing, 'method_missing')
38
+ elsif method.visibility == :private
39
+ color(:private_method, method.name)
40
+ elsif method.visibility == :protected
41
+ color(:protected_method, method.name)
42
+ else
43
+ color(:public_method, method.name)
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Pry
4
+ class Command
5
+ class Ls < Pry::ClassCommand
6
+ class SelfMethods < 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
+ @ppp_switch = opts[:ppp]
15
+ @jruby_switch = opts['all-java']
16
+ end
17
+
18
+ def output_self
19
+ methods = all_methods(true).select do |m|
20
+ m.owner == @interrogatee && grep.regexp[m.name]
21
+ end
22
+ heading = "#{Pry::WrappedModule.new(@interrogatee).method_prefix}methods"
23
+ output_section(heading, format(methods))
24
+ end
25
+
26
+ private
27
+
28
+ def correct_opts?
29
+ @no_user_opts && interrogating_a_module?
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,12 +1,35 @@
1
- class Pry
2
- class Command::Ls < Pry::ClassCommand
3
- match 'ls'
4
- group 'Context'
5
- description 'Show the list of vars and methods in the current scope.'
6
- command_options :shellwords => false, :interpolate => false
1
+ # frozen_string_literal: true
7
2
 
8
- def options(opt)
9
- opt.banner unindent <<-'BANNER'
3
+ class Pry
4
+ class Command
5
+ class Ls < Pry::ClassCommand
6
+ DEFAULT_OPTIONS = {
7
+ heading_color: :bright_blue,
8
+ public_method_color: :default,
9
+ private_method_color: :blue,
10
+ protected_method_color: :blue,
11
+ method_missing_color: :bright_red,
12
+ local_var_color: :yellow,
13
+ pry_var_color: :default, # e.g. _, pry_instance, _file_
14
+ instance_var_color: :blue, # e.g. @foo
15
+ class_var_color: :bright_blue, # e.g. @@foo
16
+ global_var_color: :default, # e.g. $CODERAY_DEBUG, $eventmachine_library
17
+ builtin_global_color: :cyan, # e.g. $stdin, $-w, $PID
18
+ pseudo_global_color: :cyan, # e.g. $~, $1..$9, $LAST_MATCH_INFO
19
+ constant_color: :default, # e.g. VERSION, ARGF
20
+ class_constant_color: :blue, # e.g. Object, Kernel
21
+ exception_constant_color: :magenta, # e.g. Exception, RuntimeError
22
+ unloaded_constant_color: :yellow, # Any constant that is still in .autoload? state
23
+ separator: " ",
24
+ ceiling: [Object, Module, Class]
25
+ }.freeze
26
+
27
+ match 'ls'
28
+ group 'Context'
29
+ description 'Show the list of vars and methods in the current scope.'
30
+ command_options shellwords: false, interpolate: false
31
+
32
+ banner <<-'BANNER'
10
33
  Usage: ls [-m|-M|-p|-pM] [-q|-v] [-c|-i] [Object]
11
34
  ls [-g] [-l]
12
35
 
@@ -22,317 +45,91 @@ class Pry
22
45
  methods defined on all Objects are omitted. The -v flag can be used to ignore
23
46
  this setting and show all methods, while the -q can be used to set the ceiling
24
47
  much lower and show only methods defined on the object or its direct class.
25
- BANNER
26
-
27
- opt.on :m, :methods, "Show public methods defined on the Object (default)"
28
- opt.on :M, "instance-methods", "Show methods defined in a Module or Class"
29
- opt.on :p, :ppp, "Show public, protected (in yellow) and private (in green) methods"
30
- opt.on :q, :quiet, "Show only methods defined on object.singleton_class and object.class"
31
- opt.on :v, :verbose, "Show methods and constants on all super-classes (ignores Pry.config.ls.ceiling)"
32
- opt.on :g, :globals, "Show global variables, including those builtin to Ruby (in cyan)"
33
- opt.on :l, :locals, "Show hash of local vars, sorted by descending size"
34
- opt.on :c, :constants, "Show constants, highlighting classes (in blue), and exceptions (in purple).\n" +
35
- " " * 32 + "Constants that are pending autoload? are also shown (in yellow)"
36
- opt.on :i, :ivars, "Show instance variables (in blue) and class variables (in bright blue)"
37
- opt.on :G, :grep, "Filter output by regular expression", :argument => true
38
-
39
- if jruby?
40
- opt.on :J, "all-java", "Show all the aliases for methods from java (default is to show only prettiest)"
41
- end
42
- end
43
-
44
- attr_reader :object_to_interrogate, :has_user_specified_any_options, :grep, :grep_regex
45
-
46
- def process
47
- @object_to_interrogate = args.empty? ? target_self : target.eval(args.join(" "))
48
-
49
- # exclude -q, -v and --grep because they don't specify what the user wants to see.
50
- @has_user_specified_any_options = (opts.present?(:methods) || opts.present?(:'instance-methods') || opts.present?(:ppp) ||
51
- opts.present?(:globals) || opts.present?(:locals) || opts.present?(:constants) ||
52
- opts.present?(:ivars))
53
-
54
- @grep_regex, @grep = [Regexp.new(opts[:G] || "."), lambda{ |x| x.grep(@grep_regex) }]
55
-
56
- raise_errors_if_arguments_are_weird
57
-
58
- all_output = [
59
- write_out_globals,
60
- write_out_constants,
61
- write_out_methods,
62
- write_out_self_methods,
63
- write_out_ivars,
64
- write_out_local_names,
65
- write_out_locals,
66
- ].compact.join("")
67
-
68
- stagger_output(all_output)
69
- end
70
-
71
- private
72
-
73
- # http://ruby.runpaint.org/globals, and running "puts global_variables.inspect".
74
- BUILTIN_GLOBALS = %w($" $$ $* $, $-0 $-F $-I $-K $-W $-a $-d $-i $-l $-p $-v $-w $. $/ $\\
75
- $: $; $< $= $> $0 $ARGV $CONSOLE $DEBUG $DEFAULT_INPUT $DEFAULT_OUTPUT
76
- $FIELD_SEPARATOR $FILENAME $FS $IGNORECASE $INPUT_LINE_NUMBER
77
- $INPUT_RECORD_SEPARATOR $KCODE $LOADED_FEATURES $LOAD_PATH $NR $OFS
78
- $ORS $OUTPUT_FIELD_SEPARATOR $OUTPUT_RECORD_SEPARATOR $PID $PROCESS_ID
79
- $PROGRAM_NAME $RS $VERBOSE $deferr $defout $stderr $stdin $stdout)
80
-
81
- # $SAFE and $? are thread-local, the exception stuff only works in a rescue clause,
82
- # everything else is basically a local variable with a $ in its name.
83
- PSEUDO_GLOBALS = %w($! $' $& $` $@ $? $+ $_ $~ $1 $2 $3 $4 $5 $6 $7 $8 $9
84
- $CHILD_STATUS $SAFE $ERROR_INFO $ERROR_POSITION $LAST_MATCH_INFO
85
- $LAST_PAREN_MATCH $LAST_READ_LINE $MATCH $POSTMATCH $PREMATCH)
86
-
87
- # Get all the methods that we'll want to output
88
- def all_methods(obj, instance_methods=false)
89
- methods = if instance_methods || opts.present?(:'instance-methods')
90
- Pry::Method.all_from_class(obj)
91
- else
92
- Pry::Method.all_from_obj(obj)
93
- end
94
-
95
- if jruby? && !opts.present?(:J)
96
- methods = trim_jruby_aliases(methods)
97
- end
98
48
 
99
- methods.select{ |method| opts.present?(:ppp) || method.visibility == :public }
100
- end
101
-
102
- # JRuby creates lots of aliases for methods imported from java in an attempt to
103
- # make life easier for ruby programmers.
104
- # (e.g. getFooBar becomes get_foo_bar and foo_bar, and maybe foo_bar? if it
105
- # returns a Boolean).
106
- # The full transformations are in the assignAliases method of:
107
- # https://github.com/jruby/jruby/blob/master/src/org/jruby/javasupport/JavaClass.java
108
- #
109
- # This has the unfortunate side-effect of making the output of ls even more
110
- # incredibly verbose than it normally would be for these objects; and so we filter
111
- # out all but the nicest of these aliases here.
112
- #
113
- # TODO: This is a little bit vague, better heuristics could be used.
114
- # JRuby also has a lot of scala-specific logic, which we don't copy.
115
- #
116
- def trim_jruby_aliases(methods)
117
- grouped = methods.group_by do |m|
118
- m.name.sub(/\A(is|get|set)(?=[A-Z_])/, '').gsub(/[_?=]/, '').downcase
119
- end
120
-
121
- grouped.map do |key, values|
122
- values = values.sort_by do |m|
123
- rubbishness(m.name)
124
- end
125
-
126
- found = []
127
- values.select do |x|
128
- (!found.any?{ |y| x == y }) && found << x
129
- end
130
- end.flatten(1)
131
- end
49
+ Also check out `find-method` command (run `help find-method`).
50
+ BANNER
132
51
 
133
- # When removing jruby aliases, we want to keep the alias that is "least rubbish"
134
- # according to this metric.
135
- def rubbishness(name)
136
- name.each_char.map{ |x|
137
- case x
138
- when /[A-Z]/
139
- 1
140
- when '?', '=', '!'
141
- -2
142
- else
143
- 0
52
+ def options(opt)
53
+ opt.on :m, :methods, "Show public methods defined on the Object"
54
+ opt.on :M, "instance-methods", "Show public methods defined in a " \
55
+ "Module or Class"
56
+ opt.on :p, :ppp, "Show public, protected (in yellow) and private " \
57
+ "(in green) methods"
58
+ opt.on :q, :quiet, "Show only methods defined on object.singleton_class " \
59
+ "and object.class"
60
+ opt.on :v, :verbose, "Show methods and constants on all super-classes " \
61
+ "(ignores Pry.config.ls.ceiling)"
62
+ opt.on :g, :globals, "Show global variables, including those builtin to " \
63
+ "Ruby (in cyan)"
64
+ opt.on :l, :locals, "Show hash of local vars, sorted by descending size"
65
+ opt.on :c, :constants, "Show constants, highlighting classes (in blue), " \
66
+ "and exceptions (in purple).\n" \
67
+ "#{' ' * 32}Constants that are pending autoload? " \
68
+ "are also shown (in yellow)"
69
+ opt.on :i, :ivars, "Show instance variables (in blue) and class " \
70
+ "variables (in bright blue)"
71
+ opt.on :G, :grep, "Filter output by regular expression", argument: true
72
+
73
+ if Object.respond_to?(:deprecate_constant)
74
+ opt.on :d, :dconstants, "Show deprecated constants"
144
75
  end
145
- }.inject(&:+) + (name.size / 100.0)
146
- end
147
-
148
- def resolution_order(obj)
149
- opts.present?(:'instance-methods') ? Pry::Method.instance_resolution_order(obj) : Pry::Method.resolution_order(obj)
150
- end
151
-
152
- # Get a lambda that can be used with .take_while to prevent over-eager
153
- # traversal of the Object's ancestry graph.
154
- def below_ceiling(obj)
155
- ceiling = if opts.present?(:quiet)
156
- [opts.present?(:'instance-methods') ? obj.ancestors[1] : obj.class.ancestors[1]] + Pry.config.ls.ceiling
157
- elsif opts.present?(:verbose)
158
- []
159
- else
160
- Pry.config.ls.ceiling.dup
161
- end
162
-
163
- lambda { |klass| !ceiling.include?(klass) }
164
- end
165
-
166
- def raise_errors_if_arguments_are_weird
167
- [
168
- ["-l does not make sense with a specified Object", :locals, !args.empty?],
169
- ["-g does not make sense with a specified Object", :globals, !args.empty?],
170
- ["-q does not make sense with -v", :quiet, opts.present?(:verbose)],
171
- ["-M only makes sense with a Module or a Class", :'instance-methods', !interrogating_a_module?],
172
- ["-c only makes sense with a Module or a Class", :constants, !args.empty? && !interrogating_a_module?],
173
- ].each do |message, option, expression|
174
- raise Pry::CommandError, message if opts.present?(option) && expression
175
- end
176
- end
177
-
178
- def interrogating_a_module?
179
- (Module === object_to_interrogate)
180
- end
181
76
 
182
- def write_out_globals
183
- return unless opts.present?(:globals)
77
+ return unless Helpers::Platform.jruby?
184
78
 
185
- output_section("global variables", grep[format_globals(target.eval("global_variables"))])
186
- end
187
-
188
- def write_out_constants
189
- return unless opts.present?(:constants) || (!has_user_specified_any_options && interrogating_a_module?)
190
-
191
- mod = interrogating_a_module? ? object_to_interrogate : Object
192
- constants = WrappedModule.new(mod).constants(opts.present?(:verbose))
193
- output_section("constants", grep[format_constants(mod, constants)])
194
- end
195
-
196
- def write_out_methods
197
- return unless opts.present?(:methods) || opts.present?(:'instance-methods') || opts.present?(:ppp) || !has_user_specified_any_options
198
-
199
- # methods is a hash {Module/Class => [Pry::Methods]}
200
- methods = all_methods(object_to_interrogate).group_by(&:owner)
201
-
202
- output = ""
203
- # reverse the resolution order so that the most useful information appears right by the prompt
204
- resolution_order(object_to_interrogate).take_while(&below_ceiling(object_to_interrogate)).reverse.each do |klass|
205
- methods_here = format_methods((methods[klass] || []).select{ |m| m.name =~ grep_regex })
206
- output << output_section("#{Pry::WrappedModule.new(klass).method_prefix}methods", methods_here)
79
+ opt.on :J, "all-java", "Show all the aliases for methods from java " \
80
+ "(default is to show only prettiest)"
207
81
  end
208
- output
209
- end
210
-
211
- def write_out_self_methods
212
- return unless (!has_user_specified_any_options && interrogating_a_module?)
213
-
214
- methods = all_methods(object_to_interrogate, true).select{ |m| m.owner == object_to_interrogate && m.name =~ grep_regex }
215
- output_section("#{Pry::WrappedModule.new(object_to_interrogate).method_prefix}methods", format_methods(methods))
216
- end
217
82
 
218
- def write_out_ivars
219
- return unless opts.present?(:ivars) || !has_user_specified_any_options
220
-
221
- klass = (interrogating_a_module? ? object_to_interrogate : object_to_interrogate.class)
222
- ivars = Pry::Method.safe_send(object_to_interrogate, :instance_variables)
223
- kvars = Pry::Method.safe_send(klass, :class_variables)
224
- output_section("instance variables", format_variables(:instance_var, ivars)) +
225
- output_section("class variables", format_variables(:class_var, kvars))
226
- end
227
-
228
- def write_out_local_names
229
- return unless !has_user_specified_any_options && args.empty?
230
-
231
- output_section("locals", format_local_names(grep[target.eval("local_variables")]))
232
- end
233
-
234
- def write_out_locals
235
- return unless opts.present?(:locals)
236
-
237
- loc_names = target.eval('local_variables').reject do |e|
238
- _pry_.sticky_locals.keys.include? e.to_sym
239
- end
240
- name_value_pairs = loc_names.map do |name|
241
- [name, (target.eval name.to_s)]
83
+ # Exclude -q, -v and --grep because they,
84
+ # don't specify what the user wants to see.
85
+ def no_user_opts?
86
+ !(opts[:methods] || opts['instance-methods'] || opts[:ppp] ||
87
+ opts[:globals] || opts[:locals] || opts[:constants] || opts[:ivars])
242
88
  end
243
- format_locals(name_value_pairs).join("")
244
- end
245
89
 
246
- # Format and colourise a list of methods.
247
- def format_methods(methods)
248
- methods.sort_by(&:name).map do |method|
249
- if method.name == 'method_missing'
250
- color(:method_missing, 'method_missing')
251
- elsif method.visibility == :private
252
- color(:private_method, method.name)
253
- elsif method.visibility == :protected
254
- color(:protected_method, method.name)
255
- else
256
- color(:public_method, method.name)
257
- end
90
+ def process
91
+ @interrogatee = args.empty? ? target_self : target.eval(args.join(' '))
92
+ raise_errors_if_arguments_are_weird
93
+ ls_entity = LsEntity.new(
94
+ interrogatee: @interrogatee,
95
+ no_user_opts: no_user_opts?,
96
+ opts: opts,
97
+ args: args,
98
+ pry_instance: pry_instance
99
+ )
100
+
101
+ pry_instance.pager.page ls_entity.entities_table
258
102
  end
259
- end
260
-
261
- def format_variables(type, vars)
262
- vars.sort_by(&:downcase).map{ |var| color(type, var) }
263
- end
264
-
265
- def format_constants(mod, constants)
266
- constants.sort_by(&:downcase).map do |name|
267
- if const = (!mod.autoload?(name) && (mod.const_get(name) || true) rescue nil)
268
- if (const < Exception rescue false)
269
- color(:exception_constant, name)
270
- elsif (Module === mod.const_get(name) rescue false)
271
- color(:class_constant, name)
272
- else
273
- color(:constant, name)
274
- end
275
- else
276
- color(:unloaded_constant, name)
277
- end
278
- end
279
- end
280
103
 
281
- def format_globals(globals)
282
- globals.sort_by(&:downcase).map do |name|
283
- if PSEUDO_GLOBALS.include?(name)
284
- color(:pseudo_global, name)
285
- elsif BUILTIN_GLOBALS.include?(name)
286
- color(:builtin_global, name)
287
- else
288
- color(:global_var, name)
289
- end
104
+ private
105
+
106
+ def error_list
107
+ any_args = args.any?
108
+ # rubocop:disable Style/CaseEquality
109
+ non_mod_interrogatee = !(Module === @interrogatee)
110
+ # rubocop:enable Style/CaseEquality
111
+ [
112
+ ['-l does not make sense with a specified Object', :locals, any_args],
113
+ ['-g does not make sense with a specified Object', :globals, any_args],
114
+ ['-q does not make sense with -v', :quiet, opts.present?(:verbose)],
115
+ [
116
+ '-M only makes sense with a Module or a Class', 'instance-methods',
117
+ non_mod_interrogatee
118
+ ],
119
+ [
120
+ '-c only makes sense with a Module or a Class', :constants,
121
+ any_args && non_mod_interrogatee
122
+ ]
123
+ ]
290
124
  end
291
- end
292
125
 
293
- def format_local_names(locals)
294
- locals.sort_by(&:downcase).map do |name|
295
- if _pry_.sticky_locals.include?(name.to_sym)
296
- color(:pry_var, name)
297
- else
298
- color(:local_var, name)
126
+ def raise_errors_if_arguments_are_weird
127
+ error_list.each do |message, option, invalid_expr|
128
+ raise Pry::CommandError, message if opts.present?(option) && invalid_expr
299
129
  end
300
130
  end
301
131
  end
302
132
 
303
- def format_locals(name_value_pairs)
304
- name_value_pairs.sort_by do |name, value|
305
- value.to_s.size
306
- end.reverse.map do |name, value|
307
- colorized_assignment_style(name, format_value(value))
308
- end
309
- end
310
-
311
- def colorized_assignment_style(lhs, rhs, desired_width = 7)
312
- colorized_lhs = color(:local_var, lhs)
313
- color_escape_padding = colorized_lhs.size - lhs.size
314
- pad = desired_width + color_escape_padding
315
- "%-#{pad}s = %s" % [color(:local_var, colorized_lhs), rhs]
316
- end
317
-
318
- def format_value(value)
319
- accumulator = StringIO.new
320
- Pry.output_with_default_format(accumulator, value, :hashrocket => false)
321
- accumulator.string
322
- end
323
-
324
- # Add a new section to the output. Outputs nothing if the section would be empty.
325
- def output_section(heading, body)
326
- return "" if body.compact.empty?
327
- fancy_heading = text.bold(color(:heading, heading))
328
- Pry::Helpers.tablify_or_one_line(fancy_heading, body)
329
- end
330
-
331
- # Color output based on config.ls.*_color
332
- def color(type, str)
333
- text.send(Pry.config.ls.send(:"#{type}_color"), str)
334
- end
133
+ Pry::Commands.add_command(Pry::Command::Ls)
335
134
  end
336
-
337
- Pry::Commands.add_command(Pry::Command::Ls)
338
135
  end
@@ -1,25 +1,29 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Pry
2
- class Command::Nesting < Pry::ClassCommand
3
- match 'nesting'
4
- group 'Navigating Pry'
5
- description 'Show nesting information.'
4
+ class Command
5
+ class Nesting < Pry::ClassCommand
6
+ match 'nesting'
7
+ group 'Navigating Pry'
8
+ description 'Show nesting information.'
6
9
 
7
- banner <<-'BANNER'
8
- Show nesting information.
9
- BANNER
10
+ banner <<-'BANNER'
11
+ Show nesting information.
12
+ BANNER
10
13
 
11
- def process
12
- output.puts 'Nesting status:'
13
- output.puts '--'
14
- _pry_.binding_stack.each_with_index do |obj, level|
15
- if level == 0
16
- output.puts "#{level}. #{Pry.view_clip(obj.eval('self'))} (Pry top level)"
17
- else
18
- output.puts "#{level}. #{Pry.view_clip(obj.eval('self'))}"
14
+ def process
15
+ output.puts 'Nesting status:'
16
+ output.puts '--'
17
+ pry_instance.binding_stack.each_with_index do |obj, level|
18
+ if level == 0
19
+ output.puts "#{level}. #{Pry.view_clip(obj.eval('self'))} (Pry top level)"
20
+ else
21
+ output.puts "#{level}. #{Pry.view_clip(obj.eval('self'))}"
22
+ end
19
23
  end
20
24
  end
21
25
  end
22
- end
23
26
 
24
- Pry::Commands.add_command(Pry::Command::Nesting)
27
+ Pry::Commands.add_command(Pry::Command::Nesting)
28
+ end
25
29
  end