sequel 3.28.0 → 3.29.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 (148) hide show
  1. data/CHANGELOG +119 -3
  2. data/Rakefile +5 -3
  3. data/bin/sequel +1 -5
  4. data/doc/model_hooks.rdoc +9 -1
  5. data/doc/opening_databases.rdoc +49 -40
  6. data/doc/prepared_statements.rdoc +27 -6
  7. data/doc/release_notes/3.28.0.txt +2 -2
  8. data/doc/release_notes/3.29.0.txt +459 -0
  9. data/doc/sharding.rdoc +7 -1
  10. data/doc/testing.rdoc +18 -9
  11. data/doc/transactions.rdoc +41 -1
  12. data/lib/sequel/adapters/ado.rb +28 -17
  13. data/lib/sequel/adapters/ado/mssql.rb +18 -6
  14. data/lib/sequel/adapters/amalgalite.rb +11 -7
  15. data/lib/sequel/adapters/db2.rb +122 -70
  16. data/lib/sequel/adapters/dbi.rb +15 -15
  17. data/lib/sequel/adapters/do.rb +5 -36
  18. data/lib/sequel/adapters/do/mysql.rb +0 -5
  19. data/lib/sequel/adapters/do/postgres.rb +0 -5
  20. data/lib/sequel/adapters/do/sqlite.rb +0 -5
  21. data/lib/sequel/adapters/firebird.rb +3 -6
  22. data/lib/sequel/adapters/ibmdb.rb +24 -16
  23. data/lib/sequel/adapters/informix.rb +2 -4
  24. data/lib/sequel/adapters/jdbc.rb +47 -11
  25. data/lib/sequel/adapters/jdbc/as400.rb +5 -24
  26. data/lib/sequel/adapters/jdbc/db2.rb +0 -5
  27. data/lib/sequel/adapters/jdbc/derby.rb +217 -0
  28. data/lib/sequel/adapters/jdbc/firebird.rb +0 -5
  29. data/lib/sequel/adapters/jdbc/h2.rb +10 -12
  30. data/lib/sequel/adapters/jdbc/hsqldb.rb +166 -0
  31. data/lib/sequel/adapters/jdbc/informix.rb +0 -5
  32. data/lib/sequel/adapters/jdbc/jtds.rb +0 -5
  33. data/lib/sequel/adapters/jdbc/mysql.rb +0 -10
  34. data/lib/sequel/adapters/jdbc/oracle.rb +70 -3
  35. data/lib/sequel/adapters/jdbc/postgresql.rb +0 -11
  36. data/lib/sequel/adapters/jdbc/sqlite.rb +0 -5
  37. data/lib/sequel/adapters/jdbc/sqlserver.rb +0 -5
  38. data/lib/sequel/adapters/jdbc/transactions.rb +56 -7
  39. data/lib/sequel/adapters/mock.rb +315 -0
  40. data/lib/sequel/adapters/mysql.rb +64 -51
  41. data/lib/sequel/adapters/mysql2.rb +15 -9
  42. data/lib/sequel/adapters/odbc.rb +13 -6
  43. data/lib/sequel/adapters/odbc/db2.rb +0 -4
  44. data/lib/sequel/adapters/odbc/mssql.rb +0 -5
  45. data/lib/sequel/adapters/openbase.rb +2 -4
  46. data/lib/sequel/adapters/oracle.rb +333 -51
  47. data/lib/sequel/adapters/postgres.rb +80 -27
  48. data/lib/sequel/adapters/shared/access.rb +0 -6
  49. data/lib/sequel/adapters/shared/db2.rb +13 -15
  50. data/lib/sequel/adapters/shared/firebird.rb +6 -6
  51. data/lib/sequel/adapters/shared/mssql.rb +23 -18
  52. data/lib/sequel/adapters/shared/mysql.rb +6 -6
  53. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +6 -0
  54. data/lib/sequel/adapters/shared/oracle.rb +185 -30
  55. data/lib/sequel/adapters/shared/postgres.rb +35 -18
  56. data/lib/sequel/adapters/shared/progress.rb +0 -6
  57. data/lib/sequel/adapters/shared/sqlite.rb +116 -37
  58. data/lib/sequel/adapters/sqlite.rb +16 -8
  59. data/lib/sequel/adapters/swift.rb +5 -5
  60. data/lib/sequel/adapters/swift/mysql.rb +0 -5
  61. data/lib/sequel/adapters/swift/postgres.rb +0 -5
  62. data/lib/sequel/adapters/swift/sqlite.rb +6 -4
  63. data/lib/sequel/adapters/tinytds.rb +13 -10
  64. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +8 -0
  65. data/lib/sequel/core.rb +40 -0
  66. data/lib/sequel/database/connecting.rb +1 -2
  67. data/lib/sequel/database/dataset.rb +3 -3
  68. data/lib/sequel/database/dataset_defaults.rb +58 -0
  69. data/lib/sequel/database/misc.rb +62 -2
  70. data/lib/sequel/database/query.rb +113 -49
  71. data/lib/sequel/database/schema_methods.rb +7 -2
  72. data/lib/sequel/dataset/actions.rb +37 -19
  73. data/lib/sequel/dataset/features.rb +24 -0
  74. data/lib/sequel/dataset/graph.rb +7 -6
  75. data/lib/sequel/dataset/misc.rb +11 -3
  76. data/lib/sequel/dataset/mutation.rb +2 -3
  77. data/lib/sequel/dataset/prepared_statements.rb +6 -4
  78. data/lib/sequel/dataset/query.rb +46 -15
  79. data/lib/sequel/dataset/sql.rb +28 -4
  80. data/lib/sequel/extensions/named_timezones.rb +5 -0
  81. data/lib/sequel/extensions/thread_local_timezones.rb +1 -1
  82. data/lib/sequel/model.rb +2 -1
  83. data/lib/sequel/model/associations.rb +115 -33
  84. data/lib/sequel/model/base.rb +91 -31
  85. data/lib/sequel/plugins/class_table_inheritance.rb +4 -4
  86. data/lib/sequel/plugins/dataset_associations.rb +100 -0
  87. data/lib/sequel/plugins/force_encoding.rb +6 -6
  88. data/lib/sequel/plugins/identity_map.rb +1 -1
  89. data/lib/sequel/plugins/many_through_many.rb +6 -10
  90. data/lib/sequel/plugins/prepared_statements.rb +12 -1
  91. data/lib/sequel/plugins/prepared_statements_associations.rb +1 -1
  92. data/lib/sequel/plugins/rcte_tree.rb +29 -15
  93. data/lib/sequel/plugins/serialization.rb +6 -1
  94. data/lib/sequel/plugins/sharding.rb +0 -5
  95. data/lib/sequel/plugins/single_table_inheritance.rb +1 -1
  96. data/lib/sequel/plugins/typecast_on_load.rb +9 -12
  97. data/lib/sequel/plugins/update_primary_key.rb +1 -1
  98. data/lib/sequel/timezones.rb +42 -42
  99. data/lib/sequel/version.rb +1 -1
  100. data/spec/adapters/mssql_spec.rb +29 -29
  101. data/spec/adapters/mysql_spec.rb +86 -104
  102. data/spec/adapters/oracle_spec.rb +48 -76
  103. data/spec/adapters/postgres_spec.rb +98 -33
  104. data/spec/adapters/spec_helper.rb +0 -5
  105. data/spec/adapters/sqlite_spec.rb +24 -21
  106. data/spec/core/connection_pool_spec.rb +9 -15
  107. data/spec/core/core_sql_spec.rb +20 -31
  108. data/spec/core/database_spec.rb +491 -227
  109. data/spec/core/dataset_spec.rb +638 -1051
  110. data/spec/core/expression_filters_spec.rb +0 -1
  111. data/spec/core/mock_adapter_spec.rb +378 -0
  112. data/spec/core/object_graph_spec.rb +48 -114
  113. data/spec/core/schema_generator_spec.rb +3 -3
  114. data/spec/core/schema_spec.rb +51 -114
  115. data/spec/core/spec_helper.rb +3 -90
  116. data/spec/extensions/class_table_inheritance_spec.rb +1 -1
  117. data/spec/extensions/dataset_associations_spec.rb +199 -0
  118. data/spec/extensions/instance_hooks_spec.rb +71 -0
  119. data/spec/extensions/named_timezones_spec.rb +22 -2
  120. data/spec/extensions/nested_attributes_spec.rb +3 -0
  121. data/spec/extensions/schema_spec.rb +1 -1
  122. data/spec/extensions/serialization_modification_detection_spec.rb +1 -0
  123. data/spec/extensions/serialization_spec.rb +5 -8
  124. data/spec/extensions/spec_helper.rb +4 -0
  125. data/spec/extensions/thread_local_timezones_spec.rb +22 -2
  126. data/spec/extensions/typecast_on_load_spec.rb +1 -6
  127. data/spec/integration/associations_test.rb +123 -12
  128. data/spec/integration/dataset_test.rb +140 -47
  129. data/spec/integration/eager_loader_test.rb +19 -21
  130. data/spec/integration/model_test.rb +80 -1
  131. data/spec/integration/plugin_test.rb +179 -128
  132. data/spec/integration/prepared_statement_test.rb +92 -91
  133. data/spec/integration/schema_test.rb +42 -23
  134. data/spec/integration/spec_helper.rb +25 -31
  135. data/spec/integration/timezone_test.rb +38 -12
  136. data/spec/integration/transaction_test.rb +161 -34
  137. data/spec/integration/type_test.rb +3 -3
  138. data/spec/model/association_reflection_spec.rb +83 -7
  139. data/spec/model/associations_spec.rb +393 -676
  140. data/spec/model/base_spec.rb +186 -116
  141. data/spec/model/dataset_methods_spec.rb +7 -27
  142. data/spec/model/eager_loading_spec.rb +343 -867
  143. data/spec/model/hooks_spec.rb +160 -79
  144. data/spec/model/model_spec.rb +118 -165
  145. data/spec/model/plugins_spec.rb +7 -13
  146. data/spec/model/record_spec.rb +138 -207
  147. data/spec/model/spec_helper.rb +10 -73
  148. metadata +14 -8
