sequel 3.22.0 → 3.23.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.
@@ -163,6 +163,12 @@ describe Sequel::Model, "#eager" do
163
163
  MODEL_DB.sqls.length.should == 2
164
164
  end
165
165
 
166
+ it "should correctly handle a :select=>[] option to many_to_many" do
167
+ EagerAlbum.many_to_many :sgenres, :clone=>:genres, :select=>[]
168
+ a = EagerAlbum.eager(:sgenres).all
169
+ MODEL_DB.sqls.should == ['SELECT * FROM albums', "SELECT *, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON ((ag.genre_id = genres.id) AND (ag.album_id IN (1)))"]
170
+ end
171
+
166
172
  it "should eagerly load multiple associations in a single call" do
167
173
  a = EagerAlbum.eager(:genres, :tracks, :band).all
168
174
  a.should be_a_kind_of(Array)
@@ -646,6 +652,148 @@ describe Sequel::Model, "#eager" do
646
652
  a.should == EagerAlbum.load(:id => 1, :band_id => 2)
647
653
  a.al_genres.should == [EagerGenre.load(:id=>4)]
648
654
  end
655
+
656
+ it "should eagerly load a many_to_one association with custom eager block" do
657
+ a = EagerAlbum.eager(:band => proc {|ds| ds.select(:id, :name)}).all
658
+ a.should be_a_kind_of(Array)
659
+ a.size.should == 1
660
+ a.first.should be_a_kind_of(EagerAlbum)
661
+ a.first.values.should == {:id => 1, :band_id => 2}
662
+ MODEL_DB.sqls.should == ['SELECT * FROM albums', 'SELECT id, name FROM bands WHERE (bands.id IN (2))']
663
+ a = a.first
664
+ a.band.should be_a_kind_of(EagerBand)
665
+ a.band.values.should == {:id => 2}
666
+ MODEL_DB.sqls.length.should == 2
667
+ end
668
+
669
+ it "should eagerly load a one_to_one association with custom eager block" do
670
+ EagerAlbum.one_to_one :track, :class=>'EagerTrack', :key=>:album_id
671
+ a = EagerAlbum.eager(:track => proc {|ds| ds.select(:id)}).all
672
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
673
+ MODEL_DB.sqls.should == ['SELECT * FROM albums', 'SELECT id FROM tracks WHERE (tracks.album_id IN (1))']
674
+ a.first.track.should == EagerTrack.load(:id => 3, :album_id=>1)
675
+ MODEL_DB.sqls.length.should == 2
676
+ end
677
+
678
+ it "should eagerly load a one_to_many association with custom eager block" do
679
+ a = EagerAlbum.eager(:tracks => proc {|ds| ds.select(:id)}).all
680
+ a.should be_a_kind_of(Array)
681
+ a.size.should == 1
682
+ a.first.should be_a_kind_of(EagerAlbum)
683
+ a.first.values.should == {:id => 1, :band_id => 2}
684
+ MODEL_DB.sqls.should == ['SELECT * FROM albums', 'SELECT id FROM tracks WHERE (tracks.album_id IN (1))']
685
+ a = a.first
686
+ a.tracks.should be_a_kind_of(Array)
687
+ a.tracks.size.should == 1
688
+ a.tracks.first.should be_a_kind_of(EagerTrack)
689
+ a.tracks.first.values.should == {:id => 3, :album_id=>1}
690
+ MODEL_DB.sqls.length.should == 2
691
+ end
692
+
693
+ it "should eagerly load a many_to_many association with custom eager block" do
694
+ a = EagerAlbum.eager(:genres => proc {|ds| ds.select(:name)}).all
695
+ a.should be_a_kind_of(Array)
696
+ a.size.should == 1
697
+ a.first.should be_a_kind_of(EagerAlbum)
698
+ a.first.values.should == {:id => 1, :band_id => 2}
699
+ MODEL_DB.sqls.should == ['SELECT * FROM albums', "SELECT name, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON ((ag.genre_id = genres.id) AND (ag.album_id IN (1)))"]
700
+ a = a.first
701
+ a.genres.should be_a_kind_of(Array)
702
+ a.genres.size.should == 1
703
+ a.genres.first.should be_a_kind_of(EagerGenre)
704
+ a.genres.first.values.should == {:id => 4}
705
+ MODEL_DB.sqls.length.should == 2
706
+ end
707
+
708
+ it "should allow cascading of eager loading within a custom eager block" do
709
+ a = EagerTrack.eager(:album => proc {|ds| ds.eager(:band => :members)}).all
710
+ a.should be_a_kind_of(Array)
711
+ a.size.should == 1
712
+ a.first.should be_a_kind_of(EagerTrack)
713
+ a.first.values.should == {:id => 3, :album_id => 1}
714
+ MODEL_DB.sqls.length.should == 4
715
+ MODEL_DB.sqls.should == ['SELECT * FROM tracks',
716
+ 'SELECT * FROM albums WHERE (albums.id IN (1))',
717
+ 'SELECT * FROM bands WHERE (bands.id IN (2))',
718
+ "SELECT members.*, bm.band_id AS x_foreign_key_x FROM members INNER JOIN bm ON ((bm.member_id = members.id) AND (bm.band_id IN (2)))"]
719
+ a = a.first
720
+ a.album.should be_a_kind_of(EagerAlbum)
721
+ a.album.values.should == {:id => 1, :band_id => 2}
722
+ a.album.band.should be_a_kind_of(EagerBand)
723
+ a.album.band.values.should == {:id => 2}
724
+ a.album.band.members.should be_a_kind_of(Array)
725
+ a.album.band.members.size.should == 1
726
+ a.album.band.members.first.should be_a_kind_of(EagerBandMember)
727
+ a.album.band.members.first.values.should == {:id => 5}
728
+ MODEL_DB.sqls.length.should == 4
729
+ end
730
+
731
+ it "should allow cascading of eager loading with custom callback with hash value" do
732
+ a = EagerTrack.eager(:album=>{proc{|ds| ds.select(:id, :band_id)}=>{:band => :members}}).all
733
+ a.should be_a_kind_of(Array)
734
+ a.size.should == 1
735
+ a.first.should be_a_kind_of(EagerTrack)
736
+ a.first.values.should == {:id => 3, :album_id => 1}
737
+ MODEL_DB.sqls.length.should == 4
738
+ MODEL_DB.sqls.should == ['SELECT * FROM tracks',
739
+ 'SELECT id, band_id FROM albums WHERE (albums.id IN (1))',
740
+ 'SELECT * FROM bands WHERE (bands.id IN (2))',
741
+ "SELECT members.*, bm.band_id AS x_foreign_key_x FROM members INNER JOIN bm ON ((bm.member_id = members.id) AND (bm.band_id IN (2)))"]
742
+ a = a.first
743
+ a.album.should be_a_kind_of(EagerAlbum)
744
+ a.album.values.should == {:id => 1, :band_id => 2}
745
+ a.album.band.should be_a_kind_of(EagerBand)
746
+ a.album.band.values.should == {:id => 2}
747
+ a.album.band.members.should be_a_kind_of(Array)
748
+ a.album.band.members.size.should == 1
749
+ a.album.band.members.first.should be_a_kind_of(EagerBandMember)
750
+ a.album.band.members.first.values.should == {:id => 5}
751
+ MODEL_DB.sqls.length.should == 4
752
+ end
753
+
754
+ it "should allow cascading of eager loading with custom callback with symbol value" do
755
+ a = EagerTrack.eager(:album=>{proc{|ds| ds.select(:id, :band_id)}=>:band}).all
756
+ a.should be_a_kind_of(Array)
757
+ a.size.should == 1
758
+ a.first.should be_a_kind_of(EagerTrack)
759
+ a.first.values.should == {:id => 3, :album_id => 1}
760
+ MODEL_DB.sqls.length.should == 3
761
+ MODEL_DB.sqls.should == ['SELECT * FROM tracks',
762
+ 'SELECT id, band_id FROM albums WHERE (albums.id IN (1))',
763
+ 'SELECT * FROM bands WHERE (bands.id IN (2))']
764
+ a = a.first
765
+ a.album.should be_a_kind_of(EagerAlbum)
766
+ a.album.values.should == {:id => 1, :band_id => 2}
767
+ a.album.band.should be_a_kind_of(EagerBand)
768
+ a.album.band.values.should == {:id => 2}
769
+ MODEL_DB.sqls.length.should == 3
770
+ end
771
+
772
+ it "should allow cascading of eager loading with custom callback with array value" do
773
+ a = EagerTrack.eager(:album=>{proc{|ds| ds.select(:id, :band_id)}=>[:band, :band_name]}).all
774
+ a.should be_a_kind_of(Array)
775
+ a.size.should == 1
776
+ a.first.should be_a_kind_of(EagerTrack)
777
+ a.first.values.should == {:id => 3, :album_id => 1}
778
+ MODEL_DB.sqls.length.should == 4
779
+ MODEL_DB.sqls[0..1].should == ['SELECT * FROM tracks',
780
+ 'SELECT id, band_id FROM albums WHERE (albums.id IN (1))']
781
+ MODEL_DB.sqls[2..-1].sort.should == ['SELECT * FROM bands WHERE (bands.id IN (2))',
782
+ 'SELECT id, name FROM bands WHERE (bands.id IN (2))']
783
+ a = a.first
784
+ a.album.should be_a_kind_of(EagerAlbum)
785
+ a.album.values.should == {:id => 1, :band_id => 2}
786
+ a.album.band.should be_a_kind_of(EagerBand)
787
+ a.album.band.values.should == {:id => 2}
788
+ a.album.band_name.should be_a_kind_of(EagerBand)
789
+ a.album.band_name.values.should == {:id => 2}
790
+ MODEL_DB.sqls.length.should == 4
791
+ end
792
+
793
+ it "should call both association and custom eager blocks" do
794
+ EagerBand.eager(:good_albums => proc {|ds| ds.select(:name)}).all
795
+ MODEL_DB.sqls.should == ['SELECT * FROM bands', "SELECT name FROM albums WHERE ((albums.band_id IN (2)) AND (name = 'good'))"]
796
+ end
649
797
  end
650
798
 
651
799
  describe Sequel::Model, "#eager_graph" do
@@ -664,6 +812,11 @@ describe Sequel::Model, "#eager_graph" do
664
812
  c.instance_variable_set(:@columns, (@columns.dup if @columns))
665
813
  c
666
814
  end
815
+ def select_columns(*a)
816
+ ds = select(*a)
817
+ ds.instance_variable_set(:@columns, a)
818
+ ds
819
+ end
667
820
  end
668
821
 
669
822
  class ::GraphAlbum < Sequel::Model(:albums)
@@ -1284,13 +1437,17 @@ describe Sequel::Model, "#eager_graph" do
1284
1437
  GraphAlbum.many_to_one :active_band, :class=>'GraphBand', :key=>:band_id, :eager_grapher=>proc{|ds, aa, ta| ds.graph(GraphBand, {:active=>true}, :table_alias=>aa, :join_type=>:inner)}
1285
1438
  GraphAlbum.eager_graph(:active_band).sql.should == "SELECT albums.id, albums.band_id, active_band.id AS active_band_id, active_band.vocalist_id FROM albums INNER JOIN bands AS active_band ON (active_band.active IS TRUE)"
1286
1439
 
1287
- GraphAlbum.one_to_many :right_tracks, :class=>'GraphTrack', :key=>:album_id, :eager_grapher=>proc{|ds, aa, ta| ds.graph(GraphTrack, nil, :join_type=>:natural, :table_alias=>aa)}
1440
+ GraphAlbum.one_to_many :right_tracks, :class=>'GraphTrack', :key=>:album_id, :eager_grapher=>proc{|eo| eo[:self].graph(GraphTrack, nil, :join_type=>:natural, :table_alias=>eo[:table_alias])}
1288
1441
  GraphAlbum.eager_graph(:right_tracks).sql.should == 'SELECT albums.id, albums.band_id, right_tracks.id AS right_tracks_id, right_tracks.album_id FROM albums NATURAL JOIN tracks AS right_tracks'
1289
1442
 
1290
1443
  GraphAlbum.many_to_many :active_genres, :class=>'GraphGenre', :eager_grapher=>proc{|ds, aa, ta| ds.graph(:ag, {:album_id=>:id}, :table_alias=>:a123, :implicit_qualifier=>ta).graph(GraphGenre, [:album_id], :table_alias=>aa)}
1291
1444
  GraphAlbum.eager_graph(:active_genres).sql.should == "SELECT albums.id, albums.band_id, active_genres.id AS active_genres_id FROM albums LEFT OUTER JOIN ag AS a123 ON (a123.album_id = albums.id) LEFT OUTER JOIN genres AS active_genres USING (album_id)"
1292
1445
  end
1293
1446
 
1447
+ it "should raise an error if you use an :eager_grapher proc with the wrong arity" do
1448
+ proc{GraphAlbum.many_to_one :special_band, :eager_grapher=>proc{|a, b|}}.should raise_error(Sequel::Error)
1449
+ end
1450
+
1294
1451
  it "should respect the association's :graph_only_conditions option" do
1295
1452
  GraphAlbum.many_to_one :active_band, :class=>'GraphBand', :key=>:band_id, :graph_only_conditions=>{:active=>true}
1296
1453
  GraphAlbum.eager_graph(:active_band).sql.should == "SELECT albums.id, albums.band_id, active_band.id AS active_band_id, active_band.vocalist_id FROM albums LEFT OUTER JOIN bands AS active_band ON (active_band.active IS TRUE)"
@@ -1367,6 +1524,8 @@ describe Sequel::Model, "#eager_graph" do
1367
1524
  as = ds.all
1368
1525
  as.should == [GraphAlbum.load(:id=>3, :band_id=>2)]
1369
1526
  as.first.inner_genres.should == [GraphGenre.load(:id=>5), GraphGenre.load(:id=>6)]
1527
+ GraphAlbum.set_primary_key :id
1528
+ GraphGenre.set_primary_key :id
1370
1529
  end
1371
1530
 
1372
1531
  it "should handle eager loading with schemas and aliases of different types" do
@@ -1392,4 +1551,113 @@ describe Sequel::Model, "#eager_graph" do
1392
1551
  ds = c1.join(:s__t, [:b_id]).eager_graph(:a_genres)
1393
1552
  ds.sql.should == 'SELECT a.id, a_genres.id AS a_genres_id FROM (SELECT * FROM s.a INNER JOIN s.t USING (b_id)) AS a LEFT OUTER JOIN s.ag AS ag ON (ag.album_id = a.id) LEFT OUTER JOIN s.g AS a_genres ON (a_genres.id = ag.genre_id)'
1394
1553
  end
1554
+
1555
+ it "should eagerly load a many_to_one association with a custom callback" do
1556
+ ds = GraphAlbum.eager_graph(:band => proc {|ds| ds.select_columns(:id)})
1557
+ ds.sql.should == 'SELECT albums.id, albums.band_id, band.id AS band_id_0 FROM albums LEFT OUTER JOIN (SELECT id FROM bands) AS band ON (band.id = albums.band_id)'
1558
+ def ds.fetch_rows(sql, &block)
1559
+ yield({:id=>1, :band_id=>2, :band_id_0=>2})
1560
+ end
1561
+ a = ds.all
1562
+ a.should be_a_kind_of(Array)
1563
+ a.size.should == 1
1564
+ a.first.should be_a_kind_of(GraphAlbum)
1565
+ a.first.values.should == {:id => 1, :band_id => 2}
1566
+ a = a.first
1567
+ a.band.should be_a_kind_of(GraphBand)
1568
+ a.band.values.should == {:id => 2}
1569
+ end
1570
+
1571
+ it "should eagerly load a one_to_one association with a custom callback" do
1572
+ GraphAlbum.one_to_one :track, :class=>'GraphTrack', :key=>:album_id
1573
+ ds = GraphAlbum.eager_graph(:track => proc {|ds| ds.select_columns(:album_id)})
1574
+ ds.sql.should == 'SELECT albums.id, albums.band_id, track.album_id FROM albums LEFT OUTER JOIN (SELECT album_id FROM tracks) AS track ON (track.album_id = albums.id)'
1575
+ def ds.fetch_rows(sql, &block)
1576
+ yield({:id=>1, :band_id=>2, :album_id=>1})
1577
+ end
1578
+ a = ds.all
1579
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1580
+ a.first.track.should == GraphTrack.load(:album_id=>1)
1581
+ end
1582
+
1583
+ it "should eagerly load a one_to_many association with a custom callback" do
1584
+ ds = GraphAlbum.eager_graph(:tracks => proc {|ds| ds.select_columns(:album_id)})
1585
+ ds.sql.should == 'SELECT albums.id, albums.band_id, tracks.album_id FROM albums LEFT OUTER JOIN (SELECT album_id FROM tracks) AS tracks ON (tracks.album_id = albums.id)'
1586
+ def ds.fetch_rows(sql, &block)
1587
+ yield({:id=>1, :band_id=>2, :album_id=>1})
1588
+ end
1589
+ a = ds.all
1590
+ a.should be_a_kind_of(Array)
1591
+ a.size.should == 1
1592
+ a.first.should be_a_kind_of(GraphAlbum)
1593
+ a.first.values.should == {:id => 1, :band_id => 2}
1594
+ a = a.first
1595
+ a.tracks.should be_a_kind_of(Array)
1596
+ a.tracks.size.should == 1
1597
+ a.tracks.first.should be_a_kind_of(GraphTrack)
1598
+ a.tracks.first.values.should == {:album_id=>1}
1599
+ end
1600
+
1601
+ it "should eagerly load a many_to_many association with a custom callback" do
1602
+ ds = GraphAlbum.eager_graph(:genres => proc {|ds| ds.select_columns(:id)})
1603
+ ds.sql.should == 'SELECT albums.id, albums.band_id, genres.id AS genres_id FROM albums LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN (SELECT id FROM genres) AS genres ON (genres.id = ag.genre_id)'
1604
+ def ds.fetch_rows(sql, &block)
1605
+ yield({:id=>1, :band_id=>2, :genres_id=>4})
1606
+ end
1607
+ a = ds.all
1608
+ a.should be_a_kind_of(Array)
1609
+ a.size.should == 1
1610
+ a.first.should be_a_kind_of(GraphAlbum)
1611
+ a.first.values.should == {:id => 1, :band_id => 2}
1612
+ a = a.first
1613
+ a.genres.should be_a_kind_of(Array)
1614
+ a.genres.size.should == 1
1615
+ a.genres.first.should be_a_kind_of(GraphGenre)
1616
+ a.genres.first.values.should == {:id => 4}
1617
+ end
1618
+
1619
+ it "should allow cascading of eager loading with a custom callback with hash value" do
1620
+ ds = GraphTrack.eager_graph(:album=>{proc{|ds| ds.select_columns(:id, :band_id)}=>{:band=>:members}})
1621
+ ds.sql.should == 'SELECT tracks.id, tracks.album_id, album.id AS album_id_0, album.band_id, band.id AS band_id_0, band.vocalist_id, members.id AS members_id FROM tracks LEFT OUTER JOIN (SELECT id, band_id FROM albums) AS album ON (album.id = tracks.album_id) LEFT OUTER JOIN bands AS band ON (band.id = album.band_id) LEFT OUTER JOIN bm ON (bm.band_id = band.id) LEFT OUTER JOIN members ON (members.id = bm.member_id)'
1622
+ def ds.fetch_rows(sql, &block)
1623
+ yield({:id=>3, :album_id=>1, :album_id_0=>1, :band_id=>2, :members_id=>5, :band_id_0=>2, :vocalist_id=>6})
1624
+ end
1625
+ a = ds.all
1626
+ a.should be_a_kind_of(Array)
1627
+ a.size.should == 1
1628
+ a.first.should be_a_kind_of(GraphTrack)
1629
+ a.first.values.should == {:id => 3, :album_id => 1}
1630
+ a = a.first
1631
+ a.album.should be_a_kind_of(GraphAlbum)
1632
+ a.album.values.should == {:id => 1, :band_id => 2}
1633
+ a.album.band.should be_a_kind_of(GraphBand)
1634
+ a.album.band.values.should == {:id => 2, :vocalist_id=>6}
1635
+ a.album.band.members.should be_a_kind_of(Array)
1636
+ a.album.band.members.size.should == 1
1637
+ a.album.band.members.first.should be_a_kind_of(GraphBandMember)
1638
+ a.album.band.members.first.values.should == {:id => 5}
1639
+ end
1640
+
1641
+ it "should allow cascading of eager loading with a custom callback with array value" do
1642
+ ds = GraphTrack.eager_graph(:album=>{proc{|ds| ds.select_columns(:id, :band_id)}=>[:band, :tracks]})
1643
+ ds.sql.should == 'SELECT tracks.id, tracks.album_id, album.id AS album_id_0, album.band_id, band.id AS band_id_0, band.vocalist_id, tracks_0.id AS tracks_0_id, tracks_0.album_id AS tracks_0_album_id FROM tracks LEFT OUTER JOIN (SELECT id, band_id FROM albums) AS album ON (album.id = tracks.album_id) LEFT OUTER JOIN bands AS band ON (band.id = album.band_id) LEFT OUTER JOIN tracks AS tracks_0 ON (tracks_0.album_id = album.id)'
1644
+ def ds.fetch_rows(sql, &block)
1645
+ yield({:id=>3, :album_id=>1, :album_id_0=>1, :band_id=>2, :band_id_0=>2, :vocalist_id=>6, :tracks_0_id=>3, :tracks_0_album_id=>1})
1646
+ end
1647
+ a = ds.all
1648
+ a.should be_a_kind_of(Array)
1649
+ a.size.should == 1
1650
+ a.first.should be_a_kind_of(GraphTrack)
1651
+ a.first.values.should == {:id => 3, :album_id => 1}
1652
+ a = a.first
1653
+ a.album.should be_a_kind_of(GraphAlbum)
1654
+ a.album.values.should == {:id => 1, :band_id => 2}
1655
+ a.album.band.should be_a_kind_of(GraphBand)
1656
+ a.album.band.values.should == {:id => 2, :vocalist_id=>6}
1657
+ a.album.tracks.should be_a_kind_of(Array)
1658
+ a.album.tracks.size.should == 1
1659
+ a.album.tracks.first.should be_a_kind_of(GraphTrack)
1660
+ a.album.tracks.first.values.should == {:id => 3, :album_id => 1}
1661
+ end
1662
+
1395
1663
  end
