pry 0.12.0 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (158) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +162 -1
  3. data/LICENSE +1 -1
  4. data/README.md +331 -269
  5. data/bin/pry +5 -0
  6. data/lib/pry.rb +132 -119
  7. data/lib/pry/basic_object.rb +8 -4
  8. data/lib/pry/block_command.rb +22 -0
  9. data/lib/pry/class_command.rb +194 -0
  10. data/lib/pry/cli.rb +43 -51
  11. data/lib/pry/code.rb +40 -28
  12. data/lib/pry/code/code_file.rb +28 -24
  13. data/lib/pry/code/code_range.rb +4 -2
  14. data/lib/pry/code/loc.rb +15 -8
  15. data/lib/pry/code_object.rb +40 -38
  16. data/lib/pry/color_printer.rb +47 -46
  17. data/lib/pry/command.rb +166 -369
  18. data/lib/pry/command_set.rb +76 -73
  19. data/lib/pry/command_state.rb +31 -0
  20. data/lib/pry/commands/amend_line.rb +86 -81
  21. data/lib/pry/commands/bang.rb +18 -14
  22. data/lib/pry/commands/bang_pry.rb +15 -11
  23. data/lib/pry/commands/cat.rb +61 -54
  24. data/lib/pry/commands/cat/abstract_formatter.rb +23 -18
  25. data/lib/pry/commands/cat/exception_formatter.rb +71 -60
  26. data/lib/pry/commands/cat/file_formatter.rb +55 -49
  27. data/lib/pry/commands/cat/input_expression_formatter.rb +35 -30
  28. data/lib/pry/commands/cd.rb +40 -35
  29. data/lib/pry/commands/change_inspector.rb +29 -22
  30. data/lib/pry/commands/change_prompt.rb +44 -39
  31. data/lib/pry/commands/clear_screen.rb +16 -10
  32. data/lib/pry/commands/code_collector.rb +148 -133
  33. data/lib/pry/commands/disable_pry.rb +23 -19
  34. data/lib/pry/commands/easter_eggs.rb +19 -30
  35. data/lib/pry/commands/edit.rb +184 -161
  36. data/lib/pry/commands/edit/exception_patcher.rb +21 -17
  37. data/lib/pry/commands/edit/file_and_line_locator.rb +34 -23
  38. data/lib/pry/commands/exit.rb +39 -35
  39. data/lib/pry/commands/exit_all.rb +24 -20
  40. data/lib/pry/commands/exit_program.rb +20 -16
  41. data/lib/pry/commands/find_method.rb +168 -160
  42. data/lib/pry/commands/fix_indent.rb +16 -12
  43. data/lib/pry/commands/help.rb +140 -133
  44. data/lib/pry/commands/hist.rb +151 -150
  45. data/lib/pry/commands/import_set.rb +20 -16
  46. data/lib/pry/commands/jump_to.rb +25 -21
  47. data/lib/pry/commands/list_inspectors.rb +35 -28
  48. data/lib/pry/commands/ls.rb +124 -102
  49. data/lib/pry/commands/ls/constants.rb +59 -42
  50. data/lib/pry/commands/ls/formatter.rb +50 -46
  51. data/lib/pry/commands/ls/globals.rb +38 -34
  52. data/lib/pry/commands/ls/grep.rb +17 -13
  53. data/lib/pry/commands/ls/instance_vars.rb +29 -27
  54. data/lib/pry/commands/ls/interrogatable.rb +18 -12
  55. data/lib/pry/commands/ls/jruby_hacks.rb +47 -41
  56. data/lib/pry/commands/ls/local_names.rb +26 -22
  57. data/lib/pry/commands/ls/local_vars.rb +38 -28
  58. data/lib/pry/commands/ls/ls_entity.rb +47 -51
  59. data/lib/pry/commands/ls/methods.rb +44 -43
  60. data/lib/pry/commands/ls/methods_helper.rb +46 -42
  61. data/lib/pry/commands/ls/self_methods.rb +23 -22
  62. data/lib/pry/commands/nesting.rb +21 -17
  63. data/lib/pry/commands/play.rb +93 -82
  64. data/lib/pry/commands/pry_backtrace.rb +22 -17
  65. data/lib/pry/commands/pry_version.rb +15 -11
  66. data/lib/pry/commands/raise_up.rb +27 -22
  67. data/lib/pry/commands/reload_code.rb +60 -48
  68. data/lib/pry/commands/reset.rb +16 -12
  69. data/lib/pry/commands/ri.rb +55 -45
  70. data/lib/pry/commands/save_file.rb +45 -43
  71. data/lib/pry/commands/shell_command.rb +51 -51
  72. data/lib/pry/commands/shell_mode.rb +21 -17
  73. data/lib/pry/commands/show_doc.rb +80 -68
  74. data/lib/pry/commands/show_info.rb +189 -171
  75. data/lib/pry/commands/show_input.rb +16 -11
  76. data/lib/pry/commands/show_source.rb +110 -45
  77. data/lib/pry/commands/stat.rb +35 -31
  78. data/lib/pry/commands/switch_to.rb +21 -15
  79. data/lib/pry/commands/toggle_color.rb +20 -16
  80. data/lib/pry/commands/watch_expression.rb +89 -86
  81. data/lib/pry/commands/watch_expression/expression.rb +32 -27
  82. data/lib/pry/commands/whereami.rb +156 -148
  83. data/lib/pry/commands/wtf.rb +75 -50
  84. data/lib/pry/config.rb +307 -25
  85. data/lib/pry/config/attributable.rb +22 -0
  86. data/lib/pry/config/lazy_value.rb +29 -0
  87. data/lib/pry/config/memoized_value.rb +34 -0
  88. data/lib/pry/config/value.rb +24 -0
  89. data/lib/pry/control_d_handler.rb +28 -0
  90. data/lib/pry/core_extensions.rb +9 -7
  91. data/lib/pry/editor.rb +48 -21
  92. data/lib/pry/env.rb +18 -0
  93. data/lib/pry/exception_handler.rb +43 -0
  94. data/lib/pry/exceptions.rb +13 -16
  95. data/lib/pry/forwardable.rb +5 -1
  96. data/lib/pry/helpers.rb +2 -0
  97. data/lib/pry/helpers/base_helpers.rb +68 -197
  98. data/lib/pry/helpers/command_helpers.rb +50 -61
  99. data/lib/pry/helpers/documentation_helpers.rb +20 -13
  100. data/lib/pry/helpers/options_helpers.rb +14 -7
  101. data/lib/pry/helpers/platform.rb +7 -5
  102. data/lib/pry/helpers/table.rb +33 -26
  103. data/lib/pry/helpers/text.rb +17 -14
  104. data/lib/pry/history.rb +48 -56
  105. data/lib/pry/hooks.rb +21 -12
  106. data/lib/pry/indent.rb +54 -50
  107. data/lib/pry/input_completer.rb +248 -230
  108. data/lib/pry/input_lock.rb +8 -9
  109. data/lib/pry/inspector.rb +36 -24
  110. data/lib/pry/last_exception.rb +45 -45
  111. data/lib/pry/method.rb +141 -94
  112. data/lib/pry/method/disowned.rb +16 -4
  113. data/lib/pry/method/patcher.rb +12 -3
  114. data/lib/pry/method/weird_method_locator.rb +68 -44
  115. data/lib/pry/object_path.rb +33 -25
  116. data/lib/pry/output.rb +121 -35
  117. data/lib/pry/pager.rb +186 -180
  118. data/lib/pry/prompt.rb +123 -54
  119. data/lib/pry/pry_class.rb +61 -103
  120. data/lib/pry/pry_instance.rb +217 -215
  121. data/lib/pry/repl.rb +18 -22
  122. data/lib/pry/repl_file_loader.rb +27 -21
  123. data/lib/pry/ring.rb +11 -6
  124. data/lib/pry/slop.rb +574 -563
  125. data/lib/pry/slop/commands.rb +164 -169
  126. data/lib/pry/slop/option.rb +172 -168
  127. data/lib/pry/syntax_highlighter.rb +26 -0
  128. data/lib/pry/system_command_handler.rb +17 -0
  129. data/lib/pry/testable.rb +59 -61
  130. data/lib/pry/testable/evalable.rb +21 -12
  131. data/lib/pry/testable/mockable.rb +18 -10
  132. data/lib/pry/testable/pry_tester.rb +71 -56
  133. data/lib/pry/testable/utility.rb +29 -21
  134. data/lib/pry/testable/variables.rb +49 -43
  135. data/lib/pry/version.rb +3 -1
  136. data/lib/pry/warning.rb +27 -0
  137. data/lib/pry/wrapped_module.rb +51 -42
  138. data/lib/pry/wrapped_module/candidate.rb +21 -14
  139. metadata +35 -35
  140. data/lib/pry/commands.rb +0 -6
  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/gem_readme.rb +0 -25
  147. data/lib/pry/commands/gem_search.rb +0 -40
  148. data/lib/pry/commands/gem_stats.rb +0 -83
  149. data/lib/pry/commands/gist.rb +0 -102
  150. data/lib/pry/commands/install_command.rb +0 -54
  151. data/lib/pry/config/behavior.rb +0 -255
  152. data/lib/pry/config/convenience.rb +0 -28
  153. data/lib/pry/config/default.rb +0 -159
  154. data/lib/pry/config/memoization.rb +0 -48
  155. data/lib/pry/platform.rb +0 -91
  156. data/lib/pry/plugins.rb +0 -122
  157. data/lib/pry/rubygem.rb +0 -84
  158. data/lib/pry/terminal.rb +0 -91
