sequel 3.37.0 → 3.38.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 (129) hide show
  1. data/CHANGELOG +56 -0
  2. data/README.rdoc +82 -58
  3. data/Rakefile +6 -5
  4. data/bin/sequel +1 -1
  5. data/doc/active_record.rdoc +67 -52
  6. data/doc/advanced_associations.rdoc +33 -48
  7. data/doc/association_basics.rdoc +41 -51
  8. data/doc/cheat_sheet.rdoc +21 -21
  9. data/doc/core_extensions.rdoc +374 -0
  10. data/doc/dataset_basics.rdoc +5 -5
  11. data/doc/dataset_filtering.rdoc +47 -43
  12. data/doc/mass_assignment.rdoc +1 -1
  13. data/doc/migration.rdoc +4 -5
  14. data/doc/model_hooks.rdoc +3 -3
  15. data/doc/object_model.rdoc +31 -25
  16. data/doc/opening_databases.rdoc +19 -5
  17. data/doc/prepared_statements.rdoc +2 -2
  18. data/doc/querying.rdoc +109 -52
  19. data/doc/reflection.rdoc +6 -6
  20. data/doc/release_notes/3.38.0.txt +234 -0
  21. data/doc/schema_modification.rdoc +22 -13
  22. data/doc/sharding.rdoc +8 -9
  23. data/doc/sql.rdoc +154 -112
  24. data/doc/testing.rdoc +47 -7
  25. data/doc/thread_safety.rdoc +1 -1
  26. data/doc/transactions.rdoc +1 -1
  27. data/doc/validations.rdoc +1 -1
  28. data/doc/virtual_rows.rdoc +29 -43
  29. data/lib/sequel/adapters/do/postgres.rb +1 -4
  30. data/lib/sequel/adapters/jdbc.rb +14 -3
  31. data/lib/sequel/adapters/jdbc/db2.rb +9 -0
  32. data/lib/sequel/adapters/jdbc/derby.rb +41 -4
  33. data/lib/sequel/adapters/jdbc/jtds.rb +11 -0
  34. data/lib/sequel/adapters/jdbc/postgresql.rb +3 -6
  35. data/lib/sequel/adapters/mock.rb +10 -4
  36. data/lib/sequel/adapters/postgres.rb +1 -28
  37. data/lib/sequel/adapters/shared/mssql.rb +23 -13
  38. data/lib/sequel/adapters/shared/postgres.rb +46 -0
  39. data/lib/sequel/adapters/swift.rb +21 -13
  40. data/lib/sequel/adapters/swift/mysql.rb +1 -0
  41. data/lib/sequel/adapters/swift/postgres.rb +4 -5
  42. data/lib/sequel/adapters/swift/sqlite.rb +2 -1
  43. data/lib/sequel/adapters/tinytds.rb +14 -2
  44. data/lib/sequel/adapters/utils/pg_types.rb +5 -0
  45. data/lib/sequel/core.rb +29 -17
  46. data/lib/sequel/database/query.rb +1 -1
  47. data/lib/sequel/database/schema_generator.rb +3 -0
  48. data/lib/sequel/dataset/actions.rb +5 -6
  49. data/lib/sequel/dataset/query.rb +7 -7
  50. data/lib/sequel/dataset/sql.rb +5 -18
  51. data/lib/sequel/extensions/core_extensions.rb +8 -12
  52. data/lib/sequel/extensions/pg_array.rb +59 -33
  53. data/lib/sequel/extensions/pg_array_ops.rb +32 -4
  54. data/lib/sequel/extensions/pg_auto_parameterize.rb +1 -1
  55. data/lib/sequel/extensions/pg_hstore.rb +32 -17
  56. data/lib/sequel/extensions/pg_hstore_ops.rb +32 -3
  57. data/lib/sequel/extensions/pg_inet.rb +1 -2
  58. data/lib/sequel/extensions/pg_interval.rb +0 -1
  59. data/lib/sequel/extensions/pg_json.rb +41 -23
  60. data/lib/sequel/extensions/pg_range.rb +36 -11
  61. data/lib/sequel/extensions/pg_range_ops.rb +32 -4
  62. data/lib/sequel/extensions/pg_row.rb +572 -0
  63. data/lib/sequel/extensions/pg_row_ops.rb +164 -0
  64. data/lib/sequel/extensions/query.rb +3 -3
  65. data/lib/sequel/extensions/schema_dumper.rb +7 -8
  66. data/lib/sequel/extensions/select_remove.rb +1 -1
  67. data/lib/sequel/model/base.rb +1 -0
  68. data/lib/sequel/no_core_ext.rb +1 -1
  69. data/lib/sequel/plugins/pg_row.rb +121 -0
  70. data/lib/sequel/plugins/pg_typecast_on_load.rb +65 -0
  71. data/lib/sequel/plugins/validation_helpers.rb +31 -0
  72. data/lib/sequel/sql.rb +64 -44
  73. data/lib/sequel/version.rb +1 -1
  74. data/spec/adapters/mssql_spec.rb +37 -12
  75. data/spec/adapters/mysql_spec.rb +39 -75
  76. data/spec/adapters/oracle_spec.rb +11 -11
  77. data/spec/adapters/postgres_spec.rb +414 -237
  78. data/spec/adapters/spec_helper.rb +1 -1
  79. data/spec/adapters/sqlite_spec.rb +14 -14
  80. data/spec/core/database_spec.rb +6 -6
  81. data/spec/core/dataset_spec.rb +169 -205
  82. data/spec/core/expression_filters_spec.rb +182 -295
  83. data/spec/core/object_graph_spec.rb +6 -6
  84. data/spec/core/schema_spec.rb +14 -14
  85. data/spec/core/spec_helper.rb +1 -0
  86. data/spec/{extensions/core_extensions_spec.rb → core_extensions_spec.rb} +208 -14
  87. data/spec/extensions/columns_introspection_spec.rb +5 -5
  88. data/spec/extensions/hook_class_methods_spec.rb +28 -36
  89. data/spec/extensions/many_through_many_spec.rb +4 -4
  90. data/spec/extensions/pg_array_ops_spec.rb +15 -7
  91. data/spec/extensions/pg_array_spec.rb +81 -48
  92. data/spec/extensions/pg_auto_parameterize_spec.rb +2 -2
  93. data/spec/extensions/pg_hstore_ops_spec.rb +13 -9
  94. data/spec/extensions/pg_hstore_spec.rb +66 -65
  95. data/spec/extensions/pg_inet_spec.rb +2 -4
  96. data/spec/extensions/pg_interval_spec.rb +2 -3
  97. data/spec/extensions/pg_json_spec.rb +20 -18
  98. data/spec/extensions/pg_range_ops_spec.rb +11 -4
  99. data/spec/extensions/pg_range_spec.rb +30 -7
  100. data/spec/extensions/pg_row_ops_spec.rb +48 -0
  101. data/spec/extensions/pg_row_plugin_spec.rb +45 -0
  102. data/spec/extensions/pg_row_spec.rb +323 -0
  103. data/spec/extensions/pg_typecast_on_load_spec.rb +58 -0
  104. data/spec/extensions/query_literals_spec.rb +11 -11
  105. data/spec/extensions/query_spec.rb +3 -3
  106. data/spec/extensions/schema_dumper_spec.rb +20 -4
  107. data/spec/extensions/schema_spec.rb +18 -41
  108. data/spec/extensions/select_remove_spec.rb +4 -4
  109. data/spec/extensions/spec_helper.rb +4 -8
  110. data/spec/extensions/to_dot_spec.rb +5 -5
  111. data/spec/extensions/validation_class_methods_spec.rb +28 -16
  112. data/spec/integration/associations_test.rb +20 -20
  113. data/spec/integration/dataset_test.rb +98 -98
  114. data/spec/integration/eager_loader_test.rb +13 -27
  115. data/spec/integration/plugin_test.rb +5 -5
  116. data/spec/integration/prepared_statement_test.rb +22 -13
  117. data/spec/integration/schema_test.rb +28 -18
  118. data/spec/integration/spec_helper.rb +1 -1
  119. data/spec/integration/timezone_test.rb +2 -2
  120. data/spec/integration/type_test.rb +15 -6
  121. data/spec/model/association_reflection_spec.rb +1 -1
  122. data/spec/model/associations_spec.rb +4 -4
  123. data/spec/model/base_spec.rb +5 -5
  124. data/spec/model/eager_loading_spec.rb +15 -15
  125. data/spec/model/model_spec.rb +32 -32
  126. data/spec/model/record_spec.rb +16 -0
  127. data/spec/model/spec_helper.rb +2 -6
  128. data/spec/model/validations_spec.rb +1 -1
  129. metadata +16 -4
