pry 0.9.12.2 → 0.14.2

Sign up to get free protection for your applications and to get access to all the features.
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