sequel 3.25.0 → 3.26.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. data/CHANGELOG +28 -0
  2. data/README.rdoc +3 -3
  3. data/Rakefile +17 -11
  4. data/doc/release_notes/3.26.0.txt +88 -0
  5. data/lib/sequel/adapters/ado.rb +10 -0
  6. data/lib/sequel/adapters/do.rb +12 -0
  7. data/lib/sequel/adapters/jdbc.rb +6 -6
  8. data/lib/sequel/adapters/mysql.rb +8 -2
  9. data/lib/sequel/adapters/mysql2.rb +5 -1
  10. data/lib/sequel/adapters/odbc.rb +10 -2
  11. data/lib/sequel/adapters/oracle.rb +5 -1
  12. data/lib/sequel/adapters/postgres.rb +10 -4
  13. data/lib/sequel/adapters/shared/access.rb +11 -0
  14. data/lib/sequel/adapters/shared/oracle.rb +0 -4
  15. data/lib/sequel/adapters/shared/postgres.rb +0 -12
  16. data/lib/sequel/adapters/tinytds.rb +9 -0
  17. data/lib/sequel/connection_pool.rb +1 -1
  18. data/lib/sequel/connection_pool/threaded.rb +3 -2
  19. data/lib/sequel/core.rb +1 -1
  20. data/lib/sequel/database/connecting.rb +3 -3
  21. data/lib/sequel/database/dataset.rb +1 -1
  22. data/lib/sequel/database/dataset_defaults.rb +1 -1
  23. data/lib/sequel/database/logging.rb +1 -1
  24. data/lib/sequel/database/misc.rb +23 -6
  25. data/lib/sequel/database/query.rb +16 -15
  26. data/lib/sequel/database/schema_methods.rb +21 -16
  27. data/lib/sequel/dataset/actions.rb +19 -16
  28. data/lib/sequel/dataset/features.rb +8 -2
  29. data/lib/sequel/dataset/graph.rb +1 -1
  30. data/lib/sequel/dataset/misc.rb +29 -9
  31. data/lib/sequel/dataset/mutation.rb +3 -3
  32. data/lib/sequel/dataset/prepared_statements.rb +11 -11
  33. data/lib/sequel/dataset/query.rb +28 -7
  34. data/lib/sequel/dataset/sql.rb +2 -2
  35. data/lib/sequel/extensions/migration.rb +1 -0
  36. data/lib/sequel/model.rb +5 -4
  37. data/lib/sequel/model/associations.rb +487 -328
  38. data/lib/sequel/model/base.rb +43 -26
  39. data/lib/sequel/model/exceptions.rb +2 -0
  40. data/lib/sequel/plugins/identity_map.rb +111 -4
  41. data/lib/sequel/plugins/sharding.rb +12 -20
  42. data/lib/sequel/plugins/xml_serializer.rb +2 -2
  43. data/lib/sequel/version.rb +1 -1
  44. data/spec/adapters/postgres_spec.rb +0 -6
  45. data/spec/core/connection_pool_spec.rb +6 -0
  46. data/spec/core/database_spec.rb +12 -0
  47. data/spec/core/schema_spec.rb +9 -2
  48. data/spec/extensions/identity_map_spec.rb +162 -0
  49. data/spec/extensions/many_through_many_spec.rb +3 -19
  50. data/spec/extensions/xml_serializer_spec.rb +4 -4
  51. data/spec/model/eager_loading_spec.rb +7 -21
  52. data/spec/model/record_spec.rb +23 -0
  53. metadata +36 -34
@@ -13,6 +13,11 @@ describe "Sequel::Plugins::IdentityMap" do
13
13
  execute(sql)
14
14
  yield h
15
15
  end
16
+ def self.waw_identity_map(&block) # with and without
17
+ with_identity_map(&block)
18
+ db.reset
19
+ yield
20
+ end
16
21
  end
17
22
  class ::IdentityMapAlbum < ::IdentityMapModel
18
23
  columns :artist_id
@@ -216,4 +221,161 @@ describe "Sequel::Plugins::IdentityMap" do
216
221
  MODEL_DB.sqls.length.should == 2
217
222
  end
218
223
  end
