class RuboCop::Cop::InternalAffairs::UndefinedConfig

Looks for references to a cop configuration key that isn’t defined in config/default.yml.

Constants

ALLOWED_CONFIGURATIONS
CONFIG
CONFIG_PATH
MSG
RESTRICT_ON_SEND

Attributes

config_for_cop[R]
cop_class_name[R]

Public Instance Methods

on_new_investigation() click to toggle source
Calls superclass method RuboCop::Cop::Base#on_new_investigation
# File lib/rubocop/cop/internal_affairs/undefined_config.rb, line 37
def on_new_investigation
  super
  return unless processed_source.ast

  cop_class = cop_class_def(processed_source.ast).first
  return unless (@cop_class_name = extract_cop_name(cop_class))

  @config_for_cop = CONFIG[@cop_class_name] || {}
end
on_send(node) click to toggle source
# File lib/rubocop/cop/internal_affairs/undefined_config.rb, line 47
def on_send(node)
  return unless cop_class_name
  return unless (config_name_node = cop_config_accessor?(node))
  return if always_allowed?(config_name_node)
  return if configuration_key_defined?(config_name_node)

  message = format(MSG, name: config_name_node.value, cop: cop_class_name)
  add_offense(config_name_node, message: message)
end

Private Instance Methods

always_allowed?(node) click to toggle source
# File lib/rubocop/cop/internal_affairs/undefined_config.rb, line 73
def always_allowed?(node)
  ALLOWED_CONFIGURATIONS.include?(node.value)
end
configuration_key_defined?(node) click to toggle source
# File lib/rubocop/cop/internal_affairs/undefined_config.rb, line 77
def configuration_key_defined?(node)
  config_for_cop.key?(node.value)
end
extract_cop_name(class_node) click to toggle source
# File lib/rubocop/cop/internal_affairs/undefined_config.rb, line 61
def extract_cop_name(class_node)
  return unless class_node

  segments = [class_node].concat(
    class_node.each_ancestor(:class, :module).take_while do |n|
      n.identifier.short_name != :Cop
    end
  )

  segments.reverse_each.map { |s| s.identifier.short_name }.join('/')
end