pry 0.10.3 → 0.14.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (159) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +439 -16
  3. data/LICENSE +1 -1
  4. data/README.md +362 -302
  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 +84 -97
  10. data/lib/pry/code/code_file.rb +37 -26
  11. data/lib/pry/code/code_range.rb +7 -5
  12. data/lib/pry/code/loc.rb +26 -13
  13. data/lib/pry/code.rb +42 -31
  14. data/lib/pry/code_object.rb +53 -28
  15. data/lib/pry/color_printer.rb +46 -35
  16. data/lib/pry/command.rb +197 -369
  17. data/lib/pry/command_set.rb +89 -114
  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 -72
  24. data/lib/pry/commands/cat/file_formatter.rb +56 -46
  25. data/lib/pry/commands/cat/input_expression_formatter.rb +35 -30
  26. data/lib/pry/commands/cat.rb +62 -54
  27. data/lib/pry/commands/cd.rb +40 -35
  28. data/lib/pry/commands/change_inspector.rb +29 -22
  29. data/lib/pry/commands/change_prompt.rb +48 -23
  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 +34 -23
  36. data/lib/pry/commands/edit.rb +185 -157
  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 -16
  40. data/lib/pry/commands/find_method.rb +168 -162
  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 +151 -149
  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 +35 -28
  47. data/lib/pry/commands/ls/constants.rb +59 -31
  48. data/lib/pry/commands/ls/formatter.rb +42 -36
  49. data/lib/pry/commands/ls/globals.rb +38 -36
  50. data/lib/pry/commands/ls/grep.rb +17 -15
  51. data/lib/pry/commands/ls/instance_vars.rb +29 -28
  52. data/lib/pry/commands/ls/interrogatable.rb +18 -12
  53. data/lib/pry/commands/ls/jruby_hacks.rb +47 -41
  54. data/lib/pry/commands/ls/local_names.rb +26 -24
  55. data/lib/pry/commands/ls/local_vars.rb +38 -30
  56. data/lib/pry/commands/ls/ls_entity.rb +47 -52
  57. data/lib/pry/commands/ls/methods.rb +49 -51
  58. data/lib/pry/commands/ls/methods_helper.rb +46 -42
  59. data/lib/pry/commands/ls/self_methods.rb +23 -21
  60. data/lib/pry/commands/ls.rb +124 -103
  61. data/lib/pry/commands/nesting.rb +21 -17
  62. data/lib/pry/commands/play.rb +92 -82
  63. data/lib/pry/commands/pry_backtrace.rb +22 -17
  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 +60 -48
  67. data/lib/pry/commands/reset.rb +16 -12
  68. data/lib/pry/commands/ri.rb +57 -42
  69. data/lib/pry/commands/save_file.rb +45 -43
  70. data/lib/pry/commands/shell_command.rb +56 -29
  71. data/lib/pry/commands/shell_mode.rb +22 -18
  72. data/lib/pry/commands/show_doc.rb +80 -70
  73. data/lib/pry/commands/show_info.rb +194 -155
  74. data/lib/pry/commands/show_input.rb +16 -11
  75. data/lib/pry/commands/show_source.rb +110 -42
  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 +20 -16
  79. data/lib/pry/commands/watch_expression/expression.rb +32 -27
  80. data/lib/pry/commands/watch_expression.rb +89 -84
  81. data/lib/pry/commands/whereami.rb +156 -141
  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 +310 -20
  88. data/lib/pry/control_d_handler.rb +28 -0
  89. data/lib/pry/core_extensions.rb +22 -9
  90. data/lib/pry/editor.rb +56 -34
  91. data/lib/pry/env.rb +18 -0
  92. data/lib/pry/exception_handler.rb +43 -0
  93. data/lib/pry/exceptions.rb +13 -18
  94. data/lib/pry/forwardable.rb +27 -0
  95. data/lib/pry/helpers/base_helpers.rb +20 -62
  96. data/lib/pry/helpers/command_helpers.rb +52 -62
  97. data/lib/pry/helpers/documentation_helpers.rb +21 -12
  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 -85
  102. data/lib/pry/helpers.rb +3 -0
  103. data/lib/pry/history.rb +81 -55
  104. data/lib/pry/hooks.rb +60 -110
  105. data/lib/pry/indent.rb +74 -68
  106. data/lib/pry/input_completer.rb +199 -158
  107. data/lib/pry/input_lock.rb +7 -10
  108. data/lib/pry/inspector.rb +36 -24
  109. data/lib/pry/last_exception.rb +45 -45
  110. data/lib/pry/method/disowned.rb +19 -5
  111. data/lib/pry/method/patcher.rb +14 -8
  112. data/lib/pry/method/weird_method_locator.rb +79 -45
  113. data/lib/pry/method.rb +178 -124
  114. data/lib/pry/object_path.rb +37 -28
  115. data/lib/pry/output.rb +102 -16
  116. data/lib/pry/pager.rb +187 -174
  117. data/lib/pry/prompt.rb +213 -25
  118. data/lib/pry/pry_class.rb +119 -98
  119. data/lib/pry/pry_instance.rb +261 -224
  120. data/lib/pry/repl.rb +83 -29
  121. data/lib/pry/repl_file_loader.rb +27 -22
  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} +35 -32
  138. data/lib/pry/wrapped_module.rb +68 -63
  139. data/lib/pry.rb +133 -149
  140. metadata +58 -69
  141. data/lib/pry/commands/disabled_commands.rb +0 -2
  142. data/lib/pry/commands/gem_cd.rb +0 -26
  143. data/lib/pry/commands/gem_install.rb +0 -32
  144. data/lib/pry/commands/gem_list.rb +0 -33
  145. data/lib/pry/commands/gem_open.rb +0 -29
  146. data/lib/pry/commands/gist.rb +0 -101
  147. data/lib/pry/commands/install_command.rb +0 -53
  148. data/lib/pry/commands/list_prompts.rb +0 -35
  149. data/lib/pry/commands/simple_prompt.rb +0 -22
  150. data/lib/pry/commands.rb +0 -6
  151. data/lib/pry/config/behavior.rb +0 -139
  152. data/lib/pry/config/convenience.rb +0 -25
  153. data/lib/pry/config/default.rb +0 -161
  154. data/lib/pry/history_array.rb +0 -121
  155. data/lib/pry/plugins.rb +0 -103
  156. data/lib/pry/rbx_path.rb +0 -22
  157. data/lib/pry/rubygem.rb +0 -82
  158. data/lib/pry/terminal.rb +0 -79
  159. data/lib/pry/test/helper.rb +0 -170
