sequel 4.44.0 → 4.45.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.
Files changed (140) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +110 -0
  3. data/README.rdoc +8 -9
  4. data/doc/active_record.rdoc +2 -3
  5. data/doc/model_plugins.rdoc +1 -1
  6. data/doc/opening_databases.rdoc +0 -46
  7. data/doc/release_notes/4.45.0.txt +370 -0
  8. data/lib/sequel/adapters/cubrid.rb +2 -0
  9. data/lib/sequel/adapters/do.rb +2 -0
  10. data/lib/sequel/adapters/jdbc/as400.rb +2 -0
  11. data/lib/sequel/adapters/jdbc/cubrid.rb +2 -0
  12. data/lib/sequel/adapters/jdbc/firebirdsql.rb +2 -0
  13. data/lib/sequel/adapters/jdbc/informix-sqli.rb +2 -0
  14. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +2 -0
  15. data/lib/sequel/adapters/jdbc/mysql.rb +1 -0
  16. data/lib/sequel/adapters/jdbc/postgresql.rb +5 -0
  17. data/lib/sequel/adapters/mysql.rb +1 -0
  18. data/lib/sequel/adapters/mysql2.rb +1 -0
  19. data/lib/sequel/adapters/odbc/oracle.rb +11 -0
  20. data/lib/sequel/adapters/odbc/progress.rb +2 -0
  21. data/lib/sequel/adapters/postgres.rb +0 -2
  22. data/lib/sequel/adapters/shared/cubrid.rb +2 -0
  23. data/lib/sequel/adapters/shared/firebird.rb +2 -0
  24. data/lib/sequel/adapters/shared/informix.rb +2 -0
  25. data/lib/sequel/adapters/shared/mssql.rb +47 -7
  26. data/lib/sequel/adapters/shared/mysql.rb +16 -1
  27. data/lib/sequel/adapters/shared/postgres.rb +9 -1
  28. data/lib/sequel/adapters/shared/progress.rb +2 -0
  29. data/lib/sequel/adapters/shared/sqlanywhere.rb +1 -1
  30. data/lib/sequel/adapters/swift.rb +2 -0
  31. data/lib/sequel/ast_transformer.rb +13 -6
  32. data/lib/sequel/core.rb +13 -16
  33. data/lib/sequel/database/connecting.rb +25 -10
  34. data/lib/sequel/database/dataset.rb +6 -1
  35. data/lib/sequel/database/dataset_defaults.rb +9 -2
  36. data/lib/sequel/database/misc.rb +10 -3
  37. data/lib/sequel/database/schema_methods.rb +4 -0
  38. data/lib/sequel/dataset/mutation.rb +8 -20
  39. data/lib/sequel/dataset/prepared_statements.rb +2 -0
  40. data/lib/sequel/dataset/query.rb +32 -7
  41. data/lib/sequel/dataset/sql.rb +13 -3
  42. data/lib/sequel/deprecated.rb +9 -1
  43. data/lib/sequel/exceptions.rb +37 -8
  44. data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +117 -0
  45. data/lib/sequel/extensions/date_arithmetic.rb +1 -0
  46. data/lib/sequel/extensions/identifier_mangling.rb +3 -2
  47. data/lib/sequel/extensions/pg_hstore.rb +1 -5
  48. data/lib/sequel/extensions/schema_dumper.rb +3 -1
  49. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +2 -2
  50. data/lib/sequel/extensions/string_agg.rb +1 -0
  51. data/lib/sequel/model.rb +23 -10
  52. data/lib/sequel/model/associations.rb +17 -5
  53. data/lib/sequel/model/base.rb +115 -62
  54. data/lib/sequel/model/dataset_module.rb +10 -3
  55. data/lib/sequel/model/exceptions.rb +7 -5
  56. data/lib/sequel/plugins/association_pks.rb +13 -1
  57. data/lib/sequel/plugins/association_proxies.rb +8 -1
  58. data/lib/sequel/plugins/before_after_save.rb +1 -0
  59. data/lib/sequel/plugins/class_table_inheritance.rb +7 -3
  60. data/lib/sequel/plugins/columns_updated.rb +42 -0
  61. data/lib/sequel/plugins/composition.rb +10 -5
  62. data/lib/sequel/plugins/error_splitter.rb +1 -1
  63. data/lib/sequel/plugins/hook_class_methods.rb +39 -5
  64. data/lib/sequel/plugins/instance_hooks.rb +58 -5
  65. data/lib/sequel/plugins/lazy_attributes.rb +10 -5
  66. data/lib/sequel/plugins/nested_attributes.rb +10 -5
  67. data/lib/sequel/plugins/prepared_statements.rb +7 -0
  68. data/lib/sequel/plugins/prepared_statements_associations.rb +2 -0
  69. data/lib/sequel/plugins/prepared_statements_with_pk.rb +2 -0
  70. data/lib/sequel/plugins/schema.rb +2 -0
  71. data/lib/sequel/plugins/scissors.rb +2 -0
  72. data/lib/sequel/plugins/serialization.rb +10 -5
  73. data/lib/sequel/plugins/split_values.rb +5 -1
  74. data/lib/sequel/plugins/static_cache.rb +2 -2
  75. data/lib/sequel/plugins/tactical_eager_loading.rb +1 -1
  76. data/lib/sequel/plugins/validation_contexts.rb +49 -0
  77. data/lib/sequel/plugins/validation_helpers.rb +1 -0
  78. data/lib/sequel/sql.rb +1 -1
  79. data/lib/sequel/version.rb +1 -1
  80. data/spec/adapters/mssql_spec.rb +31 -0
  81. data/spec/adapters/mysql_spec.rb +20 -2
  82. data/spec/adapters/postgres_spec.rb +43 -12
  83. data/spec/adapters/spec_helper.rb +5 -8
  84. data/spec/core/database_spec.rb +47 -12
  85. data/spec/core/dataset_mutation_spec.rb +22 -22
  86. data/spec/core/dataset_spec.rb +88 -20
  87. data/spec/core/deprecated_spec.rb +1 -1
  88. data/spec/core/expression_filters_spec.rb +1 -1
  89. data/spec/core/mock_adapter_spec.rb +0 -3
  90. data/spec/core/placeholder_literalizer_spec.rb +1 -1
  91. data/spec/core/schema_spec.rb +8 -1
  92. data/spec/core/spec_helper.rb +6 -1
  93. data/spec/core_extensions_spec.rb +4 -0
  94. data/spec/deprecation_helper.rb +17 -0
  95. data/spec/extensions/_deprecated_identifier_mangling_spec.rb +314 -0
  96. data/spec/extensions/association_pks_spec.rb +61 -13
  97. data/spec/extensions/association_proxies_spec.rb +3 -3
  98. data/spec/extensions/class_table_inheritance_spec.rb +39 -0
  99. data/spec/extensions/columns_updated_spec.rb +35 -0
  100. data/spec/extensions/composition_spec.rb +6 -1
  101. data/spec/extensions/hook_class_methods_spec.rb +114 -26
  102. data/spec/extensions/identifier_mangling_spec.rb +107 -73
  103. data/spec/extensions/instance_hooks_spec.rb +78 -14
  104. data/spec/extensions/lazy_attributes_spec.rb +8 -2
  105. data/spec/extensions/many_through_many_spec.rb +2 -2
  106. data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
  107. data/spec/extensions/nested_attributes_spec.rb +8 -2
  108. data/spec/extensions/pg_array_spec.rb +18 -4
  109. data/spec/extensions/prepared_statements_associations_spec.rb +48 -39
  110. data/spec/extensions/prepared_statements_with_pk_spec.rb +13 -11
  111. data/spec/extensions/query_spec.rb +1 -1
  112. data/spec/extensions/schema_dumper_spec.rb +34 -6
  113. data/spec/extensions/schema_spec.rb +13 -7
  114. data/spec/extensions/scissors_spec.rb +3 -1
  115. data/spec/extensions/sequel_3_dataset_methods_spec.rb +4 -4
  116. data/spec/extensions/serialization_spec.rb +7 -1
  117. data/spec/extensions/set_overrides_spec.rb +2 -2
  118. data/spec/extensions/shared_caching_spec.rb +19 -15
  119. data/spec/extensions/spec_helper.rb +7 -3
  120. data/spec/extensions/split_values_spec.rb +45 -10
  121. data/spec/extensions/string_agg_spec.rb +2 -2
  122. data/spec/extensions/subset_conditions_spec.rb +3 -3
  123. data/spec/extensions/tactical_eager_loading_spec.rb +1 -1
  124. data/spec/extensions/validation_contexts_spec.rb +31 -0
  125. data/spec/guards_helper.rb +2 -0
  126. data/spec/integration/associations_test.rb +22 -20
  127. data/spec/integration/dataset_test.rb +25 -2
  128. data/spec/integration/model_test.rb +1 -1
  129. data/spec/integration/plugin_test.rb +11 -16
  130. data/spec/integration/prepared_statement_test.rb +40 -32
  131. data/spec/integration/spec_helper.rb +5 -8
  132. data/spec/model/association_reflection_spec.rb +4 -0
  133. data/spec/model/associations_spec.rb +37 -10
  134. data/spec/model/base_spec.rb +6 -0
  135. data/spec/model/hooks_spec.rb +56 -35
  136. data/spec/model/model_spec.rb +21 -5
  137. data/spec/model/record_spec.rb +14 -11
  138. data/spec/model/spec_helper.rb +7 -1
  139. data/spec/sequel_warning.rb +11 -0
  140. metadata +13 -3
