sequel 4.45.0 → 4.46.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (173) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +108 -0
  3. data/doc/release_notes/4.46.0.txt +404 -0
  4. data/doc/security.rdoc +9 -0
  5. data/doc/sql.rdoc +2 -2
  6. data/doc/testing.rdoc +1 -1
  7. data/doc/validations.rdoc +1 -2
  8. data/lib/sequel/adapters/ado.rb +8 -3
  9. data/lib/sequel/adapters/ado/access.rb +8 -4
  10. data/lib/sequel/adapters/ado/mssql.rb +3 -1
  11. data/lib/sequel/adapters/amalgalite.rb +5 -0
  12. data/lib/sequel/adapters/cubrid.rb +16 -7
  13. data/lib/sequel/adapters/do.rb +7 -1
  14. data/lib/sequel/adapters/do/mysql.rb +8 -4
  15. data/lib/sequel/adapters/ibmdb.rb +10 -5
  16. data/lib/sequel/adapters/jdbc.rb +8 -2
  17. data/lib/sequel/adapters/jdbc/as400.rb +10 -3
  18. data/lib/sequel/adapters/jdbc/db2.rb +27 -16
  19. data/lib/sequel/adapters/jdbc/derby.rb +47 -20
  20. data/lib/sequel/adapters/jdbc/h2.rb +13 -7
  21. data/lib/sequel/adapters/jdbc/hsqldb.rb +18 -9
  22. data/lib/sequel/adapters/jdbc/mssql.rb +5 -2
  23. data/lib/sequel/adapters/jdbc/mysql.rb +3 -2
  24. data/lib/sequel/adapters/jdbc/oracle.rb +3 -2
  25. data/lib/sequel/adapters/jdbc/postgresql.rb +4 -3
  26. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +2 -1
  27. data/lib/sequel/adapters/jdbc/sqlite.rb +10 -3
  28. data/lib/sequel/adapters/jdbc/sqlserver.rb +23 -0
  29. data/lib/sequel/adapters/jdbc/transactions.rb +16 -10
  30. data/lib/sequel/adapters/mock.rb +5 -0
  31. data/lib/sequel/adapters/mysql.rb +8 -1
  32. data/lib/sequel/adapters/mysql2.rb +6 -1
  33. data/lib/sequel/adapters/odbc.rb +20 -8
  34. data/lib/sequel/adapters/odbc/mssql.rb +6 -3
  35. data/lib/sequel/adapters/oracle.rb +12 -6
  36. data/lib/sequel/adapters/postgres.rb +20 -8
  37. data/lib/sequel/adapters/shared/access.rb +76 -47
  38. data/lib/sequel/adapters/shared/cubrid.rb +16 -11
  39. data/lib/sequel/adapters/shared/db2.rb +46 -19
  40. data/lib/sequel/adapters/shared/firebird.rb +20 -8
  41. data/lib/sequel/adapters/shared/informix.rb +6 -3
  42. data/lib/sequel/adapters/shared/mssql.rb +132 -72
  43. data/lib/sequel/adapters/shared/mysql.rb +112 -65
  44. data/lib/sequel/adapters/shared/oracle.rb +36 -21
  45. data/lib/sequel/adapters/shared/postgres.rb +91 -56
  46. data/lib/sequel/adapters/shared/sqlanywhere.rb +65 -37
  47. data/lib/sequel/adapters/shared/sqlite.rb +67 -32
  48. data/lib/sequel/adapters/sqlanywhere.rb +9 -1
  49. data/lib/sequel/adapters/sqlite.rb +8 -1
  50. data/lib/sequel/adapters/swift.rb +5 -0
  51. data/lib/sequel/adapters/swift/mysql.rb +4 -2
  52. data/lib/sequel/adapters/swift/sqlite.rb +1 -1
  53. data/lib/sequel/adapters/tinytds.rb +10 -3
  54. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +1 -1
  55. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
  56. data/lib/sequel/adapters/utils/mysql_mysql2.rb +1 -0
  57. data/lib/sequel/adapters/utils/pg_types.rb +14 -6
  58. data/lib/sequel/adapters/utils/replace.rb +4 -2
  59. data/lib/sequel/connection_pool/single.rb +2 -2
  60. data/lib/sequel/core.rb +24 -11
  61. data/lib/sequel/database/connecting.rb +9 -3
  62. data/lib/sequel/database/dataset_defaults.rb +7 -1
  63. data/lib/sequel/database/logging.rb +1 -0
  64. data/lib/sequel/database/misc.rb +5 -2
  65. data/lib/sequel/database/query.rb +7 -5
  66. data/lib/sequel/database/schema_generator.rb +1 -0
  67. data/lib/sequel/database/schema_methods.rb +50 -27
  68. data/lib/sequel/database/transactions.rb +19 -9
  69. data/lib/sequel/dataset/actions.rb +15 -6
  70. data/lib/sequel/dataset/graph.rb +15 -5
  71. data/lib/sequel/dataset/misc.rb +12 -4
  72. data/lib/sequel/dataset/mutation.rb +17 -8
  73. data/lib/sequel/dataset/prepared_statements.rb +3 -2
  74. data/lib/sequel/dataset/query.rb +84 -38
  75. data/lib/sequel/dataset/sql.rb +302 -191
  76. data/lib/sequel/deprecated.rb +26 -17
  77. data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +2 -2
  78. data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
  79. data/lib/sequel/extensions/from_block.rb +1 -0
  80. data/lib/sequel/extensions/graph_each.rb +1 -1
  81. data/lib/sequel/extensions/identifier_mangling.rb +2 -2
  82. data/lib/sequel/extensions/migration.rb +28 -4
  83. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -0
  84. data/lib/sequel/extensions/schema_dumper.rb +4 -4
  85. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +5 -3
  86. data/lib/sequel/extensions/set_overrides.rb +2 -0
  87. data/lib/sequel/extensions/split_array_nil.rb +2 -2
  88. data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
  89. data/lib/sequel/model.rb +11 -7
  90. data/lib/sequel/model/associations.rb +5 -7
  91. data/lib/sequel/model/base.rb +47 -45
  92. data/lib/sequel/model/dataset_module.rb +9 -14
  93. data/lib/sequel/model/plugins.rb +3 -0
  94. data/lib/sequel/no_core_ext.rb +1 -0
  95. data/lib/sequel/plugins/blacklist_security.rb +1 -1
  96. data/lib/sequel/plugins/boolean_subsets.rb +7 -5
  97. data/lib/sequel/plugins/class_table_inheritance.rb +47 -10
  98. data/lib/sequel/plugins/dataset_associations.rb +1 -1
  99. data/lib/sequel/plugins/def_dataset_method.rb +90 -0
  100. data/lib/sequel/plugins/finder.rb +240 -0
  101. data/lib/sequel/plugins/inverted_subsets.rb +19 -12
  102. data/lib/sequel/plugins/many_through_many.rb +1 -1
  103. data/lib/sequel/plugins/nested_attributes.rb +1 -1
  104. data/lib/sequel/plugins/schema.rb +1 -1
  105. data/lib/sequel/plugins/single_table_inheritance.rb +7 -1
  106. data/lib/sequel/plugins/subset_conditions.rb +11 -3
  107. data/lib/sequel/plugins/whitelist_security.rb +118 -0
  108. data/lib/sequel/sql.rb +80 -36
  109. data/lib/sequel/timezones.rb +2 -0
  110. data/lib/sequel/version.rb +1 -1
  111. data/spec/adapters/mssql_spec.rb +20 -0
  112. data/spec/adapters/mysql_spec.rb +1 -1
  113. data/spec/adapters/oracle_spec.rb +12 -8
  114. data/spec/adapters/postgres_spec.rb +1 -1
  115. data/spec/adapters/spec_helper.rb +1 -1
  116. data/spec/adapters/sqlite_spec.rb +36 -34
  117. data/spec/core/connection_pool_spec.rb +2 -1
  118. data/spec/core/database_spec.rb +87 -9
  119. data/spec/core/dataset_spec.rb +501 -129
  120. data/spec/core/deprecated_spec.rb +1 -1
  121. data/spec/core/expression_filters_spec.rb +146 -60
  122. data/spec/core/mock_adapter_spec.rb +1 -1
  123. data/spec/core/object_graph_spec.rb +61 -9
  124. data/spec/core/placeholder_literalizer_spec.rb +20 -2
  125. data/spec/core/schema_generator_spec.rb +6 -6
  126. data/spec/core/schema_spec.rb +54 -5
  127. data/spec/core_extensions_spec.rb +122 -18
  128. data/spec/deprecation_helper.rb +27 -2
  129. data/spec/extensions/_deprecated_identifier_mangling_spec.rb +6 -6
  130. data/spec/extensions/association_proxies_spec.rb +2 -2
  131. data/spec/extensions/auto_literal_strings_spec.rb +212 -0
  132. data/spec/extensions/blacklist_security_spec.rb +1 -0
  133. data/spec/extensions/class_table_inheritance_spec.rb +1037 -39
  134. data/spec/extensions/column_select_spec.rb +20 -8
  135. data/spec/extensions/columns_introspection_spec.rb +3 -3
  136. data/spec/extensions/core_refinements_spec.rb +29 -12
  137. data/spec/extensions/dataset_associations_spec.rb +12 -12
  138. data/spec/extensions/def_dataset_method_spec.rb +100 -0
  139. data/spec/extensions/error_sql_spec.rb +1 -1
  140. data/spec/extensions/finder_spec.rb +260 -0
  141. data/spec/extensions/graph_each_spec.rb +2 -2
  142. data/spec/extensions/identifier_mangling_spec.rb +14 -8
  143. data/spec/extensions/inverted_subsets_spec.rb +4 -4
  144. data/spec/extensions/lazy_attributes_spec.rb +7 -0
  145. data/spec/extensions/many_through_many_spec.rb +38 -14
  146. data/spec/extensions/nested_attributes_spec.rb +18 -6
  147. data/spec/extensions/no_auto_literal_strings_spec.rb +1 -1
  148. data/spec/extensions/pg_enum_spec.rb +16 -1
  149. data/spec/extensions/pg_interval_spec.rb +11 -2
  150. data/spec/extensions/pg_loose_count_spec.rb +5 -0
  151. data/spec/extensions/pg_row_spec.rb +25 -0
  152. data/spec/extensions/prepared_statements_spec.rb +10 -1
  153. data/spec/extensions/query_spec.rb +2 -2
  154. data/spec/extensions/schema_dumper_spec.rb +2 -2
  155. data/spec/extensions/schema_spec.rb +2 -2
  156. data/spec/extensions/set_overrides_spec.rb +7 -3
  157. data/spec/extensions/sql_expr_spec.rb +0 -1
  158. data/spec/extensions/subset_conditions_spec.rb +6 -6
  159. data/spec/extensions/table_select_spec.rb +24 -12
  160. data/spec/extensions/to_dot_spec.rb +4 -4
  161. data/spec/extensions/whitelist_security_spec.rb +131 -0
  162. data/spec/integration/dataset_test.rb +9 -5
  163. data/spec/integration/model_test.rb +2 -0
  164. data/spec/integration/plugin_test.rb +2 -2
  165. data/spec/integration/spec_helper.rb +1 -1
  166. data/spec/model/associations_spec.rb +39 -11
  167. data/spec/model/base_spec.rb +44 -24
  168. data/spec/model/class_dataset_methods_spec.rb +18 -16
  169. data/spec/model/dataset_methods_spec.rb +4 -4
  170. data/spec/model/eager_loading_spec.rb +84 -24
  171. data/spec/model/model_spec.rb +97 -63
  172. data/spec/model/record_spec.rb +21 -13
  173. metadata +13 -2