@@ -1,7 +1,7 @@
1
1
  require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
2
2
 
3
3
  describe "Eagerly loading a tree structure" do
4
- before do
4
+ before(:all) do
5
5
  INTEGRATION_DB.instance_variable_set(:@schemas, {})
6
6
  INTEGRATION_DB.create_table!(:nodes) do
7
7
  primary_key :id
@@ -66,9 +66,8 @@ describe "Eagerly loading a tree structure" do
66
66
  Node.insert(:parent_id=>4)
67
67
  Node.insert(:parent_id=>5)
68
68
  Node.insert(:parent_id=>6)
69
- clear_sqls
70
69
  end
71
- after do
70
+ after(:all) do
72
71
  INTEGRATION_DB.drop_table :nodes
73
72
  Object.send(:remove_const, :Node)
74
73
  end
@@ -145,7 +144,6 @@ describe "Association Extensions" do
145
144
  many_to_one :author
146
145
  end
147
146
  @author = Author.create
148
- clear_sqls
149
147
  end
150
148
  after do
151
149
  INTEGRATION_DB.drop_table :authorships, :authors
@@ -172,7 +170,7 @@ describe "Association Extensions" do
172
170
  end
173
171
 
174
172
  describe "has_many :through has_many and has_one :through belongs_to" do
175
- before do
173
+ before(:all) do
176
174
  INTEGRATION_DB.instance_variable_set(:@schemas, {})
177
175
  INTEGRATION_DB.create_table!(:firms) do
178
176
  primary_key :id
@@ -251,9 +249,8 @@ describe "has_many :through has_many and has_one :through belongs_to" do
251
249
  @invoice3 = Invoice.create(:client => @client2)
252
250
  @invoice4 = Invoice.create(:client => @client3)
253
251
  @invoice5 = Invoice.create(:client => @client3)
254
- clear_sqls
255
252
  end
256
- after do
253
+ after(:all) do
257
254
  INTEGRATION_DB.drop_table :invoices, :clients, :firms
258
255
  Object.send(:remove_const, :Firm)
259
256
  Object.send(:remove_const, :Client)
@@ -324,7 +321,7 @@ describe "has_many :through has_many and has_one :through belongs_to" do
324
321
  end
325
322
 
326
323
  describe "Polymorphic Associations" do
327
- before do
324
+ before(:all) do
328
325
  INTEGRATION_DB.instance_variable_set(:@schemas, {})
329
326
  INTEGRATION_DB.create_table!(:assets) do
330
327
  primary_key :id
@@ -413,6 +410,9 @@ describe "Polymorphic Associations" do
413
410
  .update(:attachable_id=>nil, :attachable_type=>nil)
414
411
  end
415
412
  end
413
+ end
414
+ before do
415
+ [:assets, :posts, :notes].each{|t| INTEGRATION_DB[t].delete}
416
416
  @post = Post.create
417
417
  Note.create
418
418
  @note = Note.create
@@ -420,9 +420,8 @@ describe "Polymorphic Associations" do
420
420
  @asset2 = Asset.create(:attachable=>@note)
421
421
  @asset1.associations.clear
422
422
  @asset2.associations.clear
423
- clear_sqls
424
423
  end
425
- after do
424
+ after(:all) do
426
425
  INTEGRATION_DB.drop_table :assets, :posts, :notes
427
426
  Object.send(:remove_const, :Asset)
428
427
  Object.send(:remove_const, :Post)
@@ -483,7 +482,7 @@ describe "Polymorphic Associations" do
483
482
  end
484
483
 
485
484
  describe "many_to_one/one_to_many not referencing primary key" do
486
- before do
485
+ before(:all) do
487
486
  INTEGRATION_DB.instance_variable_set(:@schemas, {})
488
487
  INTEGRATION_DB.create_table!(:clients) do
489
488
  primary_key :id
@@ -540,14 +539,16 @@ describe "many_to_one/one_to_many not referencing primary key" do
540
539
  self.client_name = (client.name if client)
541
540
  end
542
541
  end
543
-
542
+ end
543
+ before do
544
+ Client.delete
545
+ Invoice.delete
544
546
  @client1 = Client.create(:name=>'X')
545
547
  @client2 = Client.create(:name=>'Y')
546
548
  @invoice1 = Invoice.create(:client_name=>'X')
547
549
  @invoice2 = Invoice.create(:client_name=>'X')
548
- clear_sqls
549
550
  end
550
- after do
551
+ after(:all) do
551
552
  INTEGRATION_DB.drop_table :invoices, :clients
552
553
  Object.send(:remove_const, :Client)
553
554
  Object.send(:remove_const, :Invoice)