@@ -77,7 +77,7 @@ describe "Sequel::Plugins::TacticalEagerLoading" do
77
77
  sql_match('SELECT * FROM t WHERE (t.id = 101) LIMIT 1', 'SELECT * FROM t WHERE (t.id = 102) LIMIT 1')
78
78
  end
79
79
 
80
- it "association getter methods should not eagerly load the association if true is passed" do
80
+ deprecated "association getter methods should not eagerly load the association if true is passed" do
81
81
  ts.map{|x| x.parent(true)}.must_equal [ts[2], ts[3], nil, nil]
82
82
  sql_match('SELECT * FROM t WHERE id = 101', 'SELECT * FROM t WHERE id = 102')
83
83
  end
@@ -0,0 +1,31 @@
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
+
3
+ describe "Sequel::Plugins::ValidationHelpers" do
4
+ before do
5
+ @c = Class.new(Sequel::Model(:foo))
6
+ @c.class_eval do
7
+ columns :a, :b, :c
8
+ plugin :validation_contexts
9
+ def validate
10
+ errors.add(:a, 'bad') if a == 1 && validation_context == :create
11
+ errors.add(:b, 'bad') if b == 2 && validation_context == :update
12
+ errors.add(:c, 'bad') if c == 3 && validation_context == :foo
13
+ end
14
+ end
15
+ end
16
+
17
+ it "should support :validation_context option to valid?" do
18
+ @c.new(:c=>3).valid?.must_equal true
19
+ @c.new(:c=>3).valid?(:validation_context=>:foo).must_equal false
20
+ end
21
+
22
+ it "should support :validation_context option to save?" do
23
+ @c.new(:c=>3).save
24
+ proc{@c.new(:c=>3).save(:validation_context=>:foo)}.must_raise Sequel::ValidationFailed
25
+ end
26
+
27
+ it "should raise error if using a validation context on a frozen model instance" do
28
+ @c.new(:c=>3).freeze.valid?.must_equal true
29
+ proc{@c.new(:c=>3).freeze.valid?(:validation_context=>:foo)}.must_raise RuntimeError, TypeError
30
+ end
31
+ end
@@ -3,6 +3,8 @@ require 'minitest/autorun'
3
3
  require 'minitest/hooks/default'
