gitlab-styles 7.1.0 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/gitlab/styles/rubocop/model_helpers.rb +1 -1
- data/lib/gitlab/styles/rubocop.rb +2 -2
- data/lib/gitlab/styles/version.rb +1 -1
- data/lib/rubocop/cop/active_record_dependent.rb +32 -0
- data/lib/rubocop/cop/active_record_serialize.rb +20 -0
- data/lib/rubocop/cop/avoid_return_from_blocks.rb +77 -0
- data/lib/rubocop/cop/code_reuse/active_record.rb +80 -0
- data/lib/rubocop/cop/custom_error_class.rb +69 -0
- data/lib/rubocop/cop/fips/md5.rb +27 -0
- data/lib/rubocop/cop/fips/open_ssl.rb +31 -0
- data/lib/rubocop/cop/fips/sha1.rb +27 -0
- data/lib/rubocop/cop/gem_fetcher.rb +37 -0
- data/lib/rubocop/cop/in_batches.rb +18 -0
- data/lib/rubocop/cop/internal_affairs/deprecate_cop_helper.rb +39 -0
- data/lib/rubocop/cop/line_break_after_guard_clauses.rb +100 -0
- data/lib/rubocop/cop/line_break_around_conditional_block.rb +128 -0
- data/lib/rubocop/cop/migration/update_large_table.rb +60 -0
- data/lib/rubocop/cop/performance/rubyzip.rb +35 -0
- data/lib/rubocop/cop/polymorphic_associations.rb +25 -0
- data/lib/rubocop/cop/rails/include_url_helper.rb +27 -0
- data/lib/rubocop/cop/redirect_with_status.rb +46 -0
- data/lib/rubocop/cop/rspec/base.rb +14 -0
- data/lib/rubocop/cop/rspec/empty_line_after_final_let_it_be.rb +47 -0
- data/lib/rubocop/cop/rspec/empty_line_after_let_block.rb +61 -0
- data/lib/rubocop/cop/rspec/empty_line_after_shared_example.rb +61 -0
- data/lib/rubocop/cop/rspec/example_starting_character.rb +120 -0
- data/lib/rubocop/cop/rspec/have_link_parameters.rb +44 -0
- data/lib/rubocop/cop/rspec/single_line_hook.rb +41 -0
- data/lib/rubocop/cop/rspec/verbose_include_metadata.rb +71 -0
- data/lib/rubocop/cop/style/hash_transformation.rb +83 -0
- data/lib/rubocop/cop/style/open_struct_use.rb +39 -0
- data/lib/rubocop/cop/without_reactive_cache.rb +16 -0
- metadata +31 -31
- data/lib/gitlab/styles/rubocop/cop/active_record_dependent.rb +0 -36
- data/lib/gitlab/styles/rubocop/cop/active_record_serialize.rb +0 -24
- data/lib/gitlab/styles/rubocop/cop/avoid_return_from_blocks.rb +0 -81
- data/lib/gitlab/styles/rubocop/cop/code_reuse/active_record.rb +0 -84
- data/lib/gitlab/styles/rubocop/cop/custom_error_class.rb +0 -73
- data/lib/gitlab/styles/rubocop/cop/fips/md5.rb +0 -31
- data/lib/gitlab/styles/rubocop/cop/fips/open_ssl.rb +0 -35
- data/lib/gitlab/styles/rubocop/cop/fips/sha1.rb +0 -31
- data/lib/gitlab/styles/rubocop/cop/gem_fetcher.rb +0 -41
- data/lib/gitlab/styles/rubocop/cop/in_batches.rb +0 -22
- data/lib/gitlab/styles/rubocop/cop/internal_affairs/deprecate_cop_helper.rb +0 -43
- data/lib/gitlab/styles/rubocop/cop/line_break_after_guard_clauses.rb +0 -104
- data/lib/gitlab/styles/rubocop/cop/line_break_around_conditional_block.rb +0 -132
- data/lib/gitlab/styles/rubocop/cop/migration/update_large_table.rb +0 -64
- data/lib/gitlab/styles/rubocop/cop/performance/rubyzip.rb +0 -39
- data/lib/gitlab/styles/rubocop/cop/polymorphic_associations.rb +0 -29
- data/lib/gitlab/styles/rubocop/cop/rails/include_url_helper.rb +0 -31
- data/lib/gitlab/styles/rubocop/cop/redirect_with_status.rb +0 -50
- data/lib/gitlab/styles/rubocop/cop/rspec/base.rb +0 -18
- data/lib/gitlab/styles/rubocop/cop/rspec/empty_line_after_final_let_it_be.rb +0 -51
- data/lib/gitlab/styles/rubocop/cop/rspec/empty_line_after_let_block.rb +0 -65
- data/lib/gitlab/styles/rubocop/cop/rspec/empty_line_after_shared_example.rb +0 -65
- data/lib/gitlab/styles/rubocop/cop/rspec/example_starting_character.rb +0 -124
- data/lib/gitlab/styles/rubocop/cop/rspec/have_link_parameters.rb +0 -48
- data/lib/gitlab/styles/rubocop/cop/rspec/single_line_hook.rb +0 -45
- data/lib/gitlab/styles/rubocop/cop/rspec/verbose_include_metadata.rb +0 -75
- data/lib/gitlab/styles/rubocop/cop/style/hash_transformation.rb +0 -87
- data/lib/gitlab/styles/rubocop/cop/style/open_struct_use.rb +0 -43
- data/lib/gitlab/styles/rubocop/cop/without_reactive_cache.rb +0 -20
@@ -0,0 +1,41 @@
|
|
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
|
+
# This cop checks for single-line hook blocks
|
10
|
+
#
|
11
|
+
# @example
|
12
|
+
#
|
13
|
+
# # bad
|
14
|
+
# before { do_something }
|
15
|
+
# after(:each) { undo_something }
|
16
|
+
#
|
17
|
+
# # good
|
18
|
+
# before do
|
19
|
+
# do_something
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# after(:each) do
|
23
|
+
# undo_something
|
24
|
+
# end
|
25
|
+
class SingleLineHook < Base
|
26
|
+
MESSAGE = "Don't use single-line hook blocks."
|
27
|
+
|
28
|
+
def_node_search :rspec_hook?, <<~PATTERN
|
29
|
+
(send nil? {:after :around :before} ...)
|
30
|
+
PATTERN
|
31
|
+
|
32
|
+
def on_block(node)
|
33
|
+
return unless node.single_line?
|
34
|
+
return unless rspec_hook?(node)
|
35
|
+
|
36
|
+
add_offense(node, message: MESSAGE)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,71 @@
|
|
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 for verbose include metadata used in the specs.
|
10
|
+
#
|
11
|
+
# @example
|
12
|
+
# # bad
|
13
|
+
# describe MyClass, js: true do
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# # good
|
17
|
+
# describe MyClass, :js do
|
18
|
+
# end
|
19
|
+
class VerboseIncludeMetadata < Base
|
20
|
+
extend RuboCop::Cop::AutoCorrector
|
21
|
+
|
22
|
+
MSG = 'Use `%s` instead of `%s`.'
|
23
|
+
|
24
|
+
SELECTORS = %i[describe context feature example_group it specify example scenario its].freeze
|
25
|
+
|
26
|
+
def_node_matcher :include_metadata, <<-PATTERN
|
27
|
+
(send {(const nil? :RSpec) nil?} {#{SELECTORS.map(&:inspect).join(' ')}}
|
28
|
+
!const
|
29
|
+
...
|
30
|
+
(hash $...))
|
31
|
+
PATTERN
|
32
|
+
|
33
|
+
def_node_matcher :invalid_metadata?, <<-PATTERN
|
34
|
+
(pair
|
35
|
+
(sym $...)
|
36
|
+
(true))
|
37
|
+
PATTERN
|
38
|
+
|
39
|
+
def on_send(node)
|
40
|
+
invalid_metadata_matches(node) do |match|
|
41
|
+
add_offense(node, message: format(MSG, good(match), bad(match))) do |corrector|
|
42
|
+
invalid_metadata_matches(node) do |match|
|
43
|
+
corrector.replace(match.loc.expression, good(match))
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def invalid_metadata_matches(node, &block)
|
52
|
+
include_metadata(node) do |matches|
|
53
|
+
matches.select { |match| invalid_metadata?(match) }.each(&block)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def bad(match)
|
58
|
+
"#{metadata_key(match)}: true"
|
59
|
+
end
|
60
|
+
|
61
|
+
def good(match)
|
62
|
+
":#{metadata_key(match)}"
|
63
|
+
end
|
64
|
+
|
65
|
+
def metadata_key(match)
|
66
|
+
match.children[0].source
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop identifies places where `map { ... }.to_h` or
|
7
|
+
# `Hash[map { ... }]` can be replaced with `to_h { ... }`,
|
8
|
+
# saving an intermediate array allocation.
|
9
|
+
#
|
10
|
+
# @example
|
11
|
+
# # bad
|
12
|
+
# hash.map { |k, v| [v.upcase, k.downcase] }.to_h
|
13
|
+
# hash.collect { |k, v| [v.upcase, k.downcase] }.to_h
|
14
|
+
# Hash[hash.map { |k, v| [v.upcase, k.downcase] }]
|
15
|
+
# Hash[hash.collect { |k, v| [v.upcase, k.downcase] }]
|
16
|
+
# array.map { |x| [x, x + 1] }.to_h
|
17
|
+
#
|
18
|
+
# # good
|
19
|
+
# hash.to_h { |k, v| [v.upcase, k.downcase] }
|
20
|
+
# array.to_h { |x| [x, x + 1] }
|
21
|
+
#
|
22
|
+
# Full credit: https://github.com/eugeneius/rubocop-performance/blob/hash_transformation/lib/rubocop/cop/performance/hash_transformation.rb
|
23
|
+
class HashTransformation < RuboCop::Cop::Cop
|
24
|
+
include RuboCop::Cop::RangeHelp
|
25
|
+
|
26
|
+
MSG = 'Use `to_h { ... }` instead of `%<current>s`.'
|
27
|
+
|
28
|
+
def_node_matcher :to_h_candidate?, <<~PATTERN
|
29
|
+
{
|
30
|
+
[(send
|
31
|
+
$(block $(send _ {:map :collect}) ...) :to_h) !block_literal?]
|
32
|
+
(send (const nil? :Hash) :[]
|
33
|
+
$(block $(send _ {:map :collect}) ...))
|
34
|
+
}
|
35
|
+
PATTERN
|
36
|
+
|
37
|
+
def on_send(node)
|
38
|
+
to_h_candidate?(node) do |_block, call|
|
39
|
+
range = offense_range(node, call)
|
40
|
+
message = message(node, call)
|
41
|
+
add_offense(node, location: range, message: message)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def autocorrect(node)
|
46
|
+
block, call = to_h_candidate?(node)
|
47
|
+
|
48
|
+
lambda do |corrector|
|
49
|
+
corrector.remove(after_block(node, block))
|
50
|
+
corrector.replace(call.loc.selector, 'to_h')
|
51
|
+
corrector.remove(before_block(node, block))
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def offense_range(node, call)
|
58
|
+
return node.source_range if node.children.first.const_type?
|
59
|
+
|
60
|
+
range_between(call.loc.selector.begin_pos, node.loc.selector.end_pos)
|
61
|
+
end
|
62
|
+
|
63
|
+
def message(node, call)
|
64
|
+
current = if node.children.first.const_type?
|
65
|
+
"Hash[#{call.method_name} { ... }]"
|
66
|
+
else
|
67
|
+
"#{call.method_name} { ... }.to_h"
|
68
|
+
end
|
69
|
+
|
70
|
+
format(MSG, current: current)
|
71
|
+
end
|
72
|
+
|
73
|
+
def after_block(node, block)
|
74
|
+
block.source_range.end.join(node.source_range.end)
|
75
|
+
end
|
76
|
+
|
77
|
+
def before_block(node, block)
|
78
|
+
node.source_range.begin.join(block.source_range.begin)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop flags uses of OpenStruct, as it is now officially discouraged
|
7
|
+
# to be used for performance, version compatibility, and potential security issues.
|
8
|
+
#
|
9
|
+
# See also:
|
10
|
+
# - https://rubyreferences.github.io/rubychanges/3.0.html#standard-library
|
11
|
+
# - https://docs.ruby-lang.org/en/3.0.0/OpenStruct.html#class-OpenStruct-label-Caveats
|
12
|
+
# - https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67855
|
13
|
+
class OpenStructUse < RuboCop::Cop::Cop
|
14
|
+
MSG = 'Avoid using `OpenStruct`. It is officially discouraged. ' \
|
15
|
+
'Replace it with `Struct`, `Hash`, or RSpec doubles. ' \
|
16
|
+
'See https://docs.ruby-lang.org/en/3.0.0/OpenStruct.html#class-OpenStruct-label-Caveats'
|
17
|
+
|
18
|
+
def_node_matcher :uses_open_struct?, <<-PATTERN
|
19
|
+
(const {nil? (cbase)} :OpenStruct)
|
20
|
+
PATTERN
|
21
|
+
|
22
|
+
def on_const(node)
|
23
|
+
return unless uses_open_struct?(node)
|
24
|
+
return if custom_class_or_module_definition?(node)
|
25
|
+
|
26
|
+
add_offense(node)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def custom_class_or_module_definition?(node)
|
32
|
+
parent = node.parent
|
33
|
+
|
34
|
+
(parent.class_type? || parent.module_type?) && node.left_siblings.empty?
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
# Cop that prevents the use of `without_reactive_cache`
|
6
|
+
class WithoutReactiveCache < RuboCop::Cop::Cop
|
7
|
+
MSG = 'without_reactive_cache is for debugging purposes only. Please use with_reactive_cache.'
|
8
|
+
|
9
|
+
def on_send(node)
|
10
|
+
return unless node.children[1] == :without_reactive_cache
|
11
|
+
|
12
|
+
add_offense(node, location: :selector)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
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: 8.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-
|
11
|
+
date: 2022-09-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubocop
|
@@ -184,39 +184,39 @@ files:
|
|
184
184
|
- lib/gitlab/styles.rb
|
185
185
|
- lib/gitlab/styles/common/banned_constants.rb
|
186
186
|
- lib/gitlab/styles/rubocop.rb
|
187
|
-
- lib/gitlab/styles/rubocop/cop/active_record_dependent.rb
|
188
|
-
- lib/gitlab/styles/rubocop/cop/active_record_serialize.rb
|
189
|
-
- lib/gitlab/styles/rubocop/cop/avoid_return_from_blocks.rb
|
190
|
-
- lib/gitlab/styles/rubocop/cop/code_reuse/active_record.rb
|
191
|
-
- lib/gitlab/styles/rubocop/cop/custom_error_class.rb
|
192
|
-
- lib/gitlab/styles/rubocop/cop/fips/md5.rb
|
193
|
-
- lib/gitlab/styles/rubocop/cop/fips/open_ssl.rb
|
194
|
-
- lib/gitlab/styles/rubocop/cop/fips/sha1.rb
|
195
|
-
- lib/gitlab/styles/rubocop/cop/gem_fetcher.rb
|
196
|
-
- lib/gitlab/styles/rubocop/cop/in_batches.rb
|
197
|
-
- lib/gitlab/styles/rubocop/cop/internal_affairs/deprecate_cop_helper.rb
|
198
|
-
- lib/gitlab/styles/rubocop/cop/line_break_after_guard_clauses.rb
|
199
|
-
- lib/gitlab/styles/rubocop/cop/line_break_around_conditional_block.rb
|
200
|
-
- lib/gitlab/styles/rubocop/cop/migration/update_large_table.rb
|
201
|
-
- lib/gitlab/styles/rubocop/cop/performance/rubyzip.rb
|
202
|
-
- lib/gitlab/styles/rubocop/cop/polymorphic_associations.rb
|
203
|
-
- lib/gitlab/styles/rubocop/cop/rails/include_url_helper.rb
|
204
|
-
- lib/gitlab/styles/rubocop/cop/redirect_with_status.rb
|
205
|
-
- lib/gitlab/styles/rubocop/cop/rspec/base.rb
|
206
|
-
- lib/gitlab/styles/rubocop/cop/rspec/empty_line_after_final_let_it_be.rb
|
207
|
-
- lib/gitlab/styles/rubocop/cop/rspec/empty_line_after_let_block.rb
|
208
|
-
- lib/gitlab/styles/rubocop/cop/rspec/empty_line_after_shared_example.rb
|
209
|
-
- lib/gitlab/styles/rubocop/cop/rspec/example_starting_character.rb
|
210
|
-
- lib/gitlab/styles/rubocop/cop/rspec/have_link_parameters.rb
|
211
|
-
- lib/gitlab/styles/rubocop/cop/rspec/single_line_hook.rb
|
212
|
-
- lib/gitlab/styles/rubocop/cop/rspec/verbose_include_metadata.rb
|
213
|
-
- lib/gitlab/styles/rubocop/cop/style/hash_transformation.rb
|
214
|
-
- lib/gitlab/styles/rubocop/cop/style/open_struct_use.rb
|
215
|
-
- lib/gitlab/styles/rubocop/cop/without_reactive_cache.rb
|
216
187
|
- lib/gitlab/styles/rubocop/migration_helpers.rb
|
217
188
|
- lib/gitlab/styles/rubocop/model_helpers.rb
|
218
189
|
- lib/gitlab/styles/rubocop/rspec/helpers.rb
|
219
190
|
- lib/gitlab/styles/version.rb
|
191
|
+
- lib/rubocop/cop/active_record_dependent.rb
|
192
|
+
- lib/rubocop/cop/active_record_serialize.rb
|
193
|
+
- lib/rubocop/cop/avoid_return_from_blocks.rb
|
194
|
+
- lib/rubocop/cop/code_reuse/active_record.rb
|
195
|
+
- lib/rubocop/cop/custom_error_class.rb
|
196
|
+
- lib/rubocop/cop/fips/md5.rb
|
197
|
+
- lib/rubocop/cop/fips/open_ssl.rb
|
198
|
+
- lib/rubocop/cop/fips/sha1.rb
|
199
|
+
- lib/rubocop/cop/gem_fetcher.rb
|
200
|
+
- lib/rubocop/cop/in_batches.rb
|
201
|
+
- lib/rubocop/cop/internal_affairs/deprecate_cop_helper.rb
|
202
|
+
- lib/rubocop/cop/line_break_after_guard_clauses.rb
|
203
|
+
- lib/rubocop/cop/line_break_around_conditional_block.rb
|
204
|
+
- lib/rubocop/cop/migration/update_large_table.rb
|
205
|
+
- lib/rubocop/cop/performance/rubyzip.rb
|
206
|
+
- lib/rubocop/cop/polymorphic_associations.rb
|
207
|
+
- lib/rubocop/cop/rails/include_url_helper.rb
|
208
|
+
- lib/rubocop/cop/redirect_with_status.rb
|
209
|
+
- lib/rubocop/cop/rspec/base.rb
|
210
|
+
- lib/rubocop/cop/rspec/empty_line_after_final_let_it_be.rb
|
211
|
+
- lib/rubocop/cop/rspec/empty_line_after_let_block.rb
|
212
|
+
- lib/rubocop/cop/rspec/empty_line_after_shared_example.rb
|
213
|
+
- lib/rubocop/cop/rspec/example_starting_character.rb
|
214
|
+
- lib/rubocop/cop/rspec/have_link_parameters.rb
|
215
|
+
- lib/rubocop/cop/rspec/single_line_hook.rb
|
216
|
+
- lib/rubocop/cop/rspec/verbose_include_metadata.rb
|
217
|
+
- lib/rubocop/cop/style/hash_transformation.rb
|
218
|
+
- lib/rubocop/cop/style/open_struct_use.rb
|
219
|
+
- lib/rubocop/cop/without_reactive_cache.rb
|
220
220
|
- rubocop-all.yml
|
221
221
|
- rubocop-bundler.yml
|
222
222
|
- rubocop-code_reuse.yml
|
@@ -1,36 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative '../model_helpers'
|
4
|
-
|
5
|
-
module Gitlab
|
6
|
-
module Styles
|
7
|
-
module Rubocop
|
8
|
-
module Cop
|
9
|
-
# Cop that prevents the use of `dependent: ...` in ActiveRecord models.
|
10
|
-
class ActiveRecordDependent < RuboCop::Cop::Cop
|
11
|
-
include ModelHelpers
|
12
|
-
|
13
|
-
MSG = 'Do not use `dependent:` to remove associated data, ' \
|
14
|
-
'use foreign keys with cascading deletes instead.'
|
15
|
-
|
16
|
-
METHOD_NAMES = [:has_many, :has_one, :belongs_to].freeze
|
17
|
-
ALLOWED_OPTIONS = [:restrict_with_error].freeze
|
18
|
-
|
19
|
-
def on_send(node)
|
20
|
-
return unless in_model?(node)
|
21
|
-
return unless METHOD_NAMES.include?(node.children[1])
|
22
|
-
|
23
|
-
node.children.last.each_node(:pair) do |pair|
|
24
|
-
key_name = pair.children[0].children[0]
|
25
|
-
option_name = pair.children[1].children[0]
|
26
|
-
|
27
|
-
break if ALLOWED_OPTIONS.include?(option_name)
|
28
|
-
|
29
|
-
add_offense(pair) if key_name == :dependent
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative '../model_helpers'
|
4
|
-
|
5
|
-
module Gitlab
|
6
|
-
module Styles
|
7
|
-
module Rubocop
|
8
|
-
module Cop
|
9
|
-
# Cop that prevents the use of `serialize` in ActiveRecord models.
|
10
|
-
class ActiveRecordSerialize < RuboCop::Cop::Cop
|
11
|
-
include ModelHelpers
|
12
|
-
|
13
|
-
MSG = 'Do not store serialized data in the database, use separate columns and/or tables instead'
|
14
|
-
|
15
|
-
def on_send(node)
|
16
|
-
return unless in_model?(node)
|
17
|
-
|
18
|
-
add_offense(node, location: :selector) if node.children[1] == :serialize
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,81 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Gitlab
|
4
|
-
module Styles
|
5
|
-
module Rubocop
|
6
|
-
module Cop
|
7
|
-
# Checks for return inside blocks.
|
8
|
-
# For more information see: https://gitlab.com/gitlab-org/gitlab-foss/issues/42889
|
9
|
-
#
|
10
|
-
# @example
|
11
|
-
# # bad
|
12
|
-
# call do
|
13
|
-
# return if something
|
14
|
-
#
|
15
|
-
# do_something_else
|
16
|
-
# end
|
17
|
-
#
|
18
|
-
# # good
|
19
|
-
# call do
|
20
|
-
# break if something
|
21
|
-
#
|
22
|
-
# do_something_else
|
23
|
-
# end
|
24
|
-
#
|
25
|
-
class AvoidReturnFromBlocks < RuboCop::Cop::Cop
|
26
|
-
MSG = 'Do not return from a block, use next or break instead.'
|
27
|
-
DEF_METHODS = %i[define_method lambda].freeze
|
28
|
-
WHITELISTED_METHODS = %i[each each_filename times loop].freeze
|
29
|
-
|
30
|
-
def on_block(node)
|
31
|
-
block_body = node.body
|
32
|
-
|
33
|
-
return unless block_body
|
34
|
-
return unless top_block?(node)
|
35
|
-
|
36
|
-
block_body.each_node(:return) do |return_node|
|
37
|
-
next if parent_blocks(node, return_node).all? { |block| whitelisted?(block) }
|
38
|
-
|
39
|
-
add_offense(return_node)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
private
|
44
|
-
|
45
|
-
def top_block?(node)
|
46
|
-
current_node = node
|
47
|
-
top_block = nil
|
48
|
-
|
49
|
-
while current_node && current_node.type != :def
|
50
|
-
top_block = current_node if current_node.block_type?
|
51
|
-
current_node = current_node.parent
|
52
|
-
end
|
53
|
-
|
54
|
-
top_block == node
|
55
|
-
end
|
56
|
-
|
57
|
-
def parent_blocks(node, current_node)
|
58
|
-
blocks = []
|
59
|
-
|
60
|
-
until node == current_node || def?(current_node)
|
61
|
-
blocks << current_node if current_node.block_type?
|
62
|
-
current_node = current_node.parent
|
63
|
-
end
|
64
|
-
|
65
|
-
blocks << node if node == current_node && !def?(node)
|
66
|
-
blocks
|
67
|
-
end
|
68
|
-
|
69
|
-
def def?(node)
|
70
|
-
node.def_type? || node.defs_type? ||
|
71
|
-
(node.block_type? && DEF_METHODS.include?(node.method_name))
|
72
|
-
end
|
73
|
-
|
74
|
-
def whitelisted?(block_node)
|
75
|
-
WHITELISTED_METHODS.include?(block_node.method_name)
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
@@ -1,84 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Gitlab
|
4
|
-
module Styles
|
5
|
-
module Rubocop
|
6
|
-
module Cop
|
7
|
-
module CodeReuse
|
8
|
-
# Cop that denies the use of ActiveRecord methods outside of models.
|
9
|
-
class ActiveRecord < RuboCop::Cop::Cop
|
10
|
-
MSG = 'This method can only be used inside an ActiveRecord model: ' \
|
11
|
-
'https://gitlab.com/gitlab-org/gitlab-foss/issues/49653'
|
12
|
-
|
13
|
-
# Various methods from ActiveRecord::Querying that are denied. We
|
14
|
-
# exclude some generic ones such as `any?` and `first`, as these may
|
15
|
-
# lead to too many false positives, since `Array` also supports these
|
16
|
-
# methods.
|
17
|
-
#
|
18
|
-
# The keys of this Hash are the denied method names. The values are
|
19
|
-
# booleans that indicate if the method should only be denied if any
|
20
|
-
# arguments are provided.
|
21
|
-
NOT_ALLOWED = {
|
22
|
-
average: true,
|
23
|
-
calculate: true,
|
24
|
-
count_by_sql: true,
|
25
|
-
create_with: true,
|
26
|
-
distinct: false,
|
27
|
-
eager_load: true,
|
28
|
-
exists?: true,
|
29
|
-
find_by: true,
|
30
|
-
find_by!: true,
|
31
|
-
find_by_sql: true,
|
32
|
-
find_each: true,
|
33
|
-
find_in_batches: true,
|
34
|
-
find_or_create_by: true,
|
35
|
-
find_or_create_by!: true,
|
36
|
-
find_or_initialize_by: true,
|
37
|
-
first!: false,
|
38
|
-
first_or_create: true,
|
39
|
-
first_or_create!: true,
|
40
|
-
first_or_initialize: true,
|
41
|
-
from: true,
|
42
|
-
group: true,
|
43
|
-
having: true,
|
44
|
-
ids: false,
|
45
|
-
includes: true,
|
46
|
-
joins: true,
|
47
|
-
lock: false,
|
48
|
-
many?: false,
|
49
|
-
offset: true,
|
50
|
-
order: true,
|
51
|
-
pluck: true,
|
52
|
-
preload: true,
|
53
|
-
readonly: false,
|
54
|
-
references: true,
|
55
|
-
reorder: true,
|
56
|
-
rewhere: true,
|
57
|
-
take: false,
|
58
|
-
take!: false,
|
59
|
-
unscope: false,
|
60
|
-
where: false,
|
61
|
-
with: true
|
62
|
-
}.freeze
|
63
|
-
|
64
|
-
def on_send(node)
|
65
|
-
receiver = node.children[0]
|
66
|
-
send_name = node.children[1]
|
67
|
-
first_arg = node.children[2]
|
68
|
-
|
69
|
-
return unless receiver && NOT_ALLOWED.key?(send_name)
|
70
|
-
|
71
|
-
# If the rule requires an argument to be given, but none are
|
72
|
-
# provided, we won't register an offense. This prevents us from
|
73
|
-
# adding offenses for `project.group`, while still covering
|
74
|
-
# `Project.group(:name)`.
|
75
|
-
return if NOT_ALLOWED[send_name] && !first_arg
|
76
|
-
|
77
|
-
add_offense(node, location: :selector)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
@@ -1,73 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Gitlab
|
4
|
-
module Styles
|
5
|
-
module Rubocop
|
6
|
-
module Cop
|
7
|
-
# This cop makes sure that custom error classes, when empty, are declared
|
8
|
-
# with Class.new.
|
9
|
-
#
|
10
|
-
# @example
|
11
|
-
# # bad
|
12
|
-
# class FooError < StandardError
|
13
|
-
# end
|
14
|
-
#
|
15
|
-
# # okish
|
16
|
-
# class FooError < StandardError; end
|
17
|
-
#
|
18
|
-
# # good
|
19
|
-
# FooError = Class.new(StandardError)
|
20
|
-
class CustomErrorClass < RuboCop::Cop::Cop
|
21
|
-
MSG = 'Use `Class.new(SuperClass)` to define an empty custom error class.'
|
22
|
-
|
23
|
-
def on_class(node)
|
24
|
-
parent = node.parent_class
|
25
|
-
body = node.body
|
26
|
-
|
27
|
-
return if body
|
28
|
-
|
29
|
-
parent_klass = class_name_from_node(parent)
|
30
|
-
|
31
|
-
return unless parent_klass&.to_s&.end_with?('Error')
|
32
|
-
|
33
|
-
add_offense(node)
|
34
|
-
end
|
35
|
-
|
36
|
-
def autocorrect(node)
|
37
|
-
klass = node.identifier
|
38
|
-
parent = node.parent_class
|
39
|
-
|
40
|
-
replacement = "#{class_name_from_node(klass)} = Class.new(#{class_name_from_node(parent)})"
|
41
|
-
|
42
|
-
lambda do |corrector|
|
43
|
-
corrector.replace(node.source_range, replacement)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
private
|
48
|
-
|
49
|
-
# The nested constant `Foo::Bar::Baz` looks like:
|
50
|
-
#
|
51
|
-
# s(:const,
|
52
|
-
# s(:const,
|
53
|
-
# s(:const, nil, :Foo), :Bar), :Baz)
|
54
|
-
#
|
55
|
-
# So recurse through that to get the name as written in the source.
|
56
|
-
#
|
57
|
-
def class_name_from_node(node, suffix = nil)
|
58
|
-
return unless node&.type == :const
|
59
|
-
|
60
|
-
name = node.children[1].to_s
|
61
|
-
name = "#{name}::#{suffix}" if suffix
|
62
|
-
|
63
|
-
if node.children[0]
|
64
|
-
class_name_from_node(node.children[0], name)
|
65
|
-
else
|
66
|
-
name
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative '../../../common/banned_constants'
|
4
|
-
|
5
|
-
module Gitlab
|
6
|
-
module Styles
|
7
|
-
module Rubocop
|
8
|
-
module Cop
|
9
|
-
module Fips
|
10
|
-
class MD5 < RuboCop::Cop::Base
|
11
|
-
include Gitlab::Styles::Common::BannedConstants
|
12
|
-
|
13
|
-
MESSAGE_TEMPLATE = 'MD5 is not FIPS-compliant. Use %{replacement} instead.'
|
14
|
-
|
15
|
-
REPLACEMENTS = {
|
16
|
-
'OpenSSL::Digest::MD5' => 'OpenSSL::Digest::SHA256',
|
17
|
-
'Digest::MD5' => 'OpenSSL::Digest::SHA256'
|
18
|
-
}.freeze
|
19
|
-
|
20
|
-
def initialize(config = nil, options = nil)
|
21
|
-
@message_template = MESSAGE_TEMPLATE
|
22
|
-
@replacements = REPLACEMENTS
|
23
|
-
@autocorrect = false
|
24
|
-
super(config, options)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|