@@ -618,7 +619,7 @@ describe "many_to_one/one_to_many not referencing primary key" do
618
619
  end
619
620
 
620
621
  describe "statistics associations" do
621
- before do
622
+ before(:all) do
622
623
  INTEGRATION_DB.create_table!(:projects) do
623
624
  primary_key :id
624
625
  String :name
@@ -658,9 +659,8 @@ describe "statistics associations" do
658
659
  @ticket2 = Ticket.create(:project=>@project1, :hours=>10)
659
660
  @ticket3 = Ticket.create(:project=>@project2, :hours=>2)
660
661
  @ticket4 = Ticket.create(:project=>@project2, :hours=>20)
661
- clear_sqls
662
662
  end
663
- after do
663
+ after(:all) do
664
664
  INTEGRATION_DB.drop_table :tickets, :projects
665
665
  Object.send(:remove_const, :Project)
666
666
  Object.send(:remove_const, :Ticket)
@@ -679,7 +679,7 @@ describe "statistics associations" do
679
679
  end
680
680
 
681
681
  describe "one to one associations" do
682
- before do
682
+ before(:all) do
683
683
  INTEGRATION_DB.create_table!(:books) do
684
684
  primary_key :id
685
685
  end
@@ -703,10 +703,8 @@ describe "one to one associations" do
703
703
  @page2 = Page.create(:book=>@book1, :page_number=>2)
704
704
  @page3 = Page.create(:book=>@book2, :page_number=>1)
705
705
  @page4 = Page.create(:book=>@book2, :page_number=>2)
706
- clear_sqls
707
706
  end
708
-
709
- after do
707
+ after(:all) do
710
708
  INTEGRATION_DB.drop_table :pages, :books
711
709
  Object.send(:remove_const, :Book)
712
710
  Object.send(:remove_const, :Page)
@@ -3,7 +3,7 @@ require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
3
3
  describe "Sequel::Model basic support" do
4
4
  before do
5
5
  @db = INTEGRATION_DB
6
- @db.create_table!(:items) do
6
+ @db.create_table!(:items, :engine=>:InnoDB) do
7
7
  primary_key :id
8
8
  String :name
9
9
  end
@@ -38,6 +38,14 @@ describe "Sequel::Model basic support" do
38
38
  Item::Thing.first.should == Item::Thing.load(:id=>1, :name=>'J')
39
39
  end
40
40
 
41
+ specify "should create accessors for all table columns even if all dataset columns aren't selected" do
42
+ c = Class.new(Sequel::Model(@db[:items].select(:id)))
43
+ o = c.new
44
+ o.name = 'A'
45
+ o.save.should == c.load(:id=>1)
46
+ c.select_map(:name).should == ['A']
47
+ end
48
+
41
49
  specify "should work correctly when a dataset restricts the colums it selects" do
42
50
  class ::Item::Thing < Sequel::Model(@db[:items].select(:name))
43
51
  end
@@ -52,6 +60,68 @@ describe "Sequel::Model basic support" do
52
60
  Item.count.should == 0
53
61
  end
54
62
 
63
+ specify "#save should return nil if raise_on_save_failure is false and save isn't successful" do
64
+ i = Item.new(:name=>'J')
65
+ i.use_transactions = true
66
+ def i.after_save
67
+ raise Sequel::Rollback
68
+ end
69
+ i.save.should be_nil
70
+ end
71
+
72
+ specify "#should respect after_commit, after_rollback, after_destroy_commit, and after_destroy_rollback hooks" do
73
+ i = Item.create(:name=>'J')
74
+ i.use_transactions = true
75
+ def i.hooks
76
+ @hooks
77
+ end
78
+ def i.rb=(x)
79
+ @hooks = []
80
+ @rb = x
81
+ end
82
+ def i.after_save
83
+ @hooks << :as
84
+ raise Sequel::Rollback if @rb
85
+ end
86
+ def i.after_destroy
87
+ @hooks << :ad
88
+ raise Sequel::Rollback if @rb
89
+ end
90
+ def i.after_commit
91
+ @hooks << :ac
92
+ end
93
+ def i.after_rollback
94
+ @hooks << :ar
95
+ end
96
+ def i.after_destroy_commit
97
+ @hooks << :adc
98
+ end
99
+ def i.after_destroy_rollback
100
+ @hooks << :adr
101
+ end
102
+ i.name = 'K'
103
+ i.rb = true
104
+ i.save.should be_nil
105
+ i.reload.name.should == 'J'
106
+ i.hooks.should == [:as, :ar]
107
+
108
+ i.rb = true
109
+ i.destroy.should be_nil
110
+ i.exists?.should be_true
111
+ i.hooks.should == [:ad, :adr]
112
+
113
+ i.name = 'K'
114
+ i.rb = false
115
+ i.save.should_not be_nil
116
+ i.reload.name.should == 'K'
117
+ i.hooks.should == [:as, :ac]
118
+
119
+ i.rb = false
120
+ i.destroy.should_not be_nil
121
+ i.exists?.should be_false
122
+ i.hooks.should == [:ad, :adc]
123
+ end
124
+
55
125
  specify "#exists? should return whether the item is still in the database" do
56
126
  i = Item.create(:name=>'J')
57
127
  i.exists?.should == true
@@ -128,3 +198,12 @@ describe "Sequel::Model basic support" do
128
198
  end
129
199
  end
130
200
  end
201
+
202
+ describe "Sequel::Model with no existing table" do
203
+ specify "should not raise an error when setting the dataset" do
204
+ db = INTEGRATION_DB
205
+ db.drop_table(:items) if db.table_exists?(:items)
206
+ proc{class ::Item < Sequel::Model(db); end}.should_not raise_error
207
+ proc{c = Class.new(Sequel::Model); c.set_dataset(db[:items])}.should_not raise_error
208
+ end
209
+ end
@@ -3,28 +3,32 @@ require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
3
3
  # H2 and MSSQL don't support USING joins
4
4
  # DB2 does not seem to support USING joins in every version; it seems to be
5
5
  # valid expression in DB2 iSeries UDB though.
6
- unless [:h2, :mssql, :db2].include?(INTEGRATION_DB.database_type)
6
+ unless Sequel.guarded?(:h2, :mssql, :db2)
7
7
  describe "Class Table Inheritance Plugin" do
8
- before do
8
+ before(:all) do
9
9
  @db = INTEGRATION_DB
10
10
  @db.instance_variable_set(:@schemas, {})
11
- @db.create_table!(:employees) do
11
+ [:staff, :executives, :managers, :employees].each{|t| @db.drop_table(t) if @db.table_exists?(t)}
12
+ @db.create_table(:employees) do
12
13
  primary_key :id
13
14
  String :name
14
15
  String :kind
15
16
  end
16
- @db.create_table!(:managers) do
17
+ @db.create_table(:managers) do
17
18
  foreign_key :id, :employees, :primary_key=>true
18
19
  Integer :num_staff
19
20
  end
20
- @db.create_table!(:executives) do
21
+ @db.create_table(:executives) do
21
22
  foreign_key :id, :managers, :primary_key=>true
22
23
  Integer :num_managers
23
24
  end
24
- @db.create_table!(:staff) do
25
+ @db.create_table(:staff) do
25
26
  foreign_key :id, :employees, :primary_key=>true
26
27
  foreign_key :manager_id, :managers
27
28
  end
29
+ end
30
+ before do
31
+ [:staff, :executives, :managers, :employees].each{|t| @db[t].delete}
28
32
  class ::Employee < Sequel::Model(@db)