@@ -1,193 +1,199 @@
1
- class Pry
2
- class Command::FindMethod < Pry::ClassCommand
3
- extend Pry::Helpers::BaseHelpers
4
-
5
- match 'find-method'
6
- group 'Context'
7
- description 'Recursively search for a method within a Class/Module or the current namespace.'
8
- command_options :shellwords => false
9
-
10
- banner <<-'BANNER'
11
- Usage: find-method [-n|-c] METHOD [NAMESPACE]
12
-
13
- Recursively search for a method within a Class/Module or the current namespace.
14
- Use the `-n` switch (the default) to search for methods whose name matches the
15
- given regex. Use the `-c` switch to search for methods that contain the given
16
- code.
17
-
18
- # Find all methods whose name match /re/ inside
19
- # the Pry namespace. Matches Pry#repl, etc.
20
- find-method re Pry
21
-
22
- # Find all methods that contain the code:
23
- # output.puts inside the Pry namepsace.
24
- find-method -c 'output.puts' Pry
25
- BANNER
26
-
27
- def options(opt)
28
- opt.on :n, :name, "Search for a method by name"
29
- opt.on :c, :content, "Search for a method based on content in Regex form"
30
- end
1
+ # frozen_string_literal: true
31
2
 
32
- def process
33
- return if args.size < 1
34
- klass = search_class
35
-
36
- matches = if opts.content?
37
- content_search(klass)
38
- else
39
- name_search(klass)
3
+ class Pry
4
+ class Command
5
+ class FindMethod < Pry::ClassCommand
6
+ extend Pry::Helpers::BaseHelpers
7
+
8
+ match 'find-method'
9
+ group 'Context'
10
+ description 'Recursively search for a method within a Class/Module or ' \
11
+ 'the current namespace.'
12
+ command_options shellwords: false
13
+
14
+ banner <<-'BANNER'
15
+ Usage: find-method [-n|-c] METHOD [NAMESPACE]
16
+
17
+ Recursively search for a method within a Class/Module or the current namespace.
18
+ Use the `-n` switch (the default) to search for methods whose name matches the
19
+ given regex. Use the `-c` switch to search for methods that contain the given
20
+ code.
21
+
22
+ # Find all methods whose name match /re/ inside
23
+ # the Pry namespace. Matches Pry#repl, etc.
24
+ find-method re Pry
25
+
26
+ # Find all methods that contain the code:
27
+ # output.puts inside the Pry namespace.
28
+ find-method -c 'output.puts' Pry
29
+ BANNER
30
+
31
+ def options(opt)
32
+ opt.on :n, :name, "Search for a method by name"
33
+ opt.on :c, :content, "Search for a method based on content in Regex form"
40
34
  end
