dynamic_migrations 3.1.0 → 3.2.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.
Files changed (24) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +14 -0
  3. data/lib/dynamic_migrations/postgres/generator/column.rb +44 -19
  4. data/lib/dynamic_migrations/postgres/generator/foreign_key_constraint.rb +35 -14
  5. data/lib/dynamic_migrations/postgres/generator/fragment.rb +37 -2
  6. data/lib/dynamic_migrations/postgres/generator/function.rb +50 -25
  7. data/lib/dynamic_migrations/postgres/generator/index.rb +34 -14
  8. data/lib/dynamic_migrations/postgres/generator/migration.rb +175 -0
  9. data/lib/dynamic_migrations/postgres/generator/migration_dependency_sorter.rb +21 -0
  10. data/lib/dynamic_migrations/postgres/generator/primary_key.rb +16 -6
  11. data/lib/dynamic_migrations/postgres/generator/schema.rb +14 -6
  12. data/lib/dynamic_migrations/postgres/generator/schema_migration.rb +17 -0
  13. data/lib/dynamic_migrations/postgres/generator/table.rb +39 -19
  14. data/lib/dynamic_migrations/postgres/generator/table_migration.rb +51 -0
  15. data/lib/dynamic_migrations/postgres/generator/trigger.rb +34 -14
  16. data/lib/dynamic_migrations/postgres/generator/unique_constraint.rb +34 -14
  17. data/lib/dynamic_migrations/postgres/generator/validation.rb +38 -18
  18. data/lib/dynamic_migrations/postgres/generator.rb +163 -294
  19. data/lib/dynamic_migrations/postgres/server/database/connection.rb +15 -0
  20. data/lib/dynamic_migrations/version.rb +1 -1
  21. data/lib/dynamic_migrations.rb +4 -2
  22. metadata +6 -4
  23. data/lib/dynamic_migrations/postgres/generator/schema_migrations/section.rb +0 -37
  24. data/lib/dynamic_migrations/postgres/generator/schema_migrations.rb +0 -92
@@ -3,15 +3,23 @@ module DynamicMigrations
3
3
  class Generator
4
4
  module Schema
5
5
  def create_schema schema, code_comment = nil
6
- add_migration schema.name, nil, :create_schema, schema.name, code_comment, <<~RUBY
7
- create_schema :#{schema.name}
8
- RUBY
6
+ add_fragment schema: schema,
7
+ migration_method: :create_schema,
8
+ object: schema,
9
+ code_comment: code_comment,
10
+ migration: <<~RUBY
11
+ create_schema :#{schema.name}
12
+ RUBY
9
13
  end
10
14
 
11
15
  def drop_schema schema, code_comment = nil
12
- add_migration schema.name, nil, :drop_schema, schema.name, code_comment, <<~RUBY
13
- drop_schema :#{schema.name}
14
- RUBY
16
+ add_fragment schema: schema,
17
+ migration_method: :drop_schema,
18
+ object: schema,
19
+ code_comment: code_comment,
20
+ migration: <<~RUBY
21
+ drop_schema :#{schema.name}
22
+ RUBY
15
23
  end
16
24
  end
17
25
  end
@@ -0,0 +1,17 @@
1
+ module DynamicMigrations
2
+ module Postgres
3
+ class Generator
4
+ class SchemaMigration < Migration
5
+ # these sections are in order for which they will appear in a migration,
6
+ # note that removals come before additions, and that the order here optomizes
7
+ # for dependencies (i.e. columns have to be created before indexes are added and
8
+ # triggers are removed before functions are dropped)
9
+ add_structure_template [:remove_function_comment, :drop_function], "Remove Functions"
10
+ add_structure_template [:drop_schema], "Drop this schema"
11
+ add_structure_template [:create_schema], "Create this schema"
12
+ add_structure_template [:create_function], "Functions"
13
+ add_structure_template [:update_function, :set_function_comment], "Update Functions"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -13,20 +13,30 @@ module DynamicMigrations
13
13
  raise NoTableCommentError, "Refusing to generate create_table migration, no description was provided for `#{table.schema.name}`.`#{table.name}`"