@@ -185,8 +185,10 @@ end
185
185
  describe "Sequel::Model.freeze" do
186
186
  it "should freeze the model class and not allow any changes" do
187
187
  model = Class.new(Sequel::Model(:items))
188
- model.set_allowed_columns [:id]
189
- model.finder(:name=>:f_by_name){|pl, ds| ds.where(:name=>pl.arg).limit(1)}
188
+ deprecated do
189
+ model.set_allowed_columns [:id]
190
+ model.finder(:name=>:f_by_name){|pl, ds| ds.where(:name=>pl.arg).limit(1)}
191
+ end
190
192
  model.freeze
191
193
  model.f_by_name(1)
192
194
 
@@ -200,7 +202,10 @@ describe "Sequel::Model.freeze" do
200
202
  model.default_set_fields_options.frozen?.must_equal true
201
203
 
202
204
  proc{model.dataset_module{}}.must_raise RuntimeError, TypeError
203
- proc{model.finder(:name=>:first_by_name){|pl, ds| ds.where(:name=>pl.arg).limit(1)}}.must_raise RuntimeError, TypeError
205
+ deprecated do
206
+ model.allowed_columns.frozen?.must_equal true
207
+ proc{model.finder(:name=>:first_by_name){|pl, ds| ds.where(:name=>pl.arg).limit(1)}}.must_raise RuntimeError, TypeError
208
+ end
204
209
  end
