activerecord-pg-format-db-structure 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fdde773cae9c0a23f2fe42d4a1016f3498d37a616dece4e3477fc8e839869243
4
- data.tar.gz: 9d55b019c0938e3c4c6ba1f008adb542b9a156c1ab73bd50b4157a65c6bbf128
3
+ metadata.gz: 0f52ec941c9e147d32ce581a4e5384263455ca48295539f0d3a2b518cc7e4e51
4
+ data.tar.gz: 1ab211061fe2fca72d364dc8b92636e01c294ad4efddbd684a1a2b1b072d02a8
5
5
  SHA512:
6
- metadata.gz: 6ef698a4873b63ba33863576481eaa858d8363c3acbc37011b0f3c023f120a5783e572995ad3a27a1c57faaef35ba86d6eefd57207313cad0eefb1b21f33253c
7
- data.tar.gz: 142c1205e34fc069cc4a26f0957f9ca76ba142e6012914e7af06d0f47ef84700648c25339757da936b74cfe898e8f4d3b577ecff85bbcfa35cf57f39685fb2fb
6
+ metadata.gz: 87322b447a211cce08c5beebf137ca7a5da4947f0a01f37192978ea6a873d6f990201450ae3764501cccaa04667089b595bce39829d544e417ee7a9426d8ca5d
7
+ data.tar.gz: 27ebd693ed145add5112b35805c94e06b4f6f32e03419ffc92c62187116e3ec93d02694b0c67abf153e5a8582643989c2831e74b00f002b5758ba3fc7f6f7c5f
data/.rubocop.yml CHANGED
@@ -24,6 +24,12 @@ Metrics/MethodLength:
24
24
  Metrics/AbcSize:
25
25
  Enabled: false
26
26
 
27
+ Metrics/ClassLength:
28
+ Enabled: false
29
+
30
+ Metrics/CyclomaticComplexity:
31
+ Enabled: false
32
+
27
33
  RSpec/SpecFilePathFormat:
28
34
  Enabled: false
29
35
 
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.1.1] - 2025-01-29
4
+
5
+ - Proper deparsing of all statements
6
+ - Formatting of select and insert sub-statements using `anbt-sql-formatter`
7
+
3
8
  ## [0.1.0] - 2025-01-24
4
9
 
5
10
  - Initial release
data/README.md CHANGED
@@ -182,9 +182,9 @@ INSERT INTO "schema_migrations" (version) VALUES
182
182
  into this much more compact and normalized version:
183
183
 
184
184
  ```sql
185
- -- Name: pgcrypto; Type: EXTENSION
186
185
 
187
- CREATE EXTENSION IF NOT EXISTS pgcrypto WITH SCHEMA public;
186
+
187
+ CREATE EXTENSION IF NOT EXISTS pgcrypto SCHEMA public;
188
188
 
189
189
 
190
190
  -- Name: comments; Type: TABLE;
@@ -219,8 +219,10 @@ ALTER TABLE ONLY public.comments
219
219
  ADD CONSTRAINT fk_rails_0000000001 FOREIGN KEY (post_id) REFERENCES public.posts (id),
220
220
  ADD CONSTRAINT fk_rails_0000000002 FOREIGN KEY (user_id) REFERENCES public.users (id);
221
221
 
222
- INSERT INTO "schema_migrations" (version) VALUES
223
- ('20250124155339');
222
+
223
+ INSERT INTO schema_migrations (version) VALUES
224
+ ('20250124155339')
225
+ ;
224
226
  ```
225
227
 
226
228
  which is a lot more compact, easier to read, and reduces the risk of
@@ -334,13 +336,9 @@ Should be run after other operations that inline alter statements.
334
336
 
335
337
  ## Deparser
336
338
 
337
- As of today, this is a bare implemenation that works with the current combination of tranformers.
338
-
339
- As of now, it will only deparse `CREATE TABLE`, `CREATE INDEX` and
340
- `ALTER TABLE` statements. Other statements will be kept unchanged from
341
- the input SQL.
339
+ Returns an SQL string from raw PgQuery statements.
342
340
 
