schema_plus 1.2.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.travis.yml +29 -0
- data/README.md +19 -0
- data/gemfiles/rails-3.2/Gemfile.mysql +7 -1
- data/gemfiles/rails-3.2/Gemfile.mysql2 +7 -1
- data/gemfiles/rails-3.2/Gemfile.postgresql +7 -1
- data/gemfiles/rails-3.2/Gemfile.sqlite3 +7 -1
- data/gemfiles/rails-4.0/Gemfile.mysql2 +7 -1
- data/gemfiles/rails-4.0/Gemfile.postgresql +7 -1
- data/gemfiles/rails-4.0/Gemfile.sqlite3 +7 -1
- data/gemfiles/rails-edge/Gemfile.mysql2 +7 -1
- data/gemfiles/rails-edge/Gemfile.postgresql +7 -1
- data/gemfiles/rails-edge/Gemfile.sqlite3 +7 -1
- data/lib/schema_plus/active_record/column_options_handler.rb +2 -2
- data/lib/schema_plus/active_record/connection_adapters/abstract_adapter.rb +124 -57
- data/lib/schema_plus/active_record/connection_adapters/foreign_key_definition.rb +9 -2
- data/lib/schema_plus/active_record/connection_adapters/mysql_adapter.rb +30 -10
- data/lib/schema_plus/active_record/connection_adapters/postgresql_adapter.rb +55 -30
- data/lib/schema_plus/active_record/connection_adapters/schema_statements.rb +1 -0
- data/lib/schema_plus/active_record/connection_adapters/sqlite3_adapter.rb +10 -7
- data/lib/schema_plus/active_record/connection_adapters/table_definition.rb +7 -16
- data/lib/schema_plus/active_record/migration/command_recorder.rb +88 -0
- data/lib/schema_plus/active_record/schema_dumper.rb +1 -1
- data/lib/schema_plus/version.rb +1 -1
- data/lib/schema_plus.rb +10 -1
- data/runspecs +24 -5
- data/spec/column_definition_spec.rb +69 -9
- data/spec/index_definition_spec.rb +25 -0
- data/spec/index_spec.rb +1 -1
- data/spec/migration_spec.rb +76 -11
- data/spec/schema_dumper_spec.rb +19 -5
- metadata +3 -2
data/spec/migration_spec.rb
CHANGED
@@ -150,7 +150,7 @@ describe ActiveRecord::Migration do
|
|
150
150
|
|
151
151
|
it "should create an index if specified on column" do
|
152
152
|
recreate_table(@model) do |t|
|
153
|
-
t.integer :state, :index => true
|
153
|
+
t.integer :state, :index => true
|
154
154
|
end
|
155
155
|
@model.should have_index.on(:state)
|
156
156
|
end
|
@@ -203,7 +203,7 @@ describe ActiveRecord::Migration do
|
|
203
203
|
end
|
204
204
|
@model.should have_index.on([:state, :city])
|
205
205
|
end
|
206
|
-
|
206
|
+
|
207
207
|
it "should auto-index foreign keys only" do
|
208
208
|
recreate_table(@model) do |t|
|
209
209
|
t.integer :user_id
|
@@ -234,7 +234,7 @@ describe ActiveRecord::Migration do
|
|
234
234
|
end
|
235
235
|
|
236
236
|
it "should override foreign key auto_index positively" do
|
237
|
-
with_fk_config(:auto_index => false) do
|
237
|
+
with_fk_config(:auto_index => false) do
|
238
238
|
recreate_table @model, :foreign_keys => {:auto_index => true} do |t|
|
239
239
|
t.integer :user_id
|
240
240
|
end
|
@@ -365,7 +365,7 @@ describe ActiveRecord::Migration do
|
|
365
365
|
|
366
366
|
unless SchemaPlusHelpers.mysql?
|
367
367
|
it "should override foreign key auto_index negatively" do
|
368
|
-
with_fk_config(:auto_index => true) do
|
368
|
+
with_fk_config(:auto_index => true) do
|
369
369
|
recreate_table @model, :foreign_keys => {:auto_index => false} do |t|
|
370
370
|
t.integer :user_id
|
371
371
|
end
|
@@ -386,6 +386,66 @@ describe ActiveRecord::Migration do
|
|
386
386
|
|
387
387
|
end
|
388
388
|
|
389
|
+
context "when table is changed" do
|
390
|
+
before(:each) do
|
391
|
+
@model = Post
|
392
|
+
end
|
393
|
+
[false, true].each do |bulk|
|
394
|
+
suffix = bulk ? ' with :bulk option' : ""
|
395
|
+
|
396
|
+
it "should create an index if specified on column"+suffix do
|
397
|
+
change_table(@model, :bulk => bulk) do |t|
|
398
|
+
t.integer :state, :index => true
|
399
|
+
end
|
400
|
+
@model.should have_index.on(:state)
|
401
|
+
end
|
402
|
+
|
403
|
+
unless SchemaPlusHelpers.sqlite3?
|
404
|
+
|
405
|
+
it "should create a foreign key constraint"+suffix do
|
406
|
+
change_table(@model, :bulk => bulk) do |t|
|
407
|
+
t.integer :user_id
|
408
|
+
end
|
409
|
+
@model.should reference(:users, :id).on(:user_id)
|
410
|
+
end
|
411
|
+
|
412
|
+
context "migrate down" do
|
413
|
+
it "should remove a foreign key constraint"+suffix do
|
414
|
+
Comment.reset_column_information
|
415
|
+
Comment.should reference(:users, :id).on(:user_id)
|
416
|
+
migration = Class.new ::ActiveRecord::Migration do
|
417
|
+
define_method(:change) {
|
418
|
+
change_table("comments", :bulk => bulk) do |t|
|
419
|
+
t.integer :user_id
|
420
|
+
end
|
421
|
+
}
|
422
|
+
end
|
423
|
+
ActiveRecord::Migration.suppress_messages do
|
424
|
+
migration.migrate(:down)
|
425
|
+
end
|
426
|
+
Comment.reset_column_information
|
427
|
+
Comment.should_not reference(:users, :id).on(:user_id)
|
428
|
+
end
|
429
|
+
end if ActiveRecord::VERSION::MAJOR >= 4
|
430
|
+
|
431
|
+
it "should create a foreign key constraint using :references"+suffix do
|
432
|
+
change_table(@model, :bulk => bulk) do |t|
|
433
|
+
t.references :user
|
434
|
+
end
|
435
|
+
@model.should reference(:users, :id).on(:user_id)
|
436
|
+
end
|
437
|
+
|
438
|
+
it "should create a foreign key constraint using :belongs_to"+suffix do
|
439
|
+
change_table(@model, :bulk => bulk) do |t|
|
440
|
+
t.belongs_to :user
|
441
|
+
end
|
442
|
+
@model.should reference(:users, :id).on(:user_id)
|
443
|
+
end
|
444
|
+
end
|
445
|
+
end
|
446
|
+
end
|
447
|
+
|
448
|
+
|
389
449
|
unless SchemaPlusHelpers.sqlite3?
|
390
450
|
|
391
451
|
context "when column is added" do
|
@@ -419,8 +479,8 @@ describe ActiveRecord::Migration do
|
|
419
479
|
end
|
420
480
|
|
421
481
|
it "should create foreign key to explicitly given table and column name" do
|
422
|
-
add_column(:author_login, :string, :foreign_key => { :references => [:users, :login]}) do
|
423
|
-
@model.should reference(:users, :login).on(:author_login)
|
482
|
+
add_column(:author_login, :string, :foreign_key => { :references => [:users, :login]}) do
|
483
|
+
@model.should reference(:users, :login).on(:author_login)
|
424
484
|
end
|
425
485
|
end
|
426
486
|
|
@@ -504,7 +564,7 @@ describe ActiveRecord::Migration do
|
|
504
564
|
it "should use default on_update action" do
|
505
565
|
SchemaPlus.config.foreign_keys.on_update = :cascade
|
506
566
|
add_column(:post_id, :integer) do
|
507
|
-
@model.should reference.on(:post_id).on_update(:cascade)
|
567
|
+
@model.should reference.on(:post_id).on_update(:cascade)
|
508
568
|
end
|
509
569
|
SchemaPlus.config.foreign_keys.on_update = nil
|
510
570
|
end
|
@@ -512,7 +572,7 @@ describe ActiveRecord::Migration do
|
|
512
572
|
it "should use default on_delete action" do
|
513
573
|
SchemaPlus.config.foreign_keys.on_delete = :cascade
|
514
574
|
add_column(:post_id, :integer) do
|
515
|
-
@model.should reference.on(:post_id).on_delete(:cascade)
|
575
|
+
@model.should reference.on(:post_id).on_delete(:cascade)
|
516
576
|
end
|
517
577
|
SchemaPlus.config.foreign_keys.on_delete = nil
|
518
578
|
end
|
@@ -643,7 +703,7 @@ describe ActiveRecord::Migration do
|
|
643
703
|
remove_column(:post_id)
|
644
704
|
@model.should_not have_index.on(:post_id)
|
645
705
|
end
|
646
|
-
|
706
|
+
|
647
707
|
protected
|
648
708
|
def remove_column(column_name)
|
649
709
|
table = @model.table_name
|
@@ -728,7 +788,7 @@ describe ActiveRecord::Migration do
|
|
728
788
|
end
|
729
789
|
|
730
790
|
end
|
731
|
-
|
791
|
+
|
732
792
|
def recreate_table(model, opts={}, &block)
|
733
793
|
ActiveRecord::Migration.suppress_messages do
|
734
794
|
ActiveRecord::Migration.create_table model.table_name, opts.merge(:force => true), &block
|
@@ -736,7 +796,12 @@ describe ActiveRecord::Migration do
|
|
736
796
|
model.reset_column_information
|
737
797
|
end
|
738
798
|
|
739
|
-
|
799
|
+
def change_table(model, opts={}, &block)
|
800
|
+
ActiveRecord::Migration.suppress_messages do
|
801
|
+
ActiveRecord::Migration.change_table model.table_name, opts, &block
|
802
|
+
end
|
803
|
+
model.reset_column_information
|
804
|
+
end
|
740
805
|
|
741
806
|
end
|
742
807
|
|
data/spec/schema_dumper_spec.rb
CHANGED
@@ -9,7 +9,7 @@ describe "Schema dump" do
|
|
9
9
|
end
|
10
10
|
ActiveRecord::Migration.suppress_messages do
|
11
11
|
ActiveRecord::Schema.define do
|
12
|
-
connection.tables.each do |table| drop_table table end
|
12
|
+
connection.tables.each do |table| drop_table table, :cascade => true end
|
13
13
|
|
14
14
|
create_table :users, :force => true do |t|
|
15
15
|
t.string :login
|
@@ -91,7 +91,7 @@ describe "Schema dump" do
|
|
91
91
|
if SchemaPlusHelpers.postgresql?
|
92
92
|
it "should dump the default hash expr as now()" do
|
93
93
|
with_additional_column Post, :posted_at, :datetime, :default => :now do
|
94
|
-
dump_posts.should match(%r{t\.datetime\s+"posted_at",\s*(?:default:|:default =>)\s*\{\s*(?:expr:|:expr
|
94
|
+
dump_posts.should match(%r{t\.datetime\s+"posted_at",\s*(?:default:|:default =>)\s*\{\s*(?:expr:|:expr\s*=>)\s*"now\(\)"\s*\}})
|
95
95
|
end
|
96
96
|
end
|
97
97
|
|
@@ -103,7 +103,7 @@ describe "Schema dump" do
|
|
103
103
|
|
104
104
|
it "can dump a complex default expression" do
|
105
105
|
with_additional_column Post, :name, :string, :default => {:expr => 'substring(random()::text from 3 for 6)'} do
|
106
|
-
dump_posts.should match(%r{t\.string\s+"name",\s*(?:default:|:default
|
106
|
+
dump_posts.should match(%r{t\.string\s+"name",\s*(?:default:|:default\s*=>)\s*{\s*(?:expr:|:expr\s*=>)\s*"\\"substring\\"\(\(random\(\)\)::text, 3, 6\)"\s*}})
|
107
107
|
end
|
108
108
|
end
|
109
109
|
end
|
@@ -164,8 +164,8 @@ describe "Schema dump" do
|
|
164
164
|
unless SchemaPlusHelpers.mysql?
|
165
165
|
|
166
166
|
it "should include index order" do
|
167
|
-
with_index Post, [:user_id, :first_comment_id], :order => { :user_id => :asc, :first_comment_id => :desc } do
|
168
|
-
dump_posts.should match(%r{t.index \["user_id", "first_comment_id"\],.*:order => {"user_id" => :asc, "first_comment_id" => :desc}})
|
167
|
+
with_index Post, [:user_id, :first_comment_id, :short_id], :order => { :user_id => :asc, :first_comment_id => :desc } do
|
168
|
+
dump_posts.should match(%r{t.index \["user_id", "first_comment_id", "short_id"\],.*:order => {"user_id" => :asc, "first_comment_id" => :desc, "short_id" => :asc}})
|
169
169
|
end
|
170
170
|
end
|
171
171
|
|
@@ -179,6 +179,13 @@ describe "Schema dump" do
|
|
179
179
|
end
|
180
180
|
end
|
181
181
|
|
182
|
+
it "should define index with type cast" do
|
183
|
+
with_index Post, [:integer_col], :name => "index_with_type_cast", :expression => "LOWER(integer_col::text)" do
|
184
|
+
dump_posts.should match(to_regexp(%q{t.index :name => "index_with_type_cast", :expression => "lower((integer_col)::text)"}))
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
|
182
189
|
it "should define case insensitive index with mixed ids and strings" do
|
183
190
|
with_index Post, [:user_id, :str_short, :short_id, :body], :case_sensitive => false do
|
184
191
|
dump_posts.should match(to_regexp(%q{t.index ["user_id", "str_short", "short_id", "body"], :name => "index_posts_on_user_id_and_str_short_and_short_id_and_body", :case_sensitive => false}))
|
@@ -219,6 +226,13 @@ describe "Schema dump" do
|
|
219
226
|
end
|
220
227
|
end
|
221
228
|
|
229
|
+
it "should not include index order for non-ordered index types" do
|
230
|
+
with_index Post, :user_id, :kind => :hash do
|
231
|
+
dump_posts.should match(to_regexp(%q{t.index ["user_id"], :name => "index_posts_on_user_id", :kind => "hash"}))
|
232
|
+
dump_posts.should_not match(%r{:order})
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
222
236
|
end
|
223
237
|
|
224
238
|
unless SchemaPlusHelpers.sqlite3?
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: schema_plus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ronen Barzel
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-10-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -141,6 +141,7 @@ files:
|
|
141
141
|
- lib/schema_plus/active_record/connection_adapters/table_definition.rb
|
142
142
|
- lib/schema_plus/active_record/db_default.rb
|
143
143
|
- lib/schema_plus/active_record/foreign_keys.rb
|
144
|
+
- lib/schema_plus/active_record/migration/command_recorder.rb
|
144
145
|
- lib/schema_plus/active_record/schema.rb
|
145
146
|
- lib/schema_plus/active_record/schema_dumper.rb
|
146
147
|
- lib/schema_plus/railtie.rb
|