@@ -179,7 +179,7 @@ describe Sequel::Model, "#eager" do
179
179
  end
180
180
 
181
181
  it "should handle qualified order clauses when eagerly loading a single one_to_one association using the :correlated_subquery strategy" do
182
- EagerAlbum.one_to_one :track, :class=>'EagerTrack', :key=>:album_id, :eager_limit_strategy=>:correlated_subquery, :order=>[:tracks__name, :tracks__name.desc, :name.qualify(:tracks), :name.qualify(:t), 1]
182
+ EagerAlbum.one_to_one :track, :class=>'EagerTrack', :key=>:album_id, :eager_limit_strategy=>:correlated_subquery, :order=>[:tracks__name, Sequel.desc(:tracks__name), Sequel.qualify(:tracks, :name), Sequel.qualify(:t, :name), 1]
183
183
  a = EagerAlbum.eager(:track).all
184
184
  a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
185
185
  MODEL_DB.sqls.should == ['SELECT * FROM albums', 'SELECT * FROM tracks WHERE ((tracks.album_id IN (1)) AND (tracks.id IN (SELECT t1.id FROM tracks AS t1 WHERE (t1.album_id = tracks.album_id) ORDER BY t1.name, t1.name DESC, t1.name, t.name, 1 LIMIT 1))) ORDER BY tracks.name, tracks.name DESC, tracks.name, t.name, 1']