4
4
  require 'minitest/shared_description'
5
5
 
6
+ require "#{File.dirname(__FILE__)}/deprecation_helper.rb"
7
+
6
8
  def Sequel.guarded?(*checked)
7
9
  unless ENV['SEQUEL_NO_PENDING']
8
10
  checked.each do |c|
@@ -1588,22 +1588,24 @@ BasicRegularAndCompositeKeyAssociations = shared_description do
1588
1588
  end
1589
1589
 
1590
1590
  it "should work correctly with prepared_statements_association plugin" do
1591
- @album.update(:artist => @artist)
1592
- @album.add_tag(@tag)
1593
-
1594
- @album.reload
1595
- @artist.reload
1596
- @tag.reload
1597
-
1598
- [Tag, Album, Artist].each{|x| x.plugin :prepared_statements_associations}
1599
- @album.artist.must_equal @artist
1600
- @artist.first_album.must_equal @album
1601
- @artist.albums.must_equal [@album]
1602
- @album.tags.must_equal [@tag]
1603
- @album.alias_tags.must_equal [@tag]
1604
- @tag.albums.must_equal [@album]
1605
- unless @no_many_through_many
1606
- @album.first_tag.must_equal @tag
1591
+ deprecated do
1592
+ @album.update(:artist => @artist)
1593
+ @album.add_tag(@tag)
1594
+
1595
+ @album.reload
1596
+ @artist.reload
1597
+ @tag.reload
1598
+
1599
+ [Tag, Album, Artist].each{|x| x.plugin :prepared_statements_associations}
1600
+ @album.artist.must_equal @artist
1601
+ @artist.first_album.must_equal @album
1602
+ @artist.albums.must_equal [@album]
1603
+ @album.tags.must_equal [@tag]
1604
+ @album.alias_tags.must_equal [@tag]
1605
+ @tag.albums.must_equal [@album]
1606
+ unless @no_many_through_many
1607
+ @album.first_tag.must_equal @tag
1608
+ end
1607
1609
  end
1608
1610
  end
1609
1611
 
@@ -2037,12 +2039,12 @@ describe "Sequel::Model Simple Associations" do
2037
2039
  @artist.add_album(@album)
2038
2040
 
2039
2041
  @artist.albums.must_equal [@album]
2040
- @artist.albums(proc{|ds| ds.exclude(:id=>@album.id)}).must_equal []
2041
- @artist.albums(proc{|ds| ds.filter(:id=>@album.id)}).must_equal [@album]
2042
+ @artist.albums{|ds| ds.exclude(:id=>@album.id)}.must_equal []
2043
+ @artist.albums{|ds| ds.filter(:id=>@album.id)}.must_equal [@album]
2042
2044
 
2043
2045
  @album.artist.must_equal @artist
2044
- @album.artist(proc{|ds| ds.exclude(:id=>@artist.id)}).must_be_nil
2045
- @album.artist(proc{|ds| ds.filter(:id=>@artist.id)}).must_equal @artist
2046
+ @album.artist{|ds| ds.exclude(:id=>@artist.id)}.must_be_nil
2047
+ @album.artist{|ds| ds.filter(:id=>@artist.id)}.must_equal @artist
2046
2048
 
2047
2049
  @artist.albums{|ds| ds.exclude(:id=>@album.id)}.must_equal []
2048
2050
  @artist.albums{|ds| ds.filter(:id=>@album.id)}.must_equal [@album]
@@ -616,6 +616,10 @@ describe "Dataset UNION, EXCEPT, and INTERSECT" do
616
616
  DB.drop_table?(:i1, :i2, :i3)