224
+
225
+ it "should not override custom :eager_loaders for many_to_many associations" do
226
+ @c1.columns :id
227
+ @c2.columns :id
228
+ c = @c2
229
+ @c1.many_to_many :artists, :class=>@c2, :left_key=>:album_id, :right_key=>:artist_id, :join_table=>:aa, :eager_loader=>(proc do |eo|
230
+ eo[:rows].each{|object| object.associations[:artists] = [c.load(:id=>object.id)]}
231
+ end)
232
+ ds = @c1.dataset
233
+ def ds.fetch_rows(sql)
234
+ execute(sql)
235
+ yield({:id=>1})
236
+ yield({:id=>2})
237
+ yield({:id=>3})
238
+ end
239
+
240
+ @c.waw_identity_map do
241
+ MODEL_DB.sqls.length.should == 0
242
+ a = @c1.eager(:artists).all
243
+ MODEL_DB.sqls.length.should == 1
244
+ a.should == [@c1.load(:id=>1), @c1.load(:id=>2), @c1.load(:id=>3)]
245
+ a.map{|x| x.artists}.should == [[@c2.load(:id=>1)], [@c2.load(:id=>2)], [@c2.load(:id=>3)]]
246
+ MODEL_DB.sqls.length.should == 1
247
+ end
248
+ end
249
+
250
+ it "should work correctly when eagerly loading many_to_many associations" do
251
+ @c1.columns :id
252
+ @c2.columns :id
253
+ @c1.many_to_many :artists, :class=>@c2, :left_key=>:album_id, :right_key=>:artist_id, :join_table=>:aa
254
+ ds = @c1.dataset
255
+ def ds.fetch_rows(sql)
256
+ execute(sql)
257
+ yield({:id=>1})
258
+ yield({:id=>2})
259
+ yield({:id=>3})
260
+ end
261
+ ds = @c2.dataset
262
+ def ds.fetch_rows(sql)
263
+ execute(sql)
264
+ yield({:id=>1, :x_foreign_key_x=>1})
265
+ yield({:id=>1, :x_foreign_key_x=>2})
266
+ yield({:id=>2, :x_foreign_key_x=>1})
267
+ yield({:id=>2, :x_foreign_key_x=>2})
268
+ yield({:id=>3, :x_foreign_key_x=>1})
269
+ yield({:id=>3, :x_foreign_key_x=>1})
270
+ end
271
+
272
+ @c.waw_identity_map do
273
+ MODEL_DB.sqls.length.should == 0
274
+ a = @c1.eager(:artists).all
275
+ MODEL_DB.sqls.length.should == 2
276
+ a.should == [@c1.load(:id=>1), @c1.load(:id=>2), @c1.load(:id=>3)]
277
+ a.map{|x| x.artists}.should == [[@c2.load(:id=>1), @c2.load(:id=>2), @c2.load(:id=>3), @c2.load(:id=>3)], [@c2.load(:id=>1), @c2.load(:id=>2)], []]
278
+ MODEL_DB.sqls.length.should == 2
279
+ end
280
+ end
281
+
282
+ it "should work correctly when eagerly loading many_to_many associations with composite keys" do
283
+ @c1.columns :id, :id2
284
+ @c2.columns :id
285
+ @c1.set_primary_key :id, :id2
286
+ @c1.many_to_many :artists, :class=>@c2, :left_key=>[:album_id1, :album_id2], :right_key=>:artist_id, :join_table=>:aa
287
+ ds = @c1.dataset
288
+ def ds.fetch_rows(sql)
289
+ execute(sql)
290
+ yield({:id=>1, :id2=>4})
291
+ yield({:id=>2, :id2=>5})
292
+ yield({:id=>3, :id2=>6})
293
+ end
294
+ ds = @c2.dataset
295
+ def ds.fetch_rows(sql)
296
+ execute(sql)
297
+ yield({:id=>1, :x_foreign_key_0_x=>1, :x_foreign_key_1_x=>4})
298
+ yield({:id=>1, :x_foreign_key_0_x=>2, :x_foreign_key_1_x=>5})
299
+ yield({:id=>2, :x_foreign_key_0_x=>1, :x_foreign_key_1_x=>4})
300
+ yield({:id=>2, :x_foreign_key_0_x=>2, :x_foreign_key_1_x=>5})
301
+ yield({:id=>3, :x_foreign_key_0_x=>1, :x_foreign_key_1_x=>4})
302
+ yield({:id=>3, :x_foreign_key_0_x=>1, :x_foreign_key_1_x=>4})
303
+ end
304
+
305
+ @c.waw_identity_map do
306
+ MODEL_DB.sqls.length.should == 0
307
+ a = @c1.eager(:artists).all
308
+ MODEL_DB.sqls.length.should == 2
309
+ a.should == [@c1.load(:id=>1, :id2=>4), @c1.load(:id=>2, :id2=>5), @c1.load(:id=>3, :id2=>6)]
310
+ a.map{|x| x.artists}.should == [[@c2.load(:id=>1), @c2.load(:id=>2), @c2.load(:id=>3), @c2.load(:id=>3)], [@c2.load(:id=>1), @c2.load(:id=>2)], []]
311
+ MODEL_DB.sqls.length.should == 2
312
+ end
313
+ end
314
+
315
+ it "should work correctly when eagerly loading many_through_many associations" do
316
+ @c1.columns :id
317
+ @c2.columns :id
318
+ @c1.plugin :many_through_many
319
+ @c1.many_through_many :artists, [[:aa, :album_id, :artist_id]], :class=>@c2
320
+ ds = @c1.dataset
321
+ def ds.fetch_rows(sql)
322
+ execute(sql)
323
+ yield({:id=>1})
324
+ yield({:id=>2})
325
+ yield({:id=>3})
326
+ end
327
+ ds = @c2.dataset
328
+ def ds.fetch_rows(sql)
329
+ execute(sql)
330
+ yield({:id=>1, :x_foreign_key_x=>1})
331
+ yield({:id=>1, :x_foreign_key_x=>2})
332
+ yield({:id=>2, :x_foreign_key_x=>1})
333
+ yield({:id=>2, :x_foreign_key_x=>2})
334
+ yield({:id=>3, :x_foreign_key_x=>1})
335
+ yield({:id=>3, :x_foreign_key_x=>1})
336
+ end
337
+
338
+ @c.waw_identity_map do
339
+ MODEL_DB.sqls.length.should == 0
340
+ a = @c1.eager(:artists).all
341
+ MODEL_DB.sqls.length.should == 2
342
+ a.should == [@c1.load(:id=>1), @c1.load(:id=>2), @c1.load(:id=>3)]
343
+ a.map{|x| x.artists}.should == [[@c2.load(:id=>1), @c2.load(:id=>2), @c2.load(:id=>3), @c2.load(:id=>3)], [@c2.load(:id=>1), @c2.load(:id=>2)], []]
344
+ MODEL_DB.sqls.length.should == 2
345
+ end
346
+ end
347
+
348
+ it "should work correctly when eagerly loading many_to_many associations with composite keys" do
349
+ @c1.columns :id, :id2
350
+ @c2.columns :id
351
+ @c1.set_primary_key :id, :id2
352
+ @c1.plugin :many_through_many
353
+ @c1.many_through_many :artists, [[:aa, [:album_id1, :album_id2], :artist_id]], :class=>@c2
354
+ ds = @c1.dataset
355
+ def ds.fetch_rows(sql)
356
+ execute(sql)
357
+ yield({:id=>1, :id2=>4})
358
+ yield({:id=>2, :id2=>5})
359
+ yield({:id=>3, :id2=>6})
360
+ end
361
+ ds = @c2.dataset
362
+ def ds.fetch_rows(sql)
363
+ execute(sql)
364
+ yield({:id=>1, :x_foreign_key_0_x=>1, :x_foreign_key_1_x=>4})
365
+ yield({:id=>1, :x_foreign_key_0_x=>2, :x_foreign_key_1_x=>5})
366
+ yield({:id=>2, :x_foreign_key_0_x=>1, :x_foreign_key_1_x=>4})
367
+ yield({:id=>2, :x_foreign_key_0_x=>2, :x_foreign_key_1_x=>5})
368
+ yield({:id=>3, :x_foreign_key_0_x=>1, :x_foreign_key_1_x=>4})
369
+ yield({:id=>3, :x_foreign_key_0_x=>1, :x_foreign_key_1_x=>4})
370
+ end
371
+
372
+ @c.waw_identity_map do
373
+ MODEL_DB.sqls.length.should == 0
374
+ a = @c1.eager(:artists).all
375
+ MODEL_DB.sqls.length.should == 2
376
+ a.should == [@c1.load(:id=>1, :id2=>4), @c1.load(:id=>2, :id2=>5), @c1.load(:id=>3, :id2=>6)]
377
+ a.map{|x| x.artists}.should == [[@c2.load(:id=>1), @c2.load(:id=>2), @c2.load(:id=>3), @c2.load(:id=>3)], [@c2.load(:id=>1), @c2.load(:id=>2)], []]
378
+ MODEL_DB.sqls.length.should == 2
379
+ end
380
+ end
219
381
  end
