Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-11-05 21:08:48 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2020-11-05 21:08:48 +0300
commit3e1c760141a27097d74d191a619fa6edecd86fe7 (patch)
treedc26e1842b355d2ebad6c8923077b0a016aa82c9 /rubocop
parent74dd67ddea70f70830f3fe1ca65b06b604ec229f (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'rubocop')
-rw-r--r--rubocop/cop/code_reuse/active_record.rb168
-rw-r--r--rubocop/qa_helpers.rb2
-rw-r--r--rubocop/rubocop-code_reuse.yml41
3 files changed, 42 insertions, 169 deletions
diff --git a/rubocop/cop/code_reuse/active_record.rb b/rubocop/cop/code_reuse/active_record.rb
deleted file mode 100644
index f6b5d66647d..00000000000
--- a/rubocop/cop/code_reuse/active_record.rb
+++ /dev/null
@@ -1,168 +0,0 @@
-# frozen_string_literal: true
-
-require_relative '../../code_reuse_helpers'
-
-module RuboCop
- module Cop
- module CodeReuse
- # Cop that denies the use of ActiveRecord methods outside of models.
- class ActiveRecord < RuboCop::Cop::Cop
- include CodeReuseHelpers
-
- MSG = 'This method can only be used inside an ActiveRecord model: ' \
- 'https://gitlab.com/gitlab-org/gitlab-foss/issues/49653'
-
- # Various methods from ActiveRecord::Querying that are denied. We
- # exclude some generic ones such as `any?` and `first`, as these may
- # lead to too many false positives, since `Array` also supports these
- # methods.
- #
- # The keys of this Hash are the denied method names. The values are
- # booleans that indicate if the method should only be denied if any
- # arguments are provided.
- NOT_ALLOWED = {
- average: true,
- calculate: true,
- count_by_sql: true,
- create_with: true,
- distinct: false,
- eager_load: true,
- exists?: true,
- find_by: true,
- find_by!: true,
- find_by_sql: true,
- find_each: true,
- find_in_batches: true,
- find_or_create_by: true,
- find_or_create_by!: true,
- find_or_initialize_by: true,
- first!: false,
- first_or_create: true,
- first_or_create!: true,
- first_or_initialize: true,
- from: true,
- group: true,
- having: true,
- ids: false,
- includes: true,
- joins: true,
- limit: true,
- lock: false,
- many?: false,
- offset: true,
- order: true,
- pluck: true,
- preload: true,
- readonly: false,
- references: true,
- reorder: true,
- rewhere: true,
- take: false,
- take!: false,
- unscope: false,
- where: false,
- with: true
- }.freeze
-
- # Directories that allow the use of the denied methods. These
- # directories are checked relative to both . and ee/
- ALLOWED_DIRECTORIES = %w[
- app/models
- config
- danger
- db
- lib/backup
- lib/banzai
- lib/gitlab/background_migration
- lib/gitlab/cycle_analytics
- lib/gitlab/database
- lib/gitlab/import_export
- lib/gitlab/project_authorizations
- lib/gitlab/sql
- lib/system_check
- lib/tasks
- qa
- rubocop
- spec
- ].freeze
-
- def on_send(node)
- return if in_allowed_directory?(node)
-
- receiver = node.children[0]
- send_name = node.children[1]
- first_arg = node.children[2]
-
- if receiver && NOT_ALLOWED.key?(send_name)
- # If the rule requires an argument to be given, but none are
- # provided, we won't register an offense. This prevents us from
- # adding offenses for `project.group`, while still covering
- # `Project.group(:name)`.
- return if NOT_ALLOWED[send_name] && !first_arg
-
- add_offense(node, location: :selector)
- end
- end
-
- # Returns true if the node resides in one of the allowed
- # directories.
- def in_allowed_directory?(node)
- path = file_path_for_node(node)
-
- ALLOWED_DIRECTORIES.any? do |directory|
- path.start_with?(
- File.join(rails_root, directory),
- File.join(rails_root, 'ee', directory)
- )
- end
- end
-
- # We can not auto correct code like this, as it requires manual
- # refactoring. Instead, we'll just allow the surrounding scope.
- #
- # Despite this method's presence, you should not use it. This method
- # exists to make it possible to allow large chunks of offenses we
- # can't fix in the short term. If you are writing new code, follow the
- # code reuse guidelines, instead of allowing any new offenses.
- def autocorrect(node)
- scope = surrounding_scope_of(node)
- indent = indentation_of(scope)
-
- lambda do |corrector|
- # This prevents us from inserting the same enable/disable comment
- # for a method or block that has multiple offenses.
- next if allowed_scopes.include?(scope)
-
- corrector.insert_before(
- scope.source_range,
- "# rubocop: disable #{cop_name}\n#{indent}"
- )
-
- corrector.insert_after(
- scope.source_range,
- "\n#{indent}# rubocop: enable #{cop_name}"
- )
-
- allowed_scopes << scope
- end
- end
-
- def indentation_of(node)
- ' ' * node.loc.expression.source_line[/\A */].length
- end
-
- def surrounding_scope_of(node)
- %i[def defs block begin].each do |type|
- if (found = node.each_ancestor(type).first)
- return found
- end
- end
- end
-
- def allowed_scopes
- @allowed_scopes ||= Set.new
- end
- end
- end
- end
-end
diff --git a/rubocop/qa_helpers.rb b/rubocop/qa_helpers.rb
index 95875d64727..f4adf7f4e9f 100644
--- a/rubocop/qa_helpers.rb
+++ b/rubocop/qa_helpers.rb
@@ -5,7 +5,7 @@ module RuboCop
def in_qa_file?(node)
path = node.location.expression.source_buffer.name
- path.start_with?(File.join(RuboCop::PathUtil.pwd, 'qa'))
+ path.start_with?(File.join(Dir.pwd, 'qa'))
end
end
end
diff --git a/rubocop/rubocop-code_reuse.yml b/rubocop/rubocop-code_reuse.yml
new file mode 100644
index 00000000000..64e51c859f4
--- /dev/null
+++ b/rubocop/rubocop-code_reuse.yml
@@ -0,0 +1,41 @@
+# Denies the use of ActiveRecord methods outside of configured
+# excluded directories
+# Directories that allow the use of the denied methods.
+# To start we provide a default configuration that matches
+# a standard Rails app and enable.
+# The default configuration can be overridden by
+# providing your own Exclusion list as follows:
+# CodeReuse/ActiveRecord:
+# Enabled: true
+# Exclude:
+# - app/models/**/*.rb
+# - config/**/*.rb
+# - db/**/*.rb
+# - lib/tasks/**/*.rb
+# - spec/**/*.rb
+# - lib/gitlab/**/*.rb
+CodeReuse/ActiveRecord:
+ Exclude:
+ - app/models/**/*.rb
+ - config/**/*.rb
+ - db/**/*.rb
+ - lib/tasks/**/*.rake
+ - spec/**/*.rb
+ - danger/**/*.rb
+ - lib/backup/**/*.rb
+ - lib/banzai/**/*.rb
+ - lib/gitlab/background_migration/**/*.rb
+ - lib/gitlab/cycle_analytics/**/*.rb
+ - lib/gitlab/database/**/*.rb
+ - lib/gitlab/database_importers/common_metrics/importer.rb
+ - lib/gitlab/import_export/**/*.rb
+ - lib/gitlab/project_authorizations.rb
+ - lib/gitlab/sql/**/*.rb
+ - lib/system_check/**/*.rb
+ - qa/**/*.rb
+ - rubocop/**/*.rb
+ - ee/app/models/**/*.rb
+ - ee/spec/**/*.rb
+ - ee/db/fixtures/**/*.rb
+ - ee/lib/tasks/**/*.rake
+ - ee/lib/ee/gitlab/background_migration/**/*.rb