41
35
 
42
- show_search_results(matches)
43
- end
44
-
45
- private
36
+ def process
37
+ return if args.empty?
46
38
 
47
- # @return [Regexp] The pattern to search for.
48
- def pattern
49
- @pattern ||= ::Regexp.new args[0]
50
- end
39
+ klass = search_class
51
40
 
52
- # Output the result of the search.
53
- #
54
- # @param [Array] matches
55
- def show_search_results(matches)
56
- if matches.empty?
57
- output.puts text.bold("No Methods Matched")
58
- else
59
- print_matches(matches)
41
+ matches = opts.content? ? content_search(klass) : name_search(klass)
42
+ show_search_results(matches)
60
43
  end
61
- end
62
44
 
63
- # The class to search for methods.
64
- # We only search classes, so if the search object is an
65
- # instance, return its class. If no search object is given
66
- # search `target_self`.
67
- def search_class
68
- klass = if args[1]
69
- target.eval(args[1])
70
- else
71
- target_self
72
- end
73
-
74
- klass.is_a?(Module) ? klass : klass.class
75
- end
45
+ private
76
46
 
77
- # pretty-print a list of matching methods.
78
- #
79
- # @param [Array<Method>] matches
80
- def print_matches(matches)
81
- grouped = matches.group_by(&:owner)
82
- order = grouped.keys.sort_by{ |x| x.name || x.to_s }
47
+ # @return [Regexp] The pattern to search for.
48
+ def pattern
49
+ @pattern ||= ::Regexp.new args[0]
50
+ end
83
51
 
84
- order.each do |klass|
85
- print_matches_for_class(klass, grouped)
52
+ # Output the result of the search.
53
+ #
54
+ # @param [Array] matches
55
+ def show_search_results(matches)
56
+ if matches.empty?
57
+ output.puts bold("No Methods Matched")
58
+ else
59
+ print_matches(matches)
60
+ end
86
61
  end
87
- end
88
62
 
89
- # Print matched methods for a class
90
- def print_matches_for_class(klass, grouped)
91
- output.puts text.bold(klass.name)
92
- grouped[klass].each do |method|
93
- header = method.name_with_owner
94
- output.puts header + additional_info(header, method)
63
+ # The class to search for methods.
64
+ # We only search classes, so if the search object is an
65
+ # instance, return its class. If no search object is given
66
+ # search `target_self`.
67
+ def search_class
68
+ klass = if args[1]
69
+ target.eval(args[1])
70
+ else
71
+ target_self
72
+ end
73
+
74
+ klass.is_a?(Module) ? klass : klass.class
95
75
  end
96
- end
97
76
 