@@ -558,24 +558,8 @@ describe "Sequel::Plugins::ManyThroughMany eager loading methods" do
558
558
  end
559
559
 
560
560
  it "should cascade eagerly loading when the :eager_graph association option is used" do
561
- Tag.dataset.extend(Module.new {
562
- def columns
563
- [:id]
564
- end
565
- def fetch_rows(sql)
566
- @db << sql
567
- yield({:id=>2, :tracks_id=>4, :x_foreign_key_x=>1})
568
- end
569
- })
570
561
  @c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :eager_graph=>:tracks
571
- a = @c1.eager(:tags).all
572
- a.should == [@c1.load(:id=>1)]
573
- MODEL_DB.sqls.should == ['SELECT * FROM artists',
574
- 'SELECT tags.id, tracks.id AS tracks_id, albums_artists.artist_id AS x_foreign_key_x FROM (SELECT tags.* FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) INNER JOIN albums_artists ON ((albums_artists.album_id = albums.id) AND (albums_artists.artist_id IN (1)))) AS tags LEFT OUTER JOIN albums_tags AS albums_tags_0 ON (albums_tags_0.tag_id = tags.id) LEFT OUTER JOIN albums ON (albums.id = albums_tags_0.album_id) LEFT OUTER JOIN tracks ON (tracks.album_id = albums.id)']
575
- a = a.first
576
- a.tags.should == [Tag.load(:id=>2)]
577
- a.tags.first.tracks.should == [Track.load(:id=>4)]
578
- MODEL_DB.sqls.length.should == 2
562
+ proc{@c1.eager(:tags).all}.should raise_error(Sequel::Error)
579
563
  end
