juno 0.2.3 → 0.2.4

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 (132) hide show
  1. data/.travis.yml +2 -4
  2. data/Gemfile +3 -1
  3. data/README.md +40 -8
  4. data/benchmarks/run.rb +17 -5
  5. data/lib/juno/adapters/activerecord.rb +23 -14
  6. data/lib/juno/adapters/cassandra.rb +11 -0
  7. data/lib/juno/adapters/couch.rb +9 -0
  8. data/lib/juno/adapters/datamapper.rb +10 -0
  9. data/lib/juno/adapters/dbm.rb +8 -0
  10. data/lib/juno/adapters/file.rb +2 -0
  11. data/lib/juno/adapters/fog.rb +9 -0
  12. data/lib/juno/adapters/gdbm.rb +8 -0
  13. data/lib/juno/adapters/localmemcache.rb +8 -0
  14. data/lib/juno/adapters/lruhash.rb +8 -0
  15. data/lib/juno/adapters/memcached_dalli.rb +9 -0
  16. data/lib/juno/adapters/memcached_native.rb +10 -0
  17. data/lib/juno/adapters/memory.rb +2 -0
  18. data/lib/juno/adapters/mongo.rb +11 -0
  19. data/lib/juno/adapters/null.rb +2 -0
  20. data/lib/juno/adapters/pstore.rb +9 -2
  21. data/lib/juno/adapters/redis.rb +5 -0
  22. data/lib/juno/adapters/riak.rb +9 -0
  23. data/lib/juno/adapters/sdbm.rb +8 -0
  24. data/lib/juno/adapters/sequel.rb +10 -0
  25. data/lib/juno/adapters/sqlite.rb +9 -0
  26. data/lib/juno/adapters/tokyocabinet.rb +16 -4
  27. data/lib/juno/adapters/yaml.rb +2 -0
  28. data/lib/juno/base.rb +1 -0
  29. data/lib/juno/builder.rb +2 -0
  30. data/lib/juno/cache.rb +2 -0
  31. data/lib/juno/expires.rb +1 -0
  32. data/lib/juno/lock.rb +37 -0
  33. data/lib/juno/proxy.rb +1 -0
  34. data/lib/juno/stack.rb +2 -0
  35. data/lib/juno/transformer.rb +16 -4
  36. data/lib/juno/version.rb +3 -1
  37. data/lib/juno.rb +33 -2
  38. data/spec/adapter_activerecord_spec.rb +20 -34
  39. data/spec/adapter_cassandra_spec.rb +9 -23
  40. data/spec/adapter_couch_spec.rb +9 -23
  41. data/spec/adapter_datamapper_spec.rb +36 -50
  42. data/spec/adapter_dbm_spec.rb +9 -23
  43. data/spec/adapter_file_spec.rb +9 -23
  44. data/spec/adapter_fog_spec.rb +12 -29
  45. data/spec/adapter_gdbm_spec.rb +9 -23
  46. data/spec/adapter_localmemcache_spec.rb +9 -23
  47. data/spec/adapter_lruhash_spec.rb +24 -38
  48. data/spec/adapter_memcached_dalli_spec.rb +10 -24
  49. data/spec/adapter_memcached_native_spec.rb +10 -24
  50. data/spec/adapter_memcached_spec.rb +10 -24
  51. data/spec/adapter_memory_spec.rb +24 -38
  52. data/spec/adapter_mongo_spec.rb +9 -23
  53. data/spec/adapter_pstore_spec.rb +12 -26
  54. data/spec/adapter_redis_spec.rb +10 -24
  55. data/spec/adapter_riak_spec.rb +9 -23
  56. data/spec/adapter_sdbm_spec.rb +9 -23
  57. data/spec/adapter_sequel_spec.rb +9 -23
  58. data/spec/adapter_sqlite_spec.rb +9 -23
  59. data/spec/adapter_tokyocabinet_bdb_spec.rb +13 -0
  60. data/spec/adapter_tokyocabinet_hdb_spec.rb +13 -0
  61. data/spec/adapter_yaml_spec.rb +12 -26
  62. data/spec/cache_file_memory_spec.rb +22 -43
  63. data/spec/cache_memory_null_spec.rb +13 -34
  64. data/spec/expires_file_spec.rb +56 -76
  65. data/spec/expires_memory_spec.rb +35 -54
  66. data/spec/generate.rb +147 -160
  67. data/spec/helper.rb +39 -0
  68. data/spec/junospecs.rb +612 -610
  69. data/spec/lock_spec.rb +31 -0
  70. data/spec/null_adapter_spec.rb +15 -29
  71. data/spec/proxy_expires_memory_spec.rb +37 -58
  72. data/spec/proxy_redis_spec.rb +13 -33
  73. data/spec/simple_activerecord_spec.rb +34 -48
  74. data/spec/simple_activerecord_with_expires_spec.rb +35 -49
  75. data/spec/simple_cassandra_spec.rb +35 -49
  76. data/spec/simple_couch_spec.rb +34 -48
  77. data/spec/simple_couch_with_expires_spec.rb +35 -49
  78. data/spec/simple_datamapper_spec.rb +34 -48
  79. data/spec/simple_datamapper_with_expires_spec.rb +35 -49
  80. data/spec/simple_datamapper_with_repository_spec.rb +34 -48
  81. data/spec/simple_dbm_spec.rb +34 -48
  82. data/spec/simple_dbm_with_expires_spec.rb +35 -49
  83. data/spec/simple_file_spec.rb +34 -48
  84. data/spec/simple_file_with_expires_spec.rb +35 -49
  85. data/spec/simple_fog_spec.rb +37 -54
  86. data/spec/simple_fog_with_expires_spec.rb +39 -57
  87. data/spec/simple_gdbm_spec.rb +34 -48
  88. data/spec/simple_gdbm_with_expires_spec.rb +35 -49
  89. data/spec/simple_hashfile_spec.rb +34 -48
  90. data/spec/simple_hashfile_with_expires_spec.rb +35 -49
  91. data/spec/simple_localmemcache_spec.rb +34 -48
  92. data/spec/simple_localmemcache_with_expires_spec.rb +35 -49
  93. data/spec/simple_lruhash_spec.rb +34 -48
  94. data/spec/simple_lruhash_with_expires_spec.rb +35 -49
  95. data/spec/simple_memcached_dalli_spec.rb +35 -49
  96. data/spec/simple_memcached_native_spec.rb +35 -49
  97. data/spec/simple_memcached_spec.rb +35 -49
  98. data/spec/simple_memory_spec.rb +34 -48
  99. data/spec/simple_memory_with_expires_spec.rb +35 -49
  100. data/spec/simple_mongo_spec.rb +34 -48
  101. data/spec/simple_mongo_with_expires_spec.rb +35 -49
  102. data/spec/simple_null_spec.rb +25 -39
  103. data/spec/simple_pstore_spec.rb +34 -48
  104. data/spec/simple_pstore_with_expires_spec.rb +35 -49
  105. data/spec/simple_redis_spec.rb +35 -49
  106. data/spec/simple_riak_spec.rb +34 -48
  107. data/spec/simple_riak_with_expires_spec.rb +35 -49
  108. data/spec/simple_sdbm_spec.rb +34 -48
  109. data/spec/simple_sdbm_with_expires_spec.rb +35 -49
  110. data/spec/simple_sequel_spec.rb +34 -48
  111. data/spec/simple_sequel_with_expires_spec.rb +35 -49
  112. data/spec/simple_sqlite_spec.rb +34 -48
  113. data/spec/simple_sqlite_with_expires_spec.rb +35 -49
  114. data/spec/simple_tokyocabinet_spec.rb +34 -48
  115. data/spec/simple_tokyocabinet_with_expires_spec.rb +35 -49
  116. data/spec/simple_yaml_spec.rb +34 -48
  117. data/spec/simple_yaml_with_expires_spec.rb +35 -49
  118. data/spec/stack_file_memory_spec.rb +15 -38
  119. data/spec/stack_memory_file_spec.rb +14 -37
  120. data/spec/transformer_bson_spec.rb +20 -39
  121. data/spec/transformer_compress_spec.rb +17 -36
  122. data/spec/transformer_json_spec.rb +20 -39
  123. data/spec/transformer_marshal_base64_spec.rb +36 -55
  124. data/spec/transformer_marshal_escape_spec.rb +36 -55
  125. data/spec/transformer_marshal_md5_spec.rb +36 -55
  126. data/spec/transformer_marshal_md5_spread_spec.rb +36 -55
  127. data/spec/transformer_msgpack_spec.rb +20 -39
  128. data/spec/transformer_ox_spec.rb +40 -0
  129. data/spec/transformer_yaml_spec.rb +35 -54
  130. metadata +11 -6
  131. data/spec/adapter_tokyocabinet_spec.rb +0 -27
  132. data/spec/simpl_memory_with_expires_spec.rb +0 -53