343
- In order to support all statements, we will need to find a solution to more cleanly format SQL queries, as deparsing a `CREATE VIEW` statement will result in a single unreadable line if relying on `pg_query`.
341
+ Relying mostly on `PgQuery.deparse`, but applying some formatting using the [anbt-sql-formatter](https://github.com/sonota88/anbt-sql-formatter) gem on select & insert statements.
344
342
 
345
343
  ## Development
346
344
 
@@ -1,12 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "pg_query"
4
+ require "anbt-sql-formatter/formatter"
4
5
 
5
6
  module ActiveRecordPgFormatDbStructure
6
7
  # Returns a list of SQL strings from a list of PgQuery::RawStmt.
7
8
  class Deparser
8
9
  attr_reader :source
9
10
 
11
+ PRETTY_INDENT_STRING = " "
12
+
10
13
  def initialize(source)
11
14
  @source = source
12
15
  end
@@ -19,17 +22,29 @@ module ActiveRecordPgFormatDbStructure
19
22
  deparse_index_stmt(raw_statement.stmt.index_stmt)
20
23
  in stmt: { alter_table_stmt: _ }
21
24
  deparse_alter_table_stmt(raw_statement.stmt.alter_table_stmt)
25
+ in stmt: { select_stmt: _ }
26
+ deparse_query_statement(raw_statement.stmt.select_stmt)
27
+ in stmt: { insert_stmt: _ }
28
+ deparse_insert_statement(raw_statement.stmt.insert_stmt)
29
+ in stmt: { create_table_as_stmt: _ }
30
+ deparse_create_table_as_stmt(raw_statement.stmt.create_table_as_stmt)
31
+ in stmt: { view_stmt: _ }
32
+ deparse_view_stmt(raw_statement.stmt.view_stmt)
22
33
  else
23
- keep_original_string(raw_statement)
34
+ "\n#{deparse_stmt(raw_statement.stmt.inner)}"
24
35
  end
25
36
  end
26
37
 
27
38
  private
28
39
 
29
- def keep_original_string(raw_statement)
30
- start = raw_statement.stmt_location || 0
31
- stop = start + raw_statement.stmt_len
32
- source[start..stop]
40
+ def deparse_stmt(stmt)
41
+ "\n#{PgQuery.deparse_stmt(stmt)};"
42
+ end
43
+
44
+ def deparse_query_statement(stmt)
45
+ generic_query_str = +"\n\n"
46
+ generic_query_str << pretty_formt_sql_string(PgQuery.deparse_stmt(stmt))
47
+ generic_query_str << ";"
33
48
  end
34
49
 
35
50
  def deparse_index_stmt(index_stmt)
@@ -37,40 +52,136 @@ module ActiveRecordPgFormatDbStructure
37
52
  end
38
53
 
39
54
  def deparse_alter_table_stmt(alter_table_stmt)
40
- "\n#{
41
- deparse_stmt(alter_table_stmt)
42
- .gsub(" ADD ", "\n ADD ")
43
- .gsub(" ALTER COLUMN ", "\n ALTER COLUMN ")
44
- }"
55
+ alter_table_str = +"\n\n"
56
+ alter_table_str << PgQuery.deparse_stmt(
57
+ PgQuery::AlterTableStmt.new(
58
+ **alter_table_stmt.to_h,
59
+ cmds: []
60
+ )
61
+ ).chomp(" ")
62
+
63
+ alter_table_cmds_str = alter_table_stmt.cmds.map do |cmd|
64
+ "\n #{deparse_alter_table_cmd(cmd)}"
65
+ end.join(",")
66
+
67
+ alter_table_str << alter_table_cmds_str
68
+ alter_table_str << ";"
69
+ alter_table_str
45
70
  end
46
71
 
47
- def deparse_stmt(stmt)
48
- "\n#{PgQuery.deparse_stmt(stmt)};"
72
+ def deparse_alter_table_cmd(cmd)
73
+ PgQuery.deparse_stmt(
74
+ PgQuery::AlterTableStmt.new(
75
+ relation: { relname: "tmp" },
76
+ cmds: [cmd]
77
+ )
78
+ ).gsub(/\AALTER ONLY tmp /, "")
49
79
  end
