sequel 3.34.1 → 3.35.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.
- data/CHANGELOG +52 -0
- data/README.rdoc +3 -1
- data/Rakefile +2 -10
- data/doc/active_record.rdoc +1 -0
- data/doc/migration.rdoc +18 -7
- data/doc/model_hooks.rdoc +6 -0
- data/doc/opening_databases.rdoc +3 -0
- data/doc/prepared_statements.rdoc +0 -1
- data/doc/release_notes/3.35.0.txt +144 -0
- data/doc/schema_modification.rdoc +16 -1
- data/doc/thread_safety.rdoc +17 -0
- data/lib/sequel/adapters/do.rb +2 -2
- data/lib/sequel/adapters/do/postgres.rb +1 -52
- data/lib/sequel/adapters/do/sqlite.rb +0 -5
- data/lib/sequel/adapters/firebird.rb +1 -1
- data/lib/sequel/adapters/ibmdb.rb +2 -2
- data/lib/sequel/adapters/jdbc.rb +23 -19
- data/lib/sequel/adapters/jdbc/db2.rb +0 -5
- data/lib/sequel/adapters/jdbc/derby.rb +29 -2
- data/lib/sequel/adapters/jdbc/firebird.rb +0 -5
- data/lib/sequel/adapters/jdbc/h2.rb +1 -1
- data/lib/sequel/adapters/jdbc/hsqldb.rb +7 -0
- data/lib/sequel/adapters/jdbc/informix.rb +0 -5
- data/lib/sequel/adapters/jdbc/jtds.rb +0 -5
- data/lib/sequel/adapters/jdbc/mysql.rb +0 -5
- data/lib/sequel/adapters/jdbc/postgresql.rb +4 -35
- data/lib/sequel/adapters/jdbc/sqlite.rb +0 -5
- data/lib/sequel/adapters/jdbc/sqlserver.rb +0 -5
- data/lib/sequel/adapters/jdbc/transactions.rb +4 -4
- data/lib/sequel/adapters/mysql2.rb +1 -1
- data/lib/sequel/adapters/odbc.rb +3 -3
- data/lib/sequel/adapters/odbc/mssql.rb +14 -1
- data/lib/sequel/adapters/oracle.rb +6 -18
- data/lib/sequel/adapters/postgres.rb +36 -53
- data/lib/sequel/adapters/shared/db2.rb +16 -2
- data/lib/sequel/adapters/shared/mssql.rb +40 -9
- data/lib/sequel/adapters/shared/mysql.rb +16 -4
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +2 -2
- data/lib/sequel/adapters/shared/oracle.rb +2 -0
- data/lib/sequel/adapters/shared/postgres.rb +135 -211
- data/lib/sequel/adapters/sqlite.rb +2 -2
- data/lib/sequel/adapters/swift.rb +1 -1
- data/lib/sequel/adapters/swift/postgres.rb +1 -71
- data/lib/sequel/adapters/tinytds.rb +3 -3
- data/lib/sequel/core.rb +27 -4
- data/lib/sequel/database/connecting.rb +7 -8
- data/lib/sequel/database/logging.rb +6 -1
- data/lib/sequel/database/misc.rb +20 -4
- data/lib/sequel/database/query.rb +38 -18
- data/lib/sequel/database/schema_generator.rb +5 -2
- data/lib/sequel/database/schema_methods.rb +34 -8
- data/lib/sequel/dataset/prepared_statements.rb +1 -1
- data/lib/sequel/dataset/sql.rb +18 -24
- data/lib/sequel/extensions/core_extensions.rb +0 -23
- data/lib/sequel/extensions/migration.rb +22 -8
- data/lib/sequel/extensions/pg_auto_parameterize.rb +4 -0
- data/lib/sequel/extensions/schema_dumper.rb +1 -1
- data/lib/sequel/model.rb +2 -2
- data/lib/sequel/model/associations.rb +95 -70
- data/lib/sequel/model/base.rb +16 -18
- data/lib/sequel/plugins/dirty.rb +214 -0
- data/lib/sequel/plugins/identity_map.rb +1 -1
- data/lib/sequel/plugins/json_serializer.rb +16 -1
- data/lib/sequel/plugins/many_through_many.rb +22 -32
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +2 -2
- data/lib/sequel/plugins/prepared_statements.rb +22 -8
- data/lib/sequel/plugins/prepared_statements_associations.rb +2 -3
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +1 -1
- data/lib/sequel/plugins/single_table_inheritance.rb +1 -1
- data/lib/sequel/plugins/subclasses.rb +10 -2
- data/lib/sequel/plugins/timestamps.rb +1 -1
- data/lib/sequel/plugins/xml_serializer.rb +12 -1
- data/lib/sequel/sql.rb +1 -1
- data/lib/sequel/version.rb +2 -2
- data/spec/adapters/postgres_spec.rb +30 -79
- data/spec/core/database_spec.rb +46 -2
- data/spec/core/dataset_spec.rb +28 -22
- data/spec/core/schema_generator_spec.rb +1 -1
- data/spec/core/schema_spec.rb +51 -0
- data/spec/extensions/arbitrary_servers_spec.rb +0 -4
- data/spec/extensions/association_autoreloading_spec.rb +17 -0
- data/spec/extensions/association_proxies_spec.rb +4 -4
- data/spec/extensions/core_extensions_spec.rb +1 -24
- data/spec/extensions/dirty_spec.rb +155 -0
- data/spec/extensions/json_serializer_spec.rb +13 -0
- data/spec/extensions/migration_spec.rb +28 -15
- data/spec/extensions/named_timezones_spec.rb +6 -8
- data/spec/extensions/pg_auto_parameterize_spec.rb +6 -5
- data/spec/extensions/schema_dumper_spec.rb +3 -1
- data/spec/extensions/xml_serializer_spec.rb +13 -0
- data/spec/files/{transactionless_migrations → transaction_specified_migrations}/001_create_alt_basic.rb +1 -1
- data/spec/files/{transactionless_migrations → transaction_specified_migrations}/002_create_basic.rb +0 -0
- data/spec/files/{transaction_migrations → transaction_unspecified_migrations}/001_create_alt_basic.rb +0 -0
- data/spec/files/{transaction_migrations → transaction_unspecified_migrations}/002_create_basic.rb +0 -0
- data/spec/integration/associations_test.rb +5 -7
- data/spec/integration/dataset_test.rb +25 -7
- data/spec/integration/plugin_test.rb +1 -1
- data/spec/integration/schema_test.rb +16 -1
- data/spec/model/associations_spec.rb +2 -2
- metadata +14 -9
- data/lib/sequel/adapters/odbc/db2.rb +0 -17
|
@@ -8,7 +8,7 @@ describe Sequel::Schema::Generator do
|
|
|
8
8
|
foreign_key :parent_id
|
|
9
9
|
primary_key :id
|
|
10
10
|
check 'price > 100'
|
|
11
|
-
constraint(:xxx) {:yyy
|
|
11
|
+
constraint(:xxx) {{:yyy => :zzz}}
|
|
12
12
|
index :title
|
|
13
13
|
index [:title, :body], :unique => true
|
|
14
14
|
foreign_key :node_id, :nodes
|
data/spec/core/schema_spec.rb
CHANGED
|
@@ -287,6 +287,13 @@ describe "DB#create_table" do
|
|
|
287
287
|
@db.sqls.should == ["CREATE TABLE cats (id integer)", "CREATE INDEX cats_id_index ON cats (id)"]
|
|
288
288
|
end
|
|
289
289
|
|
|
290
|
+
specify "should accept inline index definition with a hash of options" do
|
|
291
|
+
@db.create_table(:cats) do
|
|
292
|
+
integer :id, :index => {:unique=>true}
|
|
293
|
+
end
|
|
294
|
+
@db.sqls.should == ["CREATE TABLE cats (id integer)", "CREATE UNIQUE INDEX cats_id_index ON cats (id)"]
|
|
295
|
+
end
|
|
296
|
+
|
|
290
297
|
specify "should accept inline index definition for foreign keys" do
|
|
291
298
|
@db.create_table(:cats) do
|
|
292
299
|
foreign_key :project_id, :table => :projects, :on_delete => :cascade, :index => true
|
|
@@ -295,6 +302,14 @@ describe "DB#create_table" do
|
|
|
295
302
|
"CREATE INDEX cats_project_id_index ON cats (project_id)"]
|
|
296
303
|
end
|
|
297
304
|
|
|
305
|
+
specify "should accept inline index definition for foreign keys with a hash of options" do
|
|
306
|
+
@db.create_table(:cats) do
|
|
307
|
+
foreign_key :project_id, :table => :projects, :on_delete => :cascade, :index => {:unique=>true}
|
|
308
|
+
end
|
|
309
|
+
@db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects ON DELETE CASCADE)",
|
|
310
|
+
"CREATE UNIQUE INDEX cats_project_id_index ON cats (project_id)"]
|
|
311
|
+
end
|
|
312
|
+
|
|
298
313
|
specify "should accept index definitions" do
|
|
299
314
|
@db.create_table(:cats) do
|
|
300
315
|
integer :id
|
|
@@ -535,6 +550,20 @@ describe "DB#create_table" do
|
|
|
535
550
|
end
|
|
536
551
|
@db.sqls.should == ["CREATE TABLE cats (a integer, b integer, FOREIGN KEY (a, b) REFERENCES abc(x, y) ON DELETE SET NULL ON UPDATE SET NULL)"]
|
|
537
552
|
end
|
|
553
|
+
|
|
554
|
+
specify "should accept an :as option to create a table from the results of a dataset" do
|
|
555
|
+
@db.create_table(:cats, :as=>@db[:a])
|
|
556
|
+
@db.sqls.should == ['CREATE TABLE cats AS SELECT * FROM a']
|
|
557
|
+
end
|
|
558
|
+
|
|
559
|
+
specify "should accept an :as option to create a table from a SELECT string" do
|
|
560
|
+
@db.create_table(:cats, :as=>'SELECT * FROM a')
|
|
561
|
+
@db.sqls.should == ['CREATE TABLE cats AS SELECT * FROM a']
|
|
562
|
+
end
|
|
563
|
+
|
|
564
|
+
specify "should raise an Error if both a block and an :as argument are given" do
|
|
565
|
+
proc{@db.create_table(:cats, :as=>@db[:a]){}}.should raise_error(Sequel::Error)
|
|
566
|
+
end
|
|
538
567
|
end
|
|
539
568
|
|
|
540
569
|
describe "DB#create_table!" do
|
|
@@ -1155,6 +1184,28 @@ describe "Schema Parser" do
|
|
|
1155
1184
|
proc{@db.schema(:x)}.should raise_error(Sequel::Error)
|
|
1156
1185
|
end
|
|
1157
1186
|
|
|
1187
|
+
specify "should cache data by default" do
|
|
1188
|
+
@db.meta_def(:schema_parse_table) do |t, opts|
|
|
1189
|
+
[[:a, {}]]
|
|
1190
|
+
end
|
|
1191
|
+
@db.schema(:x).should equal(@db.schema(:x))
|
|
1192
|
+
end
|
|
1193
|
+
|
|
1194
|
+
specify "should not cache data if :reload=>true is given" do
|
|
1195
|
+
@db.meta_def(:schema_parse_table) do |t, opts|
|
|
1196
|
+
[[:a, {}]]
|
|
1197
|
+
end
|
|
1198
|
+
@db.schema(:x).should_not equal(@db.schema(:x, :reload=>true))
|
|
1199
|
+
end
|
|
1200
|
+
|
|
1201
|
+
specify "should not cache schema metadata if cache_schema is false" do
|
|
1202
|
+
@db.cache_schema = false
|
|
1203
|
+
@db.meta_def(:schema_parse_table) do |t, opts|
|
|
1204
|
+
[[:a, {}]]
|
|
1205
|
+
end
|
|
1206
|
+
@db.schema(:x).should_not equal(@db.schema(:x))
|
|
1207
|
+
end
|
|
1208
|
+
|
|
1158
1209
|
specify "should provide options if given a table name" do
|
|
1159
1210
|
c = nil
|
|
1160
1211
|
@db.meta_def(:schema_parse_table) do |t, opts|
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
2
|
|
|
3
|
-
if RUBY_VERSION >= '1.8.7'
|
|
4
3
|
describe "arbtirary servers" do
|
|
5
4
|
before do
|
|
6
5
|
@db = Sequel.mock(:servers=>{})
|
|
@@ -109,6 +108,3 @@ describe "arbtirary servers" do
|
|
|
109
108
|
'SELECT * FROM t -- {:host=>"b"}', 'SELECT * FROM t -- {:host=>"a"}', 'SELECT * FROM t', 'SELECT * FROM t -- {:host=>"c"}', 'SELECT * FROM t']
|
|
110
109
|
end
|
|
111
110
|
end
|
|
112
|
-
else
|
|
113
|
-
skip_warn "arbitrary_servers plugin: only works on ruby 1.8.7+"
|
|
114
|
-
end
|
|
@@ -24,6 +24,23 @@ describe "AssociationAutoreloading plugin" do
|
|
|
24
24
|
MODEL_DB.sqls.should == ['SELECT * FROM artists WHERE (artists.id = 1) LIMIT 1']
|
|
25
25
|
end
|
|
26
26
|
|
|
27
|
+
specify "should handle multiple many_to_one association with the same foreign key" do
|
|
28
|
+
@Album.many_to_one :artist2, :key=>:artist_id, :class=>@Artist
|
|
29
|
+
album = @Album.load(:id => 1, :name=>'Al', :artist_id=>2)
|
|
30
|
+
album.artist
|
|
31
|
+
album.artist2
|
|
32
|
+
MODEL_DB.sqls.should == ['SELECT * FROM artists WHERE (artists.id = 2) LIMIT 1'] * 2
|
|
33
|
+
|
|
34
|
+
album.artist
|
|
35
|
+
album.artist2
|
|
36
|
+
MODEL_DB.sqls.should == []
|
|
37
|
+
|
|
38
|
+
album.artist_id = 1
|
|
39
|
+
album.artist
|
|
40
|
+
album.artist2
|
|
41
|
+
MODEL_DB.sqls.should == ['SELECT * FROM artists WHERE (artists.id = 1) LIMIT 1'] * 2
|
|
42
|
+
end
|
|
43
|
+
|
|
27
44
|
specify "should not reload when value has not changed" do
|
|
28
45
|
album = @Album.load(:id => 1, :name=>'Al', :artist_id=>2)
|
|
29
46
|
album.artist
|
|
@@ -31,13 +31,13 @@ describe "Sequel::Plugins::AssociationProxies" do
|
|
|
31
31
|
|
|
32
32
|
it "should reload the cached association if sent an array method and the reload flag was given" do
|
|
33
33
|
@t.select{|x| false}.should == []
|
|
34
|
-
Item.db.sqls.length == 1
|
|
34
|
+
Item.db.sqls.length.should == 1
|
|
35
35
|
@t.select{|x| false}.should == []
|
|
36
|
-
Item.db.sqls.length ==
|
|
36
|
+
Item.db.sqls.length.should == 0
|
|
37
37
|
@i.tags(true).select{|x| false}.should == []
|
|
38
|
-
Item.db.sqls.length ==
|
|
38
|
+
Item.db.sqls.length.should == 1
|
|
39
39
|
@t.filter(:a=>1).sql.should == "SELECT tags.* FROM tags INNER JOIN items_tags ON ((items_tags.tag_id = tags.id) AND (items_tags.item_id = 1)) WHERE (a = 1)"
|
|
40
|
-
Item.db.sqls.length ==
|
|
40
|
+
Item.db.sqls.length.should == 0
|
|
41
41
|
end
|
|
42
42
|
|
|
43
43
|
it "should not return a proxy object for associations that do not return an array" do
|
|
@@ -3,7 +3,7 @@ require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper')
|
|
|
3
3
|
describe "Sequel core extensions" do
|
|
4
4
|
specify "should not be used inside Sequel, to insure Sequel works without them" do
|
|
5
5
|
usage = []
|
|
6
|
-
match_re = /(\.(
|
|
6
|
+
match_re = /(\.(sql_value_list|sql_array|sql_expr|sql_negate|sql_or|sql_string_join|lit|to_sequel_blob|case)\W)|:\w+\.(qualify|identifier|as|cast|asc|desc|sql_subscript|\*|sql_function)\W/
|
|
7
7
|
comment_re = /^\s*#|# core_sql/
|
|
8
8
|
Dir['lib/sequel/**/*.rb'].each do |f|
|
|
9
9
|
lines = File.read(f).split("\n").grep(match_re).delete_if{|l| l =~ comment_re}
|
|
@@ -18,29 +18,6 @@ describe "Sequel core extensions" do
|
|
|
18
18
|
end
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
-
describe "Array#all_two_pairs?" do
|
|
22
|
-
specify "should return false if empty" do
|
|
23
|
-
[].all_two_pairs?.should == false
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
specify "should return false if any of the elements is not an array" do
|
|
27
|
-
[1].all_two_pairs?.should == false
|
|
28
|
-
[[1,2],1].all_two_pairs?.should == false
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
specify "should return false if any of the elements has a length other than two" do
|
|
32
|
-
[[1,2],[]].all_two_pairs?.should == false
|
|
33
|
-
[[1,2],[1]].all_two_pairs?.should == false
|
|
34
|
-
[[1,2],[1,2,3]].all_two_pairs?.should == false
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
specify "should return true if all of the elements are arrays with a length of two" do
|
|
38
|
-
[[1,2]].all_two_pairs?.should == true
|
|
39
|
-
[[1,2],[1,2]].all_two_pairs?.should == true
|
|
40
|
-
[[1,2],[1,2],[1,2]].all_two_pairs?.should == true
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
|
|
44
21
|
describe "Array#case and Hash#case" do
|
|
45
22
|
before do
|
|
46
23
|
@d = Sequel::Dataset.new(nil)
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
|
+
|
|
3
|
+
describe "Sequel::Plugins::Dirty" do
|
|
4
|
+
before do
|
|
5
|
+
@db = Sequel.mock(:fetch=>{:initial=>'i', :initial_changed=>'ic'}, :numrows=>1)
|
|
6
|
+
@c = Class.new(Sequel::Model(@db[:c]))
|
|
7
|
+
@c.plugin :dirty
|
|
8
|
+
@c.columns :initial, :initial_changed, :missing, :missing_changed
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
shared_examples_for "dirty plugin" do
|
|
12
|
+
it "initial_value should be the current value if value has not changed" do
|
|
13
|
+
@o.initial_value(:initial).should == 'i'
|
|
14
|
+
@o.initial_value(:missing).should == nil
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "initial_value should be the intial value if value has changed" do
|
|
18
|
+
@o.initial_value(:initial_changed).should == 'ic'
|
|
19
|
+
@o.initial_value(:missing_changed).should == nil
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "initial_value should handle case where initial value is reassigned later" do
|
|
23
|
+
@o.initial_changed = 'ic'
|
|
24
|
+
@o.initial_value(:initial_changed).should == 'ic'
|
|
25
|
+
@o.missing_changed = nil
|
|
26
|
+
@o.initial_value(:missing_changed).should == nil
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "changed_columns should handle case where initial value is reassigned later" do
|
|
30
|
+
@o.changed_columns.should == [:initial_changed, :missing_changed]
|
|
31
|
+
@o.initial_changed = 'ic'
|
|
32
|
+
@o.changed_columns.should == [:missing_changed]
|
|
33
|
+
@o.missing_changed = nil
|
|
34
|
+
@o.changed_columns.should == [:missing_changed]
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "column_change should give initial and current values if there has been a change made" do
|
|
38
|
+
@o.column_change(:initial_changed).should == ['ic', 'ic2']
|
|
39
|
+
@o.column_change(:missing_changed).should == [nil, 'mc2']
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it "column_change should be nil if no change has been made" do
|
|
43
|
+
@o.column_change(:initial).should == nil
|
|
44
|
+
@o.column_change(:missing).should == nil
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it "column_changed? should return whether the column has changed" do
|
|
48
|
+
@o.column_changed?(:initial).should == false
|
|
49
|
+
@o.column_changed?(:initial_changed).should == true
|
|
50
|
+
@o.column_changed?(:missing).should == false
|
|
51
|
+
@o.column_changed?(:missing_changed).should == true
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "column_changed? should handle case where initial value is reassigned later" do
|
|
55
|
+
@o.initial_changed = 'ic'
|
|
56
|
+
@o.column_changed?(:initial_changed).should == false
|
|
57
|
+
@o.missing_changed = nil
|
|
58
|
+
@o.column_changed?(:missing_changed).should == false
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "changed_columns should handle case where initial value is reassigned later" do
|
|
62
|
+
@o.changed_columns.should == [:initial_changed, :missing_changed]
|
|
63
|
+
@o.initial_changed = 'ic'
|
|
64
|
+
@o.changed_columns.should == [:missing_changed]
|
|
65
|
+
@o.missing_changed = nil
|
|
66
|
+
@o.changed_columns.should == [:missing_changed]
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it "column_changes should give initial and current values" do
|
|
70
|
+
@o.column_changes.should == {:initial_changed=>['ic', 'ic2'], :missing_changed=>[nil, 'mc2']}
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it "reset_column should reset the column to its initial value" do
|
|
74
|
+
@o.reset_column(:initial)
|
|
75
|
+
@o.initial.should == 'i'
|
|
76
|
+
@o.reset_column(:initial_changed)
|
|
77
|
+
@o.initial_changed.should == 'ic'
|
|
78
|
+
@o.reset_column(:missing)
|
|
79
|
+
@o.missing.should == nil
|
|
80
|
+
@o.reset_column(:missing_changed)
|
|
81
|
+
@o.missing_changed.should == nil
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it "reset_column should remove missing values from the values" do
|
|
85
|
+
@o.reset_column(:missing)
|
|
86
|
+
@o.values.has_key?(:missing).should == false
|
|
87
|
+
@o.reset_column(:missing_changed)
|
|
88
|
+
@o.values.has_key?(:missing_changed).should == false
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
it "refresh should clear the cached initial values" do
|
|
92
|
+
@o.refresh
|
|
93
|
+
@o.column_changes.should == {}
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
it "will_change_column should be used to signal in-place modification to column" do
|
|
97
|
+
@o.will_change_column(:initial)
|
|
98
|
+
@o.initial << 'b'
|
|
99
|
+
@o.column_change(:initial).should == ['i', 'ib']
|
|
100
|
+
@o.will_change_column(:initial_changed)
|
|
101
|
+
@o.initial_changed << 'b'
|
|
102
|
+
@o.column_change(:initial_changed).should == ['ic', 'ic2b']
|
|
103
|
+
@o.will_change_column(:missing)
|
|
104
|
+
@o.values[:missing] = 'b'
|
|
105
|
+
@o.column_change(:missing).should == [nil, 'b']
|
|
106
|
+
@o.will_change_column(:missing_changed)
|
|
107
|
+
@o.missing_changed << 'b'
|
|
108
|
+
@o.column_change(:missing_changed).should == [nil, 'mc2b']
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
it "will_change_column should different types of existing objects" do
|
|
112
|
+
[nil, true, false, Class.new{undef_method :clone}.new, Class.new{def clone; raise TypeError; end}.new].each do |v|
|
|
113
|
+
o = @c.new(:initial=>v)
|
|
114
|
+
o.will_change_column(:initial)
|
|
115
|
+
o.initial = 'a'
|
|
116
|
+
o.column_change(:initial).should == [v, 'a']
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
it "save should clear the cached initial values" do
|
|
121
|
+
@o.save
|
|
122
|
+
@o.column_changes.should == {}
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
it "save_changes should clear the cached initial values" do
|
|
126
|
+
@o.save_changes
|
|
127
|
+
@o.column_changes.should == {}
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
describe "with new instance" do
|
|
132
|
+
before do
|
|
133
|
+
@o = @c.new(:initial=>'i', :initial_changed=>'ic')
|
|
134
|
+
@o.initial_changed = 'ic2'
|
|
135
|
+
@o.missing_changed = 'mc2'
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
it_should_behave_like "dirty plugin"
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
describe "with existing instance" do
|
|
142
|
+
before do
|
|
143
|
+
@o = @c[1]
|
|
144
|
+
@o.initial_changed = 'ic2'
|
|
145
|
+
@o.missing_changed = 'mc2'
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
it_should_behave_like "dirty plugin"
|
|
149
|
+
|
|
150
|
+
it "previous_changes should be the previous changes after saving" do
|
|
151
|
+
@o.save
|
|
152
|
+
@o.previous_changes.should == {:initial_changed=>['ic', 'ic2'], :missing_changed=>[nil, 'mc2']}
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
@@ -116,6 +116,19 @@ describe "Sequel::Plugins::JsonSerializer" do
|
|
|
116
116
|
JSON.parse(ds.to_json).should == [@album.values.inject({}){|h, (k, v)| h[k.to_s] = v; h}]
|
|
117
117
|
end
|
|
118
118
|
|
|
119
|
+
it "should have dataset to_json method respect :array option for the array to use" do
|
|
120
|
+
a = Album.load(:id=>1, :name=>'RF', :artist_id=>3)
|
|
121
|
+
JSON.parse(Album.to_json(:array=>[a])).should == [a]
|
|
122
|
+
|
|
123
|
+
a.associations[:artist] = artist = Artist.load(:id=>3, :name=>'YJM')
|
|
124
|
+
JSON.parse(Album.to_json(:array=>[a], :include=>:artist)).first.artist.should == artist
|
|
125
|
+
|
|
126
|
+
artist.associations[:albums] = [a]
|
|
127
|
+
x = JSON.parse(Artist.to_json(:array=>[artist], :include=>:albums))
|
|
128
|
+
x.should == [artist]
|
|
129
|
+
x.first.albums.should == [a]
|
|
130
|
+
end
|
|
131
|
+
|
|
119
132
|
it "should propagate class default options to instance to_json output" do
|
|
120
133
|
class ::Album2 < Sequel::Model
|
|
121
134
|
attr_accessor :blah
|
|
@@ -320,23 +320,30 @@ describe "Sequel::IntegerMigrator" do
|
|
|
320
320
|
proc{Sequel::IntegerMigrator.apply(@db, "spec/files/timestamped_migrations")}.should raise_error(Sequel::Migrator::Error)
|
|
321
321
|
end
|
|
322
322
|
|
|
323
|
-
specify "should use transactions by default" do
|
|
324
|
-
Sequel::Migrator.apply(@db, "spec/files/
|
|
323
|
+
specify "should not use transactions by default" do
|
|
324
|
+
Sequel::Migrator.apply(@db, "spec/files/transaction_unspecified_migrations")
|
|
325
|
+
@db.sqls.should == ["CREATE TABLE schema_info (version integer DEFAULT 0 NOT NULL)", "SELECT 1 AS one FROM schema_info LIMIT 1", "INSERT INTO schema_info (version) VALUES (0)", "SELECT version FROM schema_info LIMIT 1", "CREATE TABLE sm11111 (smc1 integer)", "UPDATE schema_info SET version = 1", "CREATE TABLE sm (smc1 integer)", "UPDATE schema_info SET version = 2"]
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
specify "should use transactions by default if the database supports transactional ddl" do
|
|
329
|
+
@db.meta_def(:supports_transactional_ddl?){true}
|
|
330
|
+
Sequel::Migrator.apply(@db, "spec/files/transaction_unspecified_migrations")
|
|
325
331
|
@db.sqls.should == ["CREATE TABLE schema_info (version integer DEFAULT 0 NOT NULL)", "SELECT 1 AS one FROM schema_info LIMIT 1", "INSERT INTO schema_info (version) VALUES (0)", "SELECT version FROM schema_info LIMIT 1", "BEGIN", "CREATE TABLE sm11111 (smc1 integer)", "UPDATE schema_info SET version = 1", "COMMIT", "BEGIN", "CREATE TABLE sm (smc1 integer)", "UPDATE schema_info SET version = 2", "COMMIT"]
|
|
326
332
|
end
|
|
327
333
|
|
|
328
|
-
specify "should
|
|
329
|
-
|
|
330
|
-
@db
|
|
334
|
+
specify "should respect transaction use on a per migration basis" do
|
|
335
|
+
@db.meta_def(:supports_transactional_ddl?){true}
|
|
336
|
+
Sequel::Migrator.apply(@db, "spec/files/transaction_specified_migrations")
|
|
337
|
+
@db.sqls.should == ["CREATE TABLE schema_info (version integer DEFAULT 0 NOT NULL)", "SELECT 1 AS one FROM schema_info LIMIT 1", "INSERT INTO schema_info (version) VALUES (0)", "SELECT version FROM schema_info LIMIT 1", "BEGIN", "CREATE TABLE sm11111 (smc1 integer)", "UPDATE schema_info SET version = 1", "COMMIT", "CREATE TABLE sm (smc1 integer)", "UPDATE schema_info SET version = 2"]
|
|
331
338
|
end
|
|
332
339
|
|
|
333
340
|
specify "should force transactions if enabled in the migrator" do
|
|
334
|
-
Sequel::Migrator.run(@db, "spec/files/
|
|
341
|
+
Sequel::Migrator.run(@db, "spec/files/transaction_specified_migrations", :use_transactions=>true)
|
|
335
342
|
@db.sqls.should == ["CREATE TABLE schema_info (version integer DEFAULT 0 NOT NULL)", "SELECT 1 AS one FROM schema_info LIMIT 1", "INSERT INTO schema_info (version) VALUES (0)", "SELECT version FROM schema_info LIMIT 1", "BEGIN", "CREATE TABLE sm11111 (smc1 integer)", "UPDATE schema_info SET version = 1", "COMMIT", "BEGIN", "CREATE TABLE sm (smc1 integer)", "UPDATE schema_info SET version = 2", "COMMIT"]
|
|
336
343
|
end
|
|
337
344
|
|
|
338
345
|
specify "should not use transactions if disabled in the migrator" do
|
|
339
|
-
Sequel::Migrator.run(@db, "spec/files/
|
|
346
|
+
Sequel::Migrator.run(@db, "spec/files/transaction_unspecified_migrations", :use_transactions=>false)
|
|
340
347
|
@db.sqls.should == ["CREATE TABLE schema_info (version integer DEFAULT 0 NOT NULL)", "SELECT 1 AS one FROM schema_info LIMIT 1", "INSERT INTO schema_info (version) VALUES (0)", "SELECT version FROM schema_info LIMIT 1", "CREATE TABLE sm11111 (smc1 integer)", "UPDATE schema_info SET version = 1", "CREATE TABLE sm (smc1 integer)", "UPDATE schema_info SET version = 2"]
|
|
341
348
|
end
|
|
342
349
|
end
|
|
@@ -598,26 +605,32 @@ describe "Sequel::TimestampMigrator" do
|
|
|
598
605
|
|
|
599
606
|
specify "should use TimestampMigrator if TimestampMigrator.apply is called even for integer migrations directory" do
|
|
600
607
|
Sequel::TimestampMigrator.apply(@db, "spec/files/integer_migrations")
|
|
601
|
-
@db.sqls.should == ["SELECT NULL FROM schema_migrations LIMIT 1", "CREATE TABLE schema_migrations (filename varchar(255) PRIMARY KEY)", "SELECT NULL FROM schema_info LIMIT 1", "SELECT filename FROM schema_migrations ORDER BY filename", "
|
|
608
|
+
@db.sqls.should == ["SELECT NULL FROM schema_migrations LIMIT 1", "CREATE TABLE schema_migrations (filename varchar(255) PRIMARY KEY)", "SELECT NULL FROM schema_info LIMIT 1", "SELECT filename FROM schema_migrations ORDER BY filename", "CREATE TABLE sm1111 (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('001_create_sessions.rb')", "CREATE TABLE sm2222 (smc2 integer)", "INSERT INTO schema_migrations (filename) VALUES ('002_create_nodes.rb')", "CREATE TABLE sm3333 (smc3 integer)", "INSERT INTO schema_migrations (filename) VALUES ('003_3_create_users.rb')"]
|
|
602
609
|
end
|
|
603
610
|
|
|
604
|
-
specify "should use transactions by default" do
|
|
605
|
-
Sequel::TimestampMigrator.apply(@db, "spec/files/
|
|
611
|
+
specify "should not use transactions by default" do
|
|
612
|
+
Sequel::TimestampMigrator.apply(@db, "spec/files/transaction_unspecified_migrations")
|
|
613
|
+
@db.sqls.should == ["SELECT NULL FROM schema_migrations LIMIT 1", "CREATE TABLE schema_migrations (filename varchar(255) PRIMARY KEY)", "SELECT NULL FROM schema_info LIMIT 1", "SELECT filename FROM schema_migrations ORDER BY filename", "CREATE TABLE sm11111 (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('001_create_alt_basic.rb')", "CREATE TABLE sm (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('002_create_basic.rb')"]
|
|
614
|
+
end
|
|
615
|
+
|
|
616
|
+
specify "should use transactions by default if database supports transactional ddl" do
|
|
617
|
+
@db.meta_def(:supports_transactional_ddl?){true}
|
|
618
|
+
Sequel::TimestampMigrator.apply(@db, "spec/files/transaction_unspecified_migrations")
|
|
606
619
|
@db.sqls.should == ["SELECT NULL FROM schema_migrations LIMIT 1", "CREATE TABLE schema_migrations (filename varchar(255) PRIMARY KEY)", "SELECT NULL FROM schema_info LIMIT 1", "SELECT filename FROM schema_migrations ORDER BY filename", "BEGIN", "CREATE TABLE sm11111 (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('001_create_alt_basic.rb')", "COMMIT", "BEGIN", "CREATE TABLE sm (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('002_create_basic.rb')", "COMMIT"]
|
|
607
620
|
end
|
|
608
621
|
|
|
609
|
-
specify "should
|
|
610
|
-
Sequel::TimestampMigrator.apply(@db, "spec/files/
|
|
611
|
-
@db.sqls.should == ["SELECT NULL FROM schema_migrations LIMIT 1", "CREATE TABLE schema_migrations (filename varchar(255) PRIMARY KEY)", "SELECT NULL FROM schema_info LIMIT 1", "SELECT filename FROM schema_migrations ORDER BY filename", "CREATE TABLE sm11111 (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('001_create_alt_basic.rb')", "CREATE TABLE sm (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('002_create_basic.rb')"]
|
|
622
|
+
specify "should support transaction use on a per migration basis" do
|
|
623
|
+
Sequel::TimestampMigrator.apply(@db, "spec/files/transaction_specified_migrations")
|
|
624
|
+
@db.sqls.should == ["SELECT NULL FROM schema_migrations LIMIT 1", "CREATE TABLE schema_migrations (filename varchar(255) PRIMARY KEY)", "SELECT NULL FROM schema_info LIMIT 1", "SELECT filename FROM schema_migrations ORDER BY filename", "BEGIN", "CREATE TABLE sm11111 (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('001_create_alt_basic.rb')", "COMMIT", "CREATE TABLE sm (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('002_create_basic.rb')"]
|
|
612
625
|
end
|
|
613
626
|
|
|
614
627
|
specify "should force transactions if enabled by the migrator" do
|
|
615
|
-
Sequel::TimestampMigrator.run(@db, "spec/files/
|
|
628
|
+
Sequel::TimestampMigrator.run(@db, "spec/files/transaction_specified_migrations", :use_transactions=>true)
|
|
616
629
|
@db.sqls.should == ["SELECT NULL FROM schema_migrations LIMIT 1", "CREATE TABLE schema_migrations (filename varchar(255) PRIMARY KEY)", "SELECT NULL FROM schema_info LIMIT 1", "SELECT filename FROM schema_migrations ORDER BY filename", "BEGIN", "CREATE TABLE sm11111 (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('001_create_alt_basic.rb')", "COMMIT", "BEGIN", "CREATE TABLE sm (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('002_create_basic.rb')", "COMMIT"]
|
|
617
630
|
end
|
|
618
631
|
|
|
619
632
|
specify "should not use transactions if disabled in the migrator" do
|
|
620
|
-
Sequel::TimestampMigrator.run(@db, "spec/files/
|
|
633
|
+
Sequel::TimestampMigrator.run(@db, "spec/files/transaction_unspecified_migrations", :use_transactions=>false)
|
|
621
634
|
@db.sqls.should == ["SELECT NULL FROM schema_migrations LIMIT 1", "CREATE TABLE schema_migrations (filename varchar(255) PRIMARY KEY)", "SELECT NULL FROM schema_info LIMIT 1", "SELECT filename FROM schema_migrations ORDER BY filename", "CREATE TABLE sm11111 (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('001_create_alt_basic.rb')", "CREATE TABLE sm (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('002_create_basic.rb')"]
|
|
622
635
|
end
|
|
623
636
|
end
|
|
@@ -35,14 +35,12 @@ describe "Sequel named_timezones extension" do
|
|
|
35
35
|
Sequel.database_timezone.should == @tz_out
|
|
36
36
|
end
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
@db.sqls.should == ["INSERT INTO a VALUES ('2009-06-01 06:20:30-0400', '2009-06-01 06:20:30-0400', '2009-06-01 06:20:30-0400')"]
|
|
45
|
-
end
|
|
38
|
+
it "should convert datetimes going into the database to named database_timezone" do
|
|
39
|
+
ds = @db[:a]
|
|
40
|
+
def ds.supports_timestamp_timezones?; true; end
|
|
41
|
+
def ds.supports_timestamp_usecs?; false; end
|
|
42
|
+
ds.insert([@dt, DateTime.civil(2009,6,1,3,20,30,-7/24.0), DateTime.civil(2009,6,1,6,20,30,-1/6.0)])
|
|
43
|
+
@db.sqls.should == ["INSERT INTO a VALUES ('2009-06-01 06:20:30-0400', '2009-06-01 06:20:30-0400', '2009-06-01 06:20:30-0400')"]
|
|
46
44
|
end
|
|
47
45
|
|
|
48
46
|
it "should convert datetimes coming out of the database from database_timezone to application_timezone" do
|