sequel 5.24.0 → 5.29.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 (79) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +58 -0
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +1 -1
  5. data/doc/cheat_sheet.rdoc +1 -0
  6. data/doc/postgresql.rdoc +2 -2
  7. data/doc/release_notes/5.25.0.txt +32 -0
  8. data/doc/release_notes/5.26.0.txt +35 -0
  9. data/doc/release_notes/5.27.0.txt +21 -0
  10. data/doc/release_notes/5.28.0.txt +16 -0
  11. data/doc/release_notes/5.29.0.txt +22 -0
  12. data/doc/testing.rdoc +11 -6
  13. data/lib/sequel/adapters/jdbc/postgresql.rb +6 -0
  14. data/lib/sequel/adapters/postgres.rb +5 -1
  15. data/lib/sequel/adapters/shared/mssql.rb +4 -2
  16. data/lib/sequel/adapters/shared/mysql.rb +1 -1
  17. data/lib/sequel/adapters/shared/postgres.rb +15 -0
  18. data/lib/sequel/adapters/shared/sqlite.rb +7 -2
  19. data/lib/sequel/adapters/tinytds.rb +1 -1
  20. data/lib/sequel/adapters/utils/mysql_mysql2.rb +1 -1
  21. data/lib/sequel/database/schema_generator.rb +1 -1
  22. data/lib/sequel/database/transactions.rb +3 -3
  23. data/lib/sequel/dataset/features.rb +6 -0
  24. data/lib/sequel/dataset/misc.rb +2 -2
  25. data/lib/sequel/dataset/query.rb +15 -2
  26. data/lib/sequel/dataset/sql.rb +17 -4
  27. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  28. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  29. data/lib/sequel/extensions/pg_array_ops.rb +10 -6
  30. data/lib/sequel/extensions/pg_enum.rb +4 -1
  31. data/lib/sequel/extensions/pg_json.rb +1 -1
  32. data/lib/sequel/extensions/pg_json_ops.rb +124 -0
  33. data/lib/sequel/extensions/pg_range.rb +9 -0
  34. data/lib/sequel/extensions/sql_comments.rb +2 -2
  35. data/lib/sequel/model/base.rb +12 -5
  36. data/lib/sequel/plugins/association_multi_add_remove.rb +83 -0
  37. data/lib/sequel/plugins/caching.rb +3 -0
  38. data/lib/sequel/plugins/csv_serializer.rb +26 -9
  39. data/lib/sequel/plugins/dirty.rb +3 -9
  40. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  41. data/lib/sequel/plugins/json_serializer.rb +15 -4
  42. data/lib/sequel/plugins/nested_attributes.rb +7 -0
  43. data/lib/sequel/plugins/sharding.rb +11 -5
  44. data/lib/sequel/plugins/throw_failures.rb +1 -1
  45. data/lib/sequel/plugins/typecast_on_load.rb +3 -2
  46. data/lib/sequel/sql.rb +4 -1
  47. data/lib/sequel/version.rb +1 -1
  48. data/spec/adapters/postgres_spec.rb +82 -17
  49. data/spec/adapters/sqlite_spec.rb +1 -1
  50. data/spec/bin_spec.rb +1 -1
  51. data/spec/core/database_spec.rb +1 -1
  52. data/spec/core/dataset_spec.rb +0 -3
  53. data/spec/core/expression_filters_spec.rb +26 -7
  54. data/spec/core/spec_helper.rb +1 -1
  55. data/spec/core_extensions_spec.rb +1 -1
  56. data/spec/extensions/any_not_empty_spec.rb +23 -0
  57. data/spec/extensions/association_multi_add_remove_spec.rb +1041 -0
  58. data/spec/extensions/caller_logging_spec.rb +1 -1
  59. data/spec/extensions/dirty_spec.rb +33 -0
  60. data/spec/extensions/empty_failure_backtraces_spec.rb +60 -0
  61. data/spec/extensions/exclude_or_null_spec.rb +15 -0
  62. data/spec/extensions/json_serializer_spec.rb +10 -0
  63. data/spec/extensions/named_timezones_spec.rb +5 -5
  64. data/spec/extensions/nested_attributes_spec.rb +48 -0
  65. data/spec/extensions/pg_array_ops_spec.rb +3 -3
  66. data/spec/extensions/pg_json_ops_spec.rb +67 -0
  67. data/spec/extensions/pg_range_spec.rb +35 -21
  68. data/spec/extensions/sharding_spec.rb +8 -0
  69. data/spec/extensions/spec_helper.rb +1 -1
  70. data/spec/guards_helper.rb +1 -1
  71. data/spec/integration/associations_test.rb +1 -1
  72. data/spec/integration/dataset_test.rb +57 -17
  73. data/spec/integration/plugin_test.rb +1 -1
  74. data/spec/integration/schema_test.rb +9 -0
  75. data/spec/integration/spec_helper.rb +7 -1
  76. data/spec/model/plugins_spec.rb +2 -2
  77. data/spec/model/spec_helper.rb +1 -1
  78. data/spec/sequel_warning.rb +1 -0
  79. metadata +35 -3
@@ -2131,7 +2131,7 @@ describe "Sequel::Model Simple Associations" do
2131
2131
  a.must_equal [@album, album2]
2132
2132
  a.map(&:artist).must_equal [@artist, @artist]
2133
2133
  a.map(&:artist).map(&:albums).must_equal [[@album, album2], [@album, album2]]
2134
- a.map(&:artist).map{|a| a.associations[:tags]}.must_equal [[], []]
2134
+ a.map(&:artist).map{|artist| artist.associations[:tags]}.must_equal [[], []]
2135
2135
  end
2136
2136
 
2137
2137
  it "should have remove method raise an error for one_to_many records if the object isn't already associated" do
@@ -92,6 +92,17 @@ describe "Simple Dataset operations" do
92
92
  @ds.from_self(:alias=>:items).graph(@ds.from_self, {:id=>:id}, :table_alias=>:b).extension(:graph_each).all.must_equal [{:items=>{:id=>1, :number=>10}, :b=>{:id=>1, :number=>10}}]
93
93
  end
94
94
 
95
+ cspecify "should have insert and update work with Sequel::DEFAULT", :sqlite do
96
+ @db.create_table!(:items) do
97
+ Integer :number, :default=>10
98
+ end
99
+ @ds.insert(:number=>Sequel::DEFAULT)
100
+ @ds.select_map(:number).must_equal [10]
101
+ @ds.insert(:number=>20)
102
+ @ds.update(:number=>Sequel::DEFAULT)
103
+ @ds.select_map(:number).must_equal [10, 10]
104
+ end
105
+
95
106
  cspecify "should have insert work correctly when inserting a row with all NULL values", :hsqldb do
96
107
  @db.create_table!(:items) do
97
108
  String :name
@@ -443,6 +454,20 @@ describe Sequel::Dataset do
443
454
  @d.extension(:sequel_4_dataset_methods).interval(:value).to_i.must_equal 6
444
455
  end
445
456
 
457
+ it "should support or emulate filtered aggregate functions" do
458
+ @d.insert(:name => 'abc', :value => 123)
459
+ @d.insert(:name => 'abc', :value => 456)
460
+ @d.insert(:name => 'def', :value => 324)
461
+ @d.get{count.function.*.filter{value > 100}}.must_equal 3
462
+ @d.get{count.function.*.filter{value > 200}}.must_equal 2
463
+ @d.get{count.function.*.filter{value > 400}}.must_equal 1
464
+ @d.get{count.function.*.filter{value > 500}}.must_equal 0
465
+ @d.get{count(:value).filter{value > 100}}.must_equal 3
466
+ @d.get{count(:value).filter{value > 200}}.must_equal 2
467
+ @d.get{count(:value).filter{value > 400}}.must_equal 1
468
+ @d.get{count(:value).filter{value > 500}}.must_equal 0
469
+ end
470
+
446
471
  it "should return the correct records" do
