sequel 3.36.1 → 3.37.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. data/CHANGELOG +84 -0
  2. data/Rakefile +13 -0
  3. data/bin/sequel +12 -16
  4. data/doc/advanced_associations.rdoc +36 -67
  5. data/doc/association_basics.rdoc +11 -16
  6. data/doc/release_notes/3.37.0.txt +338 -0
  7. data/doc/schema_modification.rdoc +4 -0
  8. data/lib/sequel/adapters/jdbc/h2.rb +1 -1
  9. data/lib/sequel/adapters/jdbc/postgresql.rb +26 -8
  10. data/lib/sequel/adapters/mysql2.rb +4 -3
  11. data/lib/sequel/adapters/odbc/mssql.rb +2 -2
  12. data/lib/sequel/adapters/postgres.rb +4 -60
  13. data/lib/sequel/adapters/shared/mssql.rb +2 -1
  14. data/lib/sequel/adapters/shared/mysql.rb +0 -5
  15. data/lib/sequel/adapters/shared/postgres.rb +68 -2
  16. data/lib/sequel/adapters/shared/sqlite.rb +17 -1
  17. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +12 -1
  18. data/lib/sequel/adapters/utils/pg_types.rb +76 -0
  19. data/lib/sequel/core.rb +13 -0
  20. data/lib/sequel/database/misc.rb +41 -1
  21. data/lib/sequel/database/schema_generator.rb +23 -10
  22. data/lib/sequel/database/schema_methods.rb +26 -4
  23. data/lib/sequel/dataset/graph.rb +2 -1
  24. data/lib/sequel/dataset/query.rb +62 -2
  25. data/lib/sequel/extensions/_pretty_table.rb +7 -3
  26. data/lib/sequel/extensions/arbitrary_servers.rb +5 -4
  27. data/lib/sequel/extensions/blank.rb +4 -0
  28. data/lib/sequel/extensions/columns_introspection.rb +13 -2
  29. data/lib/sequel/extensions/core_extensions.rb +6 -0
  30. data/lib/sequel/extensions/eval_inspect.rb +158 -0
  31. data/lib/sequel/extensions/inflector.rb +4 -0
  32. data/lib/sequel/extensions/looser_typecasting.rb +5 -4
  33. data/lib/sequel/extensions/migration.rb +4 -1
  34. data/lib/sequel/extensions/named_timezones.rb +4 -0
  35. data/lib/sequel/extensions/null_dataset.rb +4 -0
  36. data/lib/sequel/extensions/pagination.rb +4 -0
  37. data/lib/sequel/extensions/pg_array.rb +219 -168
  38. data/lib/sequel/extensions/pg_array_ops.rb +7 -2
  39. data/lib/sequel/extensions/pg_auto_parameterize.rb +10 -4
  40. data/lib/sequel/extensions/pg_hstore.rb +3 -1
  41. data/lib/sequel/extensions/pg_hstore_ops.rb +7 -2
  42. data/lib/sequel/extensions/pg_inet.rb +28 -3
  43. data/lib/sequel/extensions/pg_interval.rb +192 -0
  44. data/lib/sequel/extensions/pg_json.rb +21 -9
  45. data/lib/sequel/extensions/pg_range.rb +487 -0
  46. data/lib/sequel/extensions/pg_range_ops.rb +122 -0
  47. data/lib/sequel/extensions/pg_statement_cache.rb +3 -2
  48. data/lib/sequel/extensions/pretty_table.rb +12 -1
  49. data/lib/sequel/extensions/query.rb +4 -0
  50. data/lib/sequel/extensions/query_literals.rb +6 -6
  51. data/lib/sequel/extensions/schema_dumper.rb +39 -38
  52. data/lib/sequel/extensions/select_remove.rb +4 -0
  53. data/lib/sequel/extensions/server_block.rb +3 -2
  54. data/lib/sequel/extensions/split_array_nil.rb +65 -0
  55. data/lib/sequel/extensions/sql_expr.rb +4 -0
  56. data/lib/sequel/extensions/string_date_time.rb +4 -0
  57. data/lib/sequel/extensions/thread_local_timezones.rb +9 -3
  58. data/lib/sequel/extensions/to_dot.rb +4 -0
  59. data/lib/sequel/model/associations.rb +150 -91
  60. data/lib/sequel/plugins/identity_map.rb +2 -2
  61. data/lib/sequel/plugins/list.rb +1 -0
  62. data/lib/sequel/plugins/many_through_many.rb +33 -32
  63. data/lib/sequel/plugins/nested_attributes.rb +11 -3
  64. data/lib/sequel/plugins/rcte_tree.rb +2 -2
  65. data/lib/sequel/plugins/schema.rb +1 -1
  66. data/lib/sequel/sql.rb +14 -14
  67. data/lib/sequel/version.rb +2 -2
  68. data/spec/adapters/mysql_spec.rb +25 -0
  69. data/spec/adapters/postgres_spec.rb +572 -28
  70. data/spec/adapters/sqlite_spec.rb +16 -1
  71. data/spec/core/database_spec.rb +61 -2
  72. data/spec/core/dataset_spec.rb +92 -0
  73. data/spec/core/expression_filters_spec.rb +12 -0
  74. data/spec/extensions/arbitrary_servers_spec.rb +1 -1
  75. data/spec/extensions/boolean_readers_spec.rb +25 -25
  76. data/spec/extensions/eval_inspect_spec.rb +58 -0
  77. data/spec/extensions/json_serializer_spec.rb +0 -6
  78. data/spec/extensions/list_spec.rb +1 -1
  79. data/spec/extensions/looser_typecasting_spec.rb +7 -7
  80. data/spec/extensions/many_through_many_spec.rb +81 -0
  81. data/spec/extensions/nested_attributes_spec.rb +21 -4
  82. data/spec/extensions/pg_array_ops_spec.rb +1 -11
  83. data/spec/extensions/pg_array_spec.rb +181 -90
  84. data/spec/extensions/pg_auto_parameterize_spec.rb +3 -3
  85. data/spec/extensions/pg_hstore_spec.rb +1 -3
  86. data/spec/extensions/pg_inet_spec.rb +6 -1
  87. data/spec/extensions/pg_interval_spec.rb +73 -0
  88. data/spec/extensions/pg_json_spec.rb +5 -9
  89. data/spec/extensions/pg_range_ops_spec.rb +49 -0
  90. data/spec/extensions/pg_range_spec.rb +372 -0
  91. data/spec/extensions/pg_statement_cache_spec.rb +1 -2
  92. data/spec/extensions/query_literals_spec.rb +1 -2
  93. data/spec/extensions/schema_dumper_spec.rb +48 -89
  94. data/spec/extensions/serialization_spec.rb +1 -5
  95. data/spec/extensions/server_block_spec.rb +2 -2
  96. data/spec/extensions/spec_helper.rb +12 -2
  97. data/spec/extensions/split_array_nil_spec.rb +24 -0
  98. data/spec/integration/associations_test.rb +4 -4
  99. data/spec/integration/database_test.rb +2 -2
  100. data/spec/integration/dataset_test.rb +4 -4
  101. data/spec/integration/eager_loader_test.rb +6 -6
  102. data/spec/integration/plugin_test.rb +2 -2
  103. data/spec/integration/spec_helper.rb +2 -2
  104. data/spec/model/association_reflection_spec.rb +5 -0
  105. data/spec/model/associations_spec.rb +156 -49
  106. data/spec/model/eager_loading_spec.rb +137 -2
  107. data/spec/model/model_spec.rb +10 -10
  108. metadata +15 -2