@@ -63,6 +63,12 @@ describe "Model#save" do
63
63
  MODEL_DB.sqls.should == ["INSERT INTO items (y) VALUES (2)"]
64
64
  end
65
65
 
66
+ it "should not use dataset's insert_select method if specific columns are selected" do
67
+ ds = @c.dataset = @c.dataset.select(:y)
68
+ ds.should_not_receive(:insert_select)
69
+ @c.new(:x => 1).save
70
+ end
71
+
66
72
  it "should use value returned by insert as the primary key and refresh the object" do
67
73
  @c.dataset.meta_def(:insert){|h| super(h); 13}
68
74
  o = @c.new(:x => 11)
@@ -8,6 +8,11 @@ unless Sequel.const_defined?('Model')
8
8
  require 'sequel/model'
9
9
  end
10
10
 
11
+ if ENV['SEQUEL_COLUMNS_INTROSPECTION']
12
+ Sequel.extension :columns_introspection
13
+ Sequel::Dataset.introspect_all_columns
14
+ end
15
+
11
16
  class MockDataset < Sequel::Dataset
12
17
  def insert(*args)
13
18
  @db.execute insert_sql(*args)
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sequel
3
3
  version: !ruby/object:Gem::Version
4
- hash: 95
4
+ hash: 91
5
5
  prerelease: false
