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