29
33
  plugin :class_table_inheritance, :key=>:kind, :table_map=>{:Staff=>:staff}
30
34
  end
@@ -34,7 +38,7 @@ describe "Class Table Inheritance Plugin" do
34
38
  class ::Executive < Manager
35
39
  end
36
40
  class ::Staff < Employee
37
- many_to_one :manager
41
+ many_to_one :manager, :qualify=>false
38
42
  end
39
43
 
40
44
  @i1 =@db[:employees].insert(:name=>'E', :kind=>'Employee')
@@ -45,13 +49,13 @@ describe "Class Table Inheritance Plugin" do
45
49
  @db[:managers].insert(:id=>@i4, :num_staff=>5)
46
50
  @db[:executives].insert(:id=>@i4, :num_managers=>6)
47
51
  @db[:staff].insert(:id=>@i2, :manager_id=>@i4)
48
-
49
- clear_sqls
50
52
  end
51
53
  after do
52
- @db.drop_table :staff, :executives, :managers, :employees
53
54
  [:Executive, :Manager, :Staff, :Employee].each{|s| Object.send(:remove_const, s)}
54
55
  end
56
+ after(:all) do
57
+ @db.drop_table :staff, :executives, :managers, :employees
58
+ end
55
59
 
56
60
  specify "should return rows as subclass instances" do
57
61
  Employee.order(:id).all.should == [
@@ -122,7 +126,7 @@ describe "Class Table Inheritance Plugin" do
122
126
  Staff.limit(1).eager(:manager).all.map{|x| x.manager}.should == [Manager[@i4]]
123
127
  end
124
128
 
125
- cspecify "should handle eagerly graphing many_to_one relationships", :sqlite do
129
+ specify "should handle eagerly graphing many_to_one relationships" do
126
130
  ss = Staff.eager_graph(:manager).all
127
131
  ss.should == [Staff[@i2]]
128
132
  ss.map{|x| x.manager}.should == [Manager[@i4]]
@@ -145,21 +149,25 @@ end
145
149
  end
146
150
 
147
151
  describe "Many Through Many Plugin" do
148
- before do
152
+ before(:all) do
149
153
  @db = INTEGRATION_DB
150
154
  @db.instance_variable_set(:@schemas, {})
151
- @db.create_table!(:albums) do
155
+ [:albums_artists, :albums, :artists].each{|t| @db.drop_table(t) if @db.table_exists?(t)}
156
+ @db.create_table(:albums) do
152
157
  primary_key :id
153
158
  String :name
154
159
  end
155
- @db.create_table!(:artists) do
160
+ @db.create_table(:artists) do
156
161
  primary_key :id
157
162
  String :name
158
163
  end
159
- @db.create_table!(:albums_artists) do
164
+ @db.create_table(:albums_artists) do
160
165
  foreign_key :album_id, :albums
161
166
  foreign_key :artist_id, :artists
162
167
  end
168
+ end
169
+ before do
170
+ [:albums_artists, :albums, :artists].each{|t| @db[t].delete}
163
171
  class ::Album < Sequel::Model(@db)
164
172
  many_to_many :artists
165
173
  end
@@ -183,26 +191,26 @@ describe "Many Through Many Plugin" do
183
191
  @album4 = Album.create(:name=>'D')
184
192
  @album4.add_artist(@artist1)
185
193
  @album4.add_artist(@artist4)
186
-
187
- clear_sqls
188
194
  end
189
195
  after do
190
- @db.drop_table :albums_artists, :albums, :artists
191
196
  [:Album, :Artist].each{|s| Object.send(:remove_const, s)}
192
197
  end
198
+ after(:all) do
199
+ @db.drop_table :albums_artists, :albums, :artists
200
+ end
193
201
 
194
202
  specify "should handle super simple case with 1 join table" do
195
203
  Artist.many_through_many :albums, [[:albums_artists, :artist_id, :album_id]]
196
- Artist[1].albums.map{|x| x.name}.sort.should == %w'A D'
197
- Artist[2].albums.map{|x| x.name}.sort.should == %w'A C'
198
- Artist[3].albums.map{|x| x.name}.sort.should == %w'B C'
199
- Artist[4].albums.map{|x| x.name}.sort.should == %w'B D'
204
+ Artist[@artist1.id].albums.map{|x| x.name}.sort.should == %w'A D'
205
+ Artist[@artist2.id].albums.map{|x| x.name}.sort.should == %w'A C'
206
+ Artist[@artist3.id].albums.map{|x| x.name}.sort.should == %w'B C'
207
+ Artist[@artist4.id].albums.map{|x| x.name}.sort.should == %w'B D'
200
208
 
201
209
  Artist.plugin :prepared_statements_associations
202
- Artist[1].albums.map{|x| x.name}.sort.should == %w'A D'
203
- Artist[2].albums.map{|x| x.name}.sort.should == %w'A C'
204
- Artist[3].albums.map{|x| x.name}.sort.should == %w'B C'
205
- Artist[4].albums.map{|x| x.name}.sort.should == %w'B D'
210
+ Artist[@artist1.id].albums.map{|x| x.name}.sort.should == %w'A D'
211
+ Artist[@artist2.id].albums.map{|x| x.name}.sort.should == %w'A C'
212
+ Artist[@artist3.id].albums.map{|x| x.name}.sort.should == %w'B C'
213
+ Artist[@artist4.id].albums.map{|x| x.name}.sort.should == %w'B D'
206
214
 
207
215
  Artist.filter(:id=>1).eager(:albums).all.map{|x| x.albums.map{|a| a.name}}.flatten.sort.should == %w'A D'
208
216
  Artist.filter(:id=>2).eager(:albums).all.map{|x| x.albums.map{|a| a.name}}.flatten.sort.should == %w'A C'
@@ -236,26 +244,26 @@ describe "Many Through Many Plugin" do
236
244
 
237
245
  specify "should handle typical case with 3 join tables" do
238
246
  Artist.many_through_many :related_artists, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_artists, :album_id, :artist_id]], :class=>Artist, :distinct=>true
239
- Artist[1].related_artists.map{|x| x.name}.sort.should == %w'1 2 4'
240
- Artist[2].related_artists.map{|x| x.name}.sort.should == %w'1 2 3'
241
- Artist[3].related_artists.map{|x| x.name}.sort.should == %w'2 3 4'
242
- Artist[4].related_artists.map{|x| x.name}.sort.should == %w'1 3 4'
247
+ Artist[@artist1.id].related_artists.map{|x| x.name}.sort.should == %w'1 2 4'
248
+ Artist[@artist2.id].related_artists.map{|x| x.name}.sort.should == %w'1 2 3'
249
+ Artist[@artist3.id].related_artists.map{|x| x.name}.sort.should == %w'2 3 4'
250
+ Artist[@artist4.id].related_artists.map{|x| x.name}.sort.should == %w'1 3 4'
243
251
 
244
252
  Artist.plugin :prepared_statements_associations
