class RuboCop::Cop::Rake::DuplicateNamespace

If namespaces are defined with the same name, Rake executes the both namespaces in definition order. It is redundant. You should squash them into one definition. This cop detects it.

@example

# bad
namespace :foo do
  task :bar do
  end
end
namespace :foo do
  task :hoge do
  end
end

# good
namespace :foo do
  task :bar do
  end
  task :hoge do
  end
end

Constants

MSG

Public Class Methods

new(*) click to toggle source
Calls superclass method
# File lib/rubocop/cop/rake/duplicate_namespace.rb, line 35
def initialize(*)
  super
  @namespaces = {}
end

Public Instance Methods

message_for_dup(previous:, current:, namespace:) click to toggle source
# File lib/rubocop/cop/rake/duplicate_namespace.rb, line 67
def message_for_dup(previous:, current:, namespace:)
  format(
    MSG,
    namespace: namespace,
    previous: source_location(previous),
    current: source_location(current),
  )
end
namespaces(node) click to toggle source
# File lib/rubocop/cop/rake/duplicate_namespace.rb, line 53
def namespaces(node)
  ns = []

  node.each_ancestor(:block) do |block_node|
    send_node = block_node.send_node
    next unless send_node.method?(:namespace)

    name = Helper::TaskName.task_name(send_node)
    ns << name
  end

  ns
end
on_namespace(node) click to toggle source
# File lib/rubocop/cop/rake/duplicate_namespace.rb, line 40
def on_namespace(node)
  namespaces = namespaces(node)
  return if namespaces.include?(nil)

  full_name = namespaces.reverse.join(':')
  if (previous = @namespaces[full_name])
    message = message_for_dup(previous: previous, current: node, namespace: full_name)
    add_offense(node, message: message)
  else
    @namespaces[full_name] = node
  end
end
source_location(node) click to toggle source
# File lib/rubocop/cop/rake/duplicate_namespace.rb, line 76
def source_location(node)
  range = node.location.expression
  path = smart_path(range.source_buffer.name)
  "#{path}:#{range.line}"
end