@@ -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)
@@ -29,16 +31,12 @@ class Pry
29
31
  # @option options [Boolean] :keep_retval Whether or not to use return value
30
32
  # of the block for return of `command` or just to return `nil`
31
33
  # (the default).
32
- # @option options [Array<String>] :requires_gem Whether the command has
33
- # any gem dependencies, if it does and dependencies not met then
34
- # command is disabled and a stub proc giving instructions to
35
- # install command is provided.
36
34
  # @option options [Boolean] :interpolate Whether string #{} based
37
35
  # interpolation is applied to the command arguments before
38
36
  # executing the command. Defaults to true.
39
37
  # @option options [String] :listing The listing name of the
40
38
  # command. That is the name by which the command is looked up by
41
- # help and by show-command. Necessary for commands with regex matches.
39
+ # help and by show-source. Necessary for commands with regex matches.
42
40
  # @option options [Boolean] :use_prefix Whether the command uses
43
41
  # `Pry.config.command_prefix` prefix (if one is defined). Defaults
44
42
  # to true.
@@ -57,31 +55,38 @@ class Pry
57
55
  # end
58
56
  #
59
57
  # # From pry:
60
- # # pry(main)> _pry_.commands = MyCommands
58
+ # # pry(main)> pry_instance.commands = MyCommands
61
59
  # # pry(main)> greet john
