class RuboCop::Cop::RSpec::RepeatedIncludeExample
end
it_should_behave_like ‘a goose’
it_should_behave_like ‘a duck’
context ‘foo’ do
# good
end
it_behaves_like ‘a cool’, ‘person’
it_behaves_like ‘a cool’, ‘thing’
describe ‘foo’ do
# good
end
include_examples ‘cool stuff’
describe ‘bar’ do
end
include_examples ‘cool stuff’
describe ‘foo’ do
# good
end
it_should_behave_like ‘a duck’
it_should_behave_like ‘a duck’
context ‘foo’ do
# bad
end
it_behaves_like ‘a cool’, ‘thing’
it_behaves_like ‘a cool’, ‘thing’
describe ‘foo’ do
# bad
end
include_examples ‘cool stuff’
include_examples ‘cool stuff’
describe ‘foo’ do
# bad
@example
Check for repeated include of shared examples.
def add_repeated_lines(items)
def add_repeated_lines(items) repeated_lines = items.map(&:first_line) items.map { |item| [item, repeated_lines - [item.first_line]] } end
def literal_include_examples?(node)
def literal_include_examples?(node) include_examples?(node) && node.arguments.all?(&:recursive_literal_or_const?) end
def message(item, repeats)
def message(item, repeats) format(MSG, name: shared_examples_name(item).source, repeat: repeats) end
def on_begin(node)
def on_begin(node) return unless several_include_examples?(node) repeated_include_examples(node).each do |item, repeats| add_offense(item, message: message(item, repeats)) end end
def repeated_include_examples(node)
def repeated_include_examples(node) node .children .select { |child| literal_include_examples?(child) } .group_by { |child| signature_keys(child) } .values .reject(&:one?) .flat_map { |items| add_repeated_lines(items) } end
def signature_keys(item)
def signature_keys(item) item.arguments end