sequel 3.12.1 → 3.13.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 (150) hide show
  1. data/CHANGELOG +42 -0
  2. data/README.rdoc +137 -118
  3. data/Rakefile +21 -66
  4. data/doc/active_record.rdoc +9 -9
  5. data/doc/advanced_associations.rdoc +59 -188
  6. data/doc/association_basics.rdoc +15 -2
  7. data/doc/cheat_sheet.rdoc +38 -33
  8. data/doc/dataset_filtering.rdoc +16 -7
  9. data/doc/prepared_statements.rdoc +7 -7
  10. data/doc/querying.rdoc +5 -4
  11. data/doc/release_notes/3.13.0.txt +210 -0
  12. data/doc/sharding.rdoc +1 -1
  13. data/doc/sql.rdoc +5 -5
  14. data/doc/validations.rdoc +11 -11
  15. data/lib/sequel/adapters/ado.rb +1 -1
  16. data/lib/sequel/adapters/do.rb +3 -3
  17. data/lib/sequel/adapters/firebird.rb +3 -3
  18. data/lib/sequel/adapters/jdbc/h2.rb +39 -0
  19. data/lib/sequel/adapters/jdbc/mysql.rb +5 -0
  20. data/lib/sequel/adapters/jdbc/oracle.rb +3 -3
  21. data/lib/sequel/adapters/mysql.rb +7 -4
  22. data/lib/sequel/adapters/oracle.rb +3 -3
  23. data/lib/sequel/adapters/shared/mssql.rb +10 -1
  24. data/lib/sequel/adapters/shared/mysql.rb +63 -0
  25. data/lib/sequel/adapters/shared/postgres.rb +61 -3
  26. data/lib/sequel/adapters/sqlite.rb +105 -18
  27. data/lib/sequel/connection_pool.rb +31 -30
  28. data/lib/sequel/core.rb +58 -58
  29. data/lib/sequel/core_sql.rb +52 -43
  30. data/lib/sequel/database/misc.rb +11 -0
  31. data/lib/sequel/database/query.rb +55 -17
  32. data/lib/sequel/dataset/actions.rb +2 -1
  33. data/lib/sequel/dataset/query.rb +2 -3
  34. data/lib/sequel/dataset/sql.rb +24 -11
  35. data/lib/sequel/extensions/schema_dumper.rb +1 -1
  36. data/lib/sequel/metaprogramming.rb +4 -0
  37. data/lib/sequel/model.rb +37 -19
  38. data/lib/sequel/model/associations.rb +33 -25
  39. data/lib/sequel/model/base.rb +2 -2
  40. data/lib/sequel/model/plugins.rb +7 -2
  41. data/lib/sequel/plugins/active_model.rb +1 -1
  42. data/lib/sequel/plugins/association_pks.rb +2 -2
  43. data/lib/sequel/plugins/association_proxies.rb +1 -1
  44. data/lib/sequel/plugins/boolean_readers.rb +2 -2
  45. data/lib/sequel/plugins/class_table_inheritance.rb +10 -2
  46. data/lib/sequel/plugins/identity_map.rb +3 -3
  47. data/lib/sequel/plugins/instance_hooks.rb +1 -1
  48. data/lib/sequel/plugins/json_serializer.rb +212 -0
  49. data/lib/sequel/plugins/lazy_attributes.rb +1 -1
  50. data/lib/sequel/plugins/list.rb +174 -0
  51. data/lib/sequel/plugins/many_through_many.rb +2 -2
  52. data/lib/sequel/plugins/rcte_tree.rb +6 -7
  53. data/lib/sequel/plugins/tree.rb +118 -0
  54. data/lib/sequel/plugins/xml_serializer.rb +321 -0
  55. data/lib/sequel/sql.rb +315 -206
  56. data/lib/sequel/timezones.rb +40 -17
  57. data/lib/sequel/version.rb +8 -2
  58. data/spec/adapters/firebird_spec.rb +2 -2
  59. data/spec/adapters/informix_spec.rb +1 -1
  60. data/spec/adapters/mssql_spec.rb +2 -2
  61. data/spec/adapters/mysql_spec.rb +2 -2
  62. data/spec/adapters/oracle_spec.rb +1 -1
  63. data/spec/adapters/postgres_spec.rb +36 -6
  64. data/spec/adapters/spec_helper.rb +2 -2
  65. data/spec/adapters/sqlite_spec.rb +1 -1
  66. data/spec/core/connection_pool_spec.rb +3 -3
  67. data/spec/core/core_sql_spec.rb +31 -13
  68. data/spec/core/database_spec.rb +39 -2
  69. data/spec/core/dataset_spec.rb +24 -12
  70. data/spec/core/expression_filters_spec.rb +5 -1
  71. data/spec/core/object_graph_spec.rb +1 -1
  72. data/spec/core/schema_generator_spec.rb +1 -1
  73. data/spec/core/schema_spec.rb +1 -1
  74. data/spec/core/spec_helper.rb +1 -1
  75. data/spec/core/version_spec.rb +1 -1
  76. data/spec/extensions/active_model_spec.rb +82 -67
  77. data/spec/extensions/association_dependencies_spec.rb +1 -1
  78. data/spec/extensions/association_pks_spec.rb +1 -1
  79. data/spec/extensions/association_proxies_spec.rb +1 -1
  80. data/spec/extensions/blank_spec.rb +1 -1
  81. data/spec/extensions/boolean_readers_spec.rb +1 -1
  82. data/spec/extensions/caching_spec.rb +1 -1
  83. data/spec/extensions/class_table_inheritance_spec.rb +3 -2
  84. data/spec/extensions/composition_spec.rb +2 -5
  85. data/spec/extensions/force_encoding_spec.rb +3 -1
  86. data/spec/extensions/hook_class_methods_spec.rb +1 -1
  87. data/spec/extensions/identity_map_spec.rb +1 -1
  88. data/spec/extensions/inflector_spec.rb +1 -1
  89. data/spec/extensions/instance_filters_spec.rb +1 -1
  90. data/spec/extensions/instance_hooks_spec.rb +1 -1
  91. data/spec/extensions/json_serializer_spec.rb +154 -0
  92. data/spec/extensions/lazy_attributes_spec.rb +1 -2
  93. data/spec/extensions/list_spec.rb +251 -0
  94. data/spec/extensions/looser_typecasting_spec.rb +1 -1
  95. data/spec/extensions/many_through_many_spec.rb +3 -3
  96. data/spec/extensions/migration_spec.rb +1 -1
  97. data/spec/extensions/named_timezones_spec.rb +5 -6
  98. data/spec/extensions/nested_attributes_spec.rb +1 -1
  99. data/spec/extensions/optimistic_locking_spec.rb +1 -1
  100. data/spec/extensions/pagination_spec.rb +1 -1
  101. data/spec/extensions/pretty_table_spec.rb +1 -1
  102. data/spec/extensions/query_spec.rb +1 -1
  103. data/spec/extensions/rcte_tree_spec.rb +1 -1
  104. data/spec/extensions/schema_dumper_spec.rb +3 -2
  105. data/spec/extensions/schema_spec.rb +1 -1
  106. data/spec/extensions/serialization_spec.rb +6 -2
  107. data/spec/extensions/sharding_spec.rb +1 -1
  108. data/spec/extensions/single_table_inheritance_spec.rb +1 -1
  109. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  110. data/spec/extensions/spec_helper.rb +7 -3
  111. data/spec/extensions/sql_expr_spec.rb +1 -1
  112. data/spec/extensions/string_date_time_spec.rb +1 -1
  113. data/spec/extensions/string_stripper_spec.rb +1 -1
  114. data/spec/extensions/subclasses_spec.rb +1 -1
  115. data/spec/extensions/tactical_eager_loading_spec.rb +1 -1
  116. data/spec/extensions/thread_local_timezones_spec.rb +1 -1
  117. data/spec/extensions/timestamps_spec.rb +1 -1
  118. data/spec/extensions/touch_spec.rb +1 -1
  119. data/spec/extensions/tree_spec.rb +119 -0
  120. data/spec/extensions/typecast_on_load_spec.rb +1 -1
  121. data/spec/extensions/update_primary_key_spec.rb +1 -1
  122. data/spec/extensions/validation_class_methods_spec.rb +1 -1
  123. data/spec/extensions/validation_helpers_spec.rb +1 -1
  124. data/spec/extensions/xml_serializer_spec.rb +142 -0
  125. data/spec/integration/associations_test.rb +1 -1
  126. data/spec/integration/database_test.rb +1 -1
  127. data/spec/integration/dataset_test.rb +29 -14
  128. data/spec/integration/eager_loader_test.rb +1 -1
  129. data/spec/integration/migrator_test.rb +1 -1
  130. data/spec/integration/model_test.rb +1 -1
  131. data/spec/integration/plugin_test.rb +316 -1
  132. data/spec/integration/prepared_statement_test.rb +1 -1
  133. data/spec/integration/schema_test.rb +8 -8
  134. data/spec/integration/spec_helper.rb +1 -1
  135. data/spec/integration/timezone_test.rb +1 -1
  136. data/spec/integration/transaction_test.rb +35 -20
  137. data/spec/integration/type_test.rb +1 -1
  138. data/spec/model/association_reflection_spec.rb +1 -1
  139. data/spec/model/associations_spec.rb +49 -34
  140. data/spec/model/base_spec.rb +1 -1
  141. data/spec/model/dataset_methods_spec.rb +4 -4
  142. data/spec/model/eager_loading_spec.rb +1 -1
  143. data/spec/model/hooks_spec.rb +1 -1
  144. data/spec/model/inflector_spec.rb +1 -1
  145. data/spec/model/model_spec.rb +7 -1
  146. data/spec/model/plugins_spec.rb +1 -1
  147. data/spec/model/record_spec.rb +1 -3
  148. data/spec/model/spec_helper.rb +2 -2
  149. data/spec/model/validations_spec.rb +1 -1
  150. metadata +29 -5
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), "spec_helper")
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
2
 
