metry 1.2.0 → 2.0.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 (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
-