@@ -1303,21 +1303,21 @@ describe Sequel::Model, "#eager_graph" do
1303
1303
  end
1304
1304
 
1305
1305
  it "should respect the association's :graph_block option" do
1306
- GraphAlbum.many_to_one :active_band, :class=>'GraphBand', :key=>:band_id, :graph_block=>proc{|ja,lja,js| {:active.qualify(ja)=>true}}
1306
+ GraphAlbum.many_to_one :active_band, :class=>'GraphBand', :key=>:band_id, :graph_block=>proc{|ja,lja,js| {Sequel.qualify(ja, :active)=>true}}
1307
1307
  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.id = albums.band_id) AND (active_band.active IS TRUE))"
1308
1308
 
1309
- GraphAlbum.one_to_many :right_tracks, :class=>'GraphTrack', :key=>:album_id, :graph_block=>proc{|ja,lja,js| {:id.qualify(ja)=>(0..100)}}
1309
+ GraphAlbum.one_to_many :right_tracks, :class=>'GraphTrack', :key=>:album_id, :graph_block=>proc{|ja,lja,js| {Sequel.qualify(ja, :id)=>(0..100)}}
1310
1310
  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 LEFT OUTER JOIN tracks AS right_tracks ON ((right_tracks.album_id = albums.id) AND (right_tracks.id >= 0) AND (right_tracks.id <= 100))'
1311
1311
 
1312
- GraphAlbum.many_to_many :active_genres, :class=>'GraphGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :graph_block=>proc{|ja,lja,js| {true=>:active.qualify(lja)}}
1312
+ GraphAlbum.many_to_many :active_genres, :class=>'GraphGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :graph_block=>proc{|ja,lja,js| {true=>Sequel.qualify(lja, :active)}}
1313
1313
  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 ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS active_genres ON ((active_genres.id = ag.genre_id) AND ('t' = ag.active))"
1314
1314
  end
1315
1315
 
1316
- it "should respect the association's :graph_join_block option" do
1317
- GraphAlbum.many_to_many :active_genres, :class=>'GraphGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :graph_join_table_block=>proc{|ja,lja,js| {:active.qualify(ja)=>true}}
1316
+ it "should respect the association's :graph_join_table_block option" do
1317
+ GraphAlbum.many_to_many :active_genres, :class=>'GraphGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :graph_join_table_block=>proc{|ja,lja,js| {Sequel.qualify(ja, :active)=>true}}
1318
1318
  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 ON ((ag.album_id = albums.id) AND (ag.active IS TRUE)) LEFT OUTER JOIN genres AS active_genres ON (active_genres.id = ag.genre_id)"
1319
1319
 
1320
- GraphAlbum.many_to_many :active_genres, :class=>'GraphGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :graph_block=>proc{|ja,lja,js| {true=>:active.qualify(lja)}}, :graph_join_table_block=>proc{|ja,lja,js| {true=>:active.qualify(lja)}}
1320
+ GraphAlbum.many_to_many :active_genres, :class=>'GraphGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :graph_block=>proc{|ja,lja,js| {true=>Sequel.qualify(lja, :active)}}, :graph_join_table_block=>proc{|ja,lja,js| {true=>Sequel.qualify(lja, :active)}}
1321
1321
  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 ON ((ag.album_id = albums.id) AND ('t' = albums.active)) LEFT OUTER JOIN genres AS active_genres ON ((active_genres.id = ag.genre_id) AND ('t' = ag.active))"
1322
1322
  end
1323
1323
 
@@ -1351,7 +1351,7 @@ describe Sequel::Model, "#eager_graph" do
1351
1351
  GraphAlbum.many_to_many :active_genres, :class=>'GraphGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :graph_join_table_only_conditions=>{:active=>true}
1352
1352
  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 ON (ag.active IS TRUE) LEFT OUTER JOIN genres AS active_genres ON (active_genres.id = ag.genre_id)"
1353
1353
 