3
3
  describe "Sequel::Plugins::LazyAttributes" do
4
4
  before do
@@ -24,7 +24,6 @@ describe "Sequel::Plugins::LazyAttributes" do
24
24
  end
25
25
  else
26
26
  i = where.args.last
27
- i = i.instance_variable_get(:@array) if i.is_a?(Sequel::SQL::SQLArray)
28
27
  Array(i).each do |x|
29
28
  if sql =~ /SELECT name FROM/
30
29
  yield(block[:name=>x.to_s])
@@ -0,0 +1,251 @@
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), '/spec_helper')
2
+
3
+ describe "List plugin" do
4
+ def klass(opts={})
5
+ @db = MODEL_DB
6
+ c = Class.new(Sequel::Model(@db[:items]))
7
+ c.class_eval do
8
+ columns :id, :position, :scope_id, :pos
9
+ plugin :list, opts
10
+ self.use_transactions = false
11
+
12
+ class << self
13
+ attr_accessor :rows
14
+ end
15
+
16
+ def checked_transaction(opts={})
17
+ return super if @in_transaction || !use_transaction?(opts)
18
+ @in_transaction = true
19
+ db.execute 'BEGIN'
20
+ super
21
+ db.execute 'COMMIT'
22
+ @in_transaction = false
23
+ end
24
+ end
25
+ c
26
+ end
27
+
28
+ def y(c, *hs)
29
+ c.rows = hs
30
+ ds = c.dataset
31
+ def ds.fetch_rows(sql)
32
+ db.execute(sql)
33
+ yield model.rows.shift
34
+ end
35
+ end
36
+
37
+ before do
38
+ @c = klass
39
+ @o = @c.load(:id=>7, :position=>3)
40
+ @sc = klass(:scope=>:scope_id)
41
+ @so = @sc.load(:id=>7, :position=>3, :scope_id=>5)
42
+ @db.reset
43
+ end
44
+
45
+ it "should default to using :position as the position field" do
46
+ @c.position_field.should == :position
47
+ @c.new.list_dataset.sql.should == 'SELECT * FROM items ORDER BY position'
48
+ end
49
+
50
+ it "should accept a :field option to modify the position field" do
51
+ klass(:field=>:pos).position_field.should == :pos
52
+ end
53
+
54
+ it "should accept a :scope option with a symbol for a single scope column" do
55
+ @sc.new(:scope_id=>4).list_dataset.sql.should == 'SELECT * FROM items WHERE (scope_id = 4) ORDER BY scope_id, position'
56
+ end
57
+
58
+ it "should accept a :scope option with an array of symbols for multiple scope columns" do
59
+ ['SELECT * FROM items WHERE ((scope_id = 4) AND (pos = 3)) ORDER BY scope_id, pos, position',
60
+ 'SELECT * FROM items WHERE ((pos = 3) AND (scope_id = 4)) ORDER BY scope_id, pos, position'].
61
+ should include(klass(:scope=>[:scope_id, :pos]).new(:scope_id=>4, :pos=>3).list_dataset.sql)
62
+ end
63
+
64
+ it "should accept a :scope option with a proc for a custom list scope" do
65
+ klass(:scope=>proc{|o| o.model.dataset.filter(:active).filter(:scope_id=>o.scope_id)}).new(:scope_id=>4).list_dataset.sql.should == 'SELECT * FROM items WHERE (active AND (scope_id = 4)) ORDER BY position'
66
+ end
67
+
68
+ it "should modify the order when using the plugin" do
69
+ c = Class.new(Sequel::Model(:items))
70
+ c.model.dataset.sql.should == 'SELECT * FROM items'
71
+ c.plugin :list
72
+ c.model.dataset.sql.should == 'SELECT * FROM items ORDER BY position'
73
+ end
74
+
75
+ it "should be able to access the position field as a class attribute" do
76
+ @c.position_field.should == :position
77
+ klass(:field=>:pos).position_field.should == :pos
78
+ end
79
+
80
+ it "should be able to access the scope proc as a class attribute" do
81
+ @c.scope_proc.should == nil
82
+ @sc.scope_proc[@sc.new(:scope_id=>4)].sql.should == 'SELECT * FROM items WHERE (scope_id = 4) ORDER BY scope_id, position'
83
+ end
84
+
85
+ it "should work correctly in subclasses" do
86
+ c = Class.new(klass(:scope=>:scope_id))
87
+ c.position_field.should == :position
88
+ c.scope_proc[c.new(:scope_id=>4)].sql.should == 'SELECT * FROM items WHERE (scope_id = 4) ORDER BY scope_id, position'
89
+ end
90
+
91
+ it "should have at_position return the model object at the given position" do
92
+ y(@c, :id=>1, :position=>1)
93
+ @o.at_position(10).should == @c.load(:id=>1, :position=>1)
94
+ y(@sc, :id=>2, :position=>2, :scope_id=>5)
95
+ @so.at_position(20).should == @sc.load(:id=>2, :position=>2, :scope_id=>5)
96
+ @db.sqls.should == ["SELECT * FROM items WHERE (position = 10) ORDER BY position LIMIT 1",
97
+ "SELECT * FROM items WHERE ((scope_id = 5) AND (position = 20)) ORDER BY scope_id, position LIMIT 1"]
98
+ end
99
+
100
+ it "should have last_position return the last position in the list" do
101
+ y(@c, :max=>10)
102
+ @o.last_position.should == 10
103
+ y(@sc, :max=>20)
104
+ @so.last_position.should == 20
105
+ @db.sqls.should == ["SELECT max(position) FROM items LIMIT 1",
106
+ "SELECT max(position) FROM items WHERE (scope_id = 5) LIMIT 1"]
107
+ end
108
+
109
+ it "should have list_dataset return the model's dataset for non scoped lists" do
110
+ @o.list_dataset.sql.should == 'SELECT * FROM items ORDER BY position'
111
+ end
112
+
113
+ it "should have list dataset return a scoped dataset for scoped lists" do
114
+ @so.list_dataset.sql.should == 'SELECT * FROM items WHERE (scope_id = 5) ORDER BY scope_id, position'
115
+ end
116
+
117
+ it "should have move_down without an argument move down a single position" do
118
+ y(@c, :max=>10)
119
+ @o.move_down.should == @o
120
+ @o.position.should == 4
121
+ @db.sqls.should == ["SELECT max(position) FROM items LIMIT 1",
122
+ "UPDATE items SET position = (position - 1) WHERE ((position >= 4) AND (position <= 4))",
123
+ "UPDATE items SET position = 4 WHERE (id = 7)"]
124
+ end
125
+
126
+ it "should have move_down with an argument move down the given number of positions" do
127
+ y(@c, :max=>10)
128
+ @o.move_down(3).should == @o
129
+ @o.position.should == 6
130
+ @db.sqls.should == ["SELECT max(position) FROM items LIMIT 1",
131
+ "UPDATE items SET position = (position - 1) WHERE ((position >= 4) AND (position <= 6))",
132
+ "UPDATE items SET position = 6 WHERE (id = 7)"]
133
+ end
134
+
135
+ it "should have move_down with a negative argument move up the given number of positions" do
136
+ @o.move_down(-1).should == @o
137
+ @o.position.should == 2
138
+ @db.sqls.should == ["UPDATE items SET position = (position + 1) WHERE ((position >= 2) AND (position < 3))",
139
+ "UPDATE items SET position = 2 WHERE (id = 7)"]
140
+ end
141
+
142
+ it "should have move_to raise an error if an invalid target is used" do
143
+ proc{@o.move_to(0)}.should raise_error(Sequel::Error)
144
+ y(@c, :max=>10)
145
+ proc{@o.move_to(11)}.should raise_error(Sequel::Error)
146
+ end
147
+
148
+ it "should have move_to use a transaction is the instance is configured to use transactions" do
149
+ @o.use_transactions = true
150
+ @o.move_to(2)
151
+ @db.sqls.should == ["BEGIN",
152
+ "UPDATE items SET position = (position + 1) WHERE ((position >= 2) AND (position < 3))",
153
+ "UPDATE items SET position = 2 WHERE (id = 7)",
154
+ "COMMIT"]
155
+ end
156
+
157
+ it "should have move_to do nothing if the target position is the same as the current position" do
158
+ @o.use_transactions = true
159
+ @o.move_to(@o.position).should == @o
160
+ @o.position.should == 3
161
+ @db.sqls.should == []
162
+ end
163
+
164
+ it "should have move to shift entries correctly between current and target if moving up" do
165
+ @o.move_to(2)
166
+ @db.sqls.first.should == "UPDATE items SET position = (position + 1) WHERE ((position >= 2) AND (position < 3))"
167
+ end
168
+
169
+ it "should have move to shift entries correctly between current and target if moving down" do
170
+ y(@c, :max=>10)
171
+ @o.move_to(4)
172
+ @db.sqls[1].should == "UPDATE items SET position = (position - 1) WHERE ((position >= 4) AND (position <= 4))"
173
+ end
174
+
175
+ it "should have move_to_bottom move the item to the last position" do
176
+ y(@c, :max=>10)
177
+ @o.move_to_bottom
178
+ @db.sqls.should == ["SELECT max(position) FROM items LIMIT 1",
179
+ "UPDATE items SET position = (position - 1) WHERE ((position >= 4) AND (position <= 10))",
180
+ "UPDATE items SET position = 10 WHERE (id = 7)"]
181
+ end
182
+
183
+ it "should have move_to_top move the item to the first position" do
184
+ @o.move_to_top
185
+ @db.sqls.should == ["UPDATE items SET position = (position + 1) WHERE ((position >= 1) AND (position < 3))",
186
+ "UPDATE items SET position = 1 WHERE (id = 7)"]
187
+ end
188
+
189
+ it "should have move_up without an argument move up a single position" do
190
+ @o.move_up.should == @o
191
+ @o.position.should == 2
192
+ @db.sqls.should == ["UPDATE items SET position = (position + 1) WHERE ((position >= 2) AND (position < 3))",
193
+ "UPDATE items SET position = 2 WHERE (id = 7)"]
194
+ end
195
+
196
+ it "should have move_up with an argument move up the given number of positions" do
197
+ @o.move_up(2).should == @o
198
+ @o.position.should == 1
199
+ @db.sqls.should == ["UPDATE items SET position = (position + 1) WHERE ((position >= 1) AND (position < 3))",
200
+ "UPDATE items SET position = 1 WHERE (id = 7)"]
201
+ end
202
+
203
+ it "should have move_up with a negative argument move down the given number of positions" do
204
+ y(@c, :max=>10)
205
+ @o.move_up(-1).should == @o
206
+ @o.position.should == 4
207
+ @db.sqls.should == ["SELECT max(position) FROM items LIMIT 1",
208
+ "UPDATE items SET position = (position - 1) WHERE ((position >= 4) AND (position <= 4))",
209
+ "UPDATE items SET position = 4 WHERE (id = 7)"]
210
+ end
211
+
212
+ it "should have next return the next entry in the list if not given an argument" do
213
+ y(@c, :id=>9, :position=>4)
214
+ @o.next.should == @c.load(:id=>9, :position=>4)
215
+ @db.sqls.should == ["SELECT * FROM items WHERE (position = 4) ORDER BY position LIMIT 1"]
216
+ end
217
+
218
+ it "should have next return the entry the given number of positions below the instance if given an argument" do
219
+ y(@c, :id=>9, :position=>5)
220
+ @o.next(2).should == @c.load(:id=>9, :position=>5)
221
+ @db.sqls.should == ["SELECT * FROM items WHERE (position = 5) ORDER BY position LIMIT 1"]
222
+ end
223
+
224
+ it "should have next return a previous entry if given a negative argument" do
225
+ y(@c, :id=>9, :position=>2)
226
+ @o.next(-1).should == @c.load(:id=>9, :position=>2)
227
+ @db.sqls.should == ["SELECT * FROM items WHERE (position = 2) ORDER BY position LIMIT 1"]
228
+ end
229
+
230
+ it "should have position_value return the value of the position field" do
231
+ @o.position_value.should == 3
232
+ end
233
+
234
+ it "should have prev return the previous entry in the list if not given an argument" do
235
+ y(@c, :id=>9, :position=>2)
236
+ @o.prev.should == @c.load(:id=>9, :position=>2)
237
+ @db.sqls.should == ["SELECT * FROM items WHERE (position = 2) ORDER BY position LIMIT 1"]
238
+ end
239
+
240
+ it "should have prev return the entry the given number of positions above the instance if given an argument" do
241
+ y(@c, :id=>9, :position=>1)
242
+ @o.prev(2).should == @c.load(:id=>9, :position=>1)
243
+ @db.sqls.should == ["SELECT * FROM items WHERE (position = 1) ORDER BY position LIMIT 1"]
244
+ end
245
+
246
+ it "should have prev return a following entry if given a negative argument" do
247
+ y(@c, :id=>9, :position=>4)
248
+ @o.prev(-1).should == @c.load(:id=>9, :position=>4)
249
+ @db.sqls.should == ["SELECT * FROM items WHERE (position = 4) ORDER BY position LIMIT 1"]
250
+ end
251
+ end
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), "spec_helper")
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
2
 