447
472
  @d.to_a.must_equal []
448
473
  @d.insert(:name => 'abc', :value => 123)
@@ -568,22 +593,21 @@ describe Sequel::Dataset do
568
593
  end
569
594
 
570
595
  describe "Simple Dataset operations" do
571
- before do
596
+ before(:all) do
572
597
  DB.create_table!(:items) do
573
598
  Integer :number
574
599
  TrueClass :flag
575
600
  end
576
- @ds = DB[:items]
601
+ @ds = DB[:items].order(:number)
602
+ @ds.insert(:number=>1, :flag=>true)
603
+ @ds.insert(:number=>2, :flag=>false)
604
+ @ds.insert(:number=>3, :flag=>nil)
577
605
  end
578
- after do
606
+ after(:all) do
579
607
  DB.drop_table?(:items)
580
608
  end
581
609
 
582
610
  it "should deal with boolean conditions correctly" do
583
- @ds.insert(:number=>1, :flag=>true)
584
- @ds.insert(:number=>2, :flag=>false)
585
- @ds.insert(:number=>3, :flag=>nil)
586
- @ds = @ds.order(:number)
587
611
  @ds.filter(:flag=>true).map(:number).must_equal [1]
588
612
  @ds.filter(:flag=>false).map(:number).must_equal [2]
589
613
  @ds.filter(:flag=>nil).map(:number).must_equal [3]
@@ -591,6 +615,22 @@ describe "Simple Dataset operations" do
591
615
  @ds.exclude(:flag=>false).map(:number).must_equal [1, 3]
592
616
  @ds.exclude(:flag=>nil).map(:number).must_equal [1, 2]
593
617
  end
618
+
619
+ cspecify "should deal with boolean equality conditions correctly", :derby do
620
+ @ds.filter(true=>:flag).map(:number).must_equal [1]
621
+ @ds.filter(false=>:flag).map(:number).must_equal [2]
622
+ @ds.filter(nil=>:flag).map(:number).must_equal []
623
+ @ds.exclude(true=>:flag).map(:number).must_equal [2]
624
+ @ds.exclude(false=>:flag).map(:number).must_equal [1]
625
+ @ds.exclude(nil=>:flag).map(:number).must_equal []
626
+ end
627
+
628
+ cspecify "should have exclude_or_null work correctly", :mssql, :derby, :oracle, :db2, :sqlanywhere do
629
+ @ds = @ds.extension(:exclude_or_null)
630
+ @ds.exclude_or_null(true=>:flag).map(:number).must_equal [2, 3]
631
+ @ds.exclude_or_null(false=>:flag).map(:number).must_equal [1, 3]
632
+ @ds.exclude_or_null(nil=>:flag).map(:number).must_equal [1, 2, 3]
633
+ end
594
634
  end
595
635
 
596
636
  describe "Simple Dataset operations in transactions" do
@@ -1553,20 +1593,20 @@ describe "Sequel::Dataset DSL support" do
1553
1593
 
1554
1594
  it "should work with endless ranges as hash values" do
1555
1595
  @ds.insert(20, 10)
1556
- @ds.filter(:a=>eval('30..')).all.must_equal []
1557
- @ds.filter(:a=>eval('20...')).all.must_equal [{:a=>20, :b=>10}]
1558
- @ds.filter(:a=>eval('20..')).all.must_equal [{:a=>20, :b=>10}]
1559
- @ds.filter(:a=>eval('10..')).all.must_equal [{:a=>20, :b=>10}]
1596
+ @ds.filter(:a=>eval('(30..)')).all.must_equal []
1597
+ @ds.filter(:a=>eval('(20...)')).all.must_equal [{:a=>20, :b=>10}]
1598
+ @ds.filter(:a=>eval('(20..)')).all.must_equal [{:a=>20, :b=>10}]
1599
+ @ds.filter(:a=>eval('(10..)')).all.must_equal [{:a=>20, :b=>10}]
1560
1600
  end if RUBY_VERSION >= '2.6'
