rubocop-petal 1.9.0 → 1.10.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/config/default.yml +6 -0
- data/lib/rubocop/cop/migration/alter_after_create_table.rb +145 -0
- data/lib/rubocop/petal/version.rb +1 -1
- metadata +4 -7
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 10f81655924fecdd2195281a71d19602efadfc7a9a60e7a9f005136c969aa45f
|
|
4
|
+
data.tar.gz: d5e0bab2b887cec6b46ed1ac96993cd18fe0c485f0723425288bb9c80c57f396
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 0f54b691eb3fa5512d745e425494ce785dec5f74deccc101c85e7214eb2b4d227619f987347e2ab29a7dc5d0d509b52bfdaa6e44cdf297d440b76a21a91dd4dd
|
|
7
|
+
data.tar.gz: 210f323604d3ceae5db556afd7aa7f689b4c830d2886d7994030586c0726f5e6f7b7e05314dc49f0d39ec887142b857dd0ce9cbe22712dc3fc8a855ae35ac084
|
data/config/default.yml
CHANGED
|
@@ -15,6 +15,12 @@ Grape/PreferNamespace:
|
|
|
15
15
|
Include:
|
|
16
16
|
- app/api/**/*
|
|
17
17
|
|
|
18
|
+
Migration/AlterAfterCreateTable:
|
|
19
|
+
Description: 'Prefer defining new table changes inside the create_table block.'
|
|
20
|
+
Enabled: true
|
|
21
|
+
Include:
|
|
22
|
+
- db/migrate/**
|
|
23
|
+
|
|
18
24
|
Migration/AlwaysBulkChangeTable:
|
|
19
25
|
Description: 'Suggest to always use `bulk: true` when using `change_table`.'
|
|
20
26
|
Enabled: true
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Migration
|
|
6
|
+
# Prefer defining table changes inside the create_table block instead of
|
|
7
|
+
# altering the table immediately after creating it.
|
|
8
|
+
#
|
|
9
|
+
# @example
|
|
10
|
+
# # bad
|
|
11
|
+
# create_table :users do |t|
|
|
12
|
+
# t.string :email
|
|
13
|
+
# end
|
|
14
|
+
#
|
|
15
|
+
# add_index :users, :email, unique: true
|
|
16
|
+
#
|
|
17
|
+
# # good
|
|
18
|
+
# create_table :users do |t|
|
|
19
|
+
# t.string :email
|
|
20
|
+
# t.index :email, unique: true
|
|
21
|
+
# end
|
|
22
|
+
class AlterAfterCreateTable < Base
|
|
23
|
+
extend AutoCorrector
|
|
24
|
+
include RangeHelp
|
|
25
|
+
|
|
26
|
+
MSG = 'Prefer defining new table changes inside the create_table block.'
|
|
27
|
+
|
|
28
|
+
ALTER_METHODS = (
|
|
29
|
+
Rails::BulkChangeTable::COMBINABLE_ALTER_METHODS +
|
|
30
|
+
Rails::BulkChangeTable::MYSQL_COMBINABLE_ALTER_METHODS +
|
|
31
|
+
Rails::BulkChangeTable::POSTGRESQL_COMBINABLE_ALTER_METHODS +
|
|
32
|
+
Rails::BulkChangeTable::POSTGRESQL_COMBINABLE_ALTER_METHODS_SINCE_6_1
|
|
33
|
+
).uniq.freeze
|
|
34
|
+
|
|
35
|
+
RESTRICT_ON_SEND = ALTER_METHODS.freeze
|
|
36
|
+
|
|
37
|
+
def on_block(node)
|
|
38
|
+
return unless node.send_node&.command?(:create_table)
|
|
39
|
+
return unless (alter_node = alter_node_after_create_table(node))
|
|
40
|
+
return unless same_table?(node.send_node, alter_node)
|
|
41
|
+
|
|
42
|
+
add_alter_offense(node, alter_node)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
|
|
47
|
+
def alter_node_after_create_table(create_table_node)
|
|
48
|
+
siblings = sibling_nodes(create_table_node)
|
|
49
|
+
index = siblings.index(create_table_node)
|
|
50
|
+
return unless index
|
|
51
|
+
|
|
52
|
+
alter_node = siblings[index + 1]
|
|
53
|
+
return unless alter_node&.send_type?
|
|
54
|
+
return unless ALTER_METHODS.include?(alter_node.method_name)
|
|
55
|
+
return unless alter_node.receiver.nil?
|
|
56
|
+
|
|
57
|
+
alter_node
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def sibling_nodes(node)
|
|
61
|
+
parent = node.parent
|
|
62
|
+
return parent.children if parent&.begin_type?
|
|
63
|
+
|
|
64
|
+
[]
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def same_table?(create_table_node, alter_node)
|
|
68
|
+
create_table_argument = create_table_node.first_argument
|
|
69
|
+
alter_table_argument = alter_node.first_argument
|
|
70
|
+
return false unless create_table_argument && alter_table_argument
|
|
71
|
+
|
|
72
|
+
if create_table_argument.is_a?(RuboCop::AST::BasicLiteralNode) &&
|
|
73
|
+
alter_table_argument.is_a?(RuboCop::AST::BasicLiteralNode)
|
|
74
|
+
literal_value(create_table_argument) == literal_value(alter_table_argument)
|
|
75
|
+
else
|
|
76
|
+
create_table_argument.source == alter_table_argument.source
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def literal_value(node)
|
|
81
|
+
return unless node.is_a?(RuboCop::AST::BasicLiteralNode)
|
|
82
|
+
|
|
83
|
+
node.value.to_s
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def add_alter_offense(create_table_node, alter_node)
|
|
87
|
+
replacement = replacement_for(create_table_node, alter_node)
|
|
88
|
+
|
|
89
|
+
add_offense(alter_node.loc.selector) do |corrector|
|
|
90
|
+
next unless replacement
|
|
91
|
+
|
|
92
|
+
end_line_range = processed_source.buffer.line_range(create_table_node.loc.end.line)
|
|
93
|
+
corrector.insert_before(end_line_range, "#{replacement}\n")
|
|
94
|
+
corrector.remove(range_by_whole_lines(alter_node.source_range, include_final_newline: true))
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def replacement_for(create_table_node, alter_node)
|
|
99
|
+
block_variable = create_table_node.arguments.first&.source
|
|
100
|
+
return unless block_variable
|
|
101
|
+
|
|
102
|
+
case alter_node.method_name
|
|
103
|
+
when :add_index
|
|
104
|
+
replacement_for_add_index(block_variable, alter_node)
|
|
105
|
+
when :add_column
|
|
106
|
+
replacement_for_add_column(block_variable, alter_node)
|
|
107
|
+
when :add_timestamps
|
|
108
|
+
replacement_for_add_timestamps(block_variable, alter_node)
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def replacement_for_add_index(block_variable, node)
|
|
113
|
+
"#{indentation(node)}#{block_variable}.index #{arguments_after_table(node)}"
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def replacement_for_add_column(block_variable, node)
|
|
117
|
+
column_node, type_node = node.arguments[1, 2]
|
|
118
|
+
return unless column_node && type_node
|
|
119
|
+
return unless type_node.sym_type?
|
|
120
|
+
|
|
121
|
+
extra_arguments = node.arguments[3..].map(&:source)
|
|
122
|
+
arguments = [column_node.source, *extra_arguments].join(', ')
|
|
123
|
+
|
|
124
|
+
"#{indentation(node)}#{block_variable}.#{type_node.value} #{arguments}"
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def replacement_for_add_timestamps(block_variable, node)
|
|
128
|
+
arguments = arguments_after_table(node)
|
|
129
|
+
method_call = "#{block_variable}.timestamps"
|
|
130
|
+
method_call = "#{method_call} #{arguments}" unless arguments.empty?
|
|
131
|
+
|
|
132
|
+
"#{indentation(node)}#{method_call}"
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def arguments_after_table(node)
|
|
136
|
+
node.arguments[1..].map(&:source).join(', ')
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def indentation(alter_node)
|
|
140
|
+
' ' * (alter_node.loc.column + 2)
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rubocop-petal
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.10.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Jean-Francis Bastien
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: bin
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
13
|
name: lint_roller
|
|
@@ -108,7 +107,6 @@ dependencies:
|
|
|
108
107
|
- - "~>"
|
|
109
108
|
- !ruby/object:Gem::Version
|
|
110
109
|
version: '2.31'
|
|
111
|
-
description:
|
|
112
110
|
email:
|
|
113
111
|
- jfbastien@petalmd.com
|
|
114
112
|
executables: []
|
|
@@ -128,6 +126,7 @@ files:
|
|
|
128
126
|
- lib/rubocop/cop/grape/helpers_include_module.rb
|
|
129
127
|
- lib/rubocop/cop/grape/prefer_namespace.rb
|
|
130
128
|
- lib/rubocop/cop/grape/unnecessary_namespace.rb
|
|
129
|
+
- lib/rubocop/cop/migration/alter_after_create_table.rb
|
|
131
130
|
- lib/rubocop/cop/migration/always_bulk_change_table.rb
|
|
132
131
|
- lib/rubocop/cop/migration/change_table_references.rb
|
|
133
132
|
- lib/rubocop/cop/migration/foreign_key_option.rb
|
|
@@ -176,7 +175,6 @@ metadata:
|
|
|
176
175
|
bug_tracker_uri: https://github.com/petalmd/rubocop-petal/issues
|
|
177
176
|
rubygems_mfa_required: 'true'
|
|
178
177
|
default_lint_roller_plugin: RuboCop::Petal::Plugin
|
|
179
|
-
post_install_message:
|
|
180
178
|
rdoc_options: []
|
|
181
179
|
require_paths:
|
|
182
180
|
- lib
|
|
@@ -191,8 +189,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
191
189
|
- !ruby/object:Gem::Version
|
|
192
190
|
version: '0'
|
|
193
191
|
requirements: []
|
|
194
|
-
rubygems_version: 3.
|
|
195
|
-
signing_key:
|
|
192
|
+
rubygems_version: 3.6.9
|
|
196
193
|
specification_version: 4
|
|
197
194
|
summary: Petal custom cops
|
|
198
195
|
test_files: []
|