sevencop 0.22.0 → 0.23.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.
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