14
14
  end
15
15
 
16
- add_migration table.schema.name, table.name, :create_table, table.name, code_comment, <<~RUBY
17
- table_comment = <<~COMMENT
18
- #{indent table.description}
19
- COMMENT
20
- create_table :#{table.name}, #{table_options table} do |t|
21
- #{indent table_columns(table.columns)}
22
- end
23
- RUBY
16
+ add_fragment schema: table.schema,
17
+ table: table,
18
+ migration_method: :create_table,
19
+ object: table,
20
+ code_comment: code_comment,
21
+ migration: <<~RUBY
22
+ table_comment = <<~COMMENT
23
+ #{indent table.description}
24
+ COMMENT
25
+ create_table :#{table.name}, #{table_options table} do |t|
26
+ #{indent table_columns(table.columns)}
27
+ end
28
+ RUBY
24
29
  end
25
30
 
26
31
  def drop_table table, code_comment = nil
27
- add_migration table.schema.name, table.name, :drop_table, table.name, code_comment, <<~RUBY
28
- drop_table :#{table.name}, force: true
29
- RUBY
32
+ add_fragment schema: table.schema,
33
+ table: table,
34
+ migration_method: :drop_table,
35
+ object: table,
36
+ code_comment: code_comment,
37
+ migration: <<~RUBY
38
+ drop_table :#{table.name}, force: true
39
+ RUBY
30
40
  end
31
41
 
32
42
  # add a comment to a table
@@ -37,18 +47,28 @@ module DynamicMigrations
37
47
  raise MissingDescriptionError
38
48
  end
39
49
 
40
- add_migration table.schema.name, table.name, :set_table_comment, table.name, code_comment, <<~RUBY
41
- set_table_comment :#{table.name}, <<~COMMENT
42
- #{indent description}
43
- COMMENT
44
- RUBY
50
+ add_fragment schema: table.schema,
51
+ table: table,
52
+ migration_method: :set_table_comment,
53
+ object: table,
54
+ code_comment: code_comment,
55
+ migration: <<~RUBY
56
+ set_table_comment :#{table.name}, <<~COMMENT
57
+ #{indent description}
58
+ COMMENT
59
+ RUBY
45
60
  end
46
61
 
47
62
  # remove the comment from a table
48
63
  def remove_table_comment table, code_comment = nil
49
- add_migration table.schema.name, table.name, :remove_table_comment, table.name, code_comment, <<~RUBY
50
- remove_table_comment :#{table.name}
51
- RUBY
64
+ add_fragment schema: table.schema,
65
+ table: table,
66
+ migration_method: :remove_table_comment,
67
+ object: table,
68
+ code_comment: code_comment,
69
+ migration: <<~RUBY
70
+ remove_table_comment :#{table.name}
71
+ RUBY
52
72
  end
53
73
 
54
74
  private