245
- Artist[1].related_artists.map{|x| x.name}.sort.should == %w'1 2 4'
246
- Artist[2].related_artists.map{|x| x.name}.sort.should == %w'1 2 3'
247
- Artist[3].related_artists.map{|x| x.name}.sort.should == %w'2 3 4'
248
- Artist[4].related_artists.map{|x| x.name}.sort.should == %w'1 3 4'
253
+ Artist[@artist1.id].related_artists.map{|x| x.name}.sort.should == %w'1 2 4'
254
+ Artist[@artist2.id].related_artists.map{|x| x.name}.sort.should == %w'1 2 3'
255
+ Artist[@artist3.id].related_artists.map{|x| x.name}.sort.should == %w'2 3 4'
256
+ Artist[@artist4.id].related_artists.map{|x| x.name}.sort.should == %w'1 3 4'
249
257
 
250
- Artist.filter(:id=>1).eager(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'1 2 4'
251
- Artist.filter(:id=>2).eager(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'1 2 3'
252
- Artist.filter(:id=>3).eager(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'2 3 4'
253
- Artist.filter(:id=>4).eager(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'1 3 4'
258
+ Artist.filter(:id=>@artist1.id).eager(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'1 2 4'
259
+ Artist.filter(:id=>@artist2.id).eager(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'1 2 3'
260
+ Artist.filter(:id=>@artist3.id).eager(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'2 3 4'
261
+ Artist.filter(:id=>@artist4.id).eager(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'1 3 4'
254
262
 
255
- Artist.filter(:artists__id=>1).eager_graph(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'1 2 4'
256
- Artist.filter(:artists__id=>2).eager_graph(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'1 2 3'
257
- Artist.filter(:artists__id=>3).eager_graph(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'2 3 4'
258
- Artist.filter(:artists__id=>4).eager_graph(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'1 3 4'
263
+ Artist.filter(:artists__id=>@artist1.id).eager_graph(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'1 2 4'
264
+ Artist.filter(:artists__id=>@artist2.id).eager_graph(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'1 2 3'
265
+ Artist.filter(:artists__id=>@artist3.id).eager_graph(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'2 3 4'
266
+ Artist.filter(:artists__id=>@artist4.id).eager_graph(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'1 3 4'
259
267
 
260
268
  Artist.filter(:related_artists=>@artist1).all.map{|a| a.name}.sort.should == %w'1 2 4'
261
269
  Artist.filter(:related_artists=>@artist2).all.map{|a| a.name}.sort.should == %w'1 2 3'
@@ -285,26 +293,26 @@ describe "Many Through Many Plugin" do
285
293
  @album4.add_artist(@artist3)
286
294
  @album4.add_artist(@artist4)
287
295
 
288
- Artist[1].related_albums.map{|x| x.name}.sort.should == %w'A B C'
289
- Artist[2].related_albums.map{|x| x.name}.sort.should == %w'A B C D'
290
- Artist[3].related_albums.map{|x| x.name}.sort.should == %w'A B D'
291
- Artist[4].related_albums.map{|x| x.name}.sort.should == %w'B D'
296
+ Artist[@artist1.id].related_albums.map{|x| x.name}.sort.should == %w'A B C'
297
+ Artist[@artist2.id].related_albums.map{|x| x.name}.sort.should == %w'A B C D'
298
+ Artist[@artist3.id].related_albums.map{|x| x.name}.sort.should == %w'A B D'
299
+ Artist[@artist4.id].related_albums.map{|x| x.name}.sort.should == %w'B D'
292
300
 
293
301
  Artist.plugin :prepared_statements_associations
294
- Artist[1].related_albums.map{|x| x.name}.sort.should == %w'A B C'
295
- Artist[2].related_albums.map{|x| x.name}.sort.should == %w'A B C D'
296
- Artist[3].related_albums.map{|x| x.name}.sort.should == %w'A B D'
297
- Artist[4].related_albums.map{|x| x.name}.sort.should == %w'B D'
302
+ Artist[@artist1.id].related_albums.map{|x| x.name}.sort.should == %w'A B C'
303
+ Artist[@artist2.id].related_albums.map{|x| x.name}.sort.should == %w'A B C D'
304
+ Artist[@artist3.id].related_albums.map{|x| x.name}.sort.should == %w'A B D'
305
+ Artist[@artist4.id].related_albums.map{|x| x.name}.sort.should == %w'B D'
298
306
 
299
- Artist.filter(:id=>1).eager(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'A B C'
300
- Artist.filter(:id=>2).eager(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'A B C D'
301
- Artist.filter(:id=>3).eager(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'A B D'
302
- Artist.filter(:id=>4).eager(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'B D'
307
+ Artist.filter(:id=>@artist1.id).eager(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'A B C'
308
+ Artist.filter(:id=>@artist2.id).eager(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'A B C D'
309
+ Artist.filter(:id=>@artist3.id).eager(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'A B D'
310
+ Artist.filter(:id=>@artist4.id).eager(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'B D'
303
311
 
304
- Artist.filter(:artists__id=>1).eager_graph(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'A B C'
305
- Artist.filter(:artists__id=>2).eager_graph(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'A B C D'
306
- Artist.filter(:artists__id=>3).eager_graph(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'A B D'
307
- Artist.filter(:artists__id=>4).eager_graph(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'B D'
312
+ Artist.filter(:artists__id=>@artist1.id).eager_graph(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'A B C'
313
+ Artist.filter(:artists__id=>@artist2.id).eager_graph(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'A B C D'
314
+ Artist.filter(:artists__id=>@artist3.id).eager_graph(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'A B D'
315
+ Artist.filter(:artists__id=>@artist4.id).eager_graph(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'B D'
308
316
 
309
317
  Artist.filter(:related_albums=>@album1).all.map{|a| a.name}.sort.should == %w'1 2 3'
310
318
  Artist.filter(:related_albums=>@album2).all.map{|a| a.name}.sort.should == %w'1 2 3 4'
@@ -328,19 +336,20 @@ describe "Many Through Many Plugin" do
328
336
  end
329
337
 
330
338
  describe "Lazy Attributes plugin" do
331
- before do
339
+ before(:all) do
332
340
  @db = INTEGRATION_DB
333
341
  @db.create_table!(:items) do
334
342
  primary_key :id
335
343
  String :name
336
344
  Integer :num
337
345
  end
346
+ @db[:items].delete
338
347
  class ::Item < Sequel::Model(@db)
339
348
  plugin :lazy_attributes, :num
340
349
  end
341
350
  Item.create(:name=>'J', :num=>1)
342
351
  end
343
- after do
352
+ after(:all) do
344
353
  @db.drop_table(:items)
345
354
  Object.send(:remove_const, :Item)
346
355
  end
@@ -373,7 +382,7 @@ describe "Lazy Attributes plugin" do
373
382
  end
374
383
 
375
384
  describe "Tactical Eager Loading Plugin" do
376
- before do
385
+ before(:all) do
377
386
  @db = INTEGRATION_DB
378
387
  @db.instance_variable_set(:@schemas, {})
379
388
  @db.create_table!(:artists) do
@@ -385,6 +394,10 @@ describe "Tactical Eager Loading Plugin" do
385
394
  String :name
386
395
  foreign_key :artist_id, :artists
387
396
  end
397
+ end
398
+ before do
399
+ @db[:albums].delete
400
+ @db[:artists].delete
388
401
  class ::Album < Sequel::Model(@db)
389
402
  plugin :tactical_eager_loading
390
403
  many_to_one :artist
@@ -402,13 +415,13 @@ describe "Tactical Eager Loading Plugin" do
402
415
  @album2 = Album.create(:name=>'B', :artist=>@artist1)
403
416
  @album3 = Album.create(:name=>'C', :artist=>@artist2)
404
417
  @album4 = Album.create(:name=>'D', :artist=>@artist3)
405
-
406
- clear_sqls
407
418
  end
408
419
  after do
409
- @db.drop_table :albums, :artists
410
420
  [:Album, :Artist].each{|s| Object.send(:remove_const, s)}
411
421
  end
422
+ after(:all) do
423
+ @db.drop_table :albums, :artists
424
+ end
412
425
 
413
426
  specify "should eagerly load associations for all items when accessing any item" do
414
427
  a = Artist.order(:name).all
@@ -456,7 +469,7 @@ describe "Identity Map plugin" do
456
469
  end
457
470
 
458
471
  describe "Touch plugin" do
459
- before do
472
+ before(:all) do
460
473
  @db = INTEGRATION_DB
461
474
  @db.instance_variable_set(:@schemas, {})
462
475
  @db.create_table!(:artists) do
@@ -470,6 +483,10 @@ describe "Touch plugin" do
470
483
  foreign_key :artist_id, :artists
471
484
  DateTime :updated_at
472
485
  end
486
+ end
487
+ before do
488
+ @db[:albums].delete
489
+ @db[:artists].delete
473
490
  class ::Album < Sequel::Model(@db)
474
491
  many_to_one :artist
475
492
  plugin :touch, :associations=>:artist
@@ -481,9 +498,11 @@ describe "Touch plugin" do
481
498
  @album = Album.create(:name=>'A', :artist=>@artist)
482
499
  end
483
500
  after do
484
- @db.drop_table :albums, :artists
485
501
  [:Album, :Artist].each{|s| Object.send(:remove_const, s)}
486
502
  end
503
+ after(:all) do
504
+ @db.drop_table :albums, :artists
505
+ end
487
506
 
488
507
  specify "should update the timestamp column when touching the record" do
489
508
  @album.updated_at.should == nil
@@ -538,7 +557,7 @@ describe "Serialization plugin" do
538
557
  end
539
558
 
540
559
  describe "OptimisticLocking plugin" do
541
- before do
560
+ before(:all) do
542
561
  @db = INTEGRATION_DB
543
562
  @db.create_table!(:people) do
544
563
  primary_key :id
@@ -547,30 +566,33 @@ describe "OptimisticLocking plugin" do
547
566
  end
548
567
  class ::Person < Sequel::Model(@db)
549
568
  plugin :optimistic_locking
550
- create(:name=>'John')
551
569
  end
552
570
  end
553
- after do
571
+ before do
572
+ @db[:people].delete
573
+ @p = Person.create(:name=>'John')
574
+ end
575
+ after(:all) do
554
576
  @db.drop_table(:people)
555
577
  Object.send(:remove_const, :Person)
556
578
  end
557
579
 
558
580
  specify "should raise an error when updating a stale record" do
559
- p1 = Person[1]
560
- p2 = Person[1]
581
+ p1 = Person[@p.id]
582
+ p2 = Person[@p.id]
561
583
  p1.update(:name=>'Jim')
562
584
  proc{p2.update(:name=>'Bob')}.should raise_error(Sequel::Plugins::OptimisticLocking::Error)
563
585
  end
564
586
 
565
587
  specify "should raise an error when destroying a stale record" do
566
- p1 = Person[1]
567
- p2 = Person[1]
588
+ p1 = Person[@p.id]
589
+ p2 = Person[@p.id]
568
590
  p1.update(:name=>'Jim')
569
591
  proc{p2.destroy}.should raise_error(Sequel::Plugins::OptimisticLocking::Error)
570
592
  end
571
593
 
572
594
  specify "should not raise an error when updating the same record twice" do
573
- p1 = Person[1]
595
+ p1 = Person[@p.id]
574
596
  p1.update(:name=>'Jim')
575
597
  proc{p1.update(:name=>'Bob')}.should_not raise_error
576
598
  end
@@ -630,9 +652,9 @@ describe "Composition plugin" do
630
652
  end
631
653
 
632
654
  # DB2's implemention of CTE is too limited to use this plugin
633
- if INTEGRATION_DB.dataset.supports_cte? and INTEGRATION_DB.database_type != :db2
655
+ if INTEGRATION_DB.dataset.supports_cte? and !Sequel.guarded?(:db2)
634
656
  describe "RcteTree Plugin" do
635
- before do
657
+ before(:all) do
636
658
  @db = INTEGRATION_DB
637
659
  @db.create_table!(:nodes) do
638
660
  primary_key :id
@@ -643,21 +665,25 @@ if INTEGRATION_DB.dataset.supports_cte? and INTEGRATION_DB.database_type != :db2
643
665
  plugin :rcte_tree, :order=>:name
644
666
  end
645
667
 
646
- @a = Node.create(:name=>'a')
647
- @b = Node.create(:name=>'b')
648
- @aa = Node.create(:name=>'aa', :parent=>@a)
649
- @ab = Node.create(:name=>'ab', :parent=>@a)
650
- @ba = Node.create(:name=>'ba', :parent=>@b)
651
- @bb = Node.create(:name=>'bb', :parent=>@b)
652
- @aaa = Node.create(:name=>'aaa', :parent=>@aa)
653
- @aab = Node.create(:name=>'aab', :parent=>@aa)
654
- @aba = Node.create(:name=>'aba', :parent=>@ab)
655
- @abb = Node.create(:name=>'abb', :parent=>@ab)
656
- @aaaa = Node.create(:name=>'aaaa', :parent=>@aaa)
657
- @aaab = Node.create(:name=>'aaab', :parent=>@aaa)
658
- @aaaaa = Node.create(:name=>'aaaaa', :parent=>@aaaa)
659
- end
660
- after do
668
+ @nodes = []
669
+ @nodes << @a = Node.create(:name=>'a')
670
+ @nodes << @b = Node.create(:name=>'b')
671
+ @nodes << @aa = Node.create(:name=>'aa', :parent=>@a)
672
+ @nodes << @ab = Node.create(:name=>'ab', :parent=>@a)
673
+ @nodes << @ba = Node.create(:name=>'ba', :parent=>@b)
674
+ @nodes << @bb = Node.create(:name=>'bb', :parent=>@b)
675
+ @nodes << @aaa = Node.create(:name=>'aaa', :parent=>@aa)
676
+ @nodes << @aab = Node.create(:name=>'aab', :parent=>@aa)
677
+ @nodes << @aba = Node.create(:name=>'aba', :parent=>@ab)
678
+ @nodes << @abb = Node.create(:name=>'abb', :parent=>@ab)
679
+ @nodes << @aaaa = Node.create(:name=>'aaaa', :parent=>@aaa)
680
+ @nodes << @aaab = Node.create(:name=>'aaab', :parent=>@aaa)
681
+ @nodes << @aaaaa = Node.create(:name=>'aaaaa', :parent=>@aaaa)
682
+ end
683
+ before do
684
+ @nodes.each{|n| n.associations.clear}
685
+ end
686
+ after(:all) do
661
687
  @db.drop_table :nodes
662
688
  Object.send(:remove_const, :Node)
663
689
  end
@@ -734,13 +760,15 @@ if INTEGRATION_DB.dataset.supports_cte? and INTEGRATION_DB.database_type != :db2
734
760
  end
735
761
 
736
762
  specify "should work correctly if not all columns are selected" do
737
- Node.plugin :lazy_attributes, :name
738
- @aaaa.descendants.should == [Node.load(:parent_id=>11, :id=>13)]
739
- @aa.ancestors.should == [Node.load(:parent_id=>nil, :id=>1)]
740
- nodes = Node.filter(:id=>[@a.id, @b.id, @aaa.id]).order(:name).eager(:ancestors, :descendants).all
741
- nodes.should == [{:parent_id=>nil, :id=>1}, {:parent_id=>3, :id=>7}, {:parent_id=>nil, :id=>2}].map{|x| Node.load(x)}
742
- nodes[2].descendants.should == [{:parent_id=>2, :id=>5}, {:parent_id=>2, :id=>6}].map{|x| Node.load(x)}
743
- nodes[1].ancestors.should == [{:parent_id=>nil, :id=>1}, {:parent_id=>1, :id=>3}].map{|x| Node.load(x)}
763
+ c = Class.new(Sequel::Model(@db[:nodes]))
764
+ c.plugin :rcte_tree, :order=>:name
765
+ c.plugin :lazy_attributes, :name
766
+ c[:name=>'aaaa'].descendants.should == [c.load(:parent_id=>11, :id=>13)]
767
+ c[:name=>'aa'].ancestors.should == [c.load(:parent_id=>nil, :id=>1)]
768
+ nodes = c.filter(:id=>[@a.id, @b.id, @aaa.id]).order(:name).eager(:ancestors, :descendants).all
769
+ nodes.should == [{:parent_id=>nil, :id=>1}, {:parent_id=>3, :id=>7}, {:parent_id=>nil, :id=>2}].map{|x| c.load(x)}
770
+ nodes[2].descendants.should == [{:parent_id=>2, :id=>5}, {:parent_id=>2, :id=>6}].map{|x| c.load(x)}
771
+ nodes[1].ancestors.should == [{:parent_id=>nil, :id=>1}, {:parent_id=>1, :id=>3}].map{|x| c.load(x)}
744
772
  end
745
773
 
746
774
  specify "should eagerly load descendants to a given level" do
@@ -858,7 +886,7 @@ if INTEGRATION_DB.dataset.supports_cte? and INTEGRATION_DB.database_type != :db2
858
886
  end
859
887
 
860
888
  describe "Instance Filters plugin" do
861
- before do
889
+ before(:all) do
862
890
  @db = INTEGRATION_DB
863
891
  @db.create_table!(:items) do
864
892
  primary_key :id
@@ -869,11 +897,14 @@ describe "Instance Filters plugin" do
869
897
  class ::Item < Sequel::Model(@db)
870
898
  plugin :instance_filters
871
899
  end
900
+ end
901
+ before do
902
+ @db[:items].delete
872
903
  @i = Item.create(:name=>'J', :number=>1, :cost=>2)
873
904
  @i.instance_filter(:number=>1)
874
905
  @i.set(:name=>'K')
875
906
  end
876
- after do
907
+ after(:all) do
877
908
  @db.drop_table(:items)
878
909
  Object.send(:remove_const, :Item)
879
910
  end
@@ -918,20 +949,23 @@ describe "Instance Filters plugin" do
918
949
  end
919
950
 
920
951
  describe "UpdatePrimaryKey plugin" do
921
- before do
952
+ before(:all) do
922
953
  @db = INTEGRATION_DB
923
954
  @db.create_table!(:t) do
924
955
  Integer :a, :primary_key=>true
925
956
  Integer :b
926
957
  end
927
958
  @ds = @db[:t]
928
- @ds.insert(:a=>1, :b=>3)
929
959
  @c = Class.new(Sequel::Model(@ds))
930
960
  @c.set_primary_key(:a)
931
961
  @c.unrestrict_primary_key
932
962
  @c.plugin :update_primary_key
933
963
  end
934
- after do
964
+ before do
965
+ @ds.delete
966
+ @ds.insert(:a=>1, :b=>3)
967
+ end
968
+ after(:all) do
935
969
  @db.drop_table(:t)
936
970
  end
937
971
 
@@ -973,22 +1007,23 @@ describe "UpdatePrimaryKey plugin" do
973
1007
  end
974
1008
 
975
1009
  describe "AssociationPks plugin" do
976
- before do
1010
+ before(:all) do
977
1011
  @db = INTEGRATION_DB
978
- @db.create_table!(:artists) do
1012
+ [:albums_tags, :tags, :albums, :artists].each{|t| @db.drop_table(t) if @db.table_exists?(t)}
1013
+ @db.create_table(:artists) do
979
1014
  primary_key :id
980
1015
  String :name
981
1016
  end
982
- @db.create_table!(:albums) do
1017
+ @db.create_table(:albums) do
983
1018
  primary_key :id
984
1019
  String :name
985
1020
  foreign_key :artist_id, :artists
986
1021
  end
987
- @db.create_table!(:tags) do
1022
+ @db.create_table(:tags) do
988
1023
  primary_key :id
989
1024
  String :name
990
1025
  end
991
- @db.create_table!(:albums_tags) do
1026
+ @db.create_table(:albums_tags) do
992
1027
  foreign_key :album_id, :albums
993
1028
  foreign_key :tag_id, :tags
994
1029
  end
@@ -1002,7 +1037,9 @@ describe "AssociationPks plugin" do
1002
1037
  end
1003
1038
  class ::Tag < Sequel::Model
1004
1039
  end
1005
-
1040
+ end
1041
+ before do
1042
+ [:albums_tags, :tags, :albums, :artists].each{|t| @db[t].delete}
1006
1043
  @ar1 =@db[:artists].insert(:name=>'YJM')
1007
1044
  @ar2 =@db[:artists].insert(:name=>'AS')
1008
1045
  @al1 =@db[:albums].insert(:name=>'RF', :artist_id=>@ar1)
@@ -1015,7 +1052,7 @@ describe "AssociationPks plugin" do
1015
1052
  tids.each{|tid| @db[:albums_tags].insert([aid, tid])}
1016
1053
  end
1017
1054
  end
1018
- after do
1055
+ after(:all) do
1019
1056
  @db.drop_table :albums_tags, :tags, :albums, :artists
1020
1057
  [:Artist, :Album, :Tag].each{|s| Object.send(:remove_const, s)}
1021
1058
  end
@@ -1069,9 +1106,9 @@ end
1069
1106
 
1070
1107
 
1071
1108
  describe "List plugin without a scope" do
1072
- before do
1109
+ before(:all) do
1073
1110
  @db = INTEGRATION_DB
1074
- @db.create_table :sites do
1111
+ @db.create_table!(:sites) do
1075
1112
  primary_key :id
1076
1113
  String :name
1077
1114
  Integer :position
@@ -1079,13 +1116,14 @@ describe "List plugin without a scope" do
1079
1116
 
1080
1117
  @c = Class.new(Sequel::Model(@db[:sites]))
1081
1118
  @c.plugin :list
1119
+ end
1120
+ before do
1082
1121
  @c.delete
1083
1122
  @c.create :name => "hig", :position => 3
1084
1123
  @c.create :name => "def", :position => 2
1085
1124
  @c.create :name => "abc", :position => 1
1086
1125
  end
1087
-
1088
- after do
1126
+ after(:all) do
1089
1127
  @db.drop_table(:sites)
1090
1128
  end
1091
1129
 
@@ -1142,9 +1180,9 @@ describe "List plugin without a scope" do
1142
1180
  end
1143
1181
 
1144
1182
  describe "List plugin with a scope" do
1145
- before do
1183
+ before(:all) do
1146
1184
  @db = INTEGRATION_DB
1147
- @db.create_table :pages do
1185
+ @db.create_table!(:pages) do
1148
1186
  primary_key :id
1149
1187
  String :name
1150
1188
  Integer :pos
@@ -1153,6 +1191,9 @@ describe "List plugin with a scope" do
1153
1191
 
1154
1192
  @c = Class.new(Sequel::Model(@db[:pages]))
1155
1193
  @c.plugin :list, :field => :pos, :scope => :parent_id
1194
+ end
1195
+ before do
1196
+ @c.delete
1156
1197
  p1 = @c.create :name => "Hm", :pos => 1, :parent_id => 0
1157
1198
  p2 = @c.create :name => "Ps", :pos => 1, :parent_id => p1.id
1158
1199
  @c.create :name => "P1", :pos => 1, :parent_id => p2.id
@@ -1160,8 +1201,7 @@ describe "List plugin with a scope" do
1160
1201
  @c.create :name => "P3", :pos => 3, :parent_id => p2.id
1161
1202
  @c.create :name => "Au", :pos => 2, :parent_id => p1.id
1162
1203
  end
1163
-
1164
- after do
1204
+ after(:all) do
1165
1205
  @db.drop_table(:pages)
1166
1206
  end
1167
1207
 
@@ -1218,12 +1258,12 @@ describe "List plugin with a scope" do
1218
1258
  end
1219
1259
 
1220
1260
  describe "Sequel::Plugins::Tree" do
1221
- before do
1261
+ before(:all) do
1222
1262
  @db = INTEGRATION_DB
1223
1263
  end
1224
1264
 
1225
1265
  describe "with natural database order" do
1226
- before do
1266
+ before(:all) do
1227
1267
  @db.create_table!(:nodes) do
1228
1268
  Integer :id, :primary_key=>true
1229
1269
  String :name
@@ -1249,7 +1289,7 @@ describe "Sequel::Plugins::Tree" do
1249
1289
  plugin :tree
1250
1290
  end
1251
1291
  end
1252
- after do
1292
+ after(:all) do
1253
1293
  @db.drop_table(:nodes)
1254
1294
  Object.send(:remove_const, :Node)
1255
1295
  end
@@ -1324,12 +1364,12 @@ describe "Sequel::Plugins::Tree" do
1324
1364
  end
1325
1365
 
1326
1366
  describe "Nodes in specified order" do
1327
- before do
1367
+ before(:all) do
1328
1368
  class ::OrderedNode < Sequel::Model(:nodes)
1329
1369
  plugin :tree, :order => :position
1330
1370
  end
1331
1371
  end
1332
- after do
1372
+ after(:all) do
1333
1373
  Object.send(:remove_const, :OrderedNode)
1334
1374
  end
1335
1375
 
@@ -1347,7 +1387,7 @@ describe "Sequel::Plugins::Tree" do
1347
1387
  end
1348
1388
 
1349
1389
  describe "Lorems in specified order" do
1350
- before do
1390
+ before(:all) do
1351
1391
  @db.create_table!(:lorems) do
1352
1392
  Integer :id, :primary_key=>true
1353
1393
  String :name
@@ -1365,7 +1405,7 @@ describe "Sequel::Plugins::Tree" do
1365
1405
  plugin :tree, :key => :ipsum_id, :order => :neque
1366
1406
  end
1367
1407
  end
1368
- after do
1408
+ after(:all) do
1369
1409
  @db.drop_table(:lorems)
1370
1410
  Object.send(:remove_const, :Lorem)
1371
1411
  end
@@ -1383,7 +1423,7 @@ describe "Sequel::Plugins::Tree" do
1383
1423
  end
1384
1424
 
1385
1425
  describe "Sequel::Plugins::PreparedStatements" do
1386
- before do
1426
+ before(:all) do
1387
1427
  @db = INTEGRATION_DB
1388
1428
  @db.create_table!(:ps_test) do
1389
1429
  primary_key :id
@@ -1391,11 +1431,14 @@ describe "Sequel::Plugins::PreparedStatements" do
1391
1431
  Integer :i
1392
1432
  end
1393
1433
  @c = Class.new(Sequel::Model(@db[:ps_test]))
1434
+ @c.plugin :prepared_statements_with_pk
1435
+ end
1436
+ before do
1437
+ @c.delete
1394
1438
  @foo = @c.create(:name=>'foo', :i=>10)
1395
1439
  @bar = @c.create(:name=>'bar', :i=>20)
1396
- @c.plugin :prepared_statements_with_pk
1397
1440
  end
1398
- after do
1441
+ after(:all) do
1399
1442
  @db.drop_table(:ps_test)
1400
1443
  end
1401
1444
 
@@ -1403,19 +1446,23 @@ describe "Sequel::Plugins::PreparedStatements" do
1403
1446
  @c[@foo.id].should == @foo
1404
1447
  @c[@bar.id].should == @bar
1405
1448
  @c[0].should == nil
1449
+ @c[nil].should == nil
1406
1450
  end
1407
1451
 
1408
1452
  it "should work with looking up using Dataset#with_pk" do
1409
1453
  @c.dataset.with_pk(@foo.id).should == @foo
1410
1454
  @c.dataset.with_pk(@bar.id).should == @bar
1411
1455
  @c.dataset.with_pk(0).should == nil
1456
+ @c.dataset.with_pk(nil).should == nil
1412
1457
 
1413
1458
  @c.dataset.filter(:i=>0).with_pk(@foo.id).should == nil
1414
1459
  @c.dataset.filter(:i=>10).with_pk(@foo.id).should == @foo
1415
1460
  @c.dataset.filter(:i=>20).with_pk(@bar.id).should == @bar
1461
+ @c.dataset.filter(:i=>10).with_pk(nil).should == nil
1416
1462
  @c.dataset.filter(:name=>'foo').with_pk(@foo.id).should == @foo
1417
1463
  @c.dataset.filter(:name=>'bar').with_pk(@bar.id).should == @bar
1418
1464
  @c.dataset.filter(:name=>'baz').with_pk(@bar.id).should == nil
1465
+ @c.dataset.filter(:name=>'bar').with_pk(nil).should == nil
1419
1466
  end
1420
1467
 
1421
1468
  it "should work with Model#destroy" do
@@ -1432,6 +1479,8 @@ describe "Sequel::Plugins::PreparedStatements" do
1432
1479
  @c[@foo.id].should == @c.load(:id=>@foo.id, :name=>'foo3', :i=>30)
1433
1480
  @foo.update(:i=>40)
1434
1481
  @c[@foo.id].should == @c.load(:id=>@foo.id, :name=>'foo3', :i=>40)
1482
+ @foo.update(:i=>nil)
1483
+ @c[@foo.id].should == @c.load(:id=>@foo.id, :name=>'foo3', :i=>nil)
1435
1484
  end
1436
1485
 
1437
1486
  it "should work with Model#create" do
@@ -1441,5 +1490,7 @@ describe "Sequel::Plugins::PreparedStatements" do
1441
1490
  @c[o.id].should == @c.load(:id=>o.id, :name=>'foo2', :i=>nil)
1442
1491
  o = @c.create(:i=>30)
1443
1492
  @c[o.id].should == @c.load(:id=>o.id, :name=>nil, :i=>30)
1493
+ o = @c.create(:name=>nil, :i=>40)
1494
+ @c[o.id].should == @c.load(:id=>o.id, :name=>nil, :i=>40)
1444
1495
  end
1445
1496
  end