62
60
  # # Good afternoon John!
63
61
  # # pry(main)> help greet
64
62
  # # Greet somebody
65
63
  # @example Regexp command
66
64
  # MyCommands = Pry::CommandSet.new do
67
- # 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|
68
68
  # puts "hello #{name}, nice number: #{num}"
69
69
  # end
70
70
  # end
71
71
  #
72
72
  # # From pry:
73
- # # pry(main)> _pry_.commands = MyCommands
73
+ # # pry(main)> pry_instance.commands = MyCommands
74
74
  # # pry(main)> number-10 john
75
75
  # # hello john, nice number: 10
76
76
  # # pry(main)> help number
77
77
  # # number-N regex command
78
78
  def block_command(match, description = "No description.", options = {}, &block)
79
- description, options = ["No description.", description] if description.is_a?(Hash)
79
+ if description.is_a?(Hash)
80
+ options = description
81
+ description = "No description."
82
+ end
80
83
  options = Pry::Command.default_options(match).merge!(options)
81
84
 
82
- @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
+ )
83
88
  end
84
- alias_method :command, :block_command
89
+ alias command block_command
85
90
 
86
91
  # Defines a new Pry command class.
87
92
  #
@@ -99,7 +104,9 @@ class Pry
99
104
  # end
100
105
  #