98
- # Return the matched lines of method source if `-c` is given or ""
99
- # if `-c` was not given
100
- def additional_info(header, method)
101
- if opts.content?
102
- ": " << colorize_code(matched_method_lines(header, method))
103
- else
104
- ""
77
+ # pretty-print a list of matching methods.
78
+ #
79
+ # @param [Array<Method>] matches
80
+ def print_matches(matches)
81
+ grouped = matches.group_by(&:owner)
82
+ order = grouped.keys.sort_by { |x| x.name || x.to_s }
83
+
84
+ order.each do |klass|
85
+ print_matches_for_class(klass, grouped)
86
+ end
105
87
  end
106
- end
107
88
 
108
- def matched_method_lines(header, method)
109
- method.source.split(/\n/).select {|x| x =~ pattern }.join("\n#{' ' * header.length}")
110
- end
89
+ # Print matched methods for a class
90
+ def print_matches_for_class(klass, grouped)
91
+ output.puts bold(klass.name)
92
+ grouped[klass].each do |method|
93
+ header = method.name_with_owner
94
+ output.puts header + additional_info(header, method)
95
+ end
96
+ end
111
97
 
112
- # Run the given block against every constant in the provided namespace.
113
- #
114
- # @param [Module] klass The namespace in which to start the search.
115
- # @param [Hash<Module,Boolean>] done The namespaces we've already visited (private)
116
- # @yieldparam klass Each class/module in the namespace.
117
- #
118
- def recurse_namespace(klass, done={}, &block)
119
- return if !(Module === klass) || done[klass]
120
-
121
- done[klass] = true
122
-
123
- yield klass
124
-
125
- klass.constants.each do |name|
126
- next if klass.autoload?(name)
127
- begin
128
- const = klass.const_get(name)
129
- rescue RescuableException
130
- # constant loading is an inexact science at the best of times,
131
- # this often happens when a constant was .autoload? but someone
132
- # tried to load it. It's now not .autoload? but will still raise
133
- # a NameError when you access it.
98
+ # Return the matched lines of method source if `-c` is given or ""
99
+ # if `-c` was not given
100
+ def additional_info(header, method)
101
+ if opts.content?
102
+ ': ' + colorize_code(matched_method_lines(header, method))
134
103
  else
135
- recurse_namespace(const, done, &block)
104
+ ""
136
105
  end
137
106
  end
138
- end
139
107
 
140
- # Gather all the methods in a namespace that pass the given block.
141
- #
142
- # @param [Module] namespace The namespace in which to search.
143
- # @yieldparam [Method] method The method to test
144
- # @yieldreturn [Boolean]
145
- # @return [Array<Method>]
146
- #
147
- def search_all_methods(namespace)
148
- done = Hash.new{ |h,k| h[k] = {} }
149
- matches = []
150
-
151
- recurse_namespace(namespace) do |klass|
152
- (Pry::Method.all_from_class(klass) + Pry::Method.all_from_obj(klass)).each do |method|
153
- next if done[method.owner][method.name]
154
- done[method.owner][method.name] = true
155
-
156
- matches << method if yield method
108
+ def matched_method_lines(header, method)
109
+ method.source.split(/\n/).select { |x| x =~ pattern }.join(
110
+ "\n#{' ' * header.length}"
111
+ )
112
+ end
113
+
114
+ # Run the given block against every constant in the provided namespace.
115
+ #
116
+ # @param [Module] klass The namespace in which to start the search.
117
+ # @param [Hash<Module,Boolean>] done The namespaces we've already visited (private)
118
+ # @yieldparam klass Each class/module in the namespace.
119
+ #
120
+ def recurse_namespace(klass, done = {}, &block)
121
+ return if !klass.is_a?(Module) || done[klass]
122
+
123
+ done[klass] = true
124
+
125
+ yield klass
126
+
127
+ klass.constants.each do |name|
128
+ next if klass.autoload?(name)
129
+
130
+ begin
131
+ const = klass.const_get(name)
132
+ rescue RescuableException # rubocop:disable Lint/HandleExceptions
133
+ # constant loading is an inexact science at the best of times,
134
+ # this often happens when a constant was .autoload? but someone
135
+ # tried to load it. It's now not .autoload? but will still raise
136
+ # a NameError when you access it.
137
+ else
138
+ recurse_namespace(const, done, &block)
139
+ end
157
140
  end
