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,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
-