schema_plus_foreign_keys 0.1.8 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/prs.yml +134 -0
- data/.gitignore +1 -0
- data/.simplecov +20 -0
- data/Gemfile +4 -1
- data/README.md +25 -18
- data/Rakefile +3 -1
- data/gemfiles/Gemfile.base +1 -1
- data/gemfiles/activerecord-5.2/Gemfile.base +2 -1
- data/gemfiles/activerecord-5.2/Gemfile.mysql2 +2 -2
- data/gemfiles/activerecord-5.2/Gemfile.postgresql +2 -2
- data/gemfiles/activerecord-5.2/Gemfile.sqlite3 +3 -3
- data/gemfiles/activerecord-6.0/Gemfile.base +4 -0
- data/gemfiles/activerecord-6.0/Gemfile.mysql2 +10 -0
- data/gemfiles/activerecord-6.0/Gemfile.postgresql +10 -0
- data/gemfiles/{activerecord-4.2.0 → activerecord-6.0}/Gemfile.sqlite3 +3 -3
- data/lib/schema_plus/foreign_keys/active_record/base.rb +2 -0
- data/lib/schema_plus/foreign_keys/active_record/connection_adapters/abstract/schema_creation.rb +2 -11
- data/lib/schema_plus/foreign_keys/active_record/connection_adapters/abstract_adapter.rb +7 -47
- data/lib/schema_plus/foreign_keys/active_record/connection_adapters/foreign_key_definition.rb +4 -35
- data/lib/schema_plus/foreign_keys/active_record/connection_adapters/mysql2_adapter.rb +15 -16
- data/lib/schema_plus/foreign_keys/active_record/connection_adapters/postgresql_adapter.rb +8 -6
- data/lib/schema_plus/foreign_keys/active_record/connection_adapters/sqlite3_adapter.rb +8 -6
- data/lib/schema_plus/foreign_keys/active_record/connection_adapters/table_definition.rb +7 -46
- data/lib/schema_plus/foreign_keys/active_record/migration/command_recorder.rb +4 -2
- data/lib/schema_plus/foreign_keys/middleware/dumper.rb +4 -2
- data/lib/schema_plus/foreign_keys/middleware/migration.rb +13 -5
- data/lib/schema_plus/foreign_keys/middleware/model.rb +2 -0
- data/lib/schema_plus/foreign_keys/middleware/mysql.rb +3 -1
- data/lib/schema_plus/foreign_keys/middleware/sql.rb +2 -16
- data/lib/schema_plus/foreign_keys/version.rb +3 -1
- data/lib/schema_plus/foreign_keys.rb +2 -1
- data/lib/schema_plus_foreign_keys.rb +2 -0
- data/schema_dev.yml +4 -6
- data/schema_plus_foreign_keys.gemspec +10 -9
- data/spec/deprecation_spec.rb +11 -110
- data/spec/foreign_key_definition_spec.rb +5 -3
- data/spec/foreign_key_spec.rb +22 -20
- data/spec/migration_spec.rb +35 -59
- data/spec/named_schemas_spec.rb +16 -14
- data/spec/schema_dumper_spec.rb +13 -13
- data/spec/spec_helper.rb +4 -2
- data/spec/support/reference.rb +3 -2
- metadata +31 -89
- data/.travis.yml +0 -33
- data/gemfiles/activerecord-4.2.0/Gemfile.base +0 -3
- data/gemfiles/activerecord-4.2.0/Gemfile.mysql2 +0 -10
- data/gemfiles/activerecord-4.2.0/Gemfile.postgresql +0 -10
- data/gemfiles/activerecord-4.2.1/Gemfile.base +0 -3
- data/gemfiles/activerecord-4.2.1/Gemfile.mysql2 +0 -10
- data/gemfiles/activerecord-4.2.1/Gemfile.postgresql +0 -10
- data/gemfiles/activerecord-4.2.1/Gemfile.sqlite3 +0 -10
- data/gemfiles/activerecord-4.2.6/Gemfile.base +0 -3
- data/gemfiles/activerecord-4.2.6/Gemfile.mysql2 +0 -10
- data/gemfiles/activerecord-4.2.6/Gemfile.postgresql +0 -10
- data/gemfiles/activerecord-4.2.6/Gemfile.sqlite3 +0 -10
- data/gemfiles/activerecord-5.0/Gemfile.base +0 -3
- data/gemfiles/activerecord-5.0/Gemfile.mysql2 +0 -10
- data/gemfiles/activerecord-5.0/Gemfile.postgresql +0 -10
- data/gemfiles/activerecord-5.0/Gemfile.sqlite3 +0 -10
- data/gemfiles/activerecord-5.1/Gemfile.base +0 -3
- data/gemfiles/activerecord-5.1/Gemfile.mysql2 +0 -10
- data/gemfiles/activerecord-5.1/Gemfile.postgresql +0 -10
- data/gemfiles/activerecord-5.1/Gemfile.sqlite3 +0 -10
data/spec/foreign_key_spec.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe "Foreign Key" do
|
@@ -7,12 +9,12 @@ describe "Foreign Key" do
|
|
7
9
|
context "created with table" do
|
8
10
|
before(:each) do
|
9
11
|
define_schema do
|
10
|
-
create_table :users, :
|
12
|
+
create_table :users, force: true do |t|
|
11
13
|
t.string :login
|
12
14
|
end
|
13
|
-
create_table :comments, :
|
15
|
+
create_table :comments, force: true do |t|
|
14
16
|
t.references :user
|
15
|
-
t.foreign_key :
|
17
|
+
t.foreign_key :users, column: :user_id
|
16
18
|
end
|
17
19
|
end
|
18
20
|
class User < ::ActiveRecord::Base ; end
|
@@ -34,21 +36,21 @@ describe "Foreign Key" do
|
|
34
36
|
|
35
37
|
before(:each) do
|
36
38
|
define_schema do
|
37
|
-
create_table :users, :
|
39
|
+
create_table :users, force: true do |t|
|
38
40
|
t.string :login
|
39
41
|
t.datetime :deleted_at
|
40
42
|
end
|
41
43
|
|
42
|
-
create_table :posts, :
|
44
|
+
create_table :posts, force: true do |t|
|
43
45
|
t.text :body
|
44
46
|
t.references :user
|
45
47
|
t.references :author
|
46
48
|
end
|
47
49
|
|
48
|
-
create_table :comments, :
|
50
|
+
create_table :comments, force: true do |t|
|
49
51
|
t.text :body
|
50
52
|
t.references :post
|
51
|
-
t.foreign_key :
|
53
|
+
t.foreign_key :posts, column: :post_id
|
52
54
|
end
|
53
55
|
end
|
54
56
|
class User < ::ActiveRecord::Base ; end
|
@@ -58,12 +60,12 @@ describe "Foreign Key" do
|
|
58
60
|
end
|
59
61
|
|
60
62
|
|
61
|
-
context "works", :
|
63
|
+
context "works", sqlite3: :skip do
|
62
64
|
|
63
65
|
context "when is added", "posts(author_id)" do
|
64
66
|
|
65
67
|
before(:each) do
|
66
|
-
add_foreign_key(:posts, :users, :
|
68
|
+
add_foreign_key(:posts, :users, column: :author_id, on_update: :cascade, on_delete: :restrict)
|
67
69
|
end
|
68
70
|
|
69
71
|
it "references users(id)" do
|
@@ -90,7 +92,7 @@ describe "Foreign Key" do
|
|
90
92
|
|
91
93
|
context "when is dropped", "comments(post_id)" do
|
92
94
|
|
93
|
-
let(:foreign_key_name) { fk = Comment.foreign_keys.detect
|
95
|
+
let(:foreign_key_name) { fk = Comment.foreign_keys.detect { |it| it.column == 'post_id' } and fk.name }
|
94
96
|
|
95
97
|
before(:each) do
|
96
98
|
remove_foreign_key(:comments, name: foreign_key_name)
|
@@ -112,7 +114,7 @@ describe "Foreign Key" do
|
|
112
114
|
|
113
115
|
context "when drop using hash", "comments(post_id)" do
|
114
116
|
|
115
|
-
let(:foreign_key_name) { fk = Comment.foreign_keys.detect
|
117
|
+
let(:foreign_key_name) { fk = Comment.foreign_keys.detect { |it| it.column == 'post_id' } and fk.name }
|
116
118
|
|
117
119
|
it "finds by name" do
|
118
120
|
remove_foreign_key(:comments, name: foreign_key_name)
|
@@ -131,7 +133,7 @@ describe "Foreign Key" do
|
|
131
133
|
end
|
132
134
|
|
133
135
|
it "does not error with :if_exists" do
|
134
|
-
expect{remove_foreign_key(:comments, "posts", column: "nonesuch", :
|
136
|
+
expect{remove_foreign_key(:comments, "posts", column: "nonesuch", if_exists: true)}.to_not raise_error
|
135
137
|
end
|
136
138
|
end
|
137
139
|
|
@@ -149,8 +151,8 @@ describe "Foreign Key" do
|
|
149
151
|
context "when table name is a reserved word" do
|
150
152
|
before(:each) do
|
151
153
|
migration.suppress_messages do
|
152
|
-
migration.create_table :references, :
|
153
|
-
t.references :post, :
|
154
|
+
migration.create_table :references, force: true do |t|
|
155
|
+
t.references :post, foreign_key: false
|
154
156
|
end
|
155
157
|
end
|
156
158
|
end
|
@@ -168,11 +170,11 @@ describe "Foreign Key" do
|
|
168
170
|
|
169
171
|
end
|
170
172
|
|
171
|
-
context "raises an exception", :
|
173
|
+
context "raises an exception", sqlite3: :only do
|
172
174
|
|
173
175
|
it "when attempting to add" do
|
174
176
|
expect {
|
175
|
-
add_foreign_key(:posts, :users, :
|
177
|
+
add_foreign_key(:posts, :users, column: :author_id, on_update: :cascade, on_delete: :restrict)
|
176
178
|
}.to raise_error(NotImplementedError)
|
177
179
|
end
|
178
180
|
|
@@ -186,18 +188,18 @@ describe "Foreign Key" do
|
|
186
188
|
end
|
187
189
|
|
188
190
|
protected
|
189
|
-
def add_foreign_key(*args)
|
191
|
+
def add_foreign_key(*args, **kwargs)
|
190
192
|
migration.suppress_messages do
|
191
|
-
migration.add_foreign_key(*args)
|
193
|
+
migration.add_foreign_key(*args, **kwargs)
|
192
194
|
end
|
193
195
|
User.reset_column_information
|
194
196
|
Post.reset_column_information
|
195
197
|
Comment.reset_column_information
|
196
198
|
end
|
197
199
|
|
198
|
-
def remove_foreign_key(*args)
|
200
|
+
def remove_foreign_key(*args, **kwargs)
|
199
201
|
migration.suppress_messages do
|
200
|
-
migration.remove_foreign_key(*args)
|
202
|
+
migration.remove_foreign_key(*args, **kwargs)
|
201
203
|
end
|
202
204
|
User.reset_column_information
|
203
205
|
Post.reset_column_information
|
data/spec/migration_spec.rb
CHANGED
@@ -1,30 +1,28 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
2
4
|
require 'spec_helper'
|
3
5
|
|
4
6
|
describe ActiveRecord::Migration do
|
5
|
-
let(:column_type) {
|
6
|
-
Gem::Requirement.new('< 5.1').satisfied_by?(::ActiveRecord.version) ? :integer : :bigint
|
7
|
-
}
|
8
|
-
|
9
7
|
before(:each) do
|
10
8
|
define_schema do
|
11
9
|
|
12
|
-
create_table :users, :
|
13
|
-
t.string :login, :
|
10
|
+
create_table :users, force: true do |t|
|
11
|
+
t.string :login, index: { unique: true }
|
14
12
|
end
|
15
13
|
|
16
|
-
create_table :members, :
|
14
|
+
create_table :members, force: true do |t|
|
17
15
|
t.string :login
|
18
16
|
end
|
19
17
|
|
20
|
-
create_table :comments, :
|
18
|
+
create_table :comments, force: true do |t|
|
21
19
|
t.string :content
|
22
20
|
t.integer :user
|
23
21
|
t.references :user
|
24
|
-
t.foreign_key :
|
22
|
+
t.foreign_key :users, column: :user_id, primary_key: :id
|
25
23
|
end
|
26
24
|
|
27
|
-
create_table :posts, :
|
25
|
+
create_table :posts, force: true do |t|
|
28
26
|
t.string :content
|
29
27
|
end
|
30
28
|
end
|
@@ -39,18 +37,18 @@ describe ActiveRecord::Migration do
|
|
39
37
|
@model = Post
|
40
38
|
end
|
41
39
|
|
42
|
-
it "should enable foreign keys", :
|
40
|
+
it "should enable foreign keys", sqlite3: :only do
|
43
41
|
sql = []
|
44
42
|
allow(@model.connection).to receive(:execute) { |str| sql << str }
|
45
43
|
recreate_table(@model) do |t|
|
46
|
-
t.send
|
44
|
+
t.send :bigint, :user, foreign_key: true
|
47
45
|
end
|
48
46
|
expect(sql.join('; ')).to match(/PRAGMA FOREIGN_KEYS = ON.*CREATE TABLE "posts"/)
|
49
47
|
end
|
50
48
|
|
51
49
|
it "should create foreign key with default reference" do
|
52
50
|
recreate_table(@model) do |t|
|
53
|
-
t.send
|
51
|
+
t.send :bigint, :user, foreign_key: true
|
54
52
|
end
|
55
53
|
expect(@model).to reference(:users, :id).on(:user)
|
56
54
|
end
|
@@ -65,16 +63,16 @@ describe ActiveRecord::Migration do
|
|
65
63
|
|
66
64
|
it "should create foreign key with different reference" do
|
67
65
|
recreate_table(@model) do |t|
|
68
|
-
t.references :author, :
|
66
|
+
t.references :author, foreign_key: { references: :users }
|
69
67
|
end
|
70
68
|
expect(@model).to reference(:users, :id).on(:author_id)
|
71
69
|
end
|
72
70
|
|
73
71
|
it "should create foreign key without modifying input hash" do
|
74
|
-
hash = { :
|
72
|
+
hash = { references: :users }
|
75
73
|
hash_original = hash.dup
|
76
74
|
recreate_table(@model) do |t|
|
77
|
-
t.references :author, :
|
75
|
+
t.references :author, foreign_key: hash
|
78
76
|
end
|
79
77
|
expect(hash).to eq(hash_original)
|
80
78
|
end
|
@@ -99,7 +97,7 @@ describe ActiveRecord::Migration do
|
|
99
97
|
recreate_table @model do |t|
|
100
98
|
t.references :user, :foreign_key => true
|
101
99
|
end
|
102
|
-
expect(@model).to reference(:users, :id).with_name(
|
100
|
+
expect(@model).to reference(:users, :id).with_name(/fk_rails_\w+/)
|
103
101
|
end
|
104
102
|
|
105
103
|
it "should create foreign key with specified name" do
|
@@ -352,7 +350,7 @@ describe ActiveRecord::Migration do
|
|
352
350
|
|
353
351
|
it "should create a foreign key constraint using :references"+suffix, :sqlite3 => :skip do
|
354
352
|
change_table(@model, :bulk => bulk) do |t|
|
355
|
-
t.send
|
353
|
+
t.send :bigint, :user_id, foreign_key: true
|
356
354
|
end
|
357
355
|
expect(@model).to reference(:users, :id).on(:user_id)
|
358
356
|
end
|
@@ -373,19 +371,19 @@ describe ActiveRecord::Migration do
|
|
373
371
|
end
|
374
372
|
|
375
373
|
it "should create foreign key" do
|
376
|
-
add_column(:post_id,
|
374
|
+
add_column(:post_id, :bigint, foreign_key: true) do
|
377
375
|
expect(@model).to reference(:posts, :id).on(:post_id)
|
378
376
|
end
|
379
377
|
end
|
380
378
|
|
381
379
|
it "should create foreign key to explicitly given table" do
|
382
|
-
add_column(:author_id,
|
380
|
+
add_column(:author_id, :bigint, :foreign_key => { :references => :users }) do
|
383
381
|
expect(@model).to reference(:users, :id).on(:author_id)
|
384
382
|
end
|
385
383
|
end
|
386
384
|
|
387
385
|
it "should create foreign key to explicitly given table using shortcut" do
|
388
|
-
add_column(:author_id,
|
386
|
+
add_column(:author_id, :bigint, :references => :users) do
|
389
387
|
expect(@model).to reference(:users, :id).on(:author_id)
|
390
388
|
end
|
391
389
|
end
|
@@ -397,14 +395,14 @@ describe ActiveRecord::Migration do
|
|
397
395
|
end
|
398
396
|
|
399
397
|
it "should create foreign key to the same table on parent_id" do
|
400
|
-
add_column(:parent_id,
|
398
|
+
add_column(:parent_id, :bigint, foreign_key: true) do
|
401
399
|
expect(@model).to reference(@model.table_name, :id).on(:parent_id)
|
402
400
|
end
|
403
401
|
end
|
404
402
|
|
405
403
|
it "should use default on_update action" do
|
406
404
|
SchemaPlus::ForeignKeys.config.on_update = :cascade
|
407
|
-
add_column(:post_id,
|
405
|
+
add_column(:post_id, :bigint, foreign_key: true) do
|
408
406
|
expect(@model).to reference.on(:post_id).on_update(:cascade)
|
409
407
|
end
|
410
408
|
SchemaPlus::ForeignKeys.config.on_update = nil
|
@@ -412,7 +410,7 @@ describe ActiveRecord::Migration do
|
|
412
410
|
|
413
411
|
it "should use default on_delete action" do
|
414
412
|
SchemaPlus::ForeignKeys.config.on_delete = :cascade
|
415
|
-
add_column(:post_id,
|
413
|
+
add_column(:post_id, :bigint, foreign_key: true) do
|
416
414
|
expect(@model).to reference.on(:post_id).on_delete(:cascade)
|
417
415
|
end
|
418
416
|
SchemaPlus::ForeignKeys.config.on_delete = nil
|
@@ -421,22 +419,22 @@ describe ActiveRecord::Migration do
|
|
421
419
|
it "should allow to overwrite default actions" do
|
422
420
|
SchemaPlus::ForeignKeys.config.on_delete = :cascade
|
423
421
|
SchemaPlus::ForeignKeys.config.on_update = :restrict
|
424
|
-
add_column(:post_id,
|
422
|
+
add_column(:post_id, :bigint, :foreign_key => { :on_update => :nullify, :on_delete => :nullify}) do
|
425
423
|
expect(@model).to reference.on(:post_id).on_delete(:nullify).on_update(:nullify)
|
426
424
|
end
|
427
425
|
SchemaPlus::ForeignKeys.config.on_delete = nil
|
428
426
|
end
|
429
427
|
|
430
428
|
it "should create foreign key with default name" do
|
431
|
-
add_column(:post_id,
|
432
|
-
expect(@model).to reference(:posts, :id).with_name(
|
429
|
+
add_column(:post_id, :bigint, foreign_key: true) do
|
430
|
+
expect(@model).to reference(:posts, :id).with_name(/fk_rails_\w+/)
|
433
431
|
end
|
434
432
|
end
|
435
433
|
|
436
434
|
protected
|
437
|
-
def add_column(column_name,
|
435
|
+
def add_column(column_name, type, **options)
|
438
436
|
table = @model.table_name
|
439
|
-
ActiveRecord::Migration.add_column(table, column_name,
|
437
|
+
ActiveRecord::Migration.add_column(table, column_name, type, **options)
|
440
438
|
@model.reset_column_information
|
441
439
|
yield if block_given?
|
442
440
|
ActiveRecord::Migration.remove_column(table, column_name)
|
@@ -471,22 +469,22 @@ describe ActiveRecord::Migration do
|
|
471
469
|
end
|
472
470
|
|
473
471
|
it "should drop foreign key if it is no longer valid" do
|
474
|
-
change_column :user_id,
|
472
|
+
change_column :user_id, :bigint, :foreign_key => { :references => :members }
|
475
473
|
expect(@model).not_to reference(:users)
|
476
474
|
end
|
477
475
|
|
478
476
|
it "should drop foreign key if requested to do so" do
|
479
|
-
change_column :user_id,
|
477
|
+
change_column :user_id, :bigint, :foreign_key => { :references => nil }
|
480
478
|
expect(@model).not_to reference(:users)
|
481
479
|
end
|
482
480
|
|
483
481
|
it "should reference pointed table afterwards if new one is created" do
|
484
|
-
change_column :user_id,
|
482
|
+
change_column :user_id, :bigint, :foreign_key => { :references => :members }
|
485
483
|
expect(@model).to reference(:members)
|
486
484
|
end
|
487
485
|
|
488
486
|
it "should maintain foreign key if it's unaffected by change" do
|
489
|
-
change_column :user_id,
|
487
|
+
change_column :user_id, :bigint, :default => 0
|
490
488
|
expect(@model).to reference(:users)
|
491
489
|
end
|
492
490
|
|
@@ -495,10 +493,10 @@ describe ActiveRecord::Migration do
|
|
495
493
|
end
|
496
494
|
|
497
495
|
protected
|
498
|
-
def change_column(column_name,
|
496
|
+
def change_column(column_name, type, **options)
|
499
497
|
table = @model.table_name
|
500
498
|
ActiveRecord::Migration.suppress_messages do
|
501
|
-
ActiveRecord::Migration.change_column(table, column_name,
|
499
|
+
ActiveRecord::Migration.change_column(table, column_name, type, **options)
|
502
500
|
@model.reset_column_information
|
503
501
|
end
|
504
502
|
end
|
@@ -529,27 +527,6 @@ describe ActiveRecord::Migration do
|
|
529
527
|
end
|
530
528
|
end
|
531
529
|
|
532
|
-
|
533
|
-
context "when table is renamed" do
|
534
|
-
|
535
|
-
before(:each) do
|
536
|
-
@model = Comment
|
537
|
-
recreate_table @model do |t|
|
538
|
-
t.references :user, foreign_key: true
|
539
|
-
t.integer :xyz, :index => true
|
540
|
-
end
|
541
|
-
ActiveRecord::Migration.suppress_messages do
|
542
|
-
ActiveRecord::Migration.rename_table @model.table_name, :newname
|
543
|
-
end
|
544
|
-
end
|
545
|
-
|
546
|
-
it "should rename foreign key constraints", :sqlite3 => :skip do
|
547
|
-
expect(ActiveRecord::Base.connection.foreign_keys(:newname).first.name).to match(/newname/)
|
548
|
-
end
|
549
|
-
|
550
|
-
end
|
551
|
-
|
552
|
-
|
553
530
|
context "when table with more than one fk constraint is renamed", :sqlite3 => :skip do
|
554
531
|
|
555
532
|
before(:each) do
|
@@ -571,17 +548,16 @@ describe ActiveRecord::Migration do
|
|
571
548
|
|
572
549
|
def recreate_table(model, opts={}, &block)
|
573
550
|
ActiveRecord::Migration.suppress_messages do
|
574
|
-
ActiveRecord::Migration.create_table model.table_name, opts.merge(:force => true), &block
|
551
|
+
ActiveRecord::Migration.create_table model.table_name, **opts.merge(:force => true), &block
|
575
552
|
end
|
576
553
|
model.reset_column_information
|
577
554
|
end
|
578
555
|
|
579
556
|
def change_table(model, opts={}, &block)
|
580
557
|
ActiveRecord::Migration.suppress_messages do
|
581
|
-
ActiveRecord::Migration.change_table model.table_name, opts, &block
|
558
|
+
ActiveRecord::Migration.change_table model.table_name, **opts, &block
|
582
559
|
end
|
583
560
|
model.reset_column_information
|
584
561
|
end
|
585
562
|
|
586
563
|
end
|
587
|
-
|
data/spec/named_schemas_spec.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
|
-
describe "with multiple schemas" do
|
5
|
+
describe "with multiple schemas", sqlite3: :skip do
|
4
6
|
def connection
|
5
7
|
ActiveRecord::Base.connection
|
6
8
|
end
|
@@ -22,7 +24,7 @@ describe "with multiple schemas" do
|
|
22
24
|
|
23
25
|
before(:each) do
|
24
26
|
define_schema do
|
25
|
-
create_table :users, :
|
27
|
+
create_table :users, force: true do |t|
|
26
28
|
t.string :login
|
27
29
|
end
|
28
30
|
end
|
@@ -56,8 +58,8 @@ describe "with multiple schemas" do
|
|
56
58
|
end
|
57
59
|
|
58
60
|
it "should not find foreign keys in other schema" do
|
59
|
-
connection.create_table :comments, :
|
60
|
-
t.references :user, :
|
61
|
+
connection.create_table :comments, force: true do |t|
|
62
|
+
t.references :user, foreign_key: false
|
61
63
|
end
|
62
64
|
Comment.reset_column_information
|
63
65
|
expect(Comment.foreign_keys.length).to eq(0)
|
@@ -66,8 +68,8 @@ describe "with multiple schemas" do
|
|
66
68
|
end
|
67
69
|
|
68
70
|
it "should find foreign keys in this schema" do
|
69
|
-
connection.create_table :comments, :
|
70
|
-
t.references :user, :
|
71
|
+
connection.create_table :comments, force: true do |t|
|
72
|
+
t.references :user, foreign_key: true
|
71
73
|
end
|
72
74
|
Comment.reset_column_information
|
73
75
|
expect(Comment.foreign_keys.map(&:column).flatten).to eq(["user_id"])
|
@@ -80,13 +82,13 @@ describe "with multiple schemas" do
|
|
80
82
|
context "foreign key migrations" do
|
81
83
|
before(:each) do
|
82
84
|
define_schema do
|
83
|
-
create_table "items", :
|
85
|
+
create_table "items", force: true do |t|
|
84
86
|
end
|
85
|
-
create_table "schema_plus_test2.groups", :
|
87
|
+
create_table "schema_plus_test2.groups", force: true do |t|
|
86
88
|
end
|
87
|
-
create_table "schema_plus_test2.members", :
|
88
|
-
t.references :item, :
|
89
|
-
t.references :group, :
|
89
|
+
create_table "schema_plus_test2.members", force: true do |t|
|
90
|
+
t.references :item, foreign_key: { name: 'fk_test2_members_items' } unless SchemaDev::Rspec::Helpers.mysql?
|
91
|
+
t.references :group, foreign_key: { name: 'fk_test2_members_groups', references: "schema_plus_test2.groups" }
|
90
92
|
end
|
91
93
|
end
|
92
94
|
class Group < ::ActiveRecord::Base
|
@@ -122,13 +124,13 @@ describe "with multiple schemas" do
|
|
122
124
|
expect(Member.foreign_keys.map(&:to_table)).to include "schema_plus_test2.groups"
|
123
125
|
end
|
124
126
|
|
125
|
-
it "should reference table in default schema", :
|
127
|
+
it "should reference table in default schema", mysql: :skip do
|
126
128
|
expect(Member.foreign_keys.map(&:to_table)).to include "items"
|
127
129
|
end
|
128
130
|
|
129
131
|
it "should include the schema in the constraint name" do
|
130
|
-
expected_names = ["
|
131
|
-
expected_names << "
|
132
|
+
expected_names = ["fk_test2_members_groups"]
|
133
|
+
expected_names << "fk_test2_members_items" unless SchemaDev::Rspec::Helpers.mysql?
|
132
134
|
expect(Member.foreign_keys.map(&:name).sort).to match_array(expected_names.sort)
|
133
135
|
end
|
134
136
|
end
|
data/spec/schema_dumper_spec.rb
CHANGED
@@ -1,21 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
require 'stringio'
|
3
5
|
|
4
6
|
describe "Schema dump" do
|
5
|
-
let(:column_type) { Gem::Requirement.new('< 5.1').satisfied_by?(::ActiveRecord.version) ? :integer : :bigint }
|
6
|
-
|
7
7
|
before(:each) do
|
8
8
|
ActiveRecord::Migration.suppress_messages do
|
9
9
|
ActiveRecord::Schema.define do
|
10
10
|
connection.tables_only.each do |table| drop_table table, force: :cascade end
|
11
11
|
|
12
|
-
create_table :users, :
|
12
|
+
create_table :users, force: true do |t|
|
13
13
|
t.string :login
|
14
14
|
t.datetime :deleted_at
|
15
15
|
t.references :first_post, index: { unique: true }
|
16
16
|
end
|
17
17
|
|
18
|
-
create_table :posts, :
|
18
|
+
create_table :posts, force: true do |t|
|
19
19
|
t.text :body
|
20
20
|
t.references :user
|
21
21
|
t.references :first_comment
|
@@ -33,7 +33,7 @@ describe "Schema dump" do
|
|
33
33
|
t.boolean :boolean_col
|
34
34
|
end
|
35
35
|
|
36
|
-
create_table :comments, :
|
36
|
+
create_table :comments, force: true do |t|
|
37
37
|
t.text :body
|
38
38
|
t.references :post
|
39
39
|
t.references :commenter
|
@@ -59,7 +59,7 @@ describe "Schema dump" do
|
|
59
59
|
end
|
60
60
|
|
61
61
|
it "should include foreign_key name" do
|
62
|
-
with_foreign_key Post, :user_id, :users, :id, :
|
62
|
+
with_foreign_key Post, :user_id, :users, :id, name: "yippee" do
|
63
63
|
expect(dump_posts).to match(/user_id.*foreign_key.*users.*:name=>"yippee"/)
|
64
64
|
end
|
65
65
|
end
|
@@ -72,7 +72,7 @@ describe "Schema dump" do
|
|
72
72
|
|
73
73
|
|
74
74
|
it "should include foreign_key exactly once" do
|
75
|
-
with_foreign_key Post, :user_id, :users, :id, :
|
75
|
+
with_foreign_key Post, :user_id, :users, :id, name: "yippee" do
|
76
76
|
expect(dump_posts.scan(/foreign_key.*yippee"/).length).to eq 1
|
77
77
|
end
|
78
78
|
end
|
@@ -98,7 +98,7 @@ describe "Schema dump" do
|
|
98
98
|
|
99
99
|
it "should handle regexp in ignore_tables" do
|
100
100
|
with_foreign_key Comment, :post_id, :posts, :id do
|
101
|
-
dump = dump_schema(:
|
101
|
+
dump = dump_schema(ignore: /post/)
|
102
102
|
expect(dump).to match(/create_table "comments"/)
|
103
103
|
expect(dump).not_to match(/create_table "posts"/)
|
104
104
|
end
|
@@ -107,12 +107,12 @@ describe "Schema dump" do
|
|
107
107
|
end
|
108
108
|
|
109
109
|
it "should include foreign_key options" do
|
110
|
-
with_foreign_key Post, :user_id, :users, :id, :
|
111
|
-
expect(dump_posts).to match(%q[t.(integer|bigint)\s*"user_id",.*:foreign_key=>{:references=>"users", :name=>"
|
110
|
+
with_foreign_key Post, :user_id, :users, :id, on_update: :cascade, on_delete: :nullify do
|
111
|
+
expect(dump_posts).to match(%q[t.(integer|bigint)\s*"user_id",.*:foreign_key=>{:references=>"users", :name=>"fk_rails_\w+", :on_update=>:cascade, :on_delete=>:nullify}])
|
112
112
|
end
|
113
113
|
end
|
114
114
|
|
115
|
-
context "with cyclic foreign key constraints", :
|
115
|
+
context "with cyclic foreign key constraints", sqlite3: :skip do
|
116
116
|
before(:each) do
|
117
117
|
ActiveRecord::Base.connection.add_foreign_key(Comment.table_name, User.table_name, column: :commenter_id)
|
118
118
|
ActiveRecord::Base.connection.add_foreign_key(Comment.table_name, Post.table_name, column: :post_id)
|
@@ -216,12 +216,12 @@ describe "Schema dump" do
|
|
216
216
|
def with_foreign_keys(model, columnsets)
|
217
217
|
table_columns = model.columns.reject{|column| column.name == 'id'}
|
218
218
|
ActiveRecord::Migration.suppress_messages do
|
219
|
-
ActiveRecord::Migration.create_table model.table_name, :
|
219
|
+
ActiveRecord::Migration.create_table model.table_name, force: true do |t|
|
220
220
|
table_columns.each do |column|
|
221
221
|
t.column column.name, column.type, limit: column.limit
|
222
222
|
end
|
223
223
|
columnsets.each do |columns, referenced_table_name, referenced_columns, options|
|
224
|
-
t.foreign_key
|
224
|
+
t.foreign_key referenced_table_name, **(options||{}).merge(column: columns, primary_key: referenced_columns)
|
225
225
|
end
|
226
226
|
end
|
227
227
|
end
|
data/spec/spec_helper.rb
CHANGED
data/spec/support/reference.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SchemaPlus::Matchers
|
2
4
|
|
3
5
|
class Reference
|
@@ -22,7 +24,7 @@ module SchemaPlus::Matchers
|
|
22
24
|
@result.keep_if {|fk| fk.on_update == @on_update } if @on_update
|
23
25
|
@result.keep_if {|fk| fk.on_delete == @on_delete } if @on_delete
|
24
26
|
@result.keep_if {|fk| fk.deferrable == @deferrable } if @deferrable
|
25
|
-
@result.keep_if {|fk| fk.name == @name } if @name
|
27
|
+
@result.keep_if {|fk| @name.is_a?(String) ? fk.name == @name : fk.name.match?(@name) } if @name
|
26
28
|
!@result.empty?
|
27
29
|
end
|
28
30
|
|
@@ -76,4 +78,3 @@ module SchemaPlus::Matchers
|
|
76
78
|
end
|
77
79
|
|
78
80
|
end
|
79
|
-
|