sevencop 0.22.0 → 0.23.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (27) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/README.md +0 -16
  4. data/config/default.yml +0 -143
  5. data/lib/sevencop/cop_concerns.rb +0 -3
  6. data/lib/sevencop/version.rb +1 -1
  7. data/lib/sevencop.rb +0 -16
  8. metadata +2 -21
  9. data/lib/rubocop/cop/sevencop/rails_migration_add_check_constraint.rb +0 -111
  10. data/lib/rubocop/cop/sevencop/rails_migration_add_column_with_default_value.rb +0 -229
  11. data/lib/rubocop/cop/sevencop/rails_migration_add_foreign_key.rb +0 -166
  12. data/lib/rubocop/cop/sevencop/rails_migration_add_index_concurrently.rb +0 -164
  13. data/lib/rubocop/cop/sevencop/rails_migration_batch_in_batches.rb +0 -95
  14. data/lib/rubocop/cop/sevencop/rails_migration_batch_in_transaction.rb +0 -83
  15. data/lib/rubocop/cop/sevencop/rails_migration_batch_with_throttling.rb +0 -108
  16. data/lib/rubocop/cop/sevencop/rails_migration_change_column.rb +0 -113
  17. data/lib/rubocop/cop/sevencop/rails_migration_change_column_null.rb +0 -128
  18. data/lib/rubocop/cop/sevencop/rails_migration_create_table_force.rb +0 -89
  19. data/lib/rubocop/cop/sevencop/rails_migration_jsonb.rb +0 -131
  20. data/lib/rubocop/cop/sevencop/rails_migration_remove_column.rb +0 -258
  21. data/lib/rubocop/cop/sevencop/rails_migration_rename_column.rb +0 -81
  22. data/lib/rubocop/cop/sevencop/rails_migration_rename_table.rb +0 -79
  23. data/lib/rubocop/cop/sevencop/rails_migration_reserved_word_mysql.rb +0 -232
  24. data/lib/rubocop/cop/sevencop/rails_migration_unique_index_columns_count.rb +0 -92
  25. data/lib/sevencop/cop_concerns/batch_processing.rb +0 -32
  26. data/lib/sevencop/cop_concerns/column_type_method.rb +0 -26
  27. data/lib/sevencop/cop_concerns/disable_ddl_transaction.rb +0 -49