158
141
  end
159
142
 
160
- matches
161
- end
143
+ # Gather all the methods in a namespace that pass the given block.
144
+ #
145
+ # @param [Module] namespace The namespace in which to search.
146
+ # @yieldparam [Method] method The method to test
147
+ # @yieldreturn [Boolean]
148
+ # @return [Array<Method>]
149
+ #
150
+ def search_all_methods(namespace)
151
+ done = Hash.new { |h, k| h[k] = {} }
152
+ matches = []
153
+
154
+ recurse_namespace(namespace) do |klass|
155
+ methods = Pry::Method.all_from_class(klass) + Pry::Method.all_from_obj(klass)
156
+ methods.each do |method|
157
+ next if done[method.owner][method.name]
158
+
159
+ done[method.owner][method.name] = true
160
+
161
+ matches << method if yield method
162
+ end
163
+ end
162
164
 
163
- # Search for all methods with a name that matches the given regex
164
- # within a namespace.
165
- #
166
- # @param [Module] namespace The namespace to search
167
- # @return [Array<Method>]
168
- #
169
- def name_search(namespace)
170
- search_all_methods(namespace) do |meth|
171
- meth.name =~ pattern
165
+ matches
172
166
  end
173
- end
174
167
 
175
- # Search for all methods who's implementation matches the given regex
176
- # within a namespace.
177
- #
178
- # @param [Module] namespace The namespace to search
179
- # @return [Array<Method>]
180
- #
181
- def content_search(namespace)
182
- search_all_methods(namespace) do |meth|
183
- begin
184
- meth.source =~ pattern
185
- rescue RescuableException
186
- false
168
+ # Search for all methods with a name that matches the given regex
169
+ # within a namespace.
170
+ #
171
+ # @param [Module] namespace The namespace to search
172
+ # @return [Array<Method>]
173
+ #
174
+ def name_search(namespace)
175
+ search_all_methods(namespace) do |meth|
176
+ meth.name =~ pattern
177
+ end
178
+ end
179
+
180
+ # Search for all methods who's implementation matches the given regex
181
+ # within a namespace.
182
+ #
183
+ # @param [Module] namespace The namespace to search
184
+ # @return [Array<Method>]
185
+ #
186
+ def content_search(namespace)
187
+ search_all_methods(namespace) do |meth|
188
+ begin
189
+ meth.source =~ pattern
190
+ rescue RescuableException
191
+ false
192
+ end
187
193
  end
188
194
  end
189
195
  end
190
- end
191
196
 
192
- Pry::Commands.add_command(Pry::Command::FindMethod)
197
+ Pry::Commands.add_command(Pry::Command::FindMethod)
198
+ end
193
199
  end
@@ -1,19 +1,23 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Pry
2
- class Command::FixIndent < Pry::ClassCommand
3
- match 'fix-indent'
4
- group 'Input and Output'
4
+ class Command
5
+ class FixIndent < Pry::ClassCommand
6
+ match 'fix-indent'
7
+ group 'Input and Output'
5
8
 
6
- description "Correct the indentation for contents of the input buffer"
9
+ description "Correct the indentation for contents of the input buffer"
7
10
 
8
- banner <<-USAGE
9
- Usage: fix-indent
10
- USAGE
11
+ banner <<-USAGE
12
+ Usage: fix-indent
13
+ USAGE
11
14
 
12
- def process
13
- indented_str = Pry::Indent.indent(eval_string)
14
- eval_string.replace indented_str
15
+ def process
16
+ indented_str = Pry::Indent.indent(eval_string)
17
+ pry_instance.eval_string = indented_str
18
+ end
15
19
  end
16
- end
17
20
 
18
- Pry::Commands.add_command(Pry::Command::FixIndent)
21
+ Pry::Commands.add_command(Pry::Command::FixIndent)
22
+ end
19
23
  end