metry 1.2.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. data/History.txt +6 -0
  2. data/Manifest.txt +14 -69
  3. data/TODO +2 -3
  4. data/cucumber.yml +1 -0
  5. data/example/example.rb +1 -1
  6. data/features/psycho/dashboard.feature +17 -0
  7. data/features/psycho/goals.feature +24 -0
  8. data/features/psycho/visitor_tracking.feature +32 -0
  9. data/features/step_definitions/goals.rb +3 -0
  10. data/features/step_definitions/tracking.rb +1 -1
  11. data/features/step_definitions/web.rb +14 -2
  12. data/features/support/env.rb +4 -0
  13. data/lib/metry.rb +4 -6
  14. data/lib/metry/experiment.rb +6 -8
  15. data/lib/metry/psycho.rb +112 -0
  16. data/lib/metry/psycho/dashboard.erb +14 -0
  17. data/lib/metry/psycho/layout.erb +8 -0
  18. data/lib/metry/psycho/new_goal.erb +9 -0
  19. data/lib/metry/psycho/visitor.erb +7 -0
  20. data/lib/metry/rack/tracking.rb +17 -13
  21. data/lib/metry/storage.rb +116 -0
  22. data/radiant/example/features/metry.feature +8 -8
  23. data/radiant/example/features/psycho.feature +13 -0
  24. data/radiant/example/features/step_definitions/experiments.rb +2 -2
  25. data/radiant/example/features/step_definitions/tracking.rb +1 -1
  26. data/radiant/example/features/support/env.rb +3 -0
  27. data/radiant/extension/lib/metry_authenticator.rb +30 -0
  28. data/radiant/extension/lib/metry_tags.rb +2 -1
  29. data/radiant/extension/metry_extension.rb +1 -1
  30. data/test/{test_tokyo.rb → test_storage.rb} +3 -3
  31. metadata +17 -72
  32. data/lib/metry/memory.rb +0 -27
  33. data/lib/metry/tokyo.rb +0 -181
  34. data/vendor/rufus-tokyo/CHANGELOG.txt +0 -112
  35. data/vendor/rufus-tokyo/CREDITS.txt +0 -27
  36. data/vendor/rufus-tokyo/LICENSE.txt +0 -21
  37. data/vendor/rufus-tokyo/README.txt +0 -310
  38. data/vendor/rufus-tokyo/Rakefile +0 -118
  39. data/vendor/rufus-tokyo/TODO.txt +0 -25
  40. data/vendor/rufus-tokyo/doc/decision_table.numbers +0 -0
  41. data/vendor/rufus-tokyo/doc/rdoc-style.css +0 -320
  42. data/vendor/rufus-tokyo/lib/rufus-edo.rb +0 -3
  43. data/vendor/rufus-tokyo/lib/rufus-tokyo.rb +0 -3
  44. data/vendor/rufus-tokyo/lib/rufus/edo.rb +0 -39
  45. data/vendor/rufus-tokyo/lib/rufus/edo/README.txt +0 -106
  46. data/vendor/rufus-tokyo/lib/rufus/edo/cabcore.rb +0 -333
  47. data/vendor/rufus-tokyo/lib/rufus/edo/cabinet/abstract.rb +0 -219
  48. data/vendor/rufus-tokyo/lib/rufus/edo/cabinet/table.rb +0 -159
  49. data/vendor/rufus-tokyo/lib/rufus/edo/error.rb +0 -36
  50. data/vendor/rufus-tokyo/lib/rufus/edo/ntyrant.rb +0 -4
  51. data/vendor/rufus-tokyo/lib/rufus/edo/ntyrant/abstract.rb +0 -137
  52. data/vendor/rufus-tokyo/lib/rufus/edo/ntyrant/table.rb +0 -141
  53. data/vendor/rufus-tokyo/lib/rufus/edo/tabcore.rb +0 -567
  54. data/vendor/rufus-tokyo/lib/rufus/tokyo.rb +0 -58
  55. data/vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/abstract.rb +0 -568
  56. data/vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/lib.rb +0 -230
  57. data/vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/table.rb +0 -753
  58. data/vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/util.rb +0 -425
  59. data/vendor/rufus-tokyo/lib/rufus/tokyo/config.rb +0 -161
  60. data/vendor/rufus-tokyo/lib/rufus/tokyo/dystopia.rb +0 -43
  61. data/vendor/rufus-tokyo/lib/rufus/tokyo/dystopia/lib.rb +0 -65
  62. data/vendor/rufus-tokyo/lib/rufus/tokyo/dystopia/words.rb +0 -71
  63. data/vendor/rufus-tokyo/lib/rufus/tokyo/hmethods.rb +0 -111
  64. data/vendor/rufus-tokyo/lib/rufus/tokyo/query.rb +0 -102
  65. data/vendor/rufus-tokyo/lib/rufus/tokyo/transactions.rb +0 -74
  66. data/vendor/rufus-tokyo/lib/rufus/tokyo/ttcommons.rb +0 -59
  67. data/vendor/rufus-tokyo/lib/rufus/tokyo/tyrant.rb +0 -35
  68. data/vendor/rufus-tokyo/lib/rufus/tokyo/tyrant/abstract.rb +0 -146
  69. data/vendor/rufus-tokyo/lib/rufus/tokyo/tyrant/lib.rb +0 -153
  70. data/vendor/rufus-tokyo/lib/rufus/tokyo/tyrant/table.rb +0 -162
  71. data/vendor/rufus-tokyo/rufus-tokyo.gemspec +0 -25
  72. data/vendor/rufus-tokyo/spec/cabinet_spec.rb +0 -472
  73. data/vendor/rufus-tokyo/spec/cabinetconfig_spec.rb +0 -82
  74. data/vendor/rufus-tokyo/spec/edo_cabinet_spec.rb +0 -447
  75. data/vendor/rufus-tokyo/spec/edo_ntyrant_spec.rb +0 -299
  76. data/vendor/rufus-tokyo/spec/edo_ntyrant_table_spec.rb +0 -462
  77. data/vendor/rufus-tokyo/spec/edo_table_spec.rb +0 -560
  78. data/vendor/rufus-tokyo/spec/hmethods_spec.rb +0 -44
  79. data/vendor/rufus-tokyo/spec/incr.lua +0 -20
  80. data/vendor/rufus-tokyo/spec/spec.rb +0 -9
  81. data/vendor/rufus-tokyo/spec/spec_base.rb +0 -23
  82. data/vendor/rufus-tokyo/spec/start_tyrants.sh +0 -26
  83. data/vendor/rufus-tokyo/spec/stop_tyrants.sh +0 -9
  84. data/vendor/rufus-tokyo/spec/table_spec.rb +0 -567
  85. data/vendor/rufus-tokyo/spec/tyrant_spec.rb +0 -309
  86. data/vendor/rufus-tokyo/spec/tyrant_table_spec.rb +0 -479
  87. data/vendor/rufus-tokyo/spec/util_list_spec.rb +0 -200
  88. data/vendor/rufus-tokyo/spec/util_map_spec.rb +0 -132
  89. data/vendor/rufus-tokyo/tasks/dev.rb +0 -70
  90. data/vendor/rufus-tokyo/test/bm0.rb +0 -353
  91. data/vendor/rufus-tokyo/test/bm1_compression.rb +0 -54
  92. data/vendor/rufus-tokyo/test/con0.rb +0 -30
  93. data/vendor/rufus-tokyo/test/mem.rb +0 -49
  94. data/vendor/rufus-tokyo/test/mem1.rb +0 -44
  95. data/vendor/rufus-tokyo/test/readme0.rb +0 -17
  96. data/vendor/rufus-tokyo/test/readme1.rb +0 -21
  97. data/vendor/rufus-tokyo/test/readme2.rb +0 -15
  98. data/vendor/rufus-tokyo/test/readme3.rb +0 -24
  99. data/vendor/rufus-tokyo/test/readmes_test.sh +0 -17
