gitlab-styles 8.0.0 → 9.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +11 -0
- data/Gemfile +3 -3
- data/gitlab-styles.gemspec +5 -5
- data/lib/gitlab/styles/version.rb +1 -1
- data/lib/rubocop/cop/active_record_dependent.rb +2 -2
- data/lib/rubocop/cop/active_record_serialize.rb +2 -2
- data/lib/rubocop/cop/avoid_return_from_blocks.rb +3 -1
- data/lib/rubocop/cop/code_reuse/active_record.rb +3 -3
- data/lib/rubocop/cop/custom_error_class.rb +8 -10
- data/lib/rubocop/cop/gem_fetcher.rb +3 -3
- data/lib/rubocop/cop/in_batches.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/deprecate_cop_helper.rb +4 -1
- data/lib/rubocop/cop/line_break_after_guard_clauses.rb +2 -1
- data/lib/rubocop/cop/line_break_around_conditional_block.rb +6 -7
- data/lib/rubocop/cop/migration/update_large_table.rb +5 -4
- data/lib/rubocop/cop/performance/rubyzip.rb +3 -2
- data/lib/rubocop/cop/polymorphic_associations.rb +1 -1
- data/lib/rubocop/cop/rails/include_url_helper.rb +2 -1
- data/lib/rubocop/cop/redirect_with_status.rb +3 -3
- data/lib/rubocop/cop/rspec/base.rb +0 -2
- data/lib/rubocop/cop/rspec/empty_line_after_let_block.rb +7 -7
- data/lib/rubocop/cop/rspec/empty_line_after_shared_example.rb +4 -2
- data/lib/rubocop/cop/rspec/example_starting_character.rb +2 -0
- data/lib/rubocop/cop/rspec/have_link_parameters.rb +2 -1
- data/lib/rubocop/cop/rspec/single_line_hook.rb +3 -1
- data/lib/rubocop/cop/rspec/verbose_include_metadata.rb +2 -0
- data/lib/rubocop/cop/style/hash_transformation.rb +10 -12
- data/lib/rubocop/cop/style/open_struct_use.rb +3 -2
- data/lib/rubocop/cop/without_reactive_cache.rb +2 -2
- data/rubocop-layout.yml +1 -1
- data/rubocop-rspec.yml +13 -5
- metadata +12 -20
- data/lib/gitlab/styles/rubocop/rspec/helpers.rb +0 -18
- data/lib/rubocop/cop/rspec/empty_line_after_final_let_it_be.rb +0 -47
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 410e573c3c17d84349a00ff756141e55ece0ba68c0d9aa23b76cfe2a8abde3ae
|
4
|
+
data.tar.gz: a2fb908127f5f31c8d4a235155b4b2ad3208802cfc01bf895321a522a270477b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aa3f38ac00b776237c2a497ebb76d36e1ad51addc814ecbba7370a4d4cbeb0f67777131494a825431a2aa592d6597e57eaa83cae86ec452955b0399e1e46e1ec
|
7
|
+
data.tar.gz: 445dfab1d9c2f0874c1c7ddb65426bf32953515fcfe1e96b15a119914acc5258753182318b524ff2d8af86b0fb1769d09f0991ce1aa8d2d24cd2a22cfcbe62fb
|
data/.rubocop.yml
CHANGED
@@ -4,7 +4,18 @@ inherit_from:
|
|
4
4
|
require:
|
5
5
|
- rubocop/cop/internal_affairs
|
6
6
|
|
7
|
+
AllCops:
|
8
|
+
NewCops: disable # https://gitlab.com/gitlab-org/ruby/gems/gitlab-styles/-/issues/40
|
9
|
+
SuggestExtensions: false # https://gitlab.com/gitlab-org/ruby/gems/gitlab-styles/-/issues/39
|
10
|
+
|
7
11
|
InternalAffairs/DeprecateCopHelper:
|
8
12
|
Enabled: true
|
9
13
|
Include:
|
10
14
|
- spec/**/*.rb
|
15
|
+
|
16
|
+
# This only makes sense for cops that are included with RuboCop. We could add
|
17
|
+
# our own config/default.yml and do something like
|
18
|
+
# https://github.com/rubocop/rubocop-rspec/blob/master/lib/rubocop/rspec/inject.rb,
|
19
|
+
# but realistically this is OK here.
|
20
|
+
InternalAffairs/UndefinedConfig:
|
21
|
+
Enabled: false
|
data/Gemfile
CHANGED
@@ -7,7 +7,7 @@ gemspec
|
|
7
7
|
|
8
8
|
group :test do
|
9
9
|
# Pin these dependencies, otherwise a new rule could break the CI pipelines
|
10
|
-
gem 'rubocop', '
|
11
|
-
gem 'rubocop-rspec', '
|
12
|
-
gem 'rspec-parameterized', '0.
|
10
|
+
gem 'rubocop', '1.36.0'
|
11
|
+
gem 'rubocop-rspec', '2.12.1'
|
12
|
+
gem 'rspec-parameterized', '0.5.2', require: false
|
13
13
|
end
|
data/gitlab-styles.gemspec
CHANGED
@@ -22,12 +22,12 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
23
23
|
spec.require_paths = ['lib']
|
24
24
|
|
25
|
-
spec.add_dependency 'rubocop', '~>
|
25
|
+
spec.add_dependency 'rubocop', '~> 1.36.0'
|
26
26
|
spec.add_dependency 'rubocop-gitlab-security', '~> 0.1.1'
|
27
|
-
spec.add_dependency 'rubocop-graphql', '~> 0.
|
28
|
-
spec.add_dependency 'rubocop-performance', '~> 1.
|
29
|
-
spec.add_dependency 'rubocop-rails', '~> 2.
|
30
|
-
spec.add_dependency 'rubocop-rspec', '~>
|
27
|
+
spec.add_dependency 'rubocop-graphql', '~> 0.14'
|
28
|
+
spec.add_dependency 'rubocop-performance', '~> 1.14'
|
29
|
+
spec.add_dependency 'rubocop-rails', '~> 2.15'
|
30
|
+
spec.add_dependency 'rubocop-rspec', '~> 2.12'
|
31
31
|
|
32
32
|
spec.add_development_dependency 'bundler', '~> 2.1'
|
33
33
|
spec.add_development_dependency 'gitlab-dangerfiles', '~> 2.11.0'
|
@@ -5,11 +5,11 @@ require_relative '../../gitlab/styles/rubocop/model_helpers'
|
|
5
5
|
module Rubocop
|
6
6
|
module Cop
|
7
7
|
# Cop that prevents the use of `dependent: ...` in ActiveRecord models.
|
8
|
-
class ActiveRecordDependent < RuboCop::Cop::
|
8
|
+
class ActiveRecordDependent < RuboCop::Cop::Base
|
9
9
|
include Gitlab::Styles::Rubocop::ModelHelpers
|
10
10
|
|
11
11
|
MSG = 'Do not use `dependent:` to remove associated data, ' \
|
12
|
-
|
12
|
+
'use foreign keys with cascading deletes instead.'
|
13
13
|
|
14
14
|
METHOD_NAMES = [:has_many, :has_one, :belongs_to].freeze
|
15
15
|
ALLOWED_OPTIONS = [:restrict_with_error].freeze
|
@@ -5,7 +5,7 @@ require_relative '../../gitlab/styles/rubocop/model_helpers'
|
|
5
5
|
module Rubocop
|
6
6
|
module Cop
|
7
7
|
# Cop that prevents the use of `serialize` in ActiveRecord models.
|
8
|
-
class ActiveRecordSerialize < RuboCop::Cop::
|
8
|
+
class ActiveRecordSerialize < RuboCop::Cop::Base
|
9
9
|
include Gitlab::Styles::Rubocop::ModelHelpers
|
10
10
|
|
11
11
|
MSG = 'Do not store serialized data in the database, use separate columns and/or tables instead'
|
@@ -13,7 +13,7 @@ module Rubocop
|
|
13
13
|
def on_send(node)
|
14
14
|
return unless in_model?(node)
|
15
15
|
|
16
|
-
add_offense(node
|
16
|
+
add_offense(node.loc.selector) if node.children[1] == :serialize
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
@@ -20,7 +20,7 @@ module Rubocop
|
|
20
20
|
# do_something_else
|
21
21
|
# end
|
22
22
|
#
|
23
|
-
class AvoidReturnFromBlocks < RuboCop::Cop::
|
23
|
+
class AvoidReturnFromBlocks < RuboCop::Cop::Base
|
24
24
|
MSG = 'Do not return from a block, use next or break instead.'
|
25
25
|
DEF_METHODS = %i[define_method lambda].freeze
|
26
26
|
WHITELISTED_METHODS = %i[each each_filename times loop].freeze
|
@@ -38,6 +38,8 @@ module Rubocop
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
+
alias_method :on_numblock, :on_block
|
42
|
+
|
41
43
|
private
|
42
44
|
|
43
45
|
def top_block?(node)
|
@@ -4,9 +4,9 @@ module Rubocop
|
|
4
4
|
module Cop
|
5
5
|
module CodeReuse
|
6
6
|
# Cop that denies the use of ActiveRecord methods outside of models.
|
7
|
-
class ActiveRecord < RuboCop::Cop::
|
7
|
+
class ActiveRecord < RuboCop::Cop::Base
|
8
8
|
MSG = 'This method can only be used inside an ActiveRecord model: ' \
|
9
|
-
|
9
|
+
'https://gitlab.com/gitlab-org/gitlab-foss/issues/49653'
|
10
10
|
|
11
11
|
# Various methods from ActiveRecord::Querying that are denied. We
|
12
12
|
# exclude some generic ones such as `any?` and `first`, as these may
|
@@ -72,7 +72,7 @@ module Rubocop
|
|
72
72
|
# `Project.group(:name)`.
|
73
73
|
return if NOT_ALLOWED[send_name] && !first_arg
|
74
74
|
|
75
|
-
add_offense(node
|
75
|
+
add_offense(node.loc.selector)
|
76
76
|
end
|
77
77
|
end
|
78
78
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module Rubocop
|
4
4
|
module Cop
|
5
|
-
#
|
5
|
+
# Makes sure that custom error classes, when empty, are declared
|
6
6
|
# with Class.new.
|
7
7
|
#
|
8
8
|
# @example
|
@@ -15,7 +15,9 @@ module Rubocop
|
|
15
15
|
#
|
16
16
|
# # good
|
17
17
|
# FooError = Class.new(StandardError)
|
18
|
-
class CustomErrorClass < RuboCop::Cop::
|
18
|
+
class CustomErrorClass < RuboCop::Cop::Base
|
19
|
+
extend RuboCop::Cop::AutoCorrector
|
20
|
+
|
19
21
|
MSG = 'Use `Class.new(SuperClass)` to define an empty custom error class.'
|
20
22
|
|
21
23
|
def on_class(node)
|
@@ -28,16 +30,12 @@ module Rubocop
|
|
28
30
|
|
29
31
|
return unless parent_klass&.to_s&.end_with?('Error')
|
30
32
|
|
31
|
-
add_offense(node)
|
32
|
-
|
33
|
-
|
34
|
-
def autocorrect(node)
|
35
|
-
klass = node.identifier
|
36
|
-
parent = node.parent_class
|
33
|
+
add_offense(node) do |corrector|
|
34
|
+
klass = node.identifier
|
35
|
+
parent = node.parent_class
|
37
36
|
|
38
|
-
|
37
|
+
replacement = "#{class_name_from_node(klass)} = Class.new(#{class_name_from_node(parent)})"
|
39
38
|
|
40
|
-
lambda do |corrector|
|
41
39
|
corrector.replace(node.source_range, replacement)
|
42
40
|
end
|
43
41
|
end
|
@@ -2,10 +2,10 @@
|
|
2
2
|
|
3
3
|
module Rubocop
|
4
4
|
module Cop
|
5
|
-
#
|
5
|
+
# Prevents usage of the `git` and `github` arguments to `gem` in a
|
6
6
|
# `Gemfile` in order to avoid additional points of failure beyond
|
7
7
|
# rubygems.org.
|
8
|
-
class GemFetcher < RuboCop::Cop::
|
8
|
+
class GemFetcher < RuboCop::Cop::Base
|
9
9
|
MSG = 'Do not use gems from git repositories, only use gems from RubyGems.'
|
10
10
|
|
11
11
|
GIT_KEYS = [:git, :github].freeze
|
@@ -18,7 +18,7 @@ module Rubocop
|
|
18
18
|
|
19
19
|
node.children.last.each_node(:pair) do |pair|
|
20
20
|
key_name = pair.children[0].children[0].to_sym
|
21
|
-
add_offense(
|
21
|
+
add_offense(pair.source_range) if GIT_KEYS.include?(key_name)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
@@ -5,13 +5,13 @@ require_relative '../../gitlab/styles/rubocop/model_helpers'
|
|
5
5
|
module Rubocop
|
6
6
|
module Cop
|
7
7
|
# Cop that prevents the use of `in_batches`
|
8
|
-
class InBatches < RuboCop::Cop::
|
8
|
+
class InBatches < RuboCop::Cop::Base
|
9
9
|
MSG = 'Do not use `in_batches`, use `each_batch` from the EachBatch module instead'
|
10
10
|
|
11
11
|
def on_send(node)
|
12
12
|
return unless node.children[1] == :in_batches
|
13
13
|
|
14
|
-
add_offense(node
|
14
|
+
add_offense(node.loc.selector)
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
@@ -4,18 +4,21 @@ module Rubocop
|
|
4
4
|
module Cop
|
5
5
|
module InternalAffairs
|
6
6
|
# Cop that denies the use of CopHelper.
|
7
|
-
class DeprecateCopHelper < RuboCop::Cop::
|
7
|
+
class DeprecateCopHelper < RuboCop::Cop::Base
|
8
8
|
MSG = 'Do not use `CopHelper` or methods from it, use improved patterns described in https://www.rubydoc.info/gems/rubocop/RuboCop/RSpec/ExpectOffense'
|
9
9
|
|
10
|
+
# @!method cop_helper(node)
|
10
11
|
def_node_matcher :cop_helper, <<~PATTERN
|
11
12
|
(send nil? ${:include :extend :prepend}
|
12
13
|
(const _ {:CopHelper}))
|
13
14
|
PATTERN
|
14
15
|
|
16
|
+
# @!method cop_helper_method(node)
|
15
17
|
def_node_search :cop_helper_method, <<~PATTERN
|
16
18
|
(send nil? {:inspect_source :inspect_source_file :parse_source :autocorrect_source_file :autocorrect_source :_investigate} ...)
|
17
19
|
PATTERN
|
18
20
|
|
21
|
+
# @!method cop_helper_method_on_instance(node)
|
19
22
|
def_node_search :cop_helper_method_on_instance, <<~PATTERN
|
20
23
|
(send (send nil? _) {:messages :highlights :offenses} ...)
|
21
24
|
PATTERN
|
@@ -55,9 +55,10 @@ module Rubocop
|
|
55
55
|
# end
|
56
56
|
#
|
57
57
|
# do_something_more
|
58
|
-
class LineBreakAfterGuardClauses < RuboCop::Cop::
|
58
|
+
class LineBreakAfterGuardClauses < RuboCop::Cop::Base
|
59
59
|
MSG = 'Add a line break after guard clauses'
|
60
60
|
|
61
|
+
# @!method guard_clause_node?(node)
|
61
62
|
def_node_matcher :guard_clause_node?, <<-PATTERN
|
62
63
|
[{(send nil? {:raise :fail :throw} ...) return break next} single_line?]
|
63
64
|
PATTERN
|
@@ -42,7 +42,8 @@ module Rubocop
|
|
42
42
|
# do_something
|
43
43
|
# end
|
44
44
|
# end
|
45
|
-
class LineBreakAroundConditionalBlock < RuboCop::Cop::
|
45
|
+
class LineBreakAroundConditionalBlock < RuboCop::Cop::Base
|
46
|
+
extend RuboCop::Cop::AutoCorrector
|
46
47
|
include RuboCop::Cop::RangeHelp
|
47
48
|
|
48
49
|
MSG = 'Add a line break around conditional blocks'
|
@@ -53,17 +54,15 @@ module Rubocop
|
|
53
54
|
return if node.single_line?
|
54
55
|
return unless node.if? || node.unless?
|
55
56
|
|
56
|
-
|
57
|
-
add_offense(node) unless last_line_valid?(node)
|
58
|
-
end
|
59
|
-
|
60
|
-
def autocorrect(node)
|
61
|
-
lambda do |corrector|
|
57
|
+
corrector_block = lambda do |corrector|
|
62
58
|
line = range_by_whole_lines(node.source_range)
|
63
59
|
|
64
60
|
corrector.insert_before(line, "\n") unless previous_line_valid?(node)
|
65
61
|
corrector.insert_after(line, "\n") unless last_line_valid?(node)
|
66
62
|
end
|
63
|
+
|
64
|
+
add_offense(node, &corrector_block) unless previous_line_valid?(node)
|
65
|
+
add_offense(node, &corrector_block) unless last_line_valid?(node)
|
67
66
|
end
|
68
67
|
|
69
68
|
private
|
@@ -4,7 +4,7 @@ require_relative '../../../gitlab/styles/rubocop/migration_helpers'
|
|
4
4
|
module Rubocop
|
5
5
|
module Cop
|
6
6
|
module Migration
|
7
|
-
#
|
7
|
+
# Checks for methods that may lead to batch type issues on a table that's been
|
8
8
|
# explicitly denied because of its size.
|
9
9
|
#
|
10
10
|
# Even though though these methods perform functions to avoid
|
@@ -13,13 +13,14 @@ module Rubocop
|
|
13
13
|
#
|
14
14
|
# See https://gitlab.com/gitlab-com/infrastructure/issues/1602 for more
|
15
15
|
# information.
|
16
|
-
class UpdateLargeTable < RuboCop::Cop::
|
16
|
+
class UpdateLargeTable < RuboCop::Cop::Base
|
17
17
|
include Gitlab::Styles::Rubocop::MigrationHelpers
|
18
18
|
|
19
19
|
MSG = 'Using `%s` on the `%s` table will take a long time to ' \
|
20
|
-
|
21
|
-
|
20
|
+
'complete, and should be avoided unless absolutely ' \
|
21
|
+
'necessary'
|
22
22
|
|
23
|
+
# @!method batch_update?(node)
|
23
24
|
def_node_matcher :batch_update?, <<~PATTERN
|
24
25
|
(send nil? ${#denied_method?}
|
25
26
|
(sym $...)
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module Rubocop
|
4
4
|
module Cop
|
5
5
|
module Performance
|
6
|
-
#
|
6
|
+
# Flags inefficient uses of rubyzip's Zip::File, since when instantiated
|
7
7
|
# it reads the file's Central Directory into memory entirely. For zips with many
|
8
8
|
# files and directories, this can be very expensive even when the archive's size
|
9
9
|
# in bytes is small.
|
@@ -11,13 +11,14 @@ module Rubocop
|
|
11
11
|
# See also:
|
12
12
|
# - https://github.com/rubyzip/rubyzip/issues/506
|
13
13
|
# - https://github.com/rubyzip/rubyzip#notes-on-zipinputstream
|
14
|
-
class Rubyzip < RuboCop::Cop::
|
14
|
+
class Rubyzip < RuboCop::Cop::Base
|
15
15
|
MSG = 'Be careful when opening or iterating zip files via Zip::File. ' \
|
16
16
|
'Zip archives may contain many entries, and their file index is ' \
|
17
17
|
'read into memory upon construction, which can lead to ' \
|
18
18
|
'high memory use and poor performance. ' \
|
19
19
|
'Consider iterating archive entries via Zip::InputStream instead.'
|
20
20
|
|
21
|
+
# @!method reads_central_directory?(node)
|
21
22
|
def_node_matcher :reads_central_directory?, <<-PATTERN
|
22
23
|
(send
|
23
24
|
(const
|
@@ -5,7 +5,7 @@ require_relative '../../gitlab/styles/rubocop/model_helpers'
|
|
5
5
|
module Rubocop
|
6
6
|
module Cop
|
7
7
|
# Cop that prevents the use of polymorphic associations
|
8
|
-
class PolymorphicAssociations < RuboCop::Cop::
|
8
|
+
class PolymorphicAssociations < RuboCop::Cop::Base
|
9
9
|
include Gitlab::Styles::Rubocop::ModelHelpers
|
10
10
|
|
11
11
|
MSG = 'Do not use polymorphic associations, use separate tables instead'
|
@@ -5,7 +5,7 @@ require_relative '../../../gitlab/styles/rubocop/model_helpers'
|
|
5
5
|
module Rubocop
|
6
6
|
module Cop
|
7
7
|
module Rails
|
8
|
-
class IncludeUrlHelper < RuboCop::Cop::
|
8
|
+
class IncludeUrlHelper < RuboCop::Cop::Base
|
9
9
|
MSG = <<~MSG
|
10
10
|
Avoid including `ActionView::Helpers::UrlHelper`.
|
11
11
|
It adds/overrides ~40 methods while usually only one is needed.
|
@@ -14,6 +14,7 @@ module Rubocop
|
|
14
14
|
See https://gitlab.com/gitlab-org/gitlab/-/issues/340567.
|
15
15
|
MSG
|
16
16
|
|
17
|
+
# @!method include_url_helpers_node?(node)
|
17
18
|
def_node_matcher :include_url_helpers_node?, <<~PATTERN
|
18
19
|
(send nil? :include (const (const (const {nil? cbase} :ActionView) :Helpers) :UrlHelper))
|
19
20
|
PATTERN
|
@@ -2,9 +2,9 @@
|
|
2
2
|
|
3
3
|
module Rubocop
|
4
4
|
module Cop
|
5
|
-
#
|
5
|
+
# Prevents usage of 'redirect_to' in actions 'destroy' without specifying 'status'.
|
6
6
|
# See https://gitlab.com/gitlab-org/gitlab-ce/issues/31840
|
7
|
-
class RedirectWithStatus < RuboCop::Cop::
|
7
|
+
class RedirectWithStatus < RuboCop::Cop::Base
|
8
8
|
MSG = 'Do not use "redirect_to" without "status" in "destroy" action'
|
9
9
|
|
10
10
|
def on_def(node)
|
@@ -20,7 +20,7 @@ module Rubocop
|
|
20
20
|
methods << pair.children.first.children.first
|
21
21
|
end
|
22
22
|
|
23
|
-
add_offense(def_node
|
23
|
+
add_offense(def_node.loc.selector) unless methods.include?(:status)
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
@@ -1,13 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'rubocop-rspec'
|
4
|
-
require_relative '../../../gitlab/styles/rubocop/rspec/helpers'
|
5
4
|
|
6
5
|
module Rubocop
|
7
6
|
module Cop
|
8
7
|
module RSpec
|
9
8
|
class Base < RuboCop::Cop::RSpec::Base
|
10
|
-
include Gitlab::Styles::Rubocop::Rspec::Helpers
|
11
9
|
end
|
12
10
|
end
|
13
11
|
end
|
@@ -39,22 +39,22 @@ module Rubocop
|
|
39
39
|
#
|
40
40
|
class EmptyLineAfterLetBlock < Base
|
41
41
|
extend RuboCop::Cop::AutoCorrector
|
42
|
-
include RuboCop::RSpec::EmptyLineSeparation
|
42
|
+
include RuboCop::Cop::RSpec::EmptyLineSeparation
|
43
43
|
|
44
44
|
MSG = 'Add an empty line after `%<let>s` block.'
|
45
45
|
|
46
|
-
def_node_matcher :lets, LET.block_pattern
|
47
|
-
|
48
46
|
def on_block(node)
|
49
|
-
|
50
|
-
break if last_child?(
|
51
|
-
next if
|
47
|
+
RuboCop::RSpec::ExampleGroup.new(node).lets.each do |let|
|
48
|
+
break if last_child?(let)
|
49
|
+
next if let.single_line?
|
52
50
|
|
53
|
-
missing_separating_line_offense(
|
51
|
+
missing_separating_line_offense(let) do |method|
|
52
|
+
format(MSG, let: method)
|
54
53
|
format(MSG, let: method)
|
55
54
|
end
|
56
55
|
end
|
57
56
|
end
|
57
|
+
alias_method :on_numblock, :on_block
|
58
58
|
end
|
59
59
|
end
|
60
60
|
end
|
@@ -39,12 +39,13 @@ module Rubocop
|
|
39
39
|
#
|
40
40
|
class EmptyLineAfterSharedExample < Base
|
41
41
|
extend RuboCop::Cop::AutoCorrector
|
42
|
-
include RuboCop::RSpec::EmptyLineSeparation
|
42
|
+
include RuboCop::Cop::RSpec::EmptyLineSeparation
|
43
43
|
|
44
44
|
MSG = 'Add an empty line after `%<example>s` block.'
|
45
45
|
|
46
|
+
# @!method shared_examples(node)
|
46
47
|
def_node_matcher :shared_examples,
|
47
|
-
(SharedGroups
|
48
|
+
block_pattern('{#SharedGroups.all #Includes.all}')
|
48
49
|
|
49
50
|
def on_block(node)
|
50
51
|
shared_examples(node) do
|
@@ -55,6 +56,7 @@ module Rubocop
|
|
55
56
|
end
|
56
57
|
end
|
57
58
|
end
|
59
|
+
alias_method :on_numblock, :on_block
|
58
60
|
end
|
59
61
|
end
|
60
62
|
end
|
@@ -52,6 +52,7 @@ module Rubocop
|
|
52
52
|
|
53
53
|
MSG = 'Only start words with lowercase alpha with no leading/trailing spaces when describing your tests.'
|
54
54
|
|
55
|
+
# @!method it_description(node)
|
55
56
|
def_node_matcher :it_description, <<-PATTERN
|
56
57
|
(block (send _ :it ${
|
57
58
|
(str $_)
|
@@ -64,6 +65,7 @@ module Rubocop
|
|
64
65
|
add_wording_offense(description_node, MSG) if invalid_description?(text(description_node))
|
65
66
|
end
|
66
67
|
end
|
68
|
+
alias_method :on_numblock, :on_block
|
67
69
|
|
68
70
|
private
|
69
71
|
|
@@ -6,7 +6,7 @@ require_relative 'base'
|
|
6
6
|
module Rubocop
|
7
7
|
module Cop
|
8
8
|
module RSpec
|
9
|
-
#
|
9
|
+
# Checks for unused parameters to the `have_link` matcher.
|
10
10
|
#
|
11
11
|
# @example
|
12
12
|
#
|
@@ -21,6 +21,7 @@ module Rubocop
|
|
21
21
|
|
22
22
|
MESSAGE = "The second argument to `have_link` should be a Hash."
|
23
23
|
|
24
|
+
# @!method unused_parameters?(node)
|
24
25
|
def_node_matcher :unused_parameters?, <<~PATTERN
|
25
26
|
(send nil? :have_link
|
26
27
|
_ !{hash nil}
|
@@ -6,7 +6,7 @@ require_relative 'base'
|
|
6
6
|
module Rubocop
|
7
7
|
module Cop
|
8
8
|
module RSpec
|
9
|
-
#
|
9
|
+
# Checks for single-line hook blocks
|
10
10
|
#
|
11
11
|
# @example
|
12
12
|
#
|
@@ -25,6 +25,7 @@ module Rubocop
|
|
25
25
|
class SingleLineHook < Base
|
26
26
|
MESSAGE = "Don't use single-line hook blocks."
|
27
27
|
|
28
|
+
# @!method rspec_hook?(node)
|
28
29
|
def_node_search :rspec_hook?, <<~PATTERN
|
29
30
|
(send nil? {:after :around :before} ...)
|
30
31
|
PATTERN
|
@@ -35,6 +36,7 @@ module Rubocop
|
|
35
36
|
|
36
37
|
add_offense(node, message: MESSAGE)
|
37
38
|
end
|
39
|
+
alias_method :on_numblock, :on_block
|
38
40
|
end
|
39
41
|
end
|
40
42
|
end
|
@@ -23,6 +23,7 @@ module Rubocop
|
|
23
23
|
|
24
24
|
SELECTORS = %i[describe context feature example_group it specify example scenario its].freeze
|
25
25
|
|
26
|
+
# @!method include_metadata(node)
|
26
27
|
def_node_matcher :include_metadata, <<-PATTERN
|
27
28
|
(send {(const nil? :RSpec) nil?} {#{SELECTORS.map(&:inspect).join(' ')}}
|
28
29
|
!const
|
@@ -30,6 +31,7 @@ module Rubocop
|
|
30
31
|
(hash $...))
|
31
32
|
PATTERN
|
32
33
|
|
34
|
+
# @!method invalid_metadata?(node)
|
33
35
|
def_node_matcher :invalid_metadata?, <<-PATTERN
|
34
36
|
(pair
|
35
37
|
(sym $...)
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module Rubocop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
#
|
6
|
+
# Identifies places where `map { ... }.to_h` or
|
7
7
|
# `Hash[map { ... }]` can be replaced with `to_h { ... }`,
|
8
8
|
# saving an intermediate array allocation.
|
9
9
|
#
|
@@ -20,11 +20,13 @@ module Rubocop
|
|
20
20
|
# array.to_h { |x| [x, x + 1] }
|
21
21
|
#
|
22
22
|
# Full credit: https://github.com/eugeneius/rubocop-performance/blob/hash_transformation/lib/rubocop/cop/performance/hash_transformation.rb
|
23
|
-
class HashTransformation < RuboCop::Cop::
|
23
|
+
class HashTransformation < RuboCop::Cop::Base
|
24
|
+
extend RuboCop::Cop::AutoCorrector
|
24
25
|
include RuboCop::Cop::RangeHelp
|
25
26
|
|
26
27
|
MSG = 'Use `to_h { ... }` instead of `%<current>s`.'
|
27
28
|
|
29
|
+
# @!method to_h_candidate?(node)
|
28
30
|
def_node_matcher :to_h_candidate?, <<~PATTERN
|
29
31
|
{
|
30
32
|
[(send
|
@@ -38,17 +40,13 @@ module Rubocop
|
|
38
40
|
to_h_candidate?(node) do |_block, call|
|
39
41
|
range = offense_range(node, call)
|
40
42
|
message = message(node, call)
|
41
|
-
add_offense(
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
def autocorrect(node)
|
46
|
-
block, call = to_h_candidate?(node)
|
43
|
+
add_offense(range, message: message) do |corrector|
|
44
|
+
block, call = to_h_candidate?(node)
|
47
45
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
46
|
+
corrector.remove(after_block(node, block))
|
47
|
+
corrector.replace(call.loc.selector, 'to_h')
|
48
|
+
corrector.remove(before_block(node, block))
|
49
|
+
end
|
52
50
|
end
|
53
51
|
end
|
54
52
|
|
@@ -3,18 +3,19 @@
|
|
3
3
|
module Rubocop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
#
|
6
|
+
# Flags uses of OpenStruct, as it is now officially discouraged
|
7
7
|
# to be used for performance, version compatibility, and potential security issues.
|
8
8
|
#
|
9
9
|
# See also:
|
10
10
|
# - https://rubyreferences.github.io/rubychanges/3.0.html#standard-library
|
11
11
|
# - https://docs.ruby-lang.org/en/3.0.0/OpenStruct.html#class-OpenStruct-label-Caveats
|
12
12
|
# - https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67855
|
13
|
-
class OpenStructUse < RuboCop::Cop::
|
13
|
+
class OpenStructUse < RuboCop::Cop::Base
|
14
14
|
MSG = 'Avoid using `OpenStruct`. It is officially discouraged. ' \
|
15
15
|
'Replace it with `Struct`, `Hash`, or RSpec doubles. ' \
|
16
16
|
'See https://docs.ruby-lang.org/en/3.0.0/OpenStruct.html#class-OpenStruct-label-Caveats'
|
17
17
|
|
18
|
+
# @!method uses_open_struct?(node)
|
18
19
|
def_node_matcher :uses_open_struct?, <<-PATTERN
|
19
20
|
(const {nil? (cbase)} :OpenStruct)
|
20
21
|
PATTERN
|
@@ -3,13 +3,13 @@
|
|
3
3
|
module Rubocop
|
4
4
|
module Cop
|
5
5
|
# Cop that prevents the use of `without_reactive_cache`
|
6
|
-
class WithoutReactiveCache < RuboCop::Cop::
|
6
|
+
class WithoutReactiveCache < RuboCop::Cop::Base
|
7
7
|
MSG = 'without_reactive_cache is for debugging purposes only. Please use with_reactive_cache.'
|
8
8
|
|
9
9
|
def on_send(node)
|
10
10
|
return unless node.children[1] == :without_reactive_cache
|
11
11
|
|
12
|
-
add_offense(node
|
12
|
+
add_offense(node.loc.selector)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
data/rubocop-layout.yml
CHANGED
@@ -135,7 +135,7 @@ Layout/LeadingCommentSpace:
|
|
135
135
|
Layout/LineLength:
|
136
136
|
Enabled: true
|
137
137
|
Max: 120
|
138
|
-
|
138
|
+
AllowedPatterns: ['\s#\srubocop']
|
139
139
|
|
140
140
|
# Checks that the closing brace in an array literal is either on the same line
|
141
141
|
# as the last array element, or a new line.
|
data/rubocop-rspec.yml
CHANGED
@@ -34,11 +34,6 @@ RSpec/DescribedClass:
|
|
34
34
|
# Checks if an example group does not include any tests.
|
35
35
|
RSpec/EmptyExampleGroup:
|
36
36
|
Enabled: true
|
37
|
-
CustomIncludeMethods:
|
38
|
-
- run_permission_checks
|
39
|
-
- run_group_permission_checks
|
40
|
-
- it_should_email!
|
41
|
-
- it_should_not_email!
|
42
37
|
|
43
38
|
# Checks if there is an empty line after let blocks.
|
44
39
|
RSpec/EmptyLineAfterLetBlock:
|
@@ -159,3 +154,16 @@ RSpec/SubjectStub:
|
|
159
154
|
# Prefer using verifying doubles over normal doubles.
|
160
155
|
RSpec/VerifiedDoubles:
|
161
156
|
Enabled: true
|
157
|
+
|
158
|
+
RSpec:
|
159
|
+
Language:
|
160
|
+
Helpers:
|
161
|
+
- let_it_be
|
162
|
+
- let_it_be_with_refind
|
163
|
+
- let_it_be_with_reload
|
164
|
+
Includes:
|
165
|
+
Examples:
|
166
|
+
- run_permission_checks
|
167
|
+
- run_group_permission_checks
|
168
|
+
- it_should_email!
|
169
|
+
- it_should_not_email!
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gitlab-styles
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 9.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GitLab
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-09-
|
11
|
+
date: 2022-09-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubocop
|
@@ -16,20 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
20
|
-
- - ">="
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: 0.91.1
|
19
|
+
version: 1.36.0
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
24
|
- - "~>"
|
28
25
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
30
|
-
- - ">="
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version: 0.91.1
|
26
|
+
version: 1.36.0
|
33
27
|
- !ruby/object:Gem::Dependency
|
34
28
|
name: rubocop-gitlab-security
|
35
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -50,56 +44,56 @@ dependencies:
|
|
50
44
|
requirements:
|
51
45
|
- - "~>"
|
52
46
|
- !ruby/object:Gem::Version
|
53
|
-
version: '0.
|
47
|
+
version: '0.14'
|
54
48
|
type: :runtime
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
51
|
requirements:
|
58
52
|
- - "~>"
|
59
53
|
- !ruby/object:Gem::Version
|
60
|
-
version: '0.
|
54
|
+
version: '0.14'
|
61
55
|
- !ruby/object:Gem::Dependency
|
62
56
|
name: rubocop-performance
|
63
57
|
requirement: !ruby/object:Gem::Requirement
|
64
58
|
requirements:
|
65
59
|
- - "~>"
|
66
60
|
- !ruby/object:Gem::Version
|
67
|
-
version: 1.
|
61
|
+
version: '1.14'
|
68
62
|
type: :runtime
|
69
63
|
prerelease: false
|
70
64
|
version_requirements: !ruby/object:Gem::Requirement
|
71
65
|
requirements:
|
72
66
|
- - "~>"
|
73
67
|
- !ruby/object:Gem::Version
|
74
|
-
version: 1.
|
68
|
+
version: '1.14'
|
75
69
|
- !ruby/object:Gem::Dependency
|
76
70
|
name: rubocop-rails
|
77
71
|
requirement: !ruby/object:Gem::Requirement
|
78
72
|
requirements:
|
79
73
|
- - "~>"
|
80
74
|
- !ruby/object:Gem::Version
|
81
|
-
version: '2.
|
75
|
+
version: '2.15'
|
82
76
|
type: :runtime
|
83
77
|
prerelease: false
|
84
78
|
version_requirements: !ruby/object:Gem::Requirement
|
85
79
|
requirements:
|
86
80
|
- - "~>"
|
87
81
|
- !ruby/object:Gem::Version
|
88
|
-
version: '2.
|
82
|
+
version: '2.15'
|
89
83
|
- !ruby/object:Gem::Dependency
|
90
84
|
name: rubocop-rspec
|
91
85
|
requirement: !ruby/object:Gem::Requirement
|
92
86
|
requirements:
|
93
87
|
- - "~>"
|
94
88
|
- !ruby/object:Gem::Version
|
95
|
-
version: '
|
89
|
+
version: '2.12'
|
96
90
|
type: :runtime
|
97
91
|
prerelease: false
|
98
92
|
version_requirements: !ruby/object:Gem::Requirement
|
99
93
|
requirements:
|
100
94
|
- - "~>"
|
101
95
|
- !ruby/object:Gem::Version
|
102
|
-
version: '
|
96
|
+
version: '2.12'
|
103
97
|
- !ruby/object:Gem::Dependency
|
104
98
|
name: bundler
|
105
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -186,7 +180,6 @@ files:
|
|
186
180
|
- lib/gitlab/styles/rubocop.rb
|
187
181
|
- lib/gitlab/styles/rubocop/migration_helpers.rb
|
188
182
|
- lib/gitlab/styles/rubocop/model_helpers.rb
|
189
|
-
- lib/gitlab/styles/rubocop/rspec/helpers.rb
|
190
183
|
- lib/gitlab/styles/version.rb
|
191
184
|
- lib/rubocop/cop/active_record_dependent.rb
|
192
185
|
- lib/rubocop/cop/active_record_serialize.rb
|
@@ -207,7 +200,6 @@ files:
|
|
207
200
|
- lib/rubocop/cop/rails/include_url_helper.rb
|
208
201
|
- lib/rubocop/cop/redirect_with_status.rb
|
209
202
|
- lib/rubocop/cop/rspec/base.rb
|
210
|
-
- lib/rubocop/cop/rspec/empty_line_after_final_let_it_be.rb
|
211
203
|
- lib/rubocop/cop/rspec/empty_line_after_let_block.rb
|
212
204
|
- lib/rubocop/cop/rspec/empty_line_after_shared_example.rb
|
213
205
|
- lib/rubocop/cop/rspec/example_starting_character.rb
|
@@ -1,18 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'rubocop-rspec'
|
4
|
-
|
5
|
-
module Gitlab
|
6
|
-
module Styles
|
7
|
-
module Rubocop
|
8
|
-
module Rspec
|
9
|
-
module Helpers
|
10
|
-
include RuboCop::RSpec::Language
|
11
|
-
|
12
|
-
LET_IT_BE_HELPERS = SelectorSet.new(%i[let_it_be let_it_be_with_refind let_it_be_with_reload])
|
13
|
-
LET = LET_IT_BE_HELPERS + RuboCop::RSpec::Language::Helpers::ALL
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'rubocop-rspec'
|
4
|
-
require_relative 'base'
|
5
|
-
|
6
|
-
module Rubocop
|
7
|
-
module Cop
|
8
|
-
module RSpec
|
9
|
-
# Checks if there is an empty line after the last `let_it_be` block.
|
10
|
-
#
|
11
|
-
# @example
|
12
|
-
# # bad
|
13
|
-
# let_it_be(:foo) { bar }
|
14
|
-
# let_it_be(:something) { other }
|
15
|
-
# it { does_something }
|
16
|
-
#
|
17
|
-
# # good
|
18
|
-
# let_it_be(:foo) { bar }
|
19
|
-
# let_it_be(:something) { other }
|
20
|
-
#
|
21
|
-
# it { does_something }
|
22
|
-
class EmptyLineAfterFinalLetItBe < Base
|
23
|
-
extend RuboCop::Cop::AutoCorrector
|
24
|
-
include RuboCop::RSpec::EmptyLineSeparation
|
25
|
-
|
26
|
-
MSG = 'Add an empty line after the last `let_it_be`.'
|
27
|
-
|
28
|
-
def_node_matcher :let_it_be?, <<-PATTERN
|
29
|
-
{
|
30
|
-
(block (send #rspec? {:let_it_be :let_it_be_with_refind :let_it_be_with_reload} ...) ...)
|
31
|
-
(send #rspec? {:let_it_be :let_it_be_with_refind :let_it_be_with_reload} _ block_pass)
|
32
|
-
}
|
33
|
-
PATTERN
|
34
|
-
|
35
|
-
def on_block(node)
|
36
|
-
return unless example_group_with_body?(node)
|
37
|
-
|
38
|
-
final_let_it_be = node.body.child_nodes.reverse.find { |child| let_it_be?(child) }
|
39
|
-
|
40
|
-
return if final_let_it_be.nil?
|
41
|
-
|
42
|
-
missing_separating_line_offense(final_let_it_be) { MSG }
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|