From ba1f761557b82009cc6047367a879bced171ed83 Mon Sep 17 00:00:00 2001 From: John Mair Date: Wed, 2 Jan 2013 17:53:01 +0100 Subject: [PATCH] amend-line: refactor + overengineer the f*ck out of it, for the lulz --- lib/pry/commands/amend_line.rb | 82 +++++++++++++++++++++++++++------- 1 file changed, 66 insertions(+), 16 deletions(-) diff --git a/lib/pry/commands/amend_line.rb b/lib/pry/commands/amend_line.rb index f4bc7845..90588af4 100644 --- a/lib/pry/commands/amend_line.rb +++ b/lib/pry/commands/amend_line.rb @@ -16,32 +16,82 @@ class Pry BANNER def process - start_line_number, end_line_number, replacement_line = *args + raise CommandError, "No input to amend." if eval_string.empty? - if eval_string.empty? - raise CommandError, "No input to amend." - end + eval_string.replace amended_input(eval_string) + run "show-input" + end - replacement_line = "" if !replacement_line + private + + # @param [String] string The string to amend. + # @return [String] A new string with the amendments applied to it. + def amended_input(string) input_array = eval_string.each_line.to_a - end_line_number = start_line_number.to_i if !end_line_number - line_range = start_line_number ? (one_index_number(start_line_number.to_i)..one_index_number(end_line_number.to_i)) : input_array.size - 1 - - # delete selected lines if replacement line is '!' if arg_string == "!" - input_array.slice!(line_range) + delete_from_array(input_array, line_range) elsif arg_string.start_with?(">") - insert_slot = Array(line_range).first - input_array.insert(insert_slot, arg_string[1..-1] + "\n") + insert_into_array(input_array, line_range) else - input_array[line_range] = arg_string + "\n" + replace_in_array(input_array, line_range) + end + + input_array.join + end + + def delete_from_array(array, range) + array.slice!(range) + end + + def insert_into_array(array, range) + insert_slot = Array(range).first + array.insert(insert_slot, arg_string[1..-1] + "\n") + end + + def replace_in_array(array, range) + array[range] = arg_string + "\n" + end + + # @return [Fixnum] The number of lines currently in `eval_string` (the input buffer). + def line_count + eval_string.lines.count + end + + # Returns the (one-indexed) start and end lines given by the user. + # The lines in this range will be affected by the `amend-line`. + # Returns `nil` if no lines were specified by the user. + # @return [Array, nil] + def start_and_end_line_number + start_line_number, end_line_number = args + end_line_number ||= start_line_number.to_i + + [start_line_number.to_i, end_line_number.to_i] if start_line_number + end + + # Takes two numbers that are 1-indexed, and returns a range (or + # number) that is 0-indexed. 1-indexed means the first element is + # indentified by 1 rather than by 0 (as is the case for Ruby arrays). + # @param [Fixnum] start_line_number One-indexed number. + # @param [Fixnum] end_line_number One-indexed number. + # @return [Range] The zero-indexed range. + def zero_indexed_range_from_one_indexed_numbers(start_line_number, end_line_number) + # FIXME: one_index_number is a horrible name for this method + one_index_number(start_line_number)..one_index_number(end_line_number) + end + + # The lines (or line) that will be modified by the `amend-line`. + # @return [Range, Fixnum] The lines or line. + def line_range + start_line_number, end_line_number = start_and_end_line_number + if start_line_number + zero_indexed_range_from_one_indexed_numbers(start_line_number, + end_line_number) + else + line_count - 1 end - eval_string.replace input_array.join - run "show-input" end end Pry::Commands.add_command(Pry::Command::AmendLine) end -