101
106
  # def process
102
- # 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
103
110
  # result = args.join(" ")
104
111
  # result.downcase! if opts.present?(:downcase)
105
112
  # result.upcase! if opts.present?(:upcase)
@@ -108,10 +115,15 @@ class Pry
108
115
  # end
109
116
  #
110
117
  def create_command(match, description = "No description.", options = {}, &block)
111
- description, options = ["No description.", description] if description.is_a?(Hash)
118
+ if description.is_a?(Hash)
119
+ options = description
120
+ description = "No description."
121
+ end
112
122
  options = Pry::Command.default_options(match).merge!(options)
113
123
 
114
- @commands[match] = Pry::ClassCommand.subclass(match, description, options, helper_module, &block)
124
+ @commands[match] = Pry::ClassCommand.subclass(
125
+ match, description, options, helper_module, &block
126
+ )
115
127
  @commands[match].class_eval(&block)
116
128
  @commands[match]
117
129
  end
@@ -121,7 +133,8 @@ class Pry
121
133
  end
122
134
 
123
135
  # Removes some commands from the set
124
- # @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
125
138
  def delete(*searches)
126
139
  searches.each do |search|
127
140
  cmd = find_command_by_match_or_listing(search)
@@ -160,7 +173,7 @@ class Pry
160
173
  def find_command_by_match_or_listing(match_or_listing)
161
174
  cmd = (@commands[match_or_listing] ||
162
175
  Pry::Helpers::BaseHelpers.find_command(match_or_listing, @commands))
163
- cmd or raise ArgumentError, "Cannot find a command: '#{match_or_listing}'!"
176
+ cmd || raise(ArgumentError, "cannot find a command: '#{match_or_listing}'")
164
177
  end
165
178
 
166
179
  # Aliases a command
@@ -175,13 +188,13 @@ class Pry
175
188
  # @example Pass explicit description (overriding default).
176
189
  # Pry.config.commands.alias_command "lM", "ls -M", :desc => "cutiepie"
177
190
  def alias_command(match, action, options = {})
178
- cmd = find_command(action) or fail "Command: `#{action}` not found"
191
+ (cmd = find_command(action)) || raise("command: '#{action}' not found")
179
192
  original_options = cmd.options.dup
180
193
 
181
- options = original_options.merge!({
182
- desc: "Alias for `#{action}`",
183
- listing: match
184
- }).merge!(options)
194
+ options = original_options.merge!(
195
+ desc: "Alias for `#{action}`",
196
+ listing: match.is_a?(String) ? match : match.inspect
197
+ ).merge!(options)
185
198
 
186
199
  # ensure default description is used if desc is nil
187
200
  desc = options.delete(:desc).to_s
@@ -190,6 +203,7 @@ class Pry
190
203
  run action, *args
191
204
  end
192
205
 
206
+ # TODO: untested. What's this about?
193
207
  c.class_eval do
194
208
  define_method(:complete) do |input|
195
209
  cmd.new(context).complete(input)
@@ -225,17 +239,6 @@ class Pry
225
239
  @commands.delete(cmd.match)
226
240
  end
227
241
 
228
- def disabled_command(name_of_disabled_command, message, matcher = name_of_disabled_command)
229
- create_command name_of_disabled_command do
230
- match matcher
231
- description ""
232
-
233
- define_method(:process) do
234
- output.puts "DISABLED: #{message}"
235
- end
236
- end
237
- end
238
-
239
242
  # Sets or gets the description for a command (replacing the old
240
243
  # description). Returns current description if no description
241
244
  # parameter provided.