@@ -0,0 +1,51 @@
1
+ module DynamicMigrations
2
+ module Postgres
3
+ class Generator
4
+ class TableMigration < Migration
5
+ class UnexpectedTableError < StandardError
6
+ end
7
+
8
+ class MissingRequiredTableName < StandardError
9
+ end
10
+
11
+ # these sections are in order for which they will appear in a migration,
12
+ # note that removals come before additions, and that the order here optomizes
13
+ # for dependencies (i.e. columns have to be created before indexes are added and
14
+ # triggers are removed before functions are dropped)
15
+ add_structure_template [:remove_trigger_comment, :remove_trigger], "Remove Triggers"
16
+ add_structure_template [:remove_validation, :remove_unique_constraint], "Remove Validations"
17
+ add_structure_template [:remove_foreign_key], "Remove Foreign Keys"
18
+ add_structure_template [:remove_primary_key], "Remove Primary Keys"
19
+ add_structure_template [:remove_index, :remove_index_comment], "Remove Indexes"
20
+ add_structure_template [:remove_column], "Remove Columns"
21
+ add_structure_template [:drop_table], "Remove Tables"
22
+ add_structure_template [:create_table], "Create Table"
23
+ add_structure_template [:remove_table_comment, :set_table_comment], "Tables"
24
+ add_structure_template [:add_column], "Additional Columns"
25
+ add_structure_template [:change_column, :remove_column_comment, :set_column_comment], "Update Columns"
26
+ add_structure_template [:add_primary_key], "Primary Key"
27
+ add_structure_template [:add_index, :set_index_comment], "Indexes"
28
+ add_structure_template [:add_foreign_key, :set_foreign_key_constraint_comment, :remove_foreign_key_constraint_comment], "Foreign Keys"
29
+ add_structure_template [:add_validation, :add_unique_constraint, :set_validation_comment, :remove_validation_comment, :set_unique_constraint_comment, :remove_unique_constraint_comment], "Validations"
30
+ add_structure_template [:create_function], "Functions"
31
+ add_structure_template [:add_trigger, :set_trigger_comment], "Triggers"
32
+ add_structure_template [:update_function, :set_function_comment], "Update Functions"
33
+
34
+ attr_accessor :table_name
35
+
36
+ def initialize schema_name, table_name
37
+ raise MissingRequiredTableName unless table_name
38
+ super schema_name
39
+ @table_name = table_name
40
+ end
41
+
42
+ def add_fragment fragment
43
+ unless @table_name == fragment.table_name
44
+ raise UnexpectedTableError, "Frgment is for table `#{fragment.table_name}` but migration is for table `#{@table_name}`"
45
+ end
46
+ super
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -46,15 +46,25 @@ module DynamicMigrations
46
46
 
47
47
  options_syntax = options.map { |k, v| "#{k}: #{v}" }.join(", ")
48
48
 
49
- add_migration trigger.table.schema.name, trigger.table.name, :add_trigger, trigger.name, code_comment, <<~RUBY
50
- #{method_name} :#{trigger.table.name}, #{options_syntax}
51
- RUBY
49
+ add_fragment schema: trigger.table.schema,
50
+ table: trigger.table,
51
+ migration_method: :add_trigger,
52
+ object: trigger,
53
+ code_comment: code_comment,
54
+ migration: <<~RUBY
55
+ #{method_name} :#{trigger.table.name}, #{options_syntax}
56
+ RUBY
52
57
  end
53
58
 
54
59
  def remove_trigger trigger, code_comment = nil
55
- add_migration trigger.table.schema.name, trigger.table.name, :remove_trigger, trigger.name, code_comment, <<~RUBY
56
- remove_trigger :#{trigger.table.name}, :#{trigger.name}
57
- RUBY
60
+ add_fragment schema: trigger.table.schema,
61
+ table: trigger.table,
62
+ migration_method: :remove_trigger,
63
+ object: trigger,
64
+ code_comment: code_comment,
65
+ migration: <<~RUBY
66
+ remove_trigger :#{trigger.table.name}, :#{trigger.name}
67
+ RUBY
58
68
  end
59
69
 
60
70
  def recreate_trigger original_trigger, updated_trigger
@@ -82,18 +92,28 @@ module DynamicMigrations
82
92
  raise MissingDescriptionError
83
93
  end
84
94
 
85
- add_migration trigger.table.schema.name, trigger.table.name, :set_trigger_comment, trigger.name, code_comment, <<~RUBY
86
- set_trigger_comment :#{trigger.table.name}, :#{trigger.name}, <<~COMMENT
87
- #{indent description}
88
- COMMENT
89
- RUBY
95
+ add_fragment schema: trigger.table.schema,
96
+ table: trigger.table,
97
+ migration_method: :set_trigger_comment,
98
+ object: trigger,
99
+ code_comment: code_comment,
100
+ migration: <<~RUBY
101
+ set_trigger_comment :#{trigger.table.name}, :#{trigger.name}, <<~COMMENT
102
+ #{indent description}
103
+ COMMENT
104
+ RUBY
90
105
  end