50
80
 
51
81
  def deparse_create_stmt(create_stmt)
82
+ placeholder_column = PgQuery::Node.from(
83
+ PgQuery::ColumnDef.new(
84
+ colname: "placeholder_column",
85
+ type_name: {
86
+ names: [PgQuery::Node.from_string("placeholder_type")]
87
+ }
88
+ )
89
+ )
90
+
52
91
  table_str = "\n\n\n-- Name: #{create_stmt.relation.relname}; Type: TABLE;\n\n"
53
92
  table_str << PgQuery.deparse_stmt(
54
93
  PgQuery::CreateStmt.new(
55
94
  **create_stmt.to_h,
56
- table_elts: []
95
+ table_elts: [placeholder_column]
57
96
  )
58
97
  )
59
- table_str.gsub!(/\(\)\z/, "")
60
- table_str << "("
61
- table_str << create_stmt.table_elts.map do |elt|
98
+ table_str << ";"
99
+
100
+ table_columns = create_stmt.table_elts.map do |elt|
62
101
  "\n #{deparse_table_elt(elt)}"
63
102
  end.join(",")
64
- table_str << "\n);"
103
+ table_columns << "\n"
104
+
105
+ table_str[deparse_table_elt(placeholder_column)] = table_columns
106
+
65
107
  table_str
66
108
  end
67
109
 
68
110
  def deparse_table_elt(elt)
69
111
  PgQuery.deparse_stmt(
70
112
  PgQuery::CreateStmt.new(
71
- relation: PgQuery::RangeVar.new(relname: "tmp"), table_elts: [elt]
113
+ relation: { relname: "tmp" }, table_elts: [elt]
114
+ )
115
+ ).gsub(/\ACREATE TABLE ONLY tmp \((.*)\)\z/, '\1')
116
+ end
117
+
118
+ def deparse_create_table_as_stmt(stmt)
119
+ create_table_as_stmt_str = +"\n\n"
120
+ create_table_as_stmt_str << PgQuery.deparse_stmt(
121
+ PgQuery::CreateTableAsStmt.new(
122
+ **stmt.to_h,
123
+ query: PgQuery::Node.from(placeholder_query_stmt)
72
124
  )
73
- ).sub(/\ACREATE TABLE ONLY tmp \(/, "").sub(/\)\z/, "")
125
+ )
126
+ create_table_as_stmt_str << ";"
127
+
128
+ query_str = +"(\n"
129
+ query_str << pretty_formt_sql_string(PgQuery.deparse_stmt(stmt.query.inner)).gsub(/^/, PRETTY_INDENT_STRING)
130
+ query_str << "\n)"
131
+
132
+ create_table_as_stmt_str[placeholder_query_string] = query_str
133
+ create_table_as_stmt_str
134
+ end
135
+
136
+ def deparse_view_stmt(stmt)
137
+ view_stmt_str = +"\n\n"
138
+ view_stmt_str << PgQuery.deparse_stmt(
139
+ PgQuery::ViewStmt.new(
140
+ **stmt.to_h,
141
+ query: PgQuery::Node.from(placeholder_query_stmt)
142
+ )
143
+ )
144
+ view_stmt_str << ";"
145
+
146
+ query_str = +"(\n"
147
+ query_str << pretty_formt_sql_string(PgQuery.deparse_stmt(stmt.query.inner)).gsub(/^/, PRETTY_INDENT_STRING)
148
+ query_str << "\n)"
149
+
150
+ view_stmt_str[placeholder_query_string] = query_str
151
+ view_stmt_str
152
+ end
153
+
154
+ def deparse_insert_statement(insert_stmt)
155
+ insert_stmt_str = +"\n\n\n"
156
+ insert_stmt_str << PgQuery.deparse_stmt(
157
+ PgQuery::InsertStmt.new(
158
+ **insert_stmt.to_h,
159
+ select_stmt: PgQuery::Node.from(placeholder_query_stmt)
160
+ )
161
+ )
162
+ insert_stmt_str << "\n;"
163
+
164
+ query_str = pretty_formt_sql_string(PgQuery.deparse_stmt(insert_stmt.select_stmt.inner))
165
+ query_str.gsub!(/\AVALUES /, "VALUES\n ")
166
+
167
+ insert_stmt_str[placeholder_query_string] = query_str
168
+ insert_stmt_str
169
+ end
170
+
171
+ def pretty_formt_sql_string(sql)
172
+ rule = AnbtSql::Rule.new
173
+ rule.keyword = AnbtSql::Rule::KEYWORD_UPPER_CASE
174
+ rule.indent_string = PRETTY_INDENT_STRING
175
+ formatter = AnbtSql::Formatter.new(rule)
176
+ formatter.format(sql)
177
+ end
178
+
179
+ def placeholder_query_string
180
+ @placeholder_query_string ||= PgQuery.deparse_stmt(placeholder_query_stmt)
181
+ end
182
+
183
+ def placeholder_query_stmt
184
+ @placeholder_query_stmt ||= PgQuery.parse("SELECT placeholder").tree.stmts.first.stmt.select_stmt
74
185
  end