205
210
 
206
211
  it "should freeze a model class without a dataset without breaking" do
@@ -215,7 +220,9 @@ describe "Sequel::Model.freeze" do
215
220
  model.default_set_fields_options.frozen?.must_equal true
216
221
 
217
222
  proc{model.dataset_module{}}.must_raise RuntimeError, TypeError
218
- proc{model.finder(:name=>:first_by_name){|pl, ds| ds.where(:name=>pl.arg).limit(1)}}.must_raise RuntimeError, TypeError
223
+ deprecated do
224
+ proc{model.finder(:name=>:first_by_name){|pl, ds| ds.where(:name=>pl.arg).limit(1)}}.must_raise RuntimeError, TypeError
225
+ end
219
226
  end
220
227
 
221
228
  it "should allow subclasses of frozen model classes to work correctly" do
@@ -226,7 +233,9 @@ describe "Sequel::Model.freeze" do
226
233
 
227
234
  model.dataset_module{}
228
235
  model.plugin Module.new
229
- model.finder(:name=>:first_by_name){|pl, ds| ds.where(:name=>pl.arg).limit(1)}
236
+ deprecated do
237
+ model.finder(:name=>:first_by_name){|pl, ds| ds.where(:name=>pl.arg).limit(1)}
238
+ end
230
239
  model.first_by_name('a').values.must_equal(:id=>1, :x=>1)
231
240
  model.dataset.frozen?.must_equal false