580
564
 
581
565
  it "should respect :eager_graph when lazily loading an association" do
@@ -782,8 +766,8 @@ describe "Sequel::Plugins::ManyThroughMany eager loading methods" do
782
766
  MODEL_DB.sqls.length.should == 1
783
767
  end
784
768
 
785
- it "eager graphing should give you a graph of tables when called without .all" do
786
- @c1.eager_graph(:tags, :artists).first.should == {:artists=>@c1.load(:id=>1), :artists_0=>@c1.load(:id=>10), :tags=>Tag.load(:id=>2)}
769
+ it "eager graphing should give you a plain hash when called without .all" do
770
+ @c1.eager_graph(:tags, :artists).first.should == {:albums_0_id=>3, :artists_0_id=>10, :id=>1, :tags_id=>2}
787
771
  end
788
772
 
789
773
  it "should be able to use eager and eager_graph together" do
@@ -118,13 +118,13 @@ describe "Sequel::Plugins::XmlSerializer" do
118
118
  end
119
119
 
120
120
  it "should support an :encoding option when serializing" do
121
- ["<?xml version=\"1.0\" encoding=\"utf-8\"?><artist><id>2</id><name>YJM</name></artist>",
122
- "<?xml version=\"1.0\" encoding=\"utf-8\"?><artist><name>YJM</name><id>2</id></artist>"].should include(@artist.to_xml(:encoding=>'utf-8').gsub(/\n */m, ''))
121
+ ["<?xml version=\"1.0\" encoding=\"UTF-8\"?><artist><id>2</id><name>YJM</name></artist>",
122
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?><artist><name>YJM</name><id>2</id></artist>"].should include(@artist.to_xml(:encoding=>'UTF-8').gsub(/\n */m, ''))
123
123
  end
124
124
 
125
125
  it "should support a :builder_opts option when serializing" do
126
- ["<?xml version=\"1.0\" encoding=\"utf-8\"?><artist><id>2</id><name>YJM</name></artist>",
127
- "<?xml version=\"1.0\" encoding=\"utf-8\"?><artist><name>YJM</name><id>2</id></artist>"].should include(@artist.to_xml(:builder_opts=>{:encoding=>'utf-8'}).gsub(/\n */m, ''))
126
+ ["<?xml version=\"1.0\" encoding=\"UTF-8\"?><artist><id>2</id><name>YJM</name></artist>",
127
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?><artist><name>YJM</name><id>2</id></artist>"].should include(@artist.to_xml(:builder_opts=>{:encoding=>'UTF-8'}).gsub(/\n */m, ''))
128
128
  end
129
129
 
130
130
  it "should support an :types option when serializing" do
@@ -106,6 +106,9 @@ describe Sequel::Model, "#eager" do
106
106
  end
107
107
  })