1354
- GraphAlbum.many_to_many :active_genres, :class=>'GraphGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :graph_only_conditions=>(:price + 2 > 100), :graph_join_table_only_conditions=>"active"
1354
+ GraphAlbum.many_to_many :active_genres, :class=>'GraphGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :graph_only_conditions=>(Sequel.expr(:price) + 2 > 100), :graph_join_table_only_conditions=>"active"
1355
1355
  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 ON (active) LEFT OUTER JOIN genres AS active_genres ON ((price + 2) > 100)"
1356
1356
  end
1357
1357
 
@@ -1365,7 +1365,7 @@ describe Sequel::Model, "#eager_graph" do
1365
1365
  end
1366
1366
 
1367
1367
  it "should only qualify unqualified symbols, identifiers, or ordered versions in association's :order" do
1368
- GraphAlbum.one_to_many :right_tracks, :class=>'GraphTrack', :key=>:album_id, :order=>[:blah__id.identifier, :blah__id.identifier.desc, :blah__id.desc, :blah__id, :album_id, :album_id.desc, 1, 'RANDOM()'.lit, :a.qualify(:b)]
1368
+ GraphAlbum.one_to_many :right_tracks, :class=>'GraphTrack', :key=>:album_id, :order=>[Sequel.identifier(:blah__id), Sequel.identifier(:blah__id).desc, Sequel.desc(:blah__id), :blah__id, :album_id, Sequel.desc(:album_id), 1, Sequel.lit('RANDOM()'), Sequel.qualify(:b, :a)]
1369
1369
  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 LEFT OUTER JOIN tracks AS right_tracks ON (right_tracks.album_id = albums.id) ORDER BY right_tracks.blah__id, right_tracks.blah__id DESC, blah.id DESC, blah.id, right_tracks.album_id, right_tracks.album_id DESC, 1, RANDOM(), b.a'
1370
1370
  end
1371
1371
 
@@ -1415,16 +1415,16 @@ describe Sequel::Model, "#eager_graph" do
1415
1415
 
1416
1416
  it "should handle eager loading with schemas and aliases of different types" do
1417
1417
  GraphAlbum.eager_graph(:band).join(:s__genres, [:b_id]).eager_graph(:genres).sql.should == 'SELECT albums.id, albums.band_id, band.id AS band_id_0, band.vocalist_id, genres_0.id AS genres_0_id FROM albums LEFT OUTER JOIN bands AS band ON (band.id = albums.band_id) INNER JOIN s.genres USING (b_id) LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS genres_0 ON (genres_0.id = ag.genre_id)'
1418
- GraphAlbum.eager_graph(:band).join(:genres.qualify(:s), [:b_id]).eager_graph(:genres).sql.should == 'SELECT albums.id, albums.band_id, band.id AS band_id_0, band.vocalist_id, genres_0.id AS genres_0_id FROM albums LEFT OUTER JOIN bands AS band ON (band.id = albums.band_id) INNER JOIN s.genres USING (b_id) LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS genres_0 ON (genres_0.id = ag.genre_id)'
1419
- GraphAlbum.eager_graph(:band).join(:s__b.as('genres'), [:b_id]).eager_graph(:genres).sql.should == 'SELECT albums.id, albums.band_id, band.id AS band_id_0, band.vocalist_id, genres_0.id AS genres_0_id FROM albums LEFT OUTER JOIN bands AS band ON (band.id = albums.band_id) INNER JOIN s.b AS genres USING (b_id) LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS genres_0 ON (genres_0.id = ag.genre_id)'
1420
- GraphAlbum.eager_graph(:band).join(:s__b, [:b_id], :genres.identifier).eager_graph(:genres).sql.should == 'SELECT albums.id, albums.band_id, band.id AS band_id_0, band.vocalist_id, genres_0.id AS genres_0_id FROM albums LEFT OUTER JOIN bands AS band ON (band.id = albums.band_id) INNER JOIN s.b AS genres USING (b_id) LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS genres_0 ON (genres_0.id = ag.genre_id)'
1421
- GraphAlbum.eager_graph(:band).join(:genres.identifier, [:b_id]).eager_graph(:genres).sql.should == 'SELECT albums.id, albums.band_id, band.id AS band_id_0, band.vocalist_id, genres_0.id AS genres_0_id FROM albums LEFT OUTER JOIN bands AS band ON (band.id = albums.band_id) INNER JOIN genres USING (b_id) LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS genres_0 ON (genres_0.id = ag.genre_id)'
1418
+ GraphAlbum.eager_graph(:band).join(Sequel.qualify(:s, :genres), [:b_id]).eager_graph(:genres).sql.should == 'SELECT albums.id, albums.band_id, band.id AS band_id_0, band.vocalist_id, genres_0.id AS genres_0_id FROM albums LEFT OUTER JOIN bands AS band ON (band.id = albums.band_id) INNER JOIN s.genres USING (b_id) LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS genres_0 ON (genres_0.id = ag.genre_id)'
1419
+ GraphAlbum.eager_graph(:band).join(Sequel.expr(:s__b).as('genres'), [:b_id]).eager_graph(:genres).sql.should == 'SELECT albums.id, albums.band_id, band.id AS band_id_0, band.vocalist_id, genres_0.id AS genres_0_id FROM albums LEFT OUTER JOIN bands AS band ON (band.id = albums.band_id) INNER JOIN s.b AS genres USING (b_id) LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS genres_0 ON (genres_0.id = ag.genre_id)'
1420
+ GraphAlbum.eager_graph(:band).join(:s__b, [:b_id], Sequel.identifier(:genres)).eager_graph(:genres).sql.should == 'SELECT albums.id, albums.band_id, band.id AS band_id_0, band.vocalist_id, genres_0.id AS genres_0_id FROM albums LEFT OUTER JOIN bands AS band ON (band.id = albums.band_id) INNER JOIN s.b AS genres USING (b_id) LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS genres_0 ON (genres_0.id = ag.genre_id)'
1421
+ GraphAlbum.eager_graph(:band).join(Sequel.identifier(:genres), [:b_id]).eager_graph(:genres).sql.should == 'SELECT albums.id, albums.band_id, band.id AS band_id_0, band.vocalist_id, genres_0.id AS genres_0_id FROM albums LEFT OUTER JOIN bands AS band ON (band.id = albums.band_id) INNER JOIN genres USING (b_id) LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS genres_0 ON (genres_0.id = ag.genre_id)'
1422
1422
  GraphAlbum.eager_graph(:band).join('genres', [:b_id]).eager_graph(:genres).sql.should == 'SELECT albums.id, albums.band_id, band.id AS band_id_0, band.vocalist_id, genres_0.id AS genres_0_id FROM albums LEFT OUTER JOIN bands AS band ON (band.id = albums.band_id) INNER JOIN genres USING (b_id) LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS genres_0 ON (genres_0.id = ag.genre_id)'
