declare_schema 0.10.0 → 0.12.0.pre.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +31 -1
- data/Gemfile.lock +1 -1
- data/README.md +16 -6
- data/lib/declare_schema.rb +12 -1
- data/lib/declare_schema/extensions/active_record/fields_declaration.rb +4 -2
- data/lib/declare_schema/model.rb +59 -15
- data/lib/declare_schema/model/column.rb +2 -2
- data/lib/declare_schema/model/field_spec.rb +4 -4
- data/lib/declare_schema/model/foreign_key_definition.rb +6 -11
- data/lib/declare_schema/model/habtm_model_shim.rb +2 -2
- data/lib/declare_schema/model/index_definition.rb +8 -25
- 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 +190 -187
- data/lib/generators/declare_schema/migration/templates/migration.rb.erb +3 -3
- data/spec/lib/declare_schema/api_spec.rb +3 -1
- data/spec/lib/declare_schema/field_spec_spec.rb +3 -3
- data/spec/lib/declare_schema/generator_spec.rb +2 -2
- data/spec/lib/declare_schema/interactive_primary_key_spec.rb +60 -25
- data/spec/lib/declare_schema/migration_generator_spec.rb +471 -377
- data/spec/lib/declare_schema/model/column_spec.rb +2 -6
- data/spec/lib/declare_schema/model/foreign_key_definition_spec.rb +28 -16
- data/spec/lib/declare_schema/model/habtm_model_shim_spec.rb +4 -6
- data/spec/lib/declare_schema/model/index_definition_spec.rb +4 -4
- 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 +34 -5
@@ -1,9 +1,9 @@
|
|
1
|
-
class <%= @migration_class_name %> < (
|
1
|
+
class <%= @migration_class_name %> < (ActiveSupport::VERSION::MAJOR >= 5 ? ActiveRecord::Migration[4.2] : ActiveRecord::Migration)
|
2
2
|
def self.up
|
3
|
-
<%= @up %>
|
3
|
+
<%= @up.presence or raise "no @up given!" %>
|
4
4
|
end
|
5
5
|
|
6
6
|
def self.down
|
7
|
-
<%= @down %>
|
7
|
+
<%= @down.presence or raise "no @down given!" %>
|
8
8
|
end
|
9
9
|
end
|
@@ -39,12 +39,14 @@ RSpec.describe 'DeclareSchema API' do
|
|
39
39
|
|
40
40
|
load_models
|
41
41
|
|
42
|
-
if
|
42
|
+
if ActiveSupport::VERSION::MAJOR == 5
|
43
43
|
# TODO: get this to work on Travis for Rails 6
|
44
|
+
# TODO: uncomment since we're not on Travis any more? -Colin
|
44
45
|
generate_migrations '-n', '-m'
|
45
46
|
end
|
46
47
|
|
47
48
|
require 'advert'
|
49
|
+
Advert.reset_primary_key
|
48
50
|
|
49
51
|
## The Basics
|
50
52
|
|
@@ -6,13 +6,13 @@ rescue LoadError
|
|
6
6
|
end
|
7
7
|
|
8
8
|
RSpec.describe DeclareSchema::Model::FieldSpec do
|
9
|
-
let(:model) { double('model',
|
9
|
+
let(:model) { double('model', _table_options: {}, _declared_primary_key: 'id') }
|
10
10
|
let(:col_spec) { double('col_spec', type: :string) }
|
11
11
|
|
12
12
|
before do
|
13
13
|
load File.expand_path('prepare_testapp.rb', __dir__)
|
14
14
|
|
15
|
-
if
|
15
|
+
if ActiveSupport::VERSION::MAJOR < 5
|
16
16
|
allow(col_spec).to receive(:type_cast_from_database, &:itself)
|
17
17
|
end
|
18
18
|
end
|
@@ -184,7 +184,7 @@ RSpec.describe DeclareSchema::Model::FieldSpec do
|
|
184
184
|
|
185
185
|
describe '#schema_attributes' do
|
186
186
|
let(:col_spec) do
|
187
|
-
case
|
187
|
+
case ActiveSupport::VERSION::MAJOR
|
188
188
|
when 4
|
189
189
|
cast_type = ActiveRecord::Type::Integer.new(limit: 8)
|
190
190
|
ActiveRecord::ConnectionAdapters::Column.new("price", nil, cast_type, "integer(8)", false)
|
@@ -27,7 +27,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
27
27
|
end
|
28
28
|
EOS
|
29
29
|
|
30
|
-
case
|
30
|
+
case ActiveSupport::VERSION::MAJOR
|
31
31
|
when 4, 5
|
32
32
|
expect_test_definition_to_eq('alpha/beta', <<~EOS)
|
33
33
|
require "test_helper"
|
@@ -50,7 +50,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
50
50
|
EOS
|
51
51
|
end
|
52
52
|
|
53
|
-
case
|
53
|
+
case ActiveSupport::VERSION::MAJOR
|
54
54
|
when 4
|
55
55
|
expect_test_fixture_to_eq('alpha/beta', <<~EOS)
|
56
56
|
# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
|
@@ -1,6 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'rails'
|
4
3
|
begin
|
5
4
|
require 'mysql2'
|
6
5
|
rescue LoadError
|
@@ -20,7 +19,7 @@ RSpec.describe 'DeclareSchema Migration Generator interactive primary key' do
|
|
20
19
|
end
|
21
20
|
|
22
21
|
generate_migrations '-n', '-m'
|
23
|
-
expect(Foo.
|
22
|
+
expect(Foo._declared_primary_key).to eq('foo_id')
|
24
23
|
|
25
24
|
### migrate from
|
26
25
|
# rename from custom primary_key
|
@@ -32,13 +31,38 @@ RSpec.describe 'DeclareSchema Migration Generator interactive primary key' do
|
|
32
31
|
|
33
32
|
allow_any_instance_of(DeclareSchema::Support::ThorShell).to receive(:ask).with(/one of the rename choices or press enter to keep/) { 'id' }
|
34
33
|
generate_migrations '-n', '-m'
|
35
|
-
expect(Foo.
|
34
|
+
expect(Foo._declared_primary_key).to eq('id')
|
36
35
|
|
37
36
|
nuke_model_class(Foo)
|
38
37
|
|
39
|
-
|
38
|
+
# The ActiveRecord sqlite3 driver has a bug where rename_column recreates the entire table, but forgets to set the primary key:
|
39
|
+
#
|
40
|
+
# [7] pry(#<RSpec::ExampleGroups::DeclareSchemaMigrationGeneratorInteractivePrimaryKey>)> u = 'rename_column :foos, :foo_id, :id'
|
41
|
+
# => "rename_column :foos, :foo_id, :id"
|
42
|
+
# [8] pry(#<RSpec::ExampleGroups::DeclareSchemaMigrationGeneratorInteractivePrimaryKey>)> ActiveRecord::Migration.class_eval(u)
|
43
|
+
# (0.0ms) begin transaction
|
44
|
+
# (pry):17
|
45
|
+
# (0.2ms) CREATE TEMPORARY TABLE "afoos" ("id" integer NOT NULL)
|
46
|
+
# (pry):17
|
47
|
+
# (0.1ms) INSERT INTO "afoos" ("id")
|
48
|
+
#
|
49
|
+
# (pry):17
|
50
|
+
# (0.4ms) DROP TABLE "foos"
|
51
|
+
# (pry):17
|
52
|
+
# (0.1ms) CREATE TABLE "foos" ("id" integer NOT NULL)
|
53
|
+
# (pry):17
|
54
|
+
# (0.1ms) INSERT INTO "foos" ("id")
|
55
|
+
#
|
56
|
+
# (pry):17
|
57
|
+
# (0.1ms) DROP TABLE "afoos"
|
58
|
+
# (pry):17
|
59
|
+
# (0.9ms) commit transaction
|
60
|
+
if defined?(SQLite3)
|
61
|
+
ActiveRecord::Base.connection.execute("drop table foos")
|
62
|
+
ActiveRecord::Base.connection.execute("CREATE TABLE foos (id integer PRIMARY KEY AUTOINCREMENT NOT NULL)")
|
63
|
+
end
|
40
64
|
|
41
|
-
if
|
65
|
+
if ActiveSupport::VERSION::MAJOR >= 5 && !defined?(Mysql2) # TODO TECH-4814 Put this test back for Mysql2
|
42
66
|
# replace custom primary_key
|
43
67
|
class Foo < ActiveRecord::Base
|
44
68
|
fields do
|
@@ -48,13 +72,7 @@ RSpec.describe 'DeclareSchema Migration Generator interactive primary key' do
|
|
48
72
|
|
49
73
|
allow_any_instance_of(DeclareSchema::Support::ThorShell).to receive(:ask).with(/one of the rename choices or press enter to keep/) { 'drop id' }
|
50
74
|
generate_migrations '-n', '-m'
|
51
|
-
expect(Foo.
|
52
|
-
|
53
|
-
### ensure it doesn't cause further migrations
|
54
|
-
|
55
|
-
# check no further migrations
|
56
|
-
up = Generators::DeclareSchema::Migration::Migrator.run.first
|
57
|
-
expect(up).to eq("")
|
75
|
+
expect(Foo._declared_primary_key).to eq('foo_id')
|
58
76
|
end
|
59
77
|
end
|
60
78
|
end
|
@@ -62,8 +80,7 @@ RSpec.describe 'DeclareSchema Migration Generator interactive primary key' do
|
|
62
80
|
context 'Using declare_schema' do
|
63
81
|
it "allows alternate primary keys" do
|
64
82
|
class Foo < ActiveRecord::Base
|
65
|
-
declare_schema
|
66
|
-
end
|
83
|
+
declare_schema { }
|
67
84
|
self.primary_key = "foo_id"
|
68
85
|
end
|
69
86
|
|
@@ -73,21 +90,45 @@ RSpec.describe 'DeclareSchema Migration Generator interactive primary key' do
|
|
73
90
|
### migrate from
|
74
91
|
# rename from custom primary_key
|
75
92
|
class Foo < ActiveRecord::Base
|
76
|
-
declare_schema
|
77
|
-
end
|
93
|
+
declare_schema { }
|
78
94
|
self.primary_key = "id"
|
79
95
|
end
|
80
96
|
|
81
97
|
puts "\n\e[45m Please enter 'id' (no quotes) at the next prompt \e[0m"
|
82
98
|
allow_any_instance_of(DeclareSchema::Support::ThorShell).to receive(:ask).with(/one of the rename choices or press enter to keep/) { 'id' }
|
83
99
|
generate_migrations '-n', '-m'
|
84
|
-
expect(Foo.
|
100
|
+
expect(Foo._declared_primary_key).to eq('id')
|
85
101
|
|
86
102
|
nuke_model_class(Foo)
|
87
103
|
|
88
|
-
|
104
|
+
# The ActiveRecord sqlite3 driver has a bug where rename_column recreates the entire table, but forgets to set the primary key:
|
105
|
+
#
|
106
|
+
# [7] pry(#<RSpec::ExampleGroups::DeclareSchemaMigrationGeneratorInteractivePrimaryKey>)> u = 'rename_column :foos, :foo_id, :id'
|
107
|
+
# => "rename_column :foos, :foo_id, :id"
|
108
|
+
# [8] pry(#<RSpec::ExampleGroups::DeclareSchemaMigrationGeneratorInteractivePrimaryKey>)> ActiveRecord::Migration.class_eval(u)
|
109
|
+
# (0.0ms) begin transaction
|
110
|
+
# (pry):17
|
111
|
+
# (0.2ms) CREATE TEMPORARY TABLE "afoos" ("id" integer NOT NULL)
|
112
|
+
# (pry):17
|
113
|
+
# (0.1ms) INSERT INTO "afoos" ("id")
|
114
|
+
#
|
115
|
+
# (pry):17
|
116
|
+
# (0.4ms) DROP TABLE "foos"
|
117
|
+
# (pry):17
|
118
|
+
# (0.1ms) CREATE TABLE "foos" ("id" integer NOT NULL)
|
119
|
+
# (pry):17
|
120
|
+
# (0.1ms) INSERT INTO "foos" ("id")
|
121
|
+
#
|
122
|
+
# (pry):17
|
123
|
+
# (0.1ms) DROP TABLE "afoos"
|
124
|
+
# (pry):17
|
125
|
+
# (0.9ms) commit transaction
|
126
|
+
if defined?(SQLite3)
|
127
|
+
ActiveRecord::Base.connection.execute("drop table foos")
|
128
|
+
ActiveRecord::Base.connection.execute("CREATE TABLE foos (id integer PRIMARY KEY AUTOINCREMENT NOT NULL)")
|
129
|
+
end
|
89
130
|
|
90
|
-
if
|
131
|
+
if ActiveSupport::VERSION::MAJOR >= 5 && !defined?(Mysql2) # TODO TECH-4814 Put this test back for Mysql2
|
91
132
|
# replace custom primary_key
|
92
133
|
class Foo < ActiveRecord::Base
|
93
134
|
declare_schema do
|
@@ -99,12 +140,6 @@ RSpec.describe 'DeclareSchema Migration Generator interactive primary key' do
|
|
99
140
|
allow_any_instance_of(DeclareSchema::Support::ThorShell).to receive(:ask).with(/one of the rename choices or press enter to keep/) { 'drop id' }
|
100
141
|
generate_migrations '-n', '-m'
|
101
142
|
expect(Foo.primary_key).to eq('foo_id')
|
102
|
-
|
103
|
-
### ensure it doesn't cause further migrations
|
104
|
-
|
105
|
-
# check no further migrations
|
106
|
-
up = Generators::DeclareSchema::Migration::Migrator.run.first
|
107
|
-
expect(up).to eq("")
|
108
143
|
end
|
109
144
|
end
|
110
145
|
end
|
@@ -1,25 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'rails'
|
4
3
|
begin
|
5
4
|
require 'mysql2'
|
6
5
|
rescue LoadError
|
7
6
|
end
|
8
7
|
|
8
|
+
begin
|
9
|
+
require 'sqlite3'
|
10
|
+
rescue LoadError
|
11
|
+
end
|
12
|
+
|
9
13
|
RSpec.describe 'DeclareSchema Migration Generator' do
|
10
14
|
before do
|
11
15
|
load File.expand_path('prepare_testapp.rb', __dir__)
|
12
16
|
end
|
13
|
-
|
14
|
-
let(:charset_alter_table) do
|
15
|
-
if defined?(Mysql2)
|
16
|
-
<<~EOS
|
17
|
-
|
18
|
-
|
19
|
-
execute "ALTER TABLE `adverts` CHARACTER SET utf8mb4 COLLATE utf8mb4_bin"
|
20
|
-
EOS
|
21
|
-
end
|
22
|
-
end
|
23
17
|
let(:text_limit) do
|
24
18
|
if defined?(Mysql2)
|
25
19
|
", limit: 4294967295"
|
@@ -30,21 +24,26 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
30
24
|
', charset: "utf8mb4", collation: "utf8mb4_bin"'
|
31
25
|
end
|
32
26
|
end
|
27
|
+
let(:create_table_charset_and_collation) do
|
28
|
+
if defined?(Mysql2)
|
29
|
+
", options: \"CHARACTER SET utf8mb4 COLLATE utf8mb4_bin\""
|
30
|
+
end
|
31
|
+
end
|
33
32
|
let(:datetime_precision) do
|
34
|
-
if defined?(Mysql2) &&
|
33
|
+
if defined?(Mysql2) && ActiveSupport::VERSION::MAJOR >= 5
|
35
34
|
', precision: 0'
|
36
35
|
end
|
37
36
|
end
|
38
37
|
let(:table_options) do
|
39
38
|
if defined?(Mysql2)
|
40
|
-
", options: \"#{'ENGINE=InnoDB ' if
|
41
|
-
if
|
39
|
+
", options: \"#{'ENGINE=InnoDB ' if ActiveSupport::VERSION::MAJOR == 5}DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\"" +
|
40
|
+
if ActiveSupport::VERSION::MAJOR >= 6
|
42
41
|
', charset: "utf8mb4", collation: "utf8mb4_bin"'
|
43
42
|
else
|
44
43
|
''
|
45
44
|
end
|
46
45
|
else
|
47
|
-
", id: :integer" unless
|
46
|
+
", id: :integer" unless ActiveSupport::VERSION::MAJOR < 5
|
48
47
|
end
|
49
48
|
end
|
50
49
|
let(:lock_version_limit) do
|
@@ -81,9 +80,9 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
81
80
|
up, _ = Generators::DeclareSchema::Migration::Migrator.run.tap do |migrations|
|
82
81
|
expect(migrations).to(
|
83
82
|
migrate_up(<<~EOS.strip)
|
84
|
-
create_table :adverts, id: :bigint do |t|
|
83
|
+
create_table :adverts, id: :bigint#{create_table_charset_and_collation} do |t|
|
85
84
|
t.string :name, limit: 250, null: true#{charset_and_collation}
|
86
|
-
end
|
85
|
+
end
|
87
86
|
EOS
|
88
87
|
.and migrate_down("drop_table :adverts")
|
89
88
|
)
|
@@ -92,7 +91,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
92
91
|
ActiveRecord::Migration.class_eval(up)
|
93
92
|
expect(Advert.columns.map(&:name)).to eq(["id", "name"])
|
94
93
|
|
95
|
-
if
|
94
|
+
if ActiveSupport::VERSION::MAJOR < 5
|
96
95
|
# Rails 4 drivers don't always create PK properly. Fix that by dropping and recreating.
|
97
96
|
ActiveRecord::Base.connection.execute("drop table adverts")
|
98
97
|
if defined?(Mysql2)
|
@@ -119,8 +118,8 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
119
118
|
add_column :adverts, :published_at, :datetime, null: true
|
120
119
|
EOS
|
121
120
|
.and migrate_down(<<~EOS.strip)
|
122
|
-
remove_column :adverts, :body
|
123
121
|
remove_column :adverts, :published_at
|
122
|
+
remove_column :adverts, :body
|
124
123
|
EOS
|
125
124
|
)
|
126
125
|
|
@@ -152,8 +151,8 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
152
151
|
remove_column :adverts, :name
|
153
152
|
EOS
|
154
153
|
.and migrate_down(<<~EOS.strip)
|
155
|
-
remove_column :adverts, :title
|
156
154
|
add_column :adverts, :name, :string, limit: 250, null: true#{charset_and_collation}
|
155
|
+
remove_column :adverts, :title
|
157
156
|
EOS
|
158
157
|
)
|
159
158
|
|
@@ -370,17 +369,13 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
370
369
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
371
370
|
migrate_up(<<~EOS.strip)
|
372
371
|
add_column :adverts, :category_id, :integer, limit: 8, null: false
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
#{"add_foreign_key(\"adverts\", \"categories\", column: \"category_id\", name: \"on_category_id\")\n" if defined?(Mysql2)}
|
372
|
+
add_index :adverts, [:category_id], name: :on_category_id
|
373
|
+
#{"add_foreign_key :adverts, :categories, column: :category_id, name: :index_adverts_on_category_id" if defined?(Mysql2)}
|
377
374
|
EOS
|
378
375
|
.and migrate_down(<<~EOS.strip)
|
376
|
+
#{"remove_foreign_key :adverts, name: :index_adverts_on_category_id" if defined?(Mysql2)}
|
377
|
+
remove_index :adverts, name: :on_category_id
|
379
378
|
remove_column :adverts, :category_id
|
380
|
-
|
381
|
-
remove_index :adverts, name: :on_category_id rescue ActiveRecord::StatementInvalid
|
382
|
-
|
383
|
-
#{"remove_foreign_key(\"adverts\", name: \"on_category_id\")\n" if defined?(Mysql2)}
|
384
379
|
EOS
|
385
380
|
)
|
386
381
|
|
@@ -398,11 +393,9 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
398
393
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
399
394
|
migrate_up(<<~EOS.strip)
|
400
395
|
add_column :adverts, :c_id, :integer, limit: 8, null: false
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
#{"add_foreign_key(\"adverts\", \"categories\", column: \"category_id\", name: \"on_category_id\")\n" +
|
405
|
-
"add_foreign_key(\"adverts\", \"categories\", column: \"c_id\", name: \"on_c_id\")" if defined?(Mysql2)}
|
396
|
+
add_index :adverts, [:c_id], name: :on_c_id
|
397
|
+
#{"add_foreign_key :adverts, :categories, column: :category_id, name: :index_adverts_on_category_id\n" +
|
398
|
+
"add_foreign_key :adverts, :categories, column: :c_id, name: :index_adverts_on_c_id" if defined?(Mysql2)}
|
406
399
|
EOS
|
407
400
|
)
|
408
401
|
|
@@ -420,9 +413,8 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
420
413
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
421
414
|
migrate_up(<<~EOS.strip)
|
422
415
|
add_column :adverts, :category_id, :integer, limit: 8, null: false
|
423
|
-
|
424
|
-
|
425
|
-
"add_foreign_key(\"adverts\", \"categories\", column: \"c_id\", name: \"on_c_id\")" if defined?(Mysql2)}
|
416
|
+
#{"add_foreign_key :adverts, :categories, column: :category_id, name: :index_adverts_on_category_id\n" +
|
417
|
+
"add_foreign_key :adverts, :categories, column: :c_id, name: :index_adverts_on_c_id" if defined?(Mysql2)}
|
426
418
|
EOS
|
427
419
|
)
|
428
420
|
|
@@ -440,21 +432,19 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
440
432
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
441
433
|
migrate_up(<<~EOS.strip)
|
442
434
|
add_column :adverts, :category_id, :integer, limit: 8, null: false
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
#{"add_foreign_key(\"adverts\", \"categories\", column: \"category_id\", name: \"on_category_id\")\n" +
|
447
|
-
"add_foreign_key(\"adverts\", \"categories\", column: \"c_id\", name: \"on_c_id\")" if defined?(Mysql2)}
|
435
|
+
add_index :adverts, [:category_id], name: :my_index
|
436
|
+
#{"add_foreign_key :adverts, :categories, column: :category_id, name: :index_adverts_on_category_id\n" +
|
437
|
+
"add_foreign_key :adverts, :categories, column: :c_id, name: :index_adverts_on_c_id" if defined?(Mysql2)}
|
448
438
|
EOS
|
449
439
|
)
|
450
440
|
|
451
441
|
Advert.field_specs.delete(:category_id)
|
452
442
|
Advert.index_definitions.delete_if { |spec| spec.fields == ["category_id"] }
|
453
443
|
|
454
|
-
### Timestamps and
|
444
|
+
### Timestamps and Optimistic Locking
|
455
445
|
|
456
446
|
# `updated_at` and `created_at` can be declared with the shorthand `timestamps`.
|
457
|
-
# Similarly, `lock_version` can be declared with the "shorthand" `
|
447
|
+
# Similarly, `lock_version` can be declared with the "shorthand" `optimistic_lock`.
|
458
448
|
|
459
449
|
class Advert < ActiveRecord::Base
|
460
450
|
fields do
|
@@ -468,17 +458,15 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
468
458
|
add_column :adverts, :created_at, :datetime, null: true
|
469
459
|
add_column :adverts, :updated_at, :datetime, null: true
|
470
460
|
add_column :adverts, :lock_version, :integer#{lock_version_limit}, null: false, default: 1
|
471
|
-
|
472
|
-
|
473
|
-
"add_foreign_key(\"adverts\", \"categories\", column: \"c_id\", name: \"on_c_id\")" if defined?(Mysql2)}
|
461
|
+
#{"add_foreign_key :adverts, :categories, column: :category_id, name: :index_adverts_on_category_id\n" +
|
462
|
+
"add_foreign_key :adverts, :categories, column: :c_id, name: :index_adverts_on_c_id" if defined?(Mysql2)}
|
474
463
|
EOS
|
475
464
|
.and migrate_down(<<~EOS.strip)
|
476
|
-
|
477
|
-
|
465
|
+
#{"remove_foreign_key :adverts, name: :index_adverts_on_c_id\n" +
|
466
|
+
"remove_foreign_key :adverts, name: :index_adverts_on_category_id" if defined?(Mysql2)}
|
478
467
|
remove_column :adverts, :lock_version
|
479
|
-
|
480
|
-
|
481
|
-
"remove_foreign_key(\"adverts\", name: \"on_c_id\")" if defined?(Mysql2)}
|
468
|
+
remove_column :adverts, :updated_at
|
469
|
+
remove_column :adverts, :created_at
|
482
470
|
EOS
|
483
471
|
)
|
484
472
|
|
@@ -499,11 +487,9 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
499
487
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
500
488
|
migrate_up(<<~EOS.strip)
|
501
489
|
add_column :adverts, :title, :string, limit: 250, null: true#{charset_and_collation}
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
#{"add_foreign_key(\"adverts\", \"categories\", column: \"category_id\", name: \"on_category_id\")\n" +
|
506
|
-
"add_foreign_key(\"adverts\", \"categories\", column: \"c_id\", name: \"on_c_id\")" if defined?(Mysql2)}
|
490
|
+
add_index :adverts, [:title], name: :on_title
|
491
|
+
#{"add_foreign_key :adverts, :categories, column: :category_id, name: :index_adverts_on_category_id\n" +
|
492
|
+
"add_foreign_key :adverts, :categories, column: :c_id, name: :index_adverts_on_c_id" if defined?(Mysql2)}
|
507
493
|
EOS
|
508
494
|
)
|
509
495
|
|
@@ -520,11 +506,9 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
520
506
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
521
507
|
migrate_up(<<~EOS.strip)
|
522
508
|
add_column :adverts, :title, :string, limit: 250, null: true#{charset_and_collation}
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
#{"add_foreign_key(\"adverts\", \"categories\", column: \"category_id\", name: \"on_category_id\")\n" +
|
527
|
-
"add_foreign_key(\"adverts\", \"categories\", column: \"c_id\", name: \"on_c_id\")" if defined?(Mysql2)}
|
509
|
+
add_index :adverts, [:title], name: :on_title, unique: true
|
510
|
+
#{"add_foreign_key :adverts, :categories, column: :category_id, name: :index_adverts_on_category_id\n" +
|
511
|
+
"add_foreign_key :adverts, :categories, column: :c_id, name: :index_adverts_on_c_id" if defined?(Mysql2)}
|
528
512
|
EOS
|
529
513
|
)
|
530
514
|
|
@@ -541,11 +525,9 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
541
525
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
542
526
|
migrate_up(<<~EOS.strip)
|
543
527
|
add_column :adverts, :title, :string, limit: 250, null: true#{charset_and_collation}
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
#{"add_foreign_key(\"adverts\", \"categories\", column: \"category_id\", name: \"on_category_id\")\n" +
|
548
|
-
"add_foreign_key(\"adverts\", \"categories\", column: \"c_id\", name: \"on_c_id\")" if defined?(Mysql2)}
|
528
|
+
add_index :adverts, [:title], name: :my_index
|
529
|
+
#{"add_foreign_key :adverts, :categories, column: :category_id, name: :index_adverts_on_category_id\n" +
|
530
|
+
"add_foreign_key :adverts, :categories, column: :c_id, name: :index_adverts_on_c_id" if defined?(Mysql2)}
|
549
531
|
EOS
|
550
532
|
)
|
551
533
|
|
@@ -560,11 +542,9 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
560
542
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
561
543
|
migrate_up(<<~EOS.strip)
|
562
544
|
add_column :adverts, :title, :string, limit: 250, null: true#{charset_and_collation}
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
#{"add_foreign_key(\"adverts\", \"categories\", column: \"category_id\", name: \"on_category_id\")\n" +
|
567
|
-
"add_foreign_key(\"adverts\", \"categories\", column: \"c_id\", name: \"on_c_id\")" if defined?(Mysql2)}
|
545
|
+
add_index :adverts, [:title], name: :on_title
|
546
|
+
#{"add_foreign_key :adverts, :categories, column: :category_id, name: :index_adverts_on_category_id\n" +
|
547
|
+
"add_foreign_key :adverts, :categories, column: :c_id, name: :index_adverts_on_c_id" if defined?(Mysql2)}
|
568
548
|
EOS
|
569
549
|
)
|
570
550
|
|
@@ -579,11 +559,9 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
579
559
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
580
560
|
migrate_up(<<~EOS.strip)
|
581
561
|
add_column :adverts, :title, :string, limit: 250, null: true#{charset_and_collation}
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
#{"add_foreign_key(\"adverts\", \"categories\", column: \"category_id\", name: \"on_category_id\")\n" +
|
586
|
-
"add_foreign_key(\"adverts\", \"categories\", column: \"c_id\", name: \"on_c_id\")" if defined?(Mysql2)}
|
562
|
+
add_index :adverts, [:title], name: :my_index, unique: true
|
563
|
+
#{"add_foreign_key :adverts, :categories, column: :category_id, name: :index_adverts_on_category_id\n" +
|
564
|
+
"add_foreign_key :adverts, :categories, column: :c_id, name: :index_adverts_on_c_id" if defined?(Mysql2)}
|
587
565
|
EOS
|
588
566
|
)
|
589
567
|
|
@@ -598,11 +576,9 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
598
576
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
599
577
|
migrate_up(<<~EOS.strip)
|
600
578
|
add_column :adverts, :title, :string, limit: 250, null: true#{charset_and_collation}
|
601
|
-
|
602
|
-
|
603
|
-
|
604
|
-
#{"add_foreign_key(\"adverts\", \"categories\", column: \"category_id\", name: \"on_category_id\")\n" +
|
605
|
-
"add_foreign_key(\"adverts\", \"categories\", column: \"c_id\", name: \"on_c_id\")" if defined?(Mysql2)}
|
579
|
+
add_index :adverts, [:title, :category_id], name: :on_title_and_category_id
|
580
|
+
#{"add_foreign_key :adverts, :categories, column: :category_id, name: :index_adverts_on_category_id\n" +
|
581
|
+
"add_foreign_key :adverts, :categories, column: :c_id, name: :index_adverts_on_c_id" if defined?(Mysql2)}
|
606
582
|
EOS
|
607
583
|
)
|
608
584
|
|
@@ -614,7 +590,8 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
614
590
|
|
615
591
|
### Rename a table
|
616
592
|
|
617
|
-
# The migration generator respects the `set_table_name` declaration, although as before,
|
593
|
+
# The migration generator respects the `set_table_name` declaration, although as before,
|
594
|
+
# we need to explicitly tell the generator that we want a rename rather than a create and a drop.
|
618
595
|
|
619
596
|
class Advert < ActiveRecord::Base
|
620
597
|
self.table_name = "ads"
|
@@ -630,31 +607,21 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
630
607
|
expect(Generators::DeclareSchema::Migration::Migrator.run("adverts" => "ads")).to(
|
631
608
|
migrate_up(<<~EOS.strip)
|
632
609
|
rename_table :adverts, :ads
|
633
|
-
|
634
610
|
add_column :ads, :title, :string, limit: 250, null: true#{charset_and_collation}
|
635
611
|
add_column :ads, :body, :text#{', limit: 4294967295' if defined?(Mysql2)}, null: true#{charset_and_collation}
|
636
|
-
|
637
|
-
|
638
|
-
"
|
639
|
-
elsif defined?(Mysql2)
|
640
|
-
"execute \"ALTER TABLE ads DROP PRIMARY KEY, ADD PRIMARY KEY (id)\"\n\n" +
|
641
|
-
"add_foreign_key(\"adverts\", \"categories\", column: \"category_id\", name: \"on_category_id\")\n" +
|
642
|
-
"add_foreign_key(\"adverts\", \"categories\", column: \"c_id\", name: \"on_c_id\")"
|
612
|
+
#{if defined?(Mysql2)
|
613
|
+
"add_foreign_key :adverts, :categories, column: :category_id, name: :index_adverts_on_category_id\n" +
|
614
|
+
"add_foreign_key :adverts, :categories, column: :c_id, name: :index_adverts_on_c_id"
|
643
615
|
end}
|
644
616
|
EOS
|
645
617
|
.and migrate_down(<<~EOS.strip)
|
646
|
-
|
618
|
+
#{if defined?(Mysql2)
|
619
|
+
"remove_foreign_key :adverts, name: :index_adverts_on_c_id\n" +
|
620
|
+
"remove_foreign_key :adverts, name: :index_adverts_on_category_id"
|
621
|
+
end}
|
647
622
|
remove_column :ads, :body
|
648
|
-
|
623
|
+
remove_column :ads, :title
|
649
624
|
rename_table :ads, :adverts
|
650
|
-
|
651
|
-
#{if defined?(SQLite3)
|
652
|
-
"add_index :adverts, [:id], unique: true, name: 'PRIMARY'\n"
|
653
|
-
elsif defined?(Mysql2)
|
654
|
-
"execute \"ALTER TABLE adverts DROP PRIMARY KEY, ADD PRIMARY KEY (id)\"\n\n" +
|
655
|
-
"remove_foreign_key(\"adverts\", name: \"on_category_id\")\n" +
|
656
|
-
"remove_foreign_key(\"adverts\", name: \"on_c_id\")"
|
657
|
-
end}
|
658
625
|
EOS
|
659
626
|
)
|
660
627
|
|
@@ -684,29 +651,15 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
684
651
|
expect(Generators::DeclareSchema::Migration::Migrator.run("adverts" => "advertisements")).to(
|
685
652
|
migrate_up(<<~EOS.strip)
|
686
653
|
rename_table :adverts, :advertisements
|
687
|
-
|
688
654
|
add_column :advertisements, :title, :string, limit: 250, null: true#{charset_and_collation}
|
689
655
|
add_column :advertisements, :body, :text#{', limit: 4294967295' if defined?(Mysql2)}, null: true#{charset_and_collation}
|
690
656
|
remove_column :advertisements, :name
|
691
|
-
|
692
|
-
#{if defined?(SQLite3)
|
693
|
-
"add_index :advertisements, [:id], unique: true, name: 'PRIMARY'"
|
694
|
-
elsif defined?(Mysql2)
|
695
|
-
"execute \"ALTER TABLE advertisements DROP PRIMARY KEY, ADD PRIMARY KEY (id)\""
|
696
|
-
end}
|
697
657
|
EOS
|
698
658
|
.and migrate_down(<<~EOS.strip)
|
699
|
-
|
659
|
+
add_column :advertisements, :name, :string, limit: 250, null: true#{charset_and_collation}
|
700
660
|
remove_column :advertisements, :body
|
701
|
-
|
702
|
-
|
661
|
+
remove_column :advertisements, :title
|
703
662
|
rename_table :advertisements, :adverts
|
704
|
-
|
705
|
-
#{if defined?(SQLite3)
|
706
|
-
"add_index :adverts, [:id], unique: true, name: 'PRIMARY'"
|
707
|
-
elsif defined?(Mysql2)
|
708
|
-
"execute \"ALTER TABLE adverts DROP PRIMARY KEY, ADD PRIMARY KEY (id)\""
|
709
|
-
end}
|
710
663
|
EOS
|
711
664
|
)
|
712
665
|
|
@@ -753,13 +706,11 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
753
706
|
expect(migrations).to(
|
754
707
|
migrate_up(<<~EOS.strip)
|
755
708
|
add_column :adverts, :type, :string, limit: 250, null: true#{charset_and_collation}
|
756
|
-
|
757
|
-
add_index :adverts, [:type], name: 'on_type'
|
709
|
+
add_index :adverts, [:type], name: :on_type
|
758
710
|
EOS
|
759
711
|
.and migrate_down(<<~EOS.strip)
|
760
712
|
remove_column :adverts, :type
|
761
|
-
|
762
|
-
remove_index :adverts, name: :on_type rescue ActiveRecord::StatementInvalid
|
713
|
+
remove_index :adverts, name: :on_type
|
763
714
|
EOS
|
764
715
|
)
|
765
716
|
end
|
@@ -802,8 +753,8 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
802
753
|
change_column :adverts, :name, :string, limit: 250, null: true, default: "No Name"#{charset_and_collation}
|
803
754
|
EOS
|
804
755
|
.and migrate_down(<<~EOS.strip)
|
756
|
+
change_column :adverts, :name, :string, limit: 250, null: true, default: "Untitled"#{charset_and_collation}
|
805
757
|
rename_column :adverts, :name, :title
|
806
|
-
change_column :adverts, :title, :string, limit: 250, null: true, default: "Untitled"#{charset_and_collation}
|
807
758
|
EOS
|
808
759
|
)
|
809
760
|
|
@@ -821,15 +772,8 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
821
772
|
expect(Generators::DeclareSchema::Migration::Migrator.run(adverts: :ads)).to(
|
822
773
|
migrate_up(<<~EOS.strip)
|
823
774
|
rename_table :adverts, :ads
|
824
|
-
|
825
775
|
add_column :ads, :created_at, :datetime, null: false
|
826
776
|
change_column :ads, :title, :string, limit: 250, null: false, default: \"Untitled\"#{charset_and_collation}
|
827
|
-
|
828
|
-
#{if defined?(SQLite3)
|
829
|
-
"add_index :ads, [:id], unique: true, name: 'PRIMARY'"
|
830
|
-
elsif defined?(Mysql2)
|
831
|
-
'execute "ALTER TABLE ads DROP PRIMARY KEY, ADD PRIMARY KEY (id)"'
|
832
|
-
end}
|
833
777
|
EOS
|
834
778
|
)
|
835
779
|
|
@@ -856,12 +800,6 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
856
800
|
expect(Generators::DeclareSchema::Migration::Migrator.run(adverts: { id: :advert_id })).to(
|
857
801
|
migrate_up(<<~EOS.strip)
|
858
802
|
rename_column :adverts, :id, :advert_id
|
859
|
-
|
860
|
-
#{if defined?(SQLite3)
|
861
|
-
"add_index :adverts, [:advert_id], unique: true, name: 'PRIMARY'"
|
862
|
-
elsif defined?(Mysql2)
|
863
|
-
'execute "ALTER TABLE adverts DROP PRIMARY KEY, ADD PRIMARY KEY (advert_id)"'
|
864
|
-
end}
|
865
803
|
EOS
|
866
804
|
)
|
867
805
|
|
@@ -902,6 +840,54 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
902
840
|
expect(Ad.field_specs['company'].options[:validates].inspect).to eq("{:presence=>true, :uniqueness=>{:case_sensitive=>false}}")
|
903
841
|
end
|
904
842
|
|
843
|
+
context 'models with the same parent foreign key relation' do
|
844
|
+
before do
|
845
|
+
class Category < ActiveRecord::Base
|
846
|
+
fields do
|
847
|
+
name :string, limit: 250, null: true
|
848
|
+
end
|
849
|
+
end
|
850
|
+
class Advertiser < ActiveRecord::Base
|
851
|
+
fields do
|
852
|
+
name :string, limit: 250, null: true
|
853
|
+
end
|
854
|
+
belongs_to :category, limit: 8
|
855
|
+
end
|
856
|
+
class Affiliate < ActiveRecord::Base
|
857
|
+
fields do
|
858
|
+
name :string, limit: 250, null: true
|
859
|
+
end
|
860
|
+
belongs_to :category, limit: 8
|
861
|
+
end
|
862
|
+
end
|
863
|
+
|
864
|
+
it 'will genereate unique constraint names' do
|
865
|
+
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
866
|
+
migrate_up(<<~EOS.strip)
|
867
|
+
create_table :categories, id: :bigint, options: "CHARACTER SET utf8mb4 COLLATE utf8mb4_bin" do |t|
|
868
|
+
t.string :name, limit: 250, null: true, charset: "utf8mb4", collation: "utf8mb4_bin"
|
869
|
+
end
|
870
|
+
create_table :advertisers, id: :bigint, options: "CHARACTER SET utf8mb4 COLLATE utf8mb4_bin" do |t|
|
871
|
+
t.string :name, limit: 250, null: true, charset: "utf8mb4", collation: "utf8mb4_bin"
|
872
|
+
t.integer :category_id, limit: 8, null: false
|
873
|
+
end
|
874
|
+
create_table :affiliates, id: :bigint, options: "CHARACTER SET utf8mb4 COLLATE utf8mb4_bin" do |t|
|
875
|
+
t.string :name, limit: 250, null: true, charset: "utf8mb4", collation: "utf8mb4_bin"
|
876
|
+
t.integer :category_id, limit: 8, null: false
|
877
|
+
end
|
878
|
+
add_index :advertisers, [:category_id], name: :on_category_id
|
879
|
+
add_index :affiliates, [:category_id], name: :on_category_id
|
880
|
+
add_foreign_key :advertisers, :categories, column: :category_id, name: :index_advertisers_on_category_id
|
881
|
+
add_foreign_key :affiliates, :categories, column: :category_id, name: :index_affiliates_on_category_id
|
882
|
+
EOS
|
883
|
+
)
|
884
|
+
migrate
|
885
|
+
|
886
|
+
nuke_model_class(Advertiser)
|
887
|
+
nuke_model_class(Affiliate)
|
888
|
+
end
|
889
|
+
end if !defined?(SQLite3) && ActiveRecord::VERSION::MAJOR >= 5
|
890
|
+
|
905
891
|
describe 'serialize' do
|
906
892
|
before do
|
907
893
|
class Ad < ActiveRecord::Base
|
@@ -1086,8 +1072,8 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1086
1072
|
end
|
1087
1073
|
end
|
1088
1074
|
|
1089
|
-
context "for Rails #{
|
1090
|
-
if
|
1075
|
+
context "for Rails #{ActiveSupport::VERSION::MAJOR}" do
|
1076
|
+
if ActiveSupport::VERSION::MAJOR >= 5
|
1091
1077
|
let(:optional_true) { { optional: true } }
|
1092
1078
|
let(:optional_false) { { optional: false } }
|
1093
1079
|
else
|
@@ -1193,13 +1179,13 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1193
1179
|
migration_content = File.read(migrations.first)
|
1194
1180
|
first_line = migration_content.split("\n").first
|
1195
1181
|
base_class = first_line.split(' < ').last
|
1196
|
-
expect(base_class).to eq("(
|
1182
|
+
expect(base_class).to eq("(ActiveSupport::VERSION::MAJOR >= 5 ? ActiveRecord::Migration[4.2] : ActiveRecord::Migration)")
|
1197
1183
|
end
|
1198
1184
|
end
|
1199
1185
|
|
1200
1186
|
context 'Does not generate migrations' do
|
1201
1187
|
it 'for aliased fields bigint -> integer limit 8' do
|
1202
|
-
if
|
1188
|
+
if ActiveSupport::VERSION::MAJOR >= 5 || !ActiveRecord::Base.connection.class.name.match?(/SQLite3Adapter/)
|
1203
1189
|
class Advert < active_record_base_class.constantize
|
1204
1190
|
fields do
|
1205
1191
|
price :bigint
|
@@ -1211,7 +1197,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1211
1197
|
migrations = Dir.glob('db/migrate/*declare_schema_migration*.rb')
|
1212
1198
|
expect(migrations.size).to eq(1), migrations.inspect
|
1213
1199
|
|
1214
|
-
if defined?(Mysql2) &&
|
1200
|
+
if defined?(Mysql2) && ActiveSupport::VERSION::MAJOR < 5
|
1215
1201
|
ActiveRecord::Base.connection.execute("ALTER TABLE adverts ADD PRIMARY KEY (id)")
|
1216
1202
|
end
|
1217
1203
|
|
@@ -1252,19 +1238,19 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1252
1238
|
|
1253
1239
|
up, _ = Generators::DeclareSchema::Migration::Migrator.run.tap do |migrations|
|
1254
1240
|
expect(migrations).to(
|
1255
|
-
|
1256
|
-
create_table :adverts, id: :bigint do |t|
|
1241
|
+
migrate_up(<<~EOS.strip)
|
1242
|
+
create_table :adverts, id: :bigint#{create_table_charset_and_collation} do |t|
|
1257
1243
|
t.string :name, limit: 250, null: true#{charset_and_collation}
|
1258
|
-
end
|
1259
|
-
|
1260
|
-
|
1244
|
+
end
|
1245
|
+
EOS
|
1246
|
+
.and migrate_down("drop_table :adverts")
|
1261
1247
|
)
|
1262
1248
|
end
|
1263
1249
|
|
1264
1250
|
ActiveRecord::Migration.class_eval(up)
|
1265
1251
|
expect(Advert.columns.map(&:name)).to eq(["id", "name"])
|
1266
1252
|
|
1267
|
-
if
|
1253
|
+
if ActiveSupport::VERSION::MAJOR < 5
|
1268
1254
|
# Rails 4 drivers don't always create PK properly. Fix that by dropping and recreating.
|
1269
1255
|
ActiveRecord::Base.connection.execute("drop table adverts")
|
1270
1256
|
if defined?(Mysql2)
|
@@ -1286,14 +1272,14 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1286
1272
|
Advert.reset_column_information
|
1287
1273
|
|
1288
1274
|
expect(migrate).to(
|
1289
|
-
|
1275
|
+
migrate_up(<<~EOS.strip)
|
1290
1276
|
add_column :adverts, :body, :text#{text_limit}, null: true#{charset_and_collation}
|
1291
1277
|
add_column :adverts, :published_at, :datetime, null: true
|
1292
|
-
|
1293
|
-
|
1294
|
-
remove_column :adverts, :body
|
1278
|
+
EOS
|
1279
|
+
.and migrate_down(<<~EOS.strip)
|
1295
1280
|
remove_column :adverts, :published_at
|
1296
|
-
|
1281
|
+
remove_column :adverts, :body
|
1282
|
+
EOS
|
1297
1283
|
)
|
1298
1284
|
|
1299
1285
|
Advert.field_specs.clear # not normally needed
|
@@ -1319,14 +1305,14 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1319
1305
|
end
|
1320
1306
|
|
1321
1307
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
1322
|
-
|
1308
|
+
migrate_up(<<~EOS.strip)
|
1323
1309
|
add_column :adverts, :title, :string, limit: 250, null: true#{charset_and_collation}
|
1324
1310
|
remove_column :adverts, :name
|
1325
|
-
|
1326
|
-
|
1327
|
-
remove_column :adverts, :title
|
1311
|
+
EOS
|
1312
|
+
.and migrate_down(<<~EOS.strip)
|
1328
1313
|
add_column :adverts, :name, :string, limit: 250, null: true#{charset_and_collation}
|
1329
|
-
|
1314
|
+
remove_column :adverts, :title
|
1315
|
+
EOS
|
1330
1316
|
)
|
1331
1317
|
|
1332
1318
|
expect(Generators::DeclareSchema::Migration::Migrator.run(adverts: { name: :title })).to(
|
@@ -1540,20 +1526,16 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1540
1526
|
end
|
1541
1527
|
|
1542
1528
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
1543
|
-
|
1529
|
+
migrate_up(<<~EOS.strip)
|
1544
1530
|
add_column :adverts, :category_id, :integer, limit: 8, null: false
|
1545
|
-
|
1546
|
-
|
1547
|
-
|
1548
|
-
|
1549
|
-
|
1550
|
-
|
1531
|
+
add_index :adverts, [:category_id], name: :on_category_id
|
1532
|
+
#{"add_foreign_key :adverts, :categories, column: :category_id, name: :index_adverts_on_category_id\n" if defined?(Mysql2)}
|
1533
|
+
EOS
|
1534
|
+
.and migrate_down(<<~EOS.strip)
|
1535
|
+
#{"remove_foreign_key :adverts, name: :index_adverts_on_category_id" if defined?(Mysql2)}
|
1536
|
+
remove_index :adverts, name: :on_category_id
|
1551
1537
|
remove_column :adverts, :category_id
|
1552
|
-
|
1553
|
-
remove_index :adverts, name: :on_category_id rescue ActiveRecord::StatementInvalid
|
1554
|
-
|
1555
|
-
#{"remove_foreign_key(\"adverts\", name: \"on_category_id\")\n" if defined?(Mysql2)}
|
1556
|
-
EOS
|
1538
|
+
EOS
|
1557
1539
|
)
|
1558
1540
|
|
1559
1541
|
Advert.field_specs.delete(:category_id)
|
@@ -1568,14 +1550,12 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1568
1550
|
end
|
1569
1551
|
|
1570
1552
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
1571
|
-
|
1553
|
+
migrate_up(<<~EOS.strip)
|
1572
1554
|
add_column :adverts, :c_id, :integer, limit: 8, null: false
|
1573
|
-
|
1574
|
-
|
1575
|
-
|
1576
|
-
|
1577
|
-
"add_foreign_key(\"adverts\", \"categories\", column: \"c_id\", name: \"on_c_id\")" if defined?(Mysql2)}
|
1578
|
-
EOS
|
1555
|
+
add_index :adverts, [:c_id], name: :on_c_id
|
1556
|
+
#{"add_foreign_key :adverts, :categories, column: :category_id, name: :index_adverts_on_category_id\n" +
|
1557
|
+
"add_foreign_key :adverts, :categories, column: :c_id, name: :index_adverts_on_c_id" if defined?(Mysql2)}
|
1558
|
+
EOS
|
1579
1559
|
)
|
1580
1560
|
|
1581
1561
|
Advert.field_specs.delete(:c_id)
|
@@ -1590,12 +1570,11 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1590
1570
|
end
|
1591
1571
|
|
1592
1572
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
1593
|
-
|
1573
|
+
migrate_up(<<~EOS.strip)
|
1594
1574
|
add_column :adverts, :category_id, :integer, limit: 8, null: false
|
1595
|
-
|
1596
|
-
|
1597
|
-
|
1598
|
-
EOS
|
1575
|
+
#{"add_foreign_key :adverts, :categories, column: :category_id, name: :index_adverts_on_category_id\n" +
|
1576
|
+
"add_foreign_key :adverts, :categories, column: :c_id, name: :index_adverts_on_c_id" if defined?(Mysql2)}
|
1577
|
+
EOS
|
1599
1578
|
)
|
1600
1579
|
|
1601
1580
|
Advert.field_specs.delete(:category_id)
|
@@ -1610,14 +1589,12 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1610
1589
|
end
|
1611
1590
|
|
1612
1591
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
1613
|
-
|
1592
|
+
migrate_up(<<~EOS.strip)
|
1614
1593
|
add_column :adverts, :category_id, :integer, limit: 8, null: false
|
1615
|
-
|
1616
|
-
|
1617
|
-
|
1618
|
-
|
1619
|
-
"add_foreign_key(\"adverts\", \"categories\", column: \"c_id\", name: \"on_c_id\")" if defined?(Mysql2)}
|
1620
|
-
EOS
|
1594
|
+
add_index :adverts, [:category_id], name: :my_index
|
1595
|
+
#{"add_foreign_key :adverts, :categories, column: :category_id, name: :index_adverts_on_category_id\n" +
|
1596
|
+
"add_foreign_key :adverts, :categories, column: :c_id, name: :index_adverts_on_c_id" if defined?(Mysql2)}
|
1597
|
+
EOS
|
1621
1598
|
)
|
1622
1599
|
|
1623
1600
|
Advert.field_specs.delete(:category_id)
|
@@ -1636,22 +1613,20 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1636
1613
|
end
|
1637
1614
|
|
1638
1615
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
1639
|
-
|
1616
|
+
migrate_up(<<~EOS.strip)
|
1640
1617
|
add_column :adverts, :created_at, :datetime, null: true
|
1641
1618
|
add_column :adverts, :updated_at, :datetime, null: true
|
1642
1619
|
add_column :adverts, :lock_version, :integer#{lock_version_limit}, null: false, default: 1
|
1643
|
-
|
1644
|
-
|
1645
|
-
|
1646
|
-
|
1647
|
-
|
1648
|
-
|
1649
|
-
remove_column :adverts, :updated_at
|
1620
|
+
#{"add_foreign_key :adverts, :categories, column: :category_id, name: :index_adverts_on_category_id\n" +
|
1621
|
+
"add_foreign_key :adverts, :categories, column: :c_id, name: :index_adverts_on_c_id" if defined?(Mysql2)}
|
1622
|
+
EOS
|
1623
|
+
.and migrate_down(<<~EOS.strip)
|
1624
|
+
#{"remove_foreign_key :adverts, name: :index_adverts_on_c_id\n" +
|
1625
|
+
"remove_foreign_key :adverts, name: :index_adverts_on_category_id" if defined?(Mysql2)}
|
1650
1626
|
remove_column :adverts, :lock_version
|
1651
|
-
|
1652
|
-
|
1653
|
-
|
1654
|
-
EOS
|
1627
|
+
remove_column :adverts, :updated_at
|
1628
|
+
remove_column :adverts, :created_at
|
1629
|
+
EOS
|
1655
1630
|
)
|
1656
1631
|
|
1657
1632
|
Advert.field_specs.delete(:updated_at)
|
@@ -1669,14 +1644,12 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1669
1644
|
end
|
1670
1645
|
|
1671
1646
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
1672
|
-
|
1647
|
+
migrate_up(<<~EOS.strip)
|
1673
1648
|
add_column :adverts, :title, :string, limit: 250, null: true#{charset_and_collation}
|
1674
|
-
|
1675
|
-
|
1676
|
-
|
1677
|
-
|
1678
|
-
"add_foreign_key(\"adverts\", \"categories\", column: \"c_id\", name: \"on_c_id\")" if defined?(Mysql2)}
|
1679
|
-
EOS
|
1649
|
+
add_index :adverts, [:title], name: :on_title
|
1650
|
+
#{"add_foreign_key :adverts, :categories, column: :category_id, name: :index_adverts_on_category_id\n" +
|
1651
|
+
"add_foreign_key :adverts, :categories, column: :c_id, name: :index_adverts_on_c_id" if defined?(Mysql2)}
|
1652
|
+
EOS
|
1680
1653
|
)
|
1681
1654
|
|
1682
1655
|
Advert.index_definitions.delete_if { |spec| spec.fields==["title"] }
|
@@ -1690,14 +1663,12 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1690
1663
|
end
|
1691
1664
|
|
1692
1665
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
1693
|
-
|
1666
|
+
migrate_up(<<~EOS.strip)
|
1694
1667
|
add_column :adverts, :title, :string, limit: 250, null: true#{charset_and_collation}
|
1695
|
-
|
1696
|
-
|
1697
|
-
|
1698
|
-
|
1699
|
-
"add_foreign_key(\"adverts\", \"categories\", column: \"c_id\", name: \"on_c_id\")" if defined?(Mysql2)}
|
1700
|
-
EOS
|
1668
|
+
add_index :adverts, [:title], name: :on_title, unique: true
|
1669
|
+
#{"add_foreign_key :adverts, :categories, column: :category_id, name: :index_adverts_on_category_id\n" +
|
1670
|
+
"add_foreign_key :adverts, :categories, column: :c_id, name: :index_adverts_on_c_id" if defined?(Mysql2)}
|
1671
|
+
EOS
|
1701
1672
|
)
|
1702
1673
|
|
1703
1674
|
Advert.index_definitions.delete_if { |spec| spec.fields == ["title"] }
|
@@ -1711,14 +1682,12 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1711
1682
|
end
|
1712
1683
|
|
1713
1684
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
1714
|
-
|
1685
|
+
migrate_up(<<~EOS.strip)
|
1715
1686
|
add_column :adverts, :title, :string, limit: 250, null: true#{charset_and_collation}
|
1716
|
-
|
1717
|
-
|
1718
|
-
|
1719
|
-
|
1720
|
-
"add_foreign_key(\"adverts\", \"categories\", column: \"c_id\", name: \"on_c_id\")" if defined?(Mysql2)}
|
1721
|
-
EOS
|
1687
|
+
add_index :adverts, [:title], name: :my_index
|
1688
|
+
#{"add_foreign_key :adverts, :categories, column: :category_id, name: :index_adverts_on_category_id\n" +
|
1689
|
+
"add_foreign_key :adverts, :categories, column: :c_id, name: :index_adverts_on_c_id" if defined?(Mysql2)}
|
1690
|
+
EOS
|
1722
1691
|
)
|
1723
1692
|
|
1724
1693
|
Advert.index_definitions.delete_if { |spec| spec.fields==["title"] }
|
@@ -1730,14 +1699,12 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1730
1699
|
end
|
1731
1700
|
|
1732
1701
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
1733
|
-
|
1702
|
+
migrate_up(<<~EOS.strip)
|
1734
1703
|
add_column :adverts, :title, :string, limit: 250, null: true#{charset_and_collation}
|
1735
|
-
|
1736
|
-
|
1737
|
-
|
1738
|
-
|
1739
|
-
"add_foreign_key(\"adverts\", \"categories\", column: \"c_id\", name: \"on_c_id\")" if defined?(Mysql2)}
|
1740
|
-
EOS
|
1704
|
+
add_index :adverts, [:title], name: :on_title
|
1705
|
+
#{"add_foreign_key :adverts, :categories, column: :category_id, name: :index_adverts_on_category_id\n" +
|
1706
|
+
"add_foreign_key :adverts, :categories, column: :c_id, name: :index_adverts_on_c_id" if defined?(Mysql2)}
|
1707
|
+
EOS
|
1741
1708
|
)
|
1742
1709
|
|
1743
1710
|
Advert.index_definitions.delete_if { |spec| spec.fields == ["title"] }
|
@@ -1749,14 +1716,12 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1749
1716
|
end
|
1750
1717
|
|
1751
1718
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
1752
|
-
|
1719
|
+
migrate_up(<<~EOS.strip)
|
1753
1720
|
add_column :adverts, :title, :string, limit: 250, null: true#{charset_and_collation}
|
1754
|
-
|
1755
|
-
|
1756
|
-
|
1757
|
-
|
1758
|
-
"add_foreign_key(\"adverts\", \"categories\", column: \"c_id\", name: \"on_c_id\")" if defined?(Mysql2)}
|
1759
|
-
EOS
|
1721
|
+
add_index :adverts, [:title], name: :my_index, unique: true
|
1722
|
+
#{"add_foreign_key :adverts, :categories, column: :category_id, name: :index_adverts_on_category_id\n" +
|
1723
|
+
"add_foreign_key :adverts, :categories, column: :c_id, name: :index_adverts_on_c_id" if defined?(Mysql2)}
|
1724
|
+
EOS
|
1760
1725
|
)
|
1761
1726
|
|
1762
1727
|
Advert.index_definitions.delete_if { |spec| spec.fields == ["title"] }
|
@@ -1768,14 +1733,12 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1768
1733
|
end
|
1769
1734
|
|
1770
1735
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
1771
|
-
|
1736
|
+
migrate_up(<<~EOS.strip)
|
1772
1737
|
add_column :adverts, :title, :string, limit: 250, null: true#{charset_and_collation}
|
1773
|
-
|
1774
|
-
|
1775
|
-
|
1776
|
-
|
1777
|
-
"add_foreign_key(\"adverts\", \"categories\", column: \"c_id\", name: \"on_c_id\")" if defined?(Mysql2)}
|
1778
|
-
EOS
|
1738
|
+
add_index :adverts, [:title, :category_id], name: :on_title_and_category_id
|
1739
|
+
#{"add_foreign_key :adverts, :categories, column: :category_id, name: :index_adverts_on_category_id\n" +
|
1740
|
+
"add_foreign_key :adverts, :categories, column: :c_id, name: :index_adverts_on_c_id" if defined?(Mysql2)}
|
1741
|
+
EOS
|
1779
1742
|
)
|
1780
1743
|
|
1781
1744
|
Advert.index_definitions.delete_if { |spec| spec.fields==["title", "category_id"] }
|
@@ -1800,34 +1763,24 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1800
1763
|
Advert.reset_column_information
|
1801
1764
|
|
1802
1765
|
expect(Generators::DeclareSchema::Migration::Migrator.run("adverts" => "ads")).to(
|
1803
|
-
|
1766
|
+
migrate_up(<<~EOS.strip)
|
1804
1767
|
rename_table :adverts, :ads
|
1805
|
-
|
1806
1768
|
add_column :ads, :title, :string, limit: 250, null: true#{charset_and_collation}
|
1807
1769
|
add_column :ads, :body, :text#{', limit: 4294967295' if defined?(Mysql2)}, null: true#{charset_and_collation}
|
1808
|
-
|
1809
|
-
|
1810
|
-
|
1811
|
-
elsif defined?(Mysql2)
|
1812
|
-
"execute \"ALTER TABLE ads DROP PRIMARY KEY, ADD PRIMARY KEY (id)\"\n\n" +
|
1813
|
-
"add_foreign_key(\"adverts\", \"categories\", column: \"category_id\", name: \"on_category_id\")\n" +
|
1814
|
-
"add_foreign_key(\"adverts\", \"categories\", column: \"c_id\", name: \"on_c_id\")"
|
1770
|
+
#{if defined?(Mysql2)
|
1771
|
+
"add_foreign_key :adverts, :categories, column: :category_id, name: :index_adverts_on_category_id\n" +
|
1772
|
+
"add_foreign_key :adverts, :categories, column: :c_id, name: :index_adverts_on_c_id"
|
1815
1773
|
end}
|
1816
1774
|
EOS
|
1817
|
-
|
1818
|
-
|
1819
|
-
|
1820
|
-
|
1821
|
-
|
1822
|
-
|
1823
|
-
|
1824
|
-
|
1825
|
-
|
1826
|
-
"execute \"ALTER TABLE adverts DROP PRIMARY KEY, ADD PRIMARY KEY (id)\"\n\n" +
|
1827
|
-
"remove_foreign_key(\"adverts\", name: \"on_category_id\")\n" +
|
1828
|
-
"remove_foreign_key(\"adverts\", name: \"on_c_id\")"
|
1829
|
-
end}
|
1830
|
-
EOS
|
1775
|
+
.and migrate_down(<<~EOS.strip)
|
1776
|
+
#{if defined?(Mysql2)
|
1777
|
+
"remove_foreign_key :adverts, name: :index_adverts_on_c_id\n" +
|
1778
|
+
"remove_foreign_key :adverts, name: :index_adverts_on_category_id"
|
1779
|
+
end}
|
1780
|
+
remove_column :ads, :body
|
1781
|
+
remove_column :ads, :title
|
1782
|
+
rename_table :ads, :adverts
|
1783
|
+
EOS
|
1831
1784
|
)
|
1832
1785
|
|
1833
1786
|
# Set the table name back to what it should be and confirm we're in sync:
|
@@ -1854,32 +1807,18 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1854
1807
|
end
|
1855
1808
|
|
1856
1809
|
expect(Generators::DeclareSchema::Migration::Migrator.run("adverts" => "advertisements")).to(
|
1857
|
-
|
1810
|
+
migrate_up(<<~EOS.strip)
|
1858
1811
|
rename_table :adverts, :advertisements
|
1859
|
-
|
1860
1812
|
add_column :advertisements, :title, :string, limit: 250, null: true#{charset_and_collation}
|
1861
1813
|
add_column :advertisements, :body, :text#{', limit: 4294967295' if defined?(Mysql2)}, null: true#{charset_and_collation}
|
1862
1814
|
remove_column :advertisements, :name
|
1863
|
-
|
1864
|
-
|
1865
|
-
|
1866
|
-
elsif defined?(Mysql2)
|
1867
|
-
"execute \"ALTER TABLE advertisements DROP PRIMARY KEY, ADD PRIMARY KEY (id)\""
|
1868
|
-
end}
|
1869
|
-
EOS
|
1870
|
-
.and migrate_down(<<~EOS.strip)
|
1871
|
-
remove_column :advertisements, :title
|
1815
|
+
EOS
|
1816
|
+
.and migrate_down(<<~EOS.strip)
|
1817
|
+
add_column :advertisements, :name, :string, limit: 250, null: true#{charset_and_collation}
|
1872
1818
|
remove_column :advertisements, :body
|
1873
|
-
|
1874
|
-
|
1819
|
+
remove_column :advertisements, :title
|
1875
1820
|
rename_table :advertisements, :adverts
|
1876
|
-
|
1877
|
-
#{if defined?(SQLite3)
|
1878
|
-
"add_index :adverts, [:id], unique: true, name: 'PRIMARY'"
|
1879
|
-
elsif defined?(Mysql2)
|
1880
|
-
"execute \"ALTER TABLE adverts DROP PRIMARY KEY, ADD PRIMARY KEY (id)\""
|
1881
|
-
end}
|
1882
|
-
EOS
|
1821
|
+
EOS
|
1883
1822
|
)
|
1884
1823
|
|
1885
1824
|
### Drop a table
|
@@ -1891,14 +1830,14 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1891
1830
|
# Dropping tables is where the automatic down-migration really comes in handy:
|
1892
1831
|
|
1893
1832
|
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
1894
|
-
|
1833
|
+
migrate_up(<<~EOS.strip)
|
1895
1834
|
drop_table :adverts
|
1896
|
-
|
1897
|
-
|
1835
|
+
EOS
|
1836
|
+
.and migrate_down(<<~EOS.strip)
|
1898
1837
|
create_table "adverts"#{table_options}, force: :cascade do |t|
|
1899
1838
|
t.string "name", limit: 250#{charset_and_collation}
|
1900
1839
|
end
|
1901
|
-
|
1840
|
+
EOS
|
1902
1841
|
)
|
1903
1842
|
|
1904
1843
|
## STI
|
@@ -1923,16 +1862,14 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1923
1862
|
|
1924
1863
|
up, _ = Generators::DeclareSchema::Migration::Migrator.run do |migrations|
|
1925
1864
|
expect(migrations).to(
|
1926
|
-
|
1865
|
+
migrate_up(<<~EOS.strip)
|
1927
1866
|
add_column :adverts, :type, :string, limit: 250, null: true#{charset_and_collation}
|
1928
|
-
|
1929
|
-
|
1930
|
-
|
1931
|
-
|
1867
|
+
add_index :adverts, [:type], name: :on_type
|
1868
|
+
EOS
|
1869
|
+
.and migrate_down(<<~EOS.strip)
|
1870
|
+
remove_index :adverts, name: :on_type
|
1932
1871
|
remove_column :adverts, :type
|
1933
|
-
|
1934
|
-
remove_index :adverts, name: :on_type rescue ActiveRecord::StatementInvalid
|
1935
|
-
EOS
|
1872
|
+
EOS
|
1936
1873
|
)
|
1937
1874
|
end
|
1938
1875
|
|
@@ -1969,14 +1906,14 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1969
1906
|
end
|
1970
1907
|
|
1971
1908
|
expect(Generators::DeclareSchema::Migration::Migrator.run(adverts: { title: :name })).to(
|
1972
|
-
|
1909
|
+
migrate_up(<<~EOS.strip)
|
1973
1910
|
rename_column :adverts, :title, :name
|
1974
1911
|
change_column :adverts, :name, :string, limit: 250, null: true, default: "No Name"#{charset_and_collation}
|
1975
|
-
|
1976
|
-
|
1912
|
+
EOS
|
1913
|
+
.and migrate_down(<<~EOS.strip)
|
1914
|
+
change_column :adverts, :name, :string, limit: 250, null: true, default: "Untitled"#{charset_and_collation}
|
1977
1915
|
rename_column :adverts, :name, :title
|
1978
|
-
|
1979
|
-
EOS
|
1916
|
+
EOS
|
1980
1917
|
)
|
1981
1918
|
|
1982
1919
|
### Rename a table and add a column
|
@@ -1991,18 +1928,11 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
1991
1928
|
end
|
1992
1929
|
|
1993
1930
|
expect(Generators::DeclareSchema::Migration::Migrator.run(adverts: :ads)).to(
|
1994
|
-
|
1931
|
+
migrate_up(<<~EOS.strip)
|
1995
1932
|
rename_table :adverts, :ads
|
1996
|
-
|
1997
1933
|
add_column :ads, :created_at, :datetime, null: false
|
1998
1934
|
change_column :ads, :title, :string, limit: 250, null: false, default: \"Untitled\"#{charset_and_collation}
|
1999
|
-
|
2000
|
-
#{if defined?(SQLite3)
|
2001
|
-
"add_index :ads, [:id], unique: true, name: 'PRIMARY'"
|
2002
|
-
elsif defined?(Mysql2)
|
2003
|
-
'execute "ALTER TABLE ads DROP PRIMARY KEY, ADD PRIMARY KEY (id)"'
|
2004
|
-
end}
|
2005
|
-
EOS
|
1935
|
+
EOS
|
2006
1936
|
)
|
2007
1937
|
|
2008
1938
|
class Advert < ActiveRecord::Base
|
@@ -2026,15 +1956,9 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
2026
1956
|
end
|
2027
1957
|
|
2028
1958
|
expect(Generators::DeclareSchema::Migration::Migrator.run(adverts: { id: :advert_id })).to(
|
2029
|
-
|
1959
|
+
migrate_up(<<~EOS.strip)
|
2030
1960
|
rename_column :adverts, :id, :advert_id
|
2031
|
-
|
2032
|
-
#{if defined?(SQLite3)
|
2033
|
-
"add_index :adverts, [:advert_id], unique: true, name: 'PRIMARY'"
|
2034
|
-
elsif defined?(Mysql2)
|
2035
|
-
'execute "ALTER TABLE adverts DROP PRIMARY KEY, ADD PRIMARY KEY (advert_id)"'
|
2036
|
-
end}
|
2037
|
-
EOS
|
1961
|
+
EOS
|
2038
1962
|
)
|
2039
1963
|
|
2040
1964
|
nuke_model_class(Advert)
|
@@ -2074,6 +1998,54 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
2074
1998
|
expect(Ad.field_specs['company'].options[:validates].inspect).to eq("{:presence=>true, :uniqueness=>{:case_sensitive=>false}}")
|
2075
1999
|
end
|
2076
2000
|
|
2001
|
+
context 'models with the same parent foreign key relation' do
|
2002
|
+
before do
|
2003
|
+
class Category < ActiveRecord::Base
|
2004
|
+
fields do
|
2005
|
+
name :string, limit: 250, null: true
|
2006
|
+
end
|
2007
|
+
end
|
2008
|
+
class Advertiser < ActiveRecord::Base
|
2009
|
+
fields do
|
2010
|
+
name :string, limit: 250, null: true
|
2011
|
+
end
|
2012
|
+
belongs_to :category, limit: 8
|
2013
|
+
end
|
2014
|
+
class Affiliate < ActiveRecord::Base
|
2015
|
+
fields do
|
2016
|
+
name :string, limit: 250, null: true
|
2017
|
+
end
|
2018
|
+
belongs_to :category, limit: 8
|
2019
|
+
end
|
2020
|
+
end
|
2021
|
+
|
2022
|
+
it 'will genereate unique constraint names' do
|
2023
|
+
expect(Generators::DeclareSchema::Migration::Migrator.run).to(
|
2024
|
+
migrate_up(<<~EOS.strip)
|
2025
|
+
create_table :categories, id: :bigint, options: "CHARACTER SET utf8mb4 COLLATE utf8mb4_bin" do |t|
|
2026
|
+
t.string :name, limit: 250, null: true, charset: "utf8mb4", collation: "utf8mb4_bin"
|
2027
|
+
end
|
2028
|
+
create_table :advertisers, id: :bigint, options: "CHARACTER SET utf8mb4 COLLATE utf8mb4_bin" do |t|
|
2029
|
+
t.string :name, limit: 250, null: true, charset: "utf8mb4", collation: "utf8mb4_bin"
|
2030
|
+
t.integer :category_id, limit: 8, null: false
|
2031
|
+
end
|
2032
|
+
create_table :affiliates, id: :bigint, options: "CHARACTER SET utf8mb4 COLLATE utf8mb4_bin" do |t|
|
2033
|
+
t.string :name, limit: 250, null: true, charset: "utf8mb4", collation: "utf8mb4_bin"
|
2034
|
+
t.integer :category_id, limit: 8, null: false
|
2035
|
+
end
|
2036
|
+
add_index :advertisers, [:category_id], name: :on_category_id
|
2037
|
+
add_index :affiliates, [:category_id], name: :on_category_id
|
2038
|
+
add_foreign_key :advertisers, :categories, column: :category_id, name: :index_advertisers_on_category_id
|
2039
|
+
add_foreign_key :affiliates, :categories, column: :category_id, name: :index_affiliates_on_category_id
|
2040
|
+
EOS
|
2041
|
+
)
|
2042
|
+
migrate
|
2043
|
+
|
2044
|
+
nuke_model_class(Advertiser)
|
2045
|
+
nuke_model_class(Affiliate)
|
2046
|
+
end
|
2047
|
+
end if !defined?(SQLite3) && ActiveRecord::VERSION::MAJOR >= 5
|
2048
|
+
|
2077
2049
|
describe 'serialize' do
|
2078
2050
|
before do
|
2079
2051
|
class Ad < ActiveRecord::Base
|
@@ -2258,8 +2230,8 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
2258
2230
|
end
|
2259
2231
|
end
|
2260
2232
|
|
2261
|
-
context "for Rails #{
|
2262
|
-
if
|
2233
|
+
context "for Rails #{ActiveSupport::VERSION::MAJOR}" do
|
2234
|
+
if ActiveSupport::VERSION::MAJOR >= 5
|
2263
2235
|
let(:optional_true) { { optional: true } }
|
2264
2236
|
let(:optional_false) { { optional: false } }
|
2265
2237
|
else
|
@@ -2269,80 +2241,202 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
2269
2241
|
let(:optional_flag) { { false => optional_false, true => optional_true } }
|
2270
2242
|
|
2271
2243
|
describe 'belongs_to' do
|
2272
|
-
|
2273
|
-
|
2274
|
-
|
2275
|
-
|
2244
|
+
context 'with AdCategory and Advert in DB' do
|
2245
|
+
before do
|
2246
|
+
unless defined?(AdCategory)
|
2247
|
+
class AdCategory < ActiveRecord::Base
|
2248
|
+
declare_schema { }
|
2249
|
+
end
|
2276
2250
|
end
|
2277
|
-
end
|
2278
2251
|
|
2279
|
-
|
2280
|
-
|
2281
|
-
|
2282
|
-
|
2283
|
-
|
2252
|
+
class Advert < ActiveRecord::Base
|
2253
|
+
declare_schema do
|
2254
|
+
string :name, limit: 250, null: true
|
2255
|
+
integer :category_id, limit: 8
|
2256
|
+
integer :nullable_category_id, limit: 8, null: true
|
2257
|
+
end
|
2284
2258
|
end
|
2259
|
+
up = Generators::DeclareSchema::Migration::Migrator.run.first
|
2260
|
+
ActiveRecord::Migration.class_eval(up)
|
2285
2261
|
end
|
2286
|
-
up = Generators::DeclareSchema::Migration::Migrator.run.first
|
2287
|
-
ActiveRecord::Migration.class_eval(up)
|
2288
|
-
end
|
2289
2262
|
|
2290
|
-
|
2291
|
-
class AdvertBelongsTo < ActiveRecord::Base
|
2292
|
-
self.table_name = 'adverts'
|
2293
|
-
declare_schema { }
|
2294
|
-
reset_column_information
|
2295
|
-
belongs_to :ad_category, optional: true
|
2296
|
-
end
|
2297
|
-
expect(AdvertBelongsTo.reflections['ad_category'].options).to eq(optional_true)
|
2298
|
-
end
|
2299
|
-
|
2300
|
-
describe 'contradictory settings' do # contradictory settings are ok--for example, during migration
|
2301
|
-
it 'passes through optional: true, null: false' do
|
2263
|
+
it 'passes through optional: when given' do
|
2302
2264
|
class AdvertBelongsTo < ActiveRecord::Base
|
2303
2265
|
self.table_name = 'adverts'
|
2304
2266
|
declare_schema { }
|
2305
2267
|
reset_column_information
|
2306
|
-
belongs_to :ad_category, optional: true
|
2268
|
+
belongs_to :ad_category, optional: true
|
2307
2269
|
end
|
2308
2270
|
expect(AdvertBelongsTo.reflections['ad_category'].options).to eq(optional_true)
|
2309
|
-
expect(AdvertBelongsTo.field_specs['ad_category_id'].options&.[](:null)).to eq(false)
|
2310
2271
|
end
|
2311
2272
|
|
2312
|
-
|
2313
|
-
|
2314
|
-
|
2315
|
-
|
2316
|
-
|
2317
|
-
|
2273
|
+
describe 'contradictory settings' do # contradictory settings are ok--for example, during migration
|
2274
|
+
it 'passes through optional: true, null: false' do
|
2275
|
+
class AdvertBelongsTo < ActiveRecord::Base
|
2276
|
+
self.table_name = 'adverts'
|
2277
|
+
declare_schema { }
|
2278
|
+
reset_column_information
|
2279
|
+
belongs_to :ad_category, optional: true, null: false
|
2280
|
+
end
|
2281
|
+
expect(AdvertBelongsTo.reflections['ad_category'].options).to eq(optional_true)
|
2282
|
+
expect(AdvertBelongsTo.field_specs['ad_category_id'].options&.[](:null)).to eq(false)
|
2318
2283
|
end
|
2319
|
-
|
2320
|
-
|
2284
|
+
|
2285
|
+
it 'passes through optional: false, null: true' do
|
2286
|
+
class AdvertBelongsTo < ActiveRecord::Base
|
2287
|
+
self.table_name = 'adverts'
|
2288
|
+
declare_schema { }
|
2289
|
+
reset_column_information
|
2290
|
+
belongs_to :ad_category, optional: false, null: true
|
2291
|
+
end
|
2292
|
+
expect(AdvertBelongsTo.reflections['ad_category'].options).to eq(optional_false)
|
2293
|
+
expect(AdvertBelongsTo.field_specs['ad_category_id'].options&.[](:null)).to eq(true)
|
2294
|
+
end
|
2295
|
+
end
|
2296
|
+
|
2297
|
+
[false, true].each do |nullable|
|
2298
|
+
context "nullable=#{nullable}" do
|
2299
|
+
it 'infers optional: from null:' do
|
2300
|
+
eval <<~EOS
|
2301
|
+
class AdvertBelongsTo < ActiveRecord::Base
|
2302
|
+
declare_schema { }
|
2303
|
+
belongs_to :ad_category, null: #{nullable}
|
2304
|
+
end
|
2305
|
+
EOS
|
2306
|
+
expect(AdvertBelongsTo.reflections['ad_category'].options).to eq(optional_flag[nullable])
|
2307
|
+
expect(AdvertBelongsTo.field_specs['ad_category_id'].options&.[](:null)).to eq(nullable)
|
2308
|
+
end
|
2309
|
+
|
2310
|
+
it 'infers null: from optional:' do
|
2311
|
+
eval <<~EOS
|
2312
|
+
class AdvertBelongsTo < ActiveRecord::Base
|
2313
|
+
declare_schema { }
|
2314
|
+
belongs_to :ad_category, optional: #{nullable}
|
2315
|
+
end
|
2316
|
+
EOS
|
2317
|
+
expect(AdvertBelongsTo.reflections['ad_category'].options).to eq(optional_flag[nullable])
|
2318
|
+
expect(AdvertBelongsTo.field_specs['ad_category_id'].options&.[](:null)).to eq(nullable)
|
2319
|
+
end
|
2320
|
+
end
|
2321
|
+
end
|
2322
|
+
|
2323
|
+
it 'deprecates limit:' do
|
2324
|
+
expect(ActiveSupport::Deprecation).to receive(:warn).with("belongs_to limit: is deprecated since it is now inferred")
|
2325
|
+
eval <<~EOS
|
2326
|
+
class UsingLimit < ActiveRecord::Base
|
2327
|
+
declare_schema { }
|
2328
|
+
belongs_to :ad_category, limit: 4
|
2329
|
+
end
|
2330
|
+
EOS
|
2321
2331
|
end
|
2322
2332
|
end
|
2323
2333
|
|
2324
|
-
|
2325
|
-
|
2326
|
-
|
2327
|
-
|
2328
|
-
|
2329
|
-
|
2330
|
-
|
2331
|
-
|
2332
|
-
EOS
|
2333
|
-
expect(AdvertBelongsTo.reflections['ad_category'].options).to eq(optional_flag[nullable])
|
2334
|
-
expect(AdvertBelongsTo.field_specs['ad_category_id'].options&.[](:null)).to eq(nullable)
|
2334
|
+
context 'when parent object PKs have different limits' do
|
2335
|
+
before do
|
2336
|
+
class IdDefault < ActiveRecord::Base
|
2337
|
+
declare_schema { }
|
2338
|
+
end
|
2339
|
+
class Id4 < ActiveRecord::Base
|
2340
|
+
declare_schema id: :integer do
|
2341
|
+
end
|
2335
2342
|
end
|
2343
|
+
class Id8 < ActiveRecord::Base
|
2344
|
+
declare_schema id: :bigint do
|
2345
|
+
end
|
2346
|
+
end
|
2347
|
+
class Fk < ActiveRecord::Base
|
2348
|
+
declare_schema { }
|
2349
|
+
belongs_to :id_default, (ActiveSupport::VERSION::MAJOR < 5 ? { constraint: false } : {})
|
2350
|
+
belongs_to :id4, (ActiveSupport::VERSION::MAJOR < 5 ? { constraint: false } : {})
|
2351
|
+
belongs_to :id8, (ActiveSupport::VERSION::MAJOR < 5 ? { constraint: false } : {})
|
2352
|
+
end
|
2353
|
+
end
|
2336
2354
|
|
2337
|
-
|
2338
|
-
|
2339
|
-
|
2340
|
-
|
2341
|
-
|
2342
|
-
|
2343
|
-
|
2344
|
-
|
2345
|
-
|
2355
|
+
it 'creates the proper PKs' do
|
2356
|
+
up = Generators::DeclareSchema::Migration::Migrator.run.first
|
2357
|
+
|
2358
|
+
create_id4_defaults = up.split("\n").grep(/create_table :id_defaults/).first
|
2359
|
+
expect(create_id4_defaults).to be, up
|
2360
|
+
expect(create_id4_defaults).to match(/, id: :bigint/)
|
2361
|
+
|
2362
|
+
create_id4s = up.split("\n").grep(/create_table :id4s/).first
|
2363
|
+
expect(create_id4s).to be, up
|
2364
|
+
expect(create_id4s).to match(/, id: :integer/)
|
2365
|
+
|
2366
|
+
create_id8s = up.split("\n").grep(/create_table :id8s/).first
|
2367
|
+
expect(create_id8s).to be, up
|
2368
|
+
expect(create_id8s).to match(/, id: :bigint/)
|
2369
|
+
end
|
2370
|
+
|
2371
|
+
it 'infers the correct FK type from the create_table id: type' do
|
2372
|
+
up = Generators::DeclareSchema::Migration::Migrator.run.first
|
2373
|
+
|
2374
|
+
create_fks = up.split("\n").grep(/t\.integer /).map { |command| command.gsub(', null: false', '').gsub(/^ +/, '') }
|
2375
|
+
if defined?(SQLite3)
|
2376
|
+
create_fks.map! { |command| command.gsub(/limit: [a-z0-9]+/, 'limit: X') }
|
2377
|
+
expect(create_fks).to eq([
|
2378
|
+
't.integer :id_default_id, limit: X',
|
2379
|
+
't.integer :id4_id, limit: X',
|
2380
|
+
't.integer :id8_id, limit: X'
|
2381
|
+
]), up
|
2382
|
+
else
|
2383
|
+
expect(create_fks).to eq([
|
2384
|
+
't.integer :id_default_id, limit: 8',
|
2385
|
+
't.integer :id4_id, limit: 4',
|
2386
|
+
't.integer :id8_id, limit: 8'
|
2387
|
+
]), up
|
2388
|
+
end
|
2389
|
+
end
|
2390
|
+
|
2391
|
+
context "when parent objects were migrated before and later definitions don't have explicit id:" do
|
2392
|
+
before do
|
2393
|
+
up = Generators::DeclareSchema::Migration::Migrator.run.first
|
2394
|
+
ActiveRecord::Migration.class_eval up
|
2395
|
+
nuke_model_class(IdDefault)
|
2396
|
+
nuke_model_class(Id4)
|
2397
|
+
nuke_model_class(Id8)
|
2398
|
+
nuke_model_class(Fk)
|
2399
|
+
ActiveRecord::Base.connection.schema_cache.clear!
|
2400
|
+
|
2401
|
+
|
2402
|
+
class NewIdDefault < ActiveRecord::Base
|
2403
|
+
self.table_name = 'id_defaults'
|
2404
|
+
declare_schema { }
|
2405
|
+
end
|
2406
|
+
class NewId4 < ActiveRecord::Base
|
2407
|
+
self.table_name = 'id4s'
|
2408
|
+
declare_schema { }
|
2409
|
+
end
|
2410
|
+
class NewId8 < ActiveRecord::Base
|
2411
|
+
self.table_name = 'id8s'
|
2412
|
+
declare_schema { }
|
2413
|
+
end
|
2414
|
+
class NewFk < ActiveRecord::Base
|
2415
|
+
declare_schema { }
|
2416
|
+
belongs_to :new_id_default
|
2417
|
+
belongs_to :new_id4
|
2418
|
+
belongs_to :new_id8
|
2419
|
+
end
|
2420
|
+
end
|
2421
|
+
|
2422
|
+
it 'infers the correct FK :integer limit: ' do
|
2423
|
+
up = Generators::DeclareSchema::Migration::Migrator.run.first
|
2424
|
+
|
2425
|
+
create_fks = up.split("\n").grep(/t\.integer /).map { |command| command.gsub(', null: false', '').gsub(/^ +/, '') }
|
2426
|
+
if defined?(SQLite3)
|
2427
|
+
create_fks.map! { |command| command.gsub(/limit: [a-z0-9]+/, 'limit: X') }
|
2428
|
+
expect(create_fks).to eq([
|
2429
|
+
't.integer :new_id_default_id, limit: X',
|
2430
|
+
't.integer :new_id4_id, limit: X',
|
2431
|
+
't.integer :new_id8_id, limit: X'
|
2432
|
+
]), up
|
2433
|
+
else
|
2434
|
+
expect(create_fks).to eq([
|
2435
|
+
't.integer :new_id_default_id, limit: 8',
|
2436
|
+
't.integer :new_id4_id, limit: 4',
|
2437
|
+
't.integer :new_id8_id, limit: 8'
|
2438
|
+
]), up
|
2439
|
+
end
|
2346
2440
|
end
|
2347
2441
|
end
|
2348
2442
|
end
|
@@ -2365,13 +2459,13 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
2365
2459
|
migration_content = File.read(migrations.first)
|
2366
2460
|
first_line = migration_content.split("\n").first
|
2367
2461
|
base_class = first_line.split(' < ').last
|
2368
|
-
expect(base_class).to eq("(
|
2462
|
+
expect(base_class).to eq("(ActiveSupport::VERSION::MAJOR >= 5 ? ActiveRecord::Migration[4.2] : ActiveRecord::Migration)")
|
2369
2463
|
end
|
2370
2464
|
end
|
2371
2465
|
|
2372
2466
|
context 'Does not generate migrations' do
|
2373
2467
|
it 'for aliased fields bigint -> integer limit 8' do
|
2374
|
-
if
|
2468
|
+
if ActiveSupport::VERSION::MAJOR >= 5 || !ActiveRecord::Base.connection.class.name.match?(/SQLite3Adapter/)
|
2375
2469
|
class Advert < active_record_base_class.constantize
|
2376
2470
|
declare_schema do
|
2377
2471
|
bigint :price
|
@@ -2383,7 +2477,7 @@ RSpec.describe 'DeclareSchema Migration Generator' do
|
|
2383
2477
|
migrations = Dir.glob('db/migrate/*declare_schema_migration*.rb')
|
2384
2478
|
expect(migrations.size).to eq(1), migrations.inspect
|
2385
2479
|
|
2386
|
-
if defined?(Mysql2) &&
|
2480
|
+
if defined?(Mysql2) && ActiveSupport::VERSION::MAJOR < 5
|
2387
2481
|
ActiveRecord::Base.connection.execute("ALTER TABLE adverts ADD PRIMARY KEY (id)")
|
2388
2482
|
end
|
2389
2483
|
|