@@ -249,50 +252,33 @@ class Pry
249
252
  # Pry.config.commands.desc "amend-line"
250
253
  def desc(search, description = nil)
251
254
  cmd = find_command_by_match_or_listing(search)
252
- return cmd.description if !description
255
+ return cmd.description unless description
253
256
 
254
257
  cmd.description = description
255
258
  end
256
259
 
257
- # Defines helpers methods for this command sets.
258
- # Those helpers are only defined in this command set.
259
- #
260
- # @yield A block defining helper methods
261
- # @example
262
- # helpers do
263
- # def hello
264
- # puts "Hello!"
265
- # end
266
- #
267
- # include OtherModule
268
- # end
269
- def helpers(&block)
270
- helper_module.class_eval(&block)
271
- end
272
-
273
260
  # @return [Array]
274
261
  # The list of commands provided by the command set.
275
262
  def list_commands
276
263
  @commands.keys
277
264
  end
278
- alias_method :keys, :list_commands
265
+ alias keys list_commands
279
266
 
280
267
  def to_hash
281
268
  @commands.dup
282
269
  end
283
- alias_method :to_h, :to_hash
270
+ alias to_h to_hash
284
271
 
285
272
  # Find a command that matches the given line
286
273
  # @param [String] pattern The line that might be a command invocation
287
274
  # @return [Pry::Command, nil]
288
275
  def [](pattern)
289
- @commands.values.select do |command|
276
+ commands = @commands.values.select do |command|
290
277
  command.matches?(pattern)
291
- end.sort_by do |command|
292
- command.match_score(pattern)
293
- end.last
278
+ end
279
+ commands.max_by { |command| command.match_score(pattern) }
294
280
  end
295
- alias_method :find_command, :[]
281
+ alias find_command []
296
282
 
297
283
  #
298
284
  # Re-assign the command found at _pattern_ with _command_.
@@ -311,9 +297,11 @@ class Pry
311
297
  #
312
298
  def []=(pattern, command)
313
299
  if command.equal?(nil)
314
- return @commands.delete(pattern)
300
+ @commands.delete(pattern)
301
+ return
315
302
  end
316
- unless Class === command && command < Pry::Command
303
+
304
+ unless command.is_a?(Class) && command < Pry::Command
317
305
  raise TypeError, "command is not a subclass of Pry::Command"
318
306
  end
319
307
 
@@ -341,11 +329,12 @@ class Pry
341
329
  # @param [String] search The user's search.
342
330
  # @return [Pry::Command?]
343
331
  def find_command_for_help(search)
344
- find_command(search) || (begin
345
- find_command_by_match_or_listing(search)
346
- rescue ArgumentError
347
- nil
348
- end)
332
+ find_command(search) ||
333
+ (begin
334
+ find_command_by_match_or_listing(search)
335
+ rescue ArgumentError
336
+ nil
337
+ end)
349
338
  end
350
339
 
351
340
  # Is the given line a command invocation?
@@ -369,12 +358,6 @@ class Pry
369
358
  end
370
359
  end
371
360
 
372
- # @private (used for testing)
373
- def run_command(context, match, *args)
374
- command = @commands[match] or raise NoCommandError.new(match, self)
375
- command.new(context).call_safely(*args)
376
- end
377
-
378
361
  # Generate completions for the user's search.
379
362
  # @param [String] search The line to search for
380
363
  # @param [Hash] context The context to create the command with
@@ -383,11 +366,30 @@ class Pry
383
366
  if (command = find_command(search))
384
367
  command.new(context).complete(search)
385
368
  else
386
- @commands.keys.select do |key|
387
- String === key && key.start_with?(search)
388
- end.map { |key| key + " " }
369
+ keys = @commands.keys.select do |key|
370
+ key.is_a?(String) && key.start_with?(search)
371
+ end
372
+ keys.map { |key| key + " " }
389
373
  end
390
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
391
393
  end
392
394
 
393
395
  # Wraps the return result of process_commands, indicates if the
