moneta 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (212) hide show
  1. data/.gitignore +7 -0
  2. data/.travis.yml +39 -0
  3. data/Gemfile +61 -0
  4. data/LICENSE +2 -2
  5. data/README.md +450 -0
  6. data/Rakefile +29 -51
  7. data/SPEC.md +75 -0
  8. data/benchmarks/run.rb +195 -0
  9. data/lib/action_dispatch/middleware/session/moneta_store.rb +11 -0
  10. data/lib/active_support/cache/moneta_store.rb +55 -0
  11. data/lib/moneta.rb +121 -67
  12. data/lib/moneta/adapters/activerecord.rb +87 -0
  13. data/lib/moneta/adapters/cassandra.rb +91 -0
  14. data/lib/moneta/adapters/client.rb +69 -0
  15. data/lib/moneta/adapters/cookie.rb +35 -0
  16. data/lib/moneta/adapters/couch.rb +57 -0
  17. data/lib/moneta/adapters/datamapper.rb +75 -0
  18. data/lib/moneta/adapters/dbm.rb +25 -0
  19. data/lib/moneta/adapters/file.rb +79 -0
  20. data/lib/moneta/adapters/fog.rb +51 -0
  21. data/lib/moneta/adapters/gdbm.rb +25 -0
  22. data/lib/moneta/adapters/hbase.rb +101 -0
  23. data/lib/moneta/adapters/leveldb.rb +35 -0
  24. data/lib/moneta/adapters/localmemcache.rb +28 -0
  25. data/lib/moneta/adapters/lruhash.rb +85 -0
  26. data/lib/moneta/adapters/memcached.rb +11 -0
  27. data/lib/moneta/adapters/memcached_dalli.rb +69 -0
  28. data/lib/moneta/adapters/memcached_native.rb +70 -0
  29. data/lib/moneta/adapters/memory.rb +10 -0
  30. data/lib/moneta/adapters/mongo.rb +50 -0
  31. data/lib/moneta/adapters/null.rb +30 -0
  32. data/lib/moneta/adapters/pstore.rb +69 -0
  33. data/lib/moneta/adapters/redis.rb +68 -0
  34. data/lib/moneta/adapters/riak.rb +57 -0
  35. data/lib/moneta/adapters/sdbm.rb +35 -0
  36. data/lib/moneta/adapters/sequel.rb +79 -0
  37. data/lib/moneta/adapters/sqlite.rb +65 -0
  38. data/lib/moneta/adapters/tokyocabinet.rb +41 -0
  39. data/lib/moneta/adapters/yaml.rb +15 -0
  40. data/lib/moneta/base.rb +78 -0
  41. data/lib/moneta/builder.rb +39 -0
  42. data/lib/moneta/cache.rb +84 -0
  43. data/lib/moneta/expires.rb +71 -0
  44. data/lib/moneta/lock.rb +25 -0
  45. data/lib/moneta/logger.rb +61 -0
  46. data/lib/moneta/mixins.rb +65 -0
  47. data/lib/moneta/net.rb +18 -0
  48. data/lib/moneta/optionmerger.rb +39 -0
  49. data/lib/moneta/proxy.rb +86 -0
  50. data/lib/moneta/server.rb +81 -0
  51. data/lib/moneta/shared.rb +60 -0
  52. data/lib/moneta/stack.rb +78 -0
  53. data/lib/moneta/transformer.rb +159 -0
  54. data/lib/moneta/transformer/config.rb +42 -0
  55. data/lib/moneta/transformer/helper.rb +37 -0
  56. data/lib/moneta/version.rb +5 -0
  57. data/lib/moneta/wrapper.rb +33 -0
  58. data/lib/rack/cache/moneta.rb +93 -0
  59. data/lib/rack/moneta_cookies.rb +64 -0
  60. data/lib/rack/session/moneta.rb +63 -0
  61. data/moneta.gemspec +19 -0
  62. data/spec/action_dispatch/fixtures/session_autoload_test/foo.rb +10 -0
  63. data/spec/action_dispatch/session_moneta_store_spec.rb +196 -0
  64. data/spec/active_support/cache_moneta_store_spec.rb +197 -0
  65. data/spec/generate.rb +1489 -0
  66. data/spec/helper.rb +91 -0
  67. data/spec/moneta/adapter_activerecord_spec.rb +32 -0
  68. data/spec/moneta/adapter_cassandra_spec.rb +30 -0
  69. data/spec/moneta/adapter_client_spec.rb +19 -0
  70. data/spec/moneta/adapter_cookie_spec.rb +18 -0
  71. data/spec/moneta/adapter_couch_spec.rb +18 -0
  72. data/spec/moneta/adapter_datamapper_spec.rb +49 -0
  73. data/spec/moneta/adapter_dbm_spec.rb +18 -0
  74. data/spec/moneta/adapter_file_spec.rb +18 -0
  75. data/spec/moneta/adapter_fog_spec.rb +23 -0
  76. data/spec/moneta/adapter_gdbm_spec.rb +18 -0
  77. data/spec/moneta/adapter_hbase_spec.rb +18 -0
  78. data/spec/moneta/adapter_leveldb_spec.rb +18 -0
  79. data/spec/moneta/adapter_localmemcache_spec.rb +18 -0
  80. data/spec/moneta/adapter_lruhash_spec.rb +31 -0
  81. data/spec/moneta/adapter_memcached_dalli_spec.rb +30 -0
  82. data/spec/moneta/adapter_memcached_native_spec.rb +31 -0
  83. data/spec/moneta/adapter_memcached_spec.rb +30 -0
  84. data/spec/moneta/adapter_memory_spec.rb +39 -0
  85. data/spec/moneta/adapter_mongo_spec.rb +18 -0
  86. data/spec/moneta/adapter_pstore_spec.rb +21 -0
  87. data/spec/moneta/adapter_redis_spec.rb +30 -0
  88. data/spec/moneta/adapter_riak_spec.rb +22 -0
  89. data/spec/moneta/adapter_sdbm_spec.rb +18 -0
  90. data/spec/moneta/adapter_sequel_spec.rb +18 -0
  91. data/spec/moneta/adapter_sqlite_spec.rb +18 -0
  92. data/spec/moneta/adapter_tokyocabinet_bdb_spec.rb +18 -0
  93. data/spec/moneta/adapter_tokyocabinet_hdb_spec.rb +18 -0
  94. data/spec/moneta/adapter_yaml_spec.rb +21 -0
  95. data/spec/moneta/cache_file_memory_spec.rb +34 -0
  96. data/spec/moneta/cache_memory_null_spec.rb +23 -0
  97. data/spec/moneta/expires_file_spec.rb +76 -0
  98. data/spec/moneta/expires_memory_spec.rb +65 -0
  99. data/spec/moneta/lock_spec.rb +42 -0
  100. data/spec/moneta/null_adapter_spec.rb +26 -0
  101. data/spec/moneta/optionmerger_spec.rb +92 -0
  102. data/spec/moneta/proxy_expires_memory_spec.rb +55 -0
  103. data/spec/moneta/proxy_redis_spec.rb +23 -0
  104. data/spec/moneta/shared_spec.rb +30 -0
  105. data/spec/moneta/simple_activerecord_spec.rb +51 -0
  106. data/spec/moneta/simple_activerecord_with_expires_spec.rb +52 -0
  107. data/spec/moneta/simple_cassandra_spec.rb +52 -0
  108. data/spec/moneta/simple_client_tcp_spec.rb +67 -0
  109. data/spec/moneta/simple_client_unix_spec.rb +53 -0
  110. data/spec/moneta/simple_couch_spec.rb +51 -0
  111. data/spec/moneta/simple_couch_with_expires_spec.rb +52 -0
  112. data/spec/moneta/simple_datamapper_spec.rb +53 -0
  113. data/spec/moneta/simple_datamapper_with_expires_spec.rb +54 -0
  114. data/spec/moneta/simple_datamapper_with_repository_spec.rb +53 -0
  115. data/spec/moneta/simple_dbm_spec.rb +51 -0
  116. data/spec/moneta/simple_dbm_with_expires_spec.rb +52 -0
  117. data/spec/moneta/simple_file_spec.rb +51 -0
  118. data/spec/moneta/simple_file_with_expires_spec.rb +52 -0
  119. data/spec/moneta/simple_fog_spec.rb +56 -0
  120. data/spec/moneta/simple_fog_with_expires_spec.rb +58 -0
  121. data/spec/moneta/simple_gdbm_spec.rb +51 -0
  122. data/spec/moneta/simple_gdbm_with_expires_spec.rb +52 -0
  123. data/spec/moneta/simple_hashfile_spec.rb +51 -0
  124. data/spec/moneta/simple_hashfile_with_expires_spec.rb +52 -0
  125. data/spec/moneta/simple_hbase_spec.rb +51 -0
  126. data/spec/moneta/simple_hbase_with_expires_spec.rb +52 -0
  127. data/spec/moneta/simple_leveldb_spec.rb +51 -0
  128. data/spec/moneta/simple_leveldb_with_expires_spec.rb +52 -0
  129. data/spec/moneta/simple_localmemcache_spec.rb +51 -0
  130. data/spec/moneta/simple_localmemcache_with_expires_spec.rb +52 -0
  131. data/spec/moneta/simple_lruhash_spec.rb +51 -0
  132. data/spec/moneta/simple_lruhash_with_expires_spec.rb +52 -0
  133. data/spec/moneta/simple_memcached_dalli_spec.rb +52 -0
  134. data/spec/moneta/simple_memcached_native_spec.rb +52 -0
  135. data/spec/moneta/simple_memcached_spec.rb +52 -0
  136. data/spec/moneta/simple_memory_spec.rb +51 -0
  137. data/spec/moneta/simple_memory_with_compress_spec.rb +51 -0
  138. data/spec/moneta/simple_memory_with_expires_spec.rb +52 -0
  139. data/spec/moneta/simple_memory_with_json_key_serializer_spec.rb +37 -0
  140. data/spec/moneta/simple_memory_with_json_serializer_spec.rb +28 -0
  141. data/spec/moneta/simple_memory_with_json_value_serializer_spec.rb +35 -0
  142. data/spec/moneta/simple_memory_with_prefix_spec.rb +51 -0
  143. data/spec/moneta/simple_memory_with_snappy_compress_spec.rb +51 -0
  144. data/spec/moneta/simple_mongo_spec.rb +51 -0
  145. data/spec/moneta/simple_mongo_with_expires_spec.rb +52 -0
  146. data/spec/moneta/simple_null_spec.rb +36 -0
  147. data/spec/moneta/simple_pstore_spec.rb +51 -0
  148. data/spec/moneta/simple_pstore_with_expires_spec.rb +52 -0
  149. data/spec/moneta/simple_redis_spec.rb +52 -0
  150. data/spec/moneta/simple_riak_spec.rb +55 -0
  151. data/spec/moneta/simple_riak_with_expires_spec.rb +56 -0
  152. data/spec/moneta/simple_sdbm_spec.rb +51 -0
  153. data/spec/moneta/simple_sdbm_with_expires_spec.rb +52 -0
  154. data/spec/moneta/simple_sequel_spec.rb +51 -0
  155. data/spec/moneta/simple_sequel_with_expires_spec.rb +52 -0
  156. data/spec/moneta/simple_sqlite_spec.rb +51 -0
  157. data/spec/moneta/simple_sqlite_with_expires_spec.rb +52 -0
  158. data/spec/moneta/simple_tokyocabinet_spec.rb +51 -0
  159. data/spec/moneta/simple_tokyocabinet_with_expires_spec.rb +52 -0
  160. data/spec/moneta/simple_yaml_spec.rb +50 -0
  161. data/spec/moneta/simple_yaml_with_expires_spec.rb +51 -0
  162. data/spec/moneta/stack_file_memory_spec.rb +25 -0
  163. data/spec/moneta/stack_memory_file_spec.rb +24 -0
  164. data/spec/moneta/transformer_bencode_spec.rb +30 -0
  165. data/spec/moneta/transformer_bert_spec.rb +30 -0
  166. data/spec/moneta/transformer_bson_spec.rb +30 -0
  167. data/spec/moneta/transformer_bzip2_spec.rb +27 -0
  168. data/spec/moneta/transformer_json_spec.rb +30 -0
  169. data/spec/moneta/transformer_lzma_spec.rb +27 -0
  170. data/spec/moneta/transformer_lzo_spec.rb +27 -0
  171. data/spec/moneta/transformer_marshal_base64_spec.rb +54 -0
  172. data/spec/moneta/transformer_marshal_escape_spec.rb +54 -0
  173. data/spec/moneta/transformer_marshal_hmac_spec.rb +54 -0
  174. data/spec/moneta/transformer_marshal_md5_spec.rb +54 -0
  175. data/spec/moneta/transformer_marshal_md5_spread_spec.rb +54 -0
  176. data/spec/moneta/transformer_marshal_prefix_spec.rb +54 -0
  177. data/spec/moneta/transformer_marshal_rmd160_spec.rb +54 -0
  178. data/spec/moneta/transformer_marshal_sha1_spec.rb +54 -0
  179. data/spec/moneta/transformer_marshal_sha256_spec.rb +54 -0
  180. data/spec/moneta/transformer_marshal_sha384_spec.rb +54 -0
  181. data/spec/moneta/transformer_marshal_sha512_spec.rb +54 -0
  182. data/spec/moneta/transformer_marshal_truncate_spec.rb +54 -0
  183. data/spec/moneta/transformer_marshal_uuencode_spec.rb +54 -0
  184. data/spec/moneta/transformer_msgpack_spec.rb +30 -0
  185. data/spec/moneta/transformer_ox_spec.rb +51 -0
  186. data/spec/moneta/transformer_quicklz_spec.rb +27 -0
  187. data/spec/moneta/transformer_snappy_spec.rb +27 -0
  188. data/spec/moneta/transformer_tnet_spec.rb +30 -0
  189. data/spec/moneta/transformer_yaml_spec.rb +51 -0
  190. data/spec/moneta/transformer_zlib_spec.rb +27 -0
  191. data/spec/monetaspecs.rb +2663 -0
  192. data/spec/rack/cache_moneta_spec.rb +355 -0
  193. data/spec/rack/moneta_cookies_spec.rb +81 -0
  194. data/spec/rack/session_moneta_spec.rb +305 -0
  195. metadata +359 -56
  196. data/README +0 -51
  197. data/TODO +0 -4
  198. data/lib/moneta/basic_file.rb +0 -111
  199. data/lib/moneta/berkeley.rb +0 -53
  200. data/lib/moneta/couch.rb +0 -63
  201. data/lib/moneta/datamapper.rb +0 -117
  202. data/lib/moneta/file.rb +0 -91
  203. data/lib/moneta/lmc.rb +0 -52
  204. data/lib/moneta/memcache.rb +0 -52
  205. data/lib/moneta/memory.rb +0 -11
  206. data/lib/moneta/mongodb.rb +0 -58
  207. data/lib/moneta/redis.rb +0 -49
  208. data/lib/moneta/rufus.rb +0 -41
  209. data/lib/moneta/s3.rb +0 -162
  210. data/lib/moneta/sdbm.rb +0 -33
  211. data/lib/moneta/tyrant.rb +0 -58
  212. data/lib/moneta/xattr.rb +0 -58
