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,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Pry
2
4
  class NoCommandError < StandardError
3
5
  def initialize(match, owner)
@@ -10,19 +12,15 @@ class Pry
10
12
  class CommandSet
11
13
  include Enumerable
12
14
  include Pry::Helpers::BaseHelpers
13
-
14
- attr_reader :commands
15
15
  attr_reader :helper_module
16
16
 
17
- # @param [Array<CommandSet>] imported_sets Sets which will be imported
18
- # automatically
17
+ # @param [Array<Commandset>] imported_sets
18
+ # Sets which will be imported automatically
19
19
  # @yield Optional block run to define commands
20
20
  def initialize(*imported_sets, &block)
21
21
  @commands = {}
22
22
  @helper_module = Module.new
23
-
24
23
  import(*imported_sets)
25
-
26
24
  instance_eval(&block) if block
27
25
  end
28
26
 
@@ -33,16 +31,12 @@ class Pry
33
31
  # @option options [Boolean] :keep_retval Whether or not to use return value
34
32
  # of the block for return of `command` or just to return `nil`
35
33
  # (the default).
36
- # @option options [Array<String>] :requires_gem Whether the command has
37
- # any gem dependencies, if it does and dependencies not met then
38
- # command is disabled and a stub proc giving instructions to
39
- # install command is provided.
40
34
  # @option options [Boolean] :interpolate Whether string #{} based
41
35
  # interpolation is applied to the command arguments before
42
36
  # executing the command. Defaults to true.
43
37
  # @option options [String] :listing The listing name of the
44
38
  # command. That is the name by which the command is looked up by
45
- # help and by show-command. Necessary for commands with regex matches.
39
+ # help and by show-source. Necessary for commands with regex matches.
46
40
  # @option options [Boolean] :use_prefix Whether the command uses
47
41
  # `Pry.config.command_prefix` prefix (if one is defined). Defaults
48
42
  # to true.
@@ -61,31 +55,38 @@ class Pry
61
55
  # end
62
56
  #
63
57
  # # From pry:
64
- # # pry(main)> _pry_.commands = MyCommands
58
+ # # pry(main)> pry_instance.commands = MyCommands
65
59
  # # pry(main)> greet john
66
60
  # # Good afternoon John!
67
61
  # # pry(main)> help greet
68
62
  # # Greet somebody
69
63
  # @example Regexp command
70
64
  # MyCommands = Pry::CommandSet.new do
71
- # command /number-(\d+)/, "number-N regex command", :listing => "number" do |num, name|
65
+ # command(
66
+ # /number-(\d+)/, "number-N regex command", :listing => "number"
67
+ # ) do |num, name|
72
68
  # puts "hello #{name}, nice number: #{num}"
73
69
  # end
74
70
  # end
75
71
  #
76
72
  # # From pry:
77
- # # pry(main)> _pry_.commands = MyCommands
73
+ # # pry(main)> pry_instance.commands = MyCommands
78
74
  # # pry(main)> number-10 john
79
75
  # # hello john, nice number: 10
80
76
  # # pry(main)> help number
81
77
  # # number-N regex command
82
- def block_command(match, description="No description.", options={}, &block)
83
- description, options = ["No description.", description] if description.is_a?(Hash)
78
+ def block_command(match, description = "No description.", options = {}, &block)
79
+ if description.is_a?(Hash)
80
+ options = description
81
+ description = "No description."
82
+ end
84
83
  options = Pry::Command.default_options(match).merge!(options)
85
84
 
86
- commands[match] = Pry::BlockCommand.subclass(match, description, options, helper_module, &block)
85
+ @commands[match] = Pry::BlockCommand.subclass(
86
+ match, description, options, helper_module, &block
87
+ )
87
88
  end
88
- alias_method :command, :block_command
89
+ alias command block_command
89
90
 
90
91
  # Defines a new Pry command class.
91
92
  #
@@ -103,7 +104,9 @@ class Pry
103
104
  # end
104
105
  #
105
106
  # def process
106
- # raise Pry::CommandError, "-u and -d makes no sense" if opts.present?(:u) && opts.present?(:d)
107
+ # if opts.present?(:u) && opts.present?(:d)
108
+ # raise Pry::CommandError, "-u and -d makes no sense"
109
+ # end
107
110
  # result = args.join(" ")
108
111
  # result.downcase! if opts.present?(:downcase)
109
112
  # result.upcase! if opts.present?(:upcase)
@@ -111,59 +114,31 @@ class Pry
111
114
  # end
112
115
  # end
113
116
  #
