summaryrefslogtreecommitdiff
path: root/rubocop
diff options
context:
space:
mode:
Diffstat (limited to 'rubocop')
-rw-r--r--rubocop/cop/line_break_after_guard_clauses.rb100
-rw-r--r--rubocop/cop/migration/update_large_table.rb (renamed from rubocop/cop/migration/add_column_with_default_to_large_table.rb)22
-rw-r--r--rubocop/rubocop.rb3
3 files changed, 114 insertions, 11 deletions
diff --git a/rubocop/cop/line_break_after_guard_clauses.rb b/rubocop/cop/line_break_after_guard_clauses.rb
new file mode 100644
index 00000000000..67477f064ab
--- /dev/null
+++ b/rubocop/cop/line_break_after_guard_clauses.rb
@@ -0,0 +1,100 @@
+# frozen_string_literal: true
+
+module RuboCop
+ module Cop
+ # Ensures a line break after guard clauses.
+ #
+ # @example
+ # # bad
+ # return unless condition
+ # do_stuff
+ #
+ # # good
+ # return unless condition
+ #
+ # do_stuff
+ #
+ # # bad
+ # raise if condition
+ # do_stuff
+ #
+ # # good
+ # raise if condition
+ #
+ # do_stuff
+ #
+ # Multiple guard clauses are allowed without
+ # line break.
+ #
+ # # good
+ # return unless condition_a
+ # return unless condition_b
+ #
+ # do_stuff
+ #
+ # Guard clauses in case statement are allowed without
+ # line break.
+ #
+ # # good
+ # case model
+ # when condition_a
+ # return true unless condition_b
+ # when
+ # ...
+ # end
+ #
+ # Guard clauses before end are allowed without
+ # line break.
+ #
+ # # good
+ # if condition_a
+ # do_something
+ # else
+ # do_something_else
+ # return unless condition
+ # end
+ #
+ # do_something_more
+ class LineBreakAfterGuardClauses < RuboCop::Cop::Cop
+ MSG = 'Add a line break after guard clauses'
+
+ def_node_matcher :guard_clause_node?, <<-PATTERN
+ [{(send nil? {:raise :fail :throw} ...) return break next} single_line?]
+ PATTERN
+
+ def on_if(node)
+ return unless node.single_line?
+ return unless guard_clause?(node)
+ return if next_line(node).blank? || clause_last_line?(next_line(node)) || guard_clause?(next_sibling(node))
+
+ add_offense(node, :expression, MSG)
+ end
+
+ def autocorrect(node)
+ lambda do |corrector|
+ corrector.insert_after(node.loc.expression, "\n")
+ end
+ end
+
+ private
+
+ def guard_clause?(node)
+ return false unless node.if_type?
+
+ guard_clause_node?(node.if_branch)
+ end
+
+ def next_sibling(node)
+ node.parent.children[node.sibling_index + 1]
+ end
+
+ def next_line(node)
+ processed_source[node.loc.line]
+ end
+
+ def clause_last_line?(line)
+ line =~ /^\s*(?:end|elsif|else|when|rescue|ensure)/
+ end
+ end
+ end
+end
diff --git a/rubocop/cop/migration/add_column_with_default_to_large_table.rb b/rubocop/cop/migration/update_large_table.rb
index fb363f95b56..3ae3fb1b68e 100644
--- a/rubocop/cop/migration/add_column_with_default_to_large_table.rb
+++ b/rubocop/cop/migration/update_large_table.rb
@@ -12,12 +12,12 @@ module RuboCop
#
# See https://gitlab.com/gitlab-com/infrastructure/issues/1602 for more
# information.
- class AddColumnWithDefaultToLargeTable < RuboCop::Cop::Cop
+ class UpdateLargeTable < RuboCop::Cop::Cop
include MigrationHelpers
- MSG = 'Using `add_column_with_default` on the `%s` table will take a ' \
- 'long time to complete, and should be avoided unless absolutely ' \
- 'necessary'.freeze
+ MSG = 'Using `%s` on the `%s` table will take a long time to ' \
+ 'complete, and should be avoided unless absolutely ' \
+ 'necessary'.freeze
LARGE_TABLES = %i[
ci_pipelines
@@ -34,20 +34,22 @@ module RuboCop
users
].freeze
- def_node_matcher :add_column_with_default?, <<~PATTERN
- (send nil :add_column_with_default $(sym ...) ...)
+ def_node_matcher :batch_update?, <<~PATTERN
+ (send nil ${:add_column_with_default :update_column_in_batches} $(sym ...) ...)
PATTERN
def on_send(node)
return unless in_migration?(node)
- matched = add_column_with_default?(node)
- return unless matched
+ matches = batch_update?(node)
+ return unless matches
+
+ update_method = matches.first
+ table = matches.last.to_a.first
- table = matched.to_a.first
return unless LARGE_TABLES.include?(table)
- add_offense(node, :expression, format(MSG, table))
+ add_offense(node, :expression, format(MSG, update_method, table))
end
end
end
diff --git a/rubocop/rubocop.rb b/rubocop/rubocop.rb
index c4bab18faee..3b29da37ad4 100644
--- a/rubocop/rubocop.rb
+++ b/rubocop/rubocop.rb
@@ -3,12 +3,12 @@ require_relative 'cop/active_record_serialize'
require_relative 'cop/custom_error_class'
require_relative 'cop/gem_fetcher'
require_relative 'cop/in_batches'
+require_relative 'cop/line_break_after_guard_clauses'
require_relative 'cop/polymorphic_associations'
require_relative 'cop/project_path_helper'
require_relative 'cop/redirect_with_status'
require_relative 'cop/gitlab/module_with_instance_variables'
require_relative 'cop/migration/add_column'
-require_relative 'cop/migration/add_column_with_default_to_large_table'
require_relative 'cop/migration/add_concurrent_foreign_key'
require_relative 'cop/migration/add_concurrent_index'
require_relative 'cop/migration/add_index'
@@ -21,6 +21,7 @@ require_relative 'cop/migration/reversible_add_column_with_default'
require_relative 'cop/migration/safer_boolean_column'
require_relative 'cop/migration/timestamps'
require_relative 'cop/migration/update_column_in_batches'
+require_relative 'cop/migration/update_large_table'
require_relative 'cop/rspec/env_assignment'
require_relative 'cop/rspec/single_line_hook'
require_relative 'cop/rspec/verbose_include_metadata'