dynamic_migrations 3.0.0 → 3.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (24) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +21 -6
  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/differences.rb +6 -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
@@ -22,15 +22,25 @@ module DynamicMigrations
22
22
 
23
23
  options_syntax = options.map { |k, v| "#{k}: #{v}" }.join(", ")
24
24
 
25
- add_migration primary_key.table.schema.name, primary_key.table.name, :add_primary_key, primary_key.name, code_comment, <<~RUBY
26
- add_primary_key :#{primary_key.table.name}, #{column_names}, #{options_syntax}
27
- RUBY
25
+ add_fragment schema: primary_key.table.schema,
26
+ table: primary_key.table,
27
+ migration_method: :add_primary_key,
28
+ object: primary_key,
29
+ code_comment: code_comment,
30
+ migration: <<~RUBY
31
+ add_primary_key :#{primary_key.table.name}, #{column_names}, #{options_syntax}
32
+ RUBY
28
33
  end
29
34
 
30
35
  def remove_primary_key primary_key, code_comment = nil
31
- add_migration primary_key.table.schema.name, primary_key.table.name, :remove_primary_key, primary_key.name, code_comment, <<~RUBY
32
- remove_primary_key :#{primary_key.table.name}, :#{primary_key.name}
33
- RUBY
36
+ add_fragment schema: primary_key.table.schema,
37
+ table: primary_key.table,
38
+ migration_method: :remove_primary_key,
39
+ object: primary_key,
40
+ code_comment: code_comment,
41
+ migration: <<~RUBY
42
+ remove_primary_key :#{primary_key.table.name}, :#{primary_key.name}
43
+ RUBY
34
44
  end
35
45
 
36
46
  def recreate_primary_key original_primary_key, updated_primary_key
@@ -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