3
3
  context "LooserTypecasting Extension" do
4
4
  before do
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), "spec_helper")
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
2
 
3
3
  describe Sequel::Model, "many_through_many" do
4
4
  before do
@@ -245,9 +245,9 @@ describe Sequel::Model, "many_through_many" do
245
245
  h = []
246
246
  @c1.many_through_many :tags, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_tags, :album_id, :tag_id]], :after_load=>:al
247
247
  @c1.class_eval do
248
- @@blah = h
248
+ class_variable_set(:@@blah, h)
249
249
  def al(v)
250
- v.each{|x| @@blah << x.pk * 20}
250
+ v.each{|x| self.class.send(:class_variable_get, :@@blah) << x.pk * 20}
251
251
  end
252
252
  end
253
253
  @c2.class_eval do
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), 'spec_helper')
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper')
2
2
 
3
3
  context "Migration.descendants" do
4
4
  before do
@@ -1,11 +1,10 @@
1
- require File.join(File.dirname(__FILE__), "spec_helper")
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
2
 
3
- if (begin
3
+ begin
4
4
  require 'tzinfo'
5
- true
6
- rescue LoadError
7
- end)
8
-
5
+ rescue LoadError => e
6
+ skip_warn "named_timezones_spec: can't load tzinfo (#{e.class}: #{e})"
7
+ else
9
8
  Sequel.extension :named_timezones
