sequel 3.11.0 → 3.12.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 (136) hide show
  1. data/CHANGELOG +70 -0
  2. data/Rakefile +1 -1
  3. data/doc/active_record.rdoc +896 -0
  4. data/doc/advanced_associations.rdoc +46 -31
  5. data/doc/association_basics.rdoc +14 -9
  6. data/doc/dataset_basics.rdoc +3 -3
  7. data/doc/migration.rdoc +1011 -0
  8. data/doc/model_hooks.rdoc +198 -0
  9. data/doc/querying.rdoc +811 -86
  10. data/doc/release_notes/3.12.0.txt +304 -0
  11. data/doc/sharding.rdoc +17 -0
  12. data/doc/sql.rdoc +537 -0
  13. data/doc/validations.rdoc +501 -0
  14. data/lib/sequel/adapters/jdbc.rb +19 -27
  15. data/lib/sequel/adapters/jdbc/postgresql.rb +0 -7
  16. data/lib/sequel/adapters/mysql.rb +5 -4
  17. data/lib/sequel/adapters/odbc.rb +3 -2
  18. data/lib/sequel/adapters/shared/mssql.rb +7 -6
  19. data/lib/sequel/adapters/shared/mysql.rb +2 -7
  20. data/lib/sequel/adapters/shared/postgres.rb +2 -8
  21. data/lib/sequel/adapters/shared/sqlite.rb +2 -5
  22. data/lib/sequel/adapters/sqlite.rb +4 -4
  23. data/lib/sequel/core.rb +0 -1
  24. data/lib/sequel/database.rb +2 -1060
  25. data/lib/sequel/database/connecting.rb +227 -0
  26. data/lib/sequel/database/dataset.rb +58 -0
  27. data/lib/sequel/database/dataset_defaults.rb +127 -0
  28. data/lib/sequel/database/logging.rb +62 -0
  29. data/lib/sequel/database/misc.rb +246 -0
  30. data/lib/sequel/database/query.rb +390 -0
  31. data/lib/sequel/database/schema_generator.rb +7 -3
  32. data/lib/sequel/database/schema_methods.rb +351 -7
  33. data/lib/sequel/dataset/actions.rb +9 -2
  34. data/lib/sequel/dataset/misc.rb +6 -2
  35. data/lib/sequel/dataset/mutation.rb +3 -11
  36. data/lib/sequel/dataset/query.rb +49 -6
  37. data/lib/sequel/exceptions.rb +3 -0
  38. data/lib/sequel/extensions/migration.rb +395 -113
  39. data/lib/sequel/extensions/schema_dumper.rb +21 -13
  40. data/lib/sequel/model.rb +27 -25
  41. data/lib/sequel/model/associations.rb +72 -34
  42. data/lib/sequel/model/base.rb +74 -18
  43. data/lib/sequel/model/errors.rb +8 -1
  44. data/lib/sequel/plugins/active_model.rb +8 -0
  45. data/lib/sequel/plugins/association_pks.rb +87 -0
  46. data/lib/sequel/plugins/association_proxies.rb +8 -0
  47. data/lib/sequel/plugins/boolean_readers.rb +12 -6
  48. data/lib/sequel/plugins/caching.rb +14 -7
  49. data/lib/sequel/plugins/class_table_inheritance.rb +15 -9
  50. data/lib/sequel/plugins/composition.rb +2 -1
  51. data/lib/sequel/plugins/force_encoding.rb +10 -7
  52. data/lib/sequel/plugins/hook_class_methods.rb +12 -11
  53. data/lib/sequel/plugins/identity_map.rb +9 -0
  54. data/lib/sequel/plugins/instance_hooks.rb +23 -13
  55. data/lib/sequel/plugins/lazy_attributes.rb +4 -1
  56. data/lib/sequel/plugins/many_through_many.rb +18 -4
  57. data/lib/sequel/plugins/nested_attributes.rb +1 -0
  58. data/lib/sequel/plugins/optimistic_locking.rb +1 -1
  59. data/lib/sequel/plugins/rcte_tree.rb +9 -8
  60. data/lib/sequel/plugins/schema.rb +8 -0
  61. data/lib/sequel/plugins/serialization.rb +1 -3
  62. data/lib/sequel/plugins/sharding.rb +135 -0
  63. data/lib/sequel/plugins/single_table_inheritance.rb +117 -25
  64. data/lib/sequel/plugins/skip_create_refresh.rb +35 -0
  65. data/lib/sequel/plugins/string_stripper.rb +26 -0
  66. data/lib/sequel/plugins/tactical_eager_loading.rb +8 -0
  67. data/lib/sequel/plugins/timestamps.rb +15 -2
  68. data/lib/sequel/plugins/touch.rb +13 -0
  69. data/lib/sequel/plugins/update_primary_key.rb +48 -0
  70. data/lib/sequel/plugins/validation_class_methods.rb +8 -0
  71. data/lib/sequel/plugins/validation_helpers.rb +1 -1
  72. data/lib/sequel/sql.rb +17 -20
  73. data/lib/sequel/version.rb +1 -1
  74. data/spec/adapters/postgres_spec.rb +5 -5
  75. data/spec/core/core_sql_spec.rb +17 -1
  76. data/spec/core/database_spec.rb +17 -5
  77. data/spec/core/dataset_spec.rb +31 -8
  78. data/spec/core/schema_generator_spec.rb +8 -1
  79. data/spec/core/schema_spec.rb +13 -0
  80. data/spec/extensions/association_pks_spec.rb +85 -0
  81. data/spec/extensions/hook_class_methods_spec.rb +9 -9
  82. data/spec/extensions/migration_spec.rb +339 -219
  83. data/spec/extensions/schema_dumper_spec.rb +28 -17
  84. data/spec/extensions/sharding_spec.rb +272 -0
  85. data/spec/extensions/single_table_inheritance_spec.rb +92 -4
  86. data/spec/extensions/skip_create_refresh_spec.rb +17 -0
  87. data/spec/extensions/string_stripper_spec.rb +23 -0
  88. data/spec/extensions/update_primary_key_spec.rb +65 -0
  89. data/spec/extensions/validation_class_methods_spec.rb +5 -5
  90. data/spec/files/bad_down_migration/001_create_alt_basic.rb +4 -0
  91. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +4 -0
  92. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +9 -0
  93. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +9 -0
  94. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +3 -0
  95. data/spec/files/bad_up_migration/001_create_alt_basic.rb +4 -0
  96. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +3 -0
  97. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +9 -0
  98. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +9 -0
  99. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +4 -0
  100. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +9 -0
  101. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +9 -0
  102. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +4 -0
  103. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +4 -0
  104. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +9 -0
  105. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +9 -0
  106. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +4 -0
  107. data/spec/files/integer_migrations/001_create_sessions.rb +9 -0
  108. data/spec/files/integer_migrations/002_create_nodes.rb +9 -0
  109. data/spec/files/integer_migrations/003_3_create_users.rb +4 -0
  110. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +9 -0
  111. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +9 -0
  112. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +9 -0
  113. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +9 -0
  114. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +4 -0
  115. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +4 -0
  116. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +4 -0
  117. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +9 -0
  118. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +4 -0
  119. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +9 -0
  120. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +9 -0
  121. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +4 -0
  122. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +9 -0
  123. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +9 -0
  124. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +4 -0
  125. data/spec/integration/eager_loader_test.rb +20 -20
  126. data/spec/integration/migrator_test.rb +187 -0
  127. data/spec/integration/plugin_test.rb +150 -0
  128. data/spec/integration/schema_test.rb +13 -2
  129. data/spec/model/associations_spec.rb +41 -14
  130. data/spec/model/base_spec.rb +69 -0
  131. data/spec/model/eager_loading_spec.rb +7 -3
  132. data/spec/model/record_spec.rb +79 -4
  133. data/spec/model/validations_spec.rb +21 -9
  134. metadata +66 -5
  135. data/doc/schema.rdoc +0 -36
  136. data/lib/sequel/database/schema_sql.rb +0 -320
