1 2 3 4 5 6 7 8 9 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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
# frozen_string_literal: true
module RuboCop
module Cop
module RSpec
# Enforces use of string to titleize shared examples.
#
# @example
# # bad
# it_behaves_like :foo_bar_baz
# it_should_behave_like :foo_bar_baz
# shared_examples :foo_bar_baz
# shared_examples_for :foo_bar_baz
# include_examples :foo_bar_baz
#
# # good
# it_behaves_like 'foo bar baz'
# it_should_behave_like 'foo bar baz'
# shared_examples 'foo bar baz'
# shared_examples_for 'foo bar baz'
# include_examples 'foo bar baz'
#
class SharedExamples < Base
extend AutoCorrector
# @!method shared_examples(node)
def_node_matcher :shared_examples,
send_pattern(
'{#SharedGroups.all #Includes.all}'
)
def on_send(node)
shared_examples(node) do
ast_node = node.first_argument
next unless ast_node&.sym_type?
checker = Checker.new(ast_node)
add_offense(checker.node, message: checker.message) do |corrector|
corrector.replace(checker.node, checker.preferred_style)
end
end
end
# :nodoc:
class Checker
MSG = 'Prefer %<prefer>s over `%<current>s` ' \
'to titleize shared examples.'
attr_reader :node
def initialize(node)
@node = node
end
def message
format(MSG, prefer: preferred_style, current: symbol.inspect)
end
def preferred_style
string = symbol.to_s.tr('_', ' ')
wrap_with_single_quotes(string)
end
private
def symbol
node.value
end
def wrap_with_single_quotes(string)
"'#{string}'"
end
end
end
end
end
end
|