class RuboCop::Cop::Style::WordArray

Checks for array literals made up of word-like strings, that are not using the %w() syntax.

Alternatively, it can check for uses of the %w() syntax, in projects which do not want to include that syntax.

NOTE: When using the ‘percent` style, %w() arrays containing a space will be registered as offenses.

Configuration option: MinSize If set, arrays with fewer elements than this value will not trigger the cop. For example, a ‘MinSize` of `3` will not enforce a style on an array of 2 or fewer elements.

@example EnforcedStyle: percent (default)

# good
%w[foo bar baz]

# bad
['foo', 'bar', 'baz']

# bad (contains spaces)
%w[foo\ bar baz\ quux]

# bad
[
  ['one', 'One'],
  ['two', 'Two']
]

# good
[
  %w[one One],
  %w[two Two]
]

# good (2d array containing spaces)
[
  ['one', 'One'],
  ['two', 'Two'],
  ['forty two', 'Forty Two']
]

@example EnforcedStyle: brackets

# good
['foo', 'bar', 'baz']

# bad
%w[foo bar baz]

# good (contains spaces)
['foo bar', 'baz quux']

# good
[
  ['one', 'One'],
  ['two', 'Two']
]

# bad
[
  %w[one One],
  %w[two Two]
]

Constants

ARRAY_MSG
PERCENT_MSG

Attributes

largest_brackets[RW]

Public Instance Methods

on_array(node) click to toggle source
# File lib/rubocop/cop/style/word_array.rb, line 94
def on_array(node)
  if bracketed_array_of?(:str, node)
    return if complex_content?(node.values)
    return if within_matrix_of_complex_content?(node)

    check_bracketed_array(node, 'w')
  elsif node.percent_literal?(:string)
    check_percent_array(node)
  end
end
on_new_investigation() click to toggle source
Calls superclass method RuboCop::Cop::Base#on_new_investigation
# File lib/rubocop/cop/style/word_array.rb, line 85
def on_new_investigation
  super

  # Prevent O(n2) checks (checking the entire matrix once for each child array) by caching
  @matrix_of_complex_content_cache = Hash.new do |cache, node|
    cache[node] = matrix_of_complex_content?(node)
  end
end

Private Instance Methods

build_bracketed_array(node) click to toggle source
# File lib/rubocop/cop/style/word_array.rb, line 138
def build_bracketed_array(node)
  return '[]' if node.children.empty?

  words = node.children.map do |word|
    if word.dstr_type?
      string_literal = to_string_literal(word.source)

      trim_string_interpolation_escape_character(string_literal)
    else
      to_string_literal(word.children[0])
    end
  end
  build_bracketed_array_with_appropriate_whitespace(elements: words, node: node)
end
complex_content?(strings, complex_regex: word_regex) click to toggle source
# File lib/rubocop/cop/style/word_array.rb, line 118
def complex_content?(strings, complex_regex: word_regex)
  strings.any? do |s|
    next unless s.str_content

    string = s.str_content.dup.force_encoding(::Encoding::UTF_8)
    !string.valid_encoding? ||
      (complex_regex && !complex_regex.match?(string)) ||
      string.include?(' ')
  end
end
invalid_percent_array_contents?(node) click to toggle source
# File lib/rubocop/cop/style/word_array.rb, line 129
def invalid_percent_array_contents?(node)
  # Disallow %w() arrays that contain invalid encoding or spaces
  complex_content?(node.values, complex_regex: false)
end
matrix_of_complex_content?(array) click to toggle source
# File lib/rubocop/cop/style/word_array.rb, line 113
def matrix_of_complex_content?(array)
  array.values.all?(&:array_type?) &&
    array.values.any? { |subarray| complex_content?(subarray.values) }
end
within_matrix_of_complex_content?(node) click to toggle source
# File lib/rubocop/cop/style/word_array.rb, line 107
def within_matrix_of_complex_content?(node)
  return false unless (parent = node.parent)

  parent.array_type? && @matrix_of_complex_content_cache[parent]
end
word_regex() click to toggle source
# File lib/rubocop/cop/style/word_array.rb, line 134
def word_regex
  Regexp.new(cop_config['WordRegex'])
end