108
108
  end
109
+ after do
110
+ [:EagerAlbum, :EagerBand, :EagerTrack, :EagerGenre, :EagerBandMember].each{|x| Object.send(:remove_const, x)}
111
+ end
109
112
 
110
113
  it "should raise an error if called without a symbol or hash" do
111
114
  proc{EagerAlbum.eager(Object.new)}.should raise_error(Sequel::Error)
@@ -315,25 +318,8 @@ describe Sequel::Model, "#eager" do
315
318
  MODEL_DB.sqls.length.should == 2
316
319
  end
317
320
 
318
- it "should cascade eagerly loading when the :eager_graph association option is used with a many_to_many association" do
319
- EagerBandMember.dataset.extend(Module.new {
320
- def columns
321
- [:id]
322
- end
323
- def fetch_rows(sql)
324
- @db << sql
325
- yield({:id=>5, :bands_id=>2, :p_k=>6, :x_foreign_key_x=>2})
326
- yield({:id=>5, :bands_id=>3, :p_k=>6, :x_foreign_key_x=>2})
327
- end
328
- })
329
- a = EagerBand.eager(:graph_members).all
330
- a.should == [EagerBand.load(:id=>2)]
331
- MODEL_DB.sqls.should == ['SELECT * FROM bands',
332
- 'SELECT members.id, bands.id AS bands_id, bands.p_k, bm.band_id AS x_foreign_key_x FROM (SELECT members.* FROM members INNER JOIN bm ON ((bm.member_id = members.id) AND (bm.band_id IN (2)))) AS members LEFT OUTER JOIN bm AS bm_0 ON (bm_0.member_id = members.id) LEFT OUTER JOIN bands ON (bands.id = bm_0.band_id) ORDER BY bands.id']
333
- a = a.first
334
- a.graph_members.should == [EagerBandMember.load(:id=>5)]
335
- a.graph_members.first.bands.should == [EagerBand.load(:id=>2, :p_k=>6), EagerBand.load(:id=>3, :p_k=>6)]
336
- MODEL_DB.sqls.length.should == 2
321
+ it "should raise an Error when eager loading a many_to_many association with the :eager_graph option" do
322
+ proc{EagerBand.eager(:graph_members).all}.should raise_error(Sequel::Error)
337
323
  end
338
324
 
339
325
  it "should respect :eager_graph when lazily loading an association" do
@@ -1077,13 +1063,13 @@ describe Sequel::Model, "#eager_graph" do
1077
1063
  a.members.first.values.should == {:id => 5}
1078
1064
  end
1079
1065
 
1080
- it "should give you a graph of tables when called without .all" do
1066
+ it "should give you a plain hash when called without .all" do
1081
1067
  ds = GraphAlbum.eager_graph(:band)
1082
1068
  ds.sql.should == 'SELECT albums.id, albums.band_id, band.id AS band_id_0, band.vocalist_id FROM albums LEFT OUTER JOIN bands AS band ON (band.id = albums.band_id)'
1083
1069
  def ds.fetch_rows(sql, &block)
1084
1070
  yield({:id=>1, :band_id=>2, :band_id_0=>2, :vocalist_id=>3})
1085
1071
  end
1086
- ds.first.should == {:albums=>GraphAlbum.load(:id => 1, :band_id => 2), :band=>GraphBand.load(:id => 2, :vocalist_id=>3)}
1072
+ ds.first.should == {:id=>1, :band_id=>2, :band_id_0=>2, :vocalist_id=>3}
1087
1073
  end
1088
1074
 