@@ -1,81 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module Sevencop
6
- # Avoid renaming columns that are in use.
7
- #
8
- # It will cause errors in your application.
9
- # A safer approach is to:
10
- #
11
- # 1. Create a new column
12
- # 2. Write to both columns
13
- # 3. Backfill data from the old column to the new column
14
- # 4. Move reads from the old column to the new column
15
- # 5. Stop writing to the old column
16
- # 6. Drop the old column
17
- #
18
- # @safety
19
- # Only meaningful if the column is in use.
20
- #
21
- # @example
22
- # # bad
23
- # class RenameUsersSettingsToProperties < ActiveRecord::Migration[7.0]
24
- # def change
25
- # rename_column :users, :settings, :properties
26
- # end
27
- # end
28
- #
29
- # # good
30
- # class AddUsersProperties < ActiveRecord::Migration[7.0]
31
- # def change
32
- # add_column :users, :properties, :jsonb
33
- # end
34
- # end
35
- #
36
- # class User < ApplicationRecord
37
- # self.ignored_columns += %w[settings]
38
- # end
39
- #
40
- # class RemoveUsersSettings < ActiveRecord::Migration[7.0]
41
- # def change
42
- # remove_column :users, :settings
43
- # end
44
- # end
45
- class RailsMigrationRenameColumn < RuboCop::Cop::Base
46
- MSG = 'Avoid renaming columns that are in use.'
47
-
48
- RESTRICT_ON_SEND = %i[
49
- rename_column
50
- ].freeze
51
-
52
- # @param node [RuboCop::AST::SendNode]
53
- # @return [void]
54
- def on_send(node)
55
- return unless bad?(node)
56
-
57
- add_offense(node)
58
- end
59
-
60
- private
61
-
62
- # @!method rename_column?(node)
63
- # @param node [RuboCop::AST::SendNode]
64
- # @return [Boolean]
65
- def_node_matcher :rename_column?, <<~PATTERN
66
- (send
67
- nil?
68
- :rename_column
69
- ...
70
- )
71
- PATTERN
72
-
73
- # @param node [RuboCop::AST::SendNode]
74
- # @return [Boolean]
75
- def bad?(node)
76
- rename_column?(node)
77
- end
78
- end
79
- end
80
- end
81
- end
@@ -1,79 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module Sevencop
6
- # Avoid renaming tables that are in use.
7
- #
8
- # It will cause errors in your application.
9
- # A safer approach is to:
10
- #
11
- # 1. Create a new table
12
- # 2. Write to both tables
13
- # 3. Backfill data from the old table to new table
14
- # 4. Move reads from the old table to the new table
15
- # 5. Stop writing to the old table
16
- # 6. Drop the old table
17
- #
18
- # @safety
19
- # Only meaningful if the table is in use.
20
- #
21
- # @example
22
- # # bad
23
- # class RenameUsersToAccouts < ActiveRecord::Migration[7.0]
24
- # def change
25
- # rename_table :users, :accounts
26
- # end
27
- # end
28
- #
29
- # # good
30
- # class AddAccounts < ActiveRecord::Migration[7.0]
31
- # def change
32
- # create_table :accounts do |t|
33
- # t.string :name, null: false
34
- # end
35
- # end
36
- # end
37
- #
38
- # class RemoveUsers < ActiveRecord::Migration[7.0]
39
- # def change
40
- # remove_table :users
41
- # end
42
- # end
43
- class RailsMigrationRenameTable < RuboCop::Cop::Base
44
- MSG = 'Avoid renaming tables that are in use.'
45
-
46
- RESTRICT_ON_SEND = %i[
47
- rename_table
48
- ].freeze
49
-
50
- # @param node [RuboCop::AST::SendNode]
51
- # @return [void]
52
- def on_send(node)
53
- return unless bad?(node)
54
-
55
- add_offense(node)
56
- end
57
-
58
- private
59
-
60
- # @!method rename_table?(node)
61
- # @param node [RuboCop::AST::SendNode]
62
- # @return [Boolean]
63
- def_node_matcher :rename_table?, <<~PATTERN
64
- (send
65
- nil?
66
- :rename_table
67
- ...
68
- )
69
- PATTERN
70
-
71
- # @param node [RuboCop::AST::SendNode]
72
- # @return [Boolean]
73
- def bad?(node)
74
- rename_table?(node)
75
- end
76
- end
77
- end
78
- end
79
- end
@@ -1,232 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'set'
4
-
5
- module RuboCop
6
- module Cop
7
- module Sevencop
8
- # Avoid using MySQL reserved words as identifiers.
9
- #
10
- # @example
11
- # # bad
12
- # # NOTE: `role` is a reserved word in MySQL.
13
- # add_column :users, :role, :string
14
- #
15
- # # good
16
- # add_column :users, :some_other_good_name, :string
17
- class RailsMigrationReservedWordMysql < RuboCop::Cop::Base
18
- include ::Sevencop::CopConcerns::ColumnTypeMethod
19
-
20
- MSG = 'Avoid using MySQL reserved words as identifiers.'
21
-
22
- # Obtained from https://dev.mysql.com/doc/refman/8.0/en/keywords.html.
23
- PATH_TO_RESERVED_WORDS_FILE = File.expand_path(
24
- '../../../../data/reserved_words_mysql.txt',
25
- __dir__
26
- ).freeze
27
-
28
- RESTRICT_ON_SEND = [
29
- :add_column,
30
- :add_index,
31
- :add_reference,
32
- :create_join_table,
33
- :create_table,
34
- :rename,
35
- :rename_column,
36
- :rename_index,
37
- :rename_table,
38
- *COLUMN_TYPE_METHOD_NAMES
39
- ].freeze
40
-
41
- class << self
42
- # @return [Array<String>]
43
- def reserved_words
44
- @reserved_words ||= ::Set.new(
45
- ::File.read(PATH_TO_RESERVED_WORDS_FILE).split("\n")
46
- ).freeze
47
- end
48
- end
49
-
50
- # @param node [RuboCop::AST::DefNode]
51
- # @return [void]
52
- def on_send(node)
53
- offended_identifier_nodes_from(node).each do |identifier_node|
54
- add_offense(identifier_node)
55
- end
56
- end
57
-
58
- private
59
-
60
- # @!method index_name_option_from_add_index(node)
61
- # @param node [RuboCop::AST::SendNode]
62
- # @return [RuboCop::AST::Node, nil]
63
- def_node_matcher :index_name_option_from_add_index, <<~PATTERN
64
- (send
65
- nil?
66
- :add_index
67
- _
68
- _
69
- (hash
70
- <
71
- (pair
72
- (sym :name)
73
- $_
74
- )
75
- >
76
- ...
77
- )
78
- )
79
- PATTERN
80
-
81
- # @!method index_name_option_from_add_reference(node)
82
- # @param node [RuboCop::AST::SendNode]
83
- # @return [RuboCop::AST::Node, nil]
84
- def_node_matcher :index_name_option_from_add_reference, <<~PATTERN
85
- (send
86
- nil?
87
- :add_reference
88
- _
89
- _
90
- (hash
91
- <
92
- (pair
93
- (sym :index)
94
- (hash
95
- <
96
- (pair
97
- (sym :name)
98
- $_
99
- )
100
- >
101
- ...
102
- )
103
- )
104
- >
105
- ...
106
- )
107
- )
108
- PATTERN
109
-
110
- # @!method index_name_option_from_column_type(node)
111
- # @param node [RuboCop::AST::SendNode]
112
- # @return [RuboCop::AST::Node, nil]
113
- def_node_matcher :index_name_option_from_column_type, <<~PATTERN
114
- (send
115
- lvar
116
- COLUMN_TYPE_METHOD_NAMES
117
- _
118
- (hash
119
- <
120
- (pair
121
- (sym :index)
122
- (hash
123
- <
124
- (pair
125
- (sym :name)
126
- $_
127
- )
128
- ...
129
- >
130
- )
131
- )
132
- ...
133
- >
134
- )
135
- )
136
- PATTERN
137
-
138
- # @!method table_name_option_from(node)
139
- # @param node [RuboCop::AST::SendNode]
140
- # @return [RuboCop::AST::Node, nil]
141
- def_node_matcher :table_name_option_from, <<~PATTERN
142
- (send
143
- nil?
144
- :create_join_table
145
- _
146
- _
147
- (hash
148
- <
149
- (pair
150
- (sym :table_name)
151
- $_
152
- )
153
- ...
154
- >
155
- )
156
- )
157
- PATTERN
158
-
159
- # @param node [RuboCop::AST::SendNode]
160
- # @return [Array<RuboCop::AST::Node>]
161
- def identifier_column_name_nodes_from(node)
162
- case node.method_name
163
- when :add_column, :rename
164
- [node.arguments[1]]
165
- when :rename_column
166
- [node.arguments[2]]
167
- when *COLUMN_TYPE_METHOD_NAMES
168
- [node.arguments[0]]
169
- else
170
- []
171
- end
172
- end
173
-
174
- # @param node [RuboCop::AST::SendNode]
175
- # @return [Array<RuboCop::AST::Node>]
176
- def identifier_index_name_nodes_from(node)
177
- case node.method_name
178
- when :add_index
179
- [index_name_option_from_add_index(node)].compact
180
- when :add_reference
181
- [index_name_option_from_add_reference(node)].compact
182
- when :rename_index
183
- [node.arguments[2]]
184
- when *COLUMN_TYPE_METHOD_NAMES
185
- [index_name_option_from_column_type(node)].compact
186
- else
187
- []
188
- end
189
- end
190
-
191
- # @param node [RuboCop::AST::SendNode]
192
- # @return [Array<RuboCop::AST::Node>]
193
- def identifier_nodes_from(node)
194
- identifier_table_name_nodes_from(node) +
195
- identifier_column_name_nodes_from(node) +
196
- identifier_index_name_nodes_from(node)
197
- end
198
-
199
- # @param node [RuboCop::AST::SendNode]
200
- # @return [Array<RuboCop::AST::Node>]
201
- def identifier_table_name_nodes_from(node)
202
- case node.method_name
203
- when :create_join_table
204
- [table_name_option_from(node)].compact
205
- when :create_table
206
- [node.arguments[0]]
207
- when :rename_table
208
- [node.arguments[1]]
209
- else
210
- []
211
- end
212
- end
213
-
214
- # @param node [RuboCop::AST::Node]
215
- # @return [Array<RuboCop::AST::Node>]
216
- def offended_identifier_nodes_from(node)
217
- identifier_nodes_from(node).select do |identifier_node|
218
- reserved_word_identifier_node?(identifier_node)
219
- end
220
- end
221
-
222
- # @param node [RuboCop::AST::Node]
223
- # @return [Boolean]
224
- def reserved_word_identifier_node?(node)
225
- return false unless node.respond_to?(:value)
226
-
227
- self.class.reserved_words.include?(node.value.to_s)
228
- end
229
- end
230
- end
231
- end
232
- end
@@ -1,92 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module Sevencop
6
- # Keep unique index columns count less than a specified number.
7
- #
8
- # Adding a non-unique index with more than three columns rarely improves performance.
9
- # Instead, start an index with columns that narrow down the results the most.
10
- #
11
- # @example
12
- # # bad
13
- # add_index :users, %i[a b c d]
14
- #
15
- # # good (`MaxColumnsCount: 3` by default)
16
- # add_index :users, %i[a b c]
17
- class RailsMigrationUniqueIndexColumnsCount < RuboCop::Cop::Base
18
- RESTRICT_ON_SEND = %i[
19
- add_index
20
- index
21
- ].freeze
22
-
23
- # @param node [RuboCop::AST::SendNode]
24
- # @return [void]
25
- def on_send(node)
26
- column_names_node = column_names_node_from(node)
27
- return unless column_names_node
28
-
29
- column_names_count = columns_count_from(column_names_node)
30
- return if column_names_count <= max_columns_count
31
-
32
- add_offense(
33
- column_names_node,
34
- message: "Keep unique index columns count less than #{max_columns_count}."
35
- )
36
- end
37
-
38
- private
39
-
40
- # @!method column_names_node_from_add_index(node)
41
- # @param node [RuboCop::AST::SendNode]
42
- # @return [RuboCop::AST::Node, nil]
43
- def_node_matcher :column_names_node_from_add_index, <<~PATTERN
44
- (send
45
- nil?
46
- _
47
- _
48
- $({array | sym} ...)
49
- )
50
- PATTERN
51
-
52
- # @!method column_names_node_from_index(node)
53
- # @param node [RuboCop::AST::SendNode]
54
- # @return [RuboCop::AST::Node, nil]
55
- def_node_matcher :column_names_node_from_index, <<~PATTERN
56
- (send
57
- (lvar ...)
58
- _
59
- $({array | sym} ...)
60
- )
61
- PATTERN
62
-
63
- # @param node [RuboCop::AST::SendNode]
64
- # @return [RuboCop::AST::Node, nil]
65
- def column_names_node_from(node)
66
- case node.method_name
67
- when :add_index
68
- column_names_node_from_add_index(node)
69
- when :index
70
- column_names_node_from_index(node)
71
- end
72
- end
73
-
74
- # @param node [RuboCop::AST::Node]
75
- # @return [Integer, nil]
76
- def columns_count_from(node)
77
- case node.type
78
- when :array
79
- node.values.count
80
- when :sym
81
- 1
82
- end
83
- end
84
-
85
- # @return [Integer]
86
- def max_columns_count
87
- cop_config['MaxColumnsCount']
88
- end
89
- end
90
- end
91
- end
92
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Sevencop
4
- module CopConcerns
5
- module BatchProcessing
6
- BATCH_PROCESSING_METHOD_NAMES = ::Set.new(
7
- %i[
8
- delete_all
9
- update_all
10
- ]
11
- ).freeze
12
-
13
- class << self
14
- def included(klass)
15
- super
16
- klass.class_eval do
17
- # @!method batch_processing?(node)
18
- # @param node [RuboCop::AST::SendNode]
19
- # @return [Boolean]
20
- def_node_matcher :batch_processing?, <<~PATTERN
21
- (send
22
- !nil?
23
- BATCH_PROCESSING_METHOD_NAMES
24
- ...
25
- )
26
- PATTERN
27
- end
28
- end
29
- end
30
- end
31
- end
32
- end
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Sevencop
4
- module CopConcerns
5
- module ColumnTypeMethod
6
- COLUMN_TYPE_METHOD_NAMES = ::Set.new(
7
- %i[
8
- bigint
9
- binary
10
- blob
11
- boolean
12
- date
13
- datetime
14
- decimal
15
- float
16
- integer
17
- numeric
18
- primary_key
19
- string
20
- text
21
- time
22
- ]
23
- ).freeze
24
- end
25
- end
26
- end
@@ -1,49 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Sevencop
4
- module CopConcerns
5
- module DisableDdlTransaction
6
- class << self
7
- def included(klass)
8
- super
9
- klass.class_eval do
10
- # @!method disable_ddl_transaction?(node)
11
- # @param node [RuboCop::AST::SendNode]
12
- # @return [Boolean]
13
- def_node_matcher :disable_ddl_transaction?, <<~PATTERN
14
- (send
15
- nil?
16
- :disable_ddl_transaction!
17
- ...
18
- )
19
- PATTERN
20
- end
21
- end
22
- end
23
-
24
- private
25
-
26
- # @param corrector [RuboCop::Cop::Corrector]
27
- # @param node [RuboCop::AST::SendNode]
28
- # @return [void]
29
- def insert_disable_ddl_transaction(
30
- corrector,
31
- node
32
- )
33
- corrector.insert_before(
34
- node.each_ancestor(:def).first,
35
- "disable_ddl_transaction!\n\n "
36
- )
37
- end
38
-
39
- # @param node [RuboCop::AST::SendNode]
40
- # @return [Boolean]
41
- def within_disable_ddl_transaction?(node)
42
- node.each_ancestor(:def).first&.left_siblings&.any? do |sibling|
43
- sibling.is_a?(::RuboCop::AST::SendNode) &&
44
- disable_ddl_transaction?(sibling)
45
- end
46
- end
47
- end
48
- end
49
- end