Skip to content

Add cop Rake/Require

Peter Leitzen requested to merge pl-rubocop-rake-require into master

What does this MR do and why?

This cop flags use of global require in rake files.

Load dependencies lazily in task definitions instead.

Note this 👮 could be upsteamed to https://github.com/rubocop/rubocop-rake/.

Refs #378496 (closed)

Follow-up: #391459 (closed)

Examples

# 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

This will make rake and rake -T faster because it loads less dependencies.

Screenshots or screen recordings

Example offense

ee/lib/tasks/gitlab/spdx.rake:4:1: C: Rake/Require: Load dependencies inside task definition if possible.
require 'gitlab/json'
Click to expand
$ be rubocop  --only Rake/Require -C false qa/tasks lib/tasks ee/lib/tasks
^^^^^^^^^^^^^^^^^^^^^

Offenses:

qa/tasks/ci.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require_relative "helpers/util"
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
qa/tasks/webdrivers.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'webdrivers'
^^^^^^^^^^^^^^^^^^^^
lib/tasks/gitlab/artifacts/migrate.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'logger'
^^^^^^^^^^^^^^^^
lib/tasks/gitlab/artifacts/migrate.rake:4:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'resolv-replace'
^^^^^^^^^^^^^^^^^^^^^^^^
lib/tasks/gitlab/assets.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'fileutils'
^^^^^^^^^^^^^^^^^^^
lib/tasks/gitlab/backup.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'active_record/fixtures'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lib/tasks/gitlab/cleanup.rake:2:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'set'
^^^^^^^^^^^^^
lib/tasks/gitlab/dependency_proxy/migrate.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'logger'
^^^^^^^^^^^^^^^^
lib/tasks/gitlab/docs/redirect.rake:2:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'date'
^^^^^^^^^^^^^^
lib/tasks/gitlab/docs/redirect.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'pathname'
^^^^^^^^^^^^^^^^^^
lib/tasks/gitlab/docs/redirect.rake:4:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require "yaml"
^^^^^^^^^^^^^^
lib/tasks/gitlab/graphql.rake:6:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require_relative '../../../tooling/graphql/docs/renderer'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lib/tasks/gitlab/lfs/migrate.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'logger'
^^^^^^^^^^^^^^^^
lib/tasks/gitlab/metrics_exporter.rake:2:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require_relative Rails.root.join('metrics_server', 'dependencies')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lib/tasks/gitlab/metrics_exporter.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require_relative Rails.root.join('metrics_server', 'metrics_server')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lib/tasks/gitlab/openapi.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'logger'
^^^^^^^^^^^^^^^^
lib/tasks/gitlab/packages/events.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'logger'
^^^^^^^^^^^^^^^^
lib/tasks/gitlab/packages/migrate.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'logger'
^^^^^^^^^^^^^^^^
lib/tasks/gitlab/pages.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'logger'
^^^^^^^^^^^^^^^^
lib/tasks/gitlab/refresh_project_statistics_build_artifacts_size.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'httparty'
^^^^^^^^^^^^^^^^^^
lib/tasks/gitlab/refresh_project_statistics_build_artifacts_size.rake:4:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'csv'
^^^^^^^^^^^^^
lib/tasks/gitlab/terraform/migrate.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'logger'
^^^^^^^^^^^^^^^^
lib/tasks/gitlab/tw/codeowners.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'yaml'
^^^^^^^^^^^^^^
lib/tasks/gitlab/x509/update.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'logger'
^^^^^^^^^^^^^^^^
lib/tasks/import.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'benchmark'
^^^^^^^^^^^^^^^^^^^
lib/tasks/import.rake:4:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'rainbow/ext/string'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lib/tasks/tokens.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require_relative '../../app/models/concerns/token_authenticatable'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lib/tasks/tokens.rake:4:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require_relative '../../app/models/concerns/token_authenticatable_strategies/base'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lib/tasks/tokens.rake:5:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require_relative '../../app/models/concerns/token_authenticatable_strategies/insecure'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lib/tasks/tokens.rake:6:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require_relative '../../app/models/concerns/token_authenticatable_strategies/digest'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ee/lib/tasks/gitlab/spdx.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'net/http'
^^^^^^^^^^^^^^^^^^
ee/lib/tasks/gitlab/spdx.rake:4:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'gitlab/json'
^^^^^^^^^^^^^^^^^^^^^

116 files inspected, 32 offenses detected

How to set up and validate locally

REVEAL_RUBOCOP_TODO=1 bundle exec rubocop --only Rake/Require -C false qa/tasks lib/tasks ee/lib/tasks

bin/rspec spec/rubocop/cop/rake/require_spec.rb

MR acceptance checklist

This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.

Edited by Peter Leitzen

Merge request reports