class RuboCop::Cop::Gemspec::DuplicatedAssignment
end
spec.add_dependency(‘parser’, ‘>= 2.3.3.1’, ‘< 3.0’)
spec.add_dependency(‘parallel’, ‘~> 1.10’)
Gem::Specification.new do |spec|
# good
end
spec.requirements << ‘A good graphics card’
spec.requirements << ‘libmagick, v6.0’
Gem::Specification.new do |spec|
# good
end
spec.name = ‘rubocop’
Gem::Specification.new do |spec|
# good
end
spec.name = ‘rubocop2’
spec.name = ‘rubocop’
Gem::Specification.new do |spec|
# bad
@example
permitted because it is the intended use of appending values.
as ‘spec.requirements`, `spec.add_runtime_dependency`, and others are
an unintended usage. On the other hand, duplication of methods such
Assigning to an attribute with the same name using `spec.foo =` will be
in a gemspec.
An attribute assignment method calls should be listed only once
def duplicated_assignment_method_nodes
def duplicated_assignment_method_nodes assignment_method_declarations(processed_source.ast) .select(&:assignment_method?) .group_by(&:method_name) .values .select { |nodes| nodes.size > 1 } end
def match_block_variable_name?(receiver_name)
def match_block_variable_name?(receiver_name) gem_specification(processed_source.ast) do |block_variable_name| return block_variable_name == receiver_name end end
def on_new_investigation
def on_new_investigation return if processed_source.blank? duplicated_assignment_method_nodes.each do |nodes| nodes[1..].each do |node| register_offense(node, node.method_name, nodes.first.first_line) end end end
def register_offense(node, assignment, line_of_first_occurrence)
def register_offense(node, assignment, line_of_first_occurrence) line_range = node.loc.column...node.loc.last_column offense_location = source_range(processed_source.buffer, node.first_line, line_range) message = format( MSG, assignment: assignment, line_of_first_occurrence: line_of_first_occurrence ) add_offense(offense_location, message: message) end