@@ -0,0 +1,17 @@
1
+ require File.join(File.dirname(__FILE__), "spec_helper")
2
+
3
+ describe "Sequel::Plugins::SkipCreateRefresh" do
4
+ it "should skip the refresh after saving a new object" do
5
+ c = Class.new(Sequel::Model(:a))
6
+ c.columns :id, :x
7
+ c.db.reset
8
+ c.dataset.meta_def(:insert){|*a| super(*a); 2}
9
+ c.create(:x=>1)
10
+ c.db.sqls.should == ['INSERT INTO a (x) VALUES (1)', 'SELECT * FROM a WHERE (id = 2) LIMIT 1']
11
+
12
+ c.plugin :skip_create_refresh
13
+ c.db.reset
14
+ c.create(:x=>3).values.should == {:id=>2, :x=>3}
15
+ c.db.sqls.should == ['INSERT INTO a (x) VALUES (3)']
16
+ end
17
+ end
@@ -0,0 +1,23 @@
1
+ require File.join(File.dirname(__FILE__), "spec_helper")
2
+
3
+ describe "Sequel::Plugins::StringStripper" do
4
+ before do
5
+ @db = Sequel::Database.new
6
+ @c = Class.new(Sequel::Model(@db))
7
+ @c.plugin :string_stripper
8
+ @c.columns :name
9
+ @o = @c.new
10
+ end
11
+
12
+ it "should strip all input strings" do
13
+ @o.name = ' name '
14
+ @o.name.should == 'name'
15
+ end
16
+
17
+ it "should not affect other types" do
18
+ @o.name = 1
19
+ @o.name.should == 1
20
+ @o.name = Date.today
21
+ @o.name.should == Date.today
22
+ end
23
+ end
@@ -0,0 +1,65 @@
1
+ require File.join(File.dirname(__FILE__), "spec_helper")
2
+
3
+ describe "Sequel::Plugins::UpdatePrimaryKey" do
4
+ before do
5
+ @c = Class.new(Sequel::Model(:a))
6
+ @c.plugin :update_primary_key
7
+ @c.columns :a, :b
8
+ @c.set_primary_key :a
9
+ @c.unrestrict_primary_key
10
+ @o = @c.new
11
+ @ds = @c.dataset
12
+ @ds.extend(Module.new do
13
+ attr_accessor :a
14
+ def fetch_rows(sql)
15
+ yield(a.dup)
16
+ end
17
+
18
+ def update(h)
19
+ if literal(opts[:where]) =~ /a = (\d)/ and $1.to_i == a[:a]
20
+ a.update(h)
21
+ end
22
+ super
23
+ end
24
+ end)
25
+ @ds.a = {:a=>1, :b=>3}
26
+ @ds2 = @ds.naked
27
+ MODEL_DB.reset
28
+ end
29
+
30
+ specify "should handle regular updates" do
31
+ @c.first.update(:b=>4)
32
+ @ds2.all.should == [{:a=>1, :b=>4}]
33
+ @c.first.set(:b=>5).save
34
+ @ds2.all.should == [{:a=>1, :b=>5}]
35
+ @c.first.set(:b=>6).save(:b)
36
+ @ds2.all.should == [{:a=>1, :b=>6}]
37
+ end
38
+
39
+ specify "should handle updating the primary key field with another field" do
40
+ @c.first.update(:a=>2, :b=>4)
41
+ @ds2.all.should == [{:a=>2, :b=>4}]
42
+ end
43
+
44
+ specify "should handle updating just the primary key field when saving changes" do
45
+ @c.first.update(:a=>2)
46
+ @ds2.all.should == [{:a=>2, :b=>3}]
47
+ @c.first.set(:a=>3).save(:a)
48
+ @ds2.all.should == [{:a=>3, :b=>3}]
49
+ end
50
+
51
+ specify "should handle saving after modifying the primary key field with another field" do
52
+ @c.first.set(:a=>2, :b=>4).save
53
+ @ds2.all.should == [{:a=>2, :b=>4}]
54
+ end
55
+
56
+ specify "should handle saving after modifying just the primary key field" do
57
+ @c.first.set(:a=>2).save
58
+ @ds2.all.should == [{:a=>2, :b=>3}]
59
+ end
60
+
61
+ specify "should handle saving after updating the primary key" do
62
+ @c.first.update(:a=>2).update(:b=>4).set(:b=>5).save
63
+ @ds2.all.should == [{:a=>2, :b=>5}]
64
+ end
65
+ end
@@ -944,10 +944,10 @@ describe "Model#save" do
944
944
  before do
