sequel 3.46.0 → 3.47.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
@@ -136,7 +136,7 @@ describe Sequel::Model::Associations::AssociationReflection, "#select" do
|
|
|
136
136
|
@c.association_reflection(:cs).keys.should_not include(:select)
|
|
137
137
|
@c.association_reflection(:cs).select.should == Sequel::SQL::ColumnAll.new(:par_parents)
|
|
138
138
|
end
|
|
139
|
-
it "should be if :select is not present for a many_to_one and one_to_many associaiton" do
|
|
139
|
+
it "should be blank if :select is not present for a many_to_one and one_to_many associaiton" do
|
|
140
140
|
@c.one_to_many :cs, :class=>'ParParent'
|
|
141
141
|
@c.association_reflection(:cs).keys.should_not include(:select)
|
|
142
142
|
@c.association_reflection(:cs).select.should == nil
|
|
@@ -200,7 +200,7 @@ describe Sequel::Model, "many_to_one" do
|
|
|
200
200
|
MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE (nodes.id = 234) LIMIT 1"]
|
|
201
201
|
end
|
|
202
202
|
|
|
203
|
-
it "should allow association with the same name as the key if :
|
|
203
|
+
it "should allow association with the same name as the key if :key_column is given" do
|
|
204
204
|
@c2.def_column_alias(:parent_id_id, :parent_id)
|
|
205
205
|
@c2.many_to_one :parent_id, :key_column=>:parent_id, :class => @c2
|
|
206
206
|
d = @c2.load(:id => 1, :parent_id => 234)
|
|
@@ -378,7 +378,7 @@ describe Sequel::Model, "many_to_one" do
|
|
|
378
378
|
MODEL_DB.sqls.should == ['UPDATE nodes SET parent_id = 345 WHERE (id = 1)']
|
|
379
379
|
end
|
|
380
380
|
|
|
381
|
-
it "should
|
|
381
|
+
it "should populate cache when accessed" do
|
|
382
382
|
@c2.many_to_one :parent, :class => @c2
|
|
383
383
|
|
|
384
384
|
d = @c2.load(:id => 1)
|
|
@@ -390,7 +390,7 @@ describe Sequel::Model, "many_to_one" do
|
|
|
390
390
|
d.associations[:parent].should == e
|
|
391
391
|
end
|
|
392
392
|
|
|
393
|
-
it "should
|
|
393
|
+
it "should populate cache when assigned" do
|
|
394
394
|
@c2.many_to_one :parent, :class => @c2
|
|
395
395
|
|
|
396
396
|
d = @c2.create(:id => 1)
|
|
@@ -402,7 +402,7 @@ describe Sequel::Model, "many_to_one" do
|
|
|
402
402
|
MODEL_DB.sqls.should == []
|
|
403
403
|
end
|
|
404
404
|
|
|
405
|
-
it "should use
|
|
405
|
+
it "should use cache if available" do
|
|
406
406
|
@c2.many_to_one :parent, :class => @c2
|
|
407
407
|
|
|
408
408
|
d = @c2.create(:id => 1, :parent_id => 234)
|
|
@@ -412,7 +412,7 @@ describe Sequel::Model, "many_to_one" do
|
|
|
412
412
|
MODEL_DB.sqls.should == []
|
|
413
413
|
end
|
|
414
414
|
|
|
415
|
-
it "should not use
|
|
415
|
+
it "should not use cache if asked to reload" do
|
|
416
416
|
@c2.many_to_one :parent, :class => @c2
|
|
417
417
|
|
|
418
418
|
d = @c2.create(:id => 1)
|
|
@@ -445,7 +445,7 @@ describe Sequel::Model, "many_to_one" do
|
|
|
445
445
|
MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE ((nodes.id = 234) AND (name > 'M')) LIMIT 1"]
|
|
446
446
|
end
|
|
447
447
|
|
|
448
|
-
it "should have the setter add to the reciprocal one_to_many cached association
|
|
448
|
+
it "should have the setter add to the reciprocal one_to_many cached association array if it exists" do
|
|
449
449
|
@c2.many_to_one :parent, :class => @c2
|
|
450
450
|
@c2.one_to_many :children, :class => @c2, :key=>:parent_id
|
|
451
451
|
@c2.dataset._fetch = []
|
|
@@ -466,7 +466,7 @@ describe Sequel::Model, "many_to_one" do
|
|
|
466
466
|
MODEL_DB.sqls.should == []
|
|
467
467
|
end
|
|
468
468
|
|
|
469
|
-
it "should have
|
|
469
|
+
it "should have setter deal with a one_to_one reciprocal" do
|
|
470
470
|
@c2.many_to_one :parent, :class => @c2, :key=>:parent_id
|
|
471
471
|
@c2.one_to_one :child, :class => @c2, :key=>:parent_id
|
|
472
472
|
|
|
@@ -488,7 +488,7 @@ describe Sequel::Model, "many_to_one" do
|
|
|
488
488
|
e.child.should == d
|
|
489
489
|
end
|
|
490
490
|
|
|
491
|
-
it "should have the setter remove the object from the previous associated object's reciprocal one_to_many cached association
|
|
491
|
+
it "should have the setter remove the object from the previous associated object's reciprocal one_to_many cached association array if it exists" do
|
|
492
492
|
@c2.many_to_one :parent, :class => @c2
|
|
493
493
|
@c2.one_to_many :children, :class => @c2, :key=>:parent_id
|
|
494
494
|
@c2.dataset._fetch = []
|
|
@@ -583,6 +583,15 @@ describe Sequel::Model, "many_to_one" do
|
|
|
583
583
|
p.instance_variable_get(:@x).should == c
|
|
584
584
|
end
|
|
585
585
|
|
|
586
|
+
it "should have the :setter option define the _association= method" do
|
|
587
|
+
@c2.many_to_one :parent, :class => @c2, :setter=>proc{|x| @x = x}
|
|
588
|
+
p = @c2.new
|
|
589
|
+
c = @c2.load(:id=>123)
|
|
590
|
+
p.should_not_receive(:parent_id=)
|
|
591
|
+
p.parent = c
|
|
592
|
+
p.instance_variable_get(:@x).should == c
|
|
593
|
+
end
|
|
594
|
+
|
|
586
595
|
it "should support (before|after)_set callbacks" do
|
|
587
596
|
h = []
|
|
588
597
|
@c2.many_to_one :parent, :class => @c2, :before_set=>[proc{|x,y| h << x.pk; h << (y ? -y.pk : :y)}, :blah], :after_set=>proc{h << 3}
|
|
@@ -656,28 +665,6 @@ describe Sequel::Model, "many_to_one" do
|
|
|
656
665
|
@c2.many_to_one :parent, :class => @c2, :before_set=>Object.new
|
|
657
666
|
proc{@c2.new.parent = @c2.load(:id=>1)}.should raise_error(Sequel::Error)
|
|
658
667
|
end
|
|
659
|
-
|
|
660
|
-
it "should call the remove callbacks for the previous object and the add callbacks for the new object" do
|
|
661
|
-
c = @c2.load(:id=>123)
|
|
662
|
-
d = @c2.load(:id=>321)
|
|
663
|
-
p = @c2.new
|
|
664
|
-
p.associations[:parent] = d
|
|
665
|
-
@c2.many_to_one :parent, :class => @c2, :before_set=>:bs, :after_set=>:as
|
|
666
|
-
@c2.class_eval do
|
|
667
|
-
self::Foo = []
|
|
668
|
-
def []=(a, v)
|
|
669
|
-
a == :parent_id ? (model::Foo << 5) : super
|
|
670
|
-
end
|
|
671
|
-
def bs(x)
|
|
672
|
-
model::Foo << x.pk
|
|
673
|
-
end
|
|
674
|
-
def as(x)
|
|
675
|
-
model::Foo << x.pk * 2
|
|
676
|
-
end
|
|
677
|
-
end
|
|
678
|
-
p.parent = c
|
|
679
|
-
@c2::Foo.should == [123, 5, 246]
|
|
680
|
-
end
|
|
681
668
|
end
|
|
682
669
|
|
|
683
670
|
describe Sequel::Model, "one_to_one" do
|
|
@@ -918,7 +905,7 @@ describe Sequel::Model, "one_to_one" do
|
|
|
918
905
|
"UPDATE nodes SET node_id = 1 WHERE (id = 3)"]
|
|
919
906
|
end
|
|
920
907
|
|
|
921
|
-
it "should
|
|
908
|
+
it "should populate cache when accessed" do
|
|
922
909
|
@c2.one_to_one :parent, :class => @c2
|
|
923
910
|
|
|
924
911
|
d = @c2.load(:id => 1)
|
|
@@ -931,7 +918,7 @@ describe Sequel::Model, "one_to_one" do
|
|
|
931
918
|
d.associations[:parent].should == e
|
|
932
919
|
end
|
|
933
920
|
|
|
934
|
-
it "should
|
|
921
|
+
it "should populate cache when assigned" do
|
|
935
922
|
@c2.one_to_one :parent, :class => @c2
|
|
936
923
|
|
|
937
924
|
d = @c2.load(:id => 1)
|
|
@@ -943,7 +930,7 @@ describe Sequel::Model, "one_to_one" do
|
|
|
943
930
|
e.should == f
|
|
944
931
|
end
|
|
945
932
|
|
|
946
|
-
it "should use
|
|
933
|
+
it "should use cache if available" do
|
|
947
934
|
@c2.one_to_one :parent, :class => @c2
|
|
948
935
|
d = @c2.load(:id => 1, :parent_id => 234)
|
|
949
936
|
d.associations[:parent] = 42
|
|
@@ -951,7 +938,7 @@ describe Sequel::Model, "one_to_one" do
|
|
|
951
938
|
MODEL_DB.sqls.should == []
|
|
952
939
|
end
|
|
953
940
|
|
|
954
|
-
it "should not use
|
|
941
|
+
it "should not use cache if asked to reload" do
|
|
955
942
|
@c2.one_to_one :parent, :class => @c2
|
|
956
943
|
d = @c2.load(:id => 1)
|
|
957
944
|
d.associations[:parent] = [42]
|
|
@@ -974,7 +961,7 @@ describe Sequel::Model, "one_to_one" do
|
|
|
974
961
|
MODEL_DB.sqls.should == ["UPDATE nodes SET parent_id = NULL WHERE (parent_id = 1)"]
|
|
975
962
|
end
|
|
976
963
|
|
|
977
|
-
it "should have the setter remove the object from the previous associated object's reciprocal many_to_one cached association
|
|
964
|
+
it "should have the setter remove the object from the previous associated object's reciprocal many_to_one cached association array if it exists" do
|
|
978
965
|
@c2.one_to_one :parent, :class => @c2, :key=>:parent_id
|
|
979
966
|
@c2.many_to_one :child, :class => @c2, :key=>:parent_id
|
|
980
967
|
@c2.dataset._fetch = []
|
|
@@ -1034,6 +1021,15 @@ describe Sequel::Model, "one_to_one" do
|
|
|
1034
1021
|
p.instance_variable_get(:@x).should == c
|
|
1035
1022
|
end
|
|
1036
1023
|
|
|
1024
|
+
it "should have a :setter option define the _association= method" do
|
|
1025
|
+
@c2.one_to_one :parent, :class => @c2, :setter=>proc{|x| @x = x}
|
|
1026
|
+
c = @c2.new
|
|
1027
|
+
p = @c2.load(:id=>123)
|
|
1028
|
+
p.should_not_receive(:parent_id=)
|
|
1029
|
+
p.parent = c
|
|
1030
|
+
p.instance_variable_get(:@x).should == c
|
|
1031
|
+
end
|
|
1032
|
+
|
|
1037
1033
|
it "should support (before|after)_set callbacks" do
|
|
1038
1034
|
h = []
|
|
1039
1035
|
@c2.one_to_one :parent, :class => @c2, :before_set=>[proc{|x,y| h << x.pk; h << (y ? -y.pk : :y)}, :blah], :after_set=>proc{h << 3}
|
|
@@ -1093,29 +1089,6 @@ describe Sequel::Model, "one_to_one" do
|
|
|
1093
1089
|
proc{@c2.new.parent = @c2.load(:id=>1)}.should raise_error(Sequel::Error)
|
|
1094
1090
|
end
|
|
1095
1091
|
|
|
1096
|
-
it "should call the set callbacks" do
|
|
1097
|
-
c = @c2.load(:id=>123)
|
|
1098
|
-
d = @c2.load(:id=>321)
|
|
1099
|
-
p = @c2.load(:id=>32)
|
|
1100
|
-
p.associations[:parent] = [d]
|
|
1101
|
-
h = []
|
|
1102
|
-
@c2.one_to_one :parent, :class => @c2, :before_set=>:bs, :after_set=>:as
|
|
1103
|
-
@c2.class_eval do
|
|
1104
|
-
self::Foo = h
|
|
1105
|
-
def []=(a, v)
|
|
1106
|
-
a == :node_id ? (model::Foo << 5) : super
|
|
1107
|
-
end
|
|
1108
|
-
def bs(x)
|
|
1109
|
-
model::Foo << x.pk
|
|
1110
|
-
end
|
|
1111
|
-
def as(x)
|
|
1112
|
-
model::Foo << x.pk * 2
|
|
1113
|
-
end
|
|
1114
|
-
end
|
|
1115
|
-
p.parent = c
|
|
1116
|
-
h.should == [123, 5, 246]
|
|
1117
|
-
end
|
|
1118
|
-
|
|
1119
1092
|
it "should work_correctly when used with associate" do
|
|
1120
1093
|
@c2.associate :one_to_one, :parent, :class => @c2
|
|
1121
1094
|
@c2.load(:id => 567).parent.should == @c2.load({})
|
|
@@ -1419,21 +1392,21 @@ describe Sequel::Model, "one_to_many" do
|
|
|
1419
1392
|
@c2.new(:id => 1234).attributes_dataset.sql.should == "SELECT * FROM attributes WHERE (attributes.node_id = 1234) ORDER BY kind1, kind2"
|
|
1420
1393
|
end
|
|
1421
1394
|
|
|
1422
|
-
it "should
|
|
1395
|
+
it "should have a dataset method for the associated object dataset" do
|
|
1423
1396
|
@c2.one_to_many :attributes, :class => @c1
|
|
1424
1397
|
@c2.new(:id => 1234).attributes_dataset.sql.should == 'SELECT * FROM attributes WHERE (attributes.node_id = 1234)'
|
|
1425
1398
|
end
|
|
1426
1399
|
|
|
1427
1400
|
it "should accept a block" do
|
|
1428
1401
|
@c2.one_to_many :attributes, :class => @c1 do |ds|
|
|
1429
|
-
ds.filter(:xxx =>
|
|
1402
|
+
ds.filter(:xxx => nil)
|
|
1430
1403
|
end
|
|
1431
1404
|
@c2.new(:id => 1234).attributes_dataset.sql.should == 'SELECT * FROM attributes WHERE ((attributes.node_id = 1234) AND (xxx IS NULL))'
|
|
1432
1405
|
end
|
|
1433
1406
|
|
|
1434
1407
|
it "should support :order option with block" do
|
|
1435
1408
|
@c2.one_to_many :attributes, :class => @c1, :order => :kind do |ds|
|
|
1436
|
-
ds.filter(:xxx =>
|
|
1409
|
+
ds.filter(:xxx => nil)
|
|
1437
1410
|
end
|
|
1438
1411
|
@c2.new(:id => 1234).attributes_dataset.sql.should == 'SELECT * FROM attributes WHERE ((attributes.node_id = 1234) AND (xxx IS NULL)) ORDER BY kind'
|
|
1439
1412
|
end
|
|
@@ -1467,7 +1440,7 @@ describe Sequel::Model, "one_to_many" do
|
|
|
1467
1440
|
@c2.new(:id => 1234).attributes_dataset.opts[:eager].should == {:attributes=>nil}
|
|
1468
1441
|
end
|
|
1469
1442
|
|
|
1470
|
-
it "should
|
|
1443
|
+
it "should populate cache when accessed" do
|
|
1471
1444
|
@c2.one_to_many :attributes, :class => @c1
|
|
1472
1445
|
n = @c2.new(:id => 1234)
|
|
1473
1446
|
n.associations.include?(:attributes).should == false
|
|
@@ -1476,7 +1449,7 @@ describe Sequel::Model, "one_to_many" do
|
|
|
1476
1449
|
MODEL_DB.sqls.should == ['SELECT * FROM attributes WHERE (attributes.node_id = 1234)']
|
|
1477
1450
|
end
|
|
1478
1451
|
|
|
1479
|
-
it "should use
|
|
1452
|
+
it "should use cache if available" do
|
|
1480
1453
|
@c2.one_to_many :attributes, :class => @c1
|
|
1481
1454
|
n = @c2.new(:id => 1234)
|
|
1482
1455
|
n.associations[:attributes] = 42
|
|
@@ -1484,7 +1457,7 @@ describe Sequel::Model, "one_to_many" do
|
|
|
1484
1457
|
MODEL_DB.sqls.should == []
|
|
1485
1458
|
end
|
|
1486
1459
|
|
|
1487
|
-
it "should not use
|
|
1460
|
+
it "should not use cache if asked to reload" do
|
|
1488
1461
|
@c2.one_to_many :attributes, :class => @c1
|
|
1489
1462
|
n = @c2.new(:id => 1234)
|
|
1490
1463
|
n.associations[:attributes] = 42
|
|
@@ -1492,7 +1465,7 @@ describe Sequel::Model, "one_to_many" do
|
|
|
1492
1465
|
MODEL_DB.sqls.should == ['SELECT * FROM attributes WHERE (attributes.node_id = 1234)']
|
|
1493
1466
|
end
|
|
1494
1467
|
|
|
1495
|
-
it "should add item to
|
|
1468
|
+
it "should add item to cache if it exists when calling add_" do
|
|
1496
1469
|
@c2.one_to_many :attributes, :class => @c1
|
|
1497
1470
|
n = @c2.new(:id => 1234)
|
|
1498
1471
|
att = @c1.load(:id => 345)
|
|
@@ -1502,7 +1475,7 @@ describe Sequel::Model, "one_to_many" do
|
|
|
1502
1475
|
a.should == [att]
|
|
1503
1476
|
end
|
|
1504
1477
|
|
|
1505
|
-
it "should set object to item's reciprocal
|
|
1478
|
+
it "should set object to item's reciprocal cache when calling add_" do
|
|
1506
1479
|
@c2.one_to_many :attributes, :class => @c1
|
|
1507
1480
|
@c1.many_to_one :node, :class => @c2
|
|
1508
1481
|
|
|
@@ -1512,7 +1485,7 @@ describe Sequel::Model, "one_to_many" do
|
|
|
1512
1485
|
att.node.should == n
|
|
1513
1486
|
end
|
|
1514
1487
|
|
|
1515
|
-
it "should remove item from
|
|
1488
|
+
it "should remove item from cache if it exists when calling remove_" do
|
|
1516
1489
|
@c2.one_to_many :attributes, :class => @c1
|
|
1517
1490
|
|
|
1518
1491
|
n = @c2.load(:id => 1234)
|
|
@@ -1523,7 +1496,7 @@ describe Sequel::Model, "one_to_many" do
|
|
|
1523
1496
|
a.should == []
|
|
1524
1497
|
end
|
|
1525
1498
|
|
|
1526
|
-
it "should remove item's reciprocal
|
|
1499
|
+
it "should remove item's reciprocal cache calling remove_" do
|
|
1527
1500
|
@c2.one_to_many :attributes, :class => @c1
|
|
1528
1501
|
@c1.many_to_one :node, :class => @c2
|
|
1529
1502
|
|
|
@@ -1561,7 +1534,7 @@ describe Sequel::Model, "one_to_many" do
|
|
|
1561
1534
|
im2.should_not(include('remove_all_attributes'))
|
|
1562
1535
|
end
|
|
1563
1536
|
|
|
1564
|
-
it "should populate the reciprocal many_to_one
|
|
1537
|
+
it "should populate the reciprocal many_to_one cache when loading the one_to_many association" do
|
|
1565
1538
|
@c2.one_to_many :attributes, :class => @c1, :key => :node_id
|
|
1566
1539
|
@c1.many_to_one :node, :class => @c2, :key => :node_id
|
|
1567
1540
|
|
|
@@ -1573,7 +1546,7 @@ describe Sequel::Model, "one_to_many" do
|
|
|
1573
1546
|
MODEL_DB.sqls.should == []
|
|
1574
1547
|
end
|
|
1575
1548
|
|
|
1576
|
-
it "should use an explicit reciprocal
|
|
1549
|
+
it "should use an explicit :reciprocal option if given" do
|
|
1577
1550
|
@c2.one_to_many :attributes, :class => @c1, :key => :node_id, :reciprocal=>:wxyz
|
|
1578
1551
|
|
|
1579
1552
|
n = @c2.new(:id => 1234)
|
|
@@ -1584,7 +1557,7 @@ describe Sequel::Model, "one_to_many" do
|
|
|
1584
1557
|
MODEL_DB.sqls.should == []
|
|
1585
1558
|
end
|
|
1586
1559
|
|
|
1587
|
-
it "should have an remove_all_ method that removes all
|
|
1560
|
+
it "should have an remove_all_ method that removes all associated objects" do
|
|
1588
1561
|
@c2.one_to_many :attributes, :class => @c1
|
|
1589
1562
|
@c2.new(:id => 1234).remove_all_attributes
|
|
1590
1563
|
MODEL_DB.sqls.should == ['UPDATE attributes SET node_id = NULL WHERE (node_id = 1234)']
|
|
@@ -1612,14 +1585,14 @@ describe Sequel::Model, "one_to_many" do
|
|
|
1612
1585
|
sqls.should == []
|
|
1613
1586
|
end
|
|
1614
1587
|
|
|
1615
|
-
it "remove_all should set the
|
|
1588
|
+
it "remove_all should set the cache to []" do
|
|
1616
1589
|
@c2.one_to_many :attributes, :class => @c1
|
|
1617
1590
|
node = @c2.new(:id => 1234)
|
|
1618
1591
|
node.remove_all_attributes
|
|
1619
1592
|
node.associations[:attributes].should == []
|
|
1620
1593
|
end
|
|
1621
1594
|
|
|
1622
|
-
it "remove_all should return the array of previously associated items if the
|
|
1595
|
+
it "remove_all should return the array of previously associated items if the cache is populated" do
|
|
1623
1596
|
@c2.one_to_many :attributes, :class => @c1
|
|
1624
1597
|
attrib = @c1.new(:id=>3)
|
|
1625
1598
|
node = @c2.new(:id => 1234)
|
|
@@ -1630,12 +1603,12 @@ describe Sequel::Model, "one_to_many" do
|
|
|
1630
1603
|
node.remove_all_attributes.should == [attrib]
|
|
1631
1604
|
end
|
|
1632
1605
|
|
|
1633
|
-
it "remove_all should return nil if the
|
|
1606
|
+
it "remove_all should return nil if the cache is not populated" do
|
|
1634
1607
|
@c2.one_to_many :attributes, :class => @c1
|
|
1635
1608
|
@c2.new(:id => 1234).remove_all_attributes.should == nil
|
|
1636
1609
|
end
|
|
1637
1610
|
|
|
1638
|
-
it "remove_all should remove the current item from all reciprocal
|
|
1611
|
+
it "remove_all should remove the current item from all reciprocal association caches if they are populated" do
|
|
1639
1612
|
@c2.one_to_many :attributes, :class => @c1
|
|
1640
1613
|
@c1.many_to_one :node, :class => @c2
|
|
1641
1614
|
@c2.dataset._fetch = []
|
|
@@ -1663,6 +1636,15 @@ describe Sequel::Model, "one_to_many" do
|
|
|
1663
1636
|
p.instance_variable_get(:@x).should == c
|
|
1664
1637
|
end
|
|
1665
1638
|
|
|
1639
|
+
it "should support an :adder option for defining the _add_ method" do
|
|
1640
|
+
@c2.one_to_many :attributes, :class => @c1, :adder=>proc{|x| @x = x}
|
|
1641
|
+
p = @c2.load(:id=>10)
|
|
1642
|
+
c = @c1.load(:id=>123)
|
|
1643
|
+
c.should_not_receive(:node_id=)
|
|
1644
|
+
p.add_attribute(c)
|
|
1645
|
+
p.instance_variable_get(:@x).should == c
|
|
1646
|
+
end
|
|
1647
|
+
|
|
1666
1648
|
it "should allow additional arguments given to the add_ method and pass them onwards to the _add_ method" do
|
|
1667
1649
|
@c2.one_to_many :attributes, :class => @c1
|
|
1668
1650
|
p = @c2.load(:id=>10)
|
|
@@ -1690,6 +1672,15 @@ describe Sequel::Model, "one_to_many" do
|
|
|
1690
1672
|
p.instance_variable_get(:@x).should == c
|
|
1691
1673
|
end
|
|
1692
1674
|
|
|
1675
|
+
it "should support a :remover option for defining the _remove_ method" do
|
|
1676
|
+
@c2.one_to_many :attributes, :class => @c1, :remover=>proc{|x| @x = x}
|
|
1677
|
+
p = @c2.load(:id=>10)
|
|
1678
|
+
c = @c1.load(:id=>123)
|
|
1679
|
+
c.should_not_receive(:node_id=)
|
|
1680
|
+
p.remove_attribute(c)
|
|
1681
|
+
p.instance_variable_get(:@x).should == c
|
|
1682
|
+
end
|
|
1683
|
+
|
|
1693
1684
|
it "should allow additional arguments given to the remove_ method and pass them onwards to the _remove_ method" do
|
|
1694
1685
|
@c2.one_to_many :attributes, :class => @c1
|
|
1695
1686
|
p = @c2.load(:id=>10)
|
|
@@ -1727,6 +1718,13 @@ describe Sequel::Model, "one_to_many" do
|
|
|
1727
1718
|
p.instance_variable_get(:@x).should == :foo
|
|
1728
1719
|
end
|
|
1729
1720
|
|
|
1721
|
+
it "should support a :clearer option for defining the _remove_all_ method" do
|
|
1722
|
+
@c2.one_to_many :attributes, :class => @c1, :clearer=>proc{@x = :foo}
|
|
1723
|
+
p = @c2.load(:id=>10)
|
|
1724
|
+
p.remove_all_attributes
|
|
1725
|
+
p.instance_variable_get(:@x).should == :foo
|
|
1726
|
+
end
|
|
1727
|
+
|
|
1730
1728
|
it "should support (before|after)_(add|remove) callbacks" do
|
|
1731
1729
|
h = []
|
|
1732
1730
|
@c2.one_to_many :attributes, :class => @c1, :before_add=>[proc{|x,y| h << x.pk; h << -y.pk}, :blah], :after_add=>proc{h << 3}, :before_remove=>:blah, :after_remove=>[:blahr]
|
|
@@ -1965,7 +1963,6 @@ describe Sequel::Model, "many_to_many" do
|
|
|
1965
1963
|
end
|
|
1966
1964
|
|
|
1967
1965
|
it "should support a :dataset option that accepts the reflection as an argument" do
|
|
1968
|
-
c1 = @c1
|
|
1969
1966
|
@c2.many_to_many :attributes, :class => @c1, :dataset=>lambda{|opts| opts.associated_dataset.join_table(:natural, :an).filter(:an__nodeid=>pk)}, :order=> :a, :limit=>10, :select=>nil do |ds|
|
|
1970
1967
|
ds.filter(:xxx => @xxx)
|
|
1971
1968
|
end
|
|
@@ -2220,7 +2217,7 @@ describe Sequel::Model, "many_to_many" do
|
|
|
2220
2217
|
MODEL_DB.sqls.should == ['SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON ((attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1234))']
|
|
2221
2218
|
end
|
|
2222
2219
|
|
|
2223
|
-
it "should
|
|
2220
|
+
it "should populate cache when accessed" do
|
|
2224
2221
|
@c2.many_to_many :attributes, :class => @c1
|
|
2225
2222
|
|
|
2226
2223
|
n = @c2.new(:id => 1234)
|
|
@@ -2229,7 +2226,7 @@ describe Sequel::Model, "many_to_many" do
|
|
|
2229
2226
|
atts.should == n.associations[:attributes]
|
|
2230
2227
|
end
|
|
2231
2228
|
|
|
2232
|
-
it "should use
|
|
2229
|
+
it "should use cache if available" do
|
|
2233
2230
|
@c2.many_to_many :attributes, :class => @c1
|
|
2234
2231
|
|
|
2235
2232
|
n = @c2.new(:id => 1234)
|
|
@@ -2238,7 +2235,7 @@ describe Sequel::Model, "many_to_many" do
|
|
|
2238
2235
|
MODEL_DB.sqls.should == []
|
|
2239
2236
|
end
|
|
2240
2237
|
|
|
2241
|
-
it "should not use
|
|
2238
|
+
it "should not use cache if asked to reload" do
|
|
2242
2239
|
@c2.many_to_many :attributes, :class => @c1
|
|
2243
2240
|
|
|
2244
2241
|
n = @c2.new(:id => 1234)
|
|
@@ -2247,7 +2244,7 @@ describe Sequel::Model, "many_to_many" do
|
|
|
2247
2244
|
MODEL_DB.sqls.should == ["SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON ((attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1234))"]
|
|
2248
2245
|
end
|
|
2249
2246
|
|
|
2250
|
-
it "should add item to
|
|
2247
|
+
it "should add item to cache if it exists when calling add_" do
|
|
2251
2248
|
@c2.many_to_many :attributes, :class => @c1
|
|
2252
2249
|
|
|
2253
2250
|
n = @c2.new(:id => 1234)
|
|
@@ -2258,7 +2255,7 @@ describe Sequel::Model, "many_to_many" do
|
|
|
2258
2255
|
a.should == [att]
|
|
2259
2256
|
end
|
|
2260
2257
|
|
|
2261
|
-
it "should add item to reciprocal
|
|
2258
|
+
it "should add item to reciprocal's cache if it exists when calling add_" do
|
|
2262
2259
|
@c2.many_to_many :attributes, :class => @c1
|
|
2263
2260
|
@c1.many_to_many :nodes, :class => @c2
|
|
2264
2261
|
|
|
@@ -2269,7 +2266,7 @@ describe Sequel::Model, "many_to_many" do
|
|
|
2269
2266
|
att.nodes.should == [n]
|
|
2270
2267
|
end
|
|
2271
2268
|
|
|
2272
|
-
it "should remove item from
|
|
2269
|
+
it "should remove item from cache if it exists when calling remove_" do
|
|
2273
2270
|
@c2.many_to_many :attributes, :class => @c1
|
|
2274
2271
|
|
|
2275
2272
|
n = @c2.new(:id => 1234)
|
|
@@ -2280,7 +2277,7 @@ describe Sequel::Model, "many_to_many" do
|
|
|
2280
2277
|
a.should == []
|
|
2281
2278
|
end
|
|
2282
2279
|
|
|
2283
|
-
it "should remove item from reciprocal
|
|
2280
|
+
it "should remove item from reciprocal's if it exists when calling remove_" do
|
|
2284
2281
|
@c2.many_to_many :attributes, :class => @c1
|
|
2285
2282
|
@c1.many_to_many :nodes, :class => @c2
|
|
2286
2283
|
|
|
@@ -2398,6 +2395,15 @@ describe Sequel::Model, "many_to_many" do
|
|
|
2398
2395
|
MODEL_DB.sqls.should == []
|
|
2399
2396
|
end
|
|
2400
2397
|
|
|
2398
|
+
it "should support an :adder option for defining the _add_ method" do
|
|
2399
|
+
@c2.many_to_many :attributes, :class => @c1, :adder=>proc{|x| @x = x}
|
|
2400
|
+
p = @c2.load(:id=>10)
|
|
2401
|
+
c = @c1.load(:id=>123)
|
|
2402
|
+
p.add_attribute(c)
|
|
2403
|
+
p.instance_variable_get(:@x).should == c
|
|
2404
|
+
MODEL_DB.sqls.should == []
|
|
2405
|
+
end
|
|
2406
|
+
|
|
2401
2407
|
it "should allow additional arguments given to the add_ method and pass them onwards to the _add_ method" do
|
|
2402
2408
|
@c2.many_to_many :attributes, :class => @c1
|
|
2403
2409
|
p = @c2.load(:id=>10)
|
|
@@ -2424,6 +2430,15 @@ describe Sequel::Model, "many_to_many" do
|
|
|
2424
2430
|
MODEL_DB.sqls.should == []
|
|
2425
2431
|
end
|
|
2426
2432
|
|
|
2433
|
+
it "should support a :remover option for defining the _remove_ method" do
|
|
2434
|
+
@c2.many_to_many :attributes, :class => @c1, :remover=>proc{|x| @x = x}
|
|
2435
|
+
p = @c2.load(:id=>10)
|
|
2436
|
+
c = @c1.load(:id=>123)
|
|
2437
|
+
p.remove_attribute(c)
|
|
2438
|
+
p.instance_variable_get(:@x).should == c
|
|
2439
|
+
MODEL_DB.sqls.should == []
|
|
2440
|
+
end
|
|
2441
|
+
|
|
2427
2442
|
it "should allow additional arguments given to the remove_ method and pass them onwards to the _remove_ method" do
|
|
2428
2443
|
@c2.many_to_many :attributes, :class => @c1
|
|
2429
2444
|
p = @c2.load(:id=>10)
|
|
@@ -2440,7 +2455,6 @@ describe Sequel::Model, "many_to_many" do
|
|
|
2440
2455
|
it "should allow additional arguments given to the remove_all_ method and pass them onwards to the _remove_all_ method" do
|
|
2441
2456
|
@c2.many_to_many :attributes, :class => @c1
|
|
2442
2457
|
p = @c2.load(:id=>10)
|
|
2443
|
-
c = @c1.load(:id=>123)
|
|
2444
2458
|
def p._remove_all_attributes(*y)
|
|
2445
2459
|
@y = y
|
|
2446
2460
|
end
|
|
@@ -2460,6 +2474,14 @@ describe Sequel::Model, "many_to_many" do
|
|
|
2460
2474
|
MODEL_DB.sqls.should == []
|
|
2461
2475
|
end
|
|
2462
2476
|
|
|
2477
|
+
it "should support a :clearer option for defining the _remove_all_ method" do
|
|
2478
|
+
@c2.many_to_many :attributes, :class => @c1, :clearer=>proc{@x = :foo}
|
|
2479
|
+
p = @c2.load(:id=>10)
|
|
2480
|
+
p.remove_all_attributes
|
|
2481
|
+
p.instance_variable_get(:@x).should == :foo
|
|
2482
|
+
MODEL_DB.sqls.should == []
|
|
2483
|
+
end
|
|
2484
|
+
|
|
2463
2485
|
it "should support (before|after)_(add|remove) callbacks" do
|
|
2464
2486
|
h = []
|
|
2465
2487
|
@c2.many_to_many :attributes, :class => @c1, :before_add=>[proc{|x,y| h << x.pk; h << -y.pk}, :blah], :after_add=>proc{h << 3}, :before_remove=>:blah, :after_remove=>[:blahr]
|