@@ -396,7 +398,8 @@ class Pry
396
398
  attr_reader :retval
397
399
 
398
400
  def initialize(is_command, retval = nil)
399
- @is_command, @retval = is_command, retval
401
+ @is_command = is_command
402
+ @retval = retval
400
403
  end
401
404
 
402
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
@@ -1,98 +1,103 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Pry
2
- class Command::AmendLine < Pry::ClassCommand
3
- match(/amend-line(?: (-?\d+)(?:\.\.(-?\d+))?)?/)
4
- group 'Editing'
5
- description 'Amend a line of input in multi-line mode.'
6
- command_options interpolate: false, listing: 'amend-line'
7
-
8
- banner <<-'BANNER'
9
- Amend a line of input in multi-line mode. `amend-line N`, where the N represents
10
- line to replace. Can also specify a range of lines using `amend-line N..M`
11
- syntax. Passing "!" as replacement content deletes the line(s) instead.
12
-
13
- amend-line 1 puts 'new' # replace line 1
14
- amend-line 1..4 ! # delete lines 1..4
15
- amend-line 3 >puts 'bye' # insert before line 3
16
- amend-line puts 'appended' # no line number modifies immediately preceding line
17
- BANNER
18
-
19
- def process
20
- raise CommandError, "No input to amend." if eval_string.empty?
21
-
22
- eval_string.replace(amend_input)
23
- run "fix-indent"
24
- run "show-input"
25
- end
4
+ class Command
5
+ class AmendLine < Pry::ClassCommand
6
+ match(/amend-line(?: (-?\d+)(?:\.\.(-?\d+))?)?/)
7
+ group 'Editing'
8
+ description 'Amend a line of input in multi-line mode.'
9
+ command_options interpolate: false, listing: 'amend-line'
10
+
11
+ banner <<-'BANNER'
12
+ Amend a line of input in multi-line mode. `amend-line N`, where the N represents
13
+ line to replace. Can also specify a range of lines using `amend-line N..M`
14
+ syntax. Passing "!" as replacement content deletes the line(s) instead.
15
+
16
+ amend-line 1 puts 'new' # replace line 1
17
+ amend-line 1..4 ! # delete lines 1..4
18
+ amend-line 3 >puts 'bye' # insert before line 3
19
+ amend-line puts 'appended' # no line number modifies immediately preceding line
20
+ BANNER
21
+
22
+ def process
23
+ raise CommandError, "No input to amend." if eval_string.empty?
24
+
25
+ eval_string.replace(amend_input)
26
+ run "fix-indent"
27
+ run "show-input"
28
+ end
26
29
 
27
- private
30
+ private
28
31
 
29
- # @return [String] A new string with the amendments applied to it.
30
- def amend_input
31
- input_array = eval_string.each_line.to_a
32
+ # @return [String] A new string with the amendments applied to it.
33
+ def amend_input
34
+ input_array = eval_string.each_line.to_a
32
35
 
33
- if arg_string == "!"
34
- delete_from_array(input_array, line_range)
35
- elsif arg_string.start_with?(">")
36
- insert_into_array(input_array, line_range)
37
- else
38
- replace_in_array(input_array, line_range)
39
- end
36
+ if arg_string == "!"
37
+ delete_from_array(input_array, line_range)
38
+ elsif arg_string.start_with?(">")
39
+ insert_into_array(input_array, line_range)
40
+ else
41
+ replace_in_array(input_array, line_range)
42
+ end
40
43
 
41
- input_array.join
42
- end
44
+ input_array.join
45
+ end
43
46
 
44
- def delete_from_array(array, range)
45
- array.slice!(range)
46
- end
47
+ def delete_from_array(array, range)
48
+ array.slice!(range)
49
+ end
47
50
 
48
- def insert_into_array(array, range)
49
- insert_slot = Array(range).first
50
- array.insert(insert_slot, arg_string[1..-1] << "\n")
51
- end
51
+ def insert_into_array(array, range)
52
+ insert_slot = Array(range).first
53
+ array.insert(insert_slot, arg_string[1..-1] << "\n")
54
+ end
52
55
 