617
617
  end
618
618
 
619
+ it "should give the correct results for UNION with an existing order" do
620
+ @ds1.order(:number).union(@ds2).order(:number).map{|x| x[:number].to_s}.must_equal %w'10 20 30'
621
+ end
622
+
619
623
  it "should give the correct results for simple UNION, EXCEPT, and INTERSECT" do
620
624
  @ds1.union(@ds2).order(:number).map{|x| x[:number].to_s}.must_equal %w'10 20 30'
621
625
  if @ds1.supports_intersect_except?
@@ -624,7 +628,10 @@ describe "Dataset UNION, EXCEPT, and INTERSECT" do
624
628
  end
625
629
  end
626
630
 
627
- cspecify "should give the correct results for UNION, EXCEPT, and INTERSECT when used with ordering and limits", :mssql do
631
+ it "should give the correct results for UNION, EXCEPT, and INTERSECT when used with ordering and limits and offsets" do
632
+ [%w'10 30', %w'10 20 30'].must_include @ds1.limit(1).union(@ds2).order(:number).map{|x| x[:number].to_s}
633
+ [%w'10 30', %w'10 20 30'].must_include @ds1.offset(1).union(@ds2).order(:number).map{|x| x[:number].to_s}
634
+
628
635
  @ds1.insert(:number=>8)
629
636
  @ds2.insert(:number=>9)
630
637
  @ds1.insert(:number=>38)
@@ -635,15 +642,31 @@ describe "Dataset UNION, EXCEPT, and INTERSECT" do
635
642
 
636
643
  @ds1.reverse_order(:number).limit(1).union(@ds2).order(:number).map{|x| x[:number].to_s}.must_equal %w'9 10 30 38 39'
637
644
  @ds2.reverse_order(:number).limit(1).union(@ds1).order(:number).map{|x| x[:number].to_s}.must_equal %w'8 10 20 38 39'
645
+ @ds1.reverse_order(:number).limit(1, 1).union(@ds2).order(:number).map{|x| x[:number].to_s}.must_equal %w'9 10 20 30 39'
646
+ @ds2.reverse_order(:number).limit(1, 1).union(@ds1).order(:number).map{|x| x[:number].to_s}.must_equal %w'8 10 20 30 38'
647
+ @ds1.reverse_order(:number).offset(1).union(@ds2).order(:number).map{|x| x[:number].to_s}.must_equal %w'8 9 10 20 30 39'
648
+ @ds2.reverse_order(:number).offset(1).union(@ds1).order(:number).map{|x| x[:number].to_s}.must_equal %w'8 9 10 20 30 38'
638
649
 
639
650
  @ds1.union(@ds2.order(:number).limit(1)).order(:number).map{|x| x[:number].to_s}.must_equal %w'8 9 10 20 38'
640
651
  @ds2.union(@ds1.order(:number).limit(1)).order(:number).map{|x| x[:number].to_s}.must_equal %w'8 9 10 30 39'
652
+ @ds1.union(@ds2.order(:number).limit(1, 1)).order(:number).map{|x| x[:number].to_s}.must_equal %w'8 10 20 38'
653
+ @ds2.union(@ds1.order(:number).limit(1, 1)).order(:number).map{|x| x[:number].to_s}.must_equal %w'9 10 30 39'
654
+ @ds1.union(@ds2.order(:number).offset(1)).order(:number).map{|x| x[:number].to_s}.must_equal %w'8 10 20 30 38 39'
655
+ @ds2.union(@ds1.order(:number).offset(1)).order(:number).map{|x| x[:number].to_s}.must_equal %w'9 10 20 30 38 39'
641
656
 
642
657
  @ds1.union(@ds2).limit(2).order(:number).map{|x| x[:number].to_s}.must_equal %w'8 9'
643
658
  @ds2.union(@ds1).reverse_order(:number).limit(2).map{|x| x[:number].to_s}.must_equal %w'39 38'
659
+ @ds1.union(@ds2).limit(2, 1).order(:number).map{|x| x[:number].to_s}.must_equal %w'9 10'
660
+ @ds2.union(@ds1).reverse_order(:number).limit(2, 1).map{|x| x[:number].to_s}.must_equal %w'38 30'
661
+ @ds1.union(@ds2).offset(1).order(:number).map{|x| x[:number].to_s}.must_equal %w'9 10 20 30 38 39'
662
+ @ds2.union(@ds1).reverse_order(:number).offset(1).map{|x| x[:number].to_s}.must_equal %w'38 30 20 10 9 8'
644
663
 
645
664
  @ds1.reverse_order(:number).limit(2).union(@ds2.reverse_order(:number).limit(2)).order(:number).limit(3).map{|x| x[:number].to_s}.must_equal %w'20 30 38'
646
665
  @ds2.order(:number).limit(2).union(@ds1.order(:number).limit(2)).reverse_order(:number).limit(3).map{|x| x[:number].to_s}.must_equal %w'10 9 8'
