sequel_core 2.2.0 → 3.8.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 (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