91
106
 
92
107
  # remove the comment from a trigger
93
108
  def remove_trigger_comment trigger, code_comment = nil
94
- add_migration trigger.table.schema.name, trigger.table.name, :remove_trigger_comment, trigger.name, code_comment, <<~RUBY
95
- remove_trigger_comment :#{trigger.table.name}, :#{trigger.name}
96
- RUBY
109
+ add_fragment schema: trigger.table.schema,
110
+ table: trigger.table,
111
+ migration_method: :remove_trigger_comment,
112
+ object: trigger,
113
+ code_comment: code_comment,
114
+ migration: <<~RUBY
115
+ remove_trigger_comment :#{trigger.table.name}, :#{trigger.name}
116
+ RUBY
97
117
  end
98
118
  end
99
119
  end
@@ -24,15 +24,25 @@ module DynamicMigrations
24
24
 
25
25
  options_syntax = options.map { |k, v| "#{k}: #{v}" }.join(", ")
26
26
 
27
- add_migration unique_constraint.table.schema.name, unique_constraint.table.name, :add_unique_constraint, unique_constraint.name, code_comment, <<~RUBY
28
- add_unique_constraint :#{unique_constraint.table.name}, #{column_names}, #{options_syntax}
29
- RUBY
27
+ add_fragment schema: unique_constraint.table.schema,
28
+ table: unique_constraint.table,
29
+ migration_method: :add_unique_constraint,
30
+ object: unique_constraint,
31
+ code_comment: code_comment,
32
+ migration: <<~RUBY
33
+ add_unique_constraint :#{unique_constraint.table.name}, #{column_names}, #{options_syntax}
34
+ RUBY
30
35
  end
31
36
 
32
37
  def remove_unique_constraint unique_constraint, code_comment = nil
33
- add_migration unique_constraint.table.schema.name, unique_constraint.table.name, :remove_unique_constraint, unique_constraint.name, code_comment, <<~RUBY
34
- remove_unique_constraint :#{unique_constraint.table.name}, :#{unique_constraint.name}
35
- RUBY
38
+ add_fragment schema: unique_constraint.table.schema,
39
+ table: unique_constraint.table,
40
+ migration_method: :remove_unique_constraint,
41
+ object: unique_constraint,
42
+ code_comment: code_comment,
43
+ migration: <<~RUBY
44
+ remove_unique_constraint :#{unique_constraint.table.name}, :#{unique_constraint.name}
45
+ RUBY
36
46
  end
37
47
 
38
48
  def recreate_unique_constraint original_unique_constraint, updated_unique_constraint
@@ -60,18 +70,28 @@ module DynamicMigrations
60
70
  raise MissingDescriptionError
61
71
  end
62
72
 
63
- add_migration unique_constraint.table.schema.name, unique_constraint.table.name, :set_unique_constraint_comment, unique_constraint.name, code_comment, <<~RUBY
64
- set_unique_constraint_comment :#{unique_constraint.table.name}, :#{unique_constraint.name}, <<~COMMENT
65
- #{indent description}
66
- COMMENT
67
- RUBY
73
+ add_fragment schema: unique_constraint.table.schema,
74
+ table: unique_constraint.table,
75
+ migration_method: :set_unique_constraint_comment,
76
+ object: unique_constraint,
77
+ code_comment: code_comment,
78
+ migration: <<~RUBY
79
+ set_unique_constraint_comment :#{unique_constraint.table.name}, :#{unique_constraint.name}, <<~COMMENT
80
+ #{indent description}
81
+ COMMENT
82
+ RUBY
68
83
  end
69
84
 
70
85
  # remove the comment from a unique_constraint
71
86
  def remove_unique_constraint_comment unique_constraint, code_comment = nil
