class RuboCop::Cop::Lint::PercentStringArray

Checks for quotes and commas in %w, e.g. `%w('foo', “bar”)`

It is more likely that the additional characters are unintended (for example, mistranslating an array of literals to percent string notation) rather than meant to be part of the resulting strings.

@safety

The cop is unsafe because the correction changes the values in the array
and that might have been done purposely.

[source,ruby]
----
%w('foo', "bar") #=> ["'foo',", '"bar"']
%w(foo bar)      #=> ['foo', 'bar']
----

@example

# bad

%w('foo', "bar")

@example

# good

%w(foo bar)

Constants

LEADING_QUOTE
MSG
QUOTES_AND_COMMAS
TRAILING_QUOTE

Public Instance Methods

on_array(node) click to toggle source
# File lib/rubocop/cop/lint/percent_string_array.rb, line 44
def on_array(node)
  process(node, '%w', '%W')
end
on_percent_literal(node) click to toggle source
# File lib/rubocop/cop/lint/percent_string_array.rb, line 48
def on_percent_literal(node)
  return unless contains_quotes_or_commas?(node)

  add_offense(node) do |corrector|
    node.each_value do |value|
      range = value.loc.expression

      match = range.source.match(TRAILING_QUOTE)
      corrector.remove_trailing(range, match[0].length) if match

      corrector.remove_leading(range, 1) if LEADING_QUOTE.match?(range.source)
    end
  end
end

Private Instance Methods

contains_quotes_or_commas?(node) click to toggle source
# File lib/rubocop/cop/lint/percent_string_array.rb, line 65
def contains_quotes_or_commas?(node)
  node.values.any? do |value|
    literal = value.children.first.to_s.scrub

    # To avoid likely false positives (e.g. a single ' or ")
    next if literal.gsub(/[^[[:alnum:]]]/, '').empty?

    QUOTES_AND_COMMAS.any? { |pat| literal.match?(pat) }
  end
end