10
9
  Sequel.datetime_class = Time
11
10
 
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), "spec_helper")
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
2
 
3
3
  describe "NestedAttributes plugin" do
4
4
  before do
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), "spec_helper")
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
2
 
3
3
  describe "optimistic_locking plugin" do
4
4
  before do
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), "spec_helper")
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
2
 
3
3
  context "A paginated dataset" do
4
4
  before do
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), 'spec_helper')
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper')
2
2
 
3
3
  require 'stringio'
4
4
 
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), "spec_helper")
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
2
 
3
3
  context "Database#dataset" do
4
4
  before do
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), "spec_helper")
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
2
 
3
3
  describe Sequel::Model, "rcte_tree" do
4
4
  before do
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), 'spec_helper')
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper')
2
2
 
3
3
  describe "Sequel::Schema::Generator dump methods" do
4
4
  before do
@@ -291,7 +291,7 @@ END_MIG
291
291
  ["double precision", "timestamp with time zone", "timestamp without time zone",
292
292
  "time with time zone", "time without time zone", "character varying(20)"] +
293
293
  %w"nvarchar ntext smalldatetime smallmoney binary varbinary nchar" +
294
- ["timestamp(6) without time zone", "timestamp(6) with time zone"]
294
+ ["timestamp(6) without time zone", "timestamp(6) with time zone", "int(12) unsigned"]
295
295
  @d.meta_def(:schema) do |t, *o|
