class RuboCop::Cop::Rails::DynamicFindBy

User.find_by!(email: email)
# good
User.find_by(name: name, email: email)
# good
User.find_by(name: name)
# good
User.find_by_email!(name)
# bad
User.find_by_name_and_email(name)
# bad
User.find_by_name(name)
# bad
@example
See. github.com/rubocop-hq/rails-style-guide#find_by<br>Use ‘find_by` instead of dynamic method.
This cop checks dynamic `find_by_*` methods.

def autocorrect(node)

def autocorrect(node)
  _receiver, method, *args = *node
  static_name = static_method_name(method.to_s)
  keywords = column_keywords(method)
  return if keywords.size != args.size
  lambda do |corrector|
    corrector.replace(node.loc.selector, static_name)
    keywords.each.with_index do |keyword, idx|
      corrector.insert_before(args[idx].loc.expression, keyword)
    end
  end
end

def column_keywords(method)

def column_keywords(method)
  keyword_string = method.to_s[METHOD_PATTERN, 1]
  keyword_string.split('_and_').map { |keyword| "#{keyword}: " }
end

def on_send(node)

def on_send(node)
  method_name = node.method_name.to_s
  return if whitelist.include?(method_name)
  static_name = static_method_name(method_name)
  return unless static_name
  add_offense(node,
              message: format(MSG, static_name: static_name,
                                   method: node.method_name))
end

def static_method_name(method_name)

If code isn't wrong, returns nil
Returns static method name.
def static_method_name(method_name)
  match = METHOD_PATTERN.match(method_name)
  return nil unless match
  match[2] ? 'find_by!' : 'find_by'
end

def whitelist

def whitelist
  cop_config['Whitelist']
end