72
- add_migration unique_constraint.table.schema.name, unique_constraint.table.name, :remove_unique_constraint_comment, unique_constraint.name, code_comment, <<~RUBY
73
- remove_unique_constraint_comment :#{unique_constraint.table.name}, :#{unique_constraint.name}
74
- RUBY
87
+ add_fragment schema: unique_constraint.table.schema,
88
+ table: unique_constraint.table,
89
+ migration_method: :remove_unique_constraint_comment,
90
+ object: unique_constraint,
91
+ code_comment: code_comment,
92
+ migration: <<~RUBY
93
+ remove_unique_constraint_comment :#{unique_constraint.table.name}, :#{unique_constraint.name}
94
+ RUBY
75
95
  end
76
96
  end
77
97
  end
@@ -28,19 +28,29 @@ module DynamicMigrations
28
28
  validation_sql << ";"
29
29
  end
30
30
 
31
- add_migration validation.table.schema.name, validation.table.name, :add_validation, validation.name, code_comment, (comment_sql + <<~RUBY)
32
- add_validation :#{validation.table.name}, #{options_syntax} do
33
- <<~SQL
34
- #{indent validation_sql}
35
- SQL
36
- end
37
- RUBY
31
+ add_fragment schema: validation.table.schema,
32
+ table: validation.table,
33
+ migration_method: :add_validation,
34
+ object: validation,
35
+ code_comment: code_comment,
36
+ migration: comment_sql + <<~RUBY
37
+ add_validation :#{validation.table.name}, #{options_syntax} do
38
+ <<~SQL
39
+ #{indent validation_sql}
40
+ SQL
41
+ end
42
+ RUBY
38
43
  end
39
44
 
40
45
  def remove_validation validation, code_comment = nil
41
- add_migration validation.table.schema.name, validation.table.name, :remove_validation, validation.name, code_comment, <<~RUBY
42
- remove_validation :#{validation.table.name}, :#{validation.name}
43
- RUBY
46
+ add_fragment schema: validation.table.schema,
47
+ table: validation.table,
48
+ migration_method: :remove_validation,
49
+ object: validation,
50
+ code_comment: code_comment,
51
+ migration: <<~RUBY
52
+ remove_validation :#{validation.table.name}, :#{validation.name}
53
+ RUBY
44
54
  end
45
55
 
46
56
  def recreate_validation original_validation, updated_validation
@@ -68,18 +78,28 @@ module DynamicMigrations
68
78
  raise MissingDescriptionError
69
79
  end
70
80
 
71
- add_migration validation.table.schema.name, validation.table.name, :set_validation_comment, validation.name, code_comment, <<~RUBY
72
- set_validation_comment :#{validation.table.name}, :#{validation.name}, <<~COMMENT
73
- #{indent description}
74
- COMMENT
75
- RUBY
81
+ add_fragment schema: validation.table.schema,
82
+ table: validation.table,
83
+ migration_method: :set_validation_comment,
84
+ object: validation,
85
+ code_comment: code_comment,
86
+ migration: <<~RUBY
87
+ set_validation_comment :#{validation.table.name}, :#{validation.name}, <<~COMMENT
88
+ #{indent description}
89
+ COMMENT
90
+ RUBY
76
91
  end
77
92
 
78
93
  # remove the comment from a validation
79
94
  def remove_validation_comment validation, code_comment = nil
80
- add_migration validation.table.schema.name, validation.table.name, :remove_validation_comment, validation.name, code_comment, <<~RUBY
81
- remove_validation_comment :#{validation.table.name}, :#{validation.name}
82
- RUBY
95
+ add_fragment schema: validation.table.schema,
96
+ table: validation.table,
97
+ migration_method: :remove_validation_comment,
98
+ object: validation,
99
+ code_comment: code_comment,
100
+ migration: <<~RUBY
101
+ remove_validation_comment :#{validation.table.name}, :#{validation.name}
102
+ RUBY
83
103
  end
84
104
  end
85
105
  end