Skip to content
Snippets Groups Projects
Commit 6bb2ff91 authored by Peter Leitzen's avatar Peter Leitzen 3️⃣ Committed by Lin Jen-Shin
Browse files

Add cop Rake/Require

This cop flags use of global `require` in rake files.

Load dependencies lazily in `task` definitions instead.
parent 7ab1119e
No related branches found
No related tags found
1 merge request!101740Add cop Rake/Require
......@@ -844,3 +844,8 @@ Cop/SidekiqApiUsage:
- 'lib/gitlab/sidekiq_queue.rb'
- 'config/initializers/sidekiq.rb'
- 'config/initializers/forbid_sidekiq_in_transactions.rb'
Rake/Require:
Include:
- '{,ee/,jh/}lib/**/*.rake'
- 'qa/tasks/**/*.rake'
---
Rake/Require:
Details: grace period
Exclude:
- 'ee/lib/tasks/gitlab/spdx.rake'
- 'lib/tasks/gitlab/artifacts/migrate.rake'
- 'lib/tasks/gitlab/assets.rake'
- 'lib/tasks/gitlab/backup.rake'
- 'lib/tasks/gitlab/cleanup.rake'
- 'lib/tasks/gitlab/dependency_proxy/migrate.rake'
- 'lib/tasks/gitlab/docs/redirect.rake'
- 'lib/tasks/gitlab/graphql.rake'
- 'lib/tasks/gitlab/lfs/migrate.rake'
- 'lib/tasks/gitlab/metrics_exporter.rake'
- 'lib/tasks/gitlab/openapi.rake'
- 'lib/tasks/gitlab/packages/events.rake'
- 'lib/tasks/gitlab/packages/migrate.rake'
- 'lib/tasks/gitlab/pages.rake'
- 'lib/tasks/gitlab/refresh_project_statistics_build_artifacts_size.rake'
- 'lib/tasks/gitlab/terraform/migrate.rake'
- 'lib/tasks/gitlab/tw/codeowners.rake'
- 'lib/tasks/gitlab/x509/update.rake'
- 'lib/tasks/import.rake'
- 'lib/tasks/tokens.rake'
- 'qa/tasks/ci.rake'
- 'qa/tasks/webdrivers.rake'
# frozen_string_literal: true
module RuboCop
module Cop
module Rake
# Flag global `require`s or `require_relative`s in rake files.
#
# Load dependencies lazily in `task` definitions if possible.
#
# @example
# # bad
#
# require_relative 'gitlab/json'
# require 'json'
#
# task :parse_json do
# Gitlab::Json.parse(...)
# end
#
# # good
#
# task :parse_json do
# require_relative 'gitlab/json'
# require 'json'
#
# Gitlab::Json.parse(...)
# end
#
# RSpec::Core::RakeTask.new(:parse_json) do |t, args|
# require_relative 'gitlab/json'
# require 'json'
#
# Gitlab::Json.parse(...)
# end
#
# # Requiring files which contain the word `task` is allowed.
# require 'some_gem/rake_task'
# require 'some_gem/rake_tasks'
#
# SomeGem.define_tasks
#
# # Loading in method definition as well.
# def load_deps
# require 'json'
# end
#
# task :parse_json
# load_deps
# end
#
class Require < RuboCop::Cop::Base
MSG = 'Load dependencies inside `task` definitions if possible.'
METHODS = %i[require require_relative].freeze
RESTRICT_ON_SEND = METHODS
def_node_matcher :require_method, <<~PATTERN
(send nil? ${#{METHODS.map(&:inspect).join(' ')}} $_)
PATTERN
def on_send(node)
method, file = require_method(node)
return unless method
return if requires_task?(file)
return if inside_block_or_method?(node)
add_offense(node)
end
private
# Allow `require "foo/rake_task"`
def requires_task?(file)
file.source.include?('task')
end
def inside_block_or_method?(node)
node.each_ancestor(:block, :def).any?
end
end
end
end
end
# frozen_string_literal: true
require 'rubocop_spec_helper'
require_relative '../../../../rubocop/cop/rake/require'
RSpec.describe RuboCop::Cop::Rake::Require do
let(:msg) { described_class::MSG }
it 'registers an offenses for require methods' do
expect_offense(<<~RUBY)
require 'json'
^^^^^^^^^^^^^^ #{msg}
require_relative 'gitlab/json'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{msg}
RUBY
end
it 'does not register offense inside `task` definition' do
expect_no_offenses(<<~RUBY)
task :parse do
require 'json'
end
namespace :some do
task parse: :env do
require_relative 'gitlab/json'
end
end
RUBY
end
it 'does not register offense inside a block definition' do
expect_no_offenses(<<~RUBY)
RSpec::Core::RakeTask.new(:parse_json) do |t, args|
require 'json'
end
RUBY
end
it 'does not register offense inside a method definition' do
expect_no_offenses(<<~RUBY)
def load_deps
require 'json'
end
task :parse do
load_deps
end
RUBY
end
it 'does not register offense when require task related files' do
expect_no_offenses(<<~RUBY)
require 'rubocop/rake_tasks'
require 'gettext_i18n_rails/tasks'
require_relative '../../rubocop/check_graceful_task'
RUBY
end
end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment