62 lines
1.7 KiB
Ruby
62 lines
1.7 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module RuboCop
|
||
|
module Cop
|
||
|
module Scalability
|
||
|
# This cop checks for `File` params in API
|
||
|
#
|
||
|
# @example
|
||
|
#
|
||
|
# # bad
|
||
|
# params do
|
||
|
# requires :file, type: File
|
||
|
# end
|
||
|
#
|
||
|
# params do
|
||
|
# optional :file, type: File
|
||
|
# end
|
||
|
#
|
||
|
# # good
|
||
|
# params do
|
||
|
# requires :file, type: ::API::Validations::Types::WorkhorseFile
|
||
|
# end
|
||
|
#
|
||
|
# params do
|
||
|
# optional :file, type: ::API::Validations::Types::WorkhorseFile
|
||
|
# end
|
||
|
#
|
||
|
class FileUploads < RuboCop::Cop::Cop
|
||
|
MSG = 'Do not upload files without workhorse acceleration. Please refer to https://docs.gitlab.com/ee/development/uploads.html'
|
||
|
|
||
|
def_node_search :file_type_params?, <<~PATTERN
|
||
|
(send nil? {:requires :optional} (sym _) (hash <(pair (sym :type)(const nil? :File)) ...>))
|
||
|
PATTERN
|
||
|
|
||
|
def_node_search :file_types_params?, <<~PATTERN
|
||
|
(send nil? {:requires :optional} (sym _) (hash <(pair (sym :types)(array <(const nil? :File) ...>)) ...>))
|
||
|
PATTERN
|
||
|
|
||
|
def be_file_param_usage?(node)
|
||
|
file_type_params?(node) || file_types_params?(node)
|
||
|
end
|
||
|
|
||
|
def on_send(node)
|
||
|
return unless be_file_param_usage?(node)
|
||
|
|
||
|
add_offense(find_file_param(node), location: :expression)
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def find_file_param(node)
|
||
|
node.each_descendant.find { |children| file_node_pattern.match(children) }
|
||
|
end
|
||
|
|
||
|
def file_node_pattern
|
||
|
@file_node_pattern ||= RuboCop::NodePattern.new("(const nil? :File)")
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|