Class: RuboCop::Cop::Cask::ArrayAlphabetization Private

Inherits:
Base
  • Object
show all
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

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