232
241
 
@@ -304,37 +313,13 @@ describe Sequel::Model do
304
313
  @model.dataset.sql.must_equal 'SELECT * FROM foo'
305
314
  end
306
315
 
307
- it "allows set_dataset to accept a Symbol" do
308
- @model.db = DB
309
- @model.set_dataset(:foo)
310
- @model.table_name.must_equal :foo
311
- end
312
-
313
- it "allows set_dataset to accept a LiteralString" do
314
- @model.db = DB
315
- @model.set_dataset(Sequel.lit('foo'))
316
- @model.table_name.must_equal Sequel.lit('foo')
317
- end
318
-
319
- it "allows set_dataset to acceptan SQL::Identifier" do
320
- @model.db = DB
321
- @model.set_dataset(Sequel.identifier(:foo))
322
- @model.table_name.must_equal Sequel.identifier(:foo)
323
- end
324
-
325
- it "allows set_dataset to acceptan SQL::QualifiedIdentifier" do
326
- @model.db = DB
327
- @model.set_dataset(Sequel.qualify(:bar, :foo))
328
- @model.table_name.must_equal Sequel.qualify(:bar, :foo)
329
- end
330
-
331
- it "allows set_dataset to acceptan SQL::AliasedExpression" do
332
- @model.db = DB
333
- @model.set_dataset(Sequel.as(:foo, :bar))
334
- @model.table_name.must_equal :bar
335
- end
336
316
 
337
317
  it "table_name should respect table aliases" do
318
+ @model.set_dataset(Sequel[:foo].as(:x))
319
+ @model.table_name.must_equal :x
320
+ end
321
+
322
+ with_symbol_splitting "table_name should respect table alias symbols" do
338
323
  @model.set_dataset(:foo___x)
339
324
  @model.table_name.must_equal :x
340
325
  end
@@ -365,12 +350,12 @@ describe Sequel::Model do
365
350
 
366
351
  it "should raise an error on set_dataset if there is an error connecting to the database" do
367
352
  def @model.columns() raise Sequel::DatabaseConnectionError end
368
- proc{@model.set_dataset(Sequel::Database.new[:foo].join(:blah))}.must_raise Sequel::DatabaseConnectionError
353
+ proc{@model.set_dataset(Sequel::Database.new[:foo].join(:blah).from_self)}.must_raise Sequel::DatabaseConnectionError
369
354
  end
370
355
 
371
356
  it "should not raise an error if there is a problem getting the columns for a dataset" do
372
357
  def @model.columns() raise Sequel::Error end
373
- @model.set_dataset(DB[:foo].join(:blah))
358
+ @model.set_dataset(DB[:foo].join(:blah).from_self)
374
359
  end
375
360
 
376
361
  it "doesn't raise an error on set_dataset if there is an error raised getting the schema" do
@@ -388,7 +373,7 @@ describe Sequel::Model do
388
373
  it "doesn't raise an error on inherited if there is an error setting the dataset" do
389
374
  db = Sequel.mock
390
375
  def db.schema(*) raise Sequel::Error; end
391
- @model.db = db
376
+ @model.dataset = db[:foo]
392
377
  Class.new(@model)
393
378
  end
394
379
 
@@ -421,6 +406,38 @@ describe Sequel::Model do
421
406
  end
422
407
  end
423
408
 
409
+ describe Sequel::Model do
410
+ before do
411
+ @model = Class.new(Sequel::Model)
412
+ DB.reset
413
+ end
414
+
415
+ it "allows set_dataset to accept a Symbol" do
416
+ @model.set_dataset(:foo)
417
+ @model.table_name.must_equal :foo
418
+ end
419
+
420
+ it "allows set_dataset to accept a LiteralString" do
421
+ @model.set_dataset(Sequel.lit('foo'))
422
+ @model.table_name.must_equal Sequel.lit('foo')
423
+ end
424
+
425
+ it "allows set_dataset to acceptan SQL::Identifier" do
426
+ @model.set_dataset(Sequel.identifier(:foo))
427
+ @model.table_name.must_equal Sequel.identifier(:foo)
428
+ end
429
+
430
+ it "allows set_dataset to acceptan SQL::QualifiedIdentifier" do
431
+ @model.set_dataset(Sequel.qualify(:bar, :foo))
432
+ @model.table_name.must_equal Sequel.qualify(:bar, :foo)
433
+ end
434
+
435
+ it "allows set_dataset to acceptan SQL::AliasedExpression" do
436
+ @model.set_dataset(Sequel.as(:foo, :bar))
437
+ @model.table_name.must_equal :bar
438
+ end
439
+ end
440
+
424
441
  describe Sequel::Model, ".require_valid_table = true" do
425
442
  before do
426
443
  @db = Sequel.mock
@@ -556,7 +573,7 @@ describe Sequel::Model, ".subset" do
556
573
  DB.reset
557
574
  end
558
575
 
