Class: RuboCop::Cop::Cask::ArrayAlphabetization Private
- Extended by:
- AutoCorrector
- Defined in:
- rubocops/cask/array_alphabetization.rb
This class is part of a private API. This class may only be used in the Homebrew/brew repository. Third parties should avoid using this class if possible, as it may be removed or changed without warning.
Instance Method Summary collapse
- #on_send(node) ⇒ Object private
- #recursively_find_comments(source, index, line) ⇒ Object private
- #sort_array(source) ⇒ Object private
Instance Method Details
#on_send(node) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# File 'rubocops/cask/array_alphabetization.rb', line 10 def on_send(node) return unless [:zap, :uninstall].include?(node.method_name) node.each_descendant(:pair).each do |pair| symbols = pair.children.select(&:sym_type?).map(&:value) next if symbols.intersect?([:signal, :script, :early_script, :args, :input]) pair.each_descendant(:array).each do |array| if array.children.length == 1 add_offense(array, message: "Avoid single-element arrays by removing the []") do |corrector| corrector.replace(array.source_range, array.children.first.source) end end next if array.children.length <= 1 sorted_array = sort_array(array.source.split("\n")).join("\n") next if array.source == sorted_array add_offense(array, message: "The array elements should be ordered alphabetically") do |corrector| corrector.replace(array.source_range, sorted_array) end end end end |
#recursively_find_comments(source, index, line) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
61 62 63 64 65 66 67 |
# File 'rubocops/cask/array_alphabetization.rb', line 61 def recursively_find_comments(source, index, line) if source[index - 1].strip.start_with?("#") return recursively_find_comments(source, index - 1, "#{source[index - 1]}\n#{line}") end line end |
#sort_array(source) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# File 'rubocops/cask/array_alphabetization.rb', line 37 def sort_array(source) # Combine each comment with the line(s) below so that they remain in the same relative location combined_source = source.each_with_index.filter_map do |line, index| next if line.blank? next if line.strip.start_with?("#") next recursively_find_comments(source, index, line) end # Separate the lines into those that should be sorted and those that should not # i.e. skip the opening and closing brackets of the array. to_sort, to_keep = combined_source.partition { |line| !line.include?("[") && !line.include?("]") } # Sort the lines that should be sorted to_sort.sort! do |a, b| a_non_comment = a.split("\n").reject { |line| line.strip.start_with?("#") }.first b_non_comment = b.split("\n").reject { |line| line.strip.start_with?("#") }.first a_non_comment.downcase <=> b_non_comment.downcase end # Merge the sorted lines and the unsorted lines, preserving the original positions of the unsorted lines combined_source.map { |line| to_keep.include?(line) ? line : to_sort.shift } end |