75
186
  end
76
187
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pg_query"
4
+
5
+ module ActiveRecordPgFormatDbStructure
6
+ module Transforms
7
+ # :nodoc:
8
+ class Base
9
+ attr_reader :raw_statements
10
+
11
+ def initialize(raw_statements)
12
+ @raw_statements = raw_statements
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,18 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "pg_query"
3
+ require_relative "base"
4
4
 
5
5
  module ActiveRecordPgFormatDbStructure
6
6
  module Transforms
7
7
  # Group alter table statements into one operation per
8
8
  # table. Should be run after other operations that inline alter statements.
9
- class GroupAlterTableStatements
10
- attr_reader :raw_statements
11
-
12
- def initialize(raw_statements)
13
- @raw_statements = raw_statements
14
- end
15
-
9
+ class GroupAlterTableStatements < Base
16
10
  def transform!
17
11
  alter_groups = extract_alter_table_statements!
18
12
 
@@ -1,27 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "pg_query"
3
+ require_relative "base"
4
4
 
5
5
  module ActiveRecordPgFormatDbStructure
6
6
  module Transforms
7
7
  # Inline non-foreign key constraints into table declaration
8
- class InlineConstraints
9
- attr_reader :raw_statements
10
-
11
- def initialize(raw_statements)
12
- @raw_statements = raw_statements
13
- @tables_with_constraint = {}
14
- end
15
-
8
+ class InlineConstraints < Base
16
9
  def transform!
17
- extract_constraints_to_inline!
10
+ tables_with_constraint = extract_constraints_to_inline!
18
11
  raw_statements.each do |raw_statement|
19
12
  next unless raw_statement.stmt.to_h in create_stmt: { relation: { schemaname:, relname: }}
20
13
 
21
14
  relation = { schemaname:, relname: }
22
- next unless @tables_with_constraint.include?(relation)
15
+ next unless tables_with_constraint.include?(relation)
23
16
 
24
- @tables_with_constraint[relation].each do |constraint|
17
+ tables_with_constraint[relation].each do |constraint|
25
18
  add_constraint!(raw_statement, constraint)
26
19
  end
27
20
  end
@@ -30,14 +23,16 @@ module ActiveRecordPgFormatDbStructure
30
23
  private
31
24
 
32
25
  def extract_constraints_to_inline!
26
+ tables_with_constraint = {}
33
27
  raw_statements.delete_if do |raw_statement|
34
28
  next unless match_alter_column_statement(raw_statement) in { table:, constraint: }
35
29
 
36
- @tables_with_constraint[table] ||= []
37
- @tables_with_constraint[table] << constraint
30
+ tables_with_constraint[table] ||= []
31
+ tables_with_constraint[table] << constraint
38
32
 
39
33
  true
40
34
  end
35
+ tables_with_constraint
41
36
  end
42
37
 
43
38
  def match_alter_column_statement(raw_statement)
@@ -68,8 +63,8 @@ module ActiveRecordPgFormatDbStructure
68
63
  end
69
64
 