1561
1601
 
1562
1602
  it "should work with startless ranges as hash values" do
1563
1603
  @ds.insert(20, 10)
1564
- @ds.filter(:a=>eval('..30')).all.must_equal [{:a=>20, :b=>10}]
1565
- @ds.filter(:a=>eval('...30')).all.must_equal [{:a=>20, :b=>10}]
1566
- @ds.filter(:a=>eval('..20')).all.must_equal [{:a=>20, :b=>10}]
1567
- @ds.filter(:a=>eval('...20')).all.must_equal []
1568
- @ds.filter(:a=>eval('..10')).all.must_equal []
1569
- @ds.filter(:a=>eval('...10')).all.must_equal []
1604
+ @ds.filter(:a=>eval('(..30)')).all.must_equal [{:a=>20, :b=>10}]
1605
+ @ds.filter(:a=>eval('(...30)')).all.must_equal [{:a=>20, :b=>10}]
1606
+ @ds.filter(:a=>eval('(..20)')).all.must_equal [{:a=>20, :b=>10}]
1607
+ @ds.filter(:a=>eval('(...20)')).all.must_equal []
1608
+ @ds.filter(:a=>eval('(..10)')).all.must_equal []
1609
+ @ds.filter(:a=>eval('(...10)')).all.must_equal []
1570
1610
 
1571
1611
  @ds.filter(:a=>eval('nil..nil')).all.must_equal [{:a=>20, :b=>10}]
1572
1612
  end if RUBY_VERSION >= '2.7'
@@ -2393,7 +2393,7 @@ describe "string_agg extension" do
2393
2393
  cspecify "should have string_agg return aggregated concatenation for distinct values", :mssql, :sqlite, :oracle, :db2, :derby do
2394
2394
  @ds.select_group(:id).select_append(Sequel.string_agg(:s).order(:s).distinct.as(:v)).map([:id, :v]).must_equal [[1, 'a,b,c'], [2, 'aa,bb']]
2395
2395
  end
2396
- end
2396
+ end if (DB.database_type != :postgres || DB.server_version >= 90000)
2397
2397
 
2398
2398
  describe "insert_conflict plugin" do
2399
2399
  before(:all) do
@@ -634,6 +634,15 @@ describe "Database schema modifiers" do
634
634
  @ds.all.must_equal [{:id=>10}, {:id=>20}]
635
635
  end
636
636
 
637
+ it "should set column defaults correctly if column has existing default" do
638
+ @db.create_table!(:items){Integer :id, :default=>10}
639
+ @ds.insert
640
+ @ds.all.must_equal [{:id=>10}]
641
+ @db.alter_table(:items){set_column_default :id, 20}
642
+ @ds.insert
643
+ @ds.all.must_equal [{:id=>10}, {:id=>20}]
644
+ end
645
+
637
646
  it "should set column defaults to nil correctly" do
638
647
  @db.create_table!(:items){Integer :id}
639
648
  @ds.insert(:id=>10)
@@ -62,4 +62,10 @@ if ENV['SEQUEL_FREEZE_DATABASE']
62
62
  DB.freeze
63
63
  end
64
64
 