6
6
  segments:
7
7
  - 3
8
- - 22
8
+ - 23
9
9
  - 0
10
- version: 3.22.0
10
+ version: 3.23.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Jeremy Evans
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-04-01 00:00:00 -07:00
18
+ date: 2011-05-02 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies: []
21
21
 
@@ -86,6 +86,7 @@ extra_rdoc_files:
86
86
  - doc/release_notes/3.20.0.txt
87
87
  - doc/release_notes/3.21.0.txt
88
88
  - doc/release_notes/3.22.0.txt
89
+ - doc/release_notes/3.23.0.txt
89
90
  files:
90
91
  - MIT-LICENSE
91
92
  - CHANGELOG
@@ -139,6 +140,7 @@ files:
139
140
  - doc/release_notes/3.20.0.txt
140
141
  - doc/release_notes/3.21.0.txt
141
142
  - doc/release_notes/3.22.0.txt
143
+ - doc/release_notes/3.23.0.txt
142
144
  - doc/sharding.rdoc
143
145
  - doc/sql.rdoc
144
146
  - doc/virtual_rows.rdoc
@@ -218,6 +220,8 @@ files:
218
220
  - spec/extensions/xml_serializer_spec.rb
219
221
  - spec/extensions/to_dot_spec.rb
220
222
  - spec/extensions/association_autoreloading_spec.rb
223
+ - spec/extensions/serialization_modification_detection_spec.rb
224
+ - spec/extensions/columns_introspection_spec.rb
221
225
  - spec/integration/associations_test.rb
222
226
  - spec/integration/database_test.rb
223
227
  - spec/integration/dataset_test.rb
@@ -366,6 +370,7 @@ files:
366
370
  - lib/sequel/extensions/string_date_time.rb
367
371
  - lib/sequel/extensions/thread_local_timezones.rb
368
372
  - lib/sequel/extensions/to_dot.rb
373
+ - lib/sequel/extensions/columns_introspection.rb
369
374
  - lib/sequel/metaprogramming.rb
370
375
  - lib/sequel/model.rb
371
376
  - lib/sequel/model/associations.rb
@@ -412,6 +417,7 @@ files:
412
417
  - lib/sequel/plugins/tree.rb
413
418
  - lib/sequel/plugins/xml_serializer.rb
414
419
  - lib/sequel/plugins/association_autoreloading.rb
420
+ - lib/sequel/plugins/serialization_modification_detection.rb
415
421
  - lib/sequel/sql.rb
416
422
  - lib/sequel/timezones.rb
417
423
  - lib/sequel/version.rb