559
- it "should create a filter on the underlying dataset" do
576
+ deprecated "should create a filter on the underlying dataset" do
560
577
  proc {@c.new_only}.must_raise(NoMethodError)
561
578
 
562
579
  @c.subset(:new_only){age < 'new'}
@@ -573,7 +590,7 @@ describe Sequel::Model, ".subset" do
573
590
  @c.new_only.pricey.sql.must_equal "SELECT * FROM items WHERE ((age < 'new') AND (price > 100))"
574
591
  end
575
592
 
576
- it "should not override existing model methods" do
593
+ deprecated "should not override existing model methods" do
577
594
  def @c.active() true end
578
595
  @c.subset(:active, :active)
579
596
  @c.active.must_equal true
@@ -604,6 +621,17 @@ describe Sequel::Model, ".find" do
604
621
  end
605
622
  end
606
623
 
624
+ describe Sequel::Model, ".first_where" do
625
+ deprecated "should take a condition and do a lookup" do
626
+ db = Sequel.mock(:fetch=>[])
627
+ c = Class.new(Sequel::Model(db[:items]))
628
+ db.sqls
629
+ c.first_where(:a)
630
+ db.sqls.must_equal ['SELECT * FROM items WHERE a LIMIT 1']
631
+ proc{c.first_where(1)}.must_raise Sequel::Error
632
+ end
633
+ end
634
+
607
635
  describe Sequel::Model, ".finder" do
608
636
  before do
609
637
  @h = {:id=>1}
@@ -618,14 +646,14 @@ describe Sequel::Model, ".finder" do
618
646
  @db.sqls
619
647
  end
620
648
 
621
- it "should create a method that calls the method given and returns the first instance" do
649
+ deprecated "should create a method that calls the method given and returns the first instance" do
622
650
  @c.finder :foo
623
651
  @c.first_foo(1, 2).must_equal @o
624
652
  @c.first_foo(3, 4).must_equal @o
625
653
  @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4 LIMIT 1"]
626
654
  end
627
655
 
628
- it "should work correctly when subclassing" do
656
+ deprecated "should work correctly when subclassing" do
629
657
  @c.finder(:foo)
630
658
  @sc = Class.new(@c)
631
659
  @sc.set_dataset :foos
@@ -635,7 +663,7 @@ describe Sequel::Model, ".finder" do
635
663
  @db.sqls.must_equal ["SELECT * FROM foos WHERE (bar = 1) ORDER BY 2 LIMIT 1", "SELECT * FROM foos WHERE (bar = 3) ORDER BY 4 LIMIT 1"]
636
664
  end
637
665
 
638
- it "should work correctly when dataset is modified" do
666
+ deprecated "should work correctly when dataset is modified" do
639
667
  @c.finder(:foo)
640
668
  @c.first_foo(1, 2).must_equal @o
641
669
  @c.set_dataset :foos
@@ -643,21 +671,21 @@ describe Sequel::Model, ".finder" do
643
671
  @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1", "SELECT * FROM foos LIMIT 1", "SELECT * FROM foos WHERE (bar = 3) ORDER BY 4 LIMIT 1"]
644
672
  end
645
673
 
646
- it "should create a method based on the given block if no method symbol provided" do
674
+ deprecated "should create a method based on the given block if no method symbol provided" do
647
675
  @c.finder(:name=>:first_foo){|pl, ds| ds.where(pl.arg).limit(1)}
648
676
  @c.first_foo(:id=>1).must_equal @o
649
677
  @db.sqls.must_equal ["SELECT * FROM items WHERE (id = 1) LIMIT 1"]
650
678
  end
651
679
 
652
- it "should raise an error if both a block and method symbol given" do
680
+ deprecated "should raise an error if both a block and method symbol given" do
653
681
  proc{@c.finder(:foo, :name=>:first_foo){|pl, ds| ds.where(pl.arg)}}.must_raise(Sequel::Error)
654
682
  end
655
683
 
656
- it "should raise an error if two option hashes are provided" do
684
+ deprecated "should raise an error if two option hashes are provided" do
657
685
  proc{@c.finder({:name2=>:foo}, :name=>:first_foo){|pl, ds| ds.where(pl.arg)}}.must_raise(Sequel::Error)
658
686
  end
659
687
 
660
- it "should support :type option" do
688
+ deprecated "should support :type option" do
661
689
  @c.finder :foo, :type=>:all
662
690
  @c.finder :foo, :type=>:each
663
691
  @c.finder :foo, :type=>:get
@@ -675,14 +703,14 @@ describe Sequel::Model, ".finder" do
675
703
  @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4", "SELECT * FROM items WHERE (bar = 5) ORDER BY 6 LIMIT 1"]
676
704
  end
677
705
 
678
- it "should support :name option" do
706
+ deprecated "should support :name option" do
679
707
  @c.finder :foo, :name=>:find_foo
680
708
  @c.find_foo(1, 2).must_equal @o