1089
1075
  it "should not drop any associated objects if the graph could not be a cartesian product" do
@@ -723,6 +723,29 @@ describe Sequel::Model, "#set" do
723
723
  MODEL_DB.sqls.should == []
724
724
  end
725
725
 
726
+ it "should raise error if strict_param_setting is true and method does not exist" do
727
+ @o1.strict_param_setting = true
728
+ proc{@o1.set('foo' => 1)}.should raise_error(Sequel::Error)
729
+ end
730
+
731
+ it "should raise error if strict_param_setting is true and column is a primary key" do
732
+ @o1.strict_param_setting = true
733
+ proc{@o1.set('id' => 1)}.should raise_error(Sequel::Error)
734
+ end
735
+
736
+ it "should raise error if strict_param_setting is true and column is restricted" do
737
+ @o1.strict_param_setting = true
738
+ @c.set_restricted_columns :x
739
+ proc{@o1.set('x' => 1)}.should raise_error(Sequel::Error)
740
+ end
741
+
742
+ it "should not create a symbol if strict_param_setting is true and string is given" do
743
+ @o1.strict_param_setting = true
744
+ l = Symbol.all_symbols.length
745
+ proc{@o1.set('sadojafdso' => 1)}.should raise_error(Sequel::Error)
746
+ Symbol.all_symbols.length.should == l
747
+ end
748
+
726
749
  it "#set should correctly handle cases where an instance method is added to the class" do
727
750
  @o1.set(:x => 1)
728
751
  @o1.values.should == {:x => 1}
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: 99
4
+ hash: 111
5
5
  prerelease: false
6
6
  segments:
7
7
  - 3
8
- - 25
8
+ - 26
9
9
  - 0
10
- version: 3.25.0
10
+ version: 3.26.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-07-01 00:00:00 -07:00
18
+ date: 2011-08-01 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies: []
21
21
 
@@ -29,22 +29,22 @@ extra_rdoc_files:
29
29
  - README.rdoc
30
30
  - CHANGELOG
31
31
  - MIT-LICENSE
32
+ - doc/active_record.rdoc
32
33
  - doc/advanced_associations.rdoc
34
+ - doc/association_basics.rdoc
33
35
  - doc/cheat_sheet.rdoc
36
+ - doc/dataset_basics.rdoc
34
37
  - doc/dataset_filtering.rdoc
38
+ - doc/migration.rdoc
39
+ - doc/model_hooks.rdoc
35
40
  - doc/opening_databases.rdoc
36
41
  - doc/prepared_statements.rdoc
42
+ - doc/querying.rdoc
37
43
  - doc/reflection.rdoc
38
44
  - doc/sharding.rdoc
39
45
  - doc/sql.rdoc
40
- - doc/virtual_rows.rdoc
41
- - doc/dataset_basics.rdoc
42
- - doc/association_basics.rdoc
43
- - doc/querying.rdoc
44
- - doc/migration.rdoc
45
46
  - doc/validations.rdoc
46
- - doc/model_hooks.rdoc
47
- - doc/active_record.rdoc
47
+ - doc/virtual_rows.rdoc
48
48
  - doc/release_notes/1.0.txt
49
49
  - doc/release_notes/1.1.txt
50
50
  - doc/release_notes/1.3.txt
@@ -65,14 +65,6 @@ extra_rdoc_files:
65
65
  - doc/release_notes/2.9.0.txt
66
66
  - doc/release_notes/3.0.0.txt
67
67
  - doc/release_notes/3.1.0.txt
68
- - doc/release_notes/3.2.0.txt
69
- - doc/release_notes/3.3.0.txt
70
- - doc/release_notes/3.4.0.txt
71
- - doc/release_notes/3.5.0.txt
72
- - doc/release_notes/3.6.0.txt
73
- - doc/release_notes/3.7.0.txt
74
- - doc/release_notes/3.8.0.txt
75
- - doc/release_notes/3.9.0.txt
76
68
  - doc/release_notes/3.10.0.txt
77
69
  - doc/release_notes/3.11.0.txt
78
70
  - doc/release_notes/3.12.0.txt
@@ -83,23 +75,38 @@ extra_rdoc_files:
83
75
  - doc/release_notes/3.17.0.txt
84
76
  - doc/release_notes/3.18.0.txt
85
77
  - doc/release_notes/3.19.0.txt