53
- def replace_in_array(array, range)
54
- array[range] = arg_string + "\n"
55
- end
56
+ def replace_in_array(array, range)
57
+ array[range] = arg_string + "\n"
58
+ end
56
59
 
57
- # @return [Fixnum] The number of lines currently in `eval_string` (the input buffer).
58
- def line_count
59
- eval_string.lines.count
60
- end
60
+ # @return [Fixnum] The number of lines currently in `eval_string` (the
61
+ # input buffer)
62
+ def line_count
63
+ eval_string.lines.count
64
+ end
61
65
 
62
- # Returns the (one-indexed) start and end lines given by the user.
63
- # The lines in this range will be affected by the `amend-line`.
64
- # Returns `nil` if no lines were specified by the user.
65
- # @return [Array<Fixnum>, nil]
66
- def start_and_end_line_number
67
- start_line_number, end_line_number = args
68
- end_line_number ||= start_line_number.to_i
66
+ # Returns the (one-indexed) start and end lines given by the user.
67
+ # The lines in this range will be affected by the `amend-line`.
68
+ # Returns `nil` if no lines were specified by the user.
69
+ # @return [Array<Fixnum>, nil]
70
+ def start_and_end_line_number
71
+ start_line_number, end_line_number = args
72
+ end_line_number ||= start_line_number.to_i
69
73
 
70
- [start_line_number.to_i, end_line_number.to_i] if start_line_number
71
- end
74
+ [start_line_number.to_i, end_line_number.to_i] if start_line_number
75
+ end
72
76
 
73
- # Takes two numbers that are 1-indexed, and returns a range (or
74
- # number) that is 0-indexed. 1-indexed means the first element is
75
- # indentified by 1 rather than by 0 (as is the case for Ruby arrays).
76
- # @param [Fixnum] start_line_number One-indexed number.
77
- # @param [Fixnum] end_line_number One-indexed number.
78
- # @return [Range] The zero-indexed range.
79
- def zero_indexed_range_from_one_indexed_numbers(start_line_number, end_line_number)
80
- # FIXME: one_index_number is a horrible name for this method
81
- one_index_number(start_line_number)..one_index_number(end_line_number)
82
- end
77
+ # Takes two numbers that are 1-indexed, and returns a range (or
78
+ # number) that is 0-indexed. 1-indexed means the first element is
79
+ # indentified by 1 rather than by 0 (as is the case for Ruby arrays).
80
+ # @param [Fixnum] start_line_number One-indexed number.
81
+ # @param [Fixnum] end_line_number One-indexed number.
82
+ # @return [Range] The zero-indexed range.
83
+ def zero_indexed_range_from_one_indexed_numbers(start_line_number, end_line_number)
84
+ # FIXME: one_index_number is a horrible name for this method
85
+ one_index_number(start_line_number)..one_index_number(end_line_number)
86
+ end
83
87
 
84
- # The lines (or line) that will be modified by the `amend-line`.
85
- # @return [Range, Fixnum] The lines or line.
86
- def line_range
87
- start_line_number, end_line_number = start_and_end_line_number
88
- if start_line_number
89
- zero_indexed_range_from_one_indexed_numbers(start_line_number,
90
- end_line_number)
91
- else
92
- line_count - 1
88
+ # The lines (or line) that will be modified by the `amend-line`.
89
+ # @return [Range, Fixnum] The lines or line.
90
+ def line_range
91
+ start_line_number, end_line_number = start_and_end_line_number
92
+ if start_line_number
93
+ zero_indexed_range_from_one_indexed_numbers(start_line_number,
94
+ end_line_number)
95
+ else
96
+ line_count - 1
97
+ end
93
98
  end
94
99
  end
95
- end
96
100
 
97
- Pry::Commands.add_command(Pry::Command::AmendLine)
101
+ Pry::Commands.add_command(Pry::Command::AmendLine)
102
+ end
98
103
  end