declare_schema 0.9.0 → 0.11.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/declare_schema_build.yml +1 -1
- data/CHANGELOG.md +32 -0
- data/Gemfile.lock +1 -1
- data/README.md +12 -2
- data/lib/declare_schema.rb +12 -1
- data/lib/declare_schema/dsl.rb +39 -0
- data/lib/declare_schema/extensions/active_record/fields_declaration.rb +22 -3
- data/lib/declare_schema/model.rb +4 -6
- data/lib/declare_schema/model/column.rb +1 -1
- data/lib/declare_schema/model/foreign_key_definition.rb +6 -11
- data/lib/declare_schema/model/index_definition.rb +1 -20
- data/lib/declare_schema/schema_change/all.rb +22 -0
- data/lib/declare_schema/schema_change/base.rb +45 -0
- data/lib/declare_schema/schema_change/column_add.rb +27 -0
- data/lib/declare_schema/schema_change/column_change.rb +32 -0
- data/lib/declare_schema/schema_change/column_remove.rb +20 -0
- data/lib/declare_schema/schema_change/column_rename.rb +23 -0
- data/lib/declare_schema/schema_change/foreign_key_add.rb +25 -0
- data/lib/declare_schema/schema_change/foreign_key_remove.rb +20 -0
- data/lib/declare_schema/schema_change/index_add.rb +33 -0
- data/lib/declare_schema/schema_change/index_remove.rb +20 -0
- data/lib/declare_schema/schema_change/primary_key_change.rb +33 -0
- data/lib/declare_schema/schema_change/table_add.rb +37 -0
- data/lib/declare_schema/schema_change/table_change.rb +36 -0
- data/lib/declare_schema/schema_change/table_remove.rb +22 -0
- data/lib/declare_schema/schema_change/table_rename.rb +22 -0
- data/lib/declare_schema/version.rb +1 -1
- data/lib/generators/declare_schema/migration/USAGE +14 -24
- data/lib/generators/declare_schema/migration/migration_generator.rb +40 -38
- data/lib/generators/declare_schema/migration/migrator.rb +175 -177
- data/lib/generators/declare_schema/migration/templates/migration.rb.erb +3 -3
- data/lib/generators/declare_schema/support/model.rb +4 -4
- data/spec/lib/declare_schema/api_spec.rb +8 -8
- data/spec/lib/declare_schema/field_declaration_dsl_spec.rb +41 -15
- data/spec/lib/declare_schema/field_spec_spec.rb +2 -2
- data/spec/lib/declare_schema/generator_spec.rb +5 -5
- data/spec/lib/declare_schema/interactive_primary_key_spec.rb +117 -28
- data/spec/lib/declare_schema/migration_generator_spec.rb +1990 -843
- data/spec/lib/declare_schema/model/column_spec.rb +49 -23
- data/spec/lib/declare_schema/model/foreign_key_definition_spec.rb +158 -57
- data/spec/lib/declare_schema/model/habtm_model_shim_spec.rb +0 -2
- data/spec/lib/declare_schema/model/index_definition_spec.rb +189 -78
- data/spec/lib/declare_schema/model/table_options_definition_spec.rb +75 -11
- data/spec/lib/declare_schema/schema_change/base_spec.rb +75 -0
- data/spec/lib/declare_schema/schema_change/column_add_spec.rb +30 -0
- data/spec/lib/declare_schema/schema_change/column_change_spec.rb +33 -0
- data/spec/lib/declare_schema/schema_change/column_remove_spec.rb +30 -0
- data/spec/lib/declare_schema/schema_change/column_rename_spec.rb +28 -0
- data/spec/lib/declare_schema/schema_change/foreign_key_add_spec.rb +29 -0
- data/spec/lib/declare_schema/schema_change/foreign_key_remove_spec.rb +29 -0
- data/spec/lib/declare_schema/schema_change/index_add_spec.rb +56 -0
- data/spec/lib/declare_schema/schema_change/index_remove_spec.rb +29 -0
- data/spec/lib/declare_schema/schema_change/primary_key_change_spec.rb +69 -0
- data/spec/lib/declare_schema/schema_change/table_add_spec.rb +50 -0
- data/spec/lib/declare_schema/schema_change/table_change_spec.rb +30 -0
- data/spec/lib/declare_schema/schema_change/table_remove_spec.rb +27 -0
- data/spec/lib/declare_schema/schema_change/table_rename_spec.rb +27 -0
- data/spec/lib/generators/declare_schema/migration/migrator_spec.rb +59 -11
- data/spec/spec_helper.rb +1 -1
- data/spec/support/acceptance_spec_helpers.rb +2 -2
- metadata +35 -6
- data/test_responses.txt +0 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 389da0d9f9e0753e62297aeca33c3c73305d95082a3f50baf6288362011e6f52
|
4
|
+
data.tar.gz: 7d20d8ef4a085e37ec13273c020b8c3883e96359e9e4c7d173c3beccf5c73dab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0e4eb02bc1d989d648095b952e1feff00af9cbbc4ea3dbb7962f15fdbcafce2fac4bc93c467417d29396e6753993874c3c2faf882a620db0d54f3ea905195cf9
|
7
|
+
data.tar.gz: d504a96bb5f60d7c64b03fd975c9e7c78fe9614f06a0aa73fffe0c0987786a554e3f603a79198f962b13b0b869690b839fb1cd0215196353064360ef81e46e51
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,34 @@ Inspired by [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
4
4
|
|
5
5
|
Note: this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
6
6
|
|
7
|
+
## [0.11.1] - 2021-03-26
|
8
|
+
### Fixed
|
9
|
+
- Fixed a bug where up and down in generated migration would be empty in Rails 4.
|
10
|
+
|
11
|
+
## [0.11.0] - 2021-03-22
|
12
|
+
### Removed
|
13
|
+
- Removed `g|m|c` prompt entirely, since it was confusing. Instead, the migration is
|
14
|
+
always generated; the user may press ^C at the filename prompt to cancel.
|
15
|
+
The migration will be run if `--migrate` is passed; otherwise, the migrate command will be displayed to be run later.
|
16
|
+
### Added
|
17
|
+
- Added the new configuration option `DeclareSchema.@db_migrate_command =`.
|
18
|
+
### Fixed
|
19
|
+
- Fixed bug where foreign key constraint names are not globally unique
|
20
|
+
|
21
|
+
## [0.10.1] - 2021-03-18
|
22
|
+
### Fixed
|
23
|
+
- Migration steps are now generated in a defined dependency order, so that--for example--indexes that depend
|
24
|
+
on columns are deleted first, before the columns themselves are deleted (since the latter implicitly does the former, which would break the migration when run).
|
25
|
+
- Related to the above, down migration steps are now always generated in exactly the reverse order of the up migration steps.
|
26
|
+
|
27
|
+
## [0.10.0] - 2021-03-17
|
28
|
+
### Deprecated
|
29
|
+
- Deprecated the `fields` DSL method in favor of `declare_schema`.
|
30
|
+
|
31
|
+
### Added
|
32
|
+
- Added the `declare_schema` method to replace `fields`. We now expect a column's type to come before the name
|
33
|
+
i.e. `declare schema { string :title }`. Otherwise, there is no difference between `fields` and `declare_schema`.
|
34
|
+
|
7
35
|
## [0.9.0] - 2021-03-01
|
8
36
|
### Added
|
9
37
|
- Added configurable default settings for `default_text_limit`, `default_string_limit`, `default_null`,
|
@@ -140,6 +168,10 @@ using the appropriate Rails configuration attributes.
|
|
140
168
|
### Added
|
141
169
|
- Initial version from https://github.com/Invoca/hobo_fields v4.1.0.
|
142
170
|
|
171
|
+
[0.11.1]: https://github.com/Invoca/declare_schema/compare/v0.11.0...v0.11.1
|
172
|
+
[0.11.0]: https://github.com/Invoca/declare_schema/compare/v0.10.1...v0.11.0
|
173
|
+
[0.10.1]: https://github.com/Invoca/declare_schema/compare/v0.10.0...v0.10.1
|
174
|
+
[0.10.0]: https://github.com/Invoca/declare_schema/compare/v0.9.0...v0.10.0
|
143
175
|
[0.9.0]: https://github.com/Invoca/declare_schema/compare/v0.8.0...v0.9.0
|
144
176
|
[0.8.0]: https://github.com/Invoca/declare_schema/compare/v0.7.1...v0.8.0
|
145
177
|
[0.7.1]: https://github.com/Invoca/declare_schema/compare/v0.7.0...v0.7.1
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -57,7 +57,7 @@ during the initialization of your Rails application.
|
|
57
57
|
|
58
58
|
### before_generating_migration callback
|
59
59
|
|
60
|
-
During the
|
60
|
+
During the initialization process for generating migrations, `DeclareSchema` will
|
61
61
|
trigger the `eager_load!` on the `Rails` application and all `Rails::Engine`s loaded
|
62
62
|
into scope. If you need to generate migrations for models that aren't automatically loaded by `eager_load!`,
|
63
63
|
load them in the `before_generating_migration` block.
|
@@ -163,6 +163,16 @@ turn all tables into `utf8mb4` supporting tables:
|
|
163
163
|
DeclareSchema.default_charset = "utf8mb4"
|
164
164
|
DeclareSchema.default_collation = "utf8mb4_bin"
|
165
165
|
```
|
166
|
+
#### db:migrate Command
|
167
|
+
`declare_schema` can run the migration once it is generated, if the `--migrate` option is passed.
|
168
|
+
If not, it will display the command to run later. By default this command is
|
169
|
+
```
|
170
|
+
bundle exec rails db:migrate
|
171
|
+
```
|
172
|
+
If your repo has a different command to run for migrations, you can configure it like this:
|
173
|
+
```ruby
|
174
|
+
`DeclareSchema.db_migrate_command = "bundle exec rails db:migrate_immediate"`
|
175
|
+
```
|
166
176
|
|
167
177
|
## Declaring Character Set and Collation
|
168
178
|
_Note: This feature currently only works for MySQL database configurations._
|
@@ -228,5 +238,5 @@ or add it to your `bundler` Gemfile:
|
|
228
238
|
To run tests:
|
229
239
|
```
|
230
240
|
rake test:prepare_testapp[force]
|
231
|
-
rake test:all
|
241
|
+
rake test:all
|
232
242
|
```
|
data/lib/declare_schema.rb
CHANGED
@@ -28,10 +28,16 @@ module DeclareSchema
|
|
28
28
|
@default_null = false
|
29
29
|
@default_generate_foreign_keys = true
|
30
30
|
@default_generate_indexing = true
|
31
|
+
@db_migrate_command =
|
32
|
+
if ActiveSupport::VERSION::MAJOR < 5
|
33
|
+
"bundle exec rake db:migrate"
|
34
|
+
else
|
35
|
+
"bundle exec rails db:migrate"
|
36
|
+
end
|
31
37
|
|
32
38
|
class << self
|
33
39
|
attr_reader :default_charset, :default_collation, :default_text_limit, :default_string_limit, :default_null,
|
34
|
-
:default_generate_foreign_keys, :default_generate_indexing
|
40
|
+
:default_generate_foreign_keys, :default_generate_indexing, :db_migrate_command
|
35
41
|
|
36
42
|
def to_class(type)
|
37
43
|
case type
|
@@ -78,6 +84,11 @@ module DeclareSchema
|
|
78
84
|
generate_indexing.in?([true, false]) or raise ArgumentError, "generate_indexing must be either true or false (got #{generate_indexing.inspect})"
|
79
85
|
@default_generate_indexing = generate_indexing
|
80
86
|
end
|
87
|
+
|
88
|
+
def db_migrate_command=(db_migrate_command)
|
89
|
+
db_migrate_command.is_a?(String) or raise ArgumentError, "db_migrate_command must be a string (got #{db_migrate_command.inspect})"
|
90
|
+
@db_migrate_command = db_migrate_command
|
91
|
+
end
|
81
92
|
end
|
82
93
|
end
|
83
94
|
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_support/proxy_object'
|
4
|
+
|
5
|
+
module DeclareSchema
|
6
|
+
class Dsl < BasicObject # avoid Object because that gets extended by lots of gems
|
7
|
+
include ::Kernel # but we need the basic class methods
|
8
|
+
|
9
|
+
instance_methods.each do |m|
|
10
|
+
unless m.to_s.starts_with?('__') || m.in?([:object_id, :instance_eval])
|
11
|
+
undef_method(m)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(model, options = {})
|
16
|
+
@model = model
|
17
|
+
@options = options
|
18
|
+
end
|
19
|
+
|
20
|
+
attr_reader :model
|
21
|
+
|
22
|
+
def timestamps
|
23
|
+
field(:created_at, :datetime, null: true)
|
24
|
+
field(:updated_at, :datetime, null: true)
|
25
|
+
end
|
26
|
+
|
27
|
+
def optimistic_lock
|
28
|
+
field(:lock_version, :integer, default: 1, null: false)
|
29
|
+
end
|
30
|
+
|
31
|
+
def field(name, type, *args, **options)
|
32
|
+
@model.declare_field(name, type, *(args + [@options.merge(options)]))
|
33
|
+
end
|
34
|
+
|
35
|
+
def method_missing(type, name, *args)
|
36
|
+
field(name, type, *args)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -1,16 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'active_record'
|
4
|
+
require 'declare_schema/dsl'
|
4
5
|
require 'declare_schema/model'
|
5
6
|
require 'declare_schema/field_declaration_dsl'
|
6
7
|
|
7
8
|
module DeclareSchema
|
8
|
-
module
|
9
|
+
module Macros
|
9
10
|
def fields(table_options = {}, &block)
|
10
11
|
# Any model that calls 'fields' gets DeclareSchema::Model behavior
|
11
12
|
DeclareSchema::Model.mix_in(self)
|
12
13
|
|
13
|
-
# @include_in_migration = false #||= options.fetch(:include_in_migration, true); options.delete(:include_in_migration)
|
14
14
|
@include_in_migration = true
|
15
15
|
@table_options = table_options
|
16
16
|
|
@@ -23,7 +23,26 @@ module DeclareSchema
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
26
|
+
deprecate :fields, deprecator: ActiveSupport::Deprecation.new('1.0', 'DeclareSchema')
|
27
|
+
|
28
|
+
def declare_schema(table_options = {}, &block)
|
29
|
+
# Any model that calls 'fields' gets DeclareSchema::Model behavior
|
30
|
+
DeclareSchema::Model.mix_in(self)
|
31
|
+
|
32
|
+
# @include_in_migration = false #||= options.fetch(:include_in_migration, true); options.delete(:include_in_migration)
|
33
|
+
@include_in_migration = true # TODO: Add back or delete the include_in_migration feature
|
34
|
+
@table_options = table_options
|
35
|
+
|
36
|
+
if block
|
37
|
+
dsl = DeclareSchema::Dsl.new(self, null: false)
|
38
|
+
if block.arity == 1
|
39
|
+
yield dsl
|
40
|
+
else
|
41
|
+
dsl.instance_eval(&block)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
26
45
|
end
|
27
46
|
end
|
28
47
|
|
29
|
-
ActiveRecord::Base.singleton_class.prepend DeclareSchema::
|
48
|
+
ActiveRecord::Base.singleton_class.prepend DeclareSchema::Macros
|
data/lib/declare_schema/model.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'rails'
|
4
|
-
|
5
3
|
require 'declare_schema/extensions/module'
|
6
4
|
|
7
5
|
module DeclareSchema
|
@@ -41,7 +39,7 @@ module DeclareSchema
|
|
41
39
|
eval <<~EOS
|
42
40
|
def self.inherited(klass)
|
43
41
|
unless klass.field_specs.has_key?(inheritance_column)
|
44
|
-
|
42
|
+
declare_schema do |f|
|
45
43
|
f.field(inheritance_column, :string, limit: 255, null: true)
|
46
44
|
end
|
47
45
|
index(inheritance_column)
|
@@ -130,7 +128,7 @@ module DeclareSchema
|
|
130
128
|
|
131
129
|
fk_options[:dependent] = options.delete(:far_end_dependent) if options.has_key?(:far_end_dependent)
|
132
130
|
|
133
|
-
if
|
131
|
+
if ActiveSupport::VERSION::MAJOR >= 5
|
134
132
|
super
|
135
133
|
else
|
136
134
|
super(name, scope, options.except(:optional))
|
@@ -149,7 +147,7 @@ module DeclareSchema
|
|
149
147
|
end
|
150
148
|
end
|
151
149
|
|
152
|
-
if ::
|
150
|
+
if ::ActiveSupport::VERSION::MAJOR < 5
|
153
151
|
def primary_key
|
154
152
|
super || 'id'
|
155
153
|
end
|
@@ -227,7 +225,7 @@ module DeclareSchema
|
|
227
225
|
ActiveRecord::Coders::JSON
|
228
226
|
elsif [:load, :dump].all? { |x| class_name_or_coder.respond_to?(x) }
|
229
227
|
class_name_or_coder
|
230
|
-
elsif
|
228
|
+
elsif ActiveSupport::VERSION::MAJOR >= 5
|
231
229
|
ActiveRecord::Coders::YAMLColumn.new(attr_name, class_name_or_coder)
|
232
230
|
else
|
233
231
|
ActiveRecord::Coders::YAMLColumn.new(class_name_or_coder)
|
@@ -53,7 +53,7 @@ module DeclareSchema
|
|
53
53
|
def deserialize_default_value(column, type, default_value)
|
54
54
|
type or raise ArgumentError, "must pass type; got #{type.inspect}"
|
55
55
|
|
56
|
-
case
|
56
|
+
case ActiveSupport::VERSION::MAJOR
|
57
57
|
when 4
|
58
58
|
# TODO: Delete this Rails 4 support ASAP! This could be wrong, since it's using the type of the old column...which
|
59
59
|
# might be getting migrated to a new type. We should be using just type as below. -Colin
|
@@ -7,20 +7,20 @@ module DeclareSchema
|
|
7
7
|
class ForeignKeyDefinition
|
8
8
|
include Comparable
|
9
9
|
|
10
|
-
attr_reader :constraint_name, :model, :foreign_key, :foreign_key_name, :options, :on_delete_cascade
|
10
|
+
attr_reader :constraint_name, :model, :foreign_key, :foreign_key_name, :parent_table_name, :child_table_name, :options, :on_delete_cascade
|
11
|
+
|
11
12
|
|
12
13
|
def initialize(model, foreign_key, options = {})
|
13
14
|
@model = model
|
14
15
|
@foreign_key = foreign_key.to_s.presence
|
15
16
|
@options = options
|
16
17
|
|
17
|
-
@
|
18
|
+
@child_table_name = model.table_name # unless a table rename, which would happen when a class is renamed??
|
18
19
|
@parent_table_name = options[:parent_table]&.to_s
|
19
20
|
@foreign_key_name = options[:foreign_key]&.to_s || @foreign_key
|
20
21
|
|
21
|
-
@constraint_name = options[:constraint_name]&.to_s ||
|
22
|
-
|
23
|
-
IndexDefinition.index_name(@foreign_key_name)
|
22
|
+
@constraint_name = options[:constraint_name]&.to_s.presence ||
|
23
|
+
model.connection.index_name(model.table_name, column: @foreign_key_name)
|
24
24
|
@on_delete_cascade = options[:dependent] == :delete
|
25
25
|
end
|
26
26
|
|
@@ -61,11 +61,6 @@ module DeclareSchema
|
|
61
61
|
foreign_key.sub(/_id\z/, '').camelize.constantize.table_name
|
62
62
|
end
|
63
63
|
|
64
|
-
def to_add_statement
|
65
|
-
"add_foreign_key(#{@child_table.inspect}, #{parent_table_name.inspect}, " +
|
66
|
-
"column: #{@foreign_key_name.inspect}, name: #{@constraint_name.inspect})"
|
67
|
-
end
|
68
|
-
|
69
64
|
def <=>(rhs)
|
70
65
|
key <=> rhs.send(:key)
|
71
66
|
end
|
@@ -75,7 +70,7 @@ module DeclareSchema
|
|
75
70
|
private
|
76
71
|
|
77
72
|
def key
|
78
|
-
@key ||= [@
|
73
|
+
@key ||= [@child_table_name, parent_table_name, @foreign_key_name, @on_delete_cascade].map(&:to_s)
|
79
74
|
end
|
80
75
|
|
81
76
|
def hash
|
@@ -68,7 +68,7 @@ module DeclareSchema
|
|
68
68
|
|
69
69
|
# This is the old approach which is still needed for MySQL in Rails 4 and SQLite
|
70
70
|
def sqlite_compound_primary_key(model, table)
|
71
|
-
ActiveRecord::Base.connection.class.name.match?(/SQLite3Adapter/) ||
|
71
|
+
ActiveRecord::Base.connection.class.name.match?(/SQLite3Adapter/) || ActiveSupport::VERSION::MAJOR < 5 or return nil
|
72
72
|
|
73
73
|
connection = model.connection.dup
|
74
74
|
|
@@ -93,25 +93,6 @@ module DeclareSchema
|
|
93
93
|
name == PRIMARY_KEY_NAME
|
94
94
|
end
|
95
95
|
|
96
|
-
def to_add_statement(new_table_name, existing_primary_key = nil)
|
97
|
-
if primary_key? && !ActiveRecord::Base.connection.class.name.match?(/SQLite3Adapter/)
|
98
|
-
to_add_primary_key_statement(new_table_name, existing_primary_key)
|
99
|
-
else
|
100
|
-
# Note: + below keeps that interpolated string from being frozen, so we can << into it.
|
101
|
-
r = +"add_index #{new_table_name.to_sym.inspect}, #{fields.map(&:to_sym).inspect}"
|
102
|
-
r << ", unique: true" if unique
|
103
|
-
r << ", where: '#{where}'" if where.present?
|
104
|
-
r << ", name: '#{name}'"
|
105
|
-
r
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
def to_add_primary_key_statement(new_table_name, existing_primary_key)
|
110
|
-
drop = "DROP PRIMARY KEY, " if existing_primary_key
|
111
|
-
statement = "ALTER TABLE #{new_table_name} #{drop}ADD PRIMARY KEY (#{fields.join(', ')})"
|
112
|
-
"execute #{statement.inspect}"
|
113
|
-
end
|
114
|
-
|
115
96
|
def to_key
|
116
97
|
@key ||= [table, fields, name, unique, where].map(&:to_s)
|
117
98
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DeclareSchema
|
4
|
+
module SchemaChange
|
5
|
+
module All
|
6
|
+
end
|
7
|
+
autoload :Base, 'declare_schema/schema_change/base'
|
8
|
+
autoload :ColumnAdd, 'declare_schema/schema_change/column_add'
|
9
|
+
autoload :ColumnChange, 'declare_schema/schema_change/column_change'
|
10
|
+
autoload :ColumnRename, 'declare_schema/schema_change/column_rename'
|
11
|
+
autoload :ForeignKeyAdd, 'declare_schema/schema_change/foreign_key_add'
|
12
|
+
autoload :ForeignKeyRemove, 'declare_schema/schema_change/foreign_key_remove'
|
13
|
+
autoload :IndexAdd, 'declare_schema/schema_change/index_add'
|
14
|
+
autoload :IndexRemove, 'declare_schema/schema_change/index_remove'
|
15
|
+
autoload :PrimaryKeyChange, 'declare_schema/schema_change/primary_key_change'
|
16
|
+
autoload :TableAdd, 'declare_schema/schema_change/table_add'
|
17
|
+
autoload :TableChange, 'declare_schema/schema_change/table_change'
|
18
|
+
autoload :TableRemove, 'declare_schema/schema_change/table_remove'
|
19
|
+
autoload :TableRename, 'declare_schema/schema_change/table_rename'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'base'
|
4
|
+
|
5
|
+
module DeclareSchema
|
6
|
+
module SchemaChange
|
7
|
+
class Base
|
8
|
+
class << self
|
9
|
+
def format_options(options)
|
10
|
+
options.map do |k, v|
|
11
|
+
value =
|
12
|
+
if v.is_a?(Hash)
|
13
|
+
"{ #{format_options(v).join(', ')} }"
|
14
|
+
else
|
15
|
+
v.inspect
|
16
|
+
end
|
17
|
+
if k.is_a?(Symbol)
|
18
|
+
"#{k}: #{value}"
|
19
|
+
else
|
20
|
+
"#{k.inspect} => #{value}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def up
|
27
|
+
up_command + spacing(up_command)
|
28
|
+
end
|
29
|
+
|
30
|
+
def down
|
31
|
+
down_command + spacing(down_command)
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def spacing(command)
|
37
|
+
if command["\n"]
|
38
|
+
"\n\n"
|
39
|
+
else
|
40
|
+
"\n"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'base'
|
4
|
+
|
5
|
+
module DeclareSchema
|
6
|
+
module SchemaChange
|
7
|
+
class ColumnAdd < Base
|
8
|
+
def initialize(table_name, column_name, column_type, **column_options)
|
9
|
+
@table_name = table_name
|
10
|
+
@column_name = column_name
|
11
|
+
@column_type = column_type
|
12
|
+
@column_options = column_options
|
13
|
+
end
|
14
|
+
|
15
|
+
def up_command
|
16
|
+
"add_column #{[@table_name.to_sym.inspect,
|
17
|
+
@column_name.to_sym.inspect,
|
18
|
+
@column_type.to_sym.inspect,
|
19
|
+
*self.class.format_options(@column_options)].join(", ")}"
|
20
|
+
end
|
21
|
+
|
22
|
+
def down_command
|
23
|
+
"remove_column #{@table_name.to_sym.inspect}, #{@column_name.to_sym.inspect}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|