1423
1423
  end
1424
1424
 
1425
1425
  it "should raise errors if invalid aliases or table styles are used" do
1426
- proc{GraphAlbum.from_self(:alias=>:bands.qualify(:s)).eager_graph(:band)}.should raise_error(Sequel::Error)
1427
- proc{GraphAlbum.from('?'.lit(:bands)).eager_graph(:band)}.should raise_error(Sequel::Error)
1426
+ proc{GraphAlbum.from_self(:alias=>Sequel.qualify(:s, :bands)).eager_graph(:band)}.should raise_error(Sequel::Error)
1427
+ proc{GraphAlbum.from(Sequel.lit('?', :bands)).eager_graph(:band)}.should raise_error(Sequel::Error)
1428
1428
  end
1429
1429
 
1430
1430
  it "should eagerly load schema qualified tables correctly with joins" do
@@ -20,35 +20,35 @@ describe "Sequel::Model()" do
20
20
  end
21
21
 
22
22
  it "should return a model subclass with a dataset with the default database and given table name if given a LiteralString" do
23
- c = Sequel::Model('blah'.lit)
23
+ c = Sequel::Model(Sequel.lit('blah'))
24
24
  c.superclass.should == Sequel::Model
25
25
  c.db.should == @db
26
- c.table_name.should == 'blah'.lit
26
+ c.table_name.should == Sequel.lit('blah')
27
27
  end
28
28
 
29
29
  it "should return a model subclass with a dataset with the default database and given table name if given an SQL::Identifier" do
30
- c = Sequel::Model(:blah.identifier)
30
+ c = Sequel::Model(Sequel.identifier(:blah))
31
31
  c.superclass.should == Sequel::Model
32
32
  c.db.should == @db
33
- c.table_name.should == :blah.identifier
33
+ c.table_name.should == Sequel.identifier(:blah)
34
34
  end
35
35
 
36
36
  it "should return a model subclass with a dataset with the default database and given table name if given an SQL::QualifiedIdentifier" do
37
- c = Sequel::Model(:blah.qualify(:boo))
37
+ c = Sequel::Model(Sequel.qualify(:boo, :blah))
38
38
  c.superclass.should == Sequel::Model
39
39
  c.db.should == @db
40
- c.table_name.should == :blah.qualify(:boo)
40
+ c.table_name.should == Sequel.qualify(:boo, :blah)
41
41
  end
42
42
 
43
43
  it "should return a model subclass with a dataset with the default database and given table name if given an SQL::AliasedExpression" do
44
- c = Sequel::Model(:blah.as(:boo))
44
+ c = Sequel::Model(Sequel.as(:blah, :boo))
45
45
  c.superclass.should == Sequel::Model
46
46
  c.db.should == @db
47
47
  c.table_name.should == :boo
48
48
  end
49
49
 