@@ -0,0 +1,30 @@
1
+ # Generated by generate.rb
2
+ require 'helper'
3
+
4
+ describe_moneta "transformer_msgpack" do
5
+ def new_store
6
+ Moneta.build do
7
+ use :Transformer, :key => :msgpack, :value => :msgpack
8
+ adapter :Memory
9
+ end
10
+ end
11
+
12
+ def load_value(value)
13
+ ::MessagePack.unpack(value)
14
+ end
15
+
16
+ include_context 'setup_store'
17
+ it_should_behave_like 'null_hashkey_hashvalue'
18
+ it_should_behave_like 'null_hashkey_stringvalue'
19
+ it_should_behave_like 'null_stringkey_hashvalue'
20
+ it_should_behave_like 'null_stringkey_stringvalue'
21
+ it_should_behave_like 'store_hashkey_hashvalue'
22
+ it_should_behave_like 'store_hashkey_stringvalue'
23
+ it_should_behave_like 'store_stringkey_hashvalue'
24
+ it_should_behave_like 'store_stringkey_stringvalue'
25
+ it_should_behave_like 'returndifferent_hashkey_hashvalue'
26
+ it_should_behave_like 'returndifferent_hashkey_stringvalue'
27
+ it_should_behave_like 'returndifferent_stringkey_hashvalue'
28
+ it_should_behave_like 'returndifferent_stringkey_stringvalue'
29
+ it_should_behave_like 'transform_value'
30
+ end
@@ -0,0 +1,51 @@
1
+ # Generated by generate.rb
2
+ require 'helper'
3
+
4
+ describe_moneta "transformer_ox" do
5
+ def new_store
6
+ Moneta.build do
7
+ use :Transformer, :key => :ox, :value => :ox
8
+ adapter :Memory
9
+ end
10
+ end
11
+
12
+ def load_value(value)
13
+ ::Ox.parse_obj(value)
14
+ end
15
+
16
+ include_context 'setup_store'
17
+ it_should_behave_like 'null_objectkey_objectvalue'
18
+ it_should_behave_like 'null_objectkey_stringvalue'
19
+ it_should_behave_like 'null_objectkey_hashvalue'
20
+ it_should_behave_like 'null_objectkey_booleanvalue'
21
+ it_should_behave_like 'null_stringkey_objectvalue'
22
+ it_should_behave_like 'null_stringkey_stringvalue'
23
+ it_should_behave_like 'null_stringkey_hashvalue'
24
+ it_should_behave_like 'null_stringkey_booleanvalue'
25
+ it_should_behave_like 'null_hashkey_objectvalue'
26
+ it_should_behave_like 'null_hashkey_stringvalue'
27
+ it_should_behave_like 'null_hashkey_hashvalue'
28
+ it_should_behave_like 'null_hashkey_booleanvalue'
29
+ it_should_behave_like 'store_objectkey_objectvalue'
30
+ it_should_behave_like 'store_objectkey_stringvalue'
31
+ it_should_behave_like 'store_objectkey_hashvalue'
32
+ it_should_behave_like 'store_objectkey_booleanvalue'
33
+ it_should_behave_like 'store_stringkey_objectvalue'
34
+ it_should_behave_like 'store_stringkey_stringvalue'
35
+ it_should_behave_like 'store_stringkey_hashvalue'
36
+ it_should_behave_like 'store_stringkey_booleanvalue'
37
+ it_should_behave_like 'store_hashkey_objectvalue'
38
+ it_should_behave_like 'store_hashkey_stringvalue'
39
+ it_should_behave_like 'store_hashkey_hashvalue'
40
+ it_should_behave_like 'store_hashkey_booleanvalue'
41
+ it_should_behave_like 'returndifferent_objectkey_objectvalue'
42
+ it_should_behave_like 'returndifferent_objectkey_stringvalue'
43
+ it_should_behave_like 'returndifferent_objectkey_hashvalue'
44
+ it_should_behave_like 'returndifferent_stringkey_objectvalue'
45
+ it_should_behave_like 'returndifferent_stringkey_stringvalue'
46
+ it_should_behave_like 'returndifferent_stringkey_hashvalue'
47
+ it_should_behave_like 'returndifferent_hashkey_objectvalue'
48
+ it_should_behave_like 'returndifferent_hashkey_stringvalue'
49
+ it_should_behave_like 'returndifferent_hashkey_hashvalue'
50
+ it_should_behave_like 'transform_value'
51
+ end
@@ -0,0 +1,27 @@
1
+ # Generated by generate.rb
2
+ require 'helper'
3
+
4
+ describe_moneta "transformer_quicklz" do
5
+ def new_store
6
+ Moneta.build do
7
+ use :Transformer, :value => :quicklz
8
+ adapter :Memory
9
+ end
10
+ end
11
+
12
+ def load_value(value)
13
+ ::QuickLZ.decompress(value)
14
+ end
15
+
16
+ include_context 'setup_store'
17
+ it_should_behave_like 'null_objectkey_stringvalue'
18
+ it_should_behave_like 'null_stringkey_stringvalue'
19
+ it_should_behave_like 'null_hashkey_stringvalue'
20
+ it_should_behave_like 'store_objectkey_stringvalue'
21
+ it_should_behave_like 'store_stringkey_stringvalue'
22
+ it_should_behave_like 'store_hashkey_stringvalue'
23
+ it_should_behave_like 'returndifferent_objectkey_stringvalue'
24
+ it_should_behave_like 'returndifferent_stringkey_stringvalue'
25
+ it_should_behave_like 'returndifferent_hashkey_stringvalue'
26
+ it_should_behave_like 'transform_value'
27
+ end
@@ -0,0 +1,27 @@
1
+ # Generated by generate.rb
2
+ require 'helper'
3
+
4
+ describe_moneta "transformer_snappy" do
5
+ def new_store
6
+ Moneta.build do
7
+ use :Transformer, :value => :snappy
8
+ adapter :Memory
9
+ end
10
+ end
11
+
12
+ def load_value(value)
13
+ ::Snappy.inflate(value)
14
+ end
15
+
16
+ include_context 'setup_store'
17
+ it_should_behave_like 'null_objectkey_stringvalue'
18
+ it_should_behave_like 'null_stringkey_stringvalue'
19
+ it_should_behave_like 'null_hashkey_stringvalue'
20
+ it_should_behave_like 'store_objectkey_stringvalue'
21
+ it_should_behave_like 'store_stringkey_stringvalue'
22
+ it_should_behave_like 'store_hashkey_stringvalue'
23
+ it_should_behave_like 'returndifferent_objectkey_stringvalue'
24
+ it_should_behave_like 'returndifferent_stringkey_stringvalue'
25
+ it_should_behave_like 'returndifferent_hashkey_stringvalue'
26
+ it_should_behave_like 'transform_value'
27
+ end
@@ -0,0 +1,30 @@
1
+ # Generated by generate.rb
2
+ require 'helper'
3
+
4
+ describe_moneta "transformer_tnet" do
5
+ def new_store
6
+ Moneta.build do
7
+ use :Transformer, :key => :tnet, :value => :tnet
8
+ adapter :Memory
9
+ end
10
+ end
11
+
12
+ def load_value(value)
13
+ ::TNetstring.parse(value).first
14
+ end
15
+
16
+ include_context 'setup_store'
17
+ it_should_behave_like 'null_hashkey_hashvalue'
18
+ it_should_behave_like 'null_hashkey_stringvalue'
19
+ it_should_behave_like 'null_stringkey_hashvalue'
20
+ it_should_behave_like 'null_stringkey_stringvalue'
21
+ it_should_behave_like 'store_hashkey_hashvalue'
22
+ it_should_behave_like 'store_hashkey_stringvalue'
23
+ it_should_behave_like 'store_stringkey_hashvalue'
24
+ it_should_behave_like 'store_stringkey_stringvalue'
25
+ it_should_behave_like 'returndifferent_hashkey_hashvalue'
26
+ it_should_behave_like 'returndifferent_hashkey_stringvalue'
27
+ it_should_behave_like 'returndifferent_stringkey_hashvalue'
28
+ it_should_behave_like 'returndifferent_stringkey_stringvalue'
29
+ it_should_behave_like 'transform_value'
30
+ end
@@ -0,0 +1,51 @@
1
+ # Generated by generate.rb
2
+ require 'helper'
3
+
4
+ describe_moneta "transformer_yaml" do
5
+ def new_store
6
+ Moneta.build do
7
+ use :Transformer, :key => :yaml, :value => :yaml
8
+ adapter :Memory
9
+ end
10
+ end
11
+
12
+ def load_value(value)
13
+ ::YAML.load(value)
14
+ end
15
+
16
+ include_context 'setup_store'
17
+ it_should_behave_like 'null_objectkey_objectvalue'
18
+ it_should_behave_like 'null_objectkey_stringvalue'
19
+ it_should_behave_like 'null_objectkey_hashvalue'
20
+ it_should_behave_like 'null_objectkey_booleanvalue'
21
+ it_should_behave_like 'null_stringkey_objectvalue'
22
+ it_should_behave_like 'null_stringkey_stringvalue'
23
+ it_should_behave_like 'null_stringkey_hashvalue'
24
+ it_should_behave_like 'null_stringkey_booleanvalue'
25
+ it_should_behave_like 'null_hashkey_objectvalue'
26
+ it_should_behave_like 'null_hashkey_stringvalue'
27
+ it_should_behave_like 'null_hashkey_hashvalue'
28
+ it_should_behave_like 'null_hashkey_booleanvalue'
29
+ it_should_behave_like 'store_objectkey_objectvalue'
30
+ it_should_behave_like 'store_objectkey_stringvalue'
31
+ it_should_behave_like 'store_objectkey_hashvalue'
32
+ it_should_behave_like 'store_objectkey_booleanvalue'
33
+ it_should_behave_like 'store_stringkey_objectvalue'
34
+ it_should_behave_like 'store_stringkey_stringvalue'
35
+ it_should_behave_like 'store_stringkey_hashvalue'
36
+ it_should_behave_like 'store_stringkey_booleanvalue'
37
+ it_should_behave_like 'store_hashkey_objectvalue'
38
+ it_should_behave_like 'store_hashkey_stringvalue'
39
+ it_should_behave_like 'store_hashkey_hashvalue'
40
+ it_should_behave_like 'store_hashkey_booleanvalue'
41
+ it_should_behave_like 'returndifferent_objectkey_objectvalue'
42
+ it_should_behave_like 'returndifferent_objectkey_stringvalue'
43
+ it_should_behave_like 'returndifferent_objectkey_hashvalue'
44
+ it_should_behave_like 'returndifferent_stringkey_objectvalue'
45
+ it_should_behave_like 'returndifferent_stringkey_stringvalue'
46
+ it_should_behave_like 'returndifferent_stringkey_hashvalue'
47
+ it_should_behave_like 'returndifferent_hashkey_objectvalue'
48
+ it_should_behave_like 'returndifferent_hashkey_stringvalue'
49
+ it_should_behave_like 'returndifferent_hashkey_hashvalue'
50
+ it_should_behave_like 'transform_value'
51
+ end
@@ -0,0 +1,27 @@
1
+ # Generated by generate.rb
2
+ require 'helper'
3
+
4
+ describe_moneta "transformer_zlib" do
5
+ def new_store
6
+ Moneta.build do
7
+ use :Transformer, :value => :zlib
8
+ adapter :Memory
9
+ end
10
+ end
11
+
12
+ def load_value(value)
13
+ ::Zlib::Inflate.inflate(value)
14
+ end
15
+
16
+ include_context 'setup_store'
17
+ it_should_behave_like 'null_objectkey_stringvalue'
18
+ it_should_behave_like 'null_stringkey_stringvalue'
19
+ it_should_behave_like 'null_hashkey_stringvalue'
20
+ it_should_behave_like 'store_objectkey_stringvalue'
21
+ it_should_behave_like 'store_stringkey_stringvalue'
22
+ it_should_behave_like 'store_hashkey_stringvalue'
23
+ it_should_behave_like 'returndifferent_objectkey_stringvalue'
24
+ it_should_behave_like 'returndifferent_stringkey_stringvalue'
25
+ it_should_behave_like 'returndifferent_hashkey_stringvalue'
26
+ it_should_behave_like 'transform_value'
27
+ end
@@ -0,0 +1,2663 @@
1
+ # Generated by generate.rb
2
+
3
+ #################### null_stringkey_booleanvalue ####################
4
+
5
+ shared_examples_for 'null_stringkey_booleanvalue' do
6
+ it "reads from keys that are Strings like a Hash" do
7
+ store["strkey1"].should == nil
8
+ store.load("strkey1").should == nil
9
+ end
10
+
11
+ it "guarantees that the same Boolean value is returned when setting a String key" do
12
+ value = true
13
+ (store["strkey1"] = value).should equal(value)
14
+ end
15
+
16
+ it "returns false from key? if a String key is not available" do
17
+ store.key?("strkey1").should == false
18
+ end
19
+
20
+ it "returns nil from delete if an element for a String key does not exist" do
21
+ store.delete("strkey1").should == nil
22
+ end
23
+
24
+ it "removes all String keys from the store with clear" do
25
+ store["strkey1"] = true
26
+ store["strkey2"] = false
27
+ store.clear.should equal(store)
28
+ store.key?("strkey1").should_not == true
29
+ store.key?("strkey2").should_not == true
30
+ end
31
+
32
+ it "fetches a String key with a default value with fetch, if the key is not available" do
33
+ store.fetch("strkey1", true).should == true
34
+ end
35
+
36
+ it "fetches a String key with a block with fetch, if the key is not available" do
37
+ key = "strkey1"
38
+ value = true
39
+ store.fetch(key) do |k|
40
+ k.should equal(key)
41
+ value
42
+ end.should equal(value)
43
+ end
44
+
45
+ it 'should accept options' do
46
+ store.key?("strkey1", :option1 => 1).should == false
47
+ store.load("strkey1", :option2 => 2).should == nil
48
+ store.fetch("strkey1", 42, :option3 => 3).should == 42
49
+ store.fetch("strkey1", :option3 => 3) { 42 }.should == 42
50
+ store.delete("strkey1", :option4 => 4).should == nil
51
+ store.clear(:option5 => 5).should equal(store)
52
+ store.store("strkey1", true, :option6 => 6).should == true
53
+ end
54
+ end
55
+
56
+ #################### store_stringkey_booleanvalue ####################
57
+
58
+ shared_examples_for 'store_stringkey_booleanvalue' do
59
+ it "writes Boolean values to keys that are Strings like a Hash" do
60
+ store["strkey1"] = true
61
+ store["strkey1"].should == true
62
+ store.load("strkey1").should == true
63
+ end
64
+
65
+ it "returns true from key? if a String key is available" do
66
+ store["strkey1"] = true
67
+ store.key?("strkey1").should == true
68
+ store["strkey2"] = false
69
+ store.key?("strkey2").should == true
70
+ end
71
+
72
+ it "stores Boolean values with String keys with #store" do
73
+ value = true
74
+ store.store("strkey1", value).should equal(value)
75
+ store["strkey1"].should == true
76
+ store.load("strkey1").should == true
77
+ end
78
+
79
+ it "stores String after clear" do
80
+ store["strkey1"] = true
81
+ store["strkey2"] = false
82
+ store.clear.should equal(store)
83
+ store["strkey1"] = true
84
+ store["strkey1"].should == true
85
+ store["strkey2"].should be_nil
86
+ end
87
+
88
+ it "removes and returns a Boolean element with a String key from the backing store via delete if it exists" do
89
+ store["strkey1"] = true
90
+ store.delete("strkey1").should == true
91
+ store.key?("strkey1").should == false
92
+ end
93
+
94
+ it "overwrites existing Boolean values with String" do
95
+ store["strkey1"] = true
96
+ store["strkey1"].should == true
97
+ store["strkey1"] = false
98
+ store["strkey1"].should == false
99
+ end
100
+
101
+ it "does not run the block if the String key is available" do
102
+ store["strkey1"] = true
103
+ unaltered = "unaltered"
104
+ store.fetch("strkey1") { unaltered = "altered" }
105
+ unaltered.should == "unaltered"
106
+ end
107
+
108
+ it "fetches a String key with a default value with fetch, if the key is available" do
109
+ store["strkey1"] = true
110
+ store.fetch("strkey1", false).should == true
111
+ end
112
+ end
113
+
114
+ #################### expires_stringkey_booleanvalue ####################
115
+
116
+ shared_examples_for 'expires_stringkey_booleanvalue' do
117
+ it 'should support expires on store and #[]' do
118
+ store.store("strkey1", true, :expires => 2)
119
+ store["strkey1"].should == true
120
+ sleep 1
121
+ store["strkey1"].should == true
122
+ sleep 2
123
+ store["strkey1"].should == nil
124
+ end
125
+
126
+ it 'should support expires on store and load' do
127
+ store.store("strkey1", true, :expires => 2)
128
+ store.load("strkey1").should == true
129
+ sleep 1
130
+ store.load("strkey1").should == true
131
+ sleep 2
132
+ store.load("strkey1").should == nil
133
+ end
134
+
135
+ it 'should support expires on store and key?' do
136
+ store.store("strkey1", true, :expires => 2)
137
+ store.key?("strkey1").should == true
138
+ sleep 1
139
+ store.key?("strkey1").should == true
140
+ sleep 2
141
+ store.key?("strkey1").should == false
142
+ end
143
+
144
+ it 'should support updating the expiration time in load' do
145
+ store.store("strkey2", false, :expires => 2)
146
+ store["strkey2"].should == false
147
+ sleep 1
148
+ store.load("strkey2", :expires => 3).should == false
149
+ store["strkey2"].should == false
150
+ sleep 1
151
+ store["strkey2"].should == false
152
+ sleep 3
153
+ store["strkey2"].should == nil
154
+ end
155
+
156
+ it 'should support updating the expiration time in key?' do
157
+ store.store("strkey2", false, :expires => 2)
158
+ store["strkey2"].should == false
159
+ sleep 1
160
+ store.key?("strkey2", :expires => 3).should be_true
161
+ store["strkey2"].should == false
162
+ sleep 1
163
+ store["strkey2"].should == false
164
+ sleep 3
165
+ store["strkey2"].should == nil
166
+ end
167
+
168
+ it 'should support updating the expiration time in fetch' do
169
+ store.store("strkey1", true, :expires => 2)
170
+ store["strkey1"].should == true
171
+ sleep 1
172
+ store.fetch("strkey1", nil, :expires => 3).should == true
173
+ store["strkey1"].should == true
174
+ sleep 1
175
+ store["strkey1"].should == true
176
+ sleep 3
177
+ store["strkey1"].should == nil
178
+ end
179
+
180
+ it 'should respect expires in delete' do
181
+ store.store("strkey2", false, :expires => 2)
182
+ store["strkey2"].should == false
183
+ sleep 1
184
+ store["strkey2"].should == false
185
+ sleep 2
186
+ store.delete("strkey2").should == nil
187
+ end
188
+
189
+ it 'should support the #expires syntactic sugar' do
190
+ store['longlive_key'] = 'longlive_value'
191
+ store.expires(2).store("strkey2", false)
192
+ store["strkey2"].should == false
193
+ sleep 1
194
+ store["strkey2"].should == false
195
+ sleep 2
196
+ store.delete("strkey2").should == nil
197
+ store['longlive_key'].should == 'longlive_value'
198
+ end
199
+ end
200
+
201
+ #################### null_stringkey_stringvalue ####################
202
+
203
+ shared_examples_for 'null_stringkey_stringvalue' do
204
+ it "reads from keys that are Strings like a Hash" do
205
+ store["strkey1"].should == nil
206
+ store.load("strkey1").should == nil
207
+ end
208
+
209
+ it "guarantees that the same String value is returned when setting a String key" do
210
+ value = "strval1"
211
+ (store["strkey1"] = value).should equal(value)
212
+ end
213
+
214
+ it "returns false from key? if a String key is not available" do
215
+ store.key?("strkey1").should == false
216
+ end
217
+
218
+ it "returns nil from delete if an element for a String key does not exist" do
219
+ store.delete("strkey1").should == nil
220
+ end
221
+
222
+ it "removes all String keys from the store with clear" do
223
+ store["strkey1"] = "strval1"
224
+ store["strkey2"] = "strval2"
225
+ store.clear.should equal(store)
226
+ store.key?("strkey1").should_not == true
227
+ store.key?("strkey2").should_not == true
228
+ end
229
+
230
+ it "fetches a String key with a default value with fetch, if the key is not available" do
231
+ store.fetch("strkey1", "strval1").should == "strval1"
232
+ end
233
+
234
+ it "fetches a String key with a block with fetch, if the key is not available" do
235
+ key = "strkey1"
236
+ value = "strval1"
237
+ store.fetch(key) do |k|
238
+ k.should equal(key)
239
+ value
240
+ end.should equal(value)
241
+ end
242
+
243
+ it 'should accept options' do
244
+ store.key?("strkey1", :option1 => 1).should == false
245
+ store.load("strkey1", :option2 => 2).should == nil
246
+ store.fetch("strkey1", 42, :option3 => 3).should == 42
247
+ store.fetch("strkey1", :option3 => 3) { 42 }.should == 42
248
+ store.delete("strkey1", :option4 => 4).should == nil
249
+ store.clear(:option5 => 5).should equal(store)
250
+ store.store("strkey1", "strval1", :option6 => 6).should == "strval1"
251
+ end
252
+ end
253
+
254
+ #################### store_stringkey_stringvalue ####################
255
+
256
+ shared_examples_for 'store_stringkey_stringvalue' do
257
+ it "writes String values to keys that are Strings like a Hash" do
258
+ store["strkey1"] = "strval1"
259
+ store["strkey1"].should == "strval1"
260
+ store.load("strkey1").should == "strval1"
261
+ end
262
+
263
+ it "returns true from key? if a String key is available" do
264
+ store["strkey1"] = "strval1"
265
+ store.key?("strkey1").should == true
266
+ store["strkey2"] = "strval2"
267
+ store.key?("strkey2").should == true
268
+ end
269
+
270
+ it "stores String values with String keys with #store" do
271
+ value = "strval1"
272
+ store.store("strkey1", value).should equal(value)
273
+ store["strkey1"].should == "strval1"
274
+ store.load("strkey1").should == "strval1"
275
+ end
276
+
277
+ it "stores String after clear" do
278
+ store["strkey1"] = "strval1"
279
+ store["strkey2"] = "strval2"
280
+ store.clear.should equal(store)
281
+ store["strkey1"] = "strval1"
282
+ store["strkey1"].should == "strval1"
283
+ store["strkey2"].should be_nil
284
+ end
285
+
286
+ it "removes and returns a String element with a String key from the backing store via delete if it exists" do
287
+ store["strkey1"] = "strval1"
288
+ store.delete("strkey1").should == "strval1"
289
+ store.key?("strkey1").should == false
290
+ end
291
+
292
+ it "overwrites existing String values with String" do
293
+ store["strkey1"] = "strval1"
294
+ store["strkey1"].should == "strval1"
295
+ store["strkey1"] = "strval2"
296
+ store["strkey1"].should == "strval2"
297
+ end
298
+
299
+ it "does not run the block if the String key is available" do
300
+ store["strkey1"] = "strval1"
301
+ unaltered = "unaltered"
302
+ store.fetch("strkey1") { unaltered = "altered" }
303
+ unaltered.should == "unaltered"
304
+ end
305
+
306
+ it "fetches a String key with a default value with fetch, if the key is available" do
307
+ store["strkey1"] = "strval1"
308
+ store.fetch("strkey1", "strval2").should == "strval1"
309
+ end
310
+ end
311
+
312
+ #################### returndifferent_stringkey_stringvalue ####################
313
+
314
+ shared_examples_for 'returndifferent_stringkey_stringvalue' do
315
+ it "guarantees that a different String value is retrieved from the String key" do
316
+ value = "strval1"
317
+ store["strkey1"] = "strval1"
318
+ store["strkey1"].should_not be_equal("strval1")
319
+ end
320
+ end
321
+
322
+ #################### expires_stringkey_stringvalue ####################
323
+
324
+ shared_examples_for 'expires_stringkey_stringvalue' do
325
+ it 'should support expires on store and #[]' do
326
+ store.store("strkey1", "strval1", :expires => 2)
327
+ store["strkey1"].should == "strval1"
328
+ sleep 1
329
+ store["strkey1"].should == "strval1"
330
+ sleep 2
331
+ store["strkey1"].should == nil
332
+ end
333
+
334
+ it 'should support expires on store and load' do
335
+ store.store("strkey1", "strval1", :expires => 2)
336
+ store.load("strkey1").should == "strval1"
337
+ sleep 1
338
+ store.load("strkey1").should == "strval1"
339
+ sleep 2
340
+ store.load("strkey1").should == nil
341
+ end
342
+
343
+ it 'should support expires on store and key?' do
344
+ store.store("strkey1", "strval1", :expires => 2)
345
+ store.key?("strkey1").should == true
346
+ sleep 1
347
+ store.key?("strkey1").should == true
348
+ sleep 2
349
+ store.key?("strkey1").should == false
350
+ end
351
+
352
+ it 'should support updating the expiration time in load' do
353
+ store.store("strkey2", "strval2", :expires => 2)
354
+ store["strkey2"].should == "strval2"
355
+ sleep 1
356
+ store.load("strkey2", :expires => 3).should == "strval2"
357
+ store["strkey2"].should == "strval2"
358
+ sleep 1
359
+ store["strkey2"].should == "strval2"
360
+ sleep 3
361
+ store["strkey2"].should == nil
362
+ end
363
+
364
+ it 'should support updating the expiration time in key?' do
365
+ store.store("strkey2", "strval2", :expires => 2)
366
+ store["strkey2"].should == "strval2"
367
+ sleep 1
368
+ store.key?("strkey2", :expires => 3).should be_true
369
+ store["strkey2"].should == "strval2"
370
+ sleep 1
371
+ store["strkey2"].should == "strval2"
372
+ sleep 3
373
+ store["strkey2"].should == nil
374
+ end
375
+
376
+ it 'should support updating the expiration time in fetch' do
377
+ store.store("strkey1", "strval1", :expires => 2)
378
+ store["strkey1"].should == "strval1"
379
+ sleep 1
380
+ store.fetch("strkey1", nil, :expires => 3).should == "strval1"
381
+ store["strkey1"].should == "strval1"
382
+ sleep 1
383
+ store["strkey1"].should == "strval1"
384
+ sleep 3
385
+ store["strkey1"].should == nil
386
+ end
387
+
388
+ it 'should respect expires in delete' do
389
+ store.store("strkey2", "strval2", :expires => 2)
390
+ store["strkey2"].should == "strval2"
391
+ sleep 1
392
+ store["strkey2"].should == "strval2"
393
+ sleep 2
394
+ store.delete("strkey2").should == nil
395
+ end
396
+
397
+ it 'should support the #expires syntactic sugar' do
398
+ store['longlive_key'] = 'longlive_value'
399
+ store.expires(2).store("strkey2", "strval2")
400
+ store["strkey2"].should == "strval2"
401
+ sleep 1
402
+ store["strkey2"].should == "strval2"
403
+ sleep 2
404
+ store.delete("strkey2").should == nil
405
+ store['longlive_key'].should == 'longlive_value'
406
+ end
407
+ end
408
+
409
+ #################### null_stringkey_hashvalue ####################
410
+
411
+ shared_examples_for 'null_stringkey_hashvalue' do
412
+ it "reads from keys that are Strings like a Hash" do
413
+ store["strkey1"].should == nil
414
+ store.load("strkey1").should == nil
415
+ end
416
+
417
+ it "guarantees that the same Hash value is returned when setting a String key" do
418
+ value = {"hashval1"=>["array1", 1]}
419
+ (store["strkey1"] = value).should equal(value)
420
+ end
421
+
422
+ it "returns false from key? if a String key is not available" do
423
+ store.key?("strkey1").should == false
424
+ end
425
+
426
+ it "returns nil from delete if an element for a String key does not exist" do
427
+ store.delete("strkey1").should == nil
428
+ end
429
+
430
+ it "removes all String keys from the store with clear" do
431
+ store["strkey1"] = {"hashval1"=>["array1", 1]}
432
+ store["strkey2"] = {"hashval3"=>["array2", {"hashval4"=>42}]}
433
+ store.clear.should equal(store)
434
+ store.key?("strkey1").should_not == true
435
+ store.key?("strkey2").should_not == true
436
+ end
437
+
438
+ it "fetches a String key with a default value with fetch, if the key is not available" do
439
+ store.fetch("strkey1", {"hashval1"=>["array1", 1]}).should == {"hashval1"=>["array1", 1]}
440
+ end
441
+
442
+ it "fetches a String key with a block with fetch, if the key is not available" do
443
+ key = "strkey1"
444
+ value = {"hashval1"=>["array1", 1]}
445
+ store.fetch(key) do |k|
446
+ k.should equal(key)
447
+ value
448
+ end.should equal(value)
449
+ end
450
+
451
+ it 'should accept options' do
452
+ store.key?("strkey1", :option1 => 1).should == false
453
+ store.load("strkey1", :option2 => 2).should == nil
454
+ store.fetch("strkey1", 42, :option3 => 3).should == 42
455
+ store.fetch("strkey1", :option3 => 3) { 42 }.should == 42
456
+ store.delete("strkey1", :option4 => 4).should == nil
457
+ store.clear(:option5 => 5).should equal(store)
458
+ store.store("strkey1", {"hashval1"=>["array1", 1]}, :option6 => 6).should == {"hashval1"=>["array1", 1]}
459
+ end
460
+ end
461
+
462
+ #################### store_stringkey_hashvalue ####################
463
+
464
+ shared_examples_for 'store_stringkey_hashvalue' do
465
+ it "writes Hash values to keys that are Strings like a Hash" do
466
+ store["strkey1"] = {"hashval1"=>["array1", 1]}
467
+ store["strkey1"].should == {"hashval1"=>["array1", 1]}
468
+ store.load("strkey1").should == {"hashval1"=>["array1", 1]}
469
+ end
470
+
471
+ it "returns true from key? if a String key is available" do
472
+ store["strkey1"] = {"hashval1"=>["array1", 1]}
473
+ store.key?("strkey1").should == true
474
+ store["strkey2"] = {"hashval3"=>["array2", {"hashval4"=>42}]}
475
+ store.key?("strkey2").should == true
476
+ end
477
+
478
+ it "stores Hash values with String keys with #store" do
479
+ value = {"hashval1"=>["array1", 1]}
480
+ store.store("strkey1", value).should equal(value)
481
+ store["strkey1"].should == {"hashval1"=>["array1", 1]}
482
+ store.load("strkey1").should == {"hashval1"=>["array1", 1]}
483
+ end
484
+
485
+ it "stores String after clear" do
486
+ store["strkey1"] = {"hashval1"=>["array1", 1]}
487
+ store["strkey2"] = {"hashval3"=>["array2", {"hashval4"=>42}]}
488
+ store.clear.should equal(store)
489
+ store["strkey1"] = {"hashval1"=>["array1", 1]}
490
+ store["strkey1"].should == {"hashval1"=>["array1", 1]}
491
+ store["strkey2"].should be_nil
492
+ end
493
+
494
+ it "removes and returns a Hash element with a String key from the backing store via delete if it exists" do
495
+ store["strkey1"] = {"hashval1"=>["array1", 1]}
496
+ store.delete("strkey1").should == {"hashval1"=>["array1", 1]}
497
+ store.key?("strkey1").should == false
498
+ end
499
+
500
+ it "overwrites existing Hash values with String" do
501
+ store["strkey1"] = {"hashval1"=>["array1", 1]}
502
+ store["strkey1"].should == {"hashval1"=>["array1", 1]}
503
+ store["strkey1"] = {"hashval3"=>["array2", {"hashval4"=>42}]}
504
+ store["strkey1"].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
505
+ end
506
+
507
+ it "does not run the block if the String key is available" do
508
+ store["strkey1"] = {"hashval1"=>["array1", 1]}
509
+ unaltered = "unaltered"
510
+ store.fetch("strkey1") { unaltered = "altered" }
511
+ unaltered.should == "unaltered"
512
+ end
513
+
514
+ it "fetches a String key with a default value with fetch, if the key is available" do
515
+ store["strkey1"] = {"hashval1"=>["array1", 1]}
516
+ store.fetch("strkey1", {"hashval3"=>["array2", {"hashval4"=>42}]}).should == {"hashval1"=>["array1", 1]}
517
+ end
518
+ end
519
+
520
+ #################### returndifferent_stringkey_hashvalue ####################
521
+
522
+ shared_examples_for 'returndifferent_stringkey_hashvalue' do
523
+ it "guarantees that a different Hash value is retrieved from the String key" do
524
+ value = {"hashval1"=>["array1", 1]}
525
+ store["strkey1"] = {"hashval1"=>["array1", 1]}
526
+ store["strkey1"].should_not be_equal({"hashval1"=>["array1", 1]})
527
+ end
528
+ end
529
+
530
+ #################### expires_stringkey_hashvalue ####################
531
+
532
+ shared_examples_for 'expires_stringkey_hashvalue' do
533
+ it 'should support expires on store and #[]' do
534
+ store.store("strkey1", {"hashval1"=>["array1", 1]}, :expires => 2)
535
+ store["strkey1"].should == {"hashval1"=>["array1", 1]}
536
+ sleep 1
537
+ store["strkey1"].should == {"hashval1"=>["array1", 1]}
538
+ sleep 2
539
+ store["strkey1"].should == nil
540
+ end
541
+
542
+ it 'should support expires on store and load' do
543
+ store.store("strkey1", {"hashval1"=>["array1", 1]}, :expires => 2)
544
+ store.load("strkey1").should == {"hashval1"=>["array1", 1]}
545
+ sleep 1
546
+ store.load("strkey1").should == {"hashval1"=>["array1", 1]}
547
+ sleep 2
548
+ store.load("strkey1").should == nil
549
+ end
550
+
551
+ it 'should support expires on store and key?' do
552
+ store.store("strkey1", {"hashval1"=>["array1", 1]}, :expires => 2)
553
+ store.key?("strkey1").should == true
554
+ sleep 1
555
+ store.key?("strkey1").should == true
556
+ sleep 2
557
+ store.key?("strkey1").should == false
558
+ end
559
+
560
+ it 'should support updating the expiration time in load' do
561
+ store.store("strkey2", {"hashval3"=>["array2", {"hashval4"=>42}]}, :expires => 2)
562
+ store["strkey2"].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
563
+ sleep 1
564
+ store.load("strkey2", :expires => 3).should == {"hashval3"=>["array2", {"hashval4"=>42}]}
565
+ store["strkey2"].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
566
+ sleep 1
567
+ store["strkey2"].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
568
+ sleep 3
569
+ store["strkey2"].should == nil
570
+ end
571
+
572
+ it 'should support updating the expiration time in key?' do
573
+ store.store("strkey2", {"hashval3"=>["array2", {"hashval4"=>42}]}, :expires => 2)
574
+ store["strkey2"].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
575
+ sleep 1
576
+ store.key?("strkey2", :expires => 3).should be_true
577
+ store["strkey2"].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
578
+ sleep 1
579
+ store["strkey2"].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
580
+ sleep 3
581
+ store["strkey2"].should == nil
582
+ end
583
+
584
+ it 'should support updating the expiration time in fetch' do
585
+ store.store("strkey1", {"hashval1"=>["array1", 1]}, :expires => 2)
586
+ store["strkey1"].should == {"hashval1"=>["array1", 1]}
587
+ sleep 1
588
+ store.fetch("strkey1", nil, :expires => 3).should == {"hashval1"=>["array1", 1]}
589
+ store["strkey1"].should == {"hashval1"=>["array1", 1]}
590
+ sleep 1
591
+ store["strkey1"].should == {"hashval1"=>["array1", 1]}
592
+ sleep 3
593
+ store["strkey1"].should == nil
594
+ end
595
+
596
+ it 'should respect expires in delete' do
597
+ store.store("strkey2", {"hashval3"=>["array2", {"hashval4"=>42}]}, :expires => 2)
598
+ store["strkey2"].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
599
+ sleep 1
600
+ store["strkey2"].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
601
+ sleep 2
602
+ store.delete("strkey2").should == nil
603
+ end
604
+
605
+ it 'should support the #expires syntactic sugar' do
606
+ store['longlive_key'] = 'longlive_value'
607
+ store.expires(2).store("strkey2", {"hashval3"=>["array2", {"hashval4"=>42}]})
608
+ store["strkey2"].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
609
+ sleep 1
610
+ store["strkey2"].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
611
+ sleep 2
612
+ store.delete("strkey2").should == nil
613
+ store['longlive_key'].should == 'longlive_value'
614
+ end
615
+ end
616
+
617
+ #################### null_stringkey_objectvalue ####################
618
+
619
+ shared_examples_for 'null_stringkey_objectvalue' do
620
+ it "reads from keys that are Strings like a Hash" do
621
+ store["strkey1"].should == nil
622
+ store.load("strkey1").should == nil
623
+ end
624
+
625
+ it "guarantees that the same Object value is returned when setting a String key" do
626
+ value = Value.new(:objval1)
627
+ (store["strkey1"] = value).should equal(value)
628
+ end
629
+
630
+ it "returns false from key? if a String key is not available" do
631
+ store.key?("strkey1").should == false
632
+ end
633
+
634
+ it "returns nil from delete if an element for a String key does not exist" do
635
+ store.delete("strkey1").should == nil
636
+ end
637
+
638
+ it "removes all String keys from the store with clear" do
639
+ store["strkey1"] = Value.new(:objval1)
640
+ store["strkey2"] = Value.new(:objval2)
641
+ store.clear.should equal(store)
642
+ store.key?("strkey1").should_not == true
643
+ store.key?("strkey2").should_not == true
644
+ end
645
+
646
+ it "fetches a String key with a default value with fetch, if the key is not available" do
647
+ store.fetch("strkey1", Value.new(:objval1)).should == Value.new(:objval1)
648
+ end
649
+
650
+ it "fetches a String key with a block with fetch, if the key is not available" do
651
+ key = "strkey1"
652
+ value = Value.new(:objval1)
653
+ store.fetch(key) do |k|
654
+ k.should equal(key)
655
+ value
656
+ end.should equal(value)
657
+ end
658
+
659
+ it 'should accept options' do
660
+ store.key?("strkey1", :option1 => 1).should == false
661
+ store.load("strkey1", :option2 => 2).should == nil
662
+ store.fetch("strkey1", 42, :option3 => 3).should == 42
663
+ store.fetch("strkey1", :option3 => 3) { 42 }.should == 42
664
+ store.delete("strkey1", :option4 => 4).should == nil
665
+ store.clear(:option5 => 5).should equal(store)
666
+ store.store("strkey1", Value.new(:objval1), :option6 => 6).should == Value.new(:objval1)
667
+ end
668
+ end
669
+
670
+ #################### store_stringkey_objectvalue ####################
671
+
672
+ shared_examples_for 'store_stringkey_objectvalue' do
673
+ it "writes Object values to keys that are Strings like a Hash" do
674
+ store["strkey1"] = Value.new(:objval1)
675
+ store["strkey1"].should == Value.new(:objval1)
676
+ store.load("strkey1").should == Value.new(:objval1)
677
+ end
678
+
679
+ it "returns true from key? if a String key is available" do
680
+ store["strkey1"] = Value.new(:objval1)
681
+ store.key?("strkey1").should == true
682
+ store["strkey2"] = Value.new(:objval2)
683
+ store.key?("strkey2").should == true
684
+ end
685
+
686
+ it "stores Object values with String keys with #store" do
687
+ value = Value.new(:objval1)
688
+ store.store("strkey1", value).should equal(value)
689
+ store["strkey1"].should == Value.new(:objval1)
690
+ store.load("strkey1").should == Value.new(:objval1)
691
+ end
692
+
693
+ it "stores String after clear" do
694
+ store["strkey1"] = Value.new(:objval1)
695
+ store["strkey2"] = Value.new(:objval2)
696
+ store.clear.should equal(store)
697
+ store["strkey1"] = Value.new(:objval1)
698
+ store["strkey1"].should == Value.new(:objval1)
699
+ store["strkey2"].should be_nil
700
+ end
701
+
702
+ it "removes and returns a Object element with a String key from the backing store via delete if it exists" do
703
+ store["strkey1"] = Value.new(:objval1)
704
+ store.delete("strkey1").should == Value.new(:objval1)
705
+ store.key?("strkey1").should == false
706
+ end
707
+
708
+ it "overwrites existing Object values with String" do
709
+ store["strkey1"] = Value.new(:objval1)
710
+ store["strkey1"].should == Value.new(:objval1)
711
+ store["strkey1"] = Value.new(:objval2)
712
+ store["strkey1"].should == Value.new(:objval2)
713
+ end
714
+
715
+ it "does not run the block if the String key is available" do
716
+ store["strkey1"] = Value.new(:objval1)
717
+ unaltered = "unaltered"
718
+ store.fetch("strkey1") { unaltered = "altered" }
719
+ unaltered.should == "unaltered"
720
+ end
721
+
722
+ it "fetches a String key with a default value with fetch, if the key is available" do
723
+ store["strkey1"] = Value.new(:objval1)
724
+ store.fetch("strkey1", Value.new(:objval2)).should == Value.new(:objval1)
725
+ end
726
+ end
727
+
728
+ #################### returndifferent_stringkey_objectvalue ####################
729
+
730
+ shared_examples_for 'returndifferent_stringkey_objectvalue' do
731
+ it "guarantees that a different Object value is retrieved from the String key" do
732
+ value = Value.new(:objval1)
733
+ store["strkey1"] = Value.new(:objval1)
734
+ store["strkey1"].should_not be_equal(Value.new(:objval1))
735
+ end
736
+ end
737
+
738
+ #################### expires_stringkey_objectvalue ####################
739
+
740
+ shared_examples_for 'expires_stringkey_objectvalue' do
741
+ it 'should support expires on store and #[]' do
742
+ store.store("strkey1", Value.new(:objval1), :expires => 2)
743
+ store["strkey1"].should == Value.new(:objval1)
744
+ sleep 1
745
+ store["strkey1"].should == Value.new(:objval1)
746
+ sleep 2
747
+ store["strkey1"].should == nil
748
+ end
749
+
750
+ it 'should support expires on store and load' do
751
+ store.store("strkey1", Value.new(:objval1), :expires => 2)
752
+ store.load("strkey1").should == Value.new(:objval1)
753
+ sleep 1
754
+ store.load("strkey1").should == Value.new(:objval1)
755
+ sleep 2
756
+ store.load("strkey1").should == nil
757
+ end
758
+
759
+ it 'should support expires on store and key?' do
760
+ store.store("strkey1", Value.new(:objval1), :expires => 2)
761
+ store.key?("strkey1").should == true
762
+ sleep 1
763
+ store.key?("strkey1").should == true
764
+ sleep 2
765
+ store.key?("strkey1").should == false
766
+ end
767
+
768
+ it 'should support updating the expiration time in load' do
769
+ store.store("strkey2", Value.new(:objval2), :expires => 2)
770
+ store["strkey2"].should == Value.new(:objval2)
771
+ sleep 1
772
+ store.load("strkey2", :expires => 3).should == Value.new(:objval2)
773
+ store["strkey2"].should == Value.new(:objval2)
774
+ sleep 1
775
+ store["strkey2"].should == Value.new(:objval2)
776
+ sleep 3
777
+ store["strkey2"].should == nil
778
+ end
779
+
780
+ it 'should support updating the expiration time in key?' do
781
+ store.store("strkey2", Value.new(:objval2), :expires => 2)
782
+ store["strkey2"].should == Value.new(:objval2)
783
+ sleep 1
784
+ store.key?("strkey2", :expires => 3).should be_true
785
+ store["strkey2"].should == Value.new(:objval2)
786
+ sleep 1
787
+ store["strkey2"].should == Value.new(:objval2)
788
+ sleep 3
789
+ store["strkey2"].should == nil
790
+ end
791
+
792
+ it 'should support updating the expiration time in fetch' do
793
+ store.store("strkey1", Value.new(:objval1), :expires => 2)
794
+ store["strkey1"].should == Value.new(:objval1)
795
+ sleep 1
796
+ store.fetch("strkey1", nil, :expires => 3).should == Value.new(:objval1)
797
+ store["strkey1"].should == Value.new(:objval1)
798
+ sleep 1
799
+ store["strkey1"].should == Value.new(:objval1)
800
+ sleep 3
801
+ store["strkey1"].should == nil
802
+ end
803
+
804
+ it 'should respect expires in delete' do
805
+ store.store("strkey2", Value.new(:objval2), :expires => 2)
806
+ store["strkey2"].should == Value.new(:objval2)
807
+ sleep 1
808
+ store["strkey2"].should == Value.new(:objval2)
809
+ sleep 2
810
+ store.delete("strkey2").should == nil
811
+ end
812
+
813
+ it 'should support the #expires syntactic sugar' do
814
+ store['longlive_key'] = 'longlive_value'
815
+ store.expires(2).store("strkey2", Value.new(:objval2))
816
+ store["strkey2"].should == Value.new(:objval2)
817
+ sleep 1
818
+ store["strkey2"].should == Value.new(:objval2)
819
+ sleep 2
820
+ store.delete("strkey2").should == nil
821
+ store['longlive_key'].should == 'longlive_value'
822
+ end
823
+ end
824
+
825
+ #################### null_objectkey_booleanvalue ####################
826
+
827
+ shared_examples_for 'null_objectkey_booleanvalue' do
828
+ it "reads from keys that are Objects like a Hash" do
829
+ store[Value.new(:objkey1)].should == nil
830
+ store.load(Value.new(:objkey1)).should == nil
831
+ end
832
+
833
+ it "guarantees that the same Boolean value is returned when setting a Object key" do
834
+ value = true
835
+ (store[Value.new(:objkey1)] = value).should equal(value)
836
+ end
837
+
838
+ it "returns false from key? if a Object key is not available" do
839
+ store.key?(Value.new(:objkey1)).should == false
840
+ end
841
+
842
+ it "returns nil from delete if an element for a Object key does not exist" do
843
+ store.delete(Value.new(:objkey1)).should == nil
844
+ end
845
+
846
+ it "removes all Object keys from the store with clear" do
847
+ store[Value.new(:objkey1)] = true
848
+ store[Value.new(:objkey2)] = false
849
+ store.clear.should equal(store)
850
+ store.key?(Value.new(:objkey1)).should_not == true
851
+ store.key?(Value.new(:objkey2)).should_not == true
852
+ end
853
+
854
+ it "fetches a Object key with a default value with fetch, if the key is not available" do
855
+ store.fetch(Value.new(:objkey1), true).should == true
856
+ end
857
+
858
+ it "fetches a Object key with a block with fetch, if the key is not available" do
859
+ key = Value.new(:objkey1)
860
+ value = true
861
+ store.fetch(key) do |k|
862
+ k.should equal(key)
863
+ value
864
+ end.should equal(value)
865
+ end
866
+
867
+ it 'should accept options' do
868
+ store.key?(Value.new(:objkey1), :option1 => 1).should == false
869
+ store.load(Value.new(:objkey1), :option2 => 2).should == nil
870
+ store.fetch(Value.new(:objkey1), 42, :option3 => 3).should == 42
871
+ store.fetch(Value.new(:objkey1), :option3 => 3) { 42 }.should == 42
872
+ store.delete(Value.new(:objkey1), :option4 => 4).should == nil
873
+ store.clear(:option5 => 5).should equal(store)
874
+ store.store(Value.new(:objkey1), true, :option6 => 6).should == true
875
+ end
876
+ end
877
+
878
+ #################### store_objectkey_booleanvalue ####################
879
+
880
+ shared_examples_for 'store_objectkey_booleanvalue' do
881
+ it "writes Boolean values to keys that are Objects like a Hash" do
882
+ store[Value.new(:objkey1)] = true
883
+ store[Value.new(:objkey1)].should == true
884
+ store.load(Value.new(:objkey1)).should == true
885
+ end
886
+
887
+ it "returns true from key? if a Object key is available" do
888
+ store[Value.new(:objkey1)] = true
889
+ store.key?(Value.new(:objkey1)).should == true
890
+ store[Value.new(:objkey2)] = false
891
+ store.key?(Value.new(:objkey2)).should == true
892
+ end
893
+
894
+ it "stores Boolean values with Object keys with #store" do
895
+ value = true
896
+ store.store(Value.new(:objkey1), value).should equal(value)
897
+ store[Value.new(:objkey1)].should == true
898
+ store.load(Value.new(:objkey1)).should == true
899
+ end
900
+
901
+ it "stores Object after clear" do
902
+ store[Value.new(:objkey1)] = true
903
+ store[Value.new(:objkey2)] = false
904
+ store.clear.should equal(store)
905
+ store[Value.new(:objkey1)] = true
906
+ store[Value.new(:objkey1)].should == true
907
+ store[Value.new(:objkey2)].should be_nil
908
+ end
909
+
910
+ it "removes and returns a Boolean element with a Object key from the backing store via delete if it exists" do
911
+ store[Value.new(:objkey1)] = true
912
+ store.delete(Value.new(:objkey1)).should == true
913
+ store.key?(Value.new(:objkey1)).should == false
914
+ end
915
+
916
+ it "overwrites existing Boolean values with Object" do
917
+ store[Value.new(:objkey1)] = true
918
+ store[Value.new(:objkey1)].should == true
919
+ store[Value.new(:objkey1)] = false
920
+ store[Value.new(:objkey1)].should == false
921
+ end
922
+
923
+ it "does not run the block if the Object key is available" do
924
+ store[Value.new(:objkey1)] = true
925
+ unaltered = "unaltered"
926
+ store.fetch(Value.new(:objkey1)) { unaltered = "altered" }
927
+ unaltered.should == "unaltered"
928
+ end
929
+
930
+ it "fetches a Object key with a default value with fetch, if the key is available" do
931
+ store[Value.new(:objkey1)] = true
932
+ store.fetch(Value.new(:objkey1), false).should == true
933
+ end
934
+ end
935
+
936
+ #################### expires_objectkey_booleanvalue ####################
937
+
938
+ shared_examples_for 'expires_objectkey_booleanvalue' do
939
+ it 'should support expires on store and #[]' do
940
+ store.store(Value.new(:objkey1), true, :expires => 2)
941
+ store[Value.new(:objkey1)].should == true
942
+ sleep 1
943
+ store[Value.new(:objkey1)].should == true
944
+ sleep 2
945
+ store[Value.new(:objkey1)].should == nil
946
+ end
947
+
948
+ it 'should support expires on store and load' do
949
+ store.store(Value.new(:objkey1), true, :expires => 2)
950
+ store.load(Value.new(:objkey1)).should == true
951
+ sleep 1
952
+ store.load(Value.new(:objkey1)).should == true
953
+ sleep 2
954
+ store.load(Value.new(:objkey1)).should == nil
955
+ end
956
+
957
+ it 'should support expires on store and key?' do
958
+ store.store(Value.new(:objkey1), true, :expires => 2)
959
+ store.key?(Value.new(:objkey1)).should == true
960
+ sleep 1
961
+ store.key?(Value.new(:objkey1)).should == true
962
+ sleep 2
963
+ store.key?(Value.new(:objkey1)).should == false
964
+ end
965
+
966
+ it 'should support updating the expiration time in load' do
967
+ store.store(Value.new(:objkey2), false, :expires => 2)
968
+ store[Value.new(:objkey2)].should == false
969
+ sleep 1
970
+ store.load(Value.new(:objkey2), :expires => 3).should == false
971
+ store[Value.new(:objkey2)].should == false
972
+ sleep 1
973
+ store[Value.new(:objkey2)].should == false
974
+ sleep 3
975
+ store[Value.new(:objkey2)].should == nil
976
+ end
977
+
978
+ it 'should support updating the expiration time in key?' do
979
+ store.store(Value.new(:objkey2), false, :expires => 2)
980
+ store[Value.new(:objkey2)].should == false
981
+ sleep 1
982
+ store.key?(Value.new(:objkey2), :expires => 3).should be_true
983
+ store[Value.new(:objkey2)].should == false
984
+ sleep 1
985
+ store[Value.new(:objkey2)].should == false
986
+ sleep 3
987
+ store[Value.new(:objkey2)].should == nil
988
+ end
989
+
990
+ it 'should support updating the expiration time in fetch' do
991
+ store.store(Value.new(:objkey1), true, :expires => 2)
992
+ store[Value.new(:objkey1)].should == true
993
+ sleep 1
994
+ store.fetch(Value.new(:objkey1), nil, :expires => 3).should == true
995
+ store[Value.new(:objkey1)].should == true
996
+ sleep 1
997
+ store[Value.new(:objkey1)].should == true
998
+ sleep 3
999
+ store[Value.new(:objkey1)].should == nil
1000
+ end
1001
+
1002
+ it 'should respect expires in delete' do
1003
+ store.store(Value.new(:objkey2), false, :expires => 2)
1004
+ store[Value.new(:objkey2)].should == false
1005
+ sleep 1
1006
+ store[Value.new(:objkey2)].should == false
1007
+ sleep 2
1008
+ store.delete(Value.new(:objkey2)).should == nil
1009
+ end
1010
+
1011
+ it 'should support the #expires syntactic sugar' do
1012
+ store['longlive_key'] = 'longlive_value'
1013
+ store.expires(2).store(Value.new(:objkey2), false)
1014
+ store[Value.new(:objkey2)].should == false
1015
+ sleep 1
1016
+ store[Value.new(:objkey2)].should == false
1017
+ sleep 2
1018
+ store.delete(Value.new(:objkey2)).should == nil
1019
+ store['longlive_key'].should == 'longlive_value'
1020
+ end
1021
+ end
1022
+
1023
+ #################### null_objectkey_stringvalue ####################
1024
+
1025
+ shared_examples_for 'null_objectkey_stringvalue' do
1026
+ it "reads from keys that are Objects like a Hash" do
1027
+ store[Value.new(:objkey1)].should == nil
1028
+ store.load(Value.new(:objkey1)).should == nil
1029
+ end
1030
+
1031
+ it "guarantees that the same String value is returned when setting a Object key" do
1032
+ value = "strval1"
1033
+ (store[Value.new(:objkey1)] = value).should equal(value)
1034
+ end
1035
+
1036
+ it "returns false from key? if a Object key is not available" do
1037
+ store.key?(Value.new(:objkey1)).should == false
1038
+ end
1039
+
1040
+ it "returns nil from delete if an element for a Object key does not exist" do
1041
+ store.delete(Value.new(:objkey1)).should == nil
1042
+ end
1043
+
1044
+ it "removes all Object keys from the store with clear" do
1045
+ store[Value.new(:objkey1)] = "strval1"
1046
+ store[Value.new(:objkey2)] = "strval2"
1047
+ store.clear.should equal(store)
1048
+ store.key?(Value.new(:objkey1)).should_not == true
1049
+ store.key?(Value.new(:objkey2)).should_not == true
1050
+ end
1051
+
1052
+ it "fetches a Object key with a default value with fetch, if the key is not available" do
1053
+ store.fetch(Value.new(:objkey1), "strval1").should == "strval1"
1054
+ end
1055
+
1056
+ it "fetches a Object key with a block with fetch, if the key is not available" do
1057
+ key = Value.new(:objkey1)
1058
+ value = "strval1"
1059
+ store.fetch(key) do |k|
1060
+ k.should equal(key)
1061
+ value
1062
+ end.should equal(value)
1063
+ end
1064
+
1065
+ it 'should accept options' do
1066
+ store.key?(Value.new(:objkey1), :option1 => 1).should == false
1067
+ store.load(Value.new(:objkey1), :option2 => 2).should == nil
1068
+ store.fetch(Value.new(:objkey1), 42, :option3 => 3).should == 42
1069
+ store.fetch(Value.new(:objkey1), :option3 => 3) { 42 }.should == 42
1070
+ store.delete(Value.new(:objkey1), :option4 => 4).should == nil
1071
+ store.clear(:option5 => 5).should equal(store)
1072
+ store.store(Value.new(:objkey1), "strval1", :option6 => 6).should == "strval1"
1073
+ end
1074
+ end
1075
+
1076
+ #################### store_objectkey_stringvalue ####################
1077
+
1078
+ shared_examples_for 'store_objectkey_stringvalue' do
1079
+ it "writes String values to keys that are Objects like a Hash" do
1080
+ store[Value.new(:objkey1)] = "strval1"
1081
+ store[Value.new(:objkey1)].should == "strval1"
1082
+ store.load(Value.new(:objkey1)).should == "strval1"
1083
+ end
1084
+
1085
+ it "returns true from key? if a Object key is available" do
1086
+ store[Value.new(:objkey1)] = "strval1"
1087
+ store.key?(Value.new(:objkey1)).should == true
1088
+ store[Value.new(:objkey2)] = "strval2"
1089
+ store.key?(Value.new(:objkey2)).should == true
1090
+ end
1091
+
1092
+ it "stores String values with Object keys with #store" do
1093
+ value = "strval1"
1094
+ store.store(Value.new(:objkey1), value).should equal(value)
1095
+ store[Value.new(:objkey1)].should == "strval1"
1096
+ store.load(Value.new(:objkey1)).should == "strval1"
1097
+ end
1098
+
1099
+ it "stores Object after clear" do
1100
+ store[Value.new(:objkey1)] = "strval1"
1101
+ store[Value.new(:objkey2)] = "strval2"
1102
+ store.clear.should equal(store)
1103
+ store[Value.new(:objkey1)] = "strval1"
1104
+ store[Value.new(:objkey1)].should == "strval1"
1105
+ store[Value.new(:objkey2)].should be_nil
1106
+ end
1107
+
1108
+ it "removes and returns a String element with a Object key from the backing store via delete if it exists" do
1109
+ store[Value.new(:objkey1)] = "strval1"
1110
+ store.delete(Value.new(:objkey1)).should == "strval1"
1111
+ store.key?(Value.new(:objkey1)).should == false
1112
+ end
1113
+
1114
+ it "overwrites existing String values with Object" do
1115
+ store[Value.new(:objkey1)] = "strval1"
1116
+ store[Value.new(:objkey1)].should == "strval1"
1117
+ store[Value.new(:objkey1)] = "strval2"
1118
+ store[Value.new(:objkey1)].should == "strval2"
1119
+ end
1120
+
1121
+ it "does not run the block if the Object key is available" do
1122
+ store[Value.new(:objkey1)] = "strval1"
1123
+ unaltered = "unaltered"
1124
+ store.fetch(Value.new(:objkey1)) { unaltered = "altered" }
1125
+ unaltered.should == "unaltered"
1126
+ end
1127
+
1128
+ it "fetches a Object key with a default value with fetch, if the key is available" do
1129
+ store[Value.new(:objkey1)] = "strval1"
1130
+ store.fetch(Value.new(:objkey1), "strval2").should == "strval1"
1131
+ end
1132
+ end
1133
+
1134
+ #################### returndifferent_objectkey_stringvalue ####################
1135
+
1136
+ shared_examples_for 'returndifferent_objectkey_stringvalue' do
1137
+ it "guarantees that a different String value is retrieved from the Object key" do
1138
+ value = "strval1"
1139
+ store[Value.new(:objkey1)] = "strval1"
1140
+ store[Value.new(:objkey1)].should_not be_equal("strval1")
1141
+ end
1142
+ end
1143
+
1144
+ #################### expires_objectkey_stringvalue ####################
1145
+
1146
+ shared_examples_for 'expires_objectkey_stringvalue' do
1147
+ it 'should support expires on store and #[]' do
1148
+ store.store(Value.new(:objkey1), "strval1", :expires => 2)
1149
+ store[Value.new(:objkey1)].should == "strval1"
1150
+ sleep 1
1151
+ store[Value.new(:objkey1)].should == "strval1"
1152
+ sleep 2
1153
+ store[Value.new(:objkey1)].should == nil
1154
+ end
1155
+
1156
+ it 'should support expires on store and load' do
1157
+ store.store(Value.new(:objkey1), "strval1", :expires => 2)
1158
+ store.load(Value.new(:objkey1)).should == "strval1"
1159
+ sleep 1
1160
+ store.load(Value.new(:objkey1)).should == "strval1"
1161
+ sleep 2
1162
+ store.load(Value.new(:objkey1)).should == nil
1163
+ end
1164
+
1165
+ it 'should support expires on store and key?' do
1166
+ store.store(Value.new(:objkey1), "strval1", :expires => 2)
1167
+ store.key?(Value.new(:objkey1)).should == true
1168
+ sleep 1
1169
+ store.key?(Value.new(:objkey1)).should == true
1170
+ sleep 2
1171
+ store.key?(Value.new(:objkey1)).should == false
1172
+ end
1173
+
1174
+ it 'should support updating the expiration time in load' do
1175
+ store.store(Value.new(:objkey2), "strval2", :expires => 2)
1176
+ store[Value.new(:objkey2)].should == "strval2"
1177
+ sleep 1
1178
+ store.load(Value.new(:objkey2), :expires => 3).should == "strval2"
1179
+ store[Value.new(:objkey2)].should == "strval2"
1180
+ sleep 1
1181
+ store[Value.new(:objkey2)].should == "strval2"
1182
+ sleep 3
1183
+ store[Value.new(:objkey2)].should == nil
1184
+ end
1185
+
1186
+ it 'should support updating the expiration time in key?' do
1187
+ store.store(Value.new(:objkey2), "strval2", :expires => 2)
1188
+ store[Value.new(:objkey2)].should == "strval2"
1189
+ sleep 1
1190
+ store.key?(Value.new(:objkey2), :expires => 3).should be_true
1191
+ store[Value.new(:objkey2)].should == "strval2"
1192
+ sleep 1
1193
+ store[Value.new(:objkey2)].should == "strval2"
1194
+ sleep 3
1195
+ store[Value.new(:objkey2)].should == nil
1196
+ end
1197
+
1198
+ it 'should support updating the expiration time in fetch' do
1199
+ store.store(Value.new(:objkey1), "strval1", :expires => 2)
1200
+ store[Value.new(:objkey1)].should == "strval1"
1201
+ sleep 1
1202
+ store.fetch(Value.new(:objkey1), nil, :expires => 3).should == "strval1"
1203
+ store[Value.new(:objkey1)].should == "strval1"
1204
+ sleep 1
1205
+ store[Value.new(:objkey1)].should == "strval1"
1206
+ sleep 3
1207
+ store[Value.new(:objkey1)].should == nil
1208
+ end
1209
+
1210
+ it 'should respect expires in delete' do
1211
+ store.store(Value.new(:objkey2), "strval2", :expires => 2)
1212
+ store[Value.new(:objkey2)].should == "strval2"
1213
+ sleep 1
1214
+ store[Value.new(:objkey2)].should == "strval2"
1215
+ sleep 2
1216
+ store.delete(Value.new(:objkey2)).should == nil
1217
+ end
1218
+
1219
+ it 'should support the #expires syntactic sugar' do
1220
+ store['longlive_key'] = 'longlive_value'
1221
+ store.expires(2).store(Value.new(:objkey2), "strval2")
1222
+ store[Value.new(:objkey2)].should == "strval2"
1223
+ sleep 1
1224
+ store[Value.new(:objkey2)].should == "strval2"
1225
+ sleep 2
1226
+ store.delete(Value.new(:objkey2)).should == nil
1227
+ store['longlive_key'].should == 'longlive_value'
1228
+ end
1229
+ end
1230
+
1231
+ #################### null_objectkey_hashvalue ####################
1232
+
1233
+ shared_examples_for 'null_objectkey_hashvalue' do
1234
+ it "reads from keys that are Objects like a Hash" do
1235
+ store[Value.new(:objkey1)].should == nil
1236
+ store.load(Value.new(:objkey1)).should == nil
1237
+ end
1238
+
1239
+ it "guarantees that the same Hash value is returned when setting a Object key" do
1240
+ value = {"hashval1"=>["array1", 1]}
1241
+ (store[Value.new(:objkey1)] = value).should equal(value)
1242
+ end
1243
+
1244
+ it "returns false from key? if a Object key is not available" do
1245
+ store.key?(Value.new(:objkey1)).should == false
1246
+ end
1247
+
1248
+ it "returns nil from delete if an element for a Object key does not exist" do
1249
+ store.delete(Value.new(:objkey1)).should == nil
1250
+ end
1251
+
1252
+ it "removes all Object keys from the store with clear" do
1253
+ store[Value.new(:objkey1)] = {"hashval1"=>["array1", 1]}
1254
+ store[Value.new(:objkey2)] = {"hashval3"=>["array2", {"hashval4"=>42}]}
1255
+ store.clear.should equal(store)
1256
+ store.key?(Value.new(:objkey1)).should_not == true
1257
+ store.key?(Value.new(:objkey2)).should_not == true
1258
+ end
1259
+
1260
+ it "fetches a Object key with a default value with fetch, if the key is not available" do
1261
+ store.fetch(Value.new(:objkey1), {"hashval1"=>["array1", 1]}).should == {"hashval1"=>["array1", 1]}
1262
+ end
1263
+
1264
+ it "fetches a Object key with a block with fetch, if the key is not available" do
1265
+ key = Value.new(:objkey1)
1266
+ value = {"hashval1"=>["array1", 1]}
1267
+ store.fetch(key) do |k|
1268
+ k.should equal(key)
1269
+ value
1270
+ end.should equal(value)
1271
+ end
1272
+
1273
+ it 'should accept options' do
1274
+ store.key?(Value.new(:objkey1), :option1 => 1).should == false
1275
+ store.load(Value.new(:objkey1), :option2 => 2).should == nil
1276
+ store.fetch(Value.new(:objkey1), 42, :option3 => 3).should == 42
1277
+ store.fetch(Value.new(:objkey1), :option3 => 3) { 42 }.should == 42
1278
+ store.delete(Value.new(:objkey1), :option4 => 4).should == nil
1279
+ store.clear(:option5 => 5).should equal(store)
1280
+ store.store(Value.new(:objkey1), {"hashval1"=>["array1", 1]}, :option6 => 6).should == {"hashval1"=>["array1", 1]}
1281
+ end
1282
+ end
1283
+
1284
+ #################### store_objectkey_hashvalue ####################
1285
+
1286
+ shared_examples_for 'store_objectkey_hashvalue' do
1287
+ it "writes Hash values to keys that are Objects like a Hash" do
1288
+ store[Value.new(:objkey1)] = {"hashval1"=>["array1", 1]}
1289
+ store[Value.new(:objkey1)].should == {"hashval1"=>["array1", 1]}
1290
+ store.load(Value.new(:objkey1)).should == {"hashval1"=>["array1", 1]}
1291
+ end
1292
+
1293
+ it "returns true from key? if a Object key is available" do
1294
+ store[Value.new(:objkey1)] = {"hashval1"=>["array1", 1]}
1295
+ store.key?(Value.new(:objkey1)).should == true
1296
+ store[Value.new(:objkey2)] = {"hashval3"=>["array2", {"hashval4"=>42}]}
1297
+ store.key?(Value.new(:objkey2)).should == true
1298
+ end
1299
+
1300
+ it "stores Hash values with Object keys with #store" do
1301
+ value = {"hashval1"=>["array1", 1]}
1302
+ store.store(Value.new(:objkey1), value).should equal(value)
1303
+ store[Value.new(:objkey1)].should == {"hashval1"=>["array1", 1]}
1304
+ store.load(Value.new(:objkey1)).should == {"hashval1"=>["array1", 1]}
1305
+ end
1306
+
1307
+ it "stores Object after clear" do
1308
+ store[Value.new(:objkey1)] = {"hashval1"=>["array1", 1]}
1309
+ store[Value.new(:objkey2)] = {"hashval3"=>["array2", {"hashval4"=>42}]}
1310
+ store.clear.should equal(store)
1311
+ store[Value.new(:objkey1)] = {"hashval1"=>["array1", 1]}
1312
+ store[Value.new(:objkey1)].should == {"hashval1"=>["array1", 1]}
1313
+ store[Value.new(:objkey2)].should be_nil
1314
+ end
1315
+
1316
+ it "removes and returns a Hash element with a Object key from the backing store via delete if it exists" do
1317
+ store[Value.new(:objkey1)] = {"hashval1"=>["array1", 1]}
1318
+ store.delete(Value.new(:objkey1)).should == {"hashval1"=>["array1", 1]}
1319
+ store.key?(Value.new(:objkey1)).should == false
1320
+ end
1321
+
1322
+ it "overwrites existing Hash values with Object" do
1323
+ store[Value.new(:objkey1)] = {"hashval1"=>["array1", 1]}
1324
+ store[Value.new(:objkey1)].should == {"hashval1"=>["array1", 1]}
1325
+ store[Value.new(:objkey1)] = {"hashval3"=>["array2", {"hashval4"=>42}]}
1326
+ store[Value.new(:objkey1)].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
1327
+ end
1328
+
1329
+ it "does not run the block if the Object key is available" do
1330
+ store[Value.new(:objkey1)] = {"hashval1"=>["array1", 1]}
1331
+ unaltered = "unaltered"
1332
+ store.fetch(Value.new(:objkey1)) { unaltered = "altered" }
1333
+ unaltered.should == "unaltered"
1334
+ end
1335
+
1336
+ it "fetches a Object key with a default value with fetch, if the key is available" do
1337
+ store[Value.new(:objkey1)] = {"hashval1"=>["array1", 1]}
1338
+ store.fetch(Value.new(:objkey1), {"hashval3"=>["array2", {"hashval4"=>42}]}).should == {"hashval1"=>["array1", 1]}
1339
+ end
1340
+ end
1341
+
1342
+ #################### returndifferent_objectkey_hashvalue ####################
1343
+
1344
+ shared_examples_for 'returndifferent_objectkey_hashvalue' do
1345
+ it "guarantees that a different Hash value is retrieved from the Object key" do
1346
+ value = {"hashval1"=>["array1", 1]}
1347
+ store[Value.new(:objkey1)] = {"hashval1"=>["array1", 1]}
1348
+ store[Value.new(:objkey1)].should_not be_equal({"hashval1"=>["array1", 1]})
1349
+ end
1350
+ end
1351
+
1352
+ #################### expires_objectkey_hashvalue ####################
1353
+
1354
+ shared_examples_for 'expires_objectkey_hashvalue' do
1355
+ it 'should support expires on store and #[]' do
1356
+ store.store(Value.new(:objkey1), {"hashval1"=>["array1", 1]}, :expires => 2)
1357
+ store[Value.new(:objkey1)].should == {"hashval1"=>["array1", 1]}
1358
+ sleep 1
1359
+ store[Value.new(:objkey1)].should == {"hashval1"=>["array1", 1]}
1360
+ sleep 2
1361
+ store[Value.new(:objkey1)].should == nil
1362
+ end
1363
+
1364
+ it 'should support expires on store and load' do
1365
+ store.store(Value.new(:objkey1), {"hashval1"=>["array1", 1]}, :expires => 2)
1366
+ store.load(Value.new(:objkey1)).should == {"hashval1"=>["array1", 1]}
1367
+ sleep 1
1368
+ store.load(Value.new(:objkey1)).should == {"hashval1"=>["array1", 1]}
1369
+ sleep 2
1370
+ store.load(Value.new(:objkey1)).should == nil
1371
+ end
1372
+
1373
+ it 'should support expires on store and key?' do
1374
+ store.store(Value.new(:objkey1), {"hashval1"=>["array1", 1]}, :expires => 2)
1375
+ store.key?(Value.new(:objkey1)).should == true
1376
+ sleep 1
1377
+ store.key?(Value.new(:objkey1)).should == true
1378
+ sleep 2
1379
+ store.key?(Value.new(:objkey1)).should == false
1380
+ end
1381
+
1382
+ it 'should support updating the expiration time in load' do
1383
+ store.store(Value.new(:objkey2), {"hashval3"=>["array2", {"hashval4"=>42}]}, :expires => 2)
1384
+ store[Value.new(:objkey2)].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
1385
+ sleep 1
1386
+ store.load(Value.new(:objkey2), :expires => 3).should == {"hashval3"=>["array2", {"hashval4"=>42}]}
1387
+ store[Value.new(:objkey2)].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
1388
+ sleep 1
1389
+ store[Value.new(:objkey2)].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
1390
+ sleep 3
1391
+ store[Value.new(:objkey2)].should == nil
1392
+ end
1393
+
1394
+ it 'should support updating the expiration time in key?' do
1395
+ store.store(Value.new(:objkey2), {"hashval3"=>["array2", {"hashval4"=>42}]}, :expires => 2)
1396
+ store[Value.new(:objkey2)].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
1397
+ sleep 1
1398
+ store.key?(Value.new(:objkey2), :expires => 3).should be_true
1399
+ store[Value.new(:objkey2)].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
1400
+ sleep 1
1401
+ store[Value.new(:objkey2)].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
1402
+ sleep 3
1403
+ store[Value.new(:objkey2)].should == nil
1404
+ end
1405
+
1406
+ it 'should support updating the expiration time in fetch' do
1407
+ store.store(Value.new(:objkey1), {"hashval1"=>["array1", 1]}, :expires => 2)
1408
+ store[Value.new(:objkey1)].should == {"hashval1"=>["array1", 1]}
1409
+ sleep 1
1410
+ store.fetch(Value.new(:objkey1), nil, :expires => 3).should == {"hashval1"=>["array1", 1]}
1411
+ store[Value.new(:objkey1)].should == {"hashval1"=>["array1", 1]}
1412
+ sleep 1
1413
+ store[Value.new(:objkey1)].should == {"hashval1"=>["array1", 1]}
1414
+ sleep 3
1415
+ store[Value.new(:objkey1)].should == nil
1416
+ end
1417
+
1418
+ it 'should respect expires in delete' do
1419
+ store.store(Value.new(:objkey2), {"hashval3"=>["array2", {"hashval4"=>42}]}, :expires => 2)
1420
+ store[Value.new(:objkey2)].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
1421
+ sleep 1
1422
+ store[Value.new(:objkey2)].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
1423
+ sleep 2
1424
+ store.delete(Value.new(:objkey2)).should == nil
1425
+ end
1426
+
1427
+ it 'should support the #expires syntactic sugar' do
1428
+ store['longlive_key'] = 'longlive_value'
1429
+ store.expires(2).store(Value.new(:objkey2), {"hashval3"=>["array2", {"hashval4"=>42}]})
1430
+ store[Value.new(:objkey2)].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
1431
+ sleep 1
1432
+ store[Value.new(:objkey2)].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
1433
+ sleep 2
1434
+ store.delete(Value.new(:objkey2)).should == nil
1435
+ store['longlive_key'].should == 'longlive_value'
1436
+ end
1437
+ end
1438
+
1439
+ #################### null_objectkey_objectvalue ####################
1440
+
1441
+ shared_examples_for 'null_objectkey_objectvalue' do
1442
+ it "reads from keys that are Objects like a Hash" do
1443
+ store[Value.new(:objkey1)].should == nil
1444
+ store.load(Value.new(:objkey1)).should == nil
1445
+ end
1446
+
1447
+ it "guarantees that the same Object value is returned when setting a Object key" do
1448
+ value = Value.new(:objval1)
1449
+ (store[Value.new(:objkey1)] = value).should equal(value)
1450
+ end
1451
+
1452
+ it "returns false from key? if a Object key is not available" do
1453
+ store.key?(Value.new(:objkey1)).should == false
1454
+ end
1455
+
1456
+ it "returns nil from delete if an element for a Object key does not exist" do
1457
+ store.delete(Value.new(:objkey1)).should == nil
1458
+ end
1459
+
1460
+ it "removes all Object keys from the store with clear" do
1461
+ store[Value.new(:objkey1)] = Value.new(:objval1)
1462
+ store[Value.new(:objkey2)] = Value.new(:objval2)
1463
+ store.clear.should equal(store)
1464
+ store.key?(Value.new(:objkey1)).should_not == true
1465
+ store.key?(Value.new(:objkey2)).should_not == true
1466
+ end
1467
+
1468
+ it "fetches a Object key with a default value with fetch, if the key is not available" do
1469
+ store.fetch(Value.new(:objkey1), Value.new(:objval1)).should == Value.new(:objval1)
1470
+ end
1471
+
1472
+ it "fetches a Object key with a block with fetch, if the key is not available" do
1473
+ key = Value.new(:objkey1)
1474
+ value = Value.new(:objval1)
1475
+ store.fetch(key) do |k|
1476
+ k.should equal(key)
1477
+ value
1478
+ end.should equal(value)
1479
+ end
1480
+
1481
+ it 'should accept options' do
1482
+ store.key?(Value.new(:objkey1), :option1 => 1).should == false
1483
+ store.load(Value.new(:objkey1), :option2 => 2).should == nil
1484
+ store.fetch(Value.new(:objkey1), 42, :option3 => 3).should == 42
1485
+ store.fetch(Value.new(:objkey1), :option3 => 3) { 42 }.should == 42
1486
+ store.delete(Value.new(:objkey1), :option4 => 4).should == nil
1487
+ store.clear(:option5 => 5).should equal(store)
1488
+ store.store(Value.new(:objkey1), Value.new(:objval1), :option6 => 6).should == Value.new(:objval1)
1489
+ end
1490
+ end
1491
+
1492
+ #################### store_objectkey_objectvalue ####################
1493
+
1494
+ shared_examples_for 'store_objectkey_objectvalue' do
1495
+ it "writes Object values to keys that are Objects like a Hash" do
1496
+ store[Value.new(:objkey1)] = Value.new(:objval1)
1497
+ store[Value.new(:objkey1)].should == Value.new(:objval1)
1498
+ store.load(Value.new(:objkey1)).should == Value.new(:objval1)
1499
+ end
1500
+
1501
+ it "returns true from key? if a Object key is available" do
1502
+ store[Value.new(:objkey1)] = Value.new(:objval1)
1503
+ store.key?(Value.new(:objkey1)).should == true
1504
+ store[Value.new(:objkey2)] = Value.new(:objval2)
1505
+ store.key?(Value.new(:objkey2)).should == true
1506
+ end
1507
+
1508
+ it "stores Object values with Object keys with #store" do
1509
+ value = Value.new(:objval1)
1510
+ store.store(Value.new(:objkey1), value).should equal(value)
1511
+ store[Value.new(:objkey1)].should == Value.new(:objval1)
1512
+ store.load(Value.new(:objkey1)).should == Value.new(:objval1)
1513
+ end
1514
+
1515
+ it "stores Object after clear" do
1516
+ store[Value.new(:objkey1)] = Value.new(:objval1)
1517
+ store[Value.new(:objkey2)] = Value.new(:objval2)
1518
+ store.clear.should equal(store)
1519
+ store[Value.new(:objkey1)] = Value.new(:objval1)
1520
+ store[Value.new(:objkey1)].should == Value.new(:objval1)
1521
+ store[Value.new(:objkey2)].should be_nil
1522
+ end
1523
+
1524
+ it "removes and returns a Object element with a Object key from the backing store via delete if it exists" do
1525
+ store[Value.new(:objkey1)] = Value.new(:objval1)
1526
+ store.delete(Value.new(:objkey1)).should == Value.new(:objval1)
1527
+ store.key?(Value.new(:objkey1)).should == false
1528
+ end
1529
+
1530
+ it "overwrites existing Object values with Object" do
1531
+ store[Value.new(:objkey1)] = Value.new(:objval1)
1532
+ store[Value.new(:objkey1)].should == Value.new(:objval1)
1533
+ store[Value.new(:objkey1)] = Value.new(:objval2)
1534
+ store[Value.new(:objkey1)].should == Value.new(:objval2)
1535
+ end
1536
+
1537
+ it "does not run the block if the Object key is available" do
1538
+ store[Value.new(:objkey1)] = Value.new(:objval1)
1539
+ unaltered = "unaltered"
1540
+ store.fetch(Value.new(:objkey1)) { unaltered = "altered" }
1541
+ unaltered.should == "unaltered"
1542
+ end
1543
+
1544
+ it "fetches a Object key with a default value with fetch, if the key is available" do
1545
+ store[Value.new(:objkey1)] = Value.new(:objval1)
1546
+ store.fetch(Value.new(:objkey1), Value.new(:objval2)).should == Value.new(:objval1)
1547
+ end
1548
+ end
1549
+
1550
+ #################### returndifferent_objectkey_objectvalue ####################
1551
+
1552
+ shared_examples_for 'returndifferent_objectkey_objectvalue' do
1553
+ it "guarantees that a different Object value is retrieved from the Object key" do
1554
+ value = Value.new(:objval1)
1555
+ store[Value.new(:objkey1)] = Value.new(:objval1)
1556
+ store[Value.new(:objkey1)].should_not be_equal(Value.new(:objval1))
1557
+ end
1558
+ end
1559
+
1560
+ #################### expires_objectkey_objectvalue ####################
1561
+
1562
+ shared_examples_for 'expires_objectkey_objectvalue' do
1563
+ it 'should support expires on store and #[]' do
1564
+ store.store(Value.new(:objkey1), Value.new(:objval1), :expires => 2)
1565
+ store[Value.new(:objkey1)].should == Value.new(:objval1)
1566
+ sleep 1
1567
+ store[Value.new(:objkey1)].should == Value.new(:objval1)
1568
+ sleep 2
1569
+ store[Value.new(:objkey1)].should == nil
1570
+ end
1571
+
1572
+ it 'should support expires on store and load' do
1573
+ store.store(Value.new(:objkey1), Value.new(:objval1), :expires => 2)
1574
+ store.load(Value.new(:objkey1)).should == Value.new(:objval1)
1575
+ sleep 1
1576
+ store.load(Value.new(:objkey1)).should == Value.new(:objval1)
1577
+ sleep 2
1578
+ store.load(Value.new(:objkey1)).should == nil
1579
+ end
1580
+
1581
+ it 'should support expires on store and key?' do
1582
+ store.store(Value.new(:objkey1), Value.new(:objval1), :expires => 2)
1583
+ store.key?(Value.new(:objkey1)).should == true
1584
+ sleep 1
1585
+ store.key?(Value.new(:objkey1)).should == true
1586
+ sleep 2
1587
+ store.key?(Value.new(:objkey1)).should == false
1588
+ end
1589
+
1590
+ it 'should support updating the expiration time in load' do
1591
+ store.store(Value.new(:objkey2), Value.new(:objval2), :expires => 2)
1592
+ store[Value.new(:objkey2)].should == Value.new(:objval2)
1593
+ sleep 1
1594
+ store.load(Value.new(:objkey2), :expires => 3).should == Value.new(:objval2)
1595
+ store[Value.new(:objkey2)].should == Value.new(:objval2)
1596
+ sleep 1
1597
+ store[Value.new(:objkey2)].should == Value.new(:objval2)
1598
+ sleep 3
1599
+ store[Value.new(:objkey2)].should == nil
1600
+ end
1601
+
1602
+ it 'should support updating the expiration time in key?' do
1603
+ store.store(Value.new(:objkey2), Value.new(:objval2), :expires => 2)
1604
+ store[Value.new(:objkey2)].should == Value.new(:objval2)
1605
+ sleep 1
1606
+ store.key?(Value.new(:objkey2), :expires => 3).should be_true
1607
+ store[Value.new(:objkey2)].should == Value.new(:objval2)
1608
+ sleep 1
1609
+ store[Value.new(:objkey2)].should == Value.new(:objval2)
1610
+ sleep 3
1611
+ store[Value.new(:objkey2)].should == nil
1612
+ end
1613
+
1614
+ it 'should support updating the expiration time in fetch' do
1615
+ store.store(Value.new(:objkey1), Value.new(:objval1), :expires => 2)
1616
+ store[Value.new(:objkey1)].should == Value.new(:objval1)
1617
+ sleep 1
1618
+ store.fetch(Value.new(:objkey1), nil, :expires => 3).should == Value.new(:objval1)
1619
+ store[Value.new(:objkey1)].should == Value.new(:objval1)
1620
+ sleep 1
1621
+ store[Value.new(:objkey1)].should == Value.new(:objval1)
1622
+ sleep 3
1623
+ store[Value.new(:objkey1)].should == nil
1624
+ end
1625
+
1626
+ it 'should respect expires in delete' do
1627
+ store.store(Value.new(:objkey2), Value.new(:objval2), :expires => 2)
1628
+ store[Value.new(:objkey2)].should == Value.new(:objval2)
1629
+ sleep 1
1630
+ store[Value.new(:objkey2)].should == Value.new(:objval2)
1631
+ sleep 2
1632
+ store.delete(Value.new(:objkey2)).should == nil
1633
+ end
1634
+
1635
+ it 'should support the #expires syntactic sugar' do
1636
+ store['longlive_key'] = 'longlive_value'
1637
+ store.expires(2).store(Value.new(:objkey2), Value.new(:objval2))
1638
+ store[Value.new(:objkey2)].should == Value.new(:objval2)
1639
+ sleep 1
1640
+ store[Value.new(:objkey2)].should == Value.new(:objval2)
1641
+ sleep 2
1642
+ store.delete(Value.new(:objkey2)).should == nil
1643
+ store['longlive_key'].should == 'longlive_value'
1644
+ end
1645
+ end
1646
+
1647
+ #################### null_hashkey_booleanvalue ####################
1648
+
1649
+ shared_examples_for 'null_hashkey_booleanvalue' do
1650
+ it "reads from keys that are Hashs like a Hash" do
1651
+ store[{"hashkey1"=>"hashkey2"}].should == nil
1652
+ store.load({"hashkey1"=>"hashkey2"}).should == nil
1653
+ end
1654
+
1655
+ it "guarantees that the same Boolean value is returned when setting a Hash key" do
1656
+ value = true
1657
+ (store[{"hashkey1"=>"hashkey2"}] = value).should equal(value)
1658
+ end
1659
+
1660
+ it "returns false from key? if a Hash key is not available" do
1661
+ store.key?({"hashkey1"=>"hashkey2"}).should == false
1662
+ end
1663
+
1664
+ it "returns nil from delete if an element for a Hash key does not exist" do
1665
+ store.delete({"hashkey1"=>"hashkey2"}).should == nil
1666
+ end
1667
+
1668
+ it "removes all Hash keys from the store with clear" do
1669
+ store[{"hashkey1"=>"hashkey2"}] = true
1670
+ store[{"hashkey3"=>"hashkey4"}] = false
1671
+ store.clear.should equal(store)
1672
+ store.key?({"hashkey1"=>"hashkey2"}).should_not == true
1673
+ store.key?({"hashkey3"=>"hashkey4"}).should_not == true
1674
+ end
1675
+
1676
+ it "fetches a Hash key with a default value with fetch, if the key is not available" do
1677
+ store.fetch({"hashkey1"=>"hashkey2"}, true).should == true
1678
+ end
1679
+
1680
+ it "fetches a Hash key with a block with fetch, if the key is not available" do
1681
+ key = {"hashkey1"=>"hashkey2"}
1682
+ value = true
1683
+ store.fetch(key) do |k|
1684
+ k.should equal(key)
1685
+ value
1686
+ end.should equal(value)
1687
+ end
1688
+
1689
+ it 'should accept options' do
1690
+ store.key?({"hashkey1"=>"hashkey2"}, :option1 => 1).should == false
1691
+ store.load({"hashkey1"=>"hashkey2"}, :option2 => 2).should == nil
1692
+ store.fetch({"hashkey1"=>"hashkey2"}, 42, :option3 => 3).should == 42
1693
+ store.fetch({"hashkey1"=>"hashkey2"}, :option3 => 3) { 42 }.should == 42
1694
+ store.delete({"hashkey1"=>"hashkey2"}, :option4 => 4).should == nil
1695
+ store.clear(:option5 => 5).should equal(store)
1696
+ store.store({"hashkey1"=>"hashkey2"}, true, :option6 => 6).should == true
1697
+ end
1698
+ end
1699
+
1700
+ #################### store_hashkey_booleanvalue ####################
1701
+
1702
+ shared_examples_for 'store_hashkey_booleanvalue' do
1703
+ it "writes Boolean values to keys that are Hashs like a Hash" do
1704
+ store[{"hashkey1"=>"hashkey2"}] = true
1705
+ store[{"hashkey1"=>"hashkey2"}].should == true
1706
+ store.load({"hashkey1"=>"hashkey2"}).should == true
1707
+ end
1708
+
1709
+ it "returns true from key? if a Hash key is available" do
1710
+ store[{"hashkey1"=>"hashkey2"}] = true
1711
+ store.key?({"hashkey1"=>"hashkey2"}).should == true
1712
+ store[{"hashkey3"=>"hashkey4"}] = false
1713
+ store.key?({"hashkey3"=>"hashkey4"}).should == true
1714
+ end
1715
+
1716
+ it "stores Boolean values with Hash keys with #store" do
1717
+ value = true
1718
+ store.store({"hashkey1"=>"hashkey2"}, value).should equal(value)
1719
+ store[{"hashkey1"=>"hashkey2"}].should == true
1720
+ store.load({"hashkey1"=>"hashkey2"}).should == true
1721
+ end
1722
+
1723
+ it "stores Hash after clear" do
1724
+ store[{"hashkey1"=>"hashkey2"}] = true
1725
+ store[{"hashkey3"=>"hashkey4"}] = false
1726
+ store.clear.should equal(store)
1727
+ store[{"hashkey1"=>"hashkey2"}] = true
1728
+ store[{"hashkey1"=>"hashkey2"}].should == true
1729
+ store[{"hashkey3"=>"hashkey4"}].should be_nil
1730
+ end
1731
+
1732
+ it "removes and returns a Boolean element with a Hash key from the backing store via delete if it exists" do
1733
+ store[{"hashkey1"=>"hashkey2"}] = true
1734
+ store.delete({"hashkey1"=>"hashkey2"}).should == true
1735
+ store.key?({"hashkey1"=>"hashkey2"}).should == false
1736
+ end
1737
+
1738
+ it "overwrites existing Boolean values with Hash" do
1739
+ store[{"hashkey1"=>"hashkey2"}] = true
1740
+ store[{"hashkey1"=>"hashkey2"}].should == true
1741
+ store[{"hashkey1"=>"hashkey2"}] = false
1742
+ store[{"hashkey1"=>"hashkey2"}].should == false
1743
+ end
1744
+
1745
+ it "does not run the block if the Hash key is available" do
1746
+ store[{"hashkey1"=>"hashkey2"}] = true
1747
+ unaltered = "unaltered"
1748
+ store.fetch({"hashkey1"=>"hashkey2"}) { unaltered = "altered" }
1749
+ unaltered.should == "unaltered"
1750
+ end
1751
+
1752
+ it "fetches a Hash key with a default value with fetch, if the key is available" do
1753
+ store[{"hashkey1"=>"hashkey2"}] = true
1754
+ store.fetch({"hashkey1"=>"hashkey2"}, false).should == true
1755
+ end
1756
+ end
1757
+
1758
+ #################### expires_hashkey_booleanvalue ####################
1759
+
1760
+ shared_examples_for 'expires_hashkey_booleanvalue' do
1761
+ it 'should support expires on store and #[]' do
1762
+ store.store({"hashkey1"=>"hashkey2"}, true, :expires => 2)
1763
+ store[{"hashkey1"=>"hashkey2"}].should == true
1764
+ sleep 1
1765
+ store[{"hashkey1"=>"hashkey2"}].should == true
1766
+ sleep 2
1767
+ store[{"hashkey1"=>"hashkey2"}].should == nil
1768
+ end
1769
+
1770
+ it 'should support expires on store and load' do
1771
+ store.store({"hashkey1"=>"hashkey2"}, true, :expires => 2)
1772
+ store.load({"hashkey1"=>"hashkey2"}).should == true
1773
+ sleep 1
1774
+ store.load({"hashkey1"=>"hashkey2"}).should == true
1775
+ sleep 2
1776
+ store.load({"hashkey1"=>"hashkey2"}).should == nil
1777
+ end
1778
+
1779
+ it 'should support expires on store and key?' do
1780
+ store.store({"hashkey1"=>"hashkey2"}, true, :expires => 2)
1781
+ store.key?({"hashkey1"=>"hashkey2"}).should == true
1782
+ sleep 1
1783
+ store.key?({"hashkey1"=>"hashkey2"}).should == true
1784
+ sleep 2
1785
+ store.key?({"hashkey1"=>"hashkey2"}).should == false
1786
+ end
1787
+
1788
+ it 'should support updating the expiration time in load' do
1789
+ store.store({"hashkey3"=>"hashkey4"}, false, :expires => 2)
1790
+ store[{"hashkey3"=>"hashkey4"}].should == false
1791
+ sleep 1
1792
+ store.load({"hashkey3"=>"hashkey4"}, :expires => 3).should == false
1793
+ store[{"hashkey3"=>"hashkey4"}].should == false
1794
+ sleep 1
1795
+ store[{"hashkey3"=>"hashkey4"}].should == false
1796
+ sleep 3
1797
+ store[{"hashkey3"=>"hashkey4"}].should == nil
1798
+ end
1799
+
1800
+ it 'should support updating the expiration time in key?' do
1801
+ store.store({"hashkey3"=>"hashkey4"}, false, :expires => 2)
1802
+ store[{"hashkey3"=>"hashkey4"}].should == false
1803
+ sleep 1
1804
+ store.key?({"hashkey3"=>"hashkey4"}, :expires => 3).should be_true
1805
+ store[{"hashkey3"=>"hashkey4"}].should == false
1806
+ sleep 1
1807
+ store[{"hashkey3"=>"hashkey4"}].should == false
1808
+ sleep 3
1809
+ store[{"hashkey3"=>"hashkey4"}].should == nil
1810
+ end
1811
+
1812
+ it 'should support updating the expiration time in fetch' do
1813
+ store.store({"hashkey1"=>"hashkey2"}, true, :expires => 2)
1814
+ store[{"hashkey1"=>"hashkey2"}].should == true
1815
+ sleep 1
1816
+ store.fetch({"hashkey1"=>"hashkey2"}, nil, :expires => 3).should == true
1817
+ store[{"hashkey1"=>"hashkey2"}].should == true
1818
+ sleep 1
1819
+ store[{"hashkey1"=>"hashkey2"}].should == true
1820
+ sleep 3
1821
+ store[{"hashkey1"=>"hashkey2"}].should == nil
1822
+ end
1823
+
1824
+ it 'should respect expires in delete' do
1825
+ store.store({"hashkey3"=>"hashkey4"}, false, :expires => 2)
1826
+ store[{"hashkey3"=>"hashkey4"}].should == false
1827
+ sleep 1
1828
+ store[{"hashkey3"=>"hashkey4"}].should == false
1829
+ sleep 2
1830
+ store.delete({"hashkey3"=>"hashkey4"}).should == nil
1831
+ end
1832
+
1833
+ it 'should support the #expires syntactic sugar' do
1834
+ store['longlive_key'] = 'longlive_value'
1835
+ store.expires(2).store({"hashkey3"=>"hashkey4"}, false)
1836
+ store[{"hashkey3"=>"hashkey4"}].should == false
1837
+ sleep 1
1838
+ store[{"hashkey3"=>"hashkey4"}].should == false
1839
+ sleep 2
1840
+ store.delete({"hashkey3"=>"hashkey4"}).should == nil
1841
+ store['longlive_key'].should == 'longlive_value'
1842
+ end
1843
+ end
1844
+
1845
+ #################### null_hashkey_stringvalue ####################
1846
+
1847
+ shared_examples_for 'null_hashkey_stringvalue' do
1848
+ it "reads from keys that are Hashs like a Hash" do
1849
+ store[{"hashkey1"=>"hashkey2"}].should == nil
1850
+ store.load({"hashkey1"=>"hashkey2"}).should == nil
1851
+ end
1852
+
1853
+ it "guarantees that the same String value is returned when setting a Hash key" do
1854
+ value = "strval1"
1855
+ (store[{"hashkey1"=>"hashkey2"}] = value).should equal(value)
1856
+ end
1857
+
1858
+ it "returns false from key? if a Hash key is not available" do
1859
+ store.key?({"hashkey1"=>"hashkey2"}).should == false
1860
+ end
1861
+
1862
+ it "returns nil from delete if an element for a Hash key does not exist" do
1863
+ store.delete({"hashkey1"=>"hashkey2"}).should == nil
1864
+ end
1865
+
1866
+ it "removes all Hash keys from the store with clear" do
1867
+ store[{"hashkey1"=>"hashkey2"}] = "strval1"
1868
+ store[{"hashkey3"=>"hashkey4"}] = "strval2"
1869
+ store.clear.should equal(store)
1870
+ store.key?({"hashkey1"=>"hashkey2"}).should_not == true
1871
+ store.key?({"hashkey3"=>"hashkey4"}).should_not == true
1872
+ end
1873
+
1874
+ it "fetches a Hash key with a default value with fetch, if the key is not available" do
1875
+ store.fetch({"hashkey1"=>"hashkey2"}, "strval1").should == "strval1"
1876
+ end
1877
+
1878
+ it "fetches a Hash key with a block with fetch, if the key is not available" do
1879
+ key = {"hashkey1"=>"hashkey2"}
1880
+ value = "strval1"
1881
+ store.fetch(key) do |k|
1882
+ k.should equal(key)
1883
+ value
1884
+ end.should equal(value)
1885
+ end
1886
+
1887
+ it 'should accept options' do
1888
+ store.key?({"hashkey1"=>"hashkey2"}, :option1 => 1).should == false
1889
+ store.load({"hashkey1"=>"hashkey2"}, :option2 => 2).should == nil
1890
+ store.fetch({"hashkey1"=>"hashkey2"}, 42, :option3 => 3).should == 42
1891
+ store.fetch({"hashkey1"=>"hashkey2"}, :option3 => 3) { 42 }.should == 42
1892
+ store.delete({"hashkey1"=>"hashkey2"}, :option4 => 4).should == nil
1893
+ store.clear(:option5 => 5).should equal(store)
1894
+ store.store({"hashkey1"=>"hashkey2"}, "strval1", :option6 => 6).should == "strval1"
1895
+ end
1896
+ end
1897
+
1898
+ #################### store_hashkey_stringvalue ####################
1899
+
1900
+ shared_examples_for 'store_hashkey_stringvalue' do
1901
+ it "writes String values to keys that are Hashs like a Hash" do
1902
+ store[{"hashkey1"=>"hashkey2"}] = "strval1"
1903
+ store[{"hashkey1"=>"hashkey2"}].should == "strval1"
1904
+ store.load({"hashkey1"=>"hashkey2"}).should == "strval1"
1905
+ end
1906
+
1907
+ it "returns true from key? if a Hash key is available" do
1908
+ store[{"hashkey1"=>"hashkey2"}] = "strval1"
1909
+ store.key?({"hashkey1"=>"hashkey2"}).should == true
1910
+ store[{"hashkey3"=>"hashkey4"}] = "strval2"
1911
+ store.key?({"hashkey3"=>"hashkey4"}).should == true
1912
+ end
1913
+
1914
+ it "stores String values with Hash keys with #store" do
1915
+ value = "strval1"
1916
+ store.store({"hashkey1"=>"hashkey2"}, value).should equal(value)
1917
+ store[{"hashkey1"=>"hashkey2"}].should == "strval1"
1918
+ store.load({"hashkey1"=>"hashkey2"}).should == "strval1"
1919
+ end
1920
+
1921
+ it "stores Hash after clear" do
1922
+ store[{"hashkey1"=>"hashkey2"}] = "strval1"
1923
+ store[{"hashkey3"=>"hashkey4"}] = "strval2"
1924
+ store.clear.should equal(store)
1925
+ store[{"hashkey1"=>"hashkey2"}] = "strval1"
1926
+ store[{"hashkey1"=>"hashkey2"}].should == "strval1"
1927
+ store[{"hashkey3"=>"hashkey4"}].should be_nil
1928
+ end
1929
+
1930
+ it "removes and returns a String element with a Hash key from the backing store via delete if it exists" do
1931
+ store[{"hashkey1"=>"hashkey2"}] = "strval1"
1932
+ store.delete({"hashkey1"=>"hashkey2"}).should == "strval1"
1933
+ store.key?({"hashkey1"=>"hashkey2"}).should == false
1934
+ end
1935
+
1936
+ it "overwrites existing String values with Hash" do
1937
+ store[{"hashkey1"=>"hashkey2"}] = "strval1"
1938
+ store[{"hashkey1"=>"hashkey2"}].should == "strval1"
1939
+ store[{"hashkey1"=>"hashkey2"}] = "strval2"
1940
+ store[{"hashkey1"=>"hashkey2"}].should == "strval2"
1941
+ end
1942
+
1943
+ it "does not run the block if the Hash key is available" do
1944
+ store[{"hashkey1"=>"hashkey2"}] = "strval1"
1945
+ unaltered = "unaltered"
1946
+ store.fetch({"hashkey1"=>"hashkey2"}) { unaltered = "altered" }
1947
+ unaltered.should == "unaltered"
1948
+ end
1949
+
1950
+ it "fetches a Hash key with a default value with fetch, if the key is available" do
1951
+ store[{"hashkey1"=>"hashkey2"}] = "strval1"
1952
+ store.fetch({"hashkey1"=>"hashkey2"}, "strval2").should == "strval1"
1953
+ end
1954
+ end
1955
+
1956
+ #################### returndifferent_hashkey_stringvalue ####################
1957
+
1958
+ shared_examples_for 'returndifferent_hashkey_stringvalue' do
1959
+ it "guarantees that a different String value is retrieved from the Hash key" do
1960
+ value = "strval1"
1961
+ store[{"hashkey1"=>"hashkey2"}] = "strval1"
1962
+ store[{"hashkey1"=>"hashkey2"}].should_not be_equal("strval1")
1963
+ end
1964
+ end
1965
+
1966
+ #################### expires_hashkey_stringvalue ####################
1967
+
1968
+ shared_examples_for 'expires_hashkey_stringvalue' do
1969
+ it 'should support expires on store and #[]' do
1970
+ store.store({"hashkey1"=>"hashkey2"}, "strval1", :expires => 2)
1971
+ store[{"hashkey1"=>"hashkey2"}].should == "strval1"
1972
+ sleep 1
1973
+ store[{"hashkey1"=>"hashkey2"}].should == "strval1"
1974
+ sleep 2
1975
+ store[{"hashkey1"=>"hashkey2"}].should == nil
1976
+ end
1977
+
1978
+ it 'should support expires on store and load' do
1979
+ store.store({"hashkey1"=>"hashkey2"}, "strval1", :expires => 2)
1980
+ store.load({"hashkey1"=>"hashkey2"}).should == "strval1"
1981
+ sleep 1
1982
+ store.load({"hashkey1"=>"hashkey2"}).should == "strval1"
1983
+ sleep 2
1984
+ store.load({"hashkey1"=>"hashkey2"}).should == nil
1985
+ end
1986
+
1987
+ it 'should support expires on store and key?' do
1988
+ store.store({"hashkey1"=>"hashkey2"}, "strval1", :expires => 2)
1989
+ store.key?({"hashkey1"=>"hashkey2"}).should == true
1990
+ sleep 1
1991
+ store.key?({"hashkey1"=>"hashkey2"}).should == true
1992
+ sleep 2
1993
+ store.key?({"hashkey1"=>"hashkey2"}).should == false
1994
+ end
1995
+
1996
+ it 'should support updating the expiration time in load' do
1997
+ store.store({"hashkey3"=>"hashkey4"}, "strval2", :expires => 2)
1998
+ store[{"hashkey3"=>"hashkey4"}].should == "strval2"
1999
+ sleep 1
2000
+ store.load({"hashkey3"=>"hashkey4"}, :expires => 3).should == "strval2"
2001
+ store[{"hashkey3"=>"hashkey4"}].should == "strval2"
2002
+ sleep 1
2003
+ store[{"hashkey3"=>"hashkey4"}].should == "strval2"
2004
+ sleep 3
2005
+ store[{"hashkey3"=>"hashkey4"}].should == nil
2006
+ end
2007
+
2008
+ it 'should support updating the expiration time in key?' do
2009
+ store.store({"hashkey3"=>"hashkey4"}, "strval2", :expires => 2)
2010
+ store[{"hashkey3"=>"hashkey4"}].should == "strval2"
2011
+ sleep 1
2012
+ store.key?({"hashkey3"=>"hashkey4"}, :expires => 3).should be_true
2013
+ store[{"hashkey3"=>"hashkey4"}].should == "strval2"
2014
+ sleep 1
2015
+ store[{"hashkey3"=>"hashkey4"}].should == "strval2"
2016
+ sleep 3
2017
+ store[{"hashkey3"=>"hashkey4"}].should == nil
2018
+ end
2019
+
2020
+ it 'should support updating the expiration time in fetch' do
2021
+ store.store({"hashkey1"=>"hashkey2"}, "strval1", :expires => 2)
2022
+ store[{"hashkey1"=>"hashkey2"}].should == "strval1"
2023
+ sleep 1
2024
+ store.fetch({"hashkey1"=>"hashkey2"}, nil, :expires => 3).should == "strval1"
2025
+ store[{"hashkey1"=>"hashkey2"}].should == "strval1"
2026
+ sleep 1
2027
+ store[{"hashkey1"=>"hashkey2"}].should == "strval1"
2028
+ sleep 3
2029
+ store[{"hashkey1"=>"hashkey2"}].should == nil
2030
+ end
2031
+
2032
+ it 'should respect expires in delete' do
2033
+ store.store({"hashkey3"=>"hashkey4"}, "strval2", :expires => 2)
2034
+ store[{"hashkey3"=>"hashkey4"}].should == "strval2"
2035
+ sleep 1
2036
+ store[{"hashkey3"=>"hashkey4"}].should == "strval2"
2037
+ sleep 2
2038
+ store.delete({"hashkey3"=>"hashkey4"}).should == nil
2039
+ end
2040
+
2041
+ it 'should support the #expires syntactic sugar' do
2042
+ store['longlive_key'] = 'longlive_value'
2043
+ store.expires(2).store({"hashkey3"=>"hashkey4"}, "strval2")
2044
+ store[{"hashkey3"=>"hashkey4"}].should == "strval2"
2045
+ sleep 1
2046
+ store[{"hashkey3"=>"hashkey4"}].should == "strval2"
2047
+ sleep 2
2048
+ store.delete({"hashkey3"=>"hashkey4"}).should == nil
2049
+ store['longlive_key'].should == 'longlive_value'
2050
+ end
2051
+ end
2052
+
2053
+ #################### null_hashkey_hashvalue ####################
2054
+
2055
+ shared_examples_for 'null_hashkey_hashvalue' do
2056
+ it "reads from keys that are Hashs like a Hash" do
2057
+ store[{"hashkey1"=>"hashkey2"}].should == nil
2058
+ store.load({"hashkey1"=>"hashkey2"}).should == nil
2059
+ end
2060
+
2061
+ it "guarantees that the same Hash value is returned when setting a Hash key" do
2062
+ value = {"hashval1"=>["array1", 1]}
2063
+ (store[{"hashkey1"=>"hashkey2"}] = value).should equal(value)
2064
+ end
2065
+
2066
+ it "returns false from key? if a Hash key is not available" do
2067
+ store.key?({"hashkey1"=>"hashkey2"}).should == false
2068
+ end
2069
+
2070
+ it "returns nil from delete if an element for a Hash key does not exist" do
2071
+ store.delete({"hashkey1"=>"hashkey2"}).should == nil
2072
+ end
2073
+
2074
+ it "removes all Hash keys from the store with clear" do
2075
+ store[{"hashkey1"=>"hashkey2"}] = {"hashval1"=>["array1", 1]}
2076
+ store[{"hashkey3"=>"hashkey4"}] = {"hashval3"=>["array2", {"hashval4"=>42}]}
2077
+ store.clear.should equal(store)
2078
+ store.key?({"hashkey1"=>"hashkey2"}).should_not == true
2079
+ store.key?({"hashkey3"=>"hashkey4"}).should_not == true
2080
+ end
2081
+
2082
+ it "fetches a Hash key with a default value with fetch, if the key is not available" do
2083
+ store.fetch({"hashkey1"=>"hashkey2"}, {"hashval1"=>["array1", 1]}).should == {"hashval1"=>["array1", 1]}
2084
+ end
2085
+
2086
+ it "fetches a Hash key with a block with fetch, if the key is not available" do
2087
+ key = {"hashkey1"=>"hashkey2"}
2088
+ value = {"hashval1"=>["array1", 1]}
2089
+ store.fetch(key) do |k|
2090
+ k.should equal(key)
2091
+ value
2092
+ end.should equal(value)
2093
+ end
2094
+
2095
+ it 'should accept options' do
2096
+ store.key?({"hashkey1"=>"hashkey2"}, :option1 => 1).should == false
2097
+ store.load({"hashkey1"=>"hashkey2"}, :option2 => 2).should == nil
2098
+ store.fetch({"hashkey1"=>"hashkey2"}, 42, :option3 => 3).should == 42
2099
+ store.fetch({"hashkey1"=>"hashkey2"}, :option3 => 3) { 42 }.should == 42
2100
+ store.delete({"hashkey1"=>"hashkey2"}, :option4 => 4).should == nil
2101
+ store.clear(:option5 => 5).should equal(store)
2102
+ store.store({"hashkey1"=>"hashkey2"}, {"hashval1"=>["array1", 1]}, :option6 => 6).should == {"hashval1"=>["array1", 1]}
2103
+ end
2104
+ end
2105
+
2106
+ #################### store_hashkey_hashvalue ####################
2107
+
2108
+ shared_examples_for 'store_hashkey_hashvalue' do
2109
+ it "writes Hash values to keys that are Hashs like a Hash" do
2110
+ store[{"hashkey1"=>"hashkey2"}] = {"hashval1"=>["array1", 1]}
2111
+ store[{"hashkey1"=>"hashkey2"}].should == {"hashval1"=>["array1", 1]}
2112
+ store.load({"hashkey1"=>"hashkey2"}).should == {"hashval1"=>["array1", 1]}
2113
+ end
2114
+
2115
+ it "returns true from key? if a Hash key is available" do
2116
+ store[{"hashkey1"=>"hashkey2"}] = {"hashval1"=>["array1", 1]}
2117
+ store.key?({"hashkey1"=>"hashkey2"}).should == true
2118
+ store[{"hashkey3"=>"hashkey4"}] = {"hashval3"=>["array2", {"hashval4"=>42}]}
2119
+ store.key?({"hashkey3"=>"hashkey4"}).should == true
2120
+ end
2121
+
2122
+ it "stores Hash values with Hash keys with #store" do
2123
+ value = {"hashval1"=>["array1", 1]}
2124
+ store.store({"hashkey1"=>"hashkey2"}, value).should equal(value)
2125
+ store[{"hashkey1"=>"hashkey2"}].should == {"hashval1"=>["array1", 1]}
2126
+ store.load({"hashkey1"=>"hashkey2"}).should == {"hashval1"=>["array1", 1]}
2127
+ end
2128
+
2129
+ it "stores Hash after clear" do
2130
+ store[{"hashkey1"=>"hashkey2"}] = {"hashval1"=>["array1", 1]}
2131
+ store[{"hashkey3"=>"hashkey4"}] = {"hashval3"=>["array2", {"hashval4"=>42}]}
2132
+ store.clear.should equal(store)
2133
+ store[{"hashkey1"=>"hashkey2"}] = {"hashval1"=>["array1", 1]}
2134
+ store[{"hashkey1"=>"hashkey2"}].should == {"hashval1"=>["array1", 1]}
2135
+ store[{"hashkey3"=>"hashkey4"}].should be_nil
2136
+ end
2137
+
2138
+ it "removes and returns a Hash element with a Hash key from the backing store via delete if it exists" do
2139
+ store[{"hashkey1"=>"hashkey2"}] = {"hashval1"=>["array1", 1]}
2140
+ store.delete({"hashkey1"=>"hashkey2"}).should == {"hashval1"=>["array1", 1]}
2141
+ store.key?({"hashkey1"=>"hashkey2"}).should == false
2142
+ end
2143
+
2144
+ it "overwrites existing Hash values with Hash" do
2145
+ store[{"hashkey1"=>"hashkey2"}] = {"hashval1"=>["array1", 1]}
2146
+ store[{"hashkey1"=>"hashkey2"}].should == {"hashval1"=>["array1", 1]}
2147
+ store[{"hashkey1"=>"hashkey2"}] = {"hashval3"=>["array2", {"hashval4"=>42}]}
2148
+ store[{"hashkey1"=>"hashkey2"}].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
2149
+ end
2150
+
2151
+ it "does not run the block if the Hash key is available" do
2152
+ store[{"hashkey1"=>"hashkey2"}] = {"hashval1"=>["array1", 1]}
2153
+ unaltered = "unaltered"
2154
+ store.fetch({"hashkey1"=>"hashkey2"}) { unaltered = "altered" }
2155
+ unaltered.should == "unaltered"
2156
+ end
2157
+
2158
+ it "fetches a Hash key with a default value with fetch, if the key is available" do
2159
+ store[{"hashkey1"=>"hashkey2"}] = {"hashval1"=>["array1", 1]}
2160
+ store.fetch({"hashkey1"=>"hashkey2"}, {"hashval3"=>["array2", {"hashval4"=>42}]}).should == {"hashval1"=>["array1", 1]}
2161
+ end
2162
+ end
2163
+
2164
+ #################### returndifferent_hashkey_hashvalue ####################
2165
+
2166
+ shared_examples_for 'returndifferent_hashkey_hashvalue' do
2167
+ it "guarantees that a different Hash value is retrieved from the Hash key" do
2168
+ value = {"hashval1"=>["array1", 1]}
2169
+ store[{"hashkey1"=>"hashkey2"}] = {"hashval1"=>["array1", 1]}
2170
+ store[{"hashkey1"=>"hashkey2"}].should_not be_equal({"hashval1"=>["array1", 1]})
2171
+ end
2172
+ end
2173
+
2174
+ #################### expires_hashkey_hashvalue ####################
2175
+
2176
+ shared_examples_for 'expires_hashkey_hashvalue' do
2177
+ it 'should support expires on store and #[]' do
2178
+ store.store({"hashkey1"=>"hashkey2"}, {"hashval1"=>["array1", 1]}, :expires => 2)
2179
+ store[{"hashkey1"=>"hashkey2"}].should == {"hashval1"=>["array1", 1]}
2180
+ sleep 1
2181
+ store[{"hashkey1"=>"hashkey2"}].should == {"hashval1"=>["array1", 1]}
2182
+ sleep 2
2183
+ store[{"hashkey1"=>"hashkey2"}].should == nil
2184
+ end
2185
+
2186
+ it 'should support expires on store and load' do
2187
+ store.store({"hashkey1"=>"hashkey2"}, {"hashval1"=>["array1", 1]}, :expires => 2)
2188
+ store.load({"hashkey1"=>"hashkey2"}).should == {"hashval1"=>["array1", 1]}
2189
+ sleep 1
2190
+ store.load({"hashkey1"=>"hashkey2"}).should == {"hashval1"=>["array1", 1]}
2191
+ sleep 2
2192
+ store.load({"hashkey1"=>"hashkey2"}).should == nil
2193
+ end
2194
+
2195
+ it 'should support expires on store and key?' do
2196
+ store.store({"hashkey1"=>"hashkey2"}, {"hashval1"=>["array1", 1]}, :expires => 2)
2197
+ store.key?({"hashkey1"=>"hashkey2"}).should == true
2198
+ sleep 1
2199
+ store.key?({"hashkey1"=>"hashkey2"}).should == true
2200
+ sleep 2
2201
+ store.key?({"hashkey1"=>"hashkey2"}).should == false
2202
+ end
2203
+
2204
+ it 'should support updating the expiration time in load' do
2205
+ store.store({"hashkey3"=>"hashkey4"}, {"hashval3"=>["array2", {"hashval4"=>42}]}, :expires => 2)
2206
+ store[{"hashkey3"=>"hashkey4"}].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
2207
+ sleep 1
2208
+ store.load({"hashkey3"=>"hashkey4"}, :expires => 3).should == {"hashval3"=>["array2", {"hashval4"=>42}]}
2209
+ store[{"hashkey3"=>"hashkey4"}].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
2210
+ sleep 1
2211
+ store[{"hashkey3"=>"hashkey4"}].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
2212
+ sleep 3
2213
+ store[{"hashkey3"=>"hashkey4"}].should == nil
2214
+ end
2215
+
2216
+ it 'should support updating the expiration time in key?' do
2217
+ store.store({"hashkey3"=>"hashkey4"}, {"hashval3"=>["array2", {"hashval4"=>42}]}, :expires => 2)
2218
+ store[{"hashkey3"=>"hashkey4"}].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
2219
+ sleep 1
2220
+ store.key?({"hashkey3"=>"hashkey4"}, :expires => 3).should be_true
2221
+ store[{"hashkey3"=>"hashkey4"}].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
2222
+ sleep 1
2223
+ store[{"hashkey3"=>"hashkey4"}].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
2224
+ sleep 3
2225
+ store[{"hashkey3"=>"hashkey4"}].should == nil
2226
+ end
2227
+
2228
+ it 'should support updating the expiration time in fetch' do
2229
+ store.store({"hashkey1"=>"hashkey2"}, {"hashval1"=>["array1", 1]}, :expires => 2)
2230
+ store[{"hashkey1"=>"hashkey2"}].should == {"hashval1"=>["array1", 1]}
2231
+ sleep 1
2232
+ store.fetch({"hashkey1"=>"hashkey2"}, nil, :expires => 3).should == {"hashval1"=>["array1", 1]}
2233
+ store[{"hashkey1"=>"hashkey2"}].should == {"hashval1"=>["array1", 1]}
2234
+ sleep 1
2235
+ store[{"hashkey1"=>"hashkey2"}].should == {"hashval1"=>["array1", 1]}
2236
+ sleep 3
2237
+ store[{"hashkey1"=>"hashkey2"}].should == nil
2238
+ end
2239
+
2240
+ it 'should respect expires in delete' do
2241
+ store.store({"hashkey3"=>"hashkey4"}, {"hashval3"=>["array2", {"hashval4"=>42}]}, :expires => 2)
2242
+ store[{"hashkey3"=>"hashkey4"}].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
2243
+ sleep 1
2244
+ store[{"hashkey3"=>"hashkey4"}].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
2245
+ sleep 2
2246
+ store.delete({"hashkey3"=>"hashkey4"}).should == nil
2247
+ end
2248
+
2249
+ it 'should support the #expires syntactic sugar' do
2250
+ store['longlive_key'] = 'longlive_value'
2251
+ store.expires(2).store({"hashkey3"=>"hashkey4"}, {"hashval3"=>["array2", {"hashval4"=>42}]})
2252
+ store[{"hashkey3"=>"hashkey4"}].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
2253
+ sleep 1
2254
+ store[{"hashkey3"=>"hashkey4"}].should == {"hashval3"=>["array2", {"hashval4"=>42}]}
2255
+ sleep 2
2256
+ store.delete({"hashkey3"=>"hashkey4"}).should == nil
2257
+ store['longlive_key'].should == 'longlive_value'
2258
+ end
2259
+ end
2260
+
2261
+ #################### null_hashkey_objectvalue ####################
2262
+
2263
+ shared_examples_for 'null_hashkey_objectvalue' do
2264
+ it "reads from keys that are Hashs like a Hash" do
2265
+ store[{"hashkey1"=>"hashkey2"}].should == nil
2266
+ store.load({"hashkey1"=>"hashkey2"}).should == nil
2267
+ end
2268
+
2269
+ it "guarantees that the same Object value is returned when setting a Hash key" do
2270
+ value = Value.new(:objval1)
2271
+ (store[{"hashkey1"=>"hashkey2"}] = value).should equal(value)
2272
+ end
2273
+
2274
+ it "returns false from key? if a Hash key is not available" do
2275
+ store.key?({"hashkey1"=>"hashkey2"}).should == false
2276
+ end
2277
+
2278
+ it "returns nil from delete if an element for a Hash key does not exist" do
2279
+ store.delete({"hashkey1"=>"hashkey2"}).should == nil
2280
+ end
2281
+
2282
+ it "removes all Hash keys from the store with clear" do
2283
+ store[{"hashkey1"=>"hashkey2"}] = Value.new(:objval1)
2284
+ store[{"hashkey3"=>"hashkey4"}] = Value.new(:objval2)
2285
+ store.clear.should equal(store)
2286
+ store.key?({"hashkey1"=>"hashkey2"}).should_not == true
2287
+ store.key?({"hashkey3"=>"hashkey4"}).should_not == true
2288
+ end
2289
+
2290
+ it "fetches a Hash key with a default value with fetch, if the key is not available" do
2291
+ store.fetch({"hashkey1"=>"hashkey2"}, Value.new(:objval1)).should == Value.new(:objval1)
2292
+ end
2293
+
2294
+ it "fetches a Hash key with a block with fetch, if the key is not available" do
2295
+ key = {"hashkey1"=>"hashkey2"}
2296
+ value = Value.new(:objval1)
2297
+ store.fetch(key) do |k|
2298
+ k.should equal(key)
2299
+ value
2300
+ end.should equal(value)
2301
+ end
2302
+
2303
+ it 'should accept options' do
2304
+ store.key?({"hashkey1"=>"hashkey2"}, :option1 => 1).should == false
2305
+ store.load({"hashkey1"=>"hashkey2"}, :option2 => 2).should == nil
2306
+ store.fetch({"hashkey1"=>"hashkey2"}, 42, :option3 => 3).should == 42
2307
+ store.fetch({"hashkey1"=>"hashkey2"}, :option3 => 3) { 42 }.should == 42
2308
+ store.delete({"hashkey1"=>"hashkey2"}, :option4 => 4).should == nil
2309
+ store.clear(:option5 => 5).should equal(store)
2310
+ store.store({"hashkey1"=>"hashkey2"}, Value.new(:objval1), :option6 => 6).should == Value.new(:objval1)
2311
+ end
2312
+ end
2313
+
2314
+ #################### store_hashkey_objectvalue ####################
2315
+
2316
+ shared_examples_for 'store_hashkey_objectvalue' do
2317
+ it "writes Object values to keys that are Hashs like a Hash" do
2318
+ store[{"hashkey1"=>"hashkey2"}] = Value.new(:objval1)
2319
+ store[{"hashkey1"=>"hashkey2"}].should == Value.new(:objval1)
2320
+ store.load({"hashkey1"=>"hashkey2"}).should == Value.new(:objval1)
2321
+ end
2322
+
2323
+ it "returns true from key? if a Hash key is available" do
2324
+ store[{"hashkey1"=>"hashkey2"}] = Value.new(:objval1)
2325
+ store.key?({"hashkey1"=>"hashkey2"}).should == true
2326
+ store[{"hashkey3"=>"hashkey4"}] = Value.new(:objval2)
2327
+ store.key?({"hashkey3"=>"hashkey4"}).should == true
2328
+ end
2329
+
2330
+ it "stores Object values with Hash keys with #store" do
2331
+ value = Value.new(:objval1)
2332
+ store.store({"hashkey1"=>"hashkey2"}, value).should equal(value)
2333
+ store[{"hashkey1"=>"hashkey2"}].should == Value.new(:objval1)
2334
+ store.load({"hashkey1"=>"hashkey2"}).should == Value.new(:objval1)
2335
+ end
2336
+
2337
+ it "stores Hash after clear" do
2338
+ store[{"hashkey1"=>"hashkey2"}] = Value.new(:objval1)
2339
+ store[{"hashkey3"=>"hashkey4"}] = Value.new(:objval2)
2340
+ store.clear.should equal(store)
2341
+ store[{"hashkey1"=>"hashkey2"}] = Value.new(:objval1)
2342
+ store[{"hashkey1"=>"hashkey2"}].should == Value.new(:objval1)
2343
+ store[{"hashkey3"=>"hashkey4"}].should be_nil
2344
+ end
2345
+
2346
+ it "removes and returns a Object element with a Hash key from the backing store via delete if it exists" do
2347
+ store[{"hashkey1"=>"hashkey2"}] = Value.new(:objval1)
2348
+ store.delete({"hashkey1"=>"hashkey2"}).should == Value.new(:objval1)
2349
+ store.key?({"hashkey1"=>"hashkey2"}).should == false
2350
+ end
2351
+
2352
+ it "overwrites existing Object values with Hash" do
2353
+ store[{"hashkey1"=>"hashkey2"}] = Value.new(:objval1)
2354
+ store[{"hashkey1"=>"hashkey2"}].should == Value.new(:objval1)
2355
+ store[{"hashkey1"=>"hashkey2"}] = Value.new(:objval2)
2356
+ store[{"hashkey1"=>"hashkey2"}].should == Value.new(:objval2)
2357
+ end
2358
+
2359
+ it "does not run the block if the Hash key is available" do
2360
+ store[{"hashkey1"=>"hashkey2"}] = Value.new(:objval1)
2361
+ unaltered = "unaltered"
2362
+ store.fetch({"hashkey1"=>"hashkey2"}) { unaltered = "altered" }
2363
+ unaltered.should == "unaltered"
2364
+ end
2365
+
2366
+ it "fetches a Hash key with a default value with fetch, if the key is available" do
2367
+ store[{"hashkey1"=>"hashkey2"}] = Value.new(:objval1)
2368
+ store.fetch({"hashkey1"=>"hashkey2"}, Value.new(:objval2)).should == Value.new(:objval1)
2369
+ end
2370
+ end
2371
+
2372
+ #################### returndifferent_hashkey_objectvalue ####################
2373
+
2374
+ shared_examples_for 'returndifferent_hashkey_objectvalue' do
2375
+ it "guarantees that a different Object value is retrieved from the Hash key" do
2376
+ value = Value.new(:objval1)
2377
+ store[{"hashkey1"=>"hashkey2"}] = Value.new(:objval1)
2378
+ store[{"hashkey1"=>"hashkey2"}].should_not be_equal(Value.new(:objval1))
2379
+ end
2380
+ end
2381
+
2382
+ #################### expires_hashkey_objectvalue ####################
2383
+
2384
+ shared_examples_for 'expires_hashkey_objectvalue' do
2385
+ it 'should support expires on store and #[]' do
2386
+ store.store({"hashkey1"=>"hashkey2"}, Value.new(:objval1), :expires => 2)
2387
+ store[{"hashkey1"=>"hashkey2"}].should == Value.new(:objval1)
2388
+ sleep 1
2389
+ store[{"hashkey1"=>"hashkey2"}].should == Value.new(:objval1)
2390
+ sleep 2
2391
+ store[{"hashkey1"=>"hashkey2"}].should == nil
2392
+ end
2393
+
2394
+ it 'should support expires on store and load' do
2395
+ store.store({"hashkey1"=>"hashkey2"}, Value.new(:objval1), :expires => 2)
2396
+ store.load({"hashkey1"=>"hashkey2"}).should == Value.new(:objval1)
2397
+ sleep 1
2398
+ store.load({"hashkey1"=>"hashkey2"}).should == Value.new(:objval1)
2399
+ sleep 2
2400
+ store.load({"hashkey1"=>"hashkey2"}).should == nil
2401
+ end
2402
+
2403
+ it 'should support expires on store and key?' do
2404
+ store.store({"hashkey1"=>"hashkey2"}, Value.new(:objval1), :expires => 2)
2405
+ store.key?({"hashkey1"=>"hashkey2"}).should == true
2406
+ sleep 1
2407
+ store.key?({"hashkey1"=>"hashkey2"}).should == true
2408
+ sleep 2
2409
+ store.key?({"hashkey1"=>"hashkey2"}).should == false
2410
+ end
2411
+
2412
+ it 'should support updating the expiration time in load' do
2413
+ store.store({"hashkey3"=>"hashkey4"}, Value.new(:objval2), :expires => 2)
2414
+ store[{"hashkey3"=>"hashkey4"}].should == Value.new(:objval2)
2415
+ sleep 1
2416
+ store.load({"hashkey3"=>"hashkey4"}, :expires => 3).should == Value.new(:objval2)
2417
+ store[{"hashkey3"=>"hashkey4"}].should == Value.new(:objval2)
2418
+ sleep 1
2419
+ store[{"hashkey3"=>"hashkey4"}].should == Value.new(:objval2)
2420
+ sleep 3
2421
+ store[{"hashkey3"=>"hashkey4"}].should == nil
2422
+ end
2423
+
2424
+ it 'should support updating the expiration time in key?' do
2425
+ store.store({"hashkey3"=>"hashkey4"}, Value.new(:objval2), :expires => 2)
2426
+ store[{"hashkey3"=>"hashkey4"}].should == Value.new(:objval2)
2427
+ sleep 1
2428
+ store.key?({"hashkey3"=>"hashkey4"}, :expires => 3).should be_true
2429
+ store[{"hashkey3"=>"hashkey4"}].should == Value.new(:objval2)
2430
+ sleep 1
2431
+ store[{"hashkey3"=>"hashkey4"}].should == Value.new(:objval2)
2432
+ sleep 3
2433
+ store[{"hashkey3"=>"hashkey4"}].should == nil
2434
+ end
2435
+
2436
+ it 'should support updating the expiration time in fetch' do
2437
+ store.store({"hashkey1"=>"hashkey2"}, Value.new(:objval1), :expires => 2)
2438
+ store[{"hashkey1"=>"hashkey2"}].should == Value.new(:objval1)
2439
+ sleep 1
2440
+ store.fetch({"hashkey1"=>"hashkey2"}, nil, :expires => 3).should == Value.new(:objval1)
2441
+ store[{"hashkey1"=>"hashkey2"}].should == Value.new(:objval1)
2442
+ sleep 1
2443
+ store[{"hashkey1"=>"hashkey2"}].should == Value.new(:objval1)
2444
+ sleep 3
2445
+ store[{"hashkey1"=>"hashkey2"}].should == nil
2446
+ end
2447
+
2448
+ it 'should respect expires in delete' do
2449
+ store.store({"hashkey3"=>"hashkey4"}, Value.new(:objval2), :expires => 2)
2450
+ store[{"hashkey3"=>"hashkey4"}].should == Value.new(:objval2)
2451
+ sleep 1
2452
+ store[{"hashkey3"=>"hashkey4"}].should == Value.new(:objval2)
2453
+ sleep 2
2454
+ store.delete({"hashkey3"=>"hashkey4"}).should == nil
2455
+ end
2456
+
2457
+ it 'should support the #expires syntactic sugar' do
2458
+ store['longlive_key'] = 'longlive_value'
2459
+ store.expires(2).store({"hashkey3"=>"hashkey4"}, Value.new(:objval2))
2460
+ store[{"hashkey3"=>"hashkey4"}].should == Value.new(:objval2)
2461
+ sleep 1
2462
+ store[{"hashkey3"=>"hashkey4"}].should == Value.new(:objval2)
2463
+ sleep 2
2464
+ store.delete({"hashkey3"=>"hashkey4"}).should == nil
2465
+ store['longlive_key'].should == 'longlive_value'
2466
+ end
2467
+ end
2468
+
2469
+ #################### not_increment ####################
2470
+
2471
+ shared_examples_for 'not_increment' do
2472
+ it 'should not support increment' do
2473
+ expect do
2474
+ store.increment('inckey')
2475
+ end.to raise_error(NotImplementedError)
2476
+ end
2477
+ end
2478
+
2479
+ #################### increment ####################
2480
+
2481
+ shared_examples_for 'increment' do
2482
+ it 'should initialize in increment with 1' do
2483
+ store.key?('inckey').should be_false
2484
+ store.increment('inckey').should == 1
2485
+ store.key?('inckey').should be_true
2486
+ store.raw['inckey'].should == '1'
2487
+ store.raw.load('inckey').should == '1'
2488
+ store.load('inckey', :raw => true).should == '1'
2489
+ store['inckey'].should == '1'
2490
+
2491
+ store.delete('inckey', :raw => true).should == '1'
2492
+ store.key?('inckey').should be_false
2493
+ end
2494
+
2495
+ it 'should initialize in increment with higher value' do
2496
+ store.increment('inckey', 42).should == 42
2497
+ store.key?('inckey').should be_true
2498
+ store.raw['inckey'].should == '42'
2499
+ store['inckey'].should == '42'
2500
+ store.delete('inckey', :raw => true).should == '42'
2501
+ end
2502
+
2503
+ it 'should initialize in increment with 0' do
2504
+ store.increment('inckey', 0).should == 0
2505
+ store.key?('inckey').should be_true
2506
+ store.raw['inckey'].should == '0'
2507
+ store['inckey'].should == '0'
2508
+ store.delete('inckey', :raw => true).should == '0'
2509
+ end
2510
+
2511
+ it 'should support incrementing existing value by value' do
2512
+ store.increment('inckey').should == 1
2513
+ store.increment('inckey', 42).should == 43
2514
+ store.raw['inckey'].should == '43'
2515
+ end
2516
+
2517
+ it 'should support incrementing existing value by 0' do
2518
+ store.increment('inckey').should == 1
2519
+ store.increment('inckey', 0).should == 1
2520
+ store.raw['inckey'].should == '1'
2521
+ end
2522
+
2523
+ it 'should support deleting integer value' do
2524
+ store.increment('inckey').should == 1
2525
+ store.delete('inckey').should == '1'
2526
+ store.key?('inckey').should be_false
2527
+ end
2528
+
2529
+ it 'should support decrementing existing value' do
2530
+ store.increment('inckey', 10).should == 10
2531
+ store.increment('inckey', -5).should == 5
2532
+ store.raw['inckey'].should == '5'
2533
+ store.increment('inckey', -5).should == 0
2534
+ store.raw['inckey'].should == '0'
2535
+ end
2536
+
2537
+ it 'interpret raw value as integer' do
2538
+ store.store('inckey', '42', :raw => true)
2539
+ store.increment('inckey').should == 43
2540
+ store.raw['inckey'].should == '43'
2541
+ end
2542
+
2543
+ it 'should raise error on non integer value' do
2544
+ store['strkey'] = 'value'
2545
+ expect do
2546
+ store.increment('strkey')
2547
+ end.to raise_error
2548
+ end
2549
+ end
2550
+
2551
+ #################### marshallable_key ####################
2552
+
2553
+ shared_examples_for 'marshallable_key' do
2554
+ it 'refuses to #[] from keys that cannot be marshalled' do
2555
+ expect do
2556
+ store[Struct.new(:foo).new(:bar)]
2557
+ end.to raise_error(marshal_error)
2558
+ end
2559
+
2560
+ it 'refuses to load from keys that cannot be marshalled' do
2561
+ expect do
2562
+ store.load(Struct.new(:foo).new(:bar))
2563
+ end.to raise_error(marshal_error)
2564
+ end
2565
+
2566
+ it 'refuses to fetch from keys that cannot be marshalled' do
2567
+ expect do
2568
+ store.fetch(Struct.new(:foo).new(:bar), true)
2569
+ end.to raise_error(marshal_error)
2570
+ end
2571
+
2572
+ it 'refuses to #[]= to keys that cannot be marshalled' do
2573
+ expect do
2574
+ store[Struct.new(:foo).new(:bar)] = 'value'
2575
+ end.to raise_error(marshal_error)
2576
+ end
2577
+
2578
+ it 'refuses to store to keys that cannot be marshalled' do
2579
+ expect do
2580
+ store.store Struct.new(:foo).new(:bar), 'value'
2581
+ end.to raise_error(marshal_error)
2582
+ end
2583
+
2584
+ it 'refuses to check for key? if the key cannot be marshalled' do
2585
+ expect do
2586
+ store.key? Struct.new(:foo).new(:bar)
2587
+ end.to raise_error(marshal_error)
2588
+ end
2589
+
2590
+ it 'refuses to delete a key if the key cannot be marshalled' do
2591
+ expect do
2592
+ store.delete Struct.new(:foo).new(:bar)
2593
+ end.to raise_error(marshal_error)
2594
+ end
2595
+ end
2596
+
2597
+ #################### marshallable_value ####################
2598
+
2599
+ shared_examples_for 'marshallable_value' do
2600
+ it 'refuses to store values that cannot be marshalled' do
2601
+ expect do
2602
+ store.store 'key', Struct.new(:foo).new(:bar)
2603
+ end.to raise_error(marshal_error)
2604
+ end
2605
+ end
2606
+
2607
+ #################### transform_value ####################
2608
+
2609
+ shared_examples_for 'transform_value' do
2610
+ it 'allows to bypass transformer with :raw' do
2611
+ store['key'] = 'value'
2612
+ load_value(store.load('key', :raw => true)).should == 'value'
2613
+
2614
+ store.store('key', 'value', :raw => true)
2615
+ store.load('key', :raw => true).should == 'value'
2616
+ store.delete('key', :raw => true).should == 'value'
2617
+ end
2618
+
2619
+ it 'allows to bypass transformer with raw syntactic sugar' do
2620
+ store['key'] = 'value'
2621
+ load_value(store.raw.load('key')).should == 'value'
2622
+
2623
+ store.raw.store('key', 'value')
2624
+ store.raw['key'].should == 'value'
2625
+ store.raw.load('key').should == 'value'
2626
+ store.raw.delete('key').should == 'value'
2627
+
2628
+ store.raw['key'] = 'value2'
2629
+ store.raw['key'].should == 'value2'
2630
+ end
2631
+
2632
+ it 'should return unmarshalled value' do
2633
+ store.store('key', 'unmarshalled value', :raw => true)
2634
+ store.load('key', :raw => true).should == 'unmarshalled value'
2635
+ store['key'].should == 'unmarshalled value'
2636
+ store.delete('key').should == 'unmarshalled value'
2637
+ end
2638
+ end
2639
+
2640
+ #################### transform_value_with_expires ####################
2641
+
2642
+ shared_examples_for 'transform_value_with_expires' do
2643
+ it 'allows to bypass transformer with :raw' do
2644
+ store['key'] = 'value'
2645
+ load_value(store.load('key', :raw => true)).should == ['value']
2646
+
2647
+ store.store('key', 'value', :expires => 10)
2648
+ load_value(store.load('key', :raw => true)).first.should == 'value'
2649
+ load_value(store.load('key', :raw => true)).last.should respond_to(:to_int)
2650
+
2651
+ store.store('key', 'value', :raw => true)
2652
+ store.load('key', :raw => true).should == 'value'
2653
+ store.delete('key', :raw => true).should == 'value'
2654
+ end
2655
+
2656
+ it 'should return unmarshalled value' do
2657
+ store.store('key', 'unmarshalled value', :raw => true)
2658
+ store.load('key', :raw => true).should == 'unmarshalled value'
2659
+ store['key'].should == 'unmarshalled value'
2660
+ store.delete('key').should == 'unmarshalled value'
2661
+ end
2662
+ end
2663
+