666
+ @ds1.reverse_order(:number).limit(2, 1).union(@ds2.reverse_order(:number).limit(2, 1)).order(:number).limit(3, 1).map{|x| x[:number].to_s}.must_equal %w'20 30'
667
+ @ds2.order(:number).limit(2, 1).union(@ds1.order(:number).limit(2, 1)).reverse_order(:number).limit(3, 1).map{|x| x[:number].to_s}.must_equal %w'20 10'
668
+ @ds1.reverse_order(:number).offset(1).union(@ds2.reverse_order(:number).offset(1)).order(:number).offset(1).map{|x| x[:number].to_s}.must_equal %w'9 10 20 30'
669
+ @ds2.order(:number).offset(1).union(@ds1.order(:number).offset(1)).reverse_order(:number).offset(1).map{|x| x[:number].to_s}.must_equal %w'38 30 20 10'
647
670
  end
648
671
 
649
672
  it "should give the correct results for compound UNION, EXCEPT, and INTERSECT" do
@@ -1511,7 +1534,7 @@ describe "Sequel::Dataset DSL support" do
1511
1534
  @ds.insert(20, 10)
1512
1535
  @ds.filter(:a=>20, :b=>10).all.must_equal [{:a=>20, :b=>10}]
1513
1536
  @ds.filter([[:a, 20], [:b, 10]]).all.must_equal [{:a=>20, :b=>10}]
1514
- @ds.filter({:a=>20}, {:b=>10}).all.must_equal [{:a=>20, :b=>10}]
1537
+ @ds.filter(Sequel.&({:a=>20}, {:b=>10})).all.must_equal [{:a=>20, :b=>10}]
1515
1538
  @ds.filter(Sequel.|({:a=>20}, {:b=>5})).all.must_equal [{:a=>20, :b=>10}]
1516
1539
  @ds.filter(Sequel.~(:a=>10)).all.must_equal [{:a=>20, :b=>10}]
1517
1540
  end
@@ -86,7 +86,7 @@ describe "Sequel::Model basic support" do
86
86
  i.save.must_be_nil
87
87
  end
88
88
 
89
- it "#should respect after_commit, after_rollback, after_destroy_commit, and after_destroy_rollback hooks" do
89
+ deprecated "#should respect after_commit, after_rollback, after_destroy_commit, and after_destroy_rollback hooks" do
90
90
  i = Item.create(:name=>'J')
91
91
  i.use_transactions = true
92
92
  def i.hooks
@@ -237,7 +237,6 @@ describe "Many Through Many Plugin" do
237
237
  Artist[@artist3.id].albums.map{|x| x.name}.sort.must_equal %w'B C'
238
238
  Artist[@artist4.id].albums.map{|x| x.name}.sort.must_equal %w'B D'
239
239
 
240
- Artist.plugin :prepared_statements_associations
241
240
  Artist[@artist1.id].albums.map{|x| x.name}.sort.must_equal %w'A D'
242
241
  Artist[@artist2.id].albums.map{|x| x.name}.sort.must_equal %w'A C'
243
242
  Artist[@artist3.id].albums.map{|x| x.name}.sort.must_equal %w'B C'
@@ -294,13 +293,12 @@ describe "Many Through Many Plugin" do
294
293
  end
295
294
 
296
295
  it "should handle typical case with 3 join tables" do
297
- Artist.many_through_many :related_artists, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_artists, :album_id, :artist_id]], :class=>Artist, :distinct=>true
296
+ Artist.many_through_many :related_artists, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_artists, :album_id, :artist_id]], :class=>Artist, :distinct=>true, :delay_pks=>false
298
297
  Artist[@artist1.id].related_artists.map{|x| x.name}.sort.must_equal %w'1 2 4'
299
298
  Artist[@artist2.id].related_artists.map{|x| x.name}.sort.must_equal %w'1 2 3'
300
299
  Artist[@artist3.id].related_artists.map{|x| x.name}.sort.must_equal %w'2 3 4'
301
300
  Artist[@artist4.id].related_artists.map{|x| x.name}.sort.must_equal %w'1 3 4'
302
301
 
303
- Artist.plugin :prepared_statements_associations
304
302
  Artist[@artist1.id].related_artists.map{|x| x.name}.sort.must_equal %w'1 2 4'
305
303
  Artist[@artist2.id].related_artists.map{|x| x.name}.sort.must_equal %w'1 2 3'
306
304
  Artist[@artist3.id].related_artists.map{|x| x.name}.sort.must_equal %w'2 3 4'
@@ -366,7 +364,6 @@ describe "Many Through Many Plugin" do
366
364
  Artist[@artist3.id].related_albums.map{|x| x.name}.sort.must_equal %w'A B D'
367
365
  Artist[@artist4.id].related_albums.map{|x| x.name}.sort.must_equal %w'B D'
368
366
 
369
- Artist.plugin :prepared_statements_associations
370
367
  Artist[@artist1.id].related_albums.map{|x| x.name}.sort.must_equal %w'A B C'
371
368
  Artist[@artist2.id].related_albums.map{|x| x.name}.sort.must_equal %w'A B C D'
372
369
  Artist[@artist3.id].related_albums.map{|x| x.name}.sort.must_equal %w'A B D'
@@ -1193,11 +1190,11 @@ describe "AssociationPks plugin" do
1193
1190
  end