65
- puts "running #{defined?(SEQUEL_ADAPTER_TEST) ? SEQUEL_ADAPTER_TEST : "integration (database type: #{DB.database_type})"} specs on #{RUBY_ENGINE} #{defined?(JRUBY_VERSION) ? JRUBY_VERSION : RUBY_VERSION} with #{DB.adapter_scheme} adapter"
65
+ version = if DB.respond_to?(:server_version)
66
+ DB.server_version
67
+ elsif DB.respond_to?(:sqlite_version)
68
+ DB.sqlite_version
69
+ end
70
+
71
+ puts "running #{defined?(SEQUEL_ADAPTER_TEST) ? SEQUEL_ADAPTER_TEST : "integration (database type: #{DB.database_type})"} specs on #{RUBY_ENGINE} #{defined?(JRUBY_VERSION) ? JRUBY_VERSION : RUBY_VERSION} with #{DB.adapter_scheme} adapter#{" (database version: #{version})" if version}"
@@ -326,12 +326,12 @@ describe "Sequel::Plugins.def_sequel_method" do
326
326
  it "should define methods using block" do
327
327
  m0 = Sequel::Plugins.def_sequel_method(@m, "x", 0){1}
328
328
  m0.must_be_kind_of Symbol
329
- m0.must_match /\A_sequel_x_\d+\z/
329
+ m0.must_match(/\A_sequel_x_\d+\z/)
330
330
  @scope.send(m0).must_equal 1
331
331
 
332
332
  m1 = Sequel::Plugins.def_sequel_method(@m, "x", 1){|x| [x, 2]}
333
333
  m1.must_be_kind_of Symbol
334
- m1.must_match /\A_sequel_x_\d+\z/
334
+ m1.must_match(/\A_sequel_x_\d+\z/)
335
335
  @scope.send(m1, 3).must_equal [3, 2]
336
336
  end
337
337
 
@@ -7,7 +7,7 @@ Sequel::Deprecation.backtrace_filter = lambda{|line, lineno| lineno < 4 || line
7
7
 
8
8
  ENV['MT_NO_PLUGINS'] = '1' # Work around stupid autoloading of plugins
9
9
  gem 'minitest'
10
- require 'minitest/autorun'
10
+ require 'minitest/global_expectations/autorun'
11
11
  require 'minitest/hooks/default'
12
12
 
13
13
  require_relative '../deprecation_helper'
@@ -1,4 +1,5 @@
1
1
  if ENV['WARNING']
2
2
  require 'warning'
3
3
  Warning.ignore([:missing_ivar, :method_redefined, :not_reached], File.dirname(File.dirname(__FILE__)))
4
+ Warning.dedup if Warning.respond_to?(:dedup)
4
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sequel
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.24.0
4
+ version: 5.29.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Evans
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-09-01 00:00:00.000000000 Z
11
+ date: 2020-02-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest-global_expectations
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: minitest-shared_description
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -208,6 +222,11 @@ extra_rdoc_files:
208
222
  - doc/release_notes/5.22.0.txt
209
223
  - doc/release_notes/5.23.0.txt
210
224
  - doc/release_notes/5.24.0.txt
225
+ - doc/release_notes/5.25.0.txt
226
+ - doc/release_notes/5.26.0.txt
227
+ - doc/release_notes/5.27.0.txt
228
+ - doc/release_notes/5.28.0.txt
229
+ - doc/release_notes/5.29.0.txt
211
230
  files:
212
231
  - CHANGELOG
213
232
  - MIT-LICENSE
@@ -303,6 +322,11 @@ files:
303
322
  - doc/release_notes/5.22.0.txt
304
323
  - doc/release_notes/5.23.0.txt
305
324
  - doc/release_notes/5.24.0.txt
325
+ - doc/release_notes/5.25.0.txt
326
+ - doc/release_notes/5.26.0.txt
327
+ - doc/release_notes/5.27.0.txt
328
+ - doc/release_notes/5.28.0.txt
329
+ - doc/release_notes/5.29.0.txt
306
330
  - doc/release_notes/5.3.0.txt
307
331
  - doc/release_notes/5.4.0.txt
308
332
  - doc/release_notes/5.5.0.txt
@@ -401,6 +425,7 @@ files:
401
425
  - lib/sequel/extensions/_model_constraint_validations.rb
402
426
  - lib/sequel/extensions/_model_pg_row.rb
403
427
  - lib/sequel/extensions/_pretty_table.rb
428
+ - lib/sequel/extensions/any_not_empty.rb
404
429
  - lib/sequel/extensions/arbitrary_servers.rb
405
430
  - lib/sequel/extensions/auto_literal_strings.rb
406
431
  - lib/sequel/extensions/blank.rb
@@ -421,6 +446,7 @@ files:
421
446
  - lib/sequel/extensions/error_sql.rb
422
447
  - lib/sequel/extensions/escaped_like.rb
423
448
  - lib/sequel/extensions/eval_inspect.rb
449
+ - lib/sequel/extensions/exclude_or_null.rb
424
450
  - lib/sequel/extensions/freeze_datasets.rb
425
451
  - lib/sequel/extensions/from_block.rb
426
452
  - lib/sequel/extensions/graph_each.rb
@@ -490,6 +516,7 @@ files:
490
516
  - lib/sequel/plugins/active_model.rb
491
517
  - lib/sequel/plugins/after_initialize.rb
492
518
  - lib/sequel/plugins/association_dependencies.rb
519
+ - lib/sequel/plugins/association_multi_add_remove.rb
493
520
  - lib/sequel/plugins/association_pks.rb
494
521
  - lib/sequel/plugins/association_proxies.rb
495
522
  - lib/sequel/plugins/auto_validations.rb
@@ -512,6 +539,7 @@ files:
512
539
  - lib/sequel/plugins/dirty.rb
513
540
  - lib/sequel/plugins/eager_each.rb
514
541
  - lib/sequel/plugins/eager_graph_eager.rb
542
+ - lib/sequel/plugins/empty_failure_backtraces.rb
515
543
  - lib/sequel/plugins/error_splitter.rb
516
544
  - lib/sequel/plugins/finder.rb
517
545
  - lib/sequel/plugins/force_encoding.rb
@@ -598,8 +626,10 @@ files:
598
626
  - spec/extensions/accessed_columns_spec.rb
599
627
  - spec/extensions/active_model_spec.rb
600
628
  - spec/extensions/after_initialize_spec.rb
629
+ - spec/extensions/any_not_empty_spec.rb
601
630
  - spec/extensions/arbitrary_servers_spec.rb
602
631
  - spec/extensions/association_dependencies_spec.rb
632
+ - spec/extensions/association_multi_add_remove_spec.rb
603
633
  - spec/extensions/association_pks_spec.rb
604
634
  - spec/extensions/association_proxies_spec.rb
605
635
  - spec/extensions/auto_literal_strings_spec.rb
@@ -636,10 +666,12 @@ files:
636
666
  - spec/extensions/eager_each_spec.rb
637
667
  - spec/extensions/eager_graph_eager_spec.rb
638
668
  - spec/extensions/empty_array_consider_nulls_spec.rb
669
+ - spec/extensions/empty_failure_backtraces_spec.rb
639
670
  - spec/extensions/error_splitter_spec.rb
640
671
  - spec/extensions/error_sql_spec.rb
641
672
  - spec/extensions/escaped_like_spec.rb
642
673
  - spec/extensions/eval_inspect_spec.rb
674
+ - spec/extensions/exclude_or_null_spec.rb
643
675
  - spec/extensions/finder_spec.rb
644
676
  - spec/extensions/force_encoding_spec.rb
645
677
  - spec/extensions/freeze_datasets_spec.rb
@@ -861,7 +893,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
861
893
  - !ruby/object:Gem::Version
862
894
  version: '0'
863
895
  requirements: []
864
- rubygems_version: 3.0.3
896
+ rubygems_version: 3.1.2
865
897
  signing_key:
866
898
  specification_version: 4
867
899
  summary: The Database Toolkit for Ruby