class RuboCop::Cop::Naming::PredicateName

end
def value?
# good
end
def has_value?
end
def has_value
# bad
end
def even?(value)
# good
end
def is_even?(value)
end
def is_even(value)
# bad
@example
This cop makes sure that predicates are named properly.

def allowed_method_name?(method_name, prefix)

def allowed_method_name?(method_name, prefix)
  !(method_name.start_with?(prefix) && # cheap check to avoid allocating Regexp
      method_name.match?(/^#{prefix}[^0-9]/)) ||
    method_name == expected_name(method_name, prefix) ||
    method_name.end_with?('=') ||
    allowed_method?(method_name)
end

def expected_name(method_name, prefix)

def expected_name(method_name, prefix)
  new_name = if forbidden_prefixes.include?(prefix)
               method_name.sub(prefix, '')
             else
               method_name.dup
             end
  new_name << '?' unless method_name.end_with?('?')
  new_name
end

def forbidden_prefixes

def forbidden_prefixes
  cop_config['ForbiddenPrefixes']
end

def message(method_name, new_name)

def message(method_name, new_name)
  "Rename `#{method_name}` to `#{new_name}`."
end

def method_definition_macros(macro_name)

def method_definition_macros(macro_name)
  cop_config['MethodDefinitionMacros'].include?(macro_name.to_s)
end

def on_def(node)

def on_def(node)
  predicate_prefixes.each do |prefix|
    method_name = node.method_name.to_s
    next if allowed_method_name?(method_name, prefix)
    add_offense(
      node.loc.name,
      message: message(method_name, expected_name(method_name, prefix))
    )
  end
end

def on_send(node)

def on_send(node)
  dynamic_method_define(node) do |method_name|
    predicate_prefixes.each do |prefix|
      next if allowed_method_name?(method_name.to_s, prefix)
      add_offense(
        node.first_argument.loc.expression,
        message: message(method_name,
                         expected_name(method_name.to_s, prefix))
      )
    end
  end
end

def predicate_prefixes

def predicate_prefixes
  cop_config['NamePrefix']
end