sequel_core 2.2.0 → 3.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. metadata +30 -101
  2. data/CHANGELOG +0 -1519
  3. data/COPYING +0 -19
  4. data/README +0 -313
  5. data/Rakefile +0 -158
  6. data/bin/sequel +0 -117
  7. data/doc/cheat_sheet.rdoc +0 -225
  8. data/doc/dataset_filtering.rdoc +0 -182
  9. data/lib/sequel_core.rb +0 -136
  10. data/lib/sequel_core/adapters/adapter_skeleton.rb +0 -68
  11. data/lib/sequel_core/adapters/ado.rb +0 -90
  12. data/lib/sequel_core/adapters/db2.rb +0 -160
  13. data/lib/sequel_core/adapters/dbi.rb +0 -127
  14. data/lib/sequel_core/adapters/informix.rb +0 -89
  15. data/lib/sequel_core/adapters/jdbc.rb +0 -110
  16. data/lib/sequel_core/adapters/mysql.rb +0 -486
  17. data/lib/sequel_core/adapters/odbc.rb +0 -167
  18. data/lib/sequel_core/adapters/odbc_mssql.rb +0 -106
  19. data/lib/sequel_core/adapters/openbase.rb +0 -76
  20. data/lib/sequel_core/adapters/oracle.rb +0 -182
  21. data/lib/sequel_core/adapters/postgres.rb +0 -560
  22. data/lib/sequel_core/adapters/sqlite.rb +0 -270
  23. data/lib/sequel_core/connection_pool.rb +0 -194
  24. data/lib/sequel_core/core_ext.rb +0 -197
  25. data/lib/sequel_core/core_sql.rb +0 -184
  26. data/lib/sequel_core/database.rb +0 -462
  27. data/lib/sequel_core/database/schema.rb +0 -156
  28. data/lib/sequel_core/dataset.rb +0 -457
  29. data/lib/sequel_core/dataset/callback.rb +0 -13
  30. data/lib/sequel_core/dataset/convenience.rb +0 -245
  31. data/lib/sequel_core/dataset/pagination.rb +0 -96
  32. data/lib/sequel_core/dataset/query.rb +0 -41
  33. data/lib/sequel_core/dataset/schema.rb +0 -15
  34. data/lib/sequel_core/dataset/sql.rb +0 -889
  35. data/lib/sequel_core/deprecated.rb +0 -26
  36. data/lib/sequel_core/exceptions.rb +0 -42
  37. data/lib/sequel_core/migration.rb +0 -187
  38. data/lib/sequel_core/object_graph.rb +0 -216
  39. data/lib/sequel_core/pretty_table.rb +0 -71
  40. data/lib/sequel_core/schema.rb +0 -2
  41. data/lib/sequel_core/schema/generator.rb +0 -239
  42. data/lib/sequel_core/schema/sql.rb +0 -326
  43. data/lib/sequel_core/sql.rb +0 -812
  44. data/lib/sequel_core/worker.rb +0 -68
  45. data/spec/adapters/informix_spec.rb +0 -96
  46. data/spec/adapters/mysql_spec.rb +0 -765
  47. data/spec/adapters/oracle_spec.rb +0 -222
  48. data/spec/adapters/postgres_spec.rb +0 -441
  49. data/spec/adapters/sqlite_spec.rb +0 -413
  50. data/spec/connection_pool_spec.rb +0 -363
  51. data/spec/core_ext_spec.rb +0 -156
  52. data/spec/core_sql_spec.rb +0 -427
  53. data/spec/database_spec.rb +0 -963
  54. data/spec/dataset_spec.rb +0 -2933
  55. data/spec/expression_filters_spec.rb +0 -316
  56. data/spec/migration_spec.rb +0 -261
  57. data/spec/object_graph_spec.rb +0 -230
  58. data/spec/pretty_table_spec.rb +0 -58
  59. data/spec/rcov.opts +0 -6
  60. data/spec/schema_generator_spec.rb +0 -122
  61. data/spec/schema_spec.rb +0 -422
  62. data/spec/spec.opts +0 -0
  63. data/spec/spec_config.rb +0 -7
  64. data/spec/spec_config.rb.example +0 -8
  65. data/spec/spec_helper.rb +0 -55
  66. data/spec/worker_spec.rb +0 -96