681
709
  @c.find_foo(3, 4).must_equal @o
682
710
  @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4 LIMIT 1"]
683
711
  end
684
712
 
685
- it "should support :arity option" do
713
+ deprecated "should support :arity option" do
686
714
  def @c.foobar(*b)
687
715
  ds = dataset
688
716
  b.each_with_index do |a, i|
@@ -697,7 +725,7 @@ describe Sequel::Model, ".finder" do
697
725
  @db.sqls.must_equal ["SELECT * FROM items WHERE (0 = a) LIMIT 1", "SELECT * FROM items WHERE ((0 = a) AND (1 = b)) LIMIT 1"]
698
726
  end
699
727
 
700
- it "should support :mod option" do
728
+ deprecated "should support :mod option" do
701
729
  m = Module.new
702
730
  @c.finder :foo, :mod=>m
703
731
  proc{@c.first_foo}.must_raise NoMethodError
@@ -707,7 +735,7 @@ describe Sequel::Model, ".finder" do
707
735
  @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4 LIMIT 1"]
708
736
  end
709
737
 
710
- it "should raise error when calling with the wrong arity" do
738
+ deprecated "should raise error when calling with the wrong arity" do
711
739
  @c.finder :foo
712
740
  proc{@c.first_foo(1)}.must_raise Sequel::Error
713
741
  proc{@c.first_foo(1,2,3)}.must_raise Sequel::Error
@@ -735,14 +763,14 @@ describe Sequel::Model, ".prepared_finder" do
735
763
  @db.sqls
736
764
  end
737
765
 
738
- it "should create a method that calls the method given and returns the first instance" do
766
+ deprecated "should create a method that calls the method given and returns the first instance" do
739
767
  @c.prepared_finder :foo
740
768
  @c.first_foo(1, 2).must_equal @o
741
769
  @c.first_foo(3, 4).must_equal @o
742
770
  @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1 -- prepared", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4 LIMIT 1 -- prepared"]
743
771
  end
744
772
 
745
- it "should work correctly when subclassing" do
773
+ deprecated "should work correctly when subclassing" do
746
774
  @c.prepared_finder(:foo)
747
775
  @sc = Class.new(@c)
748
776
  @sc.set_dataset :foos
@@ -752,7 +780,7 @@ describe Sequel::Model, ".prepared_finder" do
752
780
  @db.sqls.must_equal ["SELECT * FROM foos WHERE (bar = 1) ORDER BY 2 LIMIT 1 -- prepared", "SELECT * FROM foos WHERE (bar = 3) ORDER BY 4 LIMIT 1 -- prepared"]
753
781
  end
754
782
 
755
- it "should work correctly when dataset is modified" do
783
+ deprecated "should work correctly when dataset is modified" do
756
784
  @c.prepared_finder(:foo)
757
785
  @c.first_foo(1, 2).must_equal @o
758
786
  @c.set_dataset :foos
@@ -760,21 +788,21 @@ describe Sequel::Model, ".prepared_finder" do
760
788
  @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1 -- prepared", "SELECT * FROM foos LIMIT 1", "SELECT * FROM foos WHERE (bar = 3) ORDER BY 4 LIMIT 1 -- prepared"]
761
789
  end
762
790
 
763
- it "should create a method based on the given block if no method symbol provided" do
791
+ deprecated "should create a method based on the given block if no method symbol provided" do
764
792
  @c.prepared_finder(:name=>:first_foo){|a1| where(:id=>a1).limit(1)}
765
793
  @c.first_foo(1).must_equal @o
766
794
  @db.sqls.must_equal ["SELECT * FROM items WHERE (id = 1) LIMIT 1 -- prepared"]
767
795
  end
768
796
 
769
- it "should raise an error if both a block and method symbol given" do
797
+ deprecated "should raise an error if both a block and method symbol given" do
770
798
  proc{@c.prepared_finder(:foo, :name=>:first_foo){|pl, ds| ds.where(pl.arg)}}.must_raise(Sequel::Error)
771
799
  end
772
800
 
773
- it "should raise an error if two option hashes are provided" do
801
+ deprecated "should raise an error if two option hashes are provided" do
774
802
  proc{@c.prepared_finder({:name2=>:foo}, :name=>:first_foo){|pl, ds| ds.where(pl.arg)}}.must_raise(Sequel::Error)
775
803
  end
776
804
 
777
- it "should support :type option" do
805
+ deprecated "should support :type option" do
778
806
  @c.prepared_finder :foo, :type=>:all
779
807
  @c.prepared_finder :foo, :type=>:each
780
808
 
@@ -789,14 +817,14 @@ describe Sequel::Model, ".prepared_finder" do
789
817
  @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 -- prepared", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4 -- prepared"]
790
818
  end
791
819
 
792
- it "should support :name option" do
820
+ deprecated "should support :name option" do
793
821
  @c.prepared_finder :foo, :name=>:find_foo