@@ -1,560 +0,0 @@
1
-
2
- #
3
- # Specifying rufus-tokyo
4
- #
5
- # Mon Feb 23 11:11:10 JST 2009
6
- #
7
-
8
- require File.dirname(__FILE__) + '/spec_base'
9
-
10
- begin
11
- require 'rufus/edo'
12
- rescue LoadError
13
- end
14
-
15
- if defined?(TokyoCabinet)
16
-
17
- FileUtils.mkdir('tmp') rescue nil
18
-
19
-
20
- describe 'Rufus::Edo::Table' do
21
-
22
- it 'should open in write/create mode by default' do
23
-
24
- t = Rufus::Edo::Table.new('tmp/default.tct')
25
- t.close
26
- File.exist?('tmp/default.tct').should.equal(true)
27
- FileUtils.rm('tmp/default.tct')
28
- end
29
-
30
- it 'should raise an error when file is missing' do
31
-
32
- lambda {
33
- Rufus::Edo::Table.new('tmp/missing.tct', :mode => 'r')
34
- }.should.raise(
35
- Rufus::Edo::EdoError).message.should.equal('(err 3) file not found')
36
- end
37
- end
38
-
39
- describe 'Rufus::Edo::Table' do
40
-
41
- before do
42
- @t = Rufus::Edo::Table.new('tmp/table.tct')
43
- @t.clear
44
- end
45
- after do
46
- @t.close
47
- end
48
-
49
- it 'should return its path' do
50
-
51
- @t.path.should.equal('tmp/table.tct')
52
- end
53
-
54
- it 'should generate unique ids' do
55
-
56
- @t.genuid.should.satisfy { |i| i > 0 }
57
- end
58
-
59
- it 'should return nil for missing keys' do
60
-
61
- @t['missing'].should.be.nil
62
- end
63
-
64
- it 'should accept Array and Hash input' do
65
-
66
- @t.size.should.equal(0)
67
-
68
- @t['pk0'] = [ 'name', 'toto', 'age', '30' ]
69
- @t['pk1'] = { 'name' => 'fred', 'age' => '22' }
70
-
71
- @t.size.should.equal(2)
72
- @t['pk0'].should.equal({ 'name' => 'toto', 'age' => '30' })
73
- end
74
-
75
- it 'should return nil when deleting inexistent entries' do
76
-
77
- @t.delete('I_do_not_exist').should.equal(nil)
78
- end
79
-
80
- it 'should delete the entry and return the value' do
81
-
82
- @t['pk0'] = [ 'name', 'toto', 'age', '30' ]
83
- @t.delete('pk0').should.equal({ 'name' => 'toto', 'age' => '30' })
84
- @t.size.should.equal(0)
85
- end
86
-
87
- it 'should raise an ArgumentError on non map or hash input' do
88
-
89
- lambda {
90
- @t['pk0'] = 'bad thing here'
91
- }.should.raise(ArgumentError)
92
- end
93
-
94
- it 'should raise an ArgumentError on non-string column name' do
95
-
96
- lambda {
97
- @t['pk0'] = [ 1, 2 ]
98
- }.should.raise(ArgumentError)
99
- lambda {
100
- @t['pk0'] = { 1 => 2 }
101
- }.should.raise(ArgumentError)
102
- end
103
-
104
- it 'should raise an ArgumentError on non-string column value' do
105
-
106
- lambda {
107
- @t['pk0'] = { 'a' => 2 }
108
- }.should.raise(ArgumentError)
109
- end
110
-
111
- it 'should correctly abort transactions' do
112
-
113
- @t.transaction {
114
- @t['pk0'] = { 'a' => 'A' }
115
- @t.abort
116
- }
117
- @t.size.should.be.zero
118
- end
119
-
120
- it 'should rollback transactions with errors' do
121
-
122
- @t.transaction {
123
- @t['pk0'] = { 'a' => 'A' }
124
- raise "something goes wrong"
125
- }
126
- @t.size.should.be.zero
127
- end
128
-
129
- it 'should commit successful transactions' do
130
-
131
- @t.transaction do
132
- @t['pk0'] = { 'a' => 'A' }
133
- end
134
- @t['pk0'].should.equal({ 'a' => 'A' })
135
- end
136
-
137
- it 'should abort low level transactions' do
138
-
139
- @t.tranbegin
140
- @t['pk0'] = { 'a' => 'A' }
141
- @t.tranabort
142
- @t.size.should.be.zero
143
- end
144
-
145
- it 'should commit low level transactions' do
146
-
147
- @t.tranbegin
148
- @t['pk0'] = { 'a' => 'A' }
149
- @t.trancommit
150
- @t['pk0'].should.equal({ 'a' => 'A' })
151
- end
152
-
153
- it 'should store binary data \0' do
154
- s = "toto#{0.chr}nada"
155
- @t[s] = { s => s }
156
- @t[s].should.equal({ s => s })
157
- end
158
-
159
- end
160
-
161
-
162
- describe 'Rufus::Edo::Table #keys' do
163
-
164
- before do
165
- @n = 50
166
- @tab = Rufus::Edo::Table.new('tmp/test_new.tct')
167
- @tab.clear
168
- @n.times { |i| @tab["person#{i}"] = { 'name' => 'whoever' } }
169
- @n.times { |i| @tab["animal#{i}"] = { 'name' => 'whichever' } }
170
- @tab["toto#{0.chr}5"] = { 'name' => 'toto' }
171
- end
172
- after do
173
- @tab.close
174
- end
175
-
176
- it 'should return a Ruby Array by default' do
177
-
178
- @tab.keys.class.should.equal(::Array)
179
- end
180
-
181
- it 'should retrieve forward matching keys when :prefix => "prefix-"' do
182
-
183
- @tab.keys(:prefix => 'person').size.should.equal(@n)
184
- end
185
-
186
- it 'should retrieve keys that contain \0' do
187
-
188
- @tab.keys.include?("toto#{0.chr}5").should.be.true
189
- end
190
-
191
- it 'should retrieve forward matching keys when key contains \0' do
192
-
193
- @tab.keys(:prefix => 'toto').should.equal([ "toto#{0.chr}5" ])
194
- end
195
-
196
- it 'should return a limited number of keys when :limit is set' do
197
-
198
- @tab.keys(:limit => 20).size.should.equal(20)
199
- end
200
-
201
- it 'should delete_keys_with_prefix' do
202
-
203
- @tab.delete_keys_with_prefix('animal')
204
- @tab.size.should.equal(@n + 1)
205
- @tab.keys(:prefix => 'animal').size.should.equal(0)
206
- end
207
- end
208
-
209
-
210
- def prepare_table_with_data
211
-
212
- t = Rufus::Edo::Table.new('tmp/test_new.tct')
213
- t.clear
214
- t['pk0'] = { 'name' => 'jim', 'age' => '25', 'lang' => 'ja,en' }
215
- t['pk1'] = { 'name' => 'jeff', 'age' => '32', 'lang' => 'en,es' }
216
- t['pk2'] = { 'name' => 'jack', 'age' => '44', 'lang' => 'en' }
217
- t['pk3'] = { 'name' => 'jake', 'age' => '45', 'lang' => 'en,li' }
218
- t
219
- end
220
-
221
- describe 'Rufus::Edo::Table' do
222
-
223
- before do
224
- @t = prepare_table_with_data
225
- end
226
- after do
227
- @t.close
228
- end
229
-
230
- it 'should accept lexical indexes' do
231
- @t.set_index('name', :lexical).should.equal(true)
232
- end
233
-
234
- it 'should accept decimal indexes' do
235
- @t.set_index('age', :decimal).should.equal(true)
236
- end
237
-
238
- it 'should accept removal of indexes' do
239
- @t.set_index('age', :decimal)
240
- @t.set_index('age', :remove).should.equal(true)
241
- end
242
-
243
- it 'should accept indexes on the primary key (well...)' do
244
- @t.set_index(:pk, :lexical).should.equal(true)
245
- @t.set_index('', :lexical).should.equal(true)
246
- end
247
- end
248
-
249
- describe 'Rufus::Edo::Table#lget' do
250
-
251
- before do
252
- @t = prepare_table_with_data
253
- end
254
- after do
255
- @t.close
256
- end
257
-
258
- it 'should return an empty hash for missing keys' do
259
- @t.lget(%w{ pk97 pk98 }).should.equal({})
260
- end
261
-
262
- it 'should return multiple records' do
263
- @t.lget(%w{ pk0 pk1 }).should.equal({
264
- 'pk0' => { 'name' => 'jim', 'age' => '25', 'lang' => 'ja,en' },
265
- 'pk1' => { 'name' => 'jeff', 'age' => '32', 'lang' => 'en,es' }
266
- })
267
- end
268
- end
269
-
270
- describe 'Rufus::Edo::Table, like a Ruby Hash,' do
271
-
272
- before do
273
- @t = prepare_table_with_data
274
- end
275
- after do
276
- @t.close
277
- end
278
-
279
- it 'should respond to #keys' do
280
-
281
- @t.keys.should.equal([ 'pk0', 'pk1', 'pk2', 'pk3' ])
282
- end
283
-
284
- it 'should respond to #values' do
285
-
286
- @t.values.should.equal([
287
- { 'name' => 'jim', 'age' => '25', 'lang' => 'ja,en' },
288
- { 'name' => 'jeff', 'age' => '32', 'lang' => 'en,es' },
289
- { 'name' => 'jack', 'age' => '44', 'lang' => 'en' },
290
- { 'name' => 'jake', 'age' => '45', 'lang' => 'en,li' }])
291
- end
292
-
293
- it 'should benefit from Enumerable' do
294
-
295
- @t.find { |k, v|
296
- v['name'] == 'jeff'
297
- }.should.equal([
298
- 'pk1', { 'name' => 'jeff', 'age' => '32', 'lang' => 'en,es' }])
299
- end
300
- end
301
-
302
- describe 'queries on Rufus::Edo::Table' do
303
-
304
- before do
305
- @t = prepare_table_with_data
306
- end
307
- after do
308
- @t.close
309
- end
310
-
311
- it 'can be executed' do
312
-
313
- @t.query { |q|
314
- q.add 'lang', :includes, 'en'
315
- }.size.should.equal(4)
316
- end
317
-
318
- it 'can be prepared' do
319
-
320
- @t.prepare_query { |q|
321
- q.add 'lang', :includes, 'en'
322
- }.should.satisfy { |q| q.class == Rufus::Edo::TableQuery }
323
- end
324
-
325
- it 'can be counted' do
326
- # testing the mimicking the count function of TC 1.4.21
327
-
328
- q = @t.prepare_query { |q|
329
- q.add 'lang', :includes, 'en'
330
- }
331
- q.run
332
- q.count.should.equal(4)
333
- end
334
-
335
- it 'can be limited' do
336
-
337
- @t.query { |q|
338
- q.add 'lang', :includes, 'en'
339
- q.limit 2
340
- }.size.should.equal(2)
341
- end
342
-
343
- it 'can leverage regex matches' do
344
-
345
- @t.query { |q|
346
- q.add 'name', :matches, '^j.+k'
347
- }.to_a.should.equal([
348
- {:pk => 'pk2', "name"=>"jack", "lang"=>"en", "age"=>"44"},
349
- {:pk => 'pk3', "name"=>"jake", "lang"=>"en,li", "age"=>"45"}])
350
- end
351
-
352
- it 'can leverage numerical comparison (gt)' do
353
-
354
- @t.query { |q|
355
- q.add 'age', :gt, '40'
356
- q.pk_only
357
- }.to_a.should.equal([ 'pk2', 'pk3' ])
358
- end
359
-
360
- it 'can have negated conditions' do
361
-
362
- @t.query { |q|
363
- q.add 'age', :gt, '40', false
364
- q.pk_only
365
- }.to_a.should.equal([ 'pk0', 'pk1' ])
366
- end
367
-
368
- if TokyoCabinet::TDBQRY.public_instance_methods.collect { |e|
369
- e.to_s }.include?('setlimit')
370
-
371
- it 'can be limited and have an offset' do
372
-
373
- @t.query { |q|
374
- q.add 'lang', :includes, 'en'
375
- q.order_by 'name', :desc
376
- q.limit 2, 0
377
- }.collect { |e| e['name'] }.should.equal(%w{ jim jeff })
378
- @t.query { |q|
379
- q.add 'lang', :includes, 'en'
380
- q.order_by 'name', :desc
381
- q.limit 2, 2
382
- }.collect { |e| e['name'] }.should.equal(%w{ jake jack })
383
- end
384
- end
385
-
386
- it 'can be deleted (searchout : query#delete)' do
387
-
388
- @t.prepare_query { |q|
389
- q.add 'lang', :includes, 'es'
390
- }.delete
391
-
392
- @t.size.should.equal(3)
393
- end
394
-
395
- it 'can be deleted immediately (searchout table#query_delete)' do
396
-
397
- @t.query_delete { |q|
398
- q.add 'lang', :includes, 'es'
399
- }
400
-
401
- @t.size.should.equal(3)
402
- end
403
-
404
- end
405
-
406
- describe 'Rufus::Tokyo::TableQuery#process' do
407
-
408
- before do
409
- @t = prepare_table_with_data
410
- end
411
- after do
412
- @t.close
413
- end
414
-
415
- it 'can iterate over the matching records' do
416
-
417
- keys, values = [], []
418
-
419
- @t.prepare_query { |q|
420
- q.add 'lang', :includes, 'en'
421
- }.process { |k, v|
422
- keys << k
423
- values << v
424
- }.free
425
-
426
- keys.should.equal(%w[ pk0 pk1 pk2 pk3 ])
427
- values.first.keys.sort.should.equal(%w[ age lang name ])
428
- end
429
-
430
- it 'can stop while iterating' do
431
-
432
- seen = 0
433
-
434
- @t.prepare_query { |q|
435
- q.add 'lang', :includes, 'en'
436
- }.process { |k, v|
437
- seen = seen + 1
438
- :stop
439
- }.free
440
-
441
- seen.should.equal(1)
442
- end
443
-
444
- it 'can delete while iterating' do
445
-
446
- @t.prepare_query { |q|
447
- q.add 'lang', :includes, 'en'
448
- }.process { |k, v|
449
- v['name'].match(/^ja/) ? :delete : nil
450
- }.free
451
-
452
- @t.keys.sort.should.equal(%w[ pk0 pk1 ])
453
- end
454
-
455
- it 'can update while iterating' do
456
-
457
- @t.prepare_query { |q|
458
- q.add 'lang', :includes, 'en'
459
- }.process { |k, v|
460
- v['name'].match(/^ja/) ? v.merge('special' => 'seen') : nil
461
- }.free
462
-
463
- @t.size.should.equal(4)
464
-
465
- @t['pk2'].should.equal(
466
- {'name'=>'jack', 'age'=>'44', 'lang'=>'en', 'special'=>'seen'})
467
- @t['pk3'].should.equal(
468
- {'name'=>'jake', 'age'=>'45', 'lang'=>'en,li', 'special'=>'seen'})
469
- end
470
-
471
- it 'can update, delete and stop' do
472
-
473
- seen = []
474
-
475
- @t.prepare_query { |q|
476
- q.add 'lang', :includes, 'en'
477
- q.order_by 'name', :desc
478
- }.process { |k, v|
479
- seen << v['name']
480
- case v['name']
481
- when 'jim' then nil
482
- when 'jeff' then :delete
483
- when 'jake' then [ :stop, v.merge('special' => 'nada') ]
484
- end
485
- }.free
486
-
487
- seen.include?('jack').should.be.false
488
-
489
- @t.size.should.equal(3)
490
-
491
- @t['pk3'].should.equal(
492
- {'name'=>'jake', 'age'=>'45', 'lang'=>'en,li', 'special'=>'nada'})
493
- @t['pk1'].should.be.nil
494
- end
495
- end
496
-
497
- describe 'results from Rufus::Edo::Table queries' do
498
-
499
- before do
500
- @t = prepare_table_with_data
501
- end
502
- after do
503
- @t.close
504
- end
505
-
506
- it 'can come ordered (strdesc)' do
507
-
508
- @t.query { |q|
509
- q.add 'lang', :includes, 'en'
510
- q.order_by 'name', :desc
511
- q.limit 2
512
- }.to_a.should.equal([
513
- {:pk => 'pk0', "name"=>"jim", "lang"=>"ja,en", "age"=>"25"},
514
- {:pk => 'pk1', "name"=>"jeff", "lang"=>"en,es", "age"=>"32"}])
515
- end
516
-
517
- it 'can come ordered (strasc)' do
518
-
519
- @t.query { |q|
520
- q.add 'lang', :includes, 'en'
521
- q.order_by 'name', :asc
522
- }.to_a.should.equal([
523
- {:pk => 'pk2', "name"=>"jack", "lang"=>"en", "age"=>"44"},
524
- {:pk => 'pk3', "name"=>"jake", "lang"=>"en,li", "age"=>"45"},
525
- {:pk => 'pk1', "name"=>"jeff", "lang"=>"en,es", "age"=>"32"},
526
- {:pk => 'pk0', "name"=>"jim", "lang"=>"ja,en", "age"=>"25"}])
527
- end
528
-
529
- it 'can come ordered (numasc)' do
530
-
531
- @t.query { |q|
532
- q.add 'lang', :includes, 'en'
533
- q.order_by 'age', :numasc
534
- }.to_a.should.equal([
535
- {:pk => 'pk0', "name"=>"jim", "lang"=>"ja,en", "age"=>"25"},
536
- {:pk => 'pk1', "name"=>"jeff", "lang"=>"en,es", "age"=>"32"},
537
- {:pk => 'pk2', "name"=>"jack", "lang"=>"en", "age"=>"44"},
538
- {:pk => 'pk3', "name"=>"jake", "lang"=>"en,li", "age"=>"45"}])
539
- end
540
-
541
- it 'can come without the primary keys (no_pk)' do
542
-
543
- @t.query { |q|
544
- q.add 'name', :matches, '^j.+k'
545
- q.no_pk
546
- }.to_a.should.equal([
547
- {"name"=>"jack", "lang"=>"en", "age"=>"44"},
548
- {"name"=>"jake", "lang"=>"en,li", "age"=>"45"}])
549
- end
550
-
551
- it 'can consist only of the primary keys (pk_only)' do
552
-
553
- @t.query { |q|
554
- q.add 'name', :matches, '^j.+k'
555
- q.pk_only
556
- }.to_a.should.equal(["pk2", "pk3"])
557
- end
558
- end
559
- end
560
-