1194
1191
  class ::Artist < Sequel::Model
1195
1192
  plugin :association_pks
1196
- one_to_many :albums, :order=>:id
1193
+ one_to_many :albums, :order=>:id, :delay_pks=>false
1197
1194
  end
1198
1195
  class ::Album < Sequel::Model
1199
1196
  plugin :association_pks
1200
- many_to_many :tags, :order=>:id
1197
+ many_to_many :tags, :order=>:id, :delay_pks=>false
1201
1198
  end
1202
1199
  class ::Tag < Sequel::Model
1203
1200
  end
@@ -1293,7 +1290,7 @@ describe "AssociationPks plugin" do
1293
1290
  Vocalist.order(:first, :last).all.map{|a| a.hit_pks.sort}.must_equal [[@h1, @h2, @h3], [@h2], []]
1294
1291
  end
1295
1292
 
1296
- it "should handle :delay association option for new instances" do
1293
+ deprecated "should handle :delay_pks=>true association option for new instances" do
1297
1294
  album_class = Class.new(Album)
1298
1295
  album_class.many_to_many :tags, :clone=>:tags, :delay_pks=>true, :join_table=>:albums_tags, :left_key=>:album_id
1299
1296
  album = album_class.new(:name=>'test album')
@@ -1309,7 +1306,7 @@ describe "AssociationPks plugin" do
1309
1306
  album_class.with_pk!(album.pk).tag_pks.sort.must_equal []
1310
1307
  end
1311
1308
 
1312
- it "should handle :delay=>:all association option for existing instances" do
1309
+ it "should handle :delay_pks=>:always association option for existing instances" do
1313
1310
  album_class = Class.new(Album)
1314
1311
  album_class.many_to_many :tags, :clone=>:tags, :delay_pks=>:always, :join_table=>:albums_tags, :left_key=>:album_id
1315
1312
  album = album_class.with_pk!(@al1)
@@ -1368,7 +1365,7 @@ describe "AssociationPks plugin" do
1368
1365
 
1369
1366
  it "should set associated right-side cpks correctly for a one_to_many association" do
1370
1367
  Album.use_transactions = true
1371
- Album.one_to_many :vocalists, :order=>:first
1368
+ Album.one_to_many :vocalists, :order=>:first, :delay_pks=>false
1372
1369
  Album.order(:id).all.map{|a| a.vocalist_pks.sort}.must_equal [[@v1, @v2, @v3], [], []]
1373
1370
 
1374
1371
  Album[@al2].vocalist_pks = [@v1, @v3]
@@ -1389,7 +1386,7 @@ describe "AssociationPks plugin" do
1389
1386
 
1390
1387
  it "should set associated right-side cpks correctly for a many_to_many association" do
1391
1388
  Album.use_transactions = true
1392
- Album.many_to_many :vocalists, :join_table=>:albums_vocalists, :right_key=>[:first, :last], :order=>:first
1389
+ Album.many_to_many :vocalists, :join_table=>:albums_vocalists, :right_key=>[:first, :last], :order=>:first, :delay_pks=>false
1393
1390
 
1394
1391
  @db[:albums_vocalists].filter(:album_id=>@al1).select_order_map([:first, :last]).must_equal [@v1, @v2, @v3]
1395
1392
  Album[@al1].vocalist_pks = [@v1, @v3]
@@ -1412,7 +1409,7 @@ describe "AssociationPks plugin" do
1412
1409
 
1413
1410
  it "should set associated pks correctly with left-side cpks for a one_to_many association" do
1414
1411
  Vocalist.use_transactions = true
1415
- Vocalist.one_to_many :instruments, :key=>[:first, :last], :order=>:id
1412
+ Vocalist.one_to_many :instruments, :key=>[:first, :last], :order=>:id, :delay_pks=>false
1416
1413
  Vocalist.order(:first, :last).all.map{|a| a.instrument_pks.sort}.must_equal [[@i1, @i2, @i3], [], []]
1417
1414
 
1418
1415
  Vocalist[@v2].instrument_pks = [@i1, @i3]
@@ -1433,7 +1430,7 @@ describe "AssociationPks plugin" do
1433
1430
 
1434
1431
  it "should set associated pks correctly with left-side cpks for a many_to_many association" do
1435
1432
  Vocalist.use_transactions = true
1436
- Vocalist.many_to_many :instruments, :join_table=>:vocalists_instruments, :left_key=>[:first, :last], :order=>:id
1433
+ Vocalist.many_to_many :instruments, :join_table=>:vocalists_instruments, :left_key=>[:first, :last], :order=>:id, :delay_pks=>false
1437
1434
 
1438
1435
  @db[:vocalists_instruments].filter([:first, :last]=>[@v1]).select_order_map(:instrument_id).must_equal [@i1, @i2, @i3]
1439
1436
  Vocalist[@v1].instrument_pks = [@i1, @i3]
@@ -1456,7 +1453,7 @@ describe "AssociationPks plugin" do
1456
1453
 
1457
1454
  it "should set associated right-side cpks correctly with left-side cpks for a one_to_many association" do
1458
1455
  Vocalist.use_transactions = true