70
65
  def add_constraint!(raw_statement, constraint)
71
- raw_statement.stmt.create_stmt.table_elts << PgQuery::Node.new(
72
- constraint: PgQuery::Constraint.new(constraint)
66
+ raw_statement.stmt.create_stmt.table_elts << PgQuery::Node.from(
67
+ PgQuery::Constraint.new(constraint)
73
68
  )
74
69
  end
75
70
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "pg_query"
3
+ require_relative "base"
4
4
 
5
5
  module ActiveRecordPgFormatDbStructure
6
6
  module Transforms
@@ -9,23 +9,16 @@ module ActiveRecordPgFormatDbStructure
9
9
  # Note: using this transform makes the structure file no longer
10
10
  # loadable, since tables should be created before a foreign key
11
11
  # can target it.
12
- class InlineForeignKeys
13
- attr_reader :raw_statements
14
-
15
- def initialize(raw_statements)
16
- @raw_statements = raw_statements
17
- @columns_with_foreign_key = {}
18
- end
19
-
12
+ class InlineForeignKeys < Base
20
13
  def transform!
21
- extract_foreign_keys_to_inline!
14
+ columns_with_foreign_key = extract_foreign_keys_to_inline!
22
15
  raw_statements.each do |raw_statement|
23
16
  next unless raw_statement.stmt.to_h in create_stmt: { relation: { schemaname:, relname: }}
24
17
 
25
18
  relation = { schemaname:, relname: }
26
- next unless @columns_with_foreign_key.include?(relation)
19
+ next unless columns_with_foreign_key.include?(relation)
27
20
 
28
- @columns_with_foreign_key[relation].each do |column_name, constraint|
21
+ columns_with_foreign_key[relation].each do |column_name, constraint|
29
22
  add_constraint!(raw_statement, column_name, constraint)
30
23
  end
31
24
  end
@@ -34,15 +27,17 @@ module ActiveRecordPgFormatDbStructure
34
27
  private
35
28
 
36
29
  def extract_foreign_keys_to_inline!
30
+ columns_with_foreign_key = {}
37
31
  raw_statements.delete_if do |raw_statement|
38
32
  next unless match_alter_column_statement(raw_statement) in { column:, constraint: }
39
33
 
40
34
  table = column.except(:colname)
41
- @columns_with_foreign_key[table] ||= {}
42
- @columns_with_foreign_key[table][column[:colname]] = constraint
35
+ columns_with_foreign_key[table] ||= {}
36
+ columns_with_foreign_key[table][column[:colname]] = constraint
43
37
 
44
38
  true
45
39
  end
40
+ columns_with_foreign_key
46
41
  end
47
42
 
48
43
  def match_alter_column_statement(raw_statement)
@@ -99,8 +94,8 @@ module ActiveRecordPgFormatDbStructure
99
94
  raw_statement.stmt.create_stmt.table_elts.each do |table_elt|
100
95
  next unless table_elt.to_h in { column_def: { colname: ^colname } }
101
96
 
102
- table_elt.column_def.constraints << PgQuery::Node.new(
103
- constraint: PgQuery::Constraint.new(constraint)
97
+ table_elt.column_def.constraints << PgQuery::Node.from(
98
+ PgQuery::Constraint.new(constraint)
104
99
  )
105
100
  end
106
101
  end
@@ -1,25 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "pg_query"
3
+ require_relative "base"
4
4
 
5
5
  module ActiveRecordPgFormatDbStructure
6
6
  module Transforms
7
7
  # Inlines primary keys with the table declaration
8
- class InlinePrimaryKeys
9
- attr_reader :raw_statements
10
-
11
- def initialize(raw_statements)
12
- @raw_statements = raw_statements
13
- @columns_with_primary_key = {}
14
- end
15
-
8
+ class InlinePrimaryKeys < Base
16
9
  def transform!
17
- extract_primary_keys_to_inline!
10
+ columns_with_primary_key = extract_primary_keys_to_inline!
18
11
  raw_statements.each do |raw_statement|
19
12
  next unless raw_statement.stmt.to_h in create_stmt: { relation: { schemaname:, relname: }}
20
13
 
21
14
  relation = { schemaname:, relname: }
22
- primary_key = @columns_with_primary_key[relation]
15
+ primary_key = columns_with_primary_key[relation]
23
16
  add_primary_key!(raw_statement, primary_key) if primary_key
24
17
  end
25
18
  end
@@ -27,15 +20,17 @@ module ActiveRecordPgFormatDbStructure
27
20
  private
28
21
 
29
22
  def extract_primary_keys_to_inline!
23
+ columns_with_primary_key = {}
30
24
  raw_statements.delete_if do |raw_statement|
31
25
  next unless match_alter_column_statement(raw_statement) in { schemaname:, relname:, colname: }
32
26
 
33
27
  column = { schemaname:, relname:, colname: }
34
28
  table = column.except(:colname)
35
- @columns_with_primary_key[table] = column[:colname]
29
+ columns_with_primary_key[table] = column[:colname]
36
30
 
37
31
  true
38
32
  end
33
+ columns_with_primary_key
39
34
  end
40
35
 
41
36
  def match_alter_column_statement(raw_statement)
@@ -73,10 +68,8 @@ module ActiveRecordPgFormatDbStructure
73
68
  c.to_h in { constraint: { contype: :CONSTR_NOTNULL } }
74
69
  end
75
70
 
76
- table_elt.column_def.constraints << PgQuery::Node.new(
77
- constraint: PgQuery::Constraint.new(
78
- contype: :CONSTR_PRIMARY
79
- )
71
+ table_elt.column_def.constraints << PgQuery::Node.from(
72
+ PgQuery::Constraint.new(contype: :CONSTR_PRIMARY)
80
73
  )
81
74
  end
82
75
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "pg_query"
3
+ require_relative "base"
4
4
 
5
5
  module ActiveRecordPgFormatDbStructure
6
6
  module Transforms
@@ -13,25 +13,17 @@ module ActiveRecordPgFormatDbStructure
13
13
  # It also assumes that the associated sequence has default settings. A
14
14
  # later version could try to be more strict / validate that the
15
15
  # sequence indeed has default settings.
16
- class InlineSerials
17
- attr_reader :raw_statements
18
-
19
- def initialize(raw_statements)
20
- @raw_statements = raw_statements
21
- @columns_to_replace_with_serial = {}
22
- @sequences_to_remove = Set.new
23
- end
24
-
16
+ class InlineSerials < Base
25
17
  def transform!
26
- extract_serials_to_inline!
27
- delete_redundant_statements!
18
+ extract_serials_to_inline! => columns_to_replace_with_serial:, sequences_to_remove:
19
+ delete_redundant_statements!(sequences_to_remove)
28
20
  raw_statements.each do |raw_statement|
29
21
  next unless raw_statement.stmt.to_h in create_stmt: { relation: { schemaname:, relname: }}
30
22
 
31
23
  relation = { schemaname:, relname: }
32
- next unless @columns_to_replace_with_serial.include?(relation)
24
+ next unless columns_to_replace_with_serial.include?(relation)
33
25
 
34
- @columns_to_replace_with_serial[relation].each do |colname|
26
+ columns_to_replace_with_serial[relation].each do |colname|
35
27
  replace_id_with_serial!(raw_statement, colname)
36
28
  end
37
29
  end
@@ -40,16 +32,19 @@ module ActiveRecordPgFormatDbStructure
40
32
  private
41
33
 
42
34
  def extract_serials_to_inline!
35
+ columns_to_replace_with_serial = {}
36
+ sequences_to_remove = Set.new
43
37
  raw_statements.delete_if do |raw_statement|
44
38
  next unless match_alter_column_statement(raw_statement) in { column:, sequence: }
45
39
 
46
40
  table = column.except(:column_name)
47
- @columns_to_replace_with_serial[table] ||= []
48
- @columns_to_replace_with_serial[table] << column[:column_name]
49
- @sequences_to_remove << sequence
41
+ columns_to_replace_with_serial[table] ||= []
42
+ columns_to_replace_with_serial[table] << column[:column_name]
43
+ sequences_to_remove << sequence
50
44
 
51
45
  true
52
46
  end
47
+ { columns_to_replace_with_serial:, sequences_to_remove: }
53
48
  end
54
49
 
55
50
  def match_alter_column_statement(raw_statement)
@@ -107,21 +102,21 @@ module ActiveRecordPgFormatDbStructure
107
102
 
108
103
  table_elt.column_def.type_name = PgQuery::TypeName.new(
109
104
  names: [
110
- PgQuery::Node.new(string: PgQuery::String.new(
111
- sval: COLUMN_TYPE_TO_SERIAL_TYPE.fetch(integer_type)
112
- ))
105
+ PgQuery::Node.from_string(
106
+ COLUMN_TYPE_TO_SERIAL_TYPE.fetch(integer_type)
107
+ )
113
108
  ]
114
109
  )
115
110
  end
116
111
  end
117
112
 
118
- def delete_redundant_statements!
113
+ def delete_redundant_statements!(sequences_to_remove)
119
114
  raw_statements.delete_if do |raw_statement|
120
115
  case raw_statement.stmt.to_h
121
116
  in create_seq_stmt: { sequence: { schemaname:, relname: }}
122
- @sequences_to_remove.include?({ schemaname:, relname: })
117
+ sequences_to_remove.include?({ schemaname:, relname: })
123
118
  in alter_seq_stmt: {sequence: { schemaname:, relname: }}
124
- @sequences_to_remove.include?({ schemaname:, relname: })
119
+ sequences_to_remove.include?({ schemaname:, relname: })
125
120
  else
126
121
  false
127
122
  end
@@ -1,17 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "pg_query"
3
+ require_relative "base"
4
4
 
5
5
  module ActiveRecordPgFormatDbStructure
6
6
  module Transforms
7
7
  # Move indice declaration just below the table they index
8
- class MoveIndicesAfterCreateTable
9
- attr_reader :raw_statements
10
-
11
- def initialize(raw_statements)
12
- @raw_statements = raw_statements
13
- end
14
-
8
+ class MoveIndicesAfterCreateTable < Base
15
9
  def transform!
16
10
  extract_table_indices!.each do |table, indices|
17
11
  insert_index = find_insert_index(**table)
@@ -1,17 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "pg_query"
3
+ require_relative "base"
4
4
 
5
5
  module ActiveRecordPgFormatDbStructure
6
6
  module Transforms
7
7
  # Remove COMMENT statement applied to extensions
8
- class RemoveCommentsOnExtensions
9
- attr_reader :raw_statements
10
-
11
- def initialize(raw_statements)
12
- @raw_statements = raw_statements
13
- end
14
-
8
+ class RemoveCommentsOnExtensions < Base
15
9
  def transform!
16
10
  raw_statements.delete_if do |raw_statement|
17
11
  raw_statement.stmt.to_h in {
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveRecordPgFormatDbStructure
4
- VERSION = "0.1.0"
4
+ VERSION = "0.1.1"
5
5
  end
metadata CHANGED
@@ -1,14 +1,28 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-pg-format-db-structure
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jell
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-01-26 00:00:00.000000000 Z
10
+ date: 2025-01-29 00:00:00.000000000 Z
11
11
  dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: anbt-sql-formatter
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '0.1'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '0.1'
12
26
  - !ruby/object:Gem::Dependency
13
27
  name: pg_query
14
28
  requirement: !ruby/object:Gem::Requirement
@@ -44,6 +58,7 @@ files:
44
58
  - lib/activerecord-pg-format-db-structure/preprocessors/remove_whitespaces.rb
45
59
  - lib/activerecord-pg-format-db-structure/railtie.rb
46
60
  - lib/activerecord-pg-format-db-structure/tasks/clean_db_structure.rake
61
+ - lib/activerecord-pg-format-db-structure/transforms/base.rb
47
62
  - lib/activerecord-pg-format-db-structure/transforms/group_alter_table_statements.rb
48
63
  - lib/activerecord-pg-format-db-structure/transforms/inline_constraints.rb
49
64
  - lib/activerecord-pg-format-db-structure/transforms/inline_foreign_keys.rb