50
50
  it "should return a model subclass with the given dataset if given a dataset using an SQL::Identifier" do
51
- ds = @db[:blah.identifier]
51
+ ds = @db[Sequel.identifier(:blah)]
52
52
  c = Sequel::Model(ds)
53
53
  c.superclass.should == Sequel::Model
54
54
  c.dataset.should == ds
@@ -84,29 +84,29 @@ describe "Sequel::Model()" do
84
84
 
85
85
  it "should work without raising an exception with an SQL::Identifier " do
86
86
  proc do
87
- class ::Album < Sequel::Model(:table.identifier); end
88
- class ::Album < Sequel::Model(:table.identifier); end
87
+ class ::Album < Sequel::Model(Sequel.identifier(:table)); end
88
+ class ::Album < Sequel::Model(Sequel.identifier(:table)); end
89
89
  end.should_not raise_error
90
90
  end
91
91
 
92
92
  it "should work without raising an exception with an SQL::QualifiedIdentifier " do
93
93
  proc do
94
- class ::Album < Sequel::Model(:table.qualify(:schema)); end
95
- class ::Album < Sequel::Model(:table.qualify(:schema)); end
94
+ class ::Album < Sequel::Model(Sequel.qualify(:schema, :table)); end
95
+ class ::Album < Sequel::Model(Sequel.qualify(:schema, :table)); end
96
96
  end.should_not raise_error
97
97
  end
98
98
 
99
99
  it "should work without raising an exception with an SQL::AliasedExpression" do
100
100
  proc do
101
- class ::Album < Sequel::Model(:table.as(:alias)); end
102
- class ::Album < Sequel::Model(:table.as(:alias)); end
101
+ class ::Album < Sequel::Model(Sequel.as(:table, :alias)); end
102
+ class ::Album < Sequel::Model(Sequel.as(:table, :alias)); end
103
103
  end.should_not raise_error
104
104
  end
105
105
 
106
106
  it "should work without raising an exception with an LiteralString" do
107
107
  proc do
108
- class ::Album < Sequel::Model('table'.lit); end
109
- class ::Album < Sequel::Model('table'.lit); end
108
+ class ::Album < Sequel::Model(Sequel.lit('table')); end
109
+ class ::Album < Sequel::Model(Sequel.lit('table')); end
110
110
  end.should_not raise_error
111
111
  end
112
112
 
@@ -126,16 +126,16 @@ describe "Sequel::Model()" do
126
126
 
127
127
  it "should work without raising an exception with a dataset with an SQL::Identifier" do
128
128
  proc do
129
- class ::Album < Sequel::Model(@db[:table.identifier]); end
130
- class ::Album < Sequel::Model(@db[:table.identifier]); end
129
+ class ::Album < Sequel::Model(@db[Sequel.identifier(:table)]); end
130
+ class ::Album < Sequel::Model(@db[Sequel.identifier(:table)]); end
131
131
  end.should_not raise_error
132
132
  end
133
133
 
134
134
  it "should raise an exception if anonymous model caching is disabled" do
135
135
  Sequel::Model.cache_anonymous_models = false
136
136
  proc do
137
- class ::Album < Sequel::Model(@db[:table.identifier]); end
138
- class ::Album < Sequel::Model(@db[:table.identifier]); end
137
+ class ::Album < Sequel::Model(@db[Sequel.identifier(:table)]); end
138
+ class ::Album < Sequel::Model(@db[Sequel.identifier(:table)]); end
139
139
  end.should raise_error
140
140
  end
141
141
  end
@@ -195,25 +195,25 @@ describe Sequel::Model, "dataset & schema" do
195
195
 
196
196
  it "set_dataset should take a LiteralString" do
197
197
  @model.db = MODEL_DB
198
- @model.set_dataset('foo'.lit)
199
- @model.table_name.should == 'foo'.lit
198
+ @model.set_dataset(Sequel.lit('foo'))
199
+ @model.table_name.should == Sequel.lit('foo')
200
200
  end
201
201
 
202
202
  it "set_dataset should take an SQL::Identifier" do
203
203
  @model.db = MODEL_DB
204
- @model.set_dataset(:foo.identifier)
205
- @model.table_name.should == :foo.identifier
204
+ @model.set_dataset(Sequel.identifier(:foo))
205
+ @model.table_name.should == Sequel.identifier(:foo)
206
206
  end
207
207
 
208
208
  it "set_dataset should take an SQL::QualifiedIdentifier" do
209
209
  @model.db = MODEL_DB
210
- @model.set_dataset(:foo.qualify(:bar))
211
- @model.table_name.should == :foo.qualify(:bar)
210
+ @model.set_dataset(Sequel.qualify(:bar, :foo))
211
+ @model.table_name.should == Sequel.qualify(:bar, :foo)
212
212
  end
