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