78
+ - doc/release_notes/3.2.0.txt
86
79
  - doc/release_notes/3.20.0.txt
87
80
  - doc/release_notes/3.21.0.txt
88
81
  - doc/release_notes/3.22.0.txt
89
82
  - doc/release_notes/3.23.0.txt
90
83
  - doc/release_notes/3.24.0.txt
91
84
  - doc/release_notes/3.25.0.txt
85
+ - doc/release_notes/3.3.0.txt
86
+ - doc/release_notes/3.4.0.txt
87
+ - doc/release_notes/3.5.0.txt
88
+ - doc/release_notes/3.6.0.txt
89
+ - doc/release_notes/3.7.0.txt
90
+ - doc/release_notes/3.8.0.txt
91
+ - doc/release_notes/3.9.0.txt
92
+ - doc/release_notes/3.26.0.txt
92
93
  files:
93
94
  - MIT-LICENSE
94
95
  - CHANGELOG
95
96
  - README.rdoc
96
97
  - Rakefile
97
98
  - bin/sequel
99
+ - doc/active_record.rdoc
98
100
  - doc/advanced_associations.rdoc
101
+ - doc/association_basics.rdoc
99
102
  - doc/cheat_sheet.rdoc
103
+ - doc/dataset_basics.rdoc
100
104
  - doc/dataset_filtering.rdoc
105
+ - doc/migration.rdoc
106
+ - doc/model_hooks.rdoc
101
107
  - doc/opening_databases.rdoc
102
108
  - doc/prepared_statements.rdoc
109
+ - doc/querying.rdoc
103
110
  - doc/reflection.rdoc
104
111
  - doc/release_notes/1.0.txt
105
112
  - doc/release_notes/1.1.txt
@@ -121,14 +128,6 @@ files:
121
128
  - doc/release_notes/2.9.0.txt
122
129
  - doc/release_notes/3.0.0.txt
123
130
  - doc/release_notes/3.1.0.txt
124
- - doc/release_notes/3.2.0.txt
125
- - doc/release_notes/3.3.0.txt
126
- - doc/release_notes/3.4.0.txt
127
- - doc/release_notes/3.5.0.txt
128
- - doc/release_notes/3.6.0.txt
129
- - doc/release_notes/3.7.0.txt
130
- - doc/release_notes/3.8.0.txt
131
- - doc/release_notes/3.9.0.txt
132
131
  - doc/release_notes/3.10.0.txt
133
132
  - doc/release_notes/3.11.0.txt
134
133
  - doc/release_notes/3.12.0.txt
@@ -139,22 +138,25 @@ files:
139
138
  - doc/release_notes/3.17.0.txt
140
139
  - doc/release_notes/3.18.0.txt
141
140
  - doc/release_notes/3.19.0.txt
141
+ - doc/release_notes/3.2.0.txt
142
142
  - doc/release_notes/3.20.0.txt
143
143
  - doc/release_notes/3.21.0.txt
144
144
  - doc/release_notes/3.22.0.txt
145
145
  - doc/release_notes/3.23.0.txt
146
146
  - doc/release_notes/3.24.0.txt
147
147
  - doc/release_notes/3.25.0.txt
148
+ - doc/release_notes/3.3.0.txt
149
+ - doc/release_notes/3.4.0.txt
150
+ - doc/release_notes/3.5.0.txt
151
+ - doc/release_notes/3.6.0.txt
152
+ - doc/release_notes/3.7.0.txt
153
+ - doc/release_notes/3.8.0.txt
154
+ - doc/release_notes/3.9.0.txt
155
+ - doc/release_notes/3.26.0.txt
148
156
  - doc/sharding.rdoc
149
157
  - doc/sql.rdoc
150
- - doc/virtual_rows.rdoc
151
- - doc/dataset_basics.rdoc
152
- - doc/association_basics.rdoc
153
- - doc/querying.rdoc
154
- - doc/migration.rdoc
155
158
  - doc/validations.rdoc
156
- - doc/model_hooks.rdoc
157
- - doc/active_record.rdoc
159
+ - doc/virtual_rows.rdoc
158
160
  - spec/adapters/firebird_spec.rb
159
161
  - spec/adapters/informix_spec.rb
160
162
  - spec/adapters/mssql_spec.rb