213
213
 
214
214
  it "set_dataset should take an SQL::AliasedExpression" do
215
215
  @model.db = MODEL_DB
216
- @model.set_dataset(:foo.as(:bar))
216
+ @model.set_dataset(Sequel.as(:foo, :bar))
217
217
  @model.table_name.should == :bar
218
218
  end
219
219
 
@@ -361,12 +361,12 @@ describe Sequel::Model, ".subset" do
361
361
  specify "should create a filter on the underlying dataset" do
362
362
  proc {@c.new_only}.should raise_error(NoMethodError)
363
363
 
364
- @c.subset(:new_only) {:age.sql_number < 'new'}
364
+ @c.subset(:new_only){age < 'new'}
365
365
 
366
366
  @c.new_only.sql.should == "SELECT * FROM items WHERE (age < 'new')"
367
367
  @c.dataset.new_only.sql.should == "SELECT * FROM items WHERE (age < 'new')"
368
368
 
369
- @c.subset(:pricey) {:price.sql_number > 100}
369
+ @c.subset(:pricey){price > 100}
370
370
 
371
371
  @c.pricey.sql.should == "SELECT * FROM items WHERE (price > 100)"
372
372
  @c.dataset.pricey.sql.should == "SELECT * FROM items WHERE (price > 100)"
@@ -393,15 +393,15 @@ describe Sequel::Model, ".find" do
393
393
  @c.find(:name => 'sharon').should be_a_kind_of(@c)
394
394
  MODEL_DB.sqls.should == ["SELECT * FROM items WHERE (name = 'sharon') LIMIT 1"]
395
395
 
396
- @c.find(:name.like('abc%')).should be_a_kind_of(@c)
396
+ @c.find(Sequel.expr(:name).like('abc%')).should be_a_kind_of(@c)
397
397
  MODEL_DB.sqls.should == ["SELECT * FROM items WHERE (name LIKE 'abc%') LIMIT 1"]
398
398
  end
399
399
 
400
400
  specify "should accept filter blocks" do
401
- @c.find{:id.sql_number > 1}.should be_a_kind_of(@c)
401
+ @c.find{id > 1}.should be_a_kind_of(@c)
402
402
  MODEL_DB.sqls.should == ["SELECT * FROM items WHERE (id > 1) LIMIT 1"]
403
403
 
404
- @c.find {(:x.sql_number > 1) & (:y.sql_number < 2)}.should be_a_kind_of(@c)
404
+ @c.find{(x > 1) & (y < 2)}.should be_a_kind_of(@c)
405
405
  MODEL_DB.sqls.should == ["SELECT * FROM items WHERE ((x > 1) AND (y < 2)) LIMIT 1"]
406
406
  end
407
407
  end
@@ -1,5 +1,21 @@
1
1
  require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
2
 
3
+ describe "Model#values" do
4
+ before do
5
+ @c = Class.new(Sequel::Model(:items))
6
+ end
7
+
8
+ it "should return the hash of model values" do
9
+ hash = {:x=>1}
10
+ @c.load(hash).values.should equal(hash)
11
+ end
12
+
13
+ it "should be aliased as to_hash" do
14
+ hash = {:x=>1}
15
+ @c.load(hash).to_hash.should equal(hash)
16
+ end
17
+ end
18
+
3
19
  describe "Model#save server use" do
4
20
  before do
5
21
  @db = Sequel.mock(:autoid=>proc{|sql| 10}, :fetch=>{:x=>1, :id=>10}, :servers=>{:blah=>{}, :read_only=>{}})
@@ -1,11 +1,7 @@
1
1
  require 'rubygems'
2
- unless Object.const_defined?('Sequel')
2
+ unless Object.const_defined?('Sequel') && Sequel.const_defined?('Model')
3
3
  $:.unshift(File.join(File.dirname(File.expand_path(__FILE__)), "../../lib/"))
4
- require 'sequel/core'
5
- end
6
- unless Sequel.const_defined?('Model')
7
- $:.unshift(File.join(File.dirname(File.expand_path(__FILE__)), "../../lib/"))
8
- require 'sequel/model'
4
+ require 'sequel/no_core_ext'
9
5
  end
10
6
 
11
7
  if ENV['SEQUEL_COLUMNS_INTROSPECTION']
@@ -65,7 +65,7 @@ describe Sequel::Model::Errors do
65
65
  @errors.full_messages.should == []
66
66
 
67
67
  @errors[:blow] << 'blieuh'
68
- @errors[:blow] << 'blich'.lit
68
+ @errors[:blow] << Sequel.lit('blich')
69
69
  @errors[:blay] << 'bliu'
70
70
  msgs = @errors.full_messages
