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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 02e763ff0683f1009a5b4e387eea9beb7e19eea47670c634f7d182b182856e41
4
- data.tar.gz: 66576879ea7a772d5323fcf89aadf9a91ea1e0a25ee2679553ec5c83d2e197d7
3
+ metadata.gz: 10f81655924fecdd2195281a71d19602efadfc7a9a60e7a9f005136c969aa45f
4
+ data.tar.gz: d5e0bab2b887cec6b46ed1ac96993cd18fe0c485f0723425288bb9c80c57f396
5
5
  SHA512:
6
- metadata.gz: '02790f98ebe560dec0615c66faabf2c67ec9f062ef8db564026b76ee72dbbfb695bbe63946d418f5b8b2872275e684acf3f5d31a74bae35c54f0d30d5d31950d'
7
- data.tar.gz: 2a363c24244f2c6b6b451bac58ccd9a65c6c0f4e5ab6d07160720ae28a707c85a2f3e273f38116b90cb3b2bf9f3a1d089f9f58cb422cfa89be002d720543c1e1
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
@@ -2,6 +2,6 @@
2
2
 
3
3
  module RuboCop
4
4
  module Petal
5
- VERSION = '1.9.0'
5
+ VERSION = '1.10.0'
6
6
  end
7
7
  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.9.0
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: 2025-09-24 00:00:00.000000000 Z
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.4.22
195
- signing_key:
192
+ rubygems_version: 3.6.9
196
193
  specification_version: 4
197
194
  summary: Petal custom cops
198
195
  test_files: []