945
945
  @c = Class.new(Sequel::Model(:people))
946
946
  @c.class_eval do
947
- columns :id
947
+ columns :id, :x
948
948
 
949
- validates_each :id do |o, a, v|
950
- o.errors[a] << 'blah' unless v == 5
949
+ validates_each :x do |o, a, v|
950
+ o.errors[a] << 'blah' unless v == 7
951
951
  end
952
952
  end
953
953
  @m = @c.load(:id => 4, :x=>6)
@@ -960,10 +960,10 @@ describe "Model#save" do
960
960
  @m.save
961
961
  MODEL_DB.sqls.should be_empty
962
962
 
963
- @m.id = 5
963
+ @m.x = 7
964
964
  @m.should be_valid
965
965
  @m.save.should_not be_false
966
- MODEL_DB.sqls.should == ['UPDATE people SET x = 6 WHERE (id = 5)']
966
+ MODEL_DB.sqls.should == ['UPDATE people SET x = 7 WHERE (id = 4)']
967
967
  end
968
968
 
969
969
  specify "should skip validations if the :validate=>false option is used" do
@@ -0,0 +1,4 @@
1
+ Sequel.migration do
2
+ up{create_table(:sm11111){Integer :smc1}}
3
+ down{get(:asdfsadfsa)}
4
+ end
@@ -0,0 +1,4 @@
1
+ Sequel.migration do
2
+ up{create_table(:sm22222){Integer :smc2}}
3
+ down{drop_table(:sm22222)}
4
+ end
@@ -0,0 +1,9 @@
1
+ class CreateSessions < Sequel::Migration
2
+ def up
3
+ create_table(:sm1111){Integer :smc1}
4
+ end
5
+
6
+ def down
7
+ get(:asdfsadfas)
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ Class.new(Sequel::Migration) do
2
+ def up
3
+ create_table(:sm2222){Integer :smc2}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm2222)
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ Sequel.migration do
2
+ up{get(:asdfsadfas)}
3
+ end
@@ -0,0 +1,4 @@
1
+ Sequel.migration do
2
+ up{create_table(:sm11111){Integer :smc1}}
3
+ down{drop_table(:sm11111)}
4
+ end
@@ -0,0 +1,3 @@
1
+ Sequel.migration do
2
+ up{get(:asdfassfd)}
3
+ end
@@ -0,0 +1,9 @@
1
+ class CreateSessions < Sequel::Migration
2
+ def up
3
+ create_table(:sm1111){Integer :smc1}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm1111)
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ Class.new(Sequel::Migration) do
2
+ def up
3
+ create_table(:sm2222){Integer :smc2}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm2222)
8
+ end
9
+ end
@@ -0,0 +1,4 @@
1
+ Sequel.migration do
2
+ up{create_table(:sm3333){Integer :smc3}}
3
+ down{drop_table(:sm3333)}
4
+ end
@@ -0,0 +1,9 @@
1
+ class CreateArtists < Sequel::Migration
2
+ def up
3
+ create_table(:sm1122){Integer :smc12}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm1122)
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class CreateAlbums < Sequel::Migration
2
+ def up
3
+ create_table(:sm2233){Integer :smc23}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm2233)
8
+ end
9
+ end
@@ -0,0 +1,4 @@
1
+ Sequel.migration do
2
+ up{create_table(:sm33333){Integer :smc3}}
3
+ down{drop_table(:sm33333)}
4
+ end
@@ -0,0 +1,4 @@
1
+ Sequel.migration do
2
+ up{create_table(:sm11111){Integer :smc1}}
3
+ down{drop_table(:sm11111)}
4
+ end
@@ -0,0 +1,9 @@
1
+ class CreateSessions < Sequel::Migration
2
+ def up
3
+ create_table(:sm1111){Integer :smc1}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm1111)
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ Class.new(Sequel::Migration) do
2
+ def up
3
+ create_table(:sm2222){Integer :smc2}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm2222)
8
+ end
9
+ end
@@ -0,0 +1,4 @@
1
+ Sequel.migration do
2
+ up{create_table(:sm3333){Integer :smc3}}
3
+ down{drop_table(:sm3333)}
4
+ end
@@ -0,0 +1,9 @@
1
+ class CreateSessions < Sequel::Migration
2
+ def up
3
+ create_table(:sm1111){Integer :smc1}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm1111)
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ Class.new(Sequel::Migration) do
2
+ def up
3
+ create_table(:sm2222){Integer :smc2}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm2222)
8
+ end
9
+ end
@@ -0,0 +1,4 @@
1
+ Sequel.migration do
2
+ up{create_table(:sm3333){Integer :smc3}}
3
+ down{drop_table(:sm3333)}
4
+ end
@@ -0,0 +1,9 @@
1
+ class CreateSessions < Sequel::Migration
2
+ def up
3
+ create_table(:sm1111){Integer :smc1}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm1111)
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class CreateArtists < Sequel::Migration
2
+ def up
3
+ create_table(:sm1122){Integer :smc12}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm1122)
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ Class.new(Sequel::Migration) do
2
+ def up
3
+ create_table(:sm2222){Integer :smc2}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm2222)
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class CreateAlbums < Sequel::Migration
2
+ def up
3
+ create_table(:sm2233){Integer :smc23}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm2233)
8
+ end
9
+ end
@@ -0,0 +1,4 @@
1
+ Sequel.migration do
2
+ up{create_table(:sm3333){Integer :smc3}}
3
+ down{drop_table(:sm3333)}
4
+ end
@@ -0,0 +1,4 @@
1
+ Sequel.migration do
2
+ up{create_table(:sm11111){Integer :smc1}}
3
+ down{drop_table(:sm11111)}
4
+ end
@@ -0,0 +1,4 @@
1
+ Sequel.migration do
2
+ up{create_table(:sm33333){Integer :smc3}}
3
+ down{drop_table(:sm33333)}
4
+ end
@@ -0,0 +1,9 @@
1
+ class CreateSessions < Sequel::Migration
2
+ def up
3
+ create_table(:sm1111){Integer :smc1}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm1111)
8
+ end
9
+ end
@@ -0,0 +1,4 @@
1
+ Sequel.migration do
2
+ up{create_table(:sm3333){Integer :smc3}}
3
+ down{drop_table(:sm3333)}
4
+ end
@@ -0,0 +1,9 @@
1
+ class CreateSessions < Sequel::Migration
2
+ def up
3
+ create_table(:sm1111){Integer :smc1}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm1111)
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ Class.new(Sequel::Migration) do
2
+ def up
3
+ create_table(:sm2222){Integer :smc2}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm2222)
8
+ end
9
+ end
@@ -0,0 +1,4 @@
1
+ Sequel.migration do
2
+ up{create_table(:sm3333){Integer :smc3}}
3
+ down{drop_table(:sm3333)}
4
+ end
@@ -0,0 +1,9 @@
1
+ class CreateSessions < Sequel::Migration
2
+ def up
3
+ create_table(:sm1111){Integer :smc1}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm1111)
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ Class.new(Sequel::Migration) do
2
+ def up
3
+ create_table(:sm2222){Integer :smc2}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm2222)
8
+ end
9
+ end
@@ -0,0 +1,4 @@
1
+ Sequel.migration do
2
+ up{create_table(:sm3333){Integer :smc3}}
3
+ down{drop_table(:sm3333)}
4
+ end