@@ -1,316 +0,0 @@
1
- require File.join(File.dirname(__FILE__), 'spec_helper')
2
-
3
- context "Blockless Ruby Filters" do
4
- before do
5
- db = Sequel::Database.new
6
- db.quote_identifiers = false
7
- @d = db[:items]
8
- def @d.l(*args, &block)
9
- literal(filter_expr(*args, &block))
10
- end
11
- def @d.lit(*args)
12
- literal(*args)
13
- end
14
- end
15
-
16
- it "should support boolean columns directly" do
17
- @d.l(:x).should == 'x'
18
- end
19
-
20
- it "should support NOT via Symbol#~" do
21
- @d.l(~:x).should == 'NOT x'
22
- end
23
-
24
- it "should support qualified columns" do
25
- @d.l(:x__y).should == 'x.y'
26
- @d.l(~:x__y).should == 'NOT x.y'
27
- end
28
-
29
- it "should support NOT with SQL functions" do
30
- @d.l(~:is_blah[]).should == 'NOT is_blah()'
31
- @d.l(~:is_blah[:x]).should == 'NOT is_blah(x)'
32
- @d.l(~:is_blah[:x__y]).should == 'NOT is_blah(x.y)'
33
- @d.l(~:is_blah[:x, :x__y]).should == 'NOT is_blah(x, x.y)'
34
- end
35
-
36
- it "should handle multiple ~" do
37
- @d.l(~~:x).should == 'x'
38
- @d.l(~~~:x).should == 'NOT x'
39
- @d.l(~~(:x > 100)).should == '(x > 100)'
40
- @d.l(~~(:x & :y)).should == '(x AND y)'
41
- @d.l(~~(:x | :y)).should == '(x OR y)'
42
- end
43
-
44
- it "should support >, <, >=, and <= via Symbol#>,<,>=,<=" do
45
- @d.l(:x > 100).should == '(x > 100)'
46
- @d.l(:x < 100.01).should == '(x < 100.01)'
47
- @d.l(:x >= 100000000000000000000000000000000000).should == '(x >= 100000000000000000000000000000000000)'
48
- @d.l(:x <= 100).should == '(x <= 100)'
49
- end
50
-
51
- it "should support negation of >, <, >=, and <= via Symbol#~" do
52
- @d.l(~(:x > 100)).should == '(x <= 100)'
53
- @d.l(~(:x < 100.01)).should == '(x >= 100.01)'
54
- @d.l(~(:x >= 100000000000000000000000000000000000)).should == '(x < 100000000000000000000000000000000000)'
55
- @d.l(~(:x <= 100)).should == '(x > 100)'
56
- end
57
-
58
- it "should support = via Hash" do
59
- @d.l(:x => 100).should == '(x = 100)'
60
- @d.l(:x => 'a').should == '(x = \'a\')'
61
- @d.l(:x => true).should == '(x = \'t\')'
62
- @d.l(:x => false).should == '(x = \'f\')'
63
- @d.l(:x => nil).should == '(x IS NULL)'
64
- @d.l(:x => [1,2,3]).should == '(x IN (1, 2, 3))'
65
- end
66
-
67
- it "should support != via Hash#~" do
68
- @d.l(~{:x => 100}).should == '(x != 100)'
69
- @d.l(~{:x => 'a'}).should == '(x != \'a\')'
70
- @d.l(~{:x => true}).should == '(x != \'t\')'
71
- @d.l(~{:x => false}).should == '(x != \'f\')'
72
- @d.l(~{:x => nil}).should == '(x IS NOT NULL)'
73
- end
74
-
75
- it "should support ~ via Hash and Regexp (if supported by database)" do
76
- @d.l(:x => /blah/).should == '(x ~ \'blah\')'
77
- end
78
-
79
- it "should support !~ via Hash#~ and Regexp" do
80
- @d.l(~{:x => /blah/}).should == '(x !~ \'blah\')'
81
- end
82
-
83
- it "should support LIKE via Symbol#like" do
84
- @d.l(:x.like('a')).should == '(x LIKE \'a\')'
85
- @d.l(:x.like(/a/)).should == '(x ~ \'a\')'
86
- @d.l(:x.like('a', 'b')).should == '((x LIKE \'a\') OR (x LIKE \'b\'))'
87
- @d.l(:x.like(/a/, /b/i)).should == '((x ~ \'a\') OR (x ~* \'b\'))'
88
- @d.l(:x.like('a', /b/)).should == '((x LIKE \'a\') OR (x ~ \'b\'))'
89
- end
90
-
91
- it "should support NOT LIKE via Symbol#like and Symbol#~" do
92
- @d.l(~:x.like('a')).should == '(x NOT LIKE \'a\')'
93
- @d.l(~:x.like(/a/)).should == '(x !~ \'a\')'
94
- @d.l(~:x.like('a', 'b')).should == '((x NOT LIKE \'a\') AND (x NOT LIKE \'b\'))'
95
- @d.l(~:x.like(/a/, /b/i)).should == '((x !~ \'a\') AND (x !~* \'b\'))'
96
- @d.l(~:x.like('a', /b/)).should == '((x NOT LIKE \'a\') AND (x !~ \'b\'))'
97
- end
98
-
99
- it "should support ILIKE via Symbol#ilike" do
100
- @d.l(:x.ilike('a')).should == '(x ILIKE \'a\')'
101
- @d.l(:x.ilike(/a/)).should == '(x ~* \'a\')'
102
- @d.l(:x.ilike('a', 'b')).should == '((x ILIKE \'a\') OR (x ILIKE \'b\'))'
103
- @d.l(:x.ilike(/a/, /b/i)).should == '((x ~* \'a\') OR (x ~* \'b\'))'
104
- @d.l(:x.ilike('a', /b/)).should == '((x ILIKE \'a\') OR (x ~* \'b\'))'
105
- end
106
-
107
- it "should support NOT ILIKE via Symbol#ilike and Symbol#~" do
108
- @d.l(~:x.ilike('a')).should == '(x NOT ILIKE \'a\')'
109
- @d.l(~:x.ilike(/a/)).should == '(x !~* \'a\')'
110
- @d.l(~:x.ilike('a', 'b')).should == '((x NOT ILIKE \'a\') AND (x NOT ILIKE \'b\'))'
111
- @d.l(~:x.ilike(/a/, /b/i)).should == '((x !~* \'a\') AND (x !~* \'b\'))'
112
- @d.l(~:x.ilike('a', /b/)).should == '((x NOT ILIKE \'a\') AND (x !~* \'b\'))'
113
- end
114
-
115
- it "should support negating ranges via Hash#~ and Range" do
116
- @d.l(~{:x => 1..5}).should == '((x < 1) OR (x > 5))'
117
- @d.l(~{:x => 1...5}).should == '((x < 1) OR (x >= 5))'
118
- end
119
-
120
- it "should support negating NOT IN via Hash#~ and Dataset or Array" do
121
- @d.l(~{:x => @d.select(:i)}).should == '(x NOT IN (SELECT i FROM items))'
122
- @d.l(~{:x => [1,2,3]}).should == '(x NOT IN (1, 2, 3))'
123
- end
124
-
125
- it "should support + - * / via Symbol#+,-,*,/" do
126
- @d.l(:x + 1 > 100).should == '((x + 1) > 100)'
127
- @d.l((:x * :y) < 100.01).should == '((x * y) < 100.01)'
128
- @d.l((:x - :y/2) >= 100000000000000000000000000000000000).should == '((x - (y / 2)) >= 100000000000000000000000000000000000)'
129
- @d.l((((:x - :y)/(:x + :y))*:z) <= 100).should == '((((x - y) / (x + y)) * z) <= 100)'
130
- @d.l(~((((:x - :y)/(:x + :y))*:z) <= 100)).should == '((((x - y) / (x + y)) * z) > 100)'
131
- end
132
-
133
- it "should not allow negation of string expressions" do
134
- proc{~:x.sql_string}.should raise_error
135
- proc{~([:x, :y].sql_string_join)}.should raise_error
136
- end
137
-
138
- it "should not allow mathematical, inequality, or string operations on true, false, or nil" do
139
- proc{:x + 1}.should_not raise_error
140
- proc{:x - true}.should raise_error(Sequel::Error)
141
- proc{:x / false}.should raise_error(Sequel::Error)
142
- proc{:x * nil}.should raise_error(Sequel::Error)
143
- proc{:x > 1}.should_not raise_error
144
- proc{:x < true}.should raise_error(Sequel::Error)
145
- proc{:x >= false}.should raise_error(Sequel::Error)
146
- proc{:x <= nil}.should raise_error(Sequel::Error)
147
- proc{[:x, nil].sql_string_join}.should raise_error(Sequel::Error)
148
- end
149
-
150
- it "should not allow mathematical, inequality, or string operations on boolean complex expressions" do
151
- proc{:x + (:y + 1)}.should_not raise_error
152
- proc{:x - (~:y)}.should raise_error(Sequel::Error)
153
- proc{:x / (:y & :z)}.should raise_error(Sequel::Error)
154
- proc{:x * (:y | :z)}.should raise_error(Sequel::Error)
155
- proc{:x > (:y > 5)}.should raise_error(Sequel::Error)
156
- proc{:x < (:y < 5)}.should raise_error(Sequel::Error)
157
- proc{:x >= (:y >= 5)}.should raise_error(Sequel::Error)
158
- proc{:x <= (:y <= 5)}.should raise_error(Sequel::Error)
159
- proc{:x > {:y => nil}}.should raise_error(Sequel::Error)
160
- proc{:x < ~{:y => nil}}.should raise_error(Sequel::Error)
161
- proc{:x >= {:y => 5}}.should raise_error(Sequel::Error)
162
- proc{:x <= ~{:y => 5}}.should raise_error(Sequel::Error)
163
- proc{:x >= {:y => [1,2,3]}}.should raise_error(Sequel::Error)
164
- proc{:x <= ~{:y => [1,2,3]}}.should raise_error(Sequel::Error)
165
- proc{:x + :y.like('a')}.should raise_error(Sequel::Error)
166
- proc{:x - :y.like(/a/)}.should raise_error(Sequel::Error)
167
- proc{:x * :y.like(/a/i)}.should raise_error(Sequel::Error)
168
- proc{:x + ~:y.like('a')}.should raise_error(Sequel::Error)
169
- proc{:x - ~:y.like(/a/)}.should raise_error(Sequel::Error)
170
- proc{:x * ~:y.like(/a/i)}.should raise_error(Sequel::Error)
171
- proc{[:x, ~:y.like(/a/i)].sql_string_join}.should raise_error(Sequel::Error)
172
- end
173
-
174
- it "should support AND conditions via &" do
175
- @d.l(:x & :y).should == '(x AND y)'
176
- @d.l(:x & :y & :z).should == '((x AND y) AND z)'
177
- @d.l(:x & {:y => :z}).should == '(x AND (y = z))'
178
- @d.l({:y => :z} & :x).should == '((y = z) AND x)'
179
- @d.l({:x => :a} & {:y => :z}).should == '((x = a) AND (y = z))'
180
- @d.l((:x > 200) & (:y < 200)).should == '((x > 200) AND (y < 200))'
181
- @d.l(:x & ~:y).should == '(x AND NOT y)'
182
- @d.l(~:x & :y).should == '(NOT x AND y)'
183
- @d.l(~:x & ~:y).should == '(NOT x AND NOT y)'
184
- end
185
-
186
- it "should support OR conditions via |" do
187
- @d.l(:x | :y).should == '(x OR y)'
188
- @d.l(:x | :y | :z).should == '((x OR y) OR z)'
189
- @d.l(:x | {:y => :z}).should == '(x OR (y = z))'
190
- @d.l({:y => :z} | :x).should == '((y = z) OR x)'
191
- @d.l({:x => :a} | {:y => :z}).should == '((x = a) OR (y = z))'
192
- @d.l((:x > 200) | (:y < 200)).should == '((x > 200) OR (y < 200))'
193
- end
194
-
195
- it "should support & | combinations" do
196
- @d.l((:x | :y) & :z).should == '((x OR y) AND z)'
197
- @d.l(:x | (:y & :z)).should == '(x OR (y AND z))'
198
- @d.l((:x & :w) | (:y & :z)).should == '((x AND w) OR (y AND z))'
199
- end
200
-
201
- it "should support & | with ~" do
202
- @d.l(~((:x | :y) & :z)).should == '((NOT x AND NOT y) OR NOT z)'
203
- @d.l(~(:x | (:y & :z))).should == '(NOT x AND (NOT y OR NOT z))'
204
- @d.l(~((:x & :w) | (:y & :z))).should == '((NOT x OR NOT w) AND (NOT y OR NOT z))'
205
- @d.l(~((:x > 200) | (:y & :z))).should == '((x <= 200) AND (NOT y OR NOT z))'
206
- end
207
-
208
- it "should support LiteralString" do
209
- @d.l('x'.lit).should == '(x)'
210
- @d.l(~'x'.lit).should == 'NOT x'
211
- @d.l(~~'x'.lit).should == 'x'
212
- @d.l(~(('x'.lit | :y) & :z)).should == '((NOT x AND NOT y) OR NOT z)'
213
- @d.l(~(:x | 'y'.lit)).should == '(NOT x AND NOT y)'
214
- @d.l(~('x'.lit & 'y'.lit)).should == '(NOT x OR NOT y)'
215
- @d.l({'y'.lit => 'z'.lit} & 'x'.lit).should == '((y = z) AND x)'
216
- @d.l(('x'.lit > 200) & ('y'.lit < 200)).should == '((x > 200) AND (y < 200))'
217
- @d.l(~('x'.lit + 1 > 100)).should == '((x + 1) <= 100)'
218
- @d.l('x'.lit.like(/a/)).should == '(x ~ \'a\')'
219
- @d.l('x'.lit + 1 > 100).should == '((x + 1) > 100)'
220
- @d.l(('x'.lit * :y) < 100.01).should == '((x * y) < 100.01)'
221
- @d.l(('x'.lit - :y/2) >= 100000000000000000000000000000000000).should == '((x - (y / 2)) >= 100000000000000000000000000000000000)'
222
- @d.l(('z'.lit * (('x'.lit / :y)/(:x + :y))) <= 100).should == '((z * ((x / y) / (x + y))) <= 100)'
223
- @d.l(~(((('x'.lit - :y)/(:x + :y))*:z) <= 100)).should == '((((x - y) / (x + y)) * z) > 100)'
224
- end
225
-
226
- it "should support hashes by ANDing the conditions" do
227
- @d.l(:x => 100, :y => 'a')[1...-1].split(' AND ').sort.should == ['(x = 100)', '(y = \'a\')']
228
- @d.l(:x => true, :y => false)[1...-1].split(' AND ').sort.should == ['(x = \'t\')', '(y = \'f\')']
229
- @d.l(:x => nil, :y => [1,2,3])[1...-1].split(' AND ').sort.should == ['(x IS NULL)', '(y IN (1, 2, 3))']
230
- end
231
-
232
- it "should support sql_negate on hashes" do
233
- @d.l({:x => 100, :y => 'a'}.sql_negate)[1...-1].split(' AND ').sort.should == ['(x != 100)', '(y != \'a\')']
234
- @d.l({:x => true, :y => false}.sql_negate)[1...-1].split(' AND ').sort.should == ['(x != \'t\')', '(y != \'f\')']
235
- @d.l({:x => nil, :y => [1,2,3]}.sql_negate)[1...-1].split(' AND ').sort.should == ['(x IS NOT NULL)', '(y NOT IN (1, 2, 3))']
236
- end
237
-
238
- it "should support ~ on hashes" do
239
- @d.l(~{:x => 100, :y => 'a'})[1...-1].split(' OR ').sort.should == ['(x != 100)', '(y != \'a\')']
240
- @d.l(~{:x => true, :y => false})[1...-1].split(' OR ').sort.should == ['(x != \'t\')', '(y != \'f\')']
241
- @d.l(~{:x => nil, :y => [1,2,3]})[1...-1].split(' OR ').sort.should == ['(x IS NOT NULL)', '(y NOT IN (1, 2, 3))']
242
- end
243
-
244
- it "should support sql_or on hashes" do
245
- @d.l({:x => 100, :y => 'a'}.sql_or)[1...-1].split(' OR ').sort.should == ['(x = 100)', '(y = \'a\')']
246
- @d.l({:x => true, :y => false}.sql_or)[1...-1].split(' OR ').sort.should == ['(x = \'t\')', '(y = \'f\')']
247
- @d.l({:x => nil, :y => [1,2,3]}.sql_or)[1...-1].split(' OR ').sort.should == ['(x IS NULL)', '(y IN (1, 2, 3))']
248
- end
249
-
250
- it "should support arrays with all two pairs the same as hashes" do
251
- @d.l([[:x, 100],[:y, 'a']]).should == '((x = 100) AND (y = \'a\'))'
252
- @d.l([[:x, true], [:y, false]]).should == '((x = \'t\') AND (y = \'f\'))'
253
- @d.l([[:x, nil], [:y, [1,2,3]]]).should == '((x IS NULL) AND (y IN (1, 2, 3)))'
254
- end
255
-
256
- it "should support sql_negate on arrays with all two pairs" do
257
- @d.l([[:x, 100],[:y, 'a']].sql_negate).should == '((x != 100) AND (y != \'a\'))'
258
- @d.l([[:x, true], [:y, false]].sql_negate).should == '((x != \'t\') AND (y != \'f\'))'
259
- @d.l([[:x, nil], [:y, [1,2,3]]].sql_negate).should == '((x IS NOT NULL) AND (y NOT IN (1, 2, 3)))'
260
- end
261
-
262
- it "should support ~ on arrays with all two pairs" do
263
- @d.l(~[[:x, 100],[:y, 'a']]).should == '((x != 100) OR (y != \'a\'))'
264
- @d.l(~[[:x, true], [:y, false]]).should == '((x != \'t\') OR (y != \'f\'))'
265
- @d.l(~[[:x, nil], [:y, [1,2,3]]]).should == '((x IS NOT NULL) OR (y NOT IN (1, 2, 3)))'
266
- end
267
-
268
- it "should support sql_or on arrays with all two pairs" do
269
- @d.l([[:x, 100],[:y, 'a']].sql_or).should == '((x = 100) OR (y = \'a\'))'
270
- @d.l([[:x, true], [:y, false]].sql_or).should == '((x = \'t\') OR (y = \'f\'))'
271
- @d.l([[:x, nil], [:y, [1,2,3]]].sql_or).should == '((x IS NULL) OR (y IN (1, 2, 3)))'
272
- end
273
-
274
- it "should support Array#sql_string_join for concatenation of SQL strings" do
275
- @d.lit([:x].sql_string_join).should == '(x)'
276
- @d.lit([:x].sql_string_join(', ')).should == '(x)'
277
- @d.lit([:x, :y].sql_string_join).should == '(x || y)'
278
- @d.lit([:x, :y].sql_string_join(', ')).should == "(x || ', ' || y)"
279
- @d.lit([:x[1], :y|1].sql_string_join).should == '(x(1) || y[1])'
280
- @d.lit([:x[1], 'y.z'.lit].sql_string_join(', ')).should == "(x(1) || ', ' || y.z)"
281
- @d.lit([:x, 1, :y].sql_string_join).should == "(x || '1' || y)"
282
- @d.lit([:x, 1, :y].sql_string_join(', ')).should == "(x || ', ' || '1' || ', ' || y)"
283
- @d.lit([:x, 1, :y].sql_string_join(:y__z)).should == "(x || y.z || '1' || y.z || y)"
284
- @d.lit([:x, 1, :y].sql_string_join(1)).should == "(x || '1' || '1' || '1' || y)"
285
- @d.lit([:x, :y].sql_string_join('y.x || x.y'.lit)).should == "(x || y.x || x.y || y)"
286
- @d.lit([[:x, :y].sql_string_join, [:a, :b].sql_string_join].sql_string_join).should == "((x || y) || (a || b))"
287
- end
288
-
289
- it "should support StringExpression#+ for concatenation of SQL strings" do
290
- @d.lit(:x.sql_string + :y).should == '(x || y)'
291
- @d.lit([:x].sql_string_join + :y).should == '((x) || y)'
292
- @d.lit([:x, :z].sql_string_join(' ') + :y).should == "((x || ' ' || z) || y)"
293
- end
294
-
295
- it "should be supported inside blocks" do
296
- @d.l{[[:x, nil], [:y, [1,2,3]]].sql_or}.should == '((x IS NULL) OR (y IN (1, 2, 3)))'
297
- @d.l{~[[:x, nil], [:y, [1,2,3]]]}.should == '((x IS NOT NULL) OR (y NOT IN (1, 2, 3)))'
298
- @d.l{~(((('x'.lit - :y)/(:x + :y))*:z) <= 100)}.should == '((((x - y) / (x + y)) * z) > 100)'
299
- @d.l{{:x => :a} & {:y => :z}}.should == '((x = a) AND (y = z))'
300
- end
301
-
302
- it "should support &, |, ^, ~, <<, and >> for NumericExpressions" do
303
- @d.l(:x.sql_number & 1 > 100).should == '((x & 1) > 100)'
304
- @d.l(:x.sql_number | 1 > 100).should == '((x | 1) > 100)'
305
- @d.l(:x.sql_number ^ 1 > 100).should == '((x ^ 1) > 100)'
306
- @d.l(~:x.sql_number > 100).should == '(~x > 100)'
307
- @d.l(:x.sql_number << 1 > 100).should == '((x << 1) > 100)'
308
- @d.l(:x.sql_number >> 1 > 100).should == '((x >> 1) > 100)'
309
- @d.l((:x + 1) & 1 > 100).should == '(((x + 1) & 1) > 100)'
310
- @d.l((:x + 1) | 1 > 100).should == '(((x + 1) | 1) > 100)'
311
- @d.l((:x + 1) ^ 1 > 100).should == '(((x + 1) ^ 1) > 100)'
312
- @d.l(~(:x + 1) > 100).should == '(~(x + 1) > 100)'
313
- @d.l((:x + 1) << 1 > 100).should == '(((x + 1) << 1) > 100)'
314
- @d.l((:x + 1) >> 1 > 100).should == '(((x + 1) >> 1) > 100)'
315
- end
316
- end
@@ -1,261 +0,0 @@
1
- require File.join(File.dirname(__FILE__), 'spec_helper')
2
-
3
- context "Migration classes" do
4
- setup do
5
- Sequel::Migration.descendants.clear
6
- end
7
-
8
- specify "should be registred in Migration.descendants" do
9
- @class = Class.new(Sequel::Migration)
10
-
11
- Sequel::Migration.descendants.should == [@class]
12
- end
13
-
14
- specify "should be registered in the right order" do
15
- @c1 = Class.new(Sequel::Migration)
16
- @c2 = Class.new(Sequel::Migration)
17
- @c3 = Class.new(Sequel::Migration)
18
-
19
- Sequel::Migration.descendants.should == [@c1, @c2, @c3]
20
- end
21
- end
22
-
23
- context "Migration#apply" do
24
- setup do
25
- @c = Class.new do
26
- define_method(:one) {|x| [1111, x]}
27
- define_method(:two) {|x| [2222, x]}
28
- end
29
- @db = @c.new
30
-
31
- @migration = Class.new(Sequel::Migration) do
32
- define_method(:up) {one(3333)}
33
- define_method(:down) {two(4444)}
34
- end
35
- end
36
-
37
- specify "should raise for an invalid direction" do
38
- proc {@migration.apply(@db, :hahaha)}.should raise_error(ArgumentError)
39
- end
40
-
41
- specify "should apply the up direction correctly" do
42
- @migration.apply(@db, :up).should == [1111, 3333]
43
- end
44
-
45
- specify "should apply the down direction correctly" do
46
- @migration.apply(@db, :down).should == [2222, 4444]
47
- end
48
- end
49
-
50
- class DummyMigrationDataset
51
- attr_reader :from
52
-
53
- def initialize(x); @from = x; end
54
-
55
- @@version = nil
56
-
57
- def version; @@version; end
58
- def version=(x); @@version = x; end
59
- def first; @@version ? {:version => @@version} : nil; end
60
- def update(h); @@version = h[:version]; end
61
- def <<(h); @@version = h[:version]; end
62
- end
63
-
64
- class DummyMigrationDB
65
- attr_reader :creates, :drops, :table_created
66
-
67
- def initialize
68
- @creates = []
69
- @drops = []
70
- end
71
-
72
- def create(x); @creates << x; end
73
- def drop(x); @drops << x; end
74
-
75
- def [](x); DummyMigrationDataset.new(x); end
76
-
77
- def create_table(x); raise if @table_created == x; @table_created = x; end
78
- def table_exists?(x); @table_created == x; end
79
-
80
- def transaction; yield; end
81
- end
82
-
83
- MIGRATION_001 = %[
84
- class CreateSessions < Sequel::Migration
85
- def up
86
- create(1111)
87
- end
88
-
89
- def down
90
- drop(1111)
91
- end
92
- end
93
- ]
94
-
95
- MIGRATION_002 = %[
96
- class CreateNodes < Sequel::Migration
97
- def up
98
- create(2222)
99
- end
100
-
101
- def down
102
- drop(2222)
103
- end
104
- end
105
- ]
106
-
107
- MIGRATION_003 = %[
108
- class CreateUsers < Sequel::Migration
109
- def up
110
- create(3333)
111
- end
112
-
113
- def down
114
- drop(3333)
115
- end
116
- end
117
- ]
118
-
119
- MIGRATION_005 = %[
120
- class CreateAttributes < Sequel::Migration
121
- def up
122
- create(5555)
123
- end
124
-
125
- def down
126
- drop(5555)
127
- end
128
- end
129
- ]
130
-
131
- context "Sequel::Migrator" do
132
- setup do
133
- @db = DummyMigrationDB.new
134
-
135
- File.open('001_create_sessions.rb', 'w') {|f| f << MIGRATION_001}
136
- File.open('002_create_nodes.rb', 'w') {|f| f << MIGRATION_002}
137
- File.open('003_create_users.rb', 'w') {|f| f << MIGRATION_003}
138
- File.open('005_create_attributes.rb', 'w') {|f| f << MIGRATION_005}
139
-
140
- @db[:schema_info].version = nil
141
- end
142
-
143
- teardown do
144
- Object.send(:remove_const, "CreateSessions") if Object.const_defined?("CreateSessions")
145
- Object.send(:remove_const, "CreateNodes") if Object.const_defined?("CreateNodes")
146
- Object.send(:remove_const, "CreateUsers") if Object.const_defined?("CreateUsers")
147
- Object.send(:remove_const, "CreateAttributes") if Object.const_defined?("CreateAttributes")
148
-
149
- FileUtils.rm('001_create_sessions.rb')
150
- FileUtils.rm('002_create_nodes.rb')
151
- FileUtils.rm('003_create_users.rb')
152
- FileUtils.rm('005_create_attributes.rb')
153
- end
154
-
155
- specify "should return the list of files for a specified version range" do
156
- Sequel::Migrator.migration_files('.', 1..1).should == \
157
- ['./001_create_sessions.rb']
158
-
159
- Sequel::Migrator.migration_files('.', 1..3).should == \
160
- ['./001_create_sessions.rb', './002_create_nodes.rb', './003_create_users.rb']
161
-
162
- Sequel::Migrator.migration_files('.', 3..5).should == \
163
- ['./003_create_users.rb', './005_create_attributes.rb']
164
-
165
- Sequel::Migrator.migration_files('.', 7..8).should == []
166
- end
167
-
168
- specify "should return the latest version available" do
169
- Sequel::Migrator.latest_migration_version('.').should == 5
170
- end
171
-
172
- specify "should load the migration classes for the specified range" do
173
- Sequel::Migrator.migration_classes('.', 3, 0, :up).should == \
174
- [CreateSessions, CreateNodes, CreateUsers]
175
- end
176
-
177
- specify "should load the migration classes for the specified range" do
178
- Sequel::Migrator.migration_classes('.', 0, 5, :down).should == \
179
- [CreateAttributes, CreateUsers, CreateNodes, CreateSessions]
180
- end
181
-
182
- specify "should start from current + 1 for the up direction" do
183
- Sequel::Migrator.migration_classes('.', 3, 1, :up).should == \
184
- [CreateNodes, CreateUsers]
185
- end
186
-
187
- specify "should end on current + 1 for the down direction" do
188
- Sequel::Migrator.migration_classes('.', 2, 5, :down).should == \
189
- [CreateAttributes, CreateUsers]
190
- end
191
-
192
- specify "should automatically create the schema_info table" do
193
- @db.table_exists?(:schema_info).should be_false
194
- Sequel::Migrator.schema_info_dataset(@db)
195
- @db.table_exists?(:schema_info).should be_true
196
-
197
- # should not raise if table already exists
198
- proc {Sequel::Migrator.schema_info_dataset(@db)}.should_not raise_error
199
- end
200
-
201
- specify "should return a dataset for the schema_info table" do
202
- d = Sequel::Migrator.schema_info_dataset(@db)
203
- d.from.should == :schema_info
204
- end
205
-
206
- specify "should get the migration version stored in the database" do
207
- # default is 0
208
- Sequel::Migrator.get_current_migration_version(@db).should == 0
209
-
210
- Sequel::Migrator.schema_info_dataset(@db) << {:version => 4321}
211
-
212
- Sequel::Migrator.get_current_migration_version(@db).should == 4321
213
- end
214
-
215
- specify "should set the migration version stored in the database" do
216
- Sequel::Migrator.get_current_migration_version(@db).should == 0
217
- Sequel::Migrator.set_current_migration_version(@db, 6666)
218
- Sequel::Migrator.get_current_migration_version(@db).should == 6666
219
- end
220
-
221
- specify "should apply migrations correctly in the up direction" do
222
- Sequel::Migrator.apply(@db, '.', 3, 2)
223
- @db.creates.should == [3333]
224
-
225
- Sequel::Migrator.get_current_migration_version(@db).should == 3
226
-
227
- Sequel::Migrator.apply(@db, '.', 5)
228
- @db.creates.should == [3333, 5555]
229
-
230
- Sequel::Migrator.get_current_migration_version(@db).should == 5
231
- end
232
-
233
- specify "should apply migrations correctly in the down direction" do
234
- Sequel::Migrator.apply(@db, '.', 1, 5)
235
- @db.drops.should == [5555, 3333, 2222]
236
-
237
- Sequel::Migrator.get_current_migration_version(@db).should == 1
238
- end
239
-
240
- specify "should apply migrations up to the latest version if no target is given" do
241
- Sequel::Migrator.apply(@db, '.')
242
- @db.creates.should == [1111, 2222, 3333, 5555]
243
-
244
- Sequel::Migrator.get_current_migration_version(@db).should == 5
245
- end
246
-
247
- specify "should apply migrations down to 0 version correctly" do
248
- Sequel::Migrator.apply(@db, '.', 0, 5)
249
- @db.drops.should == [5555, 3333, 2222, 1111]
250
-
251
- Sequel::Migrator.get_current_migration_version(@db).should == 0
252
- end
253
-
254
- specify "should return the target version" do
255
- Sequel::Migrator.apply(@db, '.', 3, 2).should == 3
256
-
257
- Sequel::Migrator.apply(@db, '.', 0).should == 0
258
-
259
- Sequel::Migrator.apply(@db, '.').should == 5
260
- end
261
- end