sequel 3.46.0 → 3.47.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +96 -0
- data/Rakefile +7 -1
- data/bin/sequel +6 -4
- data/doc/active_record.rdoc +1 -1
- data/doc/advanced_associations.rdoc +14 -35
- data/doc/association_basics.rdoc +66 -4
- data/doc/migration.rdoc +4 -0
- data/doc/opening_databases.rdoc +6 -0
- data/doc/postgresql.rdoc +302 -0
- data/doc/release_notes/3.47.0.txt +270 -0
- data/doc/security.rdoc +6 -0
- data/lib/sequel/adapters/ibmdb.rb +9 -9
- data/lib/sequel/adapters/jdbc.rb +22 -7
- data/lib/sequel/adapters/jdbc/postgresql.rb +7 -2
- data/lib/sequel/adapters/mock.rb +2 -0
- data/lib/sequel/adapters/postgres.rb +44 -13
- data/lib/sequel/adapters/shared/mssql.rb +1 -1
- data/lib/sequel/adapters/shared/mysql.rb +2 -2
- data/lib/sequel/adapters/shared/postgres.rb +94 -55
- data/lib/sequel/adapters/shared/sqlite.rb +3 -1
- data/lib/sequel/adapters/sqlite.rb +2 -2
- data/lib/sequel/adapters/utils/pg_types.rb +1 -14
- data/lib/sequel/adapters/utils/split_alter_table.rb +3 -3
- data/lib/sequel/connection_pool/threaded.rb +1 -1
- data/lib/sequel/core.rb +1 -1
- data/lib/sequel/database/connecting.rb +2 -2
- data/lib/sequel/database/features.rb +5 -0
- data/lib/sequel/database/misc.rb +47 -5
- data/lib/sequel/database/query.rb +2 -2
- data/lib/sequel/dataset/actions.rb +4 -2
- data/lib/sequel/dataset/misc.rb +1 -1
- data/lib/sequel/dataset/prepared_statements.rb +1 -1
- data/lib/sequel/dataset/query.rb +8 -6
- data/lib/sequel/dataset/sql.rb +8 -6
- data/lib/sequel/extensions/constraint_validations.rb +5 -2
- data/lib/sequel/extensions/migration.rb +10 -8
- data/lib/sequel/extensions/pagination.rb +3 -0
- data/lib/sequel/extensions/pg_array.rb +85 -25
- data/lib/sequel/extensions/pg_hstore.rb +8 -1
- data/lib/sequel/extensions/pg_hstore_ops.rb +4 -1
- data/lib/sequel/extensions/pg_inet.rb +16 -13
- data/lib/sequel/extensions/pg_interval.rb +6 -2
- data/lib/sequel/extensions/pg_json.rb +18 -11
- data/lib/sequel/extensions/pg_range.rb +17 -2
- data/lib/sequel/extensions/pg_range_ops.rb +7 -5
- data/lib/sequel/extensions/pg_row.rb +29 -12
- data/lib/sequel/extensions/pretty_table.rb +3 -0
- data/lib/sequel/extensions/query.rb +3 -0
- data/lib/sequel/extensions/schema_caching.rb +2 -0
- data/lib/sequel/extensions/schema_dumper.rb +3 -1
- data/lib/sequel/extensions/select_remove.rb +3 -0
- data/lib/sequel/model.rb +8 -2
- data/lib/sequel/model/associations.rb +39 -27
- data/lib/sequel/model/base.rb +99 -38
- data/lib/sequel/model/plugins.rb +25 -0
- data/lib/sequel/plugins/association_autoreloading.rb +27 -22
- data/lib/sequel/plugins/association_dependencies.rb +1 -7
- data/lib/sequel/plugins/auto_validations.rb +110 -0
- data/lib/sequel/plugins/boolean_readers.rb +1 -6
- data/lib/sequel/plugins/caching.rb +6 -13
- data/lib/sequel/plugins/class_table_inheritance.rb +1 -0
- data/lib/sequel/plugins/composition.rb +14 -7
- data/lib/sequel/plugins/constraint_validations.rb +2 -13
- data/lib/sequel/plugins/defaults_setter.rb +1 -6
- data/lib/sequel/plugins/dirty.rb +8 -0
- data/lib/sequel/plugins/error_splitter.rb +54 -0
- data/lib/sequel/plugins/force_encoding.rb +1 -5
- data/lib/sequel/plugins/hook_class_methods.rb +1 -6
- data/lib/sequel/plugins/input_transformer.rb +79 -0
- data/lib/sequel/plugins/instance_filters.rb +7 -1
- data/lib/sequel/plugins/instance_hooks.rb +7 -1
- data/lib/sequel/plugins/json_serializer.rb +5 -10
- data/lib/sequel/plugins/lazy_attributes.rb +20 -7
- data/lib/sequel/plugins/list.rb +1 -6
- data/lib/sequel/plugins/many_through_many.rb +1 -2
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +23 -39
- data/lib/sequel/plugins/optimistic_locking.rb +1 -5
- data/lib/sequel/plugins/pg_row.rb +4 -2
- data/lib/sequel/plugins/pg_typecast_on_load.rb +3 -7
- data/lib/sequel/plugins/prepared_statements.rb +1 -5
- data/lib/sequel/plugins/prepared_statements_safe.rb +2 -11
- data/lib/sequel/plugins/rcte_tree.rb +2 -2
- data/lib/sequel/plugins/serialization.rb +11 -13
- data/lib/sequel/plugins/serialization_modification_detection.rb +13 -1
- data/lib/sequel/plugins/single_table_inheritance.rb +4 -4
- data/lib/sequel/plugins/static_cache.rb +67 -19
- data/lib/sequel/plugins/string_stripper.rb +7 -27
- data/lib/sequel/plugins/subclasses.rb +3 -5
- data/lib/sequel/plugins/tactical_eager_loading.rb +2 -2
- data/lib/sequel/plugins/timestamps.rb +2 -7
- data/lib/sequel/plugins/touch.rb +5 -8
- data/lib/sequel/plugins/tree.rb +1 -6
- data/lib/sequel/plugins/typecast_on_load.rb +1 -5
- data/lib/sequel/plugins/update_primary_key.rb +26 -14
- data/lib/sequel/plugins/validation_class_methods.rb +31 -16
- data/lib/sequel/plugins/validation_helpers.rb +50 -26
- data/lib/sequel/plugins/xml_serializer.rb +3 -6
- data/lib/sequel/sql.rb +1 -1
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/postgres_spec.rb +131 -15
- data/spec/adapters/sqlite_spec.rb +1 -1
- data/spec/core/connection_pool_spec.rb +16 -17
- data/spec/core/database_spec.rb +111 -40
- data/spec/core/dataset_spec.rb +65 -74
- data/spec/core/expression_filters_spec.rb +6 -5
- data/spec/core/object_graph_spec.rb +0 -1
- data/spec/core/schema_spec.rb +23 -23
- data/spec/core/spec_helper.rb +5 -1
- data/spec/extensions/association_dependencies_spec.rb +1 -1
- data/spec/extensions/association_proxies_spec.rb +1 -1
- data/spec/extensions/auto_validations_spec.rb +90 -0
- data/spec/extensions/caching_spec.rb +6 -0
- data/spec/extensions/class_table_inheritance_spec.rb +8 -1
- data/spec/extensions/composition_spec.rb +12 -5
- data/spec/extensions/constraint_validations_spec.rb +4 -4
- data/spec/extensions/core_refinements_spec.rb +29 -79
- data/spec/extensions/dirty_spec.rb +14 -0
- data/spec/extensions/error_splitter_spec.rb +18 -0
- data/spec/extensions/identity_map_spec.rb +0 -1
- data/spec/extensions/input_transformer_spec.rb +54 -0
- data/spec/extensions/instance_filters_spec.rb +6 -0
- data/spec/extensions/instance_hooks_spec.rb +12 -1
- data/spec/extensions/json_serializer_spec.rb +0 -1
- data/spec/extensions/lazy_attributes_spec.rb +64 -55
- data/spec/extensions/looser_typecasting_spec.rb +1 -1
- data/spec/extensions/many_through_many_spec.rb +3 -4
- data/spec/extensions/many_to_one_pk_lookup_spec.rb +53 -15
- data/spec/extensions/migration_spec.rb +16 -0
- data/spec/extensions/null_dataset_spec.rb +1 -1
- data/spec/extensions/pg_array_spec.rb +48 -1
- data/spec/extensions/pg_hstore_ops_spec.rb +10 -2
- data/spec/extensions/pg_hstore_spec.rb +5 -0
- data/spec/extensions/pg_inet_spec.rb +5 -0
- data/spec/extensions/pg_interval_spec.rb +7 -3
- data/spec/extensions/pg_json_spec.rb +6 -1
- data/spec/extensions/pg_range_ops_spec.rb +4 -1
- data/spec/extensions/pg_range_spec.rb +5 -0
- data/spec/extensions/pg_row_plugin_spec.rb +13 -0
- data/spec/extensions/pg_row_spec.rb +28 -19
- data/spec/extensions/pg_typecast_on_load_spec.rb +6 -1
- data/spec/extensions/prepared_statements_associations_spec.rb +1 -1
- data/spec/extensions/query_literals_spec.rb +1 -1
- data/spec/extensions/rcte_tree_spec.rb +2 -2
- data/spec/extensions/schema_spec.rb +2 -2
- data/spec/extensions/serialization_modification_detection_spec.rb +8 -0
- data/spec/extensions/serialization_spec.rb +15 -1
- data/spec/extensions/sharding_spec.rb +1 -1
- data/spec/extensions/single_table_inheritance_spec.rb +1 -1
- data/spec/extensions/static_cache_spec.rb +59 -9
- data/spec/extensions/tactical_eager_loading_spec.rb +19 -4
- data/spec/extensions/update_primary_key_spec.rb +17 -1
- data/spec/extensions/validation_class_methods_spec.rb +25 -0
- data/spec/extensions/validation_helpers_spec.rb +59 -3
- data/spec/integration/associations_test.rb +5 -5
- data/spec/integration/eager_loader_test.rb +32 -63
- data/spec/integration/model_test.rb +2 -2
- data/spec/integration/plugin_test.rb +88 -56
- data/spec/integration/prepared_statement_test.rb +1 -1
- data/spec/integration/schema_test.rb +1 -1
- data/spec/integration/timezone_test.rb +0 -1
- data/spec/integration/transaction_test.rb +0 -1
- data/spec/model/association_reflection_spec.rb +1 -1
- data/spec/model/associations_spec.rb +106 -84
- data/spec/model/base_spec.rb +4 -4
- data/spec/model/eager_loading_spec.rb +8 -8
- data/spec/model/model_spec.rb +27 -9
- data/spec/model/plugins_spec.rb +71 -0
- data/spec/model/record_spec.rb +99 -13
- metadata +12 -2
@@ -6,7 +6,7 @@ shared_examples_for "eager limit strategies" do
|
|
6
6
|
Artist.one_to_one :last_album, {:clone=>:last_album}.merge(@els) if @els
|
7
7
|
@album.update(:artist => @artist)
|
8
8
|
diff_album = @diff_album.call
|
9
|
-
|
9
|
+
ar = @pr.call[1]
|
10
10
|
|
11
11
|
a = Artist.eager(:first_album, :last_album).order(:name).all
|
12
12
|
a.should == [@artist, ar]
|
@@ -33,7 +33,7 @@ shared_examples_for "eager limit strategies" do
|
|
33
33
|
@album.update(:artist => @artist)
|
34
34
|
middle_album = @middle_album.call
|
35
35
|
diff_album = @diff_album.call
|
36
|
-
|
36
|
+
ar = @pr.call[1]
|
37
37
|
|
38
38
|
ars = Artist.eager(:first_two_albums, :second_two_albums, :last_two_albums).order(:name).all
|
39
39
|
ars.should == [@artist, ar]
|
@@ -58,7 +58,7 @@ shared_examples_for "eager limit strategies" do
|
|
58
58
|
Album.many_to_many :second_two_tags, {:clone=>:second_two_tags}.merge(@els) if @els
|
59
59
|
Album.many_to_many :last_two_tags, {:clone=>:last_two_tags}.merge(@els) if @els
|
60
60
|
tu, tv = @other_tags.call
|
61
|
-
al
|
61
|
+
al = @pr.call.first
|
62
62
|
|
63
63
|
als = Album.eager(:first_two_tags, :second_two_tags, :last_two_tags).order(:name).all
|
64
64
|
als.should == [@album, al]
|
@@ -84,7 +84,7 @@ shared_examples_for "eager limit strategies" do
|
|
84
84
|
Artist.many_through_many :last_two_tags, {:clone=>:last_two_tags}.merge(@els) if @els
|
85
85
|
@album.update(:artist => @artist)
|
86
86
|
tu, tv = @other_tags.call
|
87
|
-
|
87
|
+
ar = @pr.call[1]
|
88
88
|
|
89
89
|
ars = Artist.eager(:first_two_tags, :second_two_tags, :last_two_tags).order(:name).all
|
90
90
|
ars.should == [@artist, ar]
|
@@ -229,7 +229,7 @@ shared_examples_for "filtering/excluding by associations" do
|
|
229
229
|
@album.add_tag(@tag)
|
230
230
|
@Album.filter(:tags=>@tag).all.should == [@album]
|
231
231
|
@Album.filter(:alias_tags=>@tag).all.should == [@album]
|
232
|
-
album,
|
232
|
+
album, tag = @pr.call.values_at(0, 2)
|
233
233
|
@Album.exclude(:tags=>@tag).all.should == [album]
|
234
234
|
@Album.exclude(:alias_tags=>@tag).all.should == [album]
|
235
235
|
@Album.exclude(:tags=>tag).all.sort_by{|x| x.pk}.should == [@album, album]
|
@@ -330,71 +330,50 @@ describe "Polymorphic Associations" do
|
|
330
330
|
end
|
331
331
|
class ::Asset < Sequel::Model
|
332
332
|
m = method(:constantize)
|
333
|
-
many_to_one :attachable, :reciprocal=>:assets,
|
333
|
+
many_to_one :attachable, :reciprocal=>:assets,
|
334
|
+
:setter=>(proc do |attachable|
|
335
|
+
self[:attachable_id] = (attachable.pk if attachable)
|
336
|
+
self[:attachable_type] = (attachable.class.name if attachable)
|
337
|
+
end),
|
334
338
|
:dataset=>(proc do
|
335
339
|
klass = m.call(attachable_type)
|
336
340
|
klass.where(klass.primary_key=>attachable_id)
|
337
|
-
end),
|
341
|
+
end),
|
338
342
|
:eager_loader=>(proc do |eo|
|
339
343
|
id_map = {}
|
340
344
|
eo[:rows].each do |asset|
|
341
345
|
asset.associations[:attachable] = nil
|
342
346
|
((id_map[asset.attachable_type] ||= {})[asset.attachable_id] ||= []) << asset
|
343
347
|
end
|
344
|
-
id_map.each do |klass_name,
|
348
|
+
id_map.each do |klass_name, idmap|
|
345
349
|
klass = m.call(klass_name)
|
346
|
-
klass.where(klass.primary_key=>
|
347
|
-
|
350
|
+
klass.where(klass.primary_key=>idmap.keys).all do |attach|
|
351
|
+
idmap[attach.pk].each do |asset|
|
348
352
|
asset.associations[:attachable] = attach
|
349
353
|
end
|
350
354
|
end
|
351
355
|
end
|
352
356
|
end)
|
353
|
-
|
354
|
-
private
|
355
|
-
|
356
|
-
def _attachable=(attachable)
|
357
|
-
self[:attachable_id] = (attachable.pk if attachable)
|
358
|
-
self[:attachable_type] = (attachable.class.name if attachable)
|
359
|
-
end
|
360
357
|
end
|
361
358
|
|
362
359
|
INTEGRATION_DB.create_table!(:posts) do
|
363
360
|
primary_key :id
|
364
361
|
end
|
365
362
|
class ::Post < Sequel::Model
|
366
|
-
one_to_many :assets, :key=>:attachable_id, :reciprocal=>:attachable, :conditions=>{:attachable_type=>'Post'}
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
def _add_asset(asset)
|
371
|
-
asset.update(:attachable_id=>pk, :attachable_type=>'Post')
|
372
|
-
end
|
373
|
-
def _remove_asset(asset)
|
374
|
-
asset.update(:attachable_id=>nil, :attachable_type=>nil)
|
375
|
-
end
|
376
|
-
def _remove_all_assets
|
377
|
-
assets_dataset.update(:attachable_id=>nil, :attachable_type=>nil)
|
378
|
-
end
|
363
|
+
one_to_many :assets, :key=>:attachable_id, :reciprocal=>:attachable, :conditions=>{:attachable_type=>'Post'},
|
364
|
+
:adder=>proc{|asset| asset.update(:attachable_id=>pk, :attachable_type=>'Post')},
|
365
|
+
:remover=>proc{|asset| asset.update(:attachable_id=>nil, :attachable_type=>nil)},
|
366
|
+
:clearer=>proc{assets_dataset.update(:attachable_id=>nil, :attachable_type=>nil)}
|
379
367
|
end
|
380
368
|
|
381
369
|
INTEGRATION_DB.create_table!(:notes) do
|
382
370
|
primary_key :id
|
383
371
|
end
|
384
372
|
class ::Note < Sequel::Model
|
385
|
-
one_to_many :assets, :key=>:attachable_id, :reciprocal=>:attachable, :conditions=>{:attachable_type=>'Note'}
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
def _add_asset(asset)
|
390
|
-
asset.update(:attachable_id=>pk, :attachable_type=>'Note')
|
391
|
-
end
|
392
|
-
def _remove_asset(asset)
|
393
|
-
asset.update(:attachable_id=>nil, :attachable_type=>nil)
|
394
|
-
end
|
395
|
-
def _remove_all_assets
|
396
|
-
assets_dataset.update(:attachable_id=>nil, :attachable_type=>nil)
|
397
|
-
end
|
373
|
+
one_to_many :assets, :key=>:attachable_id, :reciprocal=>:attachable, :conditions=>{:attachable_type=>'Note'},
|
374
|
+
:adder=>proc{|asset| asset.update(:attachable_id=>pk, :attachable_type=>'Note')},
|
375
|
+
:remover=>proc{|asset| asset.update(:attachable_id=>nil, :attachable_type=>nil)},
|
376
|
+
:clearer=>proc{assets_dataset.update(:attachable_id=>nil, :attachable_type=>nil)}
|
398
377
|
end
|
399
378
|
end
|
400
379
|
before do
|
@@ -475,8 +454,17 @@ describe "many_to_one/one_to_many not referencing primary key" do
|
|
475
454
|
String :name
|
476
455
|
end
|
477
456
|
class ::Client < Sequel::Model
|
478
|
-
one_to_many :invoices, :reciprocal=>:client,
|
479
|
-
:
|
457
|
+
one_to_many :invoices, :reciprocal=>:client,
|
458
|
+
:adder=>(proc do |invoice|
|
459
|
+
invoice.client_name = name
|
460
|
+
invoice.save
|
461
|
+
end),
|
462
|
+
:remover=>(proc do |invoice|
|
463
|
+
invoice.client_name = nil
|
464
|
+
invoice.save
|
465
|
+
end),
|
466
|
+
:clearer=>proc{invoices_dataset.update(:client_name=>nil)},
|
467
|
+
:dataset=>proc{Invoice.filter(:client_name=>name)},
|
480
468
|
:eager_loader=>(proc do |eo|
|
481
469
|
id_map = {}
|
482
470
|
eo[:rows].each do |client|
|
@@ -488,20 +476,6 @@ describe "many_to_one/one_to_many not referencing primary key" do
|
|
488
476
|
client.associations[:invoices] << inv
|
489
477
|
end
|
490
478
|
end)
|
491
|
-
|
492
|
-
private
|
493
|
-
|
494
|
-
def _add_invoice(invoice)
|
495
|
-
invoice.client_name = name
|
496
|
-
invoice.save
|
497
|
-
end
|
498
|
-
def _remove_invoice(invoice)
|
499
|
-
invoice.client_name = nil
|
500
|
-
invoice.save
|
501
|
-
end
|
502
|
-
def _remove_all_invoices
|
503
|
-
Invoice.filter(:client_name=>name).update(:client_name=>nil)
|
504
|
-
end
|
505
479
|
end
|
506
480
|
|
507
481
|
INTEGRATION_DB.create_table!(:invoices) do
|
@@ -509,8 +483,9 @@ describe "many_to_one/one_to_many not referencing primary key" do
|
|
509
483
|
String :client_name
|
510
484
|
end
|
511
485
|
class ::Invoice < Sequel::Model
|
512
|
-
many_to_one :client, :key=>:client_name,
|
513
|
-
:
|
486
|
+
many_to_one :client, :key=>:client_name,
|
487
|
+
:setter=>proc{|client| self.client_name = (client.name if client)},
|
488
|
+
:dataset=>proc{Client.filter(:name=>client_name)},
|
514
489
|
:eager_loader=>(proc do |eo|
|
515
490
|
id_map = eo[:id_map]
|
516
491
|
eo[:rows].each{|inv| inv.associations[:client] = nil}
|
@@ -518,12 +493,6 @@ describe "many_to_one/one_to_many not referencing primary key" do
|
|
518
493
|
id_map[client.name].each{|inv| inv.associations[:client] = client}
|
519
494
|
end
|
520
495
|
end)
|
521
|
-
|
522
|
-
private
|
523
|
-
|
524
|
-
def _client=(client)
|
525
|
-
self.client_name = (client.name if client)
|
526
|
-
end
|
527
496
|
end
|
528
497
|
end
|
529
498
|
before do
|
@@ -596,7 +565,7 @@ describe "many_to_one/one_to_many not referencing primary key" do
|
|
596
565
|
end
|
597
566
|
|
598
567
|
it "should remove all associated objects correctly" do
|
599
|
-
|
568
|
+
@client1.remove_all_invoices
|
600
569
|
@invoice1.refresh.client.should == nil
|
601
570
|
@invoice1.client_name.should == nil
|
602
571
|
@invoice2.refresh.client.should == nil
|
@@ -159,12 +159,12 @@ describe "Sequel::Model basic support" do
|
|
159
159
|
end
|
160
160
|
|
161
161
|
specify ".to_hash should return a hash keyed on primary key if no argument provided" do
|
162
|
-
|
162
|
+
Item.create(:name=>'J')
|
163
163
|
Item.to_hash.should == {1=>Item.load(:id=>1, :name=>'J')}
|
164
164
|
end
|
165
165
|
|
166
166
|
specify ".to_hash should return a hash keyed on argument if one argument provided" do
|
167
|
-
|
167
|
+
Item.create(:name=>'J')
|
168
168
|
Item.to_hash(:name).should == {'J'=>Item.load(:id=>1, :name=>'J')}
|
169
169
|
end
|
170
170
|
|
@@ -429,14 +429,12 @@ describe "Lazy Attributes plugin" do
|
|
429
429
|
|
430
430
|
specify "should load lazy attribute for all items returned when accessing any item if using identity map " do
|
431
431
|
Item.create(:name=>'K', :num=>2)
|
432
|
-
Item.
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
a.last.num.should == 2
|
439
|
-
end
|
432
|
+
a = Item.order(:name).all
|
433
|
+
a.should == [Item.load(:id=>1, :name=>'J'), Item.load(:id=>2, :name=>'K')]
|
434
|
+
a.map{|x| x[:num]}.should == [nil, nil]
|
435
|
+
a.first.num.should == 1
|
436
|
+
a.map{|x| x[:num]}.should == [1, 2]
|
437
|
+
a.last.num.should == 2
|
440
438
|
end
|
441
439
|
end
|
442
440
|
|
@@ -1879,20 +1877,23 @@ describe "Sequel::Plugins::ConstraintValidations" do
|
|
1879
1877
|
@db.create_constraint_validations_table
|
1880
1878
|
@ds = @db[:cv_test]
|
1881
1879
|
@regexp = regexp = @db.dataset.supports_regexp?
|
1882
|
-
@
|
1883
|
-
|
1884
|
-
|
1885
|
-
|
1886
|
-
|
1887
|
-
|
1880
|
+
@validation_opts = {}
|
1881
|
+
opts_proc = proc{@validation_opts}
|
1882
|
+
@validate_block = proc do |opts|
|
1883
|
+
opts = opts_proc.call
|
1884
|
+
presence :pre, opts.merge(:name=>:p)
|
1885
|
+
exact_length 5, :exactlen, opts.merge(:name=>:el)
|
1886
|
+
min_length 5, :minlen, opts.merge(:name=>:minl)
|
1887
|
+
max_length 5, :maxlen, opts.merge(:name=>:maxl)
|
1888
|
+
length_range 3..5, :lenrange, opts.merge(:name=>:lr)
|
1888
1889
|
if regexp
|
1889
|
-
format
|
1890
|
+
format(/^foo\d+/, :form, opts.merge(:name=>:f))
|
1890
1891
|
end
|
1891
|
-
like 'foo%', :lik, :name=>:l
|
1892
|
-
ilike 'foo%', :ilik, :name=>:il
|
1893
|
-
includes %w'abc def', :inc, :name=>:i
|
1894
|
-
unique :uniq, :name=>:u
|
1895
|
-
max_length 6, :minlen, :name=>:maxl2
|
1892
|
+
like 'foo%', :lik, opts.merge(:name=>:l)
|
1893
|
+
ilike 'foo%', :ilik, opts.merge(:name=>:il)
|
1894
|
+
includes %w'abc def', :inc, opts.merge(:name=>:i)
|
1895
|
+
unique :uniq, opts.merge(:name=>:u)
|
1896
|
+
max_length 6, :minlen, opts.merge(:name=>:maxl2)
|
1896
1897
|
end
|
1897
1898
|
@valid_row = {:pre=>'a', :exactlen=>'12345', :minlen=>'12345', :maxlen=>'12345', :lenrange=>'1234', :lik=>'fooabc', :ilik=>'FooABC', :inc=>'abc', :uniq=>'u'}
|
1898
1899
|
@violations = [
|
@@ -1927,6 +1928,7 @@ describe "Sequel::Plugins::ConstraintValidations" do
|
|
1927
1928
|
try = @valid_row.dup
|
1928
1929
|
vals += ['1234567'] if col == :minlen
|
1929
1930
|
vals.each do |val|
|
1931
|
+
next if val.nil? && @validation_opts[:allow_nil]
|
1930
1932
|
try[col] = val
|
1931
1933
|
proc{@ds.insert(try)}.should raise_error(Sequel::DatabaseError)
|
1932
1934
|
end
|
@@ -1950,32 +1952,36 @@ describe "Sequel::Plugins::ConstraintValidations" do
|
|
1950
1952
|
@violations.each do |col, vals|
|
1951
1953
|
try = @valid_row.dup
|
1952
1954
|
vals.each do |val|
|
1955
|
+
next if val.nil? && @validation_opts[:allow_nil]
|
1953
1956
|
try[col] = val
|
1954
1957
|
c.new(try).should_not be_valid
|
1955
1958
|
end
|
1956
1959
|
end
|
1960
|
+
c.db.constraint_validations = nil
|
1957
1961
|
end
|
1958
1962
|
end
|
1959
1963
|
|
1960
1964
|
describe "via create_table" do
|
1961
1965
|
before(:all) do
|
1962
|
-
|
1963
|
-
|
1964
|
-
|
1965
|
-
|
1966
|
-
|
1967
|
-
|
1968
|
-
|
1969
|
-
|
1970
|
-
|
1971
|
-
|
1972
|
-
|
1966
|
+
@table_block = proc do
|
1967
|
+
regexp = @regexp
|
1968
|
+
validate_block = @validate_block
|
1969
|
+
@db.create_table!(:cv_test) do
|
1970
|
+
primary_key :id
|
1971
|
+
String :pre
|
1972
|
+
String :exactlen
|
1973
|
+
String :minlen
|
1974
|
+
String :maxlen
|
1975
|
+
String :lenrange
|
1976
|
+
if regexp
|
1977
|
+
String :form
|
1978
|
+
end
|
1979
|
+
String :lik
|
1980
|
+
String :ilik
|
1981
|
+
String :inc
|
1982
|
+
String :uniq, :null=>false
|
1983
|
+
validate(&validate_block)
|
1973
1984
|
end
|
1974
|
-
String :lik
|
1975
|
-
String :ilik
|
1976
|
-
String :inc
|
1977
|
-
String :uniq, :null=>false
|
1978
|
-
validate(&validate_block)
|
1979
1985
|
end
|
1980
1986
|
end
|
1981
1987
|
after(:all) do
|
@@ -1983,30 +1989,44 @@ describe "Sequel::Plugins::ConstraintValidations" do
|
|
1983
1989
|
@db.drop_constraint_validations_for(:table=>:cv_test)
|
1984
1990
|
end
|
1985
1991
|
|
1986
|
-
|
1992
|
+
describe "with :allow_nil=>true" do
|
1993
|
+
before(:all) do
|
1994
|
+
@validation_opts = {:allow_nil=>true}
|
1995
|
+
@table_block.call
|
1996
|
+
end
|
1997
|
+
it_should_behave_like "constraint validations"
|
1998
|
+
end
|
1999
|
+
describe "with :allow_nil=>false" do
|
2000
|
+
before(:all) do
|
2001
|
+
@table_block.call
|
2002
|
+
end
|
2003
|
+
it_should_behave_like "constraint validations"
|
2004
|
+
end
|
1987
2005
|
end
|
1988
2006
|
|
1989
2007
|
describe "via alter_table" do
|
1990
2008
|
before(:all) do
|
1991
|
-
|
1992
|
-
|
1993
|
-
|
1994
|
-
|
1995
|
-
|
1996
|
-
|
1997
|
-
|
1998
|
-
|
1999
|
-
|
2000
|
-
|
2001
|
-
|
2002
|
-
|
2003
|
-
|
2004
|
-
|
2005
|
-
|
2006
|
-
|
2007
|
-
|
2009
|
+
@table_block = proc do
|
2010
|
+
regexp = @regexp
|
2011
|
+
validate_block = @validate_block
|
2012
|
+
@db.create_table!(:cv_test) do
|
2013
|
+
primary_key :id
|
2014
|
+
String :lik
|
2015
|
+
String :ilik
|
2016
|
+
String :inc
|
2017
|
+
String :uniq, :null=>false
|
2018
|
+
end
|
2019
|
+
@db.alter_table(:cv_test) do
|
2020
|
+
add_column :pre, String
|
2021
|
+
add_column :exactlen, String
|
2022
|
+
add_column :minlen, String
|
2023
|
+
add_column :maxlen, String
|
2024
|
+
add_column :lenrange, String
|
2025
|
+
if regexp
|
2026
|
+
add_column :form, String
|
2027
|
+
end
|
2028
|
+
validate(&validate_block)
|
2008
2029
|
end
|
2009
|
-
validate(&validate_block)
|
2010
2030
|
end
|
2011
2031
|
end
|
2012
2032
|
after(:all) do
|
@@ -2014,7 +2034,19 @@ describe "Sequel::Plugins::ConstraintValidations" do
|
|
2014
2034
|
@db.drop_constraint_validations_for(:table=>:cv_test)
|
2015
2035
|
end
|
2016
2036
|
|
2017
|
-
|
2037
|
+
describe "with :allow_nil=>true" do
|
2038
|
+
before(:all) do
|
2039
|
+
@validation_opts = {:allow_nil=>true}
|
2040
|
+
@table_block.call
|
2041
|
+
end
|
2042
|
+
it_should_behave_like "constraint validations"
|
2043
|
+
end
|
2044
|
+
describe "with :allow_nil=>false" do
|
2045
|
+
before(:all) do
|
2046
|
+
@table_block.call
|
2047
|
+
end
|
2048
|
+
it_should_behave_like "constraint validations"
|
2049
|
+
end
|
2018
2050
|
end
|
2019
2051
|
end
|
2020
2052
|
|
@@ -146,7 +146,7 @@ describe "Database schema parser" do
|
|
146
146
|
INTEGRATION_DB.create_table!(:items){FalseClass :number}
|
147
147
|
INTEGRATION_DB.schema(:items).first.last[:type].should == :boolean
|
148
148
|
end
|
149
|
-
end if INTEGRATION_DB.
|
149
|
+
end if INTEGRATION_DB.supports_schema_parsing?
|
150
150
|
|
151
151
|
test_indexes = begin
|
152
152
|
INTEGRATION_DB.drop_table?(:blah)
|
@@ -2,7 +2,6 @@ require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
|
|
2
2
|
|
3
3
|
describe "Sequel timezone support" do
|
4
4
|
def test_timezone(timezone=Sequel.application_timezone)
|
5
|
-
tz = timezone
|
6
5
|
Sequel.datetime_class = Time
|
7
6
|
# Tests should cover both DST and non-DST times.
|
8
7
|
[Time.now, Time.local(2010,1,1,12), Time.local(2010,6,1,12)].each do |t|
|