1459
- Vocalist.one_to_many :hits, :key=>[:first, :last], :order=>:week
1456
+ Vocalist.one_to_many :hits, :key=>[:first, :last], :order=>:week, :delay_pks=>false
1460
1457
  Vocalist.order(:first, :last).all.map{|a| a.hit_pks.sort}.must_equal [[@h1, @h2, @h3], [], []]
1461
1458
 
1462
1459
  Vocalist[@v2].hit_pks = [@h1, @h3]
@@ -1477,7 +1474,7 @@ describe "AssociationPks plugin" do
1477
1474
 
1478
1475
  it "should set associated right-side cpks correctly with left-side cpks for a many_to_many association" do
1479
1476
  Vocalist.use_transactions = true
1480
- Vocalist.many_to_many :hits, :join_table=>:vocalists_hits, :left_key=>[:first, :last], :right_key=>[:year, :week], :order=>:week
1477
+ Vocalist.many_to_many :hits, :join_table=>:vocalists_hits, :left_key=>[:first, :last], :right_key=>[:year, :week], :order=>:week, :delay_pks=>false
1481
1478
 
1482
1479
  @db[:vocalists_hits].filter([:first, :last]=>[@v1]).select_order_map([:year, :week]).must_equal [@h1, @h2, @h3]
1483
1480
  Vocalist[@v1].hit_pks = [@h1, @h3]
@@ -1819,7 +1816,6 @@ describe "Sequel::Plugins::PreparedStatements" do
1819
1816
  Integer :i
1820
1817
  end
1821
1818
  @c = Class.new(Sequel::Model(@db[:ps_test]))
1822
- @c.plugin :prepared_statements_with_pk
1823
1819
  end
1824
1820
  before do
1825
1821
  @c.dataset.delete
@@ -1895,7 +1891,6 @@ describe "Sequel::Plugins::PreparedStatements with schema changes" do
1895
1891
  @c.one_to_many :ps_tests, :key=>:id, :class=>@c
1896
1892
  @c.many_to_many :mps_tests, :left_key=>:id, :right_key=>:id, :class=>@c, :join_table=>Sequel[:ps_test].as(:x)
1897
1893
  @c.plugin :prepared_statements
1898
- @c.plugin :prepared_statements_associations
1899
1894
  end
1900
1895
  after do
1901
1896
  @db.drop_table?(:ps_test)
@@ -396,20 +396,22 @@ end
396
396
 
397
397
  describe "Dataset#unbind" do
398
398
  before do
399
- @ds = ds = DB[:items]
400
- @ct = proc do |t, v|
401
- DB.create_table!(:items) do
402
- column :c, t
399
+ deprecated do
400
+ @ds = ds = DB[:items]
401
+ @ct = proc do |t, v|
402
+ DB.create_table!(:items) do
403
+ column :c, t
404
+ end
405
+ ds.insert(:c=>v)
403
406
  end
404
- ds.insert(:c=>v)
407
+ @u = proc{|ds1| ds2, bv = ds1.unbind; ds2.call(:first, bv)}
405
408
  end
406
- @u = proc{|ds1| ds2, bv = ds1.unbind; ds2.call(:first, bv)}
407
409
  end
408
410
  after do
409
411
  DB.drop_table?(:items)
410
412
  end
411
413
 
412
- it "should unbind values assigned to equality and inequality statements" do
414
+ deprecated "should unbind values assigned to equality and inequality statements" do
413
415
  @ct[Integer, 10]
414
416
  @u[@ds.filter(:c=>10)].must_equal(:c=>10)
415
417
  @u[@ds.exclude(:c=>10)].must_be_nil
@@ -420,46 +422,52 @@ describe "Dataset#unbind" do
420
422
  end
421
423
 
422
424
  cspecify "should handle numerics and strings", [:odbc], [:swift, :sqlite] do
423
- @ct[Integer, 10]
424
- @u[@ds.filter(:c=>10)].must_equal(:c=>10)
425
- @ct[Float, 0.0]
426
- @u[@ds.filter{c < 1}].must_equal(:c=>0.0)
427
- @ct[String, 'foo']
428
- @u[@ds.filter(:c=>'foo')].must_equal(:c=>'foo')
425
+ deprecated do
426
+ @ct[Integer, 10]
427
+ @u[@ds.filter(:c=>10)].must_equal(:c=>10)
428
+ @ct[Float, 0.0]
429
+ @u[@ds.filter{c < 1}].must_equal(:c=>0.0)
430
+ @ct[String, 'foo']
431
+ @u[@ds.filter(:c=>'foo')].must_equal(:c=>'foo')
429
432
 
430
- DB.create_table!(:items) do
431
- BigDecimal :c, :size=>[15,2]
433
+ DB.create_table!(:items) do
434
+ BigDecimal :c, :size=>[15,2]
435
+ end
436
+ @ds.insert(:c=>BigDecimal.new('1.1'))
437
+ @u[@ds.filter{c > 0}].must_equal(:c=>BigDecimal.new('1.1'))
432
438
  end
433
- @ds.insert(:c=>BigDecimal.new('1.1'))
434
- @u[@ds.filter{c > 0}].must_equal(:c=>BigDecimal.new('1.1'))
435
439
  end