296
296
  i = 0
297
297
  types.map{|x| [:"c#{i+=1}", {:db_type=>x, :allow_null=>true}]}
@@ -361,6 +361,7 @@ create_table(:x) do
361
361
  String :c61, :fixed=>true
362
362
  DateTime :c62, :size=>6
363
363
  DateTime :c63, :size=>6
364
+ Integer :c64
364
365
  end
365
366
  END_MIG
366
367
  @d.dump_table_schema(:x).should == table.chomp
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), "spec_helper")
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
2
 
3
3
  describe Sequel::Model, "dataset & schema" do
4
4
  before do
@@ -1,8 +1,11 @@
1
- require File.join(File.dirname(__FILE__), "spec_helper")
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
2
 
3
+ begin
3
4
  require 'yaml'
4
5
  require 'json'
5
-
6
+ rescue LoadError => e
7
+ skip_warn "serialization plugin: can't load json (#{e.class}: #{e})"
8
+ else
6
9
  describe "Serialization plugin" do
7
10
  before do
8
11
  @c = Class.new(Sequel::Model(:items)) do
@@ -207,3 +210,4 @@ describe "Serialization plugin" do
207
210
  o.abc.should == 9
208
211
  end
209
212
  end
213
+ end
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), "spec_helper")
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
2
 