data/spec/generate.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  ADAPTER_SPECS = [:null_stringkey_stringvalue, :store_stringkey_stringvalue, :returndifferent_stringkey_stringvalue]
2
2
  SIMPLE_SPECS = [:null, :store, :returndifferent, :marshallable_key]
3
3
  EXPIRES_SPECS = SIMPLE_SPECS + [:expires_stringkey_stringvalue]
4
+ header = "# Generated by #{__FILE__} at #{Time.now.to_s}, #{`git describe --all --long`}"
4
5
 
5
6
  TESTS = {
6
7
  'simple_memory' => {
@@ -120,17 +121,17 @@ TESTS = {
120
121
  'simple_memcached' => {
121
122
  :store => :Memcached,
122
123
  :specs => EXPIRES_SPECS,
123
- :options => ':server => "localhost:22122", :namespace => "simple_memcached"'
124
+ :options => ':namespace => "simple_memcached"'
124
125
  },
125
126
  'simple_memcached_dalli' => {
126
127
  :store => :MemcachedDalli,
127
128
  :specs => EXPIRES_SPECS,
128
- :options => ':server => "localhost:22122", :namespace => "simple_memcached_dalli"'
129
+ :options => ':namespace => "simple_memcached_dalli"'
129
130
  },
130
131
  'simple_memcached_native' => {
131
132
  :store => :MemcachedNative,
132
133
  :specs => EXPIRES_SPECS,
133
- :options => ':server => "localhost:22122", :namespace => "simple_memcached_native"'
134
+ :options => ':namespace => "simple_memcached_native"'
134
135
  },
135
136
  'simple_riak' => {
136
137
  :store => :Riak,
@@ -229,16 +230,14 @@ TESTS = {
229
230
  :specs => EXPIRES_SPECS
230
231
  },
231
232
  'expires_memory' => {
232
- :build => %{
233
- Juno.build do
233
+ :build => %{Juno.build do
234
234
  use :Expires
235
235
  adapter :Memory
236
236
  end},
237
237
  :specs => [:null, :store, :expires]
238
238
  },
239
239
  'expires_file' => {
240
- :build => %{
241
- Juno.build do
240
+ :build => %{Juno.build do
242
241
  use :Expires
243
242
  use :Transformer, :key => [:marshal, :escape], :value => :marshal
244
243
  adapter :File, :dir => File.join(make_tempdir, "expires-file")
@@ -246,20 +245,19 @@ end},
246
245
  :specs => [:null, :store, :expires, :returndifferent, :marshallable_key],
247
246
  :tests => %{
248
247
  it 'should delete expired value in underlying file storage' do
249
- @store.store('foo', 'bar', :expires => 2)
250
- @store['foo'].should == 'bar'
248
+ store.store('foo', 'bar', :expires => 2)
249
+ store['foo'].should == 'bar'
251
250
  sleep 1
252
- @store['foo'].should == 'bar'
251
+ store['foo'].should == 'bar'
253
252
  sleep 2
254
- @store['foo'].should == nil
255
- @store.adapter['foo'].should == nil
256
- @store.adapter.adapter['foo'].should == nil
253
+ store['foo'].should == nil
254
+ store.adapter['foo'].should == nil
255
+ store.adapter.adapter['foo'].should == nil
257
256
  end
258
257
  }
259
258
  },
260
259
  'proxy_redis' => {
261
- :build => %{
262
- Juno.build do
260
+ :build => %{Juno.build do
263
261
  use :Proxy
264
262
  use :Proxy
265
263
  adapter :Redis
@@ -267,8 +265,7 @@ end},
267
265
  :specs => ADAPTER_SPECS + [:expires_stringkey_stringvalue]
268
266
  },
269
267
  'proxy_expires_memory' => {
270
- :build => %{
271
- Juno.build do
268
+ :build => %{Juno.build do
272
269
  use :Proxy
273
270
  use :Expires
274
271
  use :Proxy
@@ -277,8 +274,7 @@ end},
277
274
  :specs => [:null, :store, :expires]
278
275
  },
279
276
  'cache_file_memory' => {
280
- :build => %{
281
- Juno.build do
277
+ :build => %{Juno.build do
282
278
  use(:Cache) do
283
279
  backend { adapter :File, :dir => File.join(make_tempdir, "cache_file_memory") }
284
280
  cache { adapter :Memory }
@@ -287,20 +283,19 @@ end},
287
283
  :specs => ADAPTER_SPECS,
288
284
  :tests => %{
289
285
  it 'should store loaded values in cache' do
290
- @store.backend['foo'] = 'bar'
291
- @store.cache['foo'].should == nil
292
- @store['foo'].should == 'bar'
293
- @store.cache['foo'].should == 'bar'
294
- @store.backend.delete('foo')
295
- @store['foo'].should == 'bar'
296
- @store.delete('foo')
297
- @store['foo'].should == nil
286
+ store.backend['foo'] = 'bar'
287
+ store.cache['foo'].should == nil
288
+ store['foo'].should == 'bar'
289
+ store.cache['foo'].should == 'bar'
290
+ store.backend.delete('foo')
291
+ store['foo'].should == 'bar'
292
+ store.delete('foo')
293
+ store['foo'].should == nil
298
294
  end
299
295
  }
300
296
  },
301
297
  'cache_memory_null' => {
302
- :build => %{
303
- Juno.build do
298
+ :build => %{Juno.build do
304
299
  use(:Cache) do
305
300
  backend(Juno::Adapters::Memory.new)
306
301
  cache(Juno::Adapters::Null.new)
@@ -309,8 +304,7 @@ end},
309
304
  :specs => ADAPTER_SPECS
310
305
  },
311
306
  'stack_file_memory' => {
312
- :build => %{
313
- Juno.build do
307
+ :build => %{Juno.build do
314
308
  use(:Stack) do
315
309
  add(Juno.new(:Null))
316
310
  add(Juno::Adapters::Null.new)
@@ -321,8 +315,7 @@ end},
321
315
  :specs => ADAPTER_SPECS
322
316
  },
323
317
  'stack_memory_file' => {
324
- :build => %{
325
- Juno.build do
318
+ :build => %{Juno.build do
326
319
  use(:Stack) do
327
320
  add(Juno.new(:Null))
328
321
  add(Juno::Adapters::Null.new)
@@ -332,9 +325,15 @@ Juno.build do
332
325
  end},
333
326
  :specs => [:null_stringkey_stringvalue, :store_stringkey_stringvalue]
334
327
  },
328
+ 'lock' => {
329
+ :build => %{Juno.build do
330
+ use :Lock
331
+ adapter :Memory
332
+ end},
333
+ :specs => [:null, :store]
334
+ },
335
335
  'transformer_compress' => {
336
- :build => %{
337
- Juno.build do
336
+ :build => %{Juno.build do
338
337
  use :Transformer, :value => :compress
339
338
  adapter :Memory
340
339
  end},
@@ -342,8 +341,7 @@ end},
342
341
  :specs => [:null, :store, :returndifferent]
343
342
  },
344
343
  'transformer_json' => {
345
- :build => %{
346
- Juno.build do
344
+ :build => %{Juno.build do
347
345
  use :Transformer, :key => :json, :value => :json
348
346
  adapter :Memory
349
347
  end},
@@ -352,8 +350,7 @@ end},
352
350
  :specs => [:null, :store, :returndifferent]
353
351
  },
354
352
  'transformer_bson' => {
355
- :build => %{
356
- Juno.build do
353
+ :build => %{Juno.build do
357
354
  use :Transformer, :key => :bson, :value => :bson
358
355
  adapter :Memory
359
356
  end},
@@ -361,9 +358,15 @@ end},
361
358
  :value => %w(Hash String),
362
359
  :specs => [:null, :store, :returndifferent]
363
360
  },
361
+ 'transformer_ox' => {
362
+ :build => %{Juno.build do
363
+ use :Transformer, :key => :ox, :value => :ox
364
+ adapter :Memory
365
+ end},
366
+ :specs => [:null, :store, :returndifferent]
367
+ },
364
368
  # 'transformer_tnet' => {
365
- # :build => %{
366
- #Juno.build do
369
+ # :build => %{Juno.build do
367
370
  # use :Transformer, :key => :tnet, :value => :tnet
368
371
  # adapter :Memory
369
372
  #end},
@@ -372,8 +375,7 @@ end},
372
375
  # :specs => [:null, :store, :returndifferent]
373
376
  # },
374
377
  'transformer_msgpack' => {
375
- :build => %{
376
- Juno.build do
378
+ :build => %{Juno.build do
377
379
  use :Transformer, :key => :msgpack, :value => :msgpack
378
380
  adapter :Memory
379
381
  end},
@@ -382,40 +384,35 @@ end},
382
384
  :specs => [:null, :store, :returndifferent]
383
385
  },
384
386
  'transformer_yaml' => {
385
- :build => %{
386
- Juno.build do
387
+ :build => %{Juno.build do
387
388
  use :Transformer, :key => :yaml, :value => :yaml
388
389
  adapter :Memory
389
390
  end},
390
391
  :specs => [:null, :store, :returndifferent]
391
392
  },
392
393
  'transformer_marshal_base64' => {
393
- :build => %{
394
- Juno.build do
394
+ :build => %{Juno.build do
395
395
  use :Transformer, :key => [:marshal, :base64], :value => [:marshal, :base64]
396
396
  adapter :Memory
397
397
  end},
398
398
  :specs => [:null, :store, :returndifferent, :marshallable_key]
399
399
  },
400
400
  'transformer_marshal_escape' => {
401
- :build => %{
402
- Juno.build do
401
+ :build => %{Juno.build do
403
402
  use :Transformer, :key => [:marshal, :escape], :value => :marshal
404
403
  adapter :Memory
405
404
  end},
406
405
  :specs => [:null, :store, :returndifferent, :marshallable_key]
407
406
  },
408
407
  'transformer_marshal_md5' => {
409
- :build => %{
410
- Juno.build do
408
+ :build => %{Juno.build do
411
409
  use :Transformer, :key => [:marshal, :md5], :value => :marshal
412
410
  adapter :Memory
413
411
  end},
414
412
  :specs => [:null, :store, :returndifferent, :marshallable_key]
415
413
  },
416
414
  'transformer_marshal_md5_spread' => {
417
- :build => %{
418
- Juno.build do
415
+ :build => %{Juno.build do
419
416
  use :Transformer, :key => [:marshal, :md5, :spread], :value => :marshal
420
417
  adapter :Memory
421
418
  end},
@@ -426,9 +423,9 @@ end},
426
423
  :specs => ADAPTER_SPECS,
427
424
  :tests => %{
428
425
  it 'updates an existing key/value' do
429
- @store['foo/bar'] = '1'
430
- @store['foo/bar'] = '2'
431
- records = @store.table.find :all, :conditions => { :k => 'foo/bar' }
426
+ store['foo/bar'] = '1'
427
+ store['foo/bar'] = '2'
428
+ records = store.table.find :all, :conditions => { :k => 'foo/bar' }
432
429
  records.count.should == 1
433
430
  end
434
431
 
@@ -512,15 +509,15 @@ end
512
509
  :specs => ADAPTER_SPECS
513
510
  },
514
511
  'adapter_memcached_dalli' => {
515
- :build => 'Juno::Adapters::MemcachedDalli.new(:server => "localhost:22122", :namespace => "adapter_memcached_dalli")',
512
+ :build => 'Juno::Adapters::MemcachedDalli.new(:namespace => "adapter_memcached_dalli")',
516
513
  :specs => ADAPTER_SPECS + [:expires_stringkey_stringvalue]
517
514
  },
518
515
  'adapter_memcached_native' => {
519
- :build => 'Juno::Adapters::MemcachedNative.new(:server => "localhost:22122", :namespace => "adapter_memcached_native")',
516
+ :build => 'Juno::Adapters::MemcachedNative.new(:namespace => "adapter_memcached_native")',
520
517
  :specs => ADAPTER_SPECS + [:expires_stringkey_stringvalue]
521
518
  },
522
519
  'adapter_memcached' => {
523
- :build => 'Juno::Adapters::Memcached.new(:server => "localhost:22122", :namespace => "adapter_memcached")',
520
+ :build => 'Juno::Adapters::Memcached.new(:namespace => "adapter_memcached")',
524
521
  :specs => ADAPTER_SPECS + [:expires_stringkey_stringvalue]
525
522
  },
526
523
  'adapter_memory' => {
@@ -564,8 +561,12 @@ end
564
561
  :build => 'Juno::Adapters::Sqlite.new(:file => File.join(make_tempdir, "adapter_sqlite"))',
565
562
  :specs => ADAPTER_SPECS
566
563
  },
567
- 'adapter_tokyocabinet' => {
568
- :build => 'Juno::Adapters::TokyoCabinet.new(:file => File.join(make_tempdir, "adapter_tokyocabinet"))',
564
+ 'adapter_tokyocabinet_bdb' => {
565
+ :build => 'Juno::Adapters::TokyoCabinet.new(:file => File.join(make_tempdir, "adapter_tokyocabinet_bdb"), :type => :bdb)',
566
+ :specs => ADAPTER_SPECS
567
+ },
568
+ 'adapter_tokyocabinet_hdb' => {
569
+ :build => 'Juno::Adapters::TokyoCabinet.new(:file => File.join(make_tempdir, "adapter_tokyocabinet_hdb"), :type => :hdb)',
569
570
  :specs => ADAPTER_SPECS
570
571
  },
571
572
  'adapter_yaml' => {
@@ -594,163 +595,163 @@ KEYS.each do |key_type, (key1,key2)|
594
595
  VALUES.each do |val_type, (val1,val2)|
595
596
 
596
597
  code = %{it "reads from keys that are #{key_type}s like a Hash" do
597
- @store[#{key1}].should == nil
598
- @store.load(#{key1}).should == nil
598
+ store[#{key1}].should == nil
599
+ store.load(#{key1}).should == nil
599
600
  end
600
601
 
601
602
  it "guarantees that the same #{val_type} value is returned when setting a #{key_type} key" do
602
603
  value = #{val1}
603
- (@store[#{key1}] = value).should equal(value)
604
+ (store[#{key1}] = value).should equal(value)
604
605
  end
605
606
 
606
607
  it "returns false from key? if a #{key_type} key is not available" do
607
- @store.key?(#{key1}).should == false
608
+ store.key?(#{key1}).should == false
608
609
  end
609
610
 
610
611
  it "returns nil from delete if an element for a #{key_type} key does not exist" do
611
- @store.delete(#{key1}).should == nil
612
+ store.delete(#{key1}).should == nil
612
613
  end
613
614
 
614
615
  it "removes all #{key_type} keys from the store with clear" do
615
- @store[#{key1}] = #{val1}
616
- @store[#{key2}] = #{val2}
617
- @store.clear.should equal(@store)
618
- @store.key?(#{key1}).should_not == true
619
- @store.key?(#{key2}).should_not == true
616
+ store[#{key1}] = #{val1}
617
+ store[#{key2}] = #{val2}
618
+ store.clear.should equal(store)
619
+ store.key?(#{key1}).should_not == true
620
+ store.key?(#{key2}).should_not == true
620
621
  end
621
622
 
622
623
  it "fetches a #{key_type} key with a default value with fetch, if the key is not available" do
623
- @store.fetch(#{key1}, #{val1}).should == #{val1}
624
+ store.fetch(#{key1}, #{val1}).should == #{val1}
624
625
  end
625
626
 
626
627
  it "fetches a #{key_type} key with a block with fetch, if the key is not available" do
627
628
  key = #{key1}
628
629
  value = #{val1}
629
- @store.fetch(key) do |k|
630
+ store.fetch(key) do |k|
630
631
  k.should equal(key)
631
632
  value
632
633
  end.should equal(value)
633
634
  end
634
635
 
635
636
  it 'should accept options' do
636
- @store.key?(#{key1}, :option1 => 1).should == false
637
- @store.load(#{key1}, :option2 => 2).should == nil
638
- @store.fetch(#{key1}, nil, :option3 => 3).should == nil
639
- @store.delete(#{key1}, :option4 => 4).should == nil
640
- @store.clear(:option5 => 5).should equal(@store)
641
- @store.store(#{key1}, #{val1}, :option6 => 6).should == #{val1}
637
+ store.key?(#{key1}, :option1 => 1).should == false
638
+ store.load(#{key1}, :option2 => 2).should == nil
639
+ store.fetch(#{key1}, nil, :option3 => 3).should == nil
640
+ store.delete(#{key1}, :option4 => 4).should == nil
641
+ store.clear(:option5 => 5).should equal(store)
642
+ store.store(#{key1}, #{val1}, :option6 => 6).should == #{val1}
642
643
  end}
643
644
  SPECS["null_#{key_type.downcase}key_#{val_type.downcase}value"] = code
644
645
 
645
646
  code = %{it "writes #{val_type} values to keys that are #{key_type}s like a Hash" do
646
- @store[#{key1}] = #{val1}
647
- @store[#{key1}].should == #{val1}
648
- @store.load(#{key1}).should == #{val1}
647
+ store[#{key1}] = #{val1}
648
+ store[#{key1}].should == #{val1}
649
+ store.load(#{key1}).should == #{val1}
649
650
  end
650
651
 
651
652
  it "returns true from key? if a #{key_type} key is available" do
652
- @store[#{key1}] = #{val1}
653
- @store.key?(#{key1}).should == true
653
+ store[#{key1}] = #{val1}
654
+ store.key?(#{key1}).should == true
654
655
  end
655
656
 
656
657
  it "stores #{val_type} values with #{key_type} keys with #store" do
657
658
  value = #{val1}
658
- @store.store(#{key1}, value).should equal(value)
659
- @store[#{key1}].should == #{val1}
660
- @store.load(#{key1}).should == #{val1}
659
+ store.store(#{key1}, value).should equal(value)
660
+ store[#{key1}].should == #{val1}
661
+ store.load(#{key1}).should == #{val1}
661
662
  end
662
663
 
663
664
  it "removes and returns a #{val_type} element with a #{key_type} key from the backing store via delete if it exists" do
664
- @store[#{key1}] = #{val1}
665
- @store.delete(#{key1}).should == #{val1}
666
- @store.key?(#{key1}).should == false
665
+ store[#{key1}] = #{val1}
666
+ store.delete(#{key1}).should == #{val1}
667
+ store.key?(#{key1}).should == false
667
668
  end
668
669
 
669
670
  it "overwrites existing #{val_type} values with #{key_type}" do
670
- @store[#{key1}] = #{val1}
671
- @store[#{key1}].should == #{val1}
672
- @store[#{key1}] = #{val2}
673
- @store[#{key1}].should == #{val2}
671
+ store[#{key1}] = #{val1}
672
+ store[#{key1}].should == #{val1}
673
+ store[#{key1}] = #{val2}
674
+ store[#{key1}].should == #{val2}
674
675
  end
675
676
 
676
677
  it "does not run the block if the #{key_type} key is available" do
677
- @store[#{key1}] = #{val1}
678
+ store[#{key1}] = #{val1}
678
679
  unaltered = "unaltered"
679
- @store.fetch(#{key1}) { unaltered = "altered" }
680
+ store.fetch(#{key1}) { unaltered = "altered" }
680
681
  unaltered.should == "unaltered"
681
682
  end
682
683
 
683
684
  it "fetches a #{key_type} key with a default value with fetch, if the key is available" do
684
- @store[#{key1}] = #{val1}
685
- @store.fetch(#{key1}, #{val2}).should == #{val1}
685
+ store[#{key1}] = #{val1}
686
+ store.fetch(#{key1}, #{val2}).should == #{val1}
686
687
  end}
687
688
  SPECS["store_#{key_type.downcase}key_#{val_type.downcase}value"] = code
688
689
 
689
690
  code = %{it "guarantees that a different #{val_type} value is retrieved from the #{key_type} key" do
690
691
  value = #{val1}
691
- @store[#{key1}] = #{val1}
692
- @store[#{key1}].should_not be_equal(#{val1})
692
+ store[#{key1}] = #{val1}
693
+ store[#{key1}].should_not be_equal(#{val1})
693
694
  end}
694
695
  SPECS["returndifferent_#{key_type.downcase}key_#{val_type.downcase}value"] = code
695
696
 
696
697
  code = %{it 'should support expires on store and #[]' do
697
- @store.store(#{key1}, #{val1}, :expires => 2)
698
- @store[#{key1}].should == #{val1}
698
+ store.store(#{key1}, #{val1}, :expires => 2)
699
+ store[#{key1}].should == #{val1}
699
700
  sleep 1
700
- @store[#{key1}].should == #{val1}
701
+ store[#{key1}].should == #{val1}
701
702
  sleep 2
702
- @store[#{key1}].should == nil
703
+ store[#{key1}].should == nil
703
704
  end
704
705
 
705
706
  it 'should support expires on store and load' do
706
- @store.store(#{key1}, #{val1}, :expires => 2)
707
- @store.load(#{key1}).should == #{val1}
707
+ store.store(#{key1}, #{val1}, :expires => 2)
708
+ store.load(#{key1}).should == #{val1}
708
709
  sleep 1
709
- @store.load(#{key1}).should == #{val1}
710
+ store.load(#{key1}).should == #{val1}
710
711
  sleep 2
711
- @store.load(#{key1}).should == nil
712
+ store.load(#{key1}).should == nil
712
713
  end
713
714
 
714
715
  it 'should support expires on store and key?' do
715
- @store.store(#{key1}, #{val1}, :expires => 2)
716
- @store.key?(#{key1}).should == true
716
+ store.store(#{key1}, #{val1}, :expires => 2)
717
+ store.key?(#{key1}).should == true
717
718
  sleep 1
718
- @store.key?(#{key1}).should == true
719
+ store.key?(#{key1}).should == true
719
720
  sleep 2
720
- @store.key?(#{key1}).should == false
721
+ store.key?(#{key1}).should == false
721
722
  end
722
723
 
723
724
  it 'should support updating the expiration time in load' do
724
- @store.store(#{key2}, #{val2}, :expires => 2)
725
- @store[#{key2}].should == #{val2}
725
+ store.store(#{key2}, #{val2}, :expires => 2)
726
+ store[#{key2}].should == #{val2}
726
727
  sleep 1
727
- @store.load(#{key2}, :expires => 3).should == #{val2}
728
- @store[#{key2}].should == #{val2}
728
+ store.load(#{key2}, :expires => 3).should == #{val2}
729
+ store[#{key2}].should == #{val2}
729
730
  sleep 1
730
- @store[#{key2}].should == #{val2}
731
+ store[#{key2}].should == #{val2}
731
732
  sleep 3
732
- @store[#{key2}].should == nil
733
+ store[#{key2}].should == nil
733
734
  end
734
735
 
735
736
  it 'should support updating the expiration time in fetch' do
736
- @store.store(#{key1}, #{val1}, :expires => 2)
737
- @store[#{key1}].should == #{val1}
737
+ store.store(#{key1}, #{val1}, :expires => 2)
738
+ store[#{key1}].should == #{val1}
738
739
  sleep 1
739
- @store.fetch(#{key1}, nil, :expires => 3).should == #{val1}
740
- @store[#{key1}].should == #{val1}
740
+ store.fetch(#{key1}, nil, :expires => 3).should == #{val1}
741
+ store[#{key1}].should == #{val1}
741
742
  sleep 1
742
- @store[#{key1}].should == #{val1}
743
+ store[#{key1}].should == #{val1}
743
744
  sleep 3
744
- @store[#{key1}].should == nil
745
+ store[#{key1}].should == nil
745
746
  end
746
747
 
747
748
  it 'should respect expires in delete' do
748
- @store.store(#{key2}, #{val2}, :expires => 2)
749
- @store[#{key2}].should == #{val2}
749
+ store.store(#{key2}, #{val2}, :expires => 2)
750
+ store[#{key2}].should == #{val2}
750
751
  sleep 1
751
- @store[#{key2}].should == #{val2}
752
+ store[#{key2}].should == #{val2}
752
753
  sleep 2
753
- @store.delete(#{key2}).should == nil
754
+ store.delete(#{key2}).should == nil
754
755
  end}
755
756
  SPECS["expires_#{key_type.downcase}key_#{val_type.downcase}value"] = code
756
757
 
@@ -759,47 +760,47 @@ end
759
760
 
760
761
  SPECS["marshallable_key"] = %{it "refuses to #[] from keys that cannot be marshalled" do
761
762
  expect do
762
- @store[Struct.new(:foo).new(:bar)]
763
+ store[Struct.new(:foo).new(:bar)]
763
764
  end.to raise_error(marshal_error)
764
765
  end
765
766
 
766
767
  it "refuses to load from keys that cannot be marshalled" do
767
768
  expect do
768
- @store.load(Struct.new(:foo).new(:bar))
769
+ store.load(Struct.new(:foo).new(:bar))
769
770
  end.to raise_error(marshal_error)
770
771
  end
771
772
 
772
773
  it "refuses to fetch from keys that cannot be marshalled" do
773
774
  expect do
774
- @store.fetch(Struct.new(:foo).new(:bar), true)
775
+ store.fetch(Struct.new(:foo).new(:bar), true)
775
776
  end.to raise_error(marshal_error)
776
777
  end
777
778
 
778
779
  it "refuses to #[]= to keys that cannot be marshalled" do
779
780
  expect do
780
- @store[Struct.new(:foo).new(:bar)] = 'value'
781
+ store[Struct.new(:foo).new(:bar)] = 'value'
781
782
  end.to raise_error(marshal_error)
782
783
  end
783
784
 
784
785
  it "refuses to store to keys that cannot be marshalled" do
785
786
  expect do
786
- @store.store Struct.new(:foo).new(:bar), 'value'
787
+ store.store Struct.new(:foo).new(:bar), 'value'
787
788
  end.to raise_error(marshal_error)
788
789
  end
789
790
 
790
791
  it "refuses to check for key? if the key cannot be marshalled" do
791
792
  expect do
792
- @store.key? Struct.new(:foo).new(:bar)
793
+ store.key? Struct.new(:foo).new(:bar)
793
794
  end.to raise_error(marshal_error)
794
795
  end
795
796
 
796
797
  it "refuses to delete a key if the key cannot be marshalled" do
797
798
  expect do
798
- @store.delete Struct.new(:foo).new(:bar)
799
+ store.delete Struct.new(:foo).new(:bar)
799
800
  end.to raise_error(marshal_error)
800
801
  end}
801
802
 
802
- specs_code = ''
803
+ specs_code = "#{header}\n"
803
804
  SPECS.each do |key, code|
804
805
  specs_code << "#################### #{key} ####################\n\n" <<
805
806
  "shared_examples_for '#{key}' do\n " << code.gsub("\n", "\n ") << "\nend\n\n"
@@ -814,13 +815,13 @@ TESTS.each do |name, options|
814
815
  value = [options.delete(:value) || %w(Object String Hash)].flatten
815
816
 
816
817
  specs = [options.delete(:specs) || SIMPLE_SPECS].flatten
817
- specs_code = ''
818
+ specs_code = []
818
819
  specs.each do |s|
819
- specs_code << " it_should_behave_like '#{s}'\n" if SPECS[s.to_s]
820
+ specs_code << " it_should_behave_like '#{s}'" if SPECS[s.to_s]
820
821
  key.each do |k|
821
822
  value.each do |v|
822
823
  x = "#{s}_#{k.downcase}key_#{v.downcase}value"
823
- specs_code << " it_should_behave_like '#{x}'\n" if SPECS[x]
824
+ specs_code << " it_should_behave_like '#{x}'" if SPECS[x]
824
825
  end
825
826
  end
826
827
  end
@@ -831,29 +832,15 @@ TESTS.each do |name, options|
831
832
 
832
833
  build ||= "Juno.new(#{store.inspect}#{opts})"
833
834
 
834
- code = %{# Generated file
835
- require 'helper'
836
-
837
- begin
838
- #{preamble}#{build}.close
839
-
840
- describe #{name.inspect} do
841
- before do
842
- @store = #{build}
843
- @store.clear
844
- end
845
-
846
- after do
847
- @store.close.should == nil if @store
848
- end
835
+ code = %{#{header}require 'helper'
849
836
 
850
- #{specs_code}#{options[:tests].to_s.gsub("\n", "\n ")}
837
+ describe_juno #{name.inspect} do
838
+ #{preamble}def new_store
839
+ #{build.gsub("\n", "\n ")}
851
840
  end
852
- rescue LoadError => ex
853
- puts "Test #{name} not executed: \#{ex.message}"
854
- rescue Exception => ex
855
- puts "Test #{name} not executed: \#{ex.message}"
856
- #puts "\#{ex.backtrace.join("\\n")}"
841
+
842
+ include_context 'setup_store'
843
+ #{specs_code.join("\n")}#{options[:tests].to_s.gsub("\n", "\n ")}
857
844
  end
858
845
  }
859
846
 
data/spec/helper.rb CHANGED
@@ -37,3 +37,42 @@ def marshal_error
37
37
  TypeError
38
38
  end
39
39
  end
40
+
41
+ class InitializeStore
42
+ def initialize(&block)
43
+ instance_eval(&block)
44
+ store = new_store
45
+ store['foo'] = 'bar'
46
+ store.clear
47
+ store.close
48
+ end
49
+
50
+ def method_missing(*args)
51
+ end
52
+ end
53
+
54
+ def describe_juno(name, &block)
55
+ begin
56
+ InitializeStore.new(&block)
57
+ describe(name, &block)
58
+ rescue LoadError => ex
59
+ puts "\e[31mTest #{name} not executed: #{ex.message}\e[0m"
60
+ rescue Exception => ex
61
+ puts "\e[31mTest #{name} not executed: #{ex.message}\e[0m"
62
+ puts ex.backtrace.join("\n")
63
+ end
64
+ end
65
+
66
+ shared_context 'setup_store' do
67
+ let(:store) do
68
+ new_store
69
+ end
70
+
71
+ before do
72
+ store.clear
73
+ end
74
+
75
+ after do
76
+ store.close.should == nil if store
77
+ end
78
+ end