sequel_core 1.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 (57) hide show
  1. data/CHANGELOG +1003 -0
  2. data/COPYING +18 -0
  3. data/README +81 -0
  4. data/Rakefile +176 -0
  5. data/bin/sequel +41 -0
  6. data/lib/sequel_core.rb +59 -0
  7. data/lib/sequel_core/adapters/adapter_skeleton.rb +68 -0
  8. data/lib/sequel_core/adapters/ado.rb +100 -0
  9. data/lib/sequel_core/adapters/db2.rb +158 -0
  10. data/lib/sequel_core/adapters/dbi.rb +126 -0
  11. data/lib/sequel_core/adapters/informix.rb +87 -0
  12. data/lib/sequel_core/adapters/jdbc.rb +108 -0
  13. data/lib/sequel_core/adapters/mysql.rb +269 -0
  14. data/lib/sequel_core/adapters/odbc.rb +145 -0
  15. data/lib/sequel_core/adapters/odbc_mssql.rb +93 -0
  16. data/lib/sequel_core/adapters/openbase.rb +90 -0
  17. data/lib/sequel_core/adapters/oracle.rb +99 -0
  18. data/lib/sequel_core/adapters/postgres.rb +519 -0
  19. data/lib/sequel_core/adapters/sqlite.rb +192 -0
  20. data/lib/sequel_core/array_keys.rb +296 -0
  21. data/lib/sequel_core/connection_pool.rb +152 -0
  22. data/lib/sequel_core/core_ext.rb +59 -0
  23. data/lib/sequel_core/core_sql.rb +191 -0
  24. data/lib/sequel_core/database.rb +433 -0
  25. data/lib/sequel_core/dataset.rb +409 -0
  26. data/lib/sequel_core/dataset/convenience.rb +321 -0
  27. data/lib/sequel_core/dataset/sequelizer.rb +354 -0
  28. data/lib/sequel_core/dataset/sql.rb +586 -0
  29. data/lib/sequel_core/exceptions.rb +45 -0
  30. data/lib/sequel_core/migration.rb +191 -0
  31. data/lib/sequel_core/model.rb +8 -0
  32. data/lib/sequel_core/pretty_table.rb +73 -0
  33. data/lib/sequel_core/schema.rb +8 -0
  34. data/lib/sequel_core/schema/schema_generator.rb +131 -0
  35. data/lib/sequel_core/schema/schema_sql.rb +131 -0
  36. data/lib/sequel_core/worker.rb +58 -0
  37. data/spec/adapters/informix_spec.rb +139 -0
  38. data/spec/adapters/mysql_spec.rb +330 -0
  39. data/spec/adapters/oracle_spec.rb +130 -0
  40. data/spec/adapters/postgres_spec.rb +189 -0
  41. data/spec/adapters/sqlite_spec.rb +345 -0
  42. data/spec/array_keys_spec.rb +679 -0
  43. data/spec/connection_pool_spec.rb +356 -0
  44. data/spec/core_ext_spec.rb +67 -0
  45. data/spec/core_sql_spec.rb +301 -0
  46. data/spec/database_spec.rb +812 -0
  47. data/spec/dataset_spec.rb +2381 -0
  48. data/spec/migration_spec.rb +261 -0
  49. data/spec/pretty_table_spec.rb +66 -0
  50. data/spec/rcov.opts +4 -0
  51. data/spec/schema_generator_spec.rb +86 -0
  52. data/spec/schema_spec.rb +230 -0
  53. data/spec/sequelizer_spec.rb +448 -0
  54. data/spec/spec.opts +5 -0
  55. data/spec/spec_helper.rb +44 -0
  56. data/spec/worker_spec.rb +96 -0
  57. metadata +162 -0