794
822
  @c.find_foo(1, 2).must_equal @o
795
823
  @c.find_foo(3, 4).must_equal @o
796
824
  @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1 -- prepared", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4 LIMIT 1 -- prepared"]
797
825
  end
798
826
 
799
- it "should support :arity option" do
827
+ deprecated "should support :arity option" do
800
828
  def @c.foobar(*b)
801
829
  ds = dataset
802
830
  b.each_with_index do |a, i|
@@ -811,7 +839,7 @@ describe Sequel::Model, ".prepared_finder" do
811
839
  @db.sqls.must_equal ["SELECT * FROM items WHERE (0 = a) LIMIT 1 -- prepared", "SELECT * FROM items WHERE ((0 = a) AND (1 = b)) LIMIT 1 -- prepared"]
812
840
  end
813
841
 
814
- it "should support :mod option" do
842
+ deprecated "should support :mod option" do
815
843
  m = Module.new
816
844
  @c.prepared_finder :foo, :mod=>m
817
845
  proc{@c.first_foo}.must_raise NoMethodError
@@ -821,7 +849,7 @@ describe Sequel::Model, ".prepared_finder" do
821
849
  @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1 -- prepared", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4 LIMIT 1 -- prepared"]
822
850
  end
823
851
 
824
- it "should handle models with names" do
852
+ deprecated "should handle models with names" do
825
853
  def @c.name; 'foobar' end
826
854
  @c.prepared_finder :foo
827
855
  @c.first_foo(1, 2).must_equal @o
@@ -1010,12 +1038,18 @@ describe Sequel::Model, ".[]" do
1010
1038
  DB.sqls.must_equal ["SELECT * FROM items WHERE name = 'sharon'"]
1011
1039
  end
1012
1040
 
1013
- it "should use a qualified primary key if the dataset is joined" do
1041
+ deprecated "should use a qualified primary key if the dataset is joined" do
1014
1042
  @c.dataset = @c.dataset.cross_join(:a)
1015
1043
  @c[1].must_equal @c.load(:name => 'sharon', :id => 1)
1016
1044
  DB.sqls.must_equal ["SELECT * FROM items CROSS JOIN a WHERE (items.id = 1) LIMIT 1"]
1017
1045
  end
1018
1046
 
1047
+ it "should handle a dataset that uses a subquery" do
1048
+ @c.dataset = @c.dataset.cross_join(:a).from_self(:alias=>:b)
1049
+ @c[1].must_equal @c.load(:name => 'sharon', :id => 1)
1050
+ DB.sqls.must_equal ["SELECT * FROM (SELECT * FROM items CROSS JOIN a) AS b WHERE (id = 1) LIMIT 1"]
1051
+ end
1052
+
1019
1053
  it "should work correctly for composite primary key specified as array" do
1020
1054
  @c.set_primary_key [:node_id, :kind]
1021
1055
  @c[3921, 201].must_be_kind_of(@c)
@@ -1084,7 +1118,7 @@ describe "Model.db_schema" do
1084
1118
  def @db.schema(table, opts={})
1085
1119
  raise Sequel::Error
1086
1120
  end
1087
- @c.dataset = @dataset.join(:x, :id).columns(:id, :x)
1121
+ @c.dataset = @dataset.join(:x, :id).from_self.columns(:id, :x)
1088
1122
  @c.db_schema.must_equal(:x=>{}, :id=>{})
1089
1123
  end
1090
1124
 
@@ -849,12 +849,18 @@ describe Sequel::Model, "#this" do
849
849
  instance.this.sql.must_equal "SELECT * FROM examples WHERE (a = 3) LIMIT 1"
850
850
  end
851
851
 
852
- it "should use a qualified primary key if the dataset is joined" do
852
+ deprecated "should use a qualified primary key if the dataset is joined" do
853
853
  @example.dataset = @example.dataset.cross_join(:a)
854
854
  instance = @example.load(:id => 3)
855
855
  instance.this.sql.must_equal "SELECT * FROM examples CROSS JOIN a WHERE (examples.id = 3) LIMIT 1"
856
856
  end
857
857
 
858
+ it "should use a primary key if the dataset uses a subquery" do
859
+ @example.dataset = @example.dataset.cross_join(:a).from_self(:alias=>:b)
860
+ instance = @example.load(:id => 3)
861
+ instance.this.sql.must_equal "SELECT * FROM (SELECT * FROM examples CROSS JOIN a) AS b WHERE (id = 3) LIMIT 1"
862
+ end
863
+
858
864
  it "should support composite primary keys" do
859
865
  @example.set_primary_key [:x, :y]
860
866
  instance = @example.load(:x => 4, :y => 5)
@@ -1038,7 +1044,7 @@ describe Sequel::Model, "#set" do
1038
1044
 
1039
1045
  it "should raise error if strict_param_setting is true and column is restricted" do
1040
1046
  @o1.strict_param_setting = true