114
- def create_command(match, description="No description.", options={}, &block)
115
- description, options = ["No description.", description] if description.is_a?(Hash)
117
+ def create_command(match, description = "No description.", options = {}, &block)
118
+ if description.is_a?(Hash)
119
+ options = description
120
+ description = "No description."
121
+ end
116
122
  options = Pry::Command.default_options(match).merge!(options)
117
123
 
118
- commands[match] = Pry::ClassCommand.subclass(match, description, options, helper_module, &block)
119
- commands[match].class_eval(&block)
120
- commands[match]
121
- end
122
-
123
- # Execute a block of code before a command is invoked. The block also
124
- # gets access to parameters that will be passed to the command and
125
- # is evaluated in the same context.
126
- # @param [String, Regexp] search The match or listing of the command.
127
- # @yield The block to be run before the command.
128
- # @example Display parameter before invoking command
129
- # Pry.commands.before_command("whereami") do |n|
130
- # output.puts "parameter passed was #{n}"
131
- # end
132
- def before_command(search, &block)
133
- cmd = find_command_by_match_or_listing(search)
134
- cmd.hooks[:before].unshift block
135
- end
136
-
137
- # Execute a block of code after a command is invoked. The block also
138
- # gets access to parameters that will be passed to the command and
139
- # is evaluated in the same context.
140
- # @param [String, Regexp] search The match or listing of the command.
141
- # @yield The block to be run after the command.
142
- # @example Display text 'command complete' after invoking command
143
- # Pry.commands.after_command("whereami") do |n|
144
- # output.puts "command complete!"
145
- # end
146
- def after_command(search, &block)
147
- cmd = find_command_by_match_or_listing(search)
148
- cmd.hooks[:after] << block
124
+ @commands[match] = Pry::ClassCommand.subclass(
125
+ match, description, options, helper_module, &block
126
+ )
127
+ @commands[match].class_eval(&block)
128
+ @commands[match]
149
129
  end
150
130
 
151
131
  def each(&block)
152
132
  @commands.each(&block)
153
133
  end
154
134
 
155
- # Add a given command object to this set.
156
- # @param [Command] command The subclass of Pry::Command you wish to add.
157
- def add_command(command)
158
- commands[command.match] = command
159
- end
160
-
161
135
  # Removes some commands from the set
162
- # @param [Array<String>] searches the matches or listings of the commands to remove
136
+ # @param [Array<String>] searches the matches or listings of the commands
137
+ # to remove
163
138
  def delete(*searches)
164
139
  searches.each do |search|
165
140
  cmd = find_command_by_match_or_listing(search)
166
- commands.delete cmd.match
141
+ @commands.delete cmd.match
167
142
  end
168
143
  end
169
144
 
@@ -173,7 +148,7 @@ class Pry
173
148
  # @return [Pry::CommandSet] Returns the reciever (a command set).
174
149
  def import(*sets)
175
150
  sets.each do |set|
176
- commands.merge! set.commands
151
+ @commands.merge! set.to_hash
177
152
  helper_module.send :include, set.helper_module
178
153
  end
179
154
  self
@@ -187,7 +162,7 @@ class Pry
187
162
  helper_module.send :include, set.helper_module
188
163
  matches.each do |match|
189
164
  cmd = set.find_command_by_match_or_listing(match)
190
- commands[cmd.match] = cmd
165
+ @commands[cmd.match] = cmd
191
166
  end
192
167
  self
193
168
  end
@@ -196,9 +171,9 @@ class Pry
196
171
  # of the command to retrieve.
197
172
  # @return [Command] The command object matched.
198
173
  def find_command_by_match_or_listing(match_or_listing)
199
- cmd = (commands[match_or_listing] ||
200
- Pry::Helpers::BaseHelpers.find_command(match_or_listing, commands))
201
- cmd or raise ArgumentError, "Cannot find a command: '#{match_or_listing}'!"
174
+ cmd = (@commands[match_or_listing] ||
175
+ Pry::Helpers::BaseHelpers.find_command(match_or_listing, @commands))
176
+ cmd || raise(ArgumentError, "cannot find a command: '#{match_or_listing}'")
202
177
  end
203
178
 
204
179
  # Aliases a command
@@ -212,14 +187,14 @@ class Pry
212
187
  # Pry.config.commands.alias_command "lM", "ls -M"
213
188
  # @example Pass explicit description (overriding default).
214
189
  # Pry.config.commands.alias_command "lM", "ls -M", :desc => "cutiepie"
215
- def alias_command(match, action, options={})
216
- cmd = find_command(action) or fail "Command: `#{action}` not found"
190
+ def alias_command(match, action, options = {})
191
+ (cmd = find_command(action)) || raise("command: '#{action}' not found")
217
192
  original_options = cmd.options.dup
218
193
 