71
71
  msgs.size.should == 3
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sequel
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.37.0
4
+ version: 3.38.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-02 00:00:00.000000000 Z
12
+ date: 2012-08-01 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: The Database Toolkit for Ruby
15
15
  email: code@jeremyevans.net
@@ -42,6 +42,7 @@ extra_rdoc_files:
42
42
  - doc/transactions.rdoc
43
43
  - doc/thread_safety.rdoc
44
44
  - doc/object_model.rdoc
45
+ - doc/core_extensions.rdoc
45
46
  - doc/release_notes/1.0.txt
46
47
  - doc/release_notes/1.1.txt
47
48
  - doc/release_notes/1.3.txt
@@ -98,6 +99,7 @@ extra_rdoc_files:
98
99
  - doc/release_notes/3.35.0.txt
99
100
  - doc/release_notes/3.36.0.txt
100
101
  - doc/release_notes/3.37.0.txt
102
+ - doc/release_notes/3.38.0.txt
101
103
  files:
102
104
  - MIT-LICENSE
103
105
  - CHANGELOG
@@ -172,6 +174,7 @@ files:
172
174
  - doc/release_notes/3.35.0.txt
173
175
  - doc/release_notes/3.36.0.txt
174
176
  - doc/release_notes/3.37.0.txt
177
+ - doc/release_notes/3.38.0.txt
175
178
  - doc/sharding.rdoc
176
179
  - doc/sql.rdoc
177
180
  - doc/validations.rdoc
@@ -182,6 +185,7 @@ files:
182
185
  - doc/transactions.rdoc
183
186
  - doc/thread_safety.rdoc
184
187
  - doc/object_model.rdoc
188
+ - doc/core_extensions.rdoc
185
189
  - spec/adapters/firebird_spec.rb
186
190
  - spec/adapters/informix_spec.rb
187
191
  - spec/adapters/mssql_spec.rb
@@ -276,7 +280,6 @@ files:
276
280
  - spec/extensions/query_literals_spec.rb
277
281
  - spec/extensions/dirty_spec.rb
278
282
  - spec/extensions/pg_json_spec.rb
279
- - spec/extensions/core_extensions_spec.rb
280
283
  - spec/extensions/pg_inet_spec.rb
281
284
  - spec/extensions/eval_inspect_spec.rb
282
285
  - spec/extensions/pg_range_spec.rb
@@ -284,6 +287,10 @@ files:
284
287
  - spec/extensions/pg_range_ops_spec.rb
285
288
  - spec/extensions/pg_interval_spec.rb
286
289
  - spec/extensions/columns_introspection_spec.rb
290
+ - spec/extensions/pg_row_ops_spec.rb
291
+ - spec/extensions/pg_row_plugin_spec.rb
292
+ - spec/extensions/pg_row_spec.rb
293
+ - spec/extensions/pg_typecast_on_load_spec.rb
287
294
  - spec/integration/associations_test.rb
288
295
  - spec/integration/database_test.rb
289
296
  - spec/integration/dataset_test.rb
@@ -356,6 +363,7 @@ files:
356
363
  - spec/files/transaction_specified_migrations/002_create_basic.rb
357
364
  - spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb
358
365
  - spec/files/transaction_unspecified_migrations/002_create_basic.rb
366
+ - spec/core_extensions_spec.rb
359
367
  - lib/sequel.rb
360
368
  - lib/sequel/adapters/ado.rb
361
369
  - lib/sequel/adapters/ado/mssql.rb
@@ -475,6 +483,8 @@ files:
475
483
  - lib/sequel/extensions/split_array_nil.rb
476
484
  - lib/sequel/extensions/pg_range_ops.rb
477
485
  - lib/sequel/extensions/pg_interval.rb
486
+ - lib/sequel/extensions/pg_row.rb
487
+ - lib/sequel/extensions/pg_row_ops.rb
478
488
  - lib/sequel/metaprogramming.rb
479
489
  - lib/sequel/model.rb
480
490
  - lib/sequel/model/associations.rb
@@ -532,6 +542,8 @@ files:
532
542
  - lib/sequel/plugins/many_to_one_pk_lookup.rb
533
543
  - lib/sequel/plugins/dirty.rb
534
544
  - lib/sequel/plugins/eager_each.rb
545
+ - lib/sequel/plugins/pg_row.rb
546
+ - lib/sequel/plugins/pg_typecast_on_load.rb
535
547
  - lib/sequel/timezones.rb
536
548
  - lib/sequel/version.rb
537
549
  - lib/sequel/ast_transformer.rb
@@ -565,7 +577,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
565
577
  version: '0'
566
578
  requirements: []
567
579
  rubyforge_project: sequel
568
- rubygems_version: 1.8.11
580
+ rubygems_version: 1.8.23
569
581
  signing_key:
570
582
  specification_version: 3
571
583
  summary: The Database Toolkit for Ruby