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