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