219
- options = original_options.merge!({
220
- :desc => "Alias for `#{action}`",
221
- :listing => match
222
- }).merge!(options)
194
+ options = original_options.merge!(
195
+ desc: "Alias for `#{action}`",
196
+ listing: match.is_a?(String) ? match : match.inspect
197
+ ).merge!(options)
223
198
 
224
199
  # ensure default description is used if desc is nil
225
200
  desc = options.delete(:desc).to_s
@@ -228,6 +203,7 @@ class Pry
228
203
  run action, *args
229
204
  end
230
205
 
206
+ # TODO: untested. What's this about?
231
207
  c.class_eval do
232
208
  define_method(:complete) do |input|
233
209
  cmd.new(context).complete(input)
@@ -248,30 +224,19 @@ class Pry
248
224
  # command description to be passed this way too.
249
225
  # @example Renaming the `ls` command and changing its description.
250
226
  # Pry.config.commands.rename "dir", "ls", :description => "DOS friendly ls"
251
- def rename_command(new_match, search, options={})
227
+ def rename_command(new_match, search, options = {})
252
228
  cmd = find_command_by_match_or_listing(search)
253
229
 
254
230
  options = {
255
- :listing => new_match,
256
- :description => cmd.description
231
+ listing: new_match,
232
+ description: cmd.description
257
233
  }.merge!(options)
258
234
 
259
- commands[new_match] = cmd.dup
260
- commands[new_match].match = new_match
261
- commands[new_match].description = options.delete(:description)
262
- commands[new_match].options.merge!(options)
263
- commands.delete(cmd.match)
264
- end
265
-
266
- def disabled_command(name_of_disabled_command, message, matcher=name_of_disabled_command)
267
- create_command name_of_disabled_command do
268
- match matcher
269
- description ""
270
-
271
- define_method(:process) do
272
- output.puts "DISABLED: #{message}"
273
- end
274
- end
235
+ @commands[new_match] = cmd.dup
236
+ @commands[new_match].match = new_match
237
+ @commands[new_match].description = options.delete(:description)
238
+ @commands[new_match].options.merge!(options)
239
+ @commands.delete(cmd.match)
275
240
  end
276
241
 
277
242
  # Sets or gets the description for a command (replacing the old
@@ -285,52 +250,91 @@ class Pry
285
250
  # end
286
251
  # @example Getting
287
252
  # Pry.config.commands.desc "amend-line"
288
- def desc(search, description=nil)
253
+ def desc(search, description = nil)
289
254
  cmd = find_command_by_match_or_listing(search)
290
- return cmd.description if !description
255
+ return cmd.description unless description
291
256
 
292
257
  cmd.description = description
293
258
  end
294
259
 
295
- # Defines helpers methods for this command sets.
296
- # Those helpers are only defined in this command set.
260
+ # @return [Array]
261
+ # The list of commands provided by the command set.
262
+ def list_commands
263
+ @commands.keys
264
+ end
265
+ alias keys list_commands
266
+
267
+ def to_hash
268
+ @commands.dup
269
+ end
270
+ alias to_h to_hash
271
+
272
+ # Find a command that matches the given line
273
+ # @param [String] pattern The line that might be a command invocation
274
+ # @return [Pry::Command, nil]
275
+ def [](pattern)
276
+ commands = @commands.values.select do |command|
277
+ command.matches?(pattern)
278
+ end
279
+ commands.max_by { |command| command.match_score(pattern) }
280
+ end
281
+ alias find_command []
282
+
283
+ #
284
+ # Re-assign the command found at _pattern_ with _command_.
285
+ #
286
+ # @param [Regexp, String] pattern
287
+ # The command to add or replace(found at _pattern_).
288
+ #
289
+ # @param [Pry::Command] command
290
+ # The command to add.
291
+ #
292
+ # @return [Pry::Command]
293
+ # Returns the new command (matched with "pattern".)
297
294
  #
298
- # @yield A block defining helper methods
299
295
  # @example
300
- # helpers do
301
- # def hello
302
- # puts "Hello!"
303
- # end
296
+ # Pry.config.commands["help"] = MyHelpCommand
304
297
  #
305
- # include OtherModule
306
- # end
307
- def helpers(&block)
308
- helper_module.class_eval(&block)
309
- end
298
+ def []=(pattern, command)
299
+ if command.equal?(nil)
300
+ @commands.delete(pattern)
301
+ return
302
+ end
310
303
 
304
+ unless command.is_a?(Class) && command < Pry::Command
305
+ raise TypeError, "command is not a subclass of Pry::Command"
306
+ end
311
307
 
