rubocop-migration 0.2.0 → 0.3.2
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 +5 -5
- data/.rubocop.yml +58 -0
- data/CHANGELOG.md +5 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/Gemfile +11 -1
- data/Gemfile.lock +89 -0
- data/LICENSE.txt +21 -0
- data/README.md +43 -18
- data/Rakefile +9 -3
- data/config/default.yml +151 -0
- data/data/reserved_words_mysql.txt +750 -0
- data/lib/rubocop/cop/migration/add_check_constraint.rb +111 -0
- data/lib/rubocop/cop/migration/add_column_with_default_value.rb +229 -0
- data/lib/rubocop/cop/migration/add_foreign_key.rb +166 -0
- data/lib/rubocop/cop/migration/add_index_columns_count.rb +114 -0
- data/lib/rubocop/cop/migration/add_index_concurrently.rb +164 -0
- data/lib/rubocop/cop/migration/add_index_duplicate.rb +183 -0
- data/lib/rubocop/cop/migration/batch_in_batches.rb +95 -0
- data/lib/rubocop/cop/migration/batch_in_transaction.rb +83 -0
- data/lib/rubocop/cop/migration/batch_with_throttling.rb +108 -0
- data/lib/rubocop/cop/migration/change_column.rb +113 -0
- data/lib/rubocop/cop/migration/change_column_null.rb +128 -0
- data/lib/rubocop/cop/migration/create_table_force.rb +89 -0
- data/lib/rubocop/cop/migration/jsonb.rb +131 -0
- data/lib/rubocop/cop/migration/remove_column.rb +246 -0
- data/lib/rubocop/cop/migration/rename_column.rb +81 -0
- data/lib/rubocop/cop/migration/rename_table.rb +79 -0
- data/lib/rubocop/cop/migration/reserved_word_mysql.rb +232 -0
- data/lib/rubocop/migration/config_loader.rb +51 -0
- data/lib/rubocop/migration/cop_concerns/batch_processing.rb +34 -0
- data/lib/rubocop/migration/cop_concerns/column_type_method.rb +28 -0
- data/lib/rubocop/migration/cop_concerns/disable_ddl_transaction.rb +51 -0
- data/lib/rubocop/migration/cop_concerns.rb +11 -0
- data/lib/rubocop/migration/rubocop_extension.rb +15 -0
- data/lib/rubocop/migration/version.rb +4 -2
- data/lib/rubocop/migration.rb +23 -0
- data/rubocop-migration.gemspec +25 -31
- metadata +50 -137
- data/.gitignore +0 -15
- data/bin/console +0 -14
- data/bin/setup +0 -8
- data/circle.yml +0 -6
- data/lib/rubocop/cop/migration/unsafe_migration.rb +0 -69
- data/lib/rubocop/migration/strong_migrations_checker.rb +0 -47
- data/lib/rubocop-migration.rb +0 -16
- data/vendor/.gitkeep +0 -0
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubocop-migration
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Ryo Nakamura
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-10-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -16,179 +16,93 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '4'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: activerecord
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '4'
|
19
|
+
version: '0'
|
34
20
|
type: :runtime
|
35
21
|
prerelease: false
|
36
22
|
version_requirements: !ruby/object:Gem::Requirement
|
37
23
|
requirements:
|
38
24
|
- - ">="
|
39
25
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: strong_migrations
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0.1'
|
48
|
-
type: :runtime
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0.1'
|
26
|
+
version: '0'
|
55
27
|
- !ruby/object:Gem::Dependency
|
56
28
|
name: rubocop
|
57
29
|
requirement: !ruby/object:Gem::Requirement
|
58
30
|
requirements:
|
59
31
|
- - ">="
|
60
32
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
33
|
+
version: '1.34'
|
62
34
|
type: :runtime
|
63
35
|
prerelease: false
|
64
36
|
version_requirements: !ruby/object:Gem::Requirement
|
65
37
|
requirements:
|
66
38
|
- - ">="
|
67
39
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: bundler
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '1.14'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '1.14'
|
40
|
+
version: '1.34'
|
83
41
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - "~>"
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '10.0'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - "~>"
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '10.0'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: rspec
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - "~>"
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '3.0'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - "~>"
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '3.0'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: rspec-its
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - ">="
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '0'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - ">="
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '0'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: rspec-collection_matchers
|
42
|
+
name: rubocop-rails
|
127
43
|
requirement: !ruby/object:Gem::Requirement
|
128
44
|
requirements:
|
129
45
|
- - ">="
|
130
46
|
- !ruby/object:Gem::Version
|
131
47
|
version: '0'
|
132
|
-
type: :
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - ">="
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: '0'
|
139
|
-
- !ruby/object:Gem::Dependency
|
140
|
-
name: rspec_junit_formatter
|
141
|
-
requirement: !ruby/object:Gem::Requirement
|
142
|
-
requirements:
|
143
|
-
- - "~>"
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
version: '0.2'
|
146
|
-
type: :development
|
147
|
-
prerelease: false
|
148
|
-
version_requirements: !ruby/object:Gem::Requirement
|
149
|
-
requirements:
|
150
|
-
- - "~>"
|
151
|
-
- !ruby/object:Gem::Version
|
152
|
-
version: '0.2'
|
153
|
-
- !ruby/object:Gem::Dependency
|
154
|
-
name: pry
|
155
|
-
requirement: !ruby/object:Gem::Requirement
|
156
|
-
requirements:
|
157
|
-
- - ">="
|
158
|
-
- !ruby/object:Gem::Version
|
159
|
-
version: '0'
|
160
|
-
type: :development
|
48
|
+
type: :runtime
|
161
49
|
prerelease: false
|
162
50
|
version_requirements: !ruby/object:Gem::Requirement
|
163
51
|
requirements:
|
164
52
|
- - ">="
|
165
53
|
- !ruby/object:Gem::Version
|
166
54
|
version: '0'
|
167
|
-
description:
|
55
|
+
description:
|
168
56
|
email:
|
169
|
-
-
|
57
|
+
- r7kamura@gmail.com
|
170
58
|
executables: []
|
171
59
|
extensions: []
|
172
60
|
extra_rdoc_files: []
|
173
61
|
files:
|
174
|
-
- ".gitignore"
|
175
62
|
- ".rspec"
|
63
|
+
- ".rubocop.yml"
|
64
|
+
- CHANGELOG.md
|
65
|
+
- CODE_OF_CONDUCT.md
|
176
66
|
- Gemfile
|
67
|
+
- Gemfile.lock
|
68
|
+
- LICENSE.txt
|
177
69
|
- README.md
|
178
70
|
- Rakefile
|
179
|
-
-
|
180
|
-
-
|
181
|
-
-
|
182
|
-
- lib/rubocop
|
183
|
-
- lib/rubocop/cop/migration/
|
184
|
-
- lib/rubocop/migration/
|
71
|
+
- config/default.yml
|
72
|
+
- data/reserved_words_mysql.txt
|
73
|
+
- lib/rubocop/cop/migration/add_check_constraint.rb
|
74
|
+
- lib/rubocop/cop/migration/add_column_with_default_value.rb
|
75
|
+
- lib/rubocop/cop/migration/add_foreign_key.rb
|
76
|
+
- lib/rubocop/cop/migration/add_index_columns_count.rb
|
77
|
+
- lib/rubocop/cop/migration/add_index_concurrently.rb
|
78
|
+
- lib/rubocop/cop/migration/add_index_duplicate.rb
|
79
|
+
- lib/rubocop/cop/migration/batch_in_batches.rb
|
80
|
+
- lib/rubocop/cop/migration/batch_in_transaction.rb
|
81
|
+
- lib/rubocop/cop/migration/batch_with_throttling.rb
|
82
|
+
- lib/rubocop/cop/migration/change_column.rb
|
83
|
+
- lib/rubocop/cop/migration/change_column_null.rb
|
84
|
+
- lib/rubocop/cop/migration/create_table_force.rb
|
85
|
+
- lib/rubocop/cop/migration/jsonb.rb
|
86
|
+
- lib/rubocop/cop/migration/remove_column.rb
|
87
|
+
- lib/rubocop/cop/migration/rename_column.rb
|
88
|
+
- lib/rubocop/cop/migration/rename_table.rb
|
89
|
+
- lib/rubocop/cop/migration/reserved_word_mysql.rb
|
90
|
+
- lib/rubocop/migration.rb
|
91
|
+
- lib/rubocop/migration/config_loader.rb
|
92
|
+
- lib/rubocop/migration/cop_concerns.rb
|
93
|
+
- lib/rubocop/migration/cop_concerns/batch_processing.rb
|
94
|
+
- lib/rubocop/migration/cop_concerns/column_type_method.rb
|
95
|
+
- lib/rubocop/migration/cop_concerns/disable_ddl_transaction.rb
|
96
|
+
- lib/rubocop/migration/rubocop_extension.rb
|
185
97
|
- lib/rubocop/migration/version.rb
|
186
98
|
- rubocop-migration.gemspec
|
187
|
-
-
|
188
|
-
homepage: https://github.com/wealthsimple/rubocop-migration
|
99
|
+
homepage: https://github.com/r7kamura/rubocop-migration
|
189
100
|
licenses:
|
190
101
|
- MIT
|
191
|
-
metadata:
|
102
|
+
metadata:
|
103
|
+
homepage_uri: https://github.com/r7kamura/rubocop-migration
|
104
|
+
source_code_uri: https://github.com/r7kamura/rubocop-migration
|
105
|
+
changelog_uri: https://github.com/r7kamura/rubocop-migration/releases
|
192
106
|
post_install_message:
|
193
107
|
rdoc_options: []
|
194
108
|
require_paths:
|
@@ -197,16 +111,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
197
111
|
requirements:
|
198
112
|
- - ">="
|
199
113
|
- !ruby/object:Gem::Version
|
200
|
-
version: 2.
|
114
|
+
version: '2.7'
|
201
115
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
202
116
|
requirements:
|
203
117
|
- - ">="
|
204
118
|
- !ruby/object:Gem::Version
|
205
119
|
version: '0'
|
206
120
|
requirements: []
|
207
|
-
|
208
|
-
rubygems_version: 2.5.1
|
121
|
+
rubygems_version: 3.3.7
|
209
122
|
signing_key:
|
210
123
|
specification_version: 4
|
211
|
-
summary: RuboCop extension
|
124
|
+
summary: RuboCop extension focused on ActiveRecord migration.
|
212
125
|
test_files: []
|
data/.gitignore
DELETED
data/bin/console
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require "bundler/setup"
|
4
|
-
require "rubocop-migration"
|
5
|
-
|
6
|
-
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
-
# with your gem easier. You can also use a different console, if you like.
|
8
|
-
|
9
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require "pry"
|
11
|
-
# Pry.start
|
12
|
-
|
13
|
-
require "irb"
|
14
|
-
IRB.start(__FILE__)
|
data/bin/setup
DELETED
data/circle.yml
DELETED
@@ -1,69 +0,0 @@
|
|
1
|
-
module RuboCop
|
2
|
-
module Cop
|
3
|
-
module Migration
|
4
|
-
class UnsafeMigration < Cop
|
5
|
-
# List of all public methods that can be used within a migration method,
|
6
|
-
# like `add_index`, `rename_table`, etc.
|
7
|
-
SCHEMA_STATEMENTS = ActiveRecord::ConnectionAdapters::SchemaStatements
|
8
|
-
.public_instance_methods
|
9
|
-
.freeze
|
10
|
-
SCHEMA_STATEMENTS_PATTERN = SCHEMA_STATEMENTS.map { |s| ":#{s}" }.join(" ")
|
11
|
-
|
12
|
-
ERROR_NOTICE = "Ignore this warning by inserting `# rubocop:disable UnsafeMigration`\nabove your code and `# rubocop:enable UnsafeMigration` below code.".freeze
|
13
|
-
|
14
|
-
# Match `ActiveRecord::Migration` and `ActiveRecord::Migration[5.0]`
|
15
|
-
def_node_matcher :migration_class?, <<-PATTERN
|
16
|
-
{
|
17
|
-
(class
|
18
|
-
(const nil _)
|
19
|
-
(const
|
20
|
-
(const nil :ActiveRecord) :Migration) ...)
|
21
|
-
|
22
|
-
(class
|
23
|
-
(const nil _)
|
24
|
-
(send
|
25
|
-
(const
|
26
|
-
(const nil :ActiveRecord) :Migration) :[] _) ...)
|
27
|
-
}
|
28
|
-
PATTERN
|
29
|
-
|
30
|
-
# `down` migrations can be ignored as they should not be run in
|
31
|
-
# production environments per:
|
32
|
-
# https://github.com/ankane/strong_migrations/commit/fcfbcb4b1bef6a1ed9ec4808268ed0e684ec4389
|
33
|
-
def_node_matcher :migration_method_match, <<-PATTERN
|
34
|
-
(def {:change :up} args $...)
|
35
|
-
PATTERN
|
36
|
-
|
37
|
-
def_node_search :schema_statement_match, <<-PATTERN
|
38
|
-
$(send nil ${#{SCHEMA_STATEMENTS_PATTERN}} $...)
|
39
|
-
PATTERN
|
40
|
-
|
41
|
-
def investigate(processed_source)
|
42
|
-
ast = processed_source.ast
|
43
|
-
return if !ast || !migration_class?(ast)
|
44
|
-
ast.each_child_node do |child_node|
|
45
|
-
migration_methods = migration_method_match(child_node)
|
46
|
-
migration_methods&.each { |method_node| investigate_migration_method(method_node) }
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
private
|
51
|
-
|
52
|
-
def investigate_migration_method(method_node)
|
53
|
-
schema_statement_match(method_node) do |statement_node, method_name, args_nodes|
|
54
|
-
# TODO: Better/safer way to do this?
|
55
|
-
args_source = "[#{args_nodes.map(&:source).join(', ')}]"
|
56
|
-
args = eval(args_source)
|
57
|
-
|
58
|
-
checker = RuboCop::Migration::StrongMigrationsChecker.new
|
59
|
-
error = checker.check_operation(method_name, *args)
|
60
|
-
if error
|
61
|
-
error += "\n#{ERROR_NOTICE}"
|
62
|
-
add_offense(statement_node, :expression, error)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
module RuboCop
|
2
|
-
module Migration
|
3
|
-
class StrongMigrationsChecker
|
4
|
-
include StrongMigrations::Migration
|
5
|
-
|
6
|
-
# StrongMigrations raises errors for potentially unsafe code, and relies
|
7
|
-
# on the user to add a `safety_assured { }` block to supress this warning.
|
8
|
-
# These warnings are unsupported by rubocop-migration for now.
|
9
|
-
SAFETY_ASSURED_WARNINGS = [
|
10
|
-
:add_column_json,
|
11
|
-
:add_index_columns,
|
12
|
-
:change_table,
|
13
|
-
:execute,
|
14
|
-
:remove_column,
|
15
|
-
].freeze
|
16
|
-
|
17
|
-
def version_safe?
|
18
|
-
false
|
19
|
-
end
|
20
|
-
|
21
|
-
def postgresql?
|
22
|
-
true
|
23
|
-
end
|
24
|
-
|
25
|
-
def check_operation(method_name, *args)
|
26
|
-
send(method_name, *args)
|
27
|
-
rescue StrongMigrations::UnsafeMigration => e
|
28
|
-
strip_wait_message(e.message)
|
29
|
-
rescue NoMethodError
|
30
|
-
# Do nothing, this method is unrecognized by StrongMigrations unsafe
|
31
|
-
# operations and is likely safe.
|
32
|
-
end
|
33
|
-
|
34
|
-
private
|
35
|
-
|
36
|
-
def raise_error(message_key)
|
37
|
-
return if SAFETY_ASSURED_WARNINGS.include?(message_key)
|
38
|
-
super(message_key)
|
39
|
-
end
|
40
|
-
|
41
|
-
# Strip large "WAIT!" ASCII art from the StrongMigrations error message.
|
42
|
-
def strip_wait_message(error_message)
|
43
|
-
error_message.split("\n\n", 2).last
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
data/lib/rubocop-migration.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
require "active_support"
|
2
|
-
require "active_support/core_ext"
|
3
|
-
require "active_record"
|
4
|
-
# Only load a portion of strong_migrations
|
5
|
-
require "strong_migrations/migration"
|
6
|
-
require "strong_migrations/unsafe_migration"
|
7
|
-
require "rubocop"
|
8
|
-
|
9
|
-
require "rubocop/migration/version"
|
10
|
-
require "rubocop/migration/strong_migrations_checker"
|
11
|
-
require "rubocop/cop/migration/unsafe_migration"
|
12
|
-
|
13
|
-
module RuboCop
|
14
|
-
module Migration
|
15
|
-
end
|
16
|
-
end
|
data/vendor/.gitkeep
DELETED
File without changes
|