1041
- @c.set_allowed_columns
1047
+ @c.setter_methods.delete("x=")
1042
1048
  proc{@o1.set('x' => 1)}.must_raise(Sequel::MassAssignmentRestriction)
1043
1049
  end
1044
1050
 
@@ -1277,17 +1283,19 @@ end
1277
1283
 
1278
1284
  describe Sequel::Model, "#(set|update)_(all|only)" do
1279
1285
  before do
1280
- @c = Class.new(Sequel::Model(:items)) do
1281
- set_primary_key :id
1282
- columns :x, :y, :z, :id
1283
- set_allowed_columns :x
1286
+ deprecated do
1287
+ @c = Class.new(Sequel::Model(:items)) do
1288
+ set_primary_key :id
1289
+ columns :x, :y, :z, :id
1290
+ set_allowed_columns :x
1291
+ end
1284
1292
  end
1285
1293
  @c.strict_param_setting = false
1286
1294
  @o1 = @c.new
1287
1295
  DB.reset
1288
1296
  end
1289
1297
 
1290
- it "should raise errors if not all hash fields can be set and strict_param_setting is true" do
1298
+ deprecated "should raise errors if not all hash fields can be set and strict_param_setting is true" do
1291
1299
  @c.strict_param_setting = true
1292
1300
 
1293
1301
  proc{@c.new.set_all(:x => 1, :y => 2, :z=>3, :use_after_commit_rollback => false)}.must_raise(Sequel::MassAssignmentRestriction)
@@ -1300,19 +1308,19 @@ describe Sequel::Model, "#(set|update)_(all|only)" do
1300
1308
  o.values.must_equal(:x => 1, :y => 2)
1301
1309
  end
1302
1310
 
1303
- it "#set_all should set all attributes including the primary key" do
1311
+ deprecated "#set_all should set all attributes including the primary key" do
1304
1312
  @o1.set_all(:x => 1, :y => 2, :z=>3, :id=>4)
1305
1313
  @o1.values.must_equal(:id =>4, :x => 1, :y => 2, :z=>3)
1306
1314
  end
1307
1315
 
1308
- it "#set_all should set not set restricted fields" do
1316
+ deprecated "#set_all should set not set restricted fields" do
1309
1317
  @o1.use_after_commit_rollback.must_be_nil
1310
1318
  @o1.set_all(:x => 1, :use_after_commit_rollback => true)
1311
1319
  @o1.use_after_commit_rollback.must_be_nil
1312
1320
  @o1.values.must_equal(:x => 1)
1313
1321
  end
1314
1322
 
1315
- it "#set_only should only set given attributes" do
1323
+ deprecated "#set_only should only set given attributes" do
1316
1324
  @o1.set_only({:x => 1, :y => 2, :z=>3, :id=>4}, [:x, :y])
1317
1325
  @o1.values.must_equal(:x => 1, :y => 2)
1318
1326
  @o1.set_only({:x => 4, :y => 5, :z=>6, :id=>7}, :x, :y)
@@ -1321,7 +1329,7 @@ describe Sequel::Model, "#(set|update)_(all|only)" do
1321
1329
  @o1.values.must_equal(:x => 9, :y => 8, :id=>7)
1322
1330
  end
1323
1331
 
1324
- it "#update_all should update all attributes" do
1332
+ deprecated "#update_all should update all attributes" do
1325
1333
  @c.new.update_all(:x => 1)
1326
1334
  DB.sqls.must_equal ["INSERT INTO items (x) VALUES (1)", "SELECT * FROM items WHERE id = 10"]
1327
1335
  @c.new.update_all(:y => 1)
@@ -1330,7 +1338,7 @@ describe Sequel::Model, "#(set|update)_(all|only)" do
1330
1338
  DB.sqls.must_equal ["INSERT INTO items (z) VALUES (1)", "SELECT * FROM items WHERE id = 10"]
1331
1339
  end
1332
1340
 
1333
- it "#update_only should only update given attributes" do
1341
+ deprecated "#update_only should only update given attributes" do
1334
1342
  @o1.update_only({:x => 1, :y => 2, :z=>3, :id=>4}, [:x])
1335
1343
  DB.sqls.must_equal ["INSERT INTO items (x) VALUES (1)", "SELECT * FROM items WHERE id = 10"]
1336
1344
  @c.new.update_only({:x => 1, :y => 2, :z=>3, :id=>4}, :x)
@@ -1459,7 +1467,7 @@ describe Sequel::Model, "#each" do
1459
1467
  @m = @model.load(:a => 1, :b => 2, :id => 4444)
1460
1468
  end
1461
1469
 
1462
- it "should iterate over the values" do
1470
+ deprecated "should iterate over the values" do
1463
1471
  h = {}
1464
1472
  @m.each{|k, v| h[k] = v}
1465
1473
  h.must_equal(:a => 1, :b => 2, :id => 4444)