3
3
  describe "sharding plugin" do
4
4
  before do
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), "spec_helper")
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
2
 
3
3
  describe Sequel::Model, "#sti_key" do
4
4
  before do
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), "spec_helper")
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
2
 
3
3
  describe "Sequel::Plugins::SkipCreateRefresh" do
4
4
  it "should skip the refresh after saving a new object" do
@@ -1,16 +1,20 @@
1
1
  require 'rubygems'
2
2
  unless Object.const_defined?('Sequel')
3
- $:.unshift(File.join(File.dirname(__FILE__), "../../lib/"))
3
+ $:.unshift(File.join(File.dirname(File.expand_path(__FILE__)), "../../lib/"))
4
4
  require 'sequel/core'
5
5
  end
6
6
  unless Sequel.const_defined?('Model')
7
- $:.unshift(File.join(File.dirname(__FILE__), "../../lib/"))
7
+ $:.unshift(File.join(File.dirname(File.expand_path(__FILE__)), "../../lib/"))
8
8
  require 'sequel/model'
9
9
  end
10
10
 
11
11
  Sequel.extension(*%w'string_date_time inflector pagination query pretty_table blank migration schema_dumper looser_typecasting sql_expr thread_local_timezones')
12
12
  {:hook_class_methods=>[], :schema=>[], :validation_class_methods=>[]}.each{|p, opts| Sequel::Model.plugin(p, *opts)}
13
13
 
14
+ def skip_warn(s)
15
+ warn "Skipping test of #{s}" if ENV["SKIPPED_TEST_WARN"]
16
+ end
17
+
14
18
  class MockDataset < Sequel::Dataset
15
19
  def insert(*args)
16
20
  @db.execute insert_sql(*args)
@@ -74,7 +78,7 @@ end
74
78
  class << Sequel::Model
75
79
  alias orig_columns columns
76
80
  def columns(*cols)
77
- return if cols.empty?
81
+ return @columns if cols.empty?
78
82
  define_method(:columns){cols}
79
83
  @dataset.instance_variable_set(:@columns, cols) if @dataset
80
84
  def_column_accessor(*cols)