sequel 3.11.0 → 3.12.0

Sign up to get free protection for your applications and to get access to all the features.
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