@@ -0,0 +1,679 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ context "An array with symbol keys" do
4
+ setup do
5
+ @a = [1, 2, 3]
6
+ @a.keys = [:a, :b, :c]
7
+ end
8
+
9
+ specify "should provide subscript access" do
10
+ @a[0].should == 1
11
+ @a[0..1].should == [1, 2]
12
+
13
+ @a[1] = 4
14
+ @a.should == [1, 4, 3]
15
+ end
16
+
17
+ specify "should provide key access using symbols" do
18
+ @a[:a].should == 1
19
+ @a[:b].should == 2
20
+ @a[:B].should == nil
21
+
22
+ @a[:a] = 11
23
+ @a.should == [11, 2, 3]
24
+ @a[:a].should == 11
25
+
26
+ @a[:d] = 4
27
+ @a.should == [11, 2, 3, 4]
28
+ @a.keys.should == [:a, :b, :c, :d]
29
+ end
30
+
31
+ specify "should provide key access using strings" do
32
+ @a['a'].should == 1
33
+ @a['A'].should be_nil
34
+
35
+ @a['d'] = 4
36
+ @a.should == [1, 2, 3, 4]
37
+ @a.keys.should == [:a, :b, :c, :d]
38
+ end
39
+
40
+ specify "should provide #store functionality" do
41
+ @a.store(:a, 11)
42
+ @a.should == [11, 2, 3]
43
+
44
+ @a.store(:d, 4)
45
+ @a.should == [11, 2, 3, 4]
46
+
47
+ @a.store('d', 44)
48
+ @a.should == [11, 2, 3, 44]
49
+ end
50
+
51
+ specify "should provide #to_hash/#to_h functionality" do
52
+ @a.to_hash.should == {:a => 1, :b => 2, :c => 3}
53
+ @a.to_h.should == {:a => 1, :b => 2, :c => 3}
54
+ end
55
+
56
+ specify "should provide #columns as alias to #keys" do
57
+ @a.columns.should == [:a, :b, :c]
58
+ @a.columns = [:x, :y, :z]
59
+
60
+ @a[:x].should == 1
61
+ end
62
+
63
+ specify "should provide #slice functionality with keys" do
64
+ s = @a.slice(0, 2)
65
+ s.should == [1, 2]
66
+ s.keys.should == [:a, :b]
67
+
68
+ s = @a.slice(1..2)
69
+ s.should == [2, 3]
70
+ s.keys.should == [:b, :c]
71
+ end
72
+
73
+ specify "should provide #each_pair iterator" do
74
+ pairs = []
75
+ @a.each_pair {|k, v| pairs << [k, v]}
76
+ pairs.should == [[:a, 1], [:b, 2], [:c, 3]]
77
+ end
78
+
79
+ specify "should provide stock #delete functionality for arrays without keys" do
80
+ a = [1, 2, 3]
81
+ a.delete(2)
82
+ a.should == [1, 3]
83
+ end
84
+
85
+ specify "should provide key-based #delete functionality" do
86
+ @a.delete(:b)
87
+ @a.should == [1, 3]
88
+ @a.keys.should == [:a, :c]
89
+ @a[:a].should == 1
90
+ @a[:c].should == 3
91
+ end
92
+
93
+ specify "should separate array keys after #delete/#delete_at" do
94
+ b = @a.dup
95
+
96
+ b.delete(:b)
97
+
98
+ @a.keys.should == [:a, :b, :c]
99
+ b.keys.should == [:a, :c]
100
+ @a.should == [1, 2, 3]
101
+ b.should == [1, 3]
102
+ @a[:b].should == 2
103
+ b[:b].should == nil
104
+ end
105
+
106
+ specify "should provide #each_key functionality" do
107
+ keys = []
108
+ @a.each_key {|k| keys << k}
109
+ keys.should == [:a, :b, :c]
110
+ end
111
+
112
+ specify "should provide #each_value functionality" do
113
+ values = []
114
+ @a.each_value {|v| values << v}
115
+ values.should == [1, 2, 3]
116
+ end
117
+
118
+ specify "should provide stock #include? functionality for arrays without keys" do
119
+ [1, 2, 3].include?(2).should be_true
120
+ [1, 2, 3].include?(4).should be_false
121
+ end
122
+
123
+ specify "should provide #has_key?/#member?/#key?/#include? functionality" do
124
+ @a.has_key?(:a).should be_true
125
+ @a.has_key?(:b).should be_true
126
+ @a.has_key?(:c).should be_true
127
+ @a.has_key?(:B).should be_false
128
+ @a.has_key?(:d).should be_false
129
+
130
+ @a.has_key?('a').should be_true
131
+ @a.has_key?('b').should be_true
132
+ @a.has_key?('c').should be_true
133
+ @a.has_key?('A').should be_false
134
+ @a.has_key?('d').should be_false
135
+
136
+ @a.key?(:a).should be_true
137
+ @a.key?(:b).should be_true
138
+ @a.key?(:c).should be_true
139
+ @a.key?(:B).should be_false
140
+ @a.key?(:d).should be_false
141
+
142
+ @a.key?('a').should be_true
143
+ @a.key?('b').should be_true
144
+ @a.key?('c').should be_true
145
+ @a.key?('A').should be_false
146
+ @a.key?('d').should be_false
147
+
148
+ @a.member?(:a).should be_true
149
+ @a.member?(:b).should be_true
150
+ @a.member?(:c).should be_true
151
+ @a.member?(:B).should be_false
152
+ @a.member?(:d).should be_false
153
+
154
+ @a.member?('a').should be_true
155
+ @a.member?('b').should be_true
156
+ @a.member?('c').should be_true
157
+ @a.member?('A').should be_false
158
+ @a.member?('d').should be_false
159
+
160
+ @a.include?(:a).should be_true
161
+ @a.include?(:b).should be_true
162
+ @a.include?(:c).should be_true
163
+ @a.include?(:B).should be_false
164
+ @a.include?(:d).should be_false
165
+
166
+ @a.include?('a').should be_true
167
+ @a.include?('b').should be_true
168
+ @a.include?('c').should be_true
169
+ @a.include?('A').should be_false
170
+ @a.include?('d').should be_false
171
+ end
172
+
173
+ specify "should provide original #include? functionality for arrays without keys" do
174
+ [1, 2, 3].include?(:a).should be_false
175
+ [1, 2, 3].include?(1).should be_true
176
+ end
177
+
178
+ specify "should provide #has_value?/#value? functionality" do
179
+ @a.has_value?(1).should be_true
180
+ @a.has_value?(2).should be_true
181
+ @a.has_value?(3).should be_true
182
+ @a.has_value?(4).should be_false
183
+
184
+ @a.value?(1).should be_true
185
+ @a.value?(2).should be_true
186
+ @a.value?(3).should be_true
187
+ @a.value?(4).should be_false
188
+ end
189
+
190
+ specify "should provide #fetch functionality" do
191
+ @a.fetch(:a).should == 1
192
+ @a.fetch(:b).should == 2
193
+ @a.fetch(:c).should == 3
194
+ proc {@a.fetch(:d)}.should raise_error(IndexError)
195
+ @a.fetch(:d, 4).should == 4
196
+ @a.fetch(:d, nil).should == nil
197
+
198
+ @a.fetch(:a) {|v| v.to_s}.should == '1'
199
+ @a.fetch(:d, 4) {|v| v.to_s}.should == '4'
200
+ end
201
+
202
+ specify "should provide #values functionality" do
203
+ @a.values.should == [1, 2, 3]
204
+ end
205
+
206
+ specify "should provide #dup functionality" do
207
+ b = @a.dup
208
+ b.should == [1, 2, 3]
209
+ b.keys.should == @a.keys
210
+
211
+ b[:a].should == 1
212
+ b[:b].should == 2
213
+ b[:c].should == 3
214
+ b[:d].should be_nil
215
+
216
+ @a.keys << :e
217
+ @a.keys.should == [:a, :b, :c, :e]
218
+ b.keys.should == @a.keys
219
+ end
220
+
221
+ specify "should provide #clone functionality" do
222
+ b = @a.clone
223
+ b.should == [1, 2, 3]
224
+ b.keys.should == @a.keys
225
+
226
+ b[:a].should == 1
227
+ b[:b].should == 2
228
+ b[:c].should == 3
229
+ b[:d].should be_nil
230
+
231
+ @a.keys << :e
232
+ @a.keys.should == [:a, :b, :c, :e]
233
+ b.keys.should_not == @a.keys
234
+ end
235
+
236
+ specify "should provide #merge functionality" do
237
+ @a.merge(@a).to_hash.should == {:a => 1, :b => 2, :c => 3}
238
+
239
+ @a.merge({:b => 22, :d => 4}).to_hash.should == {:a => 1, :b => 22, :c => 3, :d => 4}
240
+
241
+ b = [1, 2, 3]
242
+ b.keys = [:b, :c, :d]
243
+ @a.merge(b).to_hash.should == {:a => 1, :b => 1, :c => 2, :d => 3}
244
+
245
+ # call with a block. The block returns the old value passed to it
246
+ @a.merge(b) {|k, o, n| o}.to_hash.should == {:a => 1, :b => 2, :c => 3, :d => 3}
247
+ end
248
+
249
+ specify "should provide #merge!/#update!/#update functionality" do
250
+ @a.merge!(@a)
251
+ @a.to_hash.should == {:a => 1, :b => 2, :c => 3}
252
+
253
+ @a.update(:b => 22)
254
+ @a.to_hash.should == {:a => 1, :b => 22, :c => 3}
255
+
256
+ b = [1, 2, 3]
257
+ b.keys = [:b, :c, :d]
258
+ @a.update!(b)
259
+ @a.to_hash.should == {:a => 1, :b => 1, :c => 2, :d => 3}
260
+ end
261
+ end
262
+
263
+ context "An array with string keys" do
264
+ setup do
265
+ @a = [1, 2, 3]
266
+ @a.keys = ['a', 'b', 'c']
267
+ end
268
+
269
+ specify "should provide key access using symbols" do
270
+ @a[:a].should == 1
271
+ @a[:b].should == 2
272
+ @a[:B].should == nil
273
+
274
+ @a[:a] = 11
275
+ @a.should == [11, 2, 3]
276
+ @a[:a].should == 11
277
+
278
+ @a[:d] = 4
279
+ @a.should == [11, 2, 3, 4]
280
+ @a.keys.should == ['a', 'b', 'c', :d]
281
+ end
282
+
283
+ specify "should provide key access using strings" do
284
+ @a['a'].should == 1
285
+ @a['A'].should be_nil
286
+
287
+ @a['d'] = 4
288
+ @a.should == [1, 2, 3, 4]
289
+ @a.keys.should == ['a', 'b', 'c', :d]
290
+ end
291
+
292
+ specify "should provide #store functionality" do
293
+ @a.store(:a, 11)
294
+ @a.should == [11, 2, 3]
295
+
296
+ @a.store(:d, 4)
297
+ @a.should == [11, 2, 3, 4]
298
+
299
+ @a.store('d', 44)
300
+ @a.should == [11, 2, 3, 44]
301
+ end
302
+
303
+ specify "should provide #to_hash/#to_h functionality" do
304
+ @a.to_hash.should == {:a => 1, :b => 2, :c => 3}
305
+ @a.to_h.should == {:a => 1, :b => 2, :c => 3}
306
+ end
307
+
308
+ specify "should provide #columns as alias to #keys" do
309
+ @a.columns.should == ['a', 'b', 'c']
310
+ @a.columns = [:x, :y, :z]
311
+
312
+ @a[:x].should == 1
313
+ end
314
+
315
+ specify "should provide #slice functionality with keys" do
316
+ s = @a.slice(0, 2)
317
+ s.should == [1, 2]
318
+ s.keys.should == ['a', 'b']
319
+
320
+ s = @a.slice(1..2)
321
+ s.should == [2, 3]
322
+ s.keys.should == ['b', 'c']
323
+ end
324
+
325
+ specify "should provide #each_pair iterator" do
326
+ pairs = []
327
+ @a.each_pair {|k, v| pairs << [k, v]}
328
+ pairs.should == [['a', 1], ['b', 2], ['c', 3]]
329
+ end
330
+
331
+ specify "should provide key-based #delete functionality" do
332
+ @a.delete(:b)
333
+ @a.should == [1, 3]
334
+ @a.keys.should == ['a', 'c']
335
+ @a[:a].should == 1
336
+ @a[:c].should == 3
337
+ end
338
+
339
+ specify "should provide #each_key functionality" do
340
+ keys = []
341
+ @a.each_key {|k| keys << k}
342
+ keys.should == ['a', 'b', 'c']
343
+ end
344
+
345
+ specify "should provide #each_value functionality" do
346
+ values = []
347
+ @a.each_value {|v| values << v}
348
+ values.should == [1, 2, 3]
349
+ end
350
+
351
+ specify "should provide #has_key?/#member?/#key?/#include? functionality" do
352
+ @a.has_key?(:a).should be_true
353
+ @a.has_key?(:b).should be_true
354
+ @a.has_key?(:c).should be_true
355
+ @a.has_key?(:B).should be_false
356
+ @a.has_key?(:d).should be_false
357
+
358
+ @a.has_key?('a').should be_true
359
+ @a.has_key?('b').should be_true
360
+ @a.has_key?('c').should be_true
361
+ @a.has_key?('A').should be_false
362
+ @a.has_key?('d').should be_false
363
+
364
+ @a.key?(:a).should be_true
365
+ @a.key?(:b).should be_true
366
+ @a.key?(:c).should be_true
367
+ @a.key?(:B).should be_false
368
+ @a.key?(:d).should be_false
369
+
370
+ @a.key?('a').should be_true
371
+ @a.key?('b').should be_true
372
+ @a.key?('c').should be_true
373
+ @a.key?('A').should be_false
374
+ @a.key?('d').should be_false
375
+
376
+ @a.member?(:a).should be_true
377
+ @a.member?(:b).should be_true
378
+ @a.member?(:c).should be_true
379
+ @a.member?(:B).should be_false
380
+ @a.member?(:d).should be_false
381
+
382
+ @a.member?('a').should be_true
383
+ @a.member?('b').should be_true
384
+ @a.member?('c').should be_true
385
+ @a.member?('A').should be_false
386
+ @a.member?('d').should be_false
387
+
388
+ @a.include?(:a).should be_true
389
+ @a.include?(:b).should be_true
390
+ @a.include?(:c).should be_true
391
+ @a.include?(:B).should be_false
392
+ @a.include?(:d).should be_false
393
+
394
+ @a.include?('a').should be_true
395
+ @a.include?('b').should be_true
396
+ @a.include?('c').should be_true
397
+ @a.include?('A').should be_false
398
+ @a.include?('d').should be_false
399
+ end
400
+
401
+ specify "should provide original #include? functionality for arrays without keys" do
402
+ [1, 2, 3].include?(:a).should be_false
403
+ [1, 2, 3].include?(1).should be_true
404
+ end
405
+
406
+ specify "should provide #has_value?/#value? functionality" do
407
+ @a.has_value?(1).should be_true
408
+ @a.has_value?(2).should be_true
409
+ @a.has_value?(3).should be_true
410
+ @a.has_value?(4).should be_false
411
+
412
+ @a.value?(1).should be_true
413
+ @a.value?(2).should be_true
414
+ @a.value?(3).should be_true
415
+ @a.value?(4).should be_false
416
+ end
417
+
418
+ specify "should provide #fetch functionality" do
419
+ @a.fetch(:a).should == 1
420
+ @a.fetch(:b).should == 2
421
+ @a.fetch(:c).should == 3
422
+ proc {@a.fetch(:d)}.should raise_error(IndexError)
423
+ @a.fetch(:d, 4).should == 4
424
+ @a.fetch(:d, nil).should == nil
425
+
426
+ @a.fetch(:a) {|v| v.to_s}.should == '1'
427
+ @a.fetch(:d, 4) {|v| v.to_s}.should == '4'
428
+ end
429
+
430
+ specify "should provide #values functionality" do
431
+ @a.values.should == [1, 2, 3]
432
+ end
433
+
434
+ specify "should provide #dup functionality" do
435
+ b = @a.dup
436
+ b.should == [1, 2, 3]
437
+ b.keys.should == @a.keys
438
+
439
+ b[:a].should == 1
440
+ b[:b].should == 2
441
+ b[:c].should == 3
442
+ b[:d].should be_nil
443
+
444
+ @a.keys << :e
445
+ @a.keys.should == ['a', 'b', 'c', :e]
446
+ b.keys.should == @a.keys
447
+ end
448
+
449
+ specify "should provide #clone functionality" do
450
+ b = @a.clone
451
+ b.should == [1, 2, 3]
452
+ b.keys.should == @a.keys
453
+
454
+ b[:a].should == 1
455
+ b[:b].should == 2
456
+ b[:c].should == 3
457
+ b[:d].should be_nil
458
+
459
+ @a.keys << :e
460
+ @a.keys.should == ['a', 'b', 'c', :e]
461
+ b.keys.should_not == @a.keys
462
+ end
463
+
464
+ specify "should provide #merge functionality" do
465
+ @a.merge(@a).to_hash.should == {:a => 1, :b => 2, :c => 3}
466
+
467
+ @a.merge({:b => 22, :d => 4}).to_hash.should == {:a => 1, :b => 22, :c => 3, :d => 4}
468
+
469
+ b = [1, 2, 3]
470
+ b.keys = [:b, :c, :d]
471
+ @a.merge(b).to_hash.should == {:a => 1, :b => 1, :c => 2, :d => 3}
472
+
473
+ # call with a block. The block returns the old value passed to it
474
+ @a.merge(b) {|k, o, n| o}.to_hash.should == {:a => 1, :b => 2, :c => 3, :d => 3}
475
+ end
476
+
477
+ specify "should provide #merge!/#update!/#update functionality" do
478
+ @a.merge!(@a)
479
+ @a.to_hash.should == {:a => 1, :b => 2, :c => 3}
480
+
481
+ @a.update(:b => 22)
482
+ @a.to_hash.should == {:a => 1, :b => 22, :c => 3}
483
+
484
+ b = [1, 2, 3]
485
+ b.keys = [:b, :c, :d]
486
+ @a.update!(b)
487
+ @a.to_hash.should == {:a => 1, :b => 1, :c => 2, :d => 3}
488
+ end
489
+ end
490
+
491
+ context "Array.from_hash" do
492
+ specify "should construct an array with keys from a hash" do
493
+ h = {:x => 1, :y => 2, :z => 3}
494
+ a = Array.from_hash(h)
495
+ a.to_hash.should == h
496
+ end
497
+ end
498
+
499
+ context "Sequel.use_array_tuples" do
500
+ setup do
501
+ @c = Class.new(Sequel::Dataset) do
502
+ def fetch_rows(sql, &block)
503
+ block[{:a => 1, :b => 2, :c => 3}]
504
+ end
505
+ end
506
+
507
+ @ds = @c.new(nil).from(:items)
508
+ end
509
+
510
+ teardown do
511
+ Sequel.use_hash_tuples
512
+ end
513
+
514
+ specify "should cause the dataset to return array tuples instead of hashes" do
515
+ @ds.first.should == {:a => 1, :b => 2, :c => 3}
516
+ Sequel.use_array_tuples
517
+ a = @ds.first
518
+ a.class.should == Array
519
+ a.values.sort.should == [1, 2, 3]
520
+ a.keys.map {|k| k.to_s}.sort.should == ['a', 'b', 'c']
521
+ a[:a].should == 1
522
+ a[:b].should == 2
523
+ a[:c].should == 3
524
+ a[:d].should == nil
525
+
526
+ @ds.transform(:a => [proc {|v| v.to_s}, proc {|v| v.to_i}])
527
+ a = @ds.first
528
+ a[:a].should == '1'
529
+
530
+ @ds.transform({})
531
+ a = @ds.first
532
+ a[:a].should == 1
533
+
534
+ @ds.set_model(Hash)
535
+ end
536
+
537
+ specify "should work correctly with dataset with transforms" do
538
+ @ds.first.should == {:a => 1, :b => 2, :c => 3}
539
+ Sequel.use_array_tuples
540
+
541
+ @ds.transform(:a => [proc {|x| x + 10}, proc {|x| x - 10}])
542
+ a = @ds.first
543
+ a.class.should == Array
544
+ a[:a].should == 11
545
+ a[:b].should == 2
546
+ a[:c].should == 3
547
+ a[:d].should == nil
548
+
549
+ a = @ds.all[0]
550
+ a.class.should == Array
551
+ a[:a].should == 11
552
+ a[:b].should == 2
553
+ a[:c].should == 3
554
+ a[:d].should == nil
555
+ end
556
+
557
+ specify "should work correctly with dataset with model" do
558
+ ccc = Class.new do
559
+ attr_reader :values
560
+ def initialize(v)
561
+ @values = v
562
+ end
563
+ end
564
+
565
+ @ds.first.should == {:a => 1, :b => 2, :c => 3}
566
+ Sequel.use_array_tuples
567
+
568
+ @ds.set_model(ccc)
569
+ a = @ds.first
570
+ a.class.should == ccc
571
+ a.values.class.should == Array
572
+ a.values[:a].should == 1
573
+ a.values[:b].should == 2
574
+ a.values[:c].should == 3
575
+ a.values[:d].should == nil
576
+
577
+ a = @ds.all[0]
578
+ a.class.should == ccc
579
+ a.values.class.should == Array
580
+ a.values[:a].should == 1
581
+ a.values[:b].should == 2
582
+ a.values[:c].should == 3
583
+ a.values[:d].should == nil
584
+
585
+ @ds.each(:naked => true) do |a|
586
+ a.class.should == Array
587
+ a[:a].should == 1
588
+ a[:b].should == 2
589
+ a[:c].should == 3
590
+ a[:d].should == nil
591
+ end
592
+ end
593
+
594
+ specify "should work correctly with dataset with model and transform" do
595
+ ccc = Class.new do
596
+ attr_reader :values
597
+ def initialize(v)
598
+ @values = v
599
+ end
600
+ end
601
+
602
+ @ds.first.should == {:a => 1, :b => 2, :c => 3}
603
+ Sequel.use_array_tuples
604
+
605
+ @ds.transform(:a => [proc {|x| x + 10}, proc {|x| x - 10}])
606
+ @ds.set_model(ccc)
607
+ a = @ds.first
608
+ a.class.should == ccc
609
+ a.values.class.should == Array
610
+ a.values[:a].should == 11
611
+ a.values[:b].should == 2
612
+ a.values[:c].should == 3
613
+ a.values[:d].should == nil
614
+
615
+ a = @ds.all[0]
616
+ a.class.should == ccc
617
+ a.values.class.should == Array
618
+ a.values[:a].should == 11
619
+ a.values[:b].should == 2
620
+ a.values[:c].should == 3
621
+ a.values[:d].should == nil
622
+
623
+ @ds.each(:naked => true) do |a|
624
+ a.class.should == Array
625
+ a[:a].should == 11
626
+ a[:b].should == 2
627
+ a[:c].should == 3
628
+ a[:d].should == nil
629
+ end
630
+ end
631
+
632
+ specify "should work correctly with denuded dataset" do
633
+ ccc = Class.new do
634
+ attr_reader :values
635
+ def initialize(v)
636
+ @values = v
637
+ end
638
+ end
639
+
640
+ @ds.first.should == {:a => 1, :b => 2, :c => 3}
641
+ Sequel.use_array_tuples
642
+
643
+ @ds.set_model(ccc)
644
+ @ds.set_model(nil)
645
+
646
+ a = @ds.first
647
+ a.class.should == Array
648
+ a[:a].should == 1
649
+ a[:b].should == 2
650
+ a[:c].should == 3
651
+ a[:d].should == nil
652
+
653
+ a = @ds.all[0]
654
+ a.class.should == Array
655
+ a[:a].should == 1
656
+ a[:b].should == 2
657
+ a[:c].should == 3
658
+ a[:d].should == nil
659
+ end
660
+
661
+ specify "should be reversible using Sequel.use_hash_tuples" do
662
+ Sequel.use_array_tuples
663
+ @ds.first.class.should == Array
664
+
665
+ Sequel.use_hash_tuples
666
+ @ds.first.should == {:a => 1, :b => 2, :c => 3}
667
+ end
668
+
669
+ specify "should apply and unapply correctly to dataset with array_tuples_fetch_rows" do
670
+ @c.class_def(:fetch_rows) {'yo hash'}
671
+ @c.class_def(:array_tuples_fetch_rows) {'yo array'}
672
+ Sequel.use_array_tuples
673
+
674
+ @ds.fetch_rows.should == 'yo array'
675
+
676
+ Sequel.use_hash_tuples
677
+ @ds.fetch_rows.should == 'yo hash'
678
+ end
679
+ end