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,25 +0,0 @@
1
-
2
- Gem::Specification.new do |s|
3
-
4
- s.name = 'rufus-tokyo'
5
- s.version = '0.1.14'
6
- s.authors = [ 'John Mettraux', ]
7
- s.email = 'jmettraux@gmail.com'
8
- s.homepage = 'http://rufus.rubyforge.org/'
9
- s.platform = Gem::Platform::RUBY
10
- s.summary = 'ruby-ffi based lib to access Tokyo Cabinet and Tyrant'
11
-
12
- s.require_path = 'lib'
13
- s.test_file = 'spec/spec.rb'
14
- s.has_rdoc = true
15
- s.extra_rdoc_files = %w{ README.txt CHANGELOG.txt CREDITS.txt }
16
- s.rubyforge_project = 'rufus'
17
-
18
- %w{ ffi }.each do |d|
19
- s.requirements << d
20
- s.add_dependency(d)
21
- end
22
-
23
- s.files = Dir['lib/**/*.rb'] + Dir['*.txt'] - [ 'lib/tokyotyrant.rb' ]
24
- end
25
-
@@ -1,472 +0,0 @@
1
-
2
- #
3
- # Specifying rufus-tokyo
4
- #
5
- # Sun Feb 8 15:02:08 JST 2009
6
- #
7
-
8
- require File.dirname(__FILE__) + '/spec_base'
9
-
10
- require 'rufus/tokyo'
11
-
12
- FileUtils.mkdir('tmp') rescue nil
13
-
14
-
15
- describe 'Rufus::Tokyo::Cabinet' do
16
-
17
- before do
18
- @db = Rufus::Tokyo::Cabinet.new('tmp/cabinet_spec.tch')
19
- @db.clear
20
- end
21
- after do
22
- @db.close
23
- end
24
-
25
- it 'should return its path' do
26
-
27
- @db.path.should.equal('tmp/cabinet_spec.tch')
28
- end
29
-
30
- it 'should create its underlying file' do
31
-
32
- File.exist?('tmp/cabinet_spec.tch').should.equal(true)
33
- end
34
-
35
- it 'should be empty initially' do
36
-
37
- @db.size.should.equal(0)
38
- @db['pillow'].should.be.nil
39
- end
40
-
41
- it 'should accept values' do
42
-
43
- @db['pillow'] = 'Shonagon'
44
- @db.size.should.equal(1)
45
- end
46
-
47
- it 'should restitute values' do
48
-
49
- @db['pillow'] = 'Shonagon'
50
- @db['pillow'].should.equal('Shonagon')
51
- end
52
-
53
- it 'should delete values' do
54
-
55
- @db['pillow'] = 'Shonagon'
56
- @db.delete('pillow').should.equal('Shonagon')
57
- @db.size.should.equal(0)
58
- end
59
-
60
- it 'should accept and restitute \\0 strings' do
61
- s = "toto#{0.chr}nada"
62
- @db[s] = s
63
- @db[s].should.equal(s)
64
- end
65
-
66
- it 'should reply to #keys and #values' do
67
-
68
- keys = %w{ alpha bravo charly delta echo foxtrott }
69
- keys.each_with_index { |k, i| @db[k] = i.to_s }
70
- @db.keys.should.equal(keys)
71
- @db.values.should.equal(%w{ 0 1 2 3 4 5 })
72
- end
73
-
74
- it 'should reply to #keys when there are keys containing \0' do
75
-
76
- s = "toto#{0.chr}nada"
77
- @db[s] = s
78
- @db.keys.should.equal([ s ])
79
- end
80
-
81
- it 'should return a Ruby hash on merge' do
82
-
83
- @db['a'] = 'A'
84
-
85
- @db.merge({ 'b' => 'B', 'c' => 'C' }).should.equal(
86
- { 'a' => 'A', 'b' => 'B', 'c' => 'C' })
87
-
88
- @db['b'].should.be.nil
89
-
90
- @db.size.should.equal(1)
91
- end
92
-
93
- it 'should have more values in case of merge!' do
94
-
95
- @db['a'] = 'A'
96
-
97
- @db.merge!({ 'b' => 'B', 'c' => 'C' })
98
-
99
- @db.size.should.equal(3)
100
- @db['b'].should.equal('B')
101
- end
102
- end
103
-
104
- describe 'Rufus::Tokyo::Cabinet #keys' do
105
-
106
- before do
107
- @n = 50
108
- @db = Rufus::Tokyo::Cabinet.new('tmp/cabinet_spec.tch')
109
- @db.clear
110
- @n.times { |i| @db["person#{i}"] = 'whoever' }
111
- @n.times { |i| @db["animal#{i}"] = 'whichever' }
112
- @db["toto#{0.chr}5"] = 'toto'
113
- end
114
- after do
115
- @db.close
116
- end
117
-
118
- it 'should return a Ruby Hash by default' do
119
-
120
- @db.keys.class.should.equal(::Array)
121
- end
122
-
123
- it 'should return a Cabinet List when :native => true' do
124
-
125
- l = @db.keys(:native => true)
126
- l.class.should.equal(Rufus::Tokyo::List)
127
- l.size.should.equal(2 * @n + 1)
128
- l.free
129
- end
130
-
131
- it 'should retrieve forward matching keys when :prefix => "prefix-"' do
132
-
133
- @db.keys(:prefix => 'person').size.should.equal(@n)
134
-
135
- l = @db.keys(:prefix => 'animal', :native => true)
136
- l.size.should.equal(@n)
137
- l.free
138
- end
139
-
140
- it 'should retrieve keys that contain \0' do
141
-
142
- @db.keys.include?("toto#{0.chr}5").should.be.true
143
- end
144
-
145
- it 'should retrieve forward matching keys when key contains \0' do
146
-
147
- @db.keys(:prefix => 'toto').should.equal([ "toto#{0.chr}5" ])
148
- end
149
-
150
- it 'should return a limited number of keys when :limit is set' do
151
-
152
- @db.keys(:limit => 20).size.should.equal(20)
153
- end
154
-
155
- it 'should delete_keys_with_prefix' do
156
-
157
- @db.delete_keys_with_prefix('animal')
158
- @db.size.should.equal(@n + 1)
159
- @db.keys(:prefix => 'animal').size.should.equal(0)
160
- end
161
- end
162
-
163
- if Rufus::Tokyo::CabinetLib.respond_to?(:tcadbtranbegin)
164
- #
165
- # TC >= 1.4.13
166
-
167
- describe Rufus::Tokyo::Cabinet do
168
-
169
- before do
170
- @db = Rufus::Tokyo::Cabinet.new('tmp/cabinet_spec.tch')
171
- @db.clear
172
- end
173
- after do
174
- @db.close
175
- end
176
-
177
- it 'should correctly abort transactions' do
178
-
179
- @db.transaction {
180
- @db['pk0'] = 'value0'
181
- @db.abort
182
- }
183
- @db.size.should.be.zero
184
- end
185
-
186
- it 'should rollback transactions with errors' do
187
-
188
- @db.transaction {
189
- @db['pk0'] = 'value0'
190
- raise 'something goes wrong'
191
- }
192
- @db.size.should.be.zero
193
- end
194
-
195
- it 'should commit successful transactions' do
196
-
197
- @db.transaction do
198
- @db['pk0'] = 'showanojidaietaminamishima'
199
- end
200
- @db['pk0'].should.equal('showanojidaietaminamishima')
201
- end
202
-
203
- it 'should abort low level transactions' do
204
-
205
- @db.tranbegin
206
- @db['pk0'] = 'shikataganai'
207
- @db.tranabort
208
- @db.size.should.be.zero
209
- end
210
-
211
- it 'should commit low level transactions' do
212
-
213
- @db.tranbegin
214
- @db['pk0'] = 'shikataganai'
215
- @db.trancommit
216
- @db['pk0'].should.equal('shikataganai')
217
- end
218
- end
219
- end
220
-
221
-
222
- describe 'Rufus::Tokyo::Cabinet' do
223
-
224
- it 'should accept a default value' do
225
-
226
- cab = Rufus::Tokyo::Cabinet.new(
227
- 'tmp/cabinet_spec_default.tch', :default => '@?!')
228
- cab['a'] = 'A'
229
- cab.size.should.equal(1)
230
- cab['b'].should.equal('@?!')
231
- cab.close
232
- end
233
-
234
- it 'should accept a default value (later)' do
235
-
236
- cab = Rufus::Tokyo::Cabinet.new('tmp/cabinet_spec_default.tch')
237
- cab.default = '@?!'
238
- cab['a'] = 'A'
239
- cab.size.should.equal(1)
240
- cab['b'].should.equal('@?!')
241
- cab.close
242
- end
243
- end
244
-
245
- describe 'Rufus::Tokyo::Cabinet lget/lput/ldelete' do
246
-
247
- before do
248
- @db = Rufus::Tokyo::Cabinet.new('tmp/cabinet_spec.tch')
249
- @db.clear
250
- 3.times { |i| @db[i.to_s] = "val#{i}" }
251
- end
252
- after do
253
- @db.close
254
- end
255
-
256
- it 'should get multiple values' do
257
-
258
- @db.lget(%w{ 0 1 2 }).should.equal({"0"=>"val0", "1"=>"val1", "2"=>"val2"})
259
- end
260
-
261
- it 'should put multiple values' do
262
-
263
- @db.lput('3' => 'val3', '4' => 'val4')
264
- @db.lget(%w{ 2 3 }).should.equal({"2"=>"val2", "3"=>"val3"})
265
- end
266
-
267
- it 'should delete multiple values' do
268
-
269
- @db.ldelete(%w{ 2 3 })
270
- @db.lget(%w{ 0 1 2 }).should.equal({"0"=>"val0", "1"=>"val1"})
271
- end
272
- end
273
-
274
-
275
- describe 'Rufus::Tokyo::Cabinet' do
276
-
277
- it 'should copy correctly' do
278
-
279
- cab = Rufus::Tokyo::Cabinet.new('tmp/spec_source.tch')
280
- 5000.times { |i| cab["key #{i}"] = "val #{i}" }
281
- cab.size.should.equal(5000)
282
- cab.copy('tmp/spec_target.tch')
283
- cab.close
284
-
285
- cab = Rufus::Tokyo::Cabinet.new('tmp/spec_target.tch')
286
- cab.size.should.equal(5000)
287
- cab['key 4999'].should.equal('val 4999')
288
- cab.close
289
-
290
- FileUtils.rm('tmp/spec_source.tch')
291
- FileUtils.rm('tmp/spec_target.tch')
292
- end
293
-
294
- it 'should copy compactly' do
295
-
296
- cab = Rufus::Tokyo::Cabinet.new('tmp/spec_source.tch')
297
- 100.times { |i| cab["key #{i}"] = "val #{i}" }
298
- 50.times { |i| cab.delete("key #{i}") }
299
- cab.size.should.equal(50)
300
- cab.compact_copy('tmp/spec_target.tch')
301
- cab.close
302
-
303
- cab = Rufus::Tokyo::Cabinet.new('tmp/spec_target.tch')
304
- cab.size.should.equal(50)
305
- cab['key 99'].should.equal('val 99')
306
- cab.close
307
-
308
- fs0 = File.size('tmp/spec_source.tch')
309
- fs1 = File.size('tmp/spec_target.tch')
310
- (fs0 > fs1).should.equal(true)
311
-
312
- FileUtils.rm('tmp/spec_source.tch')
313
- FileUtils.rm('tmp/spec_target.tch')
314
- end
315
-
316
-
317
- it 'should use open with a block will auto close the db correctly' do
318
-
319
- res = Rufus::Tokyo::Cabinet.open('tmp/spec_source.tch') do |cab|
320
- 10.times { |i| cab["key #{i}"] = "val #{i}" }
321
- cab.size.should.equal(10)
322
- end
323
-
324
- res.should.be.nil
325
-
326
- cab = Rufus::Tokyo::Cabinet.new('tmp/spec_source.tch')
327
- 10.times do |i|
328
- cab["key #{i}"].should.equal("val #{i}")
329
- end
330
- cab.close
331
-
332
- FileUtils.rm('tmp/spec_source.tch')
333
- end
334
-
335
-
336
- it 'should use open without a block just like calling new correctly' do
337
-
338
- cab = Rufus::Tokyo::Cabinet.open('tmp/spec_source.tch')
339
- 10.times { |i| cab["key #{i}"] = "val #{i}" }
340
- cab.size.should.equal(10)
341
- cab.close
342
-
343
- cab = Rufus::Tokyo::Cabinet.new('tmp/spec_source.tch')
344
- 10.times do |i|
345
- cab["key #{i}"].should.equal("val #{i}")
346
- end
347
- cab.close
348
-
349
- FileUtils.rm('tmp/spec_source.tch')
350
- end
351
-
352
- it 'should honour the :type parameter' do
353
-
354
- cab = Rufus::Tokyo::Cabinet.open('tmp/toto.tch')
355
- cab.clear
356
- cab['hello'] = 'world'
357
- cab.close
358
-
359
- cab = Rufus::Tokyo::Cabinet.open('tmp/toto', :type => :hash)
360
- cab['hello'].should.equal('world')
361
- cab.close
362
-
363
- FileUtils.rm('tmp/toto.tch')
364
- end
365
-
366
- it 'should respond to defrag (or not) (TC >= 1.4.21)' do
367
-
368
- cab = Rufus::Tokyo::Cabinet.open('tmp/toto.tch')
369
-
370
- if Rufus::Tokyo::CabinetLib.respond_to?(:tctdbsetdfunit)
371
- cab.defrag
372
- true.should.equal(true)
373
- else
374
- lambda() { cab.defrag }.should.raise(NotImplementedError)
375
- end
376
-
377
- cab.close
378
- end
379
- end
380
-
381
- describe 'Rufus::Tokyo::Cabinet#add{int|double}' do
382
-
383
- before do
384
- @db = Rufus::Tokyo::Cabinet.new('tmp/cabinet_spec.tch')
385
- @db.clear
386
- end
387
- after do
388
- @db.close
389
- end
390
-
391
- it 'should increment (int)' do
392
-
393
- @db.addint('counter', 1).should.equal(1)
394
- @db.incr('counter', 1).should.equal(2)
395
- @db.addint('counter', 2).should.equal(4)
396
- @db.incr('counter').should.equal(5)
397
- end
398
-
399
- it 'should fail gracefully if counter has already a [string] value (int)' do
400
-
401
- @db['counter'] = 'a'
402
- lambda { @db.addint('counter', 1) }.should.raise(Rufus::Tokyo::TokyoError)
403
- @db['counter'].should.equal('a')
404
- end
405
-
406
- it 'should increment (double)' do
407
-
408
- @db.adddouble('counter', 1.0).should.equal(1.0)
409
- @db.incr('counter', 1.5).should.equal(2.5)
410
- @db.adddouble('counter', 2.2).should.equal(4.7)
411
- end
412
-
413
- it 'should fail gracefully if counter has already a [string] value (double)' do
414
-
415
- @db['counter'] = 'a'
416
- lambda {
417
- @db.adddouble('counter', 1.0)
418
- }.should.raise(Rufus::Tokyo::TokyoError)
419
- @db['counter'].should.equal('a')
420
- end
421
- end
422
-
423
- describe 'Rufus::Tokyo::Cabinet#putkeep' do
424
- before do
425
- @db = Rufus::Tokyo::Cabinet.new('tmp/cabinet_spec.tch')
426
- @db.clear
427
- end
428
- after do
429
- @db.close
430
- end
431
-
432
- it 'should accept values' do
433
-
434
- @db.putkeep('pillow', 'Shonagon')
435
- @db.size.should.equal(1)
436
- end
437
-
438
- it 'should restitute values' do
439
-
440
- @db.putkeep('pillow', 'Shonagon')
441
- @db['pillow'].should.equal('Shonagon')
442
- end
443
-
444
- it 'should not overwrite values if already set' do
445
-
446
- @db['pillow'] = 'Shonagon'
447
- @db['pillow'].should.equal('Shonagon')
448
-
449
- @db.putkeep('pillow', 'Ruby')
450
- @db['pillow'].should.equal('Shonagon')
451
- end
452
-
453
- it 'should return true if not yet set' do
454
-
455
- @db.putkeep('pillow', 'Shonagon').should.equal(true)
456
- end
457
-
458
- it 'should return false if already set' do
459
-
460
- @db['pillow'] = 'Shonagon'
461
- @db.putkeep('pillow', 'Ruby').should.equal(false)
462
- end
463
-
464
- it 'should accept binary data \0' do
465
-
466
- s = "Sei#{0.chr}Shonagon"
467
-
468
- @db.putkeep(s, s).should.be.true
469
- @db[s].should.equal(s)
470
- end
471
- end
472
-