436
440
 
437
441
  cspecify "should handle dates and times", [:do], [:jdbc, :mssql], [:jdbc, :sqlite], [:swift], [:tinytds], :oracle do
438
- @ct[Date, Date.today]
439
- @u[@ds.filter(:c=>Date.today)].must_equal(:c=>Date.today)
440
- t = Time.now
441
- @ct[Time, t]
442
- @u[@ds.filter{c < t + 1}][:c].to_i.must_equal t.to_i
442
+ deprecated do
443
+ @ct[Date, Date.today]
444
+ @u[@ds.filter(:c=>Date.today)].must_equal(:c=>Date.today)
445
+ t = Time.now
446
+ @ct[Time, t]
447
+ @u[@ds.filter{c < t + 1}][:c].to_i.must_equal t.to_i
448
+ end
443
449
  end
444
450
 
445
- it "should handle QualifiedIdentifiers" do
451
+ deprecated "should handle QualifiedIdentifiers" do
446
452
  @ct[Integer, 10]
447
453
  @u[@ds.filter{items[:c] > 1}].must_equal(:c=>10)
448
454
  end
449
455
 
450
456
  cspecify "should handle deep nesting", :h2 do
451
- DB.create_table!(:items) do
452
- Integer :a
453
- Integer :b
454
- Integer :c
455
- Integer :d
457
+ deprecated do
458
+ DB.create_table!(:items) do
459
+ Integer :a
460
+ Integer :b
461
+ Integer :c
462
+ Integer :d
463
+ end
464
+ @ds.insert(:a=>2, :b=>0, :c=>3, :d=>5)
465
+ @u[@ds.filter{a > 1}.and{b < 2}.or(:c=>3).and(Sequel.case({~Sequel.expr(:d=>4)=>1}, 0) => 1)].must_equal(:a=>2, :b=>0, :c=>3, :d=>5)
466
+ @u[@ds.filter{a > 1}.and{b < 2}.or(:c=>3).and(Sequel.case({~Sequel.expr(:d=>5)=>1}, 0) => 1)].must_be_nil
456
467
  end
457
- @ds.insert(:a=>2, :b=>0, :c=>3, :d=>5)
458
- @u[@ds.filter{a > 1}.and{b < 2}.or(:c=>3).and(Sequel.case({~Sequel.expr(:d=>4)=>1}, 0) => 1)].must_equal(:a=>2, :b=>0, :c=>3, :d=>5)
459
- @u[@ds.filter{a > 1}.and{b < 2}.or(:c=>3).and(Sequel.case({~Sequel.expr(:d=>5)=>1}, 0) => 1)].must_be_nil
460
468
  end
461
469
 
462
- it "should handle case where the same variable has the same value in multiple places " do
470
+ deprecated "should handle case where the same variable has the same value in multiple places " do
463
471
  @ct[Integer, 1]
464
472
  @u[@ds.filter{c > 1}.or{c < 1}.invert].must_equal(:c=>1)
465
473
  @u[@ds.filter{c > 1}.or{c < 1}].must_be_nil
@@ -20,22 +20,19 @@ Sequel::Deprecation.backtrace_filter = lambda{|line, lineno| lineno < 4 || line
20
20
  Sequel.split_symbols = false if ENV['SEQUEL_NO_SPLIT_SYMBOLS']
21
21
  Sequel::Database.extension :columns_introspection if ENV['SEQUEL_COLUMNS_INTROSPECTION']
22
22
  Sequel::Model.cache_associations = false if ENV['SEQUEL_NO_CACHE_ASSOCIATIONS']
23
- if ENV['SEQUEL_MODEL_PREPARED_STATEMENTS']
24
- Sequel::Model.plugin :prepared_statements
25
- Sequel::Model.plugin :prepared_statements_associations
26
- end
23
+ Sequel::Model.plugin :prepared_statements if ENV['SEQUEL_MODEL_PREPARED_STATEMENTS']
27
24
  Sequel::Model.use_transactions = false
28
- Sequel.cache_anonymous_models = false
25
+ Sequel::Model.cache_anonymous_models = false
29
26
 
30
27
  require './spec/guards_helper'
31
28
 
32
29
  IDENTIFIER_MANGLING = !ENV['SEQUEL_NO_MANGLE'] unless defined?(IDENTIFIER_MANGLING)
33
30
 
34
31
  unless defined?(DB)
35
- opts = {}
36
- opts[:identifier_mangling] = false unless IDENTIFIER_MANGLING
37
- DB = Sequel.connect(ENV['SEQUEL_INTEGRATION_URL'], opts)
32
+ # SEQUEL5: Remove :identifier_mangling=>false
33
+ DB = Sequel.connect(ENV['SEQUEL_INTEGRATION_URL'], :identifier_mangling=>false)
38
34
  DB.extension(:freeze_datasets) if ENV['SEQUEL_FREEZE_DATASETS']
35
+ DB.extension(:identifier_mangling) if IDENTIFIER_MANGLING
39
36
  end
40
37
 
41
38
  if DB.adapter_scheme == :ibmdb || (DB.adapter_scheme == :ado && DB.database_type == :access)