312
- # @return [Array] The list of commands provided by the command set.
313
- def list_commands
314
- commands.keys
308
+ bind_command_to_pattern = pattern != command.match
309
+ if bind_command_to_pattern
310
+ command_copy = command.dup
311
+ command_copy.match = pattern
312
+ @commands[pattern] = command_copy
313
+ else
314
+ @commands[pattern] = command
315
+ end
315
316
  end
316
317
 
317
- # Find a command that matches the given line
318
- # @param [String] val The line that might be a command invocation
319
- # @return [Pry::Command, nil]
320
- def find_command(val)
321
- commands.values.select{ |c| c.matches?(val) }.sort_by{ |c| c.match_score(val) }.last
318
+ #
319
+ # Add a command to set.
320
+ #
321
+ # @param [Command] command
322
+ # a subclass of Pry::Command.
323
+ #
324
+ def add_command(command)
325
+ self[command.match] = command
322
326
  end
323
- alias_method :[], :find_command
324
327
 
325
328
  # Find the command that the user might be trying to refer to.
326
329
  # @param [String] search The user's search.
327
330
  # @return [Pry::Command?]
328
331
  def find_command_for_help(search)
329
- find_command(search) || (begin
330
- find_command_by_match_or_listing(search)
331
- rescue ArgumentError
332
- nil
333
- end)
332
+ find_command(search) ||
333
+ (begin
334
+ find_command_by_match_or_listing(search)
335
+ rescue ArgumentError
336
+ nil
337
+ end)
334
338
  end
335
339
 
336
340
  # Is the given line a command invocation?
@@ -344,9 +348,9 @@ class Pry
344
348
  # @param [String] val The line to execute
345
349
  # @param [Hash] context The context to execute the commands with
346
350
  # @return [CommandSet::Result]
347
- def process_line(val, context={})
348
- if command = find_command(val)
349
- context = context.merge(:command_set => self)
351
+ def process_line(val, context = {})
352
+ if (command = find_command(val))
353
+ context = context.merge(command_set: self)
350
354
  retval = command.new(context).process_line(val)
351
355
  Result.new(true, retval)
352
356
  else
@@ -354,25 +358,38 @@ class Pry
354
358
  end
355
359
  end
356
360
 
357
- # @private (used for testing)
358
- def run_command(context, match, *args)
359
- command = commands[match] or raise NoCommandError.new(match, self)
360
- command.new(context).call_safely(*args)
361
- end
362
-
363
361
  # Generate completions for the user's search.
364
362
  # @param [String] search The line to search for
365
363
  # @param [Hash] context The context to create the command with
366
364
  # @return [Array<String>]
367
- def complete(search, context={})
368
- if command = find_command(search)
365
+ def complete(search, context = {})
366
+ if (command = find_command(search))
369
367
  command.new(context).complete(search)
370
368
  else
371
- commands.keys.select do |x|
372
- String === x && x.start_with?(search)
373
- end.map{ |command| command + " " } + Bond::DefaultMission.completions
369
+ keys = @commands.keys.select do |key|
370
+ key.is_a?(String) && key.start_with?(search)
371
+ end
372
+ keys.map { |key| key + " " }
374
373
  end
375
374
  end
375
+
376
+ private
377
+
378
+ # Defines helpers methods for this command sets.
379
+ # Those helpers are only defined in this command set.
380
+ #
381
+ # @yield A block defining helper methods
382
+ # @example
383
+ # helpers do
384
+ # def hello
385
+ # puts "Hello!"
386
+ # end
387
+ #
388
+ # include OtherModule
389
+ # end
390
+ def helpers(&block)
391
+ helper_module.class_eval(&block)
392
+ end
376
393
  end
377
394
 
378
395
  # Wraps the return result of process_commands, indicates if the
@@ -381,7 +398,8 @@ class Pry
381
398
  attr_reader :retval
382
399
 
383
400
  def initialize(is_command, retval = nil)
384
- @is_command, @retval = is_command, retval
401
+ @is_command = is_command
402
+ @retval = retval
385
403
  end
386
404
 
387
405
  # Is the result a command?
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ostruct'
4
+
5
+ class Pry
6
+ # CommandState is a data structure to hold per-command state.
7
+ #
8
+ # Pry commands can store arbitrary state here. This state persists between
9
+ # subsequent command invocations. All state saved here is unique to the
10
+ # command.
11
+ #
12
+ # @since v0.13.0
13
+ # @api private
14
+ class CommandState
15
+ def self.default
16
+ @default ||= new
17
+ end
18
+
19
+ def initialize
20
+ @command_state = {}
21
+ end
22
+
23
+ def state_for(command_name)
24
+ @command_state[command_name] ||= OpenStruct.new
25
+ end
26
+
27
+ def reset(command_name)
28
+ @command_state[command_name] = OpenStruct.new
29
+ end
30
+ end
31
+ end