sequel 2.11.0 → 2.12.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +168 -0
- data/README.rdoc +77 -95
- data/Rakefile +100 -80
- data/bin/sequel +2 -1
- data/doc/advanced_associations.rdoc +23 -32
- data/doc/cheat_sheet.rdoc +23 -40
- data/doc/dataset_filtering.rdoc +6 -6
- data/doc/prepared_statements.rdoc +22 -22
- data/doc/release_notes/2.12.0.txt +534 -0
- data/doc/schema.rdoc +3 -1
- data/doc/sharding.rdoc +8 -8
- data/doc/virtual_rows.rdoc +65 -0
- data/lib/sequel.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/ado.rb +3 -3
- data/lib/{sequel_core → sequel}/adapters/db2.rb +0 -0
- data/lib/{sequel_core → sequel}/adapters/dbi.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/do.rb +9 -5
- data/lib/{sequel_core → sequel}/adapters/do/mysql.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/do/postgres.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/do/sqlite.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/firebird.rb +84 -80
- data/lib/{sequel_core → sequel}/adapters/informix.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/jdbc.rb +21 -14
- data/lib/{sequel_core → sequel}/adapters/jdbc/h2.rb +14 -13
- data/lib/{sequel_core → sequel}/adapters/jdbc/mysql.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/jdbc/oracle.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/jdbc/postgresql.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/jdbc/sqlite.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/mysql.rb +60 -39
- data/lib/{sequel_core → sequel}/adapters/odbc.rb +8 -4
- data/lib/{sequel_core → sequel}/adapters/openbase.rb +0 -0
- data/lib/{sequel_core → sequel}/adapters/oracle.rb +38 -7
- data/lib/{sequel_core → sequel}/adapters/postgres.rb +24 -24
- data/lib/{sequel_core → sequel}/adapters/shared/mssql.rb +5 -5
- data/lib/{sequel_core → sequel}/adapters/shared/mysql.rb +126 -71
- data/lib/{sequel_core → sequel}/adapters/shared/oracle.rb +7 -10
- data/lib/{sequel_core → sequel}/adapters/shared/postgres.rb +159 -125
- data/lib/{sequel_core → sequel}/adapters/shared/progress.rb +1 -2
- data/lib/{sequel_core → sequel}/adapters/shared/sqlite.rb +72 -67
- data/lib/{sequel_core → sequel}/adapters/sqlite.rb +11 -7
- data/lib/{sequel_core → sequel}/adapters/utils/date_format.rb +0 -0
- data/lib/{sequel_core → sequel}/adapters/utils/stored_procedures.rb +0 -0
- data/lib/{sequel_core → sequel}/adapters/utils/unsupported.rb +19 -0
- data/lib/{sequel_core → sequel}/connection_pool.rb +7 -5
- data/lib/sequel/core.rb +221 -0
- data/lib/{sequel_core → sequel}/core_sql.rb +91 -49
- data/lib/{sequel_core → sequel}/database.rb +264 -149
- data/lib/{sequel_core/schema/generator.rb → sequel/database/schema_generator.rb} +6 -2
- data/lib/{sequel_core/database/schema.rb → sequel/database/schema_methods.rb} +12 -12
- data/lib/sequel/database/schema_sql.rb +224 -0
- data/lib/{sequel_core → sequel}/dataset.rb +78 -236
- data/lib/{sequel_core → sequel}/dataset/convenience.rb +99 -61
- data/lib/{sequel_core/object_graph.rb → sequel/dataset/graph.rb} +16 -14
- data/lib/{sequel_core → sequel}/dataset/prepared_statements.rb +1 -1
- data/lib/{sequel_core → sequel}/dataset/sql.rb +150 -99
- data/lib/sequel/deprecated.rb +593 -0
- data/lib/sequel/deprecated_migration.rb +91 -0
- data/lib/sequel/exceptions.rb +48 -0
- data/lib/sequel/extensions/blank.rb +42 -0
- data/lib/{sequel_model → sequel/extensions}/inflector.rb +8 -1
- data/lib/{sequel_core → sequel/extensions}/migration.rb +1 -1
- data/lib/{sequel_core/dataset → sequel/extensions}/pagination.rb +0 -0
- data/lib/{sequel_core → sequel/extensions}/pretty_table.rb +7 -0
- data/lib/{sequel_core/dataset → sequel/extensions}/query.rb +7 -0
- data/lib/sequel/extensions/string_date_time.rb +47 -0
- data/lib/sequel/metaprogramming.rb +43 -0
- data/lib/sequel/model.rb +110 -0
- data/lib/sequel/model/associations.rb +1300 -0
- data/lib/sequel/model/base.rb +937 -0
- data/lib/sequel/model/deprecated.rb +204 -0
- data/lib/sequel/model/deprecated_hooks.rb +103 -0
- data/lib/sequel/model/deprecated_inflector.rb +335 -0
- data/lib/sequel/model/deprecated_validations.rb +388 -0
- data/lib/sequel/model/errors.rb +39 -0
- data/lib/{sequel_model → sequel/model}/exceptions.rb +4 -4
- data/lib/sequel/model/inflections.rb +208 -0
- data/lib/sequel/model/plugins.rb +76 -0
- data/lib/sequel/plugins/caching.rb +122 -0
- data/lib/sequel/plugins/hook_class_methods.rb +122 -0
- data/lib/sequel/plugins/schema.rb +53 -0
- data/lib/sequel/plugins/serialization.rb +117 -0
- data/lib/sequel/plugins/single_table_inheritance.rb +63 -0
- data/lib/sequel/plugins/validation_class_methods.rb +384 -0
- data/lib/sequel/plugins/validation_helpers.rb +150 -0
- data/lib/{sequel_core → sequel}/sql.rb +125 -190
- data/lib/{sequel_core → sequel}/version.rb +2 -1
- data/lib/sequel_core.rb +1 -172
- data/lib/sequel_model.rb +1 -91
- data/spec/adapters/firebird_spec.rb +5 -5
- data/spec/adapters/informix_spec.rb +1 -1
- data/spec/adapters/mysql_spec.rb +128 -42
- data/spec/adapters/oracle_spec.rb +47 -19
- data/spec/adapters/postgres_spec.rb +64 -52
- data/spec/adapters/spec_helper.rb +1 -1
- data/spec/adapters/sqlite_spec.rb +12 -17
- data/spec/{sequel_core → core}/connection_pool_spec.rb +10 -10
- data/spec/{sequel_core → core}/core_ext_spec.rb +19 -19
- data/spec/{sequel_core → core}/core_sql_spec.rb +68 -71
- data/spec/{sequel_core → core}/database_spec.rb +135 -99
- data/spec/{sequel_core → core}/dataset_spec.rb +398 -242
- data/spec/{sequel_core → core}/expression_filters_spec.rb +13 -13
- data/spec/core/migration_spec.rb +263 -0
- data/spec/{sequel_core → core}/object_graph_spec.rb +10 -10
- data/spec/{sequel_core → core}/pretty_table_spec.rb +2 -2
- data/spec/{sequel_core → core}/schema_generator_spec.rb +0 -0
- data/spec/{sequel_core → core}/schema_spec.rb +8 -10
- data/spec/{sequel_core → core}/spec_helper.rb +29 -2
- data/spec/{sequel_core → core}/version_spec.rb +0 -0
- data/spec/extensions/blank_spec.rb +67 -0
- data/spec/extensions/caching_spec.rb +201 -0
- data/spec/{sequel_model/hooks_spec.rb → extensions/hook_class_methods_spec.rb} +8 -23
- data/spec/{sequel_model → extensions}/inflector_spec.rb +3 -0
- data/spec/{sequel_core → extensions}/migration_spec.rb +4 -4
- data/spec/extensions/pagination_spec.rb +99 -0
- data/spec/extensions/pretty_table_spec.rb +91 -0
- data/spec/extensions/query_spec.rb +85 -0
- data/spec/{sequel_model → extensions}/schema_spec.rb +22 -1
- data/spec/extensions/serialization_spec.rb +109 -0
- data/spec/extensions/single_table_inheritance_spec.rb +53 -0
- data/spec/{sequel_model → extensions}/spec_helper.rb +13 -4
- data/spec/extensions/string_date_time_spec.rb +93 -0
- data/spec/{sequel_model/validations_spec.rb → extensions/validation_class_methods_spec.rb} +15 -103
- data/spec/extensions/validation_helpers_spec.rb +291 -0
- data/spec/integration/dataset_test.rb +31 -0
- data/spec/integration/eager_loader_test.rb +17 -30
- data/spec/integration/schema_test.rb +8 -5
- data/spec/integration/spec_helper.rb +17 -0
- data/spec/integration/transaction_test.rb +68 -0
- data/spec/{sequel_model → model}/association_reflection_spec.rb +0 -0
- data/spec/{sequel_model → model}/associations_spec.rb +23 -10
- data/spec/{sequel_model → model}/base_spec.rb +29 -20
- data/spec/{sequel_model → model}/caching_spec.rb +16 -14
- data/spec/{sequel_model → model}/dataset_methods_spec.rb +0 -0
- data/spec/{sequel_model → model}/eager_loading_spec.rb +8 -8
- data/spec/model/hooks_spec.rb +472 -0
- data/spec/model/inflector_spec.rb +126 -0
- data/spec/{sequel_model → model}/model_spec.rb +25 -20
- data/spec/model/plugins_spec.rb +142 -0
- data/spec/{sequel_model → model}/record_spec.rb +121 -62
- data/spec/model/schema_spec.rb +92 -0
- data/spec/model/spec_helper.rb +124 -0
- data/spec/model/validations_spec.rb +1080 -0
- metadata +136 -107
- data/lib/sequel_core/core_ext.rb +0 -217
- data/lib/sequel_core/dataset/callback.rb +0 -13
- data/lib/sequel_core/dataset/schema.rb +0 -15
- data/lib/sequel_core/deprecated.rb +0 -26
- data/lib/sequel_core/exceptions.rb +0 -44
- data/lib/sequel_core/schema.rb +0 -2
- data/lib/sequel_core/schema/sql.rb +0 -325
- data/lib/sequel_model/association_reflection.rb +0 -267
- data/lib/sequel_model/associations.rb +0 -499
- data/lib/sequel_model/base.rb +0 -539
- data/lib/sequel_model/caching.rb +0 -82
- data/lib/sequel_model/dataset_methods.rb +0 -26
- data/lib/sequel_model/eager_loading.rb +0 -370
- data/lib/sequel_model/hooks.rb +0 -101
- data/lib/sequel_model/plugins.rb +0 -62
- data/lib/sequel_model/record.rb +0 -568
- data/lib/sequel_model/schema.rb +0 -49
- data/lib/sequel_model/validations.rb +0 -429
- data/spec/sequel_model/plugins_spec.rb +0 -80
@@ -48,6 +48,37 @@ describe "Simple Dataset operations" do
|
|
48
48
|
@ds.first.should == {:id=>1, :number=>10}
|
49
49
|
sqls_should_be('SELECT * FROM items LIMIT 1')
|
50
50
|
end
|
51
|
+
|
52
|
+
specify "should alias columns correctly" do
|
53
|
+
@ds.select(:id___x, :number___n).first.should == {:x=>1, :n=>10}
|
54
|
+
sqls_should_be("SELECT id AS 'x', number AS 'n' FROM items LIMIT 1")
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "Simple Dataset operations" do
|
59
|
+
before do
|
60
|
+
INTEGRATION_DB.create_table!(:items) do
|
61
|
+
Integer :number
|
62
|
+
TrueClass :flag
|
63
|
+
end
|
64
|
+
@ds = INTEGRATION_DB[:items]
|
65
|
+
end
|
66
|
+
after do
|
67
|
+
INTEGRATION_DB.drop_table(:items)
|
68
|
+
end
|
69
|
+
|
70
|
+
specify "should deal with boolean conditions correctly" do
|
71
|
+
@ds.insert(:number=>1, :flag=>true)
|
72
|
+
@ds.insert(:number=>2, :flag=>false)
|
73
|
+
@ds.insert(:number=>3, :flag=>nil)
|
74
|
+
@ds.order!(:number)
|
75
|
+
@ds.filter(:flag=>true).map(:number).should == [1]
|
76
|
+
@ds.filter(:flag=>false).map(:number).should == [2]
|
77
|
+
@ds.filter(:flag=>nil).map(:number).should == [3]
|
78
|
+
@ds.exclude(:flag=>true).map(:number).should == [2, 3]
|
79
|
+
@ds.exclude(:flag=>false).map(:number).should == [1, 3]
|
80
|
+
@ds.exclude(:flag=>nil).map(:number).should == [1, 2]
|
81
|
+
end
|
51
82
|
end
|
52
83
|
|
53
84
|
describe "Simple Dataset operations in transactions" do
|
@@ -69,7 +69,7 @@ describe "Eagerly loading a tree structure" do
|
|
69
69
|
clear_sqls
|
70
70
|
end
|
71
71
|
after do
|
72
|
-
|
72
|
+
INTEGRATION_DB.drop_table :nodes
|
73
73
|
Object.send(:remove_const, :Node)
|
74
74
|
end
|
75
75
|
|
@@ -138,26 +138,18 @@ describe "Association Extensions" do
|
|
138
138
|
before do
|
139
139
|
module ::FindOrCreate
|
140
140
|
def find_or_create(vals)
|
141
|
-
|
142
|
-
# can be introspected.
|
143
|
-
author_id = @opts[:where].args[1]
|
144
|
-
first(vals) || \
|
145
|
-
@opts[:models][nil].create(vals.merge(:author_id=>author_id))
|
141
|
+
first(vals) || model.create(vals.merge(:author_id=>model_object.pk))
|
146
142
|
end
|
143
|
+
def find_or_create_by_name(name)
|
144
|
+
first(:name=>name) || model.create(:name=>name, :author_id=>model_object.pk)
|
145
|
+
end
|
147
146
|
end
|
148
147
|
INTEGRATION_DB.instance_variable_set(:@schemas, nil)
|
149
148
|
INTEGRATION_DB.create_table!(:authors) do
|
150
149
|
primary_key :id
|
151
150
|
end
|
152
151
|
class ::Author < Sequel::Model
|
153
|
-
one_to_many :authorships, :extend=>FindOrCreate
|
154
|
-
key = pk
|
155
|
-
ds = Authorship.filter(:author_id=>key)
|
156
|
-
ds.meta_def(:find_or_create_by_name) do |name|
|
157
|
-
first(:name=>name) || Authorship.create(:name=>name, :author_id=>key)
|
158
|
-
end
|
159
|
-
ds
|
160
|
-
end)
|
152
|
+
one_to_many :authorships, :extend=>FindOrCreate
|
161
153
|
end
|
162
154
|
INTEGRATION_DB.create_table!(:authorships) do
|
163
155
|
primary_key :id
|
@@ -171,8 +163,7 @@ describe "Association Extensions" do
|
|
171
163
|
clear_sqls
|
172
164
|
end
|
173
165
|
after do
|
174
|
-
|
175
|
-
Author.drop_table
|
166
|
+
INTEGRATION_DB.drop_table :authorships, :authors
|
176
167
|
Object.send(:remove_const, :Author)
|
177
168
|
Object.send(:remove_const, :Authorship)
|
178
169
|
end
|
@@ -181,7 +172,7 @@ describe "Association Extensions" do
|
|
181
172
|
Authorship.count.should == 0
|
182
173
|
sqls_should_be('SELECT COUNT(*) FROM authorships LIMIT 1')
|
183
174
|
authorship = @author.authorships_dataset.find_or_create_by_name('Bob')
|
184
|
-
sqls_should_be("SELECT * FROM authorships WHERE ((author_id = 1) AND (name = 'Bob')) LIMIT 1",
|
175
|
+
sqls_should_be("SELECT * FROM authorships WHERE ((authorships.author_id = 1) AND (name = 'Bob')) LIMIT 1",
|
185
176
|
/INSERT INTO authorships \((author_id, name|name, author_id)\) VALUES \((1, 'Bob'|'Bob', 1)\)/,
|
186
177
|
"SELECT * FROM authorships WHERE (id = 1) LIMIT 1")
|
187
178
|
Authorship.count.should == 1
|
@@ -190,11 +181,11 @@ describe "Association Extensions" do
|
|
190
181
|
authorship.name.should == 'Bob'
|
191
182
|
authorship.author_id.should == @author.id
|
192
183
|
@author.authorships_dataset.find_or_create_by_name('Bob').should == authorship
|
193
|
-
sqls_should_be("SELECT * FROM authorships WHERE ((author_id = 1) AND (name = 'Bob')) LIMIT 1")
|
184
|
+
sqls_should_be("SELECT * FROM authorships WHERE ((authorships.author_id = 1) AND (name = 'Bob')) LIMIT 1")
|
194
185
|
Authorship.count.should == 1
|
195
186
|
sqls_should_be('SELECT COUNT(*) FROM authorships LIMIT 1')
|
196
187
|
authorship2 = @author.authorships_dataset.find_or_create(:name=>'Jim')
|
197
|
-
sqls_should_be("SELECT * FROM authorships WHERE ((author_id = 1) AND (name = 'Jim')) LIMIT 1",
|
188
|
+
sqls_should_be("SELECT * FROM authorships WHERE ((authorships.author_id = 1) AND (name = 'Jim')) LIMIT 1",
|
198
189
|
/INSERT INTO authorships \((author_id, name|name, author_id)\) VALUES \((1, 'Jim'|'Jim', 1)\)/,
|
199
190
|
"SELECT * FROM authorships WHERE (id = 2) LIMIT 1")
|
200
191
|
Authorship.count.should == 2
|
@@ -204,7 +195,7 @@ describe "Association Extensions" do
|
|
204
195
|
authorship2.name.should == 'Jim'
|
205
196
|
authorship2.author_id.should == @author.id
|
206
197
|
@author.authorships_dataset.find_or_create(:name=>'Jim').should == authorship2
|
207
|
-
sqls_should_be("SELECT * FROM authorships WHERE ((author_id = 1) AND (name = 'Jim')) LIMIT 1")
|
198
|
+
sqls_should_be("SELECT * FROM authorships WHERE ((authorships.author_id = 1) AND (name = 'Jim')) LIMIT 1")
|
208
199
|
end
|
209
200
|
end
|
210
201
|
|
@@ -291,9 +282,7 @@ describe "has_many :through has_many and has_one :through belongs_to" do
|
|
291
282
|
clear_sqls
|
292
283
|
end
|
293
284
|
after do
|
294
|
-
|
295
|
-
Client.drop_table
|
296
|
-
Firm.drop_table
|
285
|
+
INTEGRATION_DB.drop_table :invoices, :clients, :firms
|
297
286
|
Object.send(:remove_const, :Firm)
|
298
287
|
Object.send(:remove_const, :Client)
|
299
288
|
Object.send(:remove_const, :Invoice)
|
@@ -379,9 +368,10 @@ describe "Polymorphic Associations" do
|
|
379
368
|
text :attachable_type
|
380
369
|
end
|
381
370
|
class ::Asset < Sequel::Model
|
371
|
+
m = method(:constantize)
|
382
372
|
many_to_one :attachable, :reciprocal=>:assets, \
|
383
373
|
:dataset=>(proc do
|
384
|
-
klass = attachable_type
|
374
|
+
klass = m.call(attachable_type)
|
385
375
|
klass.filter(klass.primary_key=>attachable_id)
|
386
376
|
end), \
|
387
377
|
:eager_loader=>(proc do |key_hash, assets, associations|
|
@@ -391,7 +381,7 @@ describe "Polymorphic Associations" do
|
|
391
381
|
((id_map[asset.attachable_type] ||= {})[asset.attachable_id] ||= []) << asset
|
392
382
|
end
|
393
383
|
id_map.each do |klass_name, id_map|
|
394
|
-
klass = klass_name
|
384
|
+
klass = m.call(klass_name)
|
395
385
|
klass.filter(klass.primary_key=>id_map.keys).all do |attach|
|
396
386
|
id_map[attach.pk].each do |asset|
|
397
387
|
asset.associations[:attachable] = attach
|
@@ -469,9 +459,7 @@ describe "Polymorphic Associations" do
|
|
469
459
|
clear_sqls
|
470
460
|
end
|
471
461
|
after do
|
472
|
-
|
473
|
-
Post.drop_table
|
474
|
-
Note.drop_table
|
462
|
+
INTEGRATION_DB.drop_table :assets, :posts, :notes
|
475
463
|
Object.send(:remove_const, :Asset)
|
476
464
|
Object.send(:remove_const, :Post)
|
477
465
|
Object.send(:remove_const, :Note)
|
@@ -609,8 +597,7 @@ describe "many_to_one/one_to_many not referencing primary key" do
|
|
609
597
|
clear_sqls
|
610
598
|
end
|
611
599
|
after do
|
612
|
-
|
613
|
-
Client.drop_table
|
600
|
+
INTEGRATION_DB.drop_table :invoices, :clients
|
614
601
|
Object.send(:remove_const, :Client)
|
615
602
|
Object.send(:remove_const, :Invoice)
|
616
603
|
end
|
@@ -20,11 +20,11 @@ describe "Database schema parser" do
|
|
20
20
|
INTEGRATION_DB.identifier_input_method = :reverse
|
21
21
|
INTEGRATION_DB.default_schema = nil if INTEGRATION_DB.default_schema
|
22
22
|
INTEGRATION_DB.create_table!(:items){integer :number}
|
23
|
-
INTEGRATION_DB.schema(
|
23
|
+
INTEGRATION_DB.schema(:items, :reload=>true).should be_a_kind_of(Array)
|
24
24
|
INTEGRATION_DB.schema(:items, :reload=>true).first.first.should == :number
|
25
25
|
end
|
26
26
|
|
27
|
-
|
27
|
+
deprec_specify "should be a hash with table_names as symbols" do
|
28
28
|
INTEGRATION_DB.create_table!(:items){integer :number}
|
29
29
|
schema = INTEGRATION_DB.schema(nil, :reload=>true)
|
30
30
|
schema.should be_a_kind_of(Hash)
|
@@ -33,13 +33,16 @@ describe "Database schema parser" do
|
|
33
33
|
|
34
34
|
specify "should not issue an sql query if the schema has been loaded unless :reload is true" do
|
35
35
|
INTEGRATION_DB.create_table!(:items){integer :number}
|
36
|
-
INTEGRATION_DB.schema(
|
36
|
+
INTEGRATION_DB.schema(:items, :reload=>true)
|
37
37
|
clear_sqls
|
38
|
-
INTEGRATION_DB.schema
|
38
|
+
INTEGRATION_DB.schema(:items)
|
39
39
|
sqls_should_be
|
40
|
+
clear_sqls
|
41
|
+
INTEGRATION_DB.schema(:items, :reload=>true)
|
42
|
+
sqls_should_be "PRAGMA table_info('items')"
|
40
43
|
end
|
41
44
|
|
42
|
-
|
45
|
+
deprec_specify "should give the same result for a single table regardless of whether schema was called for a single table" do
|
43
46
|
INTEGRATION_DB.create_table!(:items){integer :number}
|
44
47
|
INTEGRATION_DB.schema(:items, :reload=>true).should == INTEGRATION_DB.schema(nil, :reload=>true)[:items]
|
45
48
|
end
|
@@ -8,6 +8,23 @@ begin
|
|
8
8
|
rescue LoadError
|
9
9
|
end
|
10
10
|
|
11
|
+
Sequel.virtual_row_instance_eval = true
|
12
|
+
Sequel::Model.use_transactions = false
|
13
|
+
|
14
|
+
module Spec::Example::ExampleGroupMethods
|
15
|
+
def deprec_specify(*args, &block)
|
16
|
+
specify(*args) do
|
17
|
+
output = Sequel::Deprecation.output
|
18
|
+
Sequel::Deprecation.output = nil
|
19
|
+
begin
|
20
|
+
instance_eval(&block)
|
21
|
+
ensure
|
22
|
+
Sequel::Deprecation.output = output
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
11
28
|
$sqls = []
|
12
29
|
def clear_sqls
|
13
30
|
$sqls.clear
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'spec_helper.rb')
|
2
|
+
|
3
|
+
describe "Database transactions" do
|
4
|
+
before do
|
5
|
+
INTEGRATION_DB.drop_table(:items) if INTEGRATION_DB.table_exists?(:items)
|
6
|
+
INTEGRATION_DB.create_table(:items){String :name; Integer :value}
|
7
|
+
@d = INTEGRATION_DB[:items]
|
8
|
+
clear_sqls
|
9
|
+
end
|
10
|
+
after do
|
11
|
+
INTEGRATION_DB.drop_table(:items) if INTEGRATION_DB.table_exists?(:items)
|
12
|
+
end
|
13
|
+
|
14
|
+
specify "should support transactions" do
|
15
|
+
INTEGRATION_DB.transaction do
|
16
|
+
@d << {:name => 'abc', :value => 1}
|
17
|
+
end
|
18
|
+
|
19
|
+
@d.count.should == 1
|
20
|
+
end
|
21
|
+
|
22
|
+
specify "should have #transaction yield the connection" do
|
23
|
+
INTEGRATION_DB.transaction do |conn|
|
24
|
+
conn.should_not == nil
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
specify "should correctly rollback transactions" do
|
29
|
+
proc do
|
30
|
+
INTEGRATION_DB.transaction do
|
31
|
+
@d << {:name => 'abc', :value => 1}
|
32
|
+
raise Interrupt, 'asdf'
|
33
|
+
end
|
34
|
+
end.should raise_error(Interrupt)
|
35
|
+
|
36
|
+
proc do
|
37
|
+
INTEGRATION_DB.transaction do
|
38
|
+
@d << {:name => 'abc', :value => 1}
|
39
|
+
raise Sequel::Rollback
|
40
|
+
end
|
41
|
+
end.should_not raise_error
|
42
|
+
|
43
|
+
@d.count.should == 0
|
44
|
+
end
|
45
|
+
|
46
|
+
specify "should handle returning inside of the block by committing" do
|
47
|
+
def INTEGRATION_DB.ret_commit
|
48
|
+
transaction do
|
49
|
+
self[:items] << {:name => 'abc'}
|
50
|
+
return
|
51
|
+
self[:items] << {:name => 'd'}
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
@d.count.should == 0
|
56
|
+
INTEGRATION_DB.ret_commit
|
57
|
+
@d.count.should == 1
|
58
|
+
INTEGRATION_DB.ret_commit
|
59
|
+
@d.count.should == 2
|
60
|
+
proc do
|
61
|
+
INTEGRATION_DB.transaction do
|
62
|
+
raise Interrupt, 'asdf'
|
63
|
+
end
|
64
|
+
end.should raise_error(Interrupt)
|
65
|
+
|
66
|
+
@d.count.should == 2
|
67
|
+
end
|
68
|
+
end
|
File without changes
|
@@ -392,7 +392,7 @@ describe Sequel::Model, "many_to_one" do
|
|
392
392
|
proc{c.parent = p}.should raise_error(Sequel::Error)
|
393
393
|
end
|
394
394
|
|
395
|
-
|
395
|
+
deprec_specify "should have belongs_to alias" do
|
396
396
|
@c2.belongs_to :parent, :class => @c2
|
397
397
|
|
398
398
|
d = @c2.load(:id => 1)
|
@@ -567,7 +567,7 @@ describe Sequel::Model, "one_to_many" do
|
|
567
567
|
v = n.historical_values_dataset
|
568
568
|
v.should be_a_kind_of(Sequel::Dataset)
|
569
569
|
v.sql.should == 'SELECT * FROM historical_values WHERE (historical_values.node_id = 1234)'
|
570
|
-
v.
|
570
|
+
v.model.should == HistoricalValue
|
571
571
|
end
|
572
572
|
|
573
573
|
it "should use class inside a module if given as a string" do
|
@@ -582,7 +582,7 @@ describe Sequel::Model, "one_to_many" do
|
|
582
582
|
v = n.historical_values_dataset
|
583
583
|
v.should be_a_kind_of(Sequel::Dataset)
|
584
584
|
v.sql.should == 'SELECT * FROM values WHERE (values.node_id = 1234)'
|
585
|
-
v.
|
585
|
+
v.model.should == Historical::Value
|
586
586
|
end
|
587
587
|
|
588
588
|
it "should use explicit key if given" do
|
@@ -599,7 +599,7 @@ describe Sequel::Model, "one_to_many" do
|
|
599
599
|
|
600
600
|
n = @c2.new(:id => 1234)
|
601
601
|
a = @c1.new(:id => 2345)
|
602
|
-
a.save
|
602
|
+
a.save
|
603
603
|
MODEL_DB.reset
|
604
604
|
a.should == n.add_attribute(a)
|
605
605
|
MODEL_DB.sqls.should == ['UPDATE attributes SET node_id = 1234 WHERE (id = 2345)']
|
@@ -610,7 +610,7 @@ describe Sequel::Model, "one_to_many" do
|
|
610
610
|
|
611
611
|
n = @c2.new(:id => 1234)
|
612
612
|
a = @c1.new(:id => 2345)
|
613
|
-
a.save
|
613
|
+
a.save
|
614
614
|
MODEL_DB.reset
|
615
615
|
a.should == n.remove_attribute(a)
|
616
616
|
MODEL_DB.sqls.should == ['UPDATE attributes SET node_id = NULL WHERE (id = 2345)']
|
@@ -621,7 +621,7 @@ describe Sequel::Model, "one_to_many" do
|
|
621
621
|
|
622
622
|
n = @c2.new(:id => 1234, :xxx=>5)
|
623
623
|
a = @c1.new(:id => 2345)
|
624
|
-
a.save
|
624
|
+
a.save
|
625
625
|
MODEL_DB.reset
|
626
626
|
a.should == n.add_attribute(a)
|
627
627
|
MODEL_DB.sqls.should == ['UPDATE attributes SET node_id = 5 WHERE (id = 2345)']
|
@@ -866,7 +866,7 @@ describe Sequel::Model, "one_to_many" do
|
|
866
866
|
im2.should_not(include('remove_all_attributes'))
|
867
867
|
end
|
868
868
|
|
869
|
-
|
869
|
+
deprec_specify "should have has_many alias" do
|
870
870
|
@c2.has_many :attributes, :class => @c1
|
871
871
|
|
872
872
|
n = @c2.new(:id => 1234)
|
@@ -936,7 +936,7 @@ describe Sequel::Model, "one_to_many" do
|
|
936
936
|
d = @c1.dataset
|
937
937
|
def d.fetch_rows(s); end
|
938
938
|
node.attributes.should == []
|
939
|
-
def attrib.save
|
939
|
+
def attrib.save; self end
|
940
940
|
node.add_attribute(attrib)
|
941
941
|
node.associations[:attributes].should == [attrib]
|
942
942
|
node.remove_all_attributes.should == [attrib]
|
@@ -958,7 +958,7 @@ describe Sequel::Model, "one_to_many" do
|
|
958
958
|
node = @c2.new(:id => 1234)
|
959
959
|
node.attributes.should == []
|
960
960
|
attrib.node.should == nil
|
961
|
-
def attrib.save
|
961
|
+
def attrib.save; self end
|
962
962
|
node.add_attribute(attrib)
|
963
963
|
attrib.associations[:node].should == node
|
964
964
|
node.remove_all_attributes
|
@@ -1006,6 +1006,19 @@ describe Sequel::Model, "one_to_many" do
|
|
1006
1006
|
MODEL_DB.sqls.last.should == 'UPDATE attributes SET node_id = NULL WHERE ((node_id = 1234) AND (id != 3))'
|
1007
1007
|
end
|
1008
1008
|
|
1009
|
+
it "should use a transaction in the setter method if the :one_to_one option is true" do
|
1010
|
+
@c2.one_to_many :attributes, :class => @c1, :one_to_one=>true
|
1011
|
+
@c2.use_transactions = true
|
1012
|
+
MODEL_DB.sqls.clear
|
1013
|
+
attrib = @c1.load(:id=>3)
|
1014
|
+
@c2.new(:id => 1234).attribute = attrib
|
1015
|
+
MODEL_DB.sqls.length.should == 4
|
1016
|
+
MODEL_DB.sqls.first.should == 'BEGIN'
|
1017
|
+
MODEL_DB.sqls[1].should =~ /UPDATE attributes SET (node_id = 1234, id = 3|id = 3, node_id = 1234) WHERE \(id = 3\)/
|
1018
|
+
MODEL_DB.sqls[2].should == 'UPDATE attributes SET node_id = NULL WHERE ((node_id = 1234) AND (id != 3))'
|
1019
|
+
MODEL_DB.sqls.last.should == 'COMMIT'
|
1020
|
+
end
|
1021
|
+
|
1009
1022
|
it "should have the setter method for the :one_to_one option respect the :primary_key option" do
|
1010
1023
|
@c2.one_to_many :attributes, :class => @c1, :one_to_one=>true, :primary_key=>:xxx
|
1011
1024
|
attrib = @c1.new(:id=>3)
|
@@ -1519,7 +1532,7 @@ describe Sequel::Model, "many_to_many" do
|
|
1519
1532
|
im2.should_not(include('remove_all_attributes'))
|
1520
1533
|
end
|
1521
1534
|
|
1522
|
-
|
1535
|
+
deprec_specify "should have has_and_belongs_to_many alias" do
|
1523
1536
|
@c2.has_and_belongs_to_many :attributes, :class => @c1
|
1524
1537
|
|
1525
1538
|
n = @c2.new(:id => 1234)
|
@@ -37,7 +37,7 @@ describe "Model#serialize" do
|
|
37
37
|
MODEL_DB.reset
|
38
38
|
end
|
39
39
|
|
40
|
-
|
40
|
+
deprec_specify "should translate values to YAML when creating records" do
|
41
41
|
@c = Class.new(Sequel::Model(:items)) do
|
42
42
|
no_primary_key
|
43
43
|
serialize :abc
|
@@ -53,7 +53,7 @@ describe "Model#serialize" do
|
|
53
53
|
]
|
54
54
|
end
|
55
55
|
|
56
|
-
|
56
|
+
deprec_specify "should support calling after the class is defined" do
|
57
57
|
@c = Class.new(Sequel::Model(:items)) do
|
58
58
|
no_primary_key
|
59
59
|
columns :def
|
@@ -70,7 +70,7 @@ describe "Model#serialize" do
|
|
70
70
|
]
|
71
71
|
end
|
72
72
|
|
73
|
-
|
73
|
+
deprec_specify "should support using the Marshal format" do
|
74
74
|
@c = Class.new(Sequel::Model(:items)) do
|
75
75
|
no_primary_key
|
76
76
|
serialize :abc, :format => :marshal
|
@@ -87,7 +87,7 @@ describe "Model#serialize" do
|
|
87
87
|
]
|
88
88
|
end
|
89
89
|
|
90
|
-
|
90
|
+
deprec_specify "should translate values to and from YAML using accessor methods" do
|
91
91
|
@c = Class.new(Sequel::Model(:items)) do
|
92
92
|
serialize :abc, :def
|
93
93
|
columns :abc, :def
|
@@ -127,7 +127,7 @@ describe "Model#serialize" do
|
|
127
127
|
o.abc.should == 1
|
128
128
|
o.def.should == "hello"
|
129
129
|
|
130
|
-
o.
|
130
|
+
o.update(:abc => 23)
|
131
131
|
ds.sqls.should == "UPDATE items SET abc = '#{23.to_yaml}' WHERE (id = 1)"
|
132
132
|
|
133
133
|
ds.raw = {:id => 1, :abc => "--- 1\n", :def => "--- hello\n"}
|
@@ -184,9 +184,8 @@ describe Sequel::Model, "dataset" do
|
|
184
184
|
end
|
185
185
|
|
186
186
|
describe Sequel::Model, ".def_dataset_method" do
|
187
|
-
|
187
|
+
before do
|
188
188
|
@c = Class.new(Sequel::Model(:items)) do
|
189
|
-
@dataset = Object.new
|
190
189
|
end
|
191
190
|
end
|
192
191
|
|
@@ -233,18 +232,18 @@ describe Sequel::Model, ".def_dataset_method" do
|
|
233
232
|
end
|
234
233
|
|
235
234
|
describe "A model class with implicit table name" do
|
236
|
-
|
235
|
+
before do
|
237
236
|
class Donkey < Sequel::Model
|
238
237
|
end
|
239
238
|
end
|
240
239
|
|
241
240
|
specify "should have a dataset associated with the model class" do
|
242
|
-
Donkey.dataset.
|
241
|
+
Donkey.dataset.model.should == Donkey
|
243
242
|
end
|
244
243
|
end
|
245
244
|
|
246
245
|
describe "A model inheriting from a model" do
|
247
|
-
|
246
|
+
before do
|
248
247
|
class Feline < Sequel::Model
|
249
248
|
end
|
250
249
|
|
@@ -253,18 +252,18 @@ describe "A model inheriting from a model" do
|
|
253
252
|
end
|
254
253
|
|
255
254
|
specify "should have a dataset associated with itself" do
|
256
|
-
Feline.dataset.
|
257
|
-
Leopard.dataset.
|
255
|
+
Feline.dataset.model.should == Feline
|
256
|
+
Leopard.dataset.model.should == Leopard
|
258
257
|
end
|
259
258
|
end
|
260
259
|
|
261
260
|
describe "Model.db=" do
|
262
|
-
|
261
|
+
before do
|
263
262
|
$db1 = MockDatabase.new
|
264
263
|
$db2 = MockDatabase.new
|
265
264
|
|
266
265
|
class BlueBlue < Sequel::Model(:items)
|
267
|
-
set_dataset $db1[:blue]
|
266
|
+
set_dataset $db1[:blue].filter(:x=>1)
|
268
267
|
end
|
269
268
|
end
|
270
269
|
|
@@ -274,10 +273,20 @@ describe "Model.db=" do
|
|
274
273
|
BlueBlue.dataset.db.should === $db2
|
275
274
|
BlueBlue.dataset.db.should_not === $db1
|
276
275
|
end
|
276
|
+
|
277
|
+
specify "should keep the same dataset options" do
|
278
|
+
BlueBlue.db = $db2
|
279
|
+
BlueBlue.dataset.sql.should == 'SELECT * FROM blue WHERE (x = 1)'
|
280
|
+
end
|
281
|
+
|
282
|
+
specify "should use the database for subclasses" do
|
283
|
+
BlueBlue.db = $db2
|
284
|
+
Class.new(BlueBlue).db.should === $db2
|
285
|
+
end
|
277
286
|
end
|
278
287
|
|
279
288
|
describe Sequel::Model, ".(allowed|restricted)_columns " do
|
280
|
-
|
289
|
+
before do
|
281
290
|
@c = Class.new(Sequel::Model(:blahblah)) do
|
282
291
|
columns :x, :y, :z
|
283
292
|
def refresh
|
@@ -340,7 +349,7 @@ describe Sequel::Model, ".(allowed|restricted)_columns " do
|
|
340
349
|
end
|
341
350
|
|
342
351
|
describe Sequel::Model, ".(un)?restrict_primary_key\\??" do
|
343
|
-
|
352
|
+
before do
|
344
353
|
@c = Class.new(Sequel::Model(:blahblah)) do
|
345
354
|
set_primary_key :id
|
346
355
|
columns :x, :y, :z, :id
|
@@ -382,7 +391,7 @@ describe Sequel::Model, ".(un)?restrict_primary_key\\??" do
|
|
382
391
|
end
|
383
392
|
|
384
393
|
describe Sequel::Model, ".strict_param_setting" do
|
385
|
-
|
394
|
+
before do
|
386
395
|
@c = Class.new(Sequel::Model(:blahblah)) do
|
387
396
|
columns :x, :y, :z, :id
|
388
397
|
set_restricted_columns :z
|
@@ -419,7 +428,7 @@ describe Sequel::Model, ".strict_param_setting" do
|
|
419
428
|
end
|
420
429
|
|
421
430
|
describe Sequel::Model, ".[] optimization" do
|
422
|
-
|
431
|
+
before do
|
423
432
|
@c = Class.new(Sequel::Model(:a))
|
424
433
|
@c.instance_eval do
|
425
434
|
def simple_table
|
@@ -466,8 +475,8 @@ describe Sequel::Model, ".[] optimization" do
|
|
466
475
|
Class.new(@c).simple_table.should == "'b'"
|
467
476
|
end
|
468
477
|
|
469
|
-
|
470
|
-
@c.
|
478
|
+
specify "should have simple_table = nil if inheriting and sti_key is set" do
|
479
|
+
@c.plugin :single_table_inheritance, :x
|
471
480
|
Class.new(@c).simple_table.should == nil
|
472
481
|
end
|
473
482
|
|