@@ -23,8 +23,7 @@ describe "pg_statement_cache and pg_auto_parameterize extensions" do
23
23
  end
24
24
  end)
25
25
  end)
26
- @db.extend Sequel::Postgres::AutoParameterize::DatabaseMethods
27
- @db.extend Sequel::Postgres::StatementCache::DatabaseMethods
26
+ @db.extension :pg_auto_parameterize, :pg_statement_cache
28
27
  @db.extend(Module.new do
29
28
  attr_accessor :exec_raise
30
29
  def _execute(c, sql, opts={})
@@ -2,8 +2,7 @@ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
2
 
3
3
  describe "query_literals extension" do
4
4
  before do
5
- @ds = Sequel::Dataset.new(nil).from(:t)
6
- @ds.extend(Sequel::QueryLiterals)
5
+ @ds = Sequel::Dataset.new(nil).from(:t).extension(:query_literals)
7
6
  end
8
7
 
9
8
  it "should not use special support if given a block" do
@@ -157,9 +157,9 @@ describe "Sequel::Database dump methods" do
157
157
  s.should_not =~ /:deferrable/
158
158
  end
159
159
 
160
- it "should dump primary key columns with explicit :type equal to the database type when :same_db option is passed" do
160
+ it "should dump primary key columns with explicit type equal to the database type when :same_db option is passed" do
161
161
  @d.meta_def(:schema){|*s| [[:c1, {:db_type=>'somedbspecifictype', :primary_key=>true, :allow_null=>false}]]}
162
- @d.dump_table_schema(:t7, :same_db => true).should == "create_table(:t7) do\n primary_key :c1, :type=>\"somedbspecifictype\"\nend"
162
+ @d.dump_table_schema(:t7, :same_db => true).should == "create_table(:t7) do\n column :c1, \"somedbspecifictype\", :null=>false\n \n primary_key [:c1]\nend"
163
163
  end
164
164
 
165
165
  it "should use a composite primary_key calls if there is a composite primary key" do
@@ -183,7 +183,7 @@ describe "Sequel::Database dump methods" do
183
183
  it "should support dumping the whole database as a migration" do
184
184
  @d.dump_schema_migration.should == <<-END_MIG
185
185
  Sequel.migration do
186
- up do
186
+ change do
187
187
  create_table(:t1) do
188
188
  primary_key :c1
189
189
  String :c2, :size=>20
@@ -196,10 +196,6 @@ Sequel.migration do
196
196
  primary_key [:c1, :c2]
197
197
  end
198
198
  end
199
-
200
- down do
201
- drop_table(:t2, :t1)
202
- end
203
199
  end
204
200
  END_MIG
205
201
  end
@@ -208,7 +204,7 @@ END_MIG
208
204
  @d.meta_def(:tables){|o| [:t2, :t1]}
209
205
  @d.dump_schema_migration.should == <<-END_MIG
210
206
  Sequel.migration do
211
- up do
207
+ change do
212
208
  create_table(:t1) do
213
209
  primary_key :c1
214
210
  String :c2, :size=>20
@@ -221,10 +217,6 @@ Sequel.migration do
221
217
  primary_key [:c1, :c2]
222
218
  end
223
219
  end
224
-
225
- down do
226
- drop_table(:t2, :t1)
227
- end
228
220
  end
229
221
  END_MIG
230
222
  end
@@ -239,7 +231,7 @@ END_MIG
239
231
  end
240
232
  @d.dump_schema_migration.should == <<-END_MIG
241
233
  Sequel.migration do
242
- up do
234
+ change do
243
235
  create_table(:t2) do
244
236
  primary_key :c1
245
237
  end
@@ -248,10 +240,6 @@ Sequel.migration do
248
240
  foreign_key :c2, :t2, :key=>[:c1]
249
241
  end
250
242
  end
251
-
252
- down do
253
- drop_table(:t1, :t2)
254
- end
255
243
  end
256
244
  END_MIG
257
245
  end
@@ -266,7 +254,7 @@ END_MIG
266
254
  end
267
255
  @d.dump_schema_migration.should == <<-END_MIG
268
256
  Sequel.migration do
269
- up do
257
+ change do
270
258
  create_table(:t1) do
271
259
  Integer :c2
272
260
  end
@@ -279,10 +267,6 @@ Sequel.migration do
279
267
  add_foreign_key [:c2], :t2, :key=>[:c1]
280
268
  end
281
269
  end
282
-
283
- down do
284
- drop_table(:t2, :t1)
285
- end
286
270
  end
287
271
  END_MIG
288
272
  end
@@ -298,7 +282,7 @@ END_MIG
298
282
  end
299
283
  @d.dump_schema_migration.should == <<-END_MIG
300
284
  Sequel.migration do
301
- up do
285
+ change do
302
286
  create_table(:t2) do
303
287
  primary_key :c1
304
288
  end
@@ -307,10 +291,6 @@ Sequel.migration do
307
291
  foreign_key :c2, :t2, :key=>[:c1]
308
292
  end
309
293
  end
310
-
311
- down do
312
- drop_table(:t1, :t2)
313
- end
314
294
  end
315
295
  END_MIG
316
296
  end
@@ -319,7 +299,7 @@ END_MIG
319
299
  @d.dump_table_schema(:t1, :same_db=>true).should == "create_table(:t1) do\n primary_key :c1\n column :c2, \"varchar(20)\"\nend"
320
300
  @d.dump_schema_migration(:same_db=>true).should == <<-END_MIG
321
301
  Sequel.migration do
322
- up do
302
+ change do
323
303
  create_table(:t1) do
324
304
  primary_key :c1
325
305
  column :c2, "varchar(20)"
@@ -332,10 +312,6 @@ Sequel.migration do
332
312
  primary_key [:c1, :c2]
333
313
  end
334
314
  end
335
-
336
- down do
337
- drop_table(:t2, :t1)
338
- end
339
315
  end
340
316
  END_MIG
341
317
  end
@@ -348,7 +324,7 @@ END_MIG
348
324
  @d.dump_table_schema(:t1, :index_names=>false).should == "create_table(:t1, :ignore_index_errors=>true) do\n primary_key :c1\n String :c2, :size=>20\n \n index [:c1]\n index [:c2, :c1], :unique=>true\nend"
349
325
  @d.dump_schema_migration(:index_names=>false).should == <<-END_MIG
350
326
  Sequel.migration do
351
- up do
327
+ change do
352
328
  create_table(:t1, :ignore_index_errors=>true) do
353
329
  primary_key :c1
354
330
  String :c2, :size=>20
@@ -367,10 +343,6 @@ Sequel.migration do
367
343
  index [:c2, :c1], :unique=>true
368
344
  end
369
345
  end
370
-
371
- down do
372
- drop_table(:t2, :t1)
373
- end
374
346
  end
375
347
  END_MIG
376
348
  end
@@ -383,7 +355,7 @@ END_MIG
383
355
  @d.dump_table_schema(:t1, :index_names=>:namespace).should == "create_table(:t1, :ignore_index_errors=>true) do\n primary_key :c1\n String :c2, :size=>20\n \n index [:c1], :name=>:i1\n index [:c2, :c1]\nend"
384
356
  @d.dump_schema_migration(:index_names=>:namespace).should == <<-END_MIG
385
357
  Sequel.migration do
386
- up do
358
+ change do
387
359
  create_table(:t1, :ignore_index_errors=>true) do
388
360
  primary_key :c1
389
361
  String :c2, :size=>20
@@ -402,10 +374,6 @@ Sequel.migration do
402
374
  index [:c2, :c1], :name=>:t1_c2_c1_index
403
375
  end
404
376
  end
405
-
406
- down do
407
- drop_table(:t2, :t1)
408
- end
409
377
  end
410
378
  END_MIG
411
379
  end
@@ -419,7 +387,7 @@ END_MIG
419
387
  @d.dump_table_schema(:t1, :index_names=>:namespace).should == "create_table(:t1, :ignore_index_errors=>true) do\n primary_key :c1\n String :c2, :size=>20\n \n index [:c1], :name=>:t1_i1\n index [:c2, :c1]\nend"
420
388
  @d.dump_schema_migration(:index_names=>:namespace).should == <<-END_MIG
421
389
  Sequel.migration do
422
- up do
390
+ change do
423
391
  create_table(:t1, :ignore_index_errors=>true) do
424
392
  primary_key :c1
425
393
  String :c2, :size=>20
@@ -438,10 +406,6 @@ Sequel.migration do
438
406
  index [:c2, :c1], :name=>:t2_t1_c2_c1_index
439
407
  end
440
408
  end
441
-
442
- down do
443
- drop_table(:t2, :t1)
444
- end
445
409
  end
446
410
  END_MIG
447
411
  end
@@ -454,7 +418,7 @@ END_MIG
454
418
  @d.dump_table_schema(:t1, :indexes=>false).should == "create_table(:t1) do\n primary_key :c1\n String :c2, :size=>20\nend"
455
419
  @d.dump_schema_migration(:indexes=>false).should == <<-END_MIG
456
420
  Sequel.migration do
457
- up do
421
+ change do
458
422
  create_table(:t1) do
459
423
  primary_key :c1
460
424
  String :c2, :size=>20
@@ -467,10 +431,6 @@ Sequel.migration do
467
431
  primary_key [:c1, :c2]
468
432
  end
469
433
  end
470
-
471
- down do
472
- drop_table(:t2, :t1)
473
- end
474
434
  end
475
435
  END_MIG
476
436
  end
@@ -497,15 +457,10 @@ END_MIG
497
457
  end
498
458
  @d.dump_indexes_migration.should == <<-END_MIG
499
459
  Sequel.migration do
500
- up do
460
+ change do
501
461
  add_index :t1, [:c1], :ignore_errors=>true, :name=>:i1
502
462
  add_index :t1, [:c2, :c1], :ignore_errors=>true, :unique=>true
503
463
  end
504
-
505
- down do
506
- drop_index :t1, [:c2, :c1], :ignore_errors=>true, :unique=>true
507
- drop_index :t1, [:c1], :ignore_errors=>true, :name=>:i1
508
- end
509
464
  end
510
465
  END_MIG
511
466
  end
@@ -518,15 +473,10 @@ END_MIG
518
473
  end
519
474
  @d.dump_indexes_migration(:index_names=>false).should == <<-END_MIG
520
475
  Sequel.migration do
521
- up do
476
+ change do
522
477
  add_index :t1, [:c1], :ignore_errors=>true
523
478
  add_index :t1, [:c2, :c1], :ignore_errors=>true, :unique=>true
524
479
  end
525
-
526
- down do
527
- drop_index :t1, [:c2, :c1], :ignore_errors=>true, :unique=>true
528
- drop_index :t1, [:c1], :ignore_errors=>true
529
- end
530
480
  end
531
481
  END_MIG
532
482
  end
@@ -539,21 +489,13 @@ END_MIG
539
489
  end
540
490
  @d.dump_indexes_migration(:index_names=>:namespace).should == <<-END_MIG
541
491
  Sequel.migration do
542
- up do
492
+ change do
543
493
  add_index :t1, [:c1], :ignore_errors=>true, :name=>:i1
544
494
  add_index :t1, [:c2, :c1], :ignore_errors=>true
545
495
 
546
496
  add_index :t2, [:c1], :ignore_errors=>true, :name=>:i1
547
497
  add_index :t2, [:c2, :c1], :ignore_errors=>true, :name=>:t1_c2_c1_index
548
498
  end
549
-
550
- down do
551
- drop_index :t2, [:c2, :c1], :ignore_errors=>true, :name=>:t1_c2_c1_index
552
- drop_index :t2, [:c1], :ignore_errors=>true, :name=>:i1
553
-
554
- drop_index :t1, [:c2, :c1], :ignore_errors=>true
555
- drop_index :t1, [:c1], :ignore_errors=>true, :name=>:i1
556
- end
557
499
  end
558
500
  END_MIG
559
501
  end
@@ -567,21 +509,13 @@ END_MIG
567
509
  end
568
510
  @d.dump_indexes_migration(:index_names=>:namespace).should == <<-END_MIG
569
511
  Sequel.migration do
570
- up do
512
+ change do
571
513
  add_index :t1, [:c1], :ignore_errors=>true, :name=>:t1_i1
572
514
  add_index :t1, [:c2, :c1], :ignore_errors=>true
573
515
 
574
516
  add_index :t2, [:c1], :ignore_errors=>true, :name=>:t2_i1
575
517
  add_index :t2, [:c2, :c1], :ignore_errors=>true, :name=>:t2_t1_c2_c1_index
576
518
  end
577
-
578
- down do
579
- drop_index :t2, [:c2, :c1], :ignore_errors=>true, :name=>:t2_t1_c2_c1_index
580
- drop_index :t2, [:c1], :ignore_errors=>true, :name=>:t2_i1
581
-
582
- drop_index :t1, [:c2, :c1], :ignore_errors=>true
583
- drop_index :t1, [:c1], :ignore_errors=>true, :name=>:t1_i1
584
- end
585
519
  end
586
520
  END_MIG
587
521
  end
@@ -590,11 +524,7 @@ END_MIG
590
524
  @d.meta_def(:tables){|o| [:t1]}
591
525
  @d.dump_indexes_migration.should == <<-END_MIG
592
526
  Sequel.migration do
593
- up do
594
-
595
- end
596
-
597
- down do
527
+ change do
598
528
 
599
529
  end
600
530
  end
@@ -605,7 +535,7 @@ END_MIG
605
535
  @d.meta_def(:tables){|o| [:t1]}
606
536
  @d.dump_foreign_key_migration.should == <<-END_MIG
607
537
  Sequel.migration do
608
- up do
538
+ change do
609
539
 
610
540
  end
611
541
  end
@@ -629,7 +559,7 @@ END_MIG
629
559
  end
630
560
  @d.dump_foreign_key_migration.should == <<-END_MIG
631
561
  Sequel.migration do
632
- up do
562
+ change do
633
563
  alter_table(:t1) do
634
564
  add_foreign_key [:c2], :t2, :key=>[:c1]
635
565
  end
@@ -771,7 +701,36 @@ create_table(:x) do
771
701
  Integer :c70
772
702
  Integer :c71
773
703
  Integer :c72
704
+
705
+ check Sequel::SQL::BooleanExpression.new(:>=, Sequel::SQL::Identifier.new(:c64), 0)
706
+ check Sequel::SQL::BooleanExpression.new(:>=, Sequel::SQL::Identifier.new(:c65), 0)
707
+ check Sequel::SQL::BooleanExpression.new(:>=, Sequel::SQL::Identifier.new(:c66), 0)
708
+ check Sequel::SQL::BooleanExpression.new(:>=, Sequel::SQL::Identifier.new(:c67), 0)
709
+ check Sequel::SQL::BooleanExpression.new(:>=, Sequel::SQL::Identifier.new(:c68), 0)
710
+ check Sequel::SQL::BooleanExpression.new(:>=, Sequel::SQL::Identifier.new(:c69), 0)
774
711
  end
775
712
  END_MIG
776
713
  end
714
+
715
+ it "should use separate primary_key call with non autoincrementable types" do
716
+ @d.meta_def(:schema){|*s| [[:c1, {:db_type=>'varchar(8)', :primary_key=>true}]]}
717
+ @d.dump_table_schema(:t3).should == "create_table(:t3) do\n String :c1, :size=>8\n \n primary_key [:c1]\nend"
718
+ @d.dump_table_schema(:t3, :same_db=>true).should == "create_table(:t3) do\n column :c1, \"varchar(8)\"\n \n primary_key [:c1]\nend"
719
+ end
720
+
721
+ it "should use explicit type for non integer foreign_key types" do
722
+ @d.meta_def(:schema){|*s| [[:c1, {:db_type=>'date', :primary_key=>true}]]}
723
+ @d.meta_def(:foreign_key_list){|t, *a| [{:columns=>[:c1], :table=>:t3, :key=>[:c1]}] if t == :t4}
724
+ ["create_table(:t4) do\n foreign_key :c1, :t3, :type=>Date, :key=>[:c1]\n \n primary_key [:c1]\nend",
725
+ "create_table(:t4) do\n foreign_key :c1, :t3, :key=>[:c1], :type=>Date\n \n primary_key [:c1]\nend"].should include(@d.dump_table_schema(:t4))
726
+ ["create_table(:t4) do\n foreign_key :c1, :t3, :type=>\"date\", :key=>[:c1]\n \n primary_key [:c1]\nend",
727
+ "create_table(:t4) do\n foreign_key :c1, :t3, :key=>[:c1], :type=>\"date\"\n \n primary_key [:c1]\nend"].should include(@d.dump_table_schema(:t4, :same_db=>true))
728
+ end
729
+
730
+ it "should correctly handing autoincrementing primary keys that are also foreign keys" do
731
+ @d.meta_def(:schema){|*s| [[:c1, {:db_type=>'integer', :primary_key=>true}]]}
732
+ @d.meta_def(:foreign_key_list){|t, *a| [{:columns=>[:c1], :table=>:t3, :key=>[:c1]}] if t == :t4}
733
+ ["create_table(:t4) do\n primary_key :c1, :table=>:t3, :key=>[:c1]\nend",
734
+ "create_table(:t4) do\n primary_key :c1, :key=>[:c1], :table=>:t3\nend"].should include(@d.dump_table_schema(:t4))
735
+ end
777
736
  end
@@ -1,11 +1,8 @@
1
1
  require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
2
 
3
- begin
4
3
  require 'yaml'
5
4
  require 'json'
6
- rescue LoadError => e
7
- skip_warn "serialization plugin: can't load json (#{e.class}: #{e})"
8
- else
5
+
9
6
  describe "Serialization plugin" do
10
7
  before do
11
8
  @c = Class.new(Sequel::Model(:items)) do
@@ -252,4 +249,3 @@ describe "Serialization plugin" do
252
249
  o.abc.should == 9
253
250
  end
254
251
  end
255
- end
@@ -44,7 +44,7 @@ end
44
44
  describe "Database#with_server single threaded" do
45
45
  before do
46
46
  @db = Sequel.mock(:single_threaded=>true, :servers=>{:a=>{}, :b=>{}})
47
- @db.extend Sequel::ServerBlock
47
+ @db.extension :server_block
48
48
  end
49
49
 
50
50
  it_should_behave_like "Database#with_server"
@@ -53,7 +53,7 @@ end
53
53
  describe "Database#with_server multi threaded" do
54
54
  before do
55
55
  @db = Sequel.mock(:servers=>{:a=>{}, :b=>{}, :c=>{}, :d=>{}})
56
- @db.extend Sequel::ServerBlock
56
+ @db.extension :server_block
57
57
  end
58
58
 
59
59
  it_should_behave_like "Database#with_server"
@@ -1,4 +1,13 @@
1
1
  require 'rubygems'
2
+
3
+ if defined?(RSpec)
4
+ begin
5
+ require 'rspec/expectations'
6
+ rescue LoadError
7
+ nil
8
+ end
9
+ end
10
+
2
11
  unless Object.const_defined?('Sequel')
3
12
  $:.unshift(File.join(File.dirname(File.expand_path(__FILE__)), "../../lib/"))
4
13
  require 'sequel/core'
@@ -12,11 +21,12 @@ begin
12
21
  # Attempt to load ActiveSupport inflector first, so Sequel inflector
13
22
  # can override it.
14
23
  require 'active_support/inflector'
15
- require 'active_support/string/inflections'
24
+ require 'active_support/core_ext/string/inflections'
16
25
  rescue LoadError
26
+ nil
17
27
  end
18
28
 
19
- Sequel.extension(*%w'string_date_time inflector pagination query pretty_table blank migration schema_dumper looser_typecasting sql_expr thread_local_timezones to_dot columns_introspection server_block arbitrary_servers pg_auto_parameterize pg_statement_cache pg_hstore pg_hstore_ops pg_inet schema_caching null_dataset select_remove query_literals')
29
+ Sequel.extension(*%w'string_date_time inflector pagination query pretty_table blank migration schema_dumper looser_typecasting sql_expr thread_local_timezones to_dot columns_introspection server_block arbitrary_servers pg_auto_parameterize pg_statement_cache pg_array pg_array_ops pg_hstore pg_hstore_ops pg_range pg_range_ops pg_json pg_inet schema_caching null_dataset select_remove query_literals eval_inspect')
20
30
  {:hook_class_methods=>[], :schema=>[], :validation_class_methods=>[]}.each{|p, opts| Sequel::Model.plugin(p, *opts)}
21
31
 
22
32
  Sequel::Dataset.introspect_all_columns if ENV['SEQUEL_COLUMNS_INTROSPECTION']
@@ -0,0 +1,24 @@
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper')
2
+
3
+ describe "split_array_nil extension" do
4
+ before do
5
+ @ds = Sequel.mock[:table].extension(:split_array_nil)
6
+ end
7
+
8
+ specify "should split IN with nil in array into separate OR IS NULL clause" do
9
+ @ds.filter(:a=>[1, nil]).sql.should == "SELECT * FROM table WHERE ((a IN (1)) OR (a IS NULL))"
10
+ end
11
+
12
+ specify "should split NOT IN with nil in array into separate AND IS NOT NULL clause" do
13
+ @ds.exclude(:a=>[1, nil]).sql.should == "SELECT * FROM table WHERE ((a NOT IN (1)) AND (a IS NOT NULL))"
14
+ end
15
+
16
+ specify "should not affect other IN/NOT in clauses" do
17
+ @ds.filter(:a=>[1, 2]).sql.should == "SELECT * FROM table WHERE (a IN (1, 2))"
18
+ @ds.exclude(:a=>[1, 2]).sql.should == "SELECT * FROM table WHERE (a NOT IN (1, 2))"
19
+ end
20
+
21
+ specify "should not affect other types of filters clauses" do
22
+ @ds.filter(:a=>1).sql.should == "SELECT * FROM table WHERE (a = 1)"
23
+ end
24
+ end