db_schema 0.2.5 → 0.3.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +5 -3
- data/README.md +2 -2
- data/lib/db_schema.rb +81 -38
- data/lib/db_schema/awesome_print.rb +37 -36
- data/lib/db_schema/changes.rb +68 -217
- data/lib/db_schema/configuration.rb +34 -15
- data/lib/db_schema/definitions.rb +7 -252
- data/lib/db_schema/definitions/check_constraint.rb +17 -0
- data/lib/db_schema/definitions/enum.rb +21 -0
- data/lib/db_schema/definitions/extension.rb +12 -0
- data/lib/db_schema/definitions/field/base.rb +6 -0
- data/lib/db_schema/definitions/foreign_key.rb +41 -0
- data/lib/db_schema/definitions/index.rb +56 -0
- data/lib/db_schema/definitions/index/column.rb +32 -0
- data/lib/db_schema/definitions/index/expression.rb +19 -0
- data/lib/db_schema/definitions/index/table_field.rb +19 -0
- data/lib/db_schema/definitions/schema.rb +36 -0
- data/lib/db_schema/definitions/table.rb +115 -0
- data/lib/db_schema/dsl.rb +96 -76
- data/lib/db_schema/dsl/migration.rb +24 -0
- data/lib/db_schema/migration.rb +12 -0
- data/lib/db_schema/migrator.rb +177 -0
- data/lib/db_schema/normalizer.rb +19 -17
- data/lib/db_schema/operations.rb +211 -0
- data/lib/db_schema/reader.rb +46 -36
- data/lib/db_schema/runner.rb +147 -171
- data/lib/db_schema/version.rb +1 -1
- metadata +18 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 60b581e6c318ed7bf979417435dce0ec4960a978
|
4
|
+
data.tar.gz: 0f296ac7525965a1bd3026e76cfa0cd2bb24b821
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 19375ec9fac1576a3c8164de6584ceacc21019d111bb2e584850713d89936a3714c394c0338c16eb5873c2f86d319286136690fad8cb28b2748dc911c625f3e8
|
7
|
+
data.tar.gz: b80cb8b4a448e5f0014763d89b1e2e2e376d48cd84f03380c55c823a71efe952d7187242888f021b27ccdbf3f85191b5286cefa11fd31d40ce7a3757f3d7dff4
|
data/.travis.yml
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
+
dist: trusty
|
2
|
+
sudo: false
|
1
3
|
language: ruby
|
2
4
|
rvm:
|
3
|
-
- 2.3.
|
4
|
-
before_install: gem install bundler -v 1.12.5
|
5
|
+
- 2.3.3
|
5
6
|
services:
|
6
7
|
- postgresql
|
7
8
|
addons:
|
8
|
-
postgresql: 9.
|
9
|
+
postgresql: 9.6
|
9
10
|
before_script:
|
10
11
|
- psql -c 'CREATE DATABASE db_schema_test;' -U postgres
|
12
|
+
- psql -c 'CREATE DATABASE db_schema_test2;' -U postgres
|
data/README.md
CHANGED
@@ -53,7 +53,7 @@ But you would lose it even with manual migrations.
|
|
53
53
|
Add this line to your application's Gemfile:
|
54
54
|
|
55
55
|
``` ruby
|
56
|
-
gem 'db_schema', '~> 0.
|
56
|
+
gem 'db_schema', '~> 0.3.rc1'
|
57
57
|
```
|
58
58
|
|
59
59
|
And then execute:
|
@@ -65,7 +65,7 @@ $ bundle
|
|
65
65
|
Or install it yourself as:
|
66
66
|
|
67
67
|
``` sh
|
68
|
-
$ gem install db_schema
|
68
|
+
$ gem install db_schema --prerelease
|
69
69
|
```
|
70
70
|
|
71
71
|
## Usage
|
data/lib/db_schema.rb
CHANGED
@@ -4,53 +4,51 @@ require 'yaml'
|
|
4
4
|
require 'db_schema/configuration'
|
5
5
|
require 'db_schema/utils'
|
6
6
|
require 'db_schema/definitions'
|
7
|
+
require 'db_schema/migration'
|
8
|
+
require 'db_schema/operations'
|
7
9
|
require 'db_schema/awesome_print'
|
8
10
|
require 'db_schema/dsl'
|
9
11
|
require 'db_schema/validator'
|
10
12
|
require 'db_schema/normalizer'
|
11
13
|
require 'db_schema/reader'
|
14
|
+
require 'db_schema/migrator'
|
12
15
|
require 'db_schema/changes'
|
13
16
|
require 'db_schema/runner'
|
14
17
|
require 'db_schema/version'
|
15
18
|
|
16
19
|
module DbSchema
|
17
20
|
class << self
|
18
|
-
|
19
|
-
desired_schema = DSL.new(block).schema
|
20
|
-
validate(desired_schema)
|
21
|
-
Normalizer.new(desired_schema).normalize_tables
|
22
|
-
|
23
|
-
actual_schema = Reader.read_schema
|
24
|
-
changes = Changes.between(desired_schema, actual_schema)
|
25
|
-
return if changes.empty?
|
26
|
-
|
27
|
-
log_changes(changes) if configuration.log_changes?
|
28
|
-
return if configuration.dry_run?
|
29
|
-
|
30
|
-
Runner.new(changes).run!
|
31
|
-
|
32
|
-
if configuration.post_check_enabled?
|
33
|
-
perform_post_check(desired_schema)
|
34
|
-
end
|
35
|
-
end
|
21
|
+
attr_reader :current_schema
|
36
22
|
|
37
|
-
def
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
23
|
+
def describe(&block)
|
24
|
+
with_connection do |connection|
|
25
|
+
desired = DSL.new(block)
|
26
|
+
validate(desired.schema)
|
27
|
+
Normalizer.new(desired.schema, connection).normalize_tables
|
28
|
+
|
29
|
+
connection.transaction do
|
30
|
+
actual_schema = run_migrations(desired.migrations, connection)
|
31
|
+
changes = Changes.between(desired.schema, actual_schema)
|
32
|
+
log_changes(changes) if configuration.log_changes?
|
33
|
+
|
34
|
+
if configuration.dry_run?
|
35
|
+
raise Sequel::Rollback
|
36
|
+
else
|
37
|
+
@current_schema = desired.schema
|
38
|
+
return if changes.empty?
|
39
|
+
end
|
40
|
+
|
41
|
+
Runner.new(changes, connection).run!
|
42
|
+
|
43
|
+
if configuration.post_check_enabled?
|
44
|
+
perform_post_check(desired.schema, connection)
|
45
|
+
end
|
46
|
+
end
|
48
47
|
end
|
49
48
|
end
|
50
49
|
|
51
|
-
def configure(
|
52
|
-
@configuration =
|
53
|
-
@connection = nil
|
50
|
+
def configure(params)
|
51
|
+
@configuration = configuration.merge(params)
|
54
52
|
end
|
55
53
|
|
56
54
|
def configure_from_yaml(yaml_path, environment, **other_options)
|
@@ -64,18 +62,43 @@ module DbSchema
|
|
64
62
|
configure(renamed_data.merge(other_options))
|
65
63
|
end
|
66
64
|
|
67
|
-
def
|
68
|
-
|
65
|
+
def connection=(external_connection)
|
66
|
+
@external_connection = external_connection
|
67
|
+
end
|
69
68
|
|
70
|
-
|
69
|
+
def configuration
|
70
|
+
@configuration ||= Configuration.new
|
71
71
|
end
|
72
72
|
|
73
73
|
def reset!
|
74
|
+
@external_connection = nil
|
74
75
|
@configuration = nil
|
75
|
-
@
|
76
|
+
@current_schema = nil
|
76
77
|
end
|
77
78
|
|
78
79
|
private
|
80
|
+
def with_connection
|
81
|
+
raise ArgumentError unless block_given?
|
82
|
+
|
83
|
+
if @external_connection
|
84
|
+
yield @external_connection
|
85
|
+
else
|
86
|
+
Sequel.connect(
|
87
|
+
adapter: configuration.adapter,
|
88
|
+
host: configuration.host,
|
89
|
+
port: configuration.port,
|
90
|
+
database: configuration.database,
|
91
|
+
user: configuration.user,
|
92
|
+
password: configuration.password
|
93
|
+
) do |db|
|
94
|
+
db.extension :pg_enum
|
95
|
+
db.extension :pg_array
|
96
|
+
|
97
|
+
yield db
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
79
102
|
def validate(schema)
|
80
103
|
validation_result = Validator.validate(schema)
|
81
104
|
|
@@ -90,6 +113,26 @@ module DbSchema
|
|
90
113
|
end
|
91
114
|
end
|
92
115
|
|
116
|
+
def run_migrations(migrations, connection)
|
117
|
+
@current_schema = Reader.read_schema(connection)
|
118
|
+
|
119
|
+
migrations.reduce(@current_schema) do |schema, migration|
|
120
|
+
migrator = Migrator.new(migration)
|
121
|
+
|
122
|
+
if migrator.applicable?(schema)
|
123
|
+
log_migration(migration) if configuration.log_changes?
|
124
|
+
migrator.run!(connection)
|
125
|
+
Reader.read_schema(connection)
|
126
|
+
else
|
127
|
+
schema
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def log_migration(migration)
|
133
|
+
puts "DbSchema is running migration #{migration.name.ai}"
|
134
|
+
end
|
135
|
+
|
93
136
|
def log_changes(changes)
|
94
137
|
return if changes.empty?
|
95
138
|
|
@@ -101,8 +144,8 @@ module DbSchema
|
|
101
144
|
end
|
102
145
|
end
|
103
146
|
|
104
|
-
def perform_post_check(desired_schema)
|
105
|
-
unapplied_changes = Changes.between(desired_schema, Reader.read_schema)
|
147
|
+
def perform_post_check(desired_schema, connection)
|
148
|
+
unapplied_changes = Changes.between(desired_schema, Reader.read_schema(connection))
|
106
149
|
return if unapplied_changes.empty?
|
107
150
|
|
108
151
|
readable_changes = if unapplied_changes.respond_to?(:ai)
|
@@ -35,48 +35,49 @@ if defined?(AwesomePrint)
|
|
35
35
|
:dbschema_enum
|
36
36
|
when ::DbSchema::Definitions::Extension
|
37
37
|
:dbschema_column_operation
|
38
|
-
when ::DbSchema::
|
38
|
+
when ::DbSchema::Operations::CreateTable
|
39
39
|
:dbschema_create_table
|
40
|
-
when ::DbSchema::
|
40
|
+
when ::DbSchema::Operations::DropTable
|
41
41
|
:dbschema_drop_table
|
42
|
-
when ::DbSchema::
|
42
|
+
when ::DbSchema::Operations::AlterTable
|
43
43
|
:dbschema_alter_table
|
44
|
-
when ::DbSchema::
|
44
|
+
when ::DbSchema::Operations::CreateColumn
|
45
45
|
:dbschema_create_column
|
46
|
-
when ::DbSchema::
|
46
|
+
when ::DbSchema::Operations::DropColumn
|
47
47
|
:dbschema_column_operation
|
48
|
-
when ::DbSchema::
|
49
|
-
|
50
|
-
|
48
|
+
when ::DbSchema::Operations::RenameTable,
|
49
|
+
::DbSchema::Operations::RenameColumn
|
50
|
+
:dbschema_rename
|
51
|
+
when ::DbSchema::Operations::AlterColumnType
|
51
52
|
:dbschema_alter_column_type
|
52
|
-
when ::DbSchema::
|
53
|
-
::DbSchema::
|
54
|
-
::DbSchema::
|
55
|
-
::DbSchema::
|
53
|
+
when ::DbSchema::Operations::CreatePrimaryKey,
|
54
|
+
::DbSchema::Operations::DropPrimaryKey,
|
55
|
+
::DbSchema::Operations::AllowNull,
|
56
|
+
::DbSchema::Operations::DisallowNull
|
56
57
|
:dbschema_column_operation
|
57
|
-
when ::DbSchema::
|
58
|
+
when ::DbSchema::Operations::AlterColumnDefault
|
58
59
|
:dbschema_alter_column_default
|
59
|
-
when ::DbSchema::
|
60
|
+
when ::DbSchema::Operations::CreateIndex
|
60
61
|
:dbschema_create_index
|
61
|
-
when ::DbSchema::
|
62
|
+
when ::DbSchema::Operations::DropIndex
|
62
63
|
:dbschema_column_operation
|
63
|
-
when ::DbSchema::
|
64
|
+
when ::DbSchema::Operations::CreateCheckConstraint
|
64
65
|
:dbschema_create_check_constraint
|
65
|
-
when ::DbSchema::
|
66
|
+
when ::DbSchema::Operations::DropCheckConstraint
|
66
67
|
:dbschema_column_operation
|
67
|
-
when ::DbSchema::
|
68
|
+
when ::DbSchema::Operations::CreateForeignKey
|
68
69
|
:dbschema_create_foreign_key
|
69
|
-
when ::DbSchema::
|
70
|
+
when ::DbSchema::Operations::DropForeignKey
|
70
71
|
:dbschema_drop_foreign_key
|
71
|
-
when ::DbSchema::
|
72
|
+
when ::DbSchema::Operations::CreateEnum
|
72
73
|
:dbschema_create_enum
|
73
|
-
when ::DbSchema::
|
74
|
+
when ::DbSchema::Operations::DropEnum
|
74
75
|
:dbschema_column_operation
|
75
|
-
when ::DbSchema::
|
76
|
+
when ::DbSchema::Operations::AlterEnumValues
|
76
77
|
:dbschema_alter_enum_values
|
77
|
-
when ::DbSchema::
|
78
|
+
when ::DbSchema::Operations::CreateExtension
|
78
79
|
:dbschema_create_extension
|
79
|
-
when ::DbSchema::
|
80
|
+
when ::DbSchema::Operations::DropExtension
|
80
81
|
:dbschema_column_operation
|
81
82
|
else
|
82
83
|
cast_without_dbschema(object, type)
|
@@ -202,27 +203,27 @@ if defined?(AwesomePrint)
|
|
202
203
|
data << "checks: #{object.table.checks.ai}" if object.table.checks.any?
|
203
204
|
|
204
205
|
data_string = indent_lines(data.join(', '))
|
205
|
-
"#<DbSchema::
|
206
|
+
"#<DbSchema::Operations::CreateTable #{object.table.name.ai} #{data_string}>"
|
206
207
|
end
|
207
208
|
|
208
209
|
def awesome_dbschema_drop_table(object)
|
209
|
-
"#<DbSchema::
|
210
|
+
"#<DbSchema::Operations::DropTable #{object.name.ai}>"
|
210
211
|
end
|
211
212
|
|
212
213
|
def awesome_dbschema_alter_table(object)
|
213
|
-
"#<DbSchema::
|
214
|
+
"#<DbSchema::Operations::AlterTable #{object.table_name.ai} #{indent_lines(object.changes.ai)}>"
|
214
215
|
end
|
215
216
|
|
216
217
|
def awesome_dbschema_create_column(object)
|
217
|
-
"#<DbSchema::
|
218
|
+
"#<DbSchema::Operations::CreateColumn #{object.field.ai}>"
|
218
219
|
end
|
219
220
|
|
220
221
|
def awesome_dbschema_drop_column(object)
|
221
|
-
"#<DbSchema::
|
222
|
+
"#<DbSchema::Operations::DropColumn #{object.name.ai}>"
|
222
223
|
end
|
223
224
|
|
224
|
-
def
|
225
|
-
"
|
225
|
+
def awesome_dbschema_rename(object)
|
226
|
+
"#<#{object.class} #{object.old_name.ai} => #{object.new_name.ai}>"
|
226
227
|
end
|
227
228
|
|
228
229
|
def awesome_dbschema_alter_column_type(object)
|
@@ -231,7 +232,7 @@ if defined?(AwesomePrint)
|
|
231
232
|
"#{key} #{v.ai}"
|
232
233
|
end.unshift(nil).join(', ')
|
233
234
|
|
234
|
-
"#<DbSchema::
|
235
|
+
"#<DbSchema::Operations::AlterColumnType #{object.name.ai}, #{object.new_type.ai}#{attributes}>"
|
235
236
|
end
|
236
237
|
|
237
238
|
def awesome_dbschema_alter_column_default(object)
|
@@ -241,7 +242,7 @@ if defined?(AwesomePrint)
|
|
241
242
|
object.new_default.ai
|
242
243
|
end
|
243
244
|
|
244
|
-
"#<DbSchema::
|
245
|
+
"#<DbSchema::Operations::AlterColumnDefault #{object.name.ai}, #{new_default}>"
|
245
246
|
end
|
246
247
|
|
247
248
|
def awesome_dbschema_create_index(object)
|
@@ -260,11 +261,11 @@ if defined?(AwesomePrint)
|
|
260
261
|
end
|
261
262
|
|
262
263
|
def awesome_dbschema_create_foreign_key(object)
|
263
|
-
"#<DbSchema::
|
264
|
+
"#<DbSchema::Operations::CreateForeignKey #{object.foreign_key.ai} on #{object.table_name.ai}>"
|
264
265
|
end
|
265
266
|
|
266
267
|
def awesome_dbschema_drop_foreign_key(object)
|
267
|
-
"#<DbSchema::
|
268
|
+
"#<DbSchema::Operations::DropForeignKey #{object.fkey_name.ai} on #{object.table_name.ai}>"
|
268
269
|
end
|
269
270
|
|
270
271
|
def awesome_dbschema_create_enum(object)
|
@@ -284,7 +285,7 @@ if defined?(AwesomePrint)
|
|
284
285
|
colorize(value.to_s, :string)
|
285
286
|
end.join(', ')
|
286
287
|
|
287
|
-
"#<DbSchema::
|
288
|
+
"#<DbSchema::Operations::AlterEnumValues #{object.enum_name.ai} to (#{values})>"
|
288
289
|
end
|
289
290
|
|
290
291
|
def awesome_dbschema_create_extension(object)
|
data/lib/db_schema/changes.rb
CHANGED
@@ -12,17 +12,17 @@ module DbSchema
|
|
12
12
|
actual = actual_schema.tables.find { |table| table.name == table_name }
|
13
13
|
|
14
14
|
if desired && !actual
|
15
|
-
changes << CreateTable.new(desired)
|
15
|
+
changes << Operations::CreateTable.new(desired)
|
16
16
|
|
17
17
|
fkey_operations = desired.foreign_keys.map do |fkey|
|
18
|
-
CreateForeignKey.new(table_name, fkey)
|
18
|
+
Operations::CreateForeignKey.new(table_name, fkey)
|
19
19
|
end
|
20
20
|
changes.concat(fkey_operations)
|
21
21
|
elsif actual && !desired
|
22
|
-
changes << DropTable.new(table_name)
|
22
|
+
changes << Operations::DropTable.new(table_name)
|
23
23
|
|
24
24
|
actual.foreign_keys.each do |fkey|
|
25
|
-
changes << DropForeignKey.new(table_name, fkey.name)
|
25
|
+
changes << Operations::DropForeignKey.new(table_name, fkey.name)
|
26
26
|
end
|
27
27
|
elsif actual != desired
|
28
28
|
field_operations = field_changes(desired.fields, actual.fields)
|
@@ -31,9 +31,9 @@ module DbSchema
|
|
31
31
|
fkey_operations = foreign_key_changes(table_name, desired.foreign_keys, actual.foreign_keys)
|
32
32
|
|
33
33
|
if field_operations.any? || index_operations.any? || check_operations.any?
|
34
|
-
changes << AlterTable.new(
|
34
|
+
changes << Operations::AlterTable.new(
|
35
35
|
table_name,
|
36
|
-
field_operations + index_operations + check_operations
|
36
|
+
sort_alter_table_changes(field_operations + index_operations + check_operations)
|
37
37
|
)
|
38
38
|
end
|
39
39
|
|
@@ -48,9 +48,9 @@ module DbSchema
|
|
48
48
|
actual = actual_schema.enums.find { |enum| enum.name == enum_name }
|
49
49
|
|
50
50
|
if desired && !actual
|
51
|
-
changes << CreateEnum.new(desired)
|
51
|
+
changes << Operations::CreateEnum.new(desired)
|
52
52
|
elsif actual && !desired
|
53
|
-
changes << DropEnum.new(enum_name)
|
53
|
+
changes << Operations::DropEnum.new(enum_name)
|
54
54
|
elsif actual != desired
|
55
55
|
fields = actual_schema.tables.flat_map do |table|
|
56
56
|
table.fields.select do |field|
|
@@ -73,17 +73,17 @@ module DbSchema
|
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
76
|
-
changes << AlterEnumValues.new(enum_name, desired.values, fields)
|
76
|
+
changes << Operations::AlterEnumValues.new(enum_name, desired.values, fields)
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
80
80
|
extension_changes = (desired_schema.extensions - actual_schema.extensions).map do |extension|
|
81
|
-
CreateExtension.new(extension)
|
81
|
+
Operations::CreateExtension.new(extension)
|
82
82
|
end + (actual_schema.extensions - desired_schema.extensions).map do |extension|
|
83
|
-
DropExtension.new(extension.name)
|
83
|
+
Operations::DropExtension.new(extension.name)
|
84
84
|
end
|
85
85
|
|
86
|
-
table_changes + enum_changes + extension_changes
|
86
|
+
sort_all_changes(table_changes + enum_changes + extension_changes)
|
87
87
|
end
|
88
88
|
|
89
89
|
private
|
@@ -95,12 +95,12 @@ module DbSchema
|
|
95
95
|
actual = actual_fields.find { |field| field.name == field_name }
|
96
96
|
|
97
97
|
if desired && !actual
|
98
|
-
table_changes << CreateColumn.new(desired)
|
98
|
+
table_changes << Operations::CreateColumn.new(desired)
|
99
99
|
elsif actual && !desired
|
100
|
-
table_changes << DropColumn.new(field_name)
|
100
|
+
table_changes << Operations::DropColumn.new(field_name)
|
101
101
|
elsif actual != desired
|
102
102
|
if (actual.type != desired.type) || (actual.attributes != desired.attributes)
|
103
|
-
table_changes << AlterColumnType.new(
|
103
|
+
table_changes << Operations::AlterColumnType.new(
|
104
104
|
field_name,
|
105
105
|
new_type: desired.type,
|
106
106
|
**desired.attributes
|
@@ -108,23 +108,23 @@ module DbSchema
|
|
108
108
|
end
|
109
109
|
|
110
110
|
if desired.primary_key? && !actual.primary_key?
|
111
|
-
table_changes << CreatePrimaryKey.new(field_name)
|
111
|
+
table_changes << Operations::CreatePrimaryKey.new(field_name)
|
112
112
|
end
|
113
113
|
|
114
114
|
if actual.primary_key? && !desired.primary_key?
|
115
|
-
table_changes << DropPrimaryKey.new(field_name)
|
115
|
+
table_changes << Operations::DropPrimaryKey.new(field_name)
|
116
116
|
end
|
117
117
|
|
118
118
|
if desired.null? && !actual.null?
|
119
|
-
table_changes << AllowNull.new(field_name)
|
119
|
+
table_changes << Operations::AllowNull.new(field_name)
|
120
120
|
end
|
121
121
|
|
122
122
|
if actual.null? && !desired.null?
|
123
|
-
table_changes << DisallowNull.new(field_name)
|
123
|
+
table_changes << Operations::DisallowNull.new(field_name)
|
124
124
|
end
|
125
125
|
|
126
126
|
if actual.default != desired.default
|
127
|
-
table_changes << AlterColumnDefault.new(field_name, new_default: desired.default)
|
127
|
+
table_changes << Operations::AlterColumnDefault.new(field_name, new_default: desired.default)
|
128
128
|
end
|
129
129
|
end
|
130
130
|
end
|
@@ -138,12 +138,12 @@ module DbSchema
|
|
138
138
|
actual = actual_indices.find { |index| index.name == index_name }
|
139
139
|
|
140
140
|
if desired && !actual
|
141
|
-
table_changes << CreateIndex.new(desired)
|
141
|
+
table_changes << Operations::CreateIndex.new(desired)
|
142
142
|
elsif actual && !desired
|
143
|
-
table_changes << DropIndex.new(index_name)
|
143
|
+
table_changes << Operations::DropIndex.new(index_name)
|
144
144
|
elsif actual != desired
|
145
|
-
table_changes << DropIndex.new(index_name)
|
146
|
-
table_changes << CreateIndex.new(desired)
|
145
|
+
table_changes << Operations::DropIndex.new(index_name)
|
146
|
+
table_changes << Operations::CreateIndex.new(desired)
|
147
147
|
end
|
148
148
|
end
|
149
149
|
end
|
@@ -156,12 +156,12 @@ module DbSchema
|
|
156
156
|
actual = actual_checks.find { |check| check.name == check_name }
|
157
157
|
|
158
158
|
if desired && !actual
|
159
|
-
table_changes << CreateCheckConstraint.new(desired)
|
159
|
+
table_changes << Operations::CreateCheckConstraint.new(desired)
|
160
160
|
elsif actual && !desired
|
161
|
-
table_changes << DropCheckConstraint.new(check_name)
|
161
|
+
table_changes << Operations::DropCheckConstraint.new(check_name)
|
162
162
|
elsif actual != desired
|
163
|
-
table_changes << DropCheckConstraint.new(check_name)
|
164
|
-
table_changes << CreateCheckConstraint.new(desired)
|
163
|
+
table_changes << Operations::DropCheckConstraint.new(check_name)
|
164
|
+
table_changes << Operations::CreateCheckConstraint.new(desired)
|
165
165
|
end
|
166
166
|
end
|
167
167
|
end
|
@@ -174,202 +174,53 @@ module DbSchema
|
|
174
174
|
actual = actual_foreign_keys.find { |key| key.name == key_name }
|
175
175
|
|
176
176
|
if desired && !actual
|
177
|
-
table_changes << CreateForeignKey.new(table_name, desired)
|
177
|
+
table_changes << Operations::CreateForeignKey.new(table_name, desired)
|
178
178
|
elsif actual && !desired
|
179
|
-
table_changes << DropForeignKey.new(table_name, key_name)
|
179
|
+
table_changes << Operations::DropForeignKey.new(table_name, key_name)
|
180
180
|
elsif actual != desired
|
181
|
-
table_changes << DropForeignKey.new(table_name, key_name)
|
182
|
-
table_changes << CreateForeignKey.new(table_name, desired)
|
181
|
+
table_changes << Operations::DropForeignKey.new(table_name, key_name)
|
182
|
+
table_changes << Operations::CreateForeignKey.new(table_name, desired)
|
183
183
|
end
|
184
184
|
end
|
185
185
|
end
|
186
|
-
end
|
187
|
-
|
188
|
-
class CreateTable
|
189
|
-
include Dry::Equalizer(:table)
|
190
|
-
attr_reader :table
|
191
|
-
|
192
|
-
def initialize(table)
|
193
|
-
@table = table
|
194
|
-
end
|
195
|
-
end
|
196
|
-
|
197
|
-
class DropTable
|
198
|
-
include Dry::Equalizer(:name)
|
199
|
-
attr_reader :name
|
200
|
-
|
201
|
-
def initialize(name)
|
202
|
-
@name = name
|
203
|
-
end
|
204
|
-
end
|
205
|
-
|
206
|
-
class AlterTable
|
207
|
-
include Dry::Equalizer(:table_name, :changes)
|
208
|
-
attr_reader :table_name, :changes
|
209
|
-
|
210
|
-
def initialize(table_name, changes)
|
211
|
-
@table_name = table_name
|
212
|
-
@changes = changes
|
213
|
-
end
|
214
|
-
end
|
215
|
-
|
216
|
-
# Abstract base class for single-column toggle operations.
|
217
|
-
class ColumnOperation
|
218
|
-
include Dry::Equalizer(:name)
|
219
|
-
attr_reader :name
|
220
|
-
|
221
|
-
def initialize(name)
|
222
|
-
@name = name
|
223
|
-
end
|
224
|
-
end
|
225
|
-
|
226
|
-
class CreateColumn
|
227
|
-
include Dry::Equalizer(:field)
|
228
|
-
attr_reader :field
|
229
|
-
|
230
|
-
def initialize(field)
|
231
|
-
@field = field
|
232
|
-
end
|
233
|
-
|
234
|
-
def name
|
235
|
-
field.name
|
236
|
-
end
|
237
|
-
|
238
|
-
def type
|
239
|
-
field.type
|
240
|
-
end
|
241
|
-
|
242
|
-
def primary_key?
|
243
|
-
field.primary_key?
|
244
|
-
end
|
245
|
-
|
246
|
-
def options
|
247
|
-
field.options
|
248
|
-
end
|
249
|
-
end
|
250
|
-
|
251
|
-
class DropColumn < ColumnOperation
|
252
|
-
end
|
253
|
-
|
254
|
-
class RenameColumn
|
255
|
-
attr_reader :old_name, :new_name
|
256
|
-
|
257
|
-
def initialize(old_name:, new_name:)
|
258
|
-
@old_name = old_name
|
259
|
-
@new_name = new_name
|
260
|
-
end
|
261
|
-
end
|
262
|
-
|
263
|
-
class AlterColumnType
|
264
|
-
include Dry::Equalizer(:name, :new_type, :new_attributes)
|
265
|
-
attr_reader :name, :new_type, :new_attributes
|
266
|
-
|
267
|
-
def initialize(name, new_type:, **new_attributes)
|
268
|
-
@name = name
|
269
|
-
@new_type = new_type
|
270
|
-
@new_attributes = new_attributes
|
271
|
-
end
|
272
|
-
end
|
273
|
-
|
274
|
-
class CreatePrimaryKey < ColumnOperation
|
275
|
-
end
|
276
|
-
|
277
|
-
class DropPrimaryKey < ColumnOperation
|
278
|
-
end
|
279
|
-
|
280
|
-
class AllowNull < ColumnOperation
|
281
|
-
end
|
282
|
-
|
283
|
-
class DisallowNull < ColumnOperation
|
284
|
-
end
|
285
|
-
|
286
|
-
class AlterColumnDefault
|
287
|
-
include Dry::Equalizer(:name, :new_default)
|
288
|
-
attr_reader :name, :new_default
|
289
|
-
|
290
|
-
def initialize(name, new_default:)
|
291
|
-
@name = name
|
292
|
-
@new_default = new_default
|
293
|
-
end
|
294
|
-
end
|
295
|
-
|
296
|
-
class CreateIndex
|
297
|
-
include Dry::Equalizer(:index)
|
298
|
-
attr_reader :index
|
299
|
-
|
300
|
-
def initialize(index)
|
301
|
-
@index = index
|
302
|
-
end
|
303
|
-
end
|
304
|
-
|
305
|
-
class DropIndex < ColumnOperation
|
306
|
-
end
|
307
|
-
|
308
|
-
class CreateCheckConstraint
|
309
|
-
include Dry::Equalizer(:check)
|
310
|
-
attr_reader :check
|
311
|
-
|
312
|
-
def initialize(check)
|
313
|
-
@check = check
|
314
|
-
end
|
315
|
-
end
|
316
|
-
|
317
|
-
class DropCheckConstraint < ColumnOperation
|
318
|
-
end
|
319
186
|
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
187
|
+
def sort_all_changes(changes)
|
188
|
+
Utils.sort_by_class(
|
189
|
+
changes,
|
190
|
+
[
|
191
|
+
Operations::CreateExtension,
|
192
|
+
Operations::DropForeignKey,
|
193
|
+
Operations::AlterEnumValues,
|
194
|
+
Operations::CreateEnum,
|
195
|
+
Operations::CreateTable,
|
196
|
+
Operations::AlterTable,
|
197
|
+
Operations::DropTable,
|
198
|
+
Operations::DropEnum,
|
199
|
+
Operations::CreateForeignKey,
|
200
|
+
Operations::DropExtension
|
201
|
+
]
|
202
|
+
)
|
203
|
+
end
|
204
|
+
|
205
|
+
def sort_alter_table_changes(changes)
|
206
|
+
Utils.sort_by_class(
|
207
|
+
changes,
|
208
|
+
[
|
209
|
+
Operations::DropPrimaryKey,
|
210
|
+
Operations::DropCheckConstraint,
|
211
|
+
Operations::DropIndex,
|
212
|
+
Operations::DropColumn,
|
213
|
+
Operations::AlterColumnType,
|
214
|
+
Operations::AllowNull,
|
215
|
+
Operations::DisallowNull,
|
216
|
+
Operations::AlterColumnDefault,
|
217
|
+
Operations::CreateColumn,
|
218
|
+
Operations::CreateIndex,
|
219
|
+
Operations::CreateCheckConstraint,
|
220
|
+
Operations::CreatePrimaryKey
|
221
|
+
]
|
222
|
+
)
|
337
223
|
end
|
338
224
|
end
|
339
|
-
|
340
|
-
class CreateEnum
|
341
|
-
include Dry::Equalizer(:enum)
|
342
|
-
attr_reader :enum
|
343
|
-
|
344
|
-
def initialize(enum)
|
345
|
-
@enum = enum
|
346
|
-
end
|
347
|
-
end
|
348
|
-
|
349
|
-
class DropEnum < ColumnOperation
|
350
|
-
end
|
351
|
-
|
352
|
-
class AlterEnumValues
|
353
|
-
include Dry::Equalizer(:enum_name, :new_values, :enum_fields)
|
354
|
-
attr_reader :enum_name, :new_values, :enum_fields
|
355
|
-
|
356
|
-
def initialize(enum_name, new_values, enum_fields)
|
357
|
-
@enum_name = enum_name
|
358
|
-
@new_values = new_values
|
359
|
-
@enum_fields = enum_fields
|
360
|
-
end
|
361
|
-
end
|
362
|
-
|
363
|
-
class CreateExtension
|
364
|
-
include Dry::Equalizer(:extension)
|
365
|
-
attr_reader :extension
|
366
|
-
|
367
|
-
def initialize(extension)
|
368
|
-
@extension = extension
|
369
|
-
end
|
370
|
-
end
|
371
|
-
|
372
|
-
class DropExtension < ColumnOperation
|
373
|
-
end
|
374
225
|
end
|
375
226
|
end
|