moneta 1.0.0 → 1.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (488) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/ruby.yml +425 -0
  3. data/.gitignore +3 -0
  4. data/.rspec +4 -0
  5. data/.rubocop.yml +194 -0
  6. data/.yardopts +6 -1
  7. data/CHANGES +88 -0
  8. data/CONTRIBUTORS +10 -2
  9. data/Gemfile +198 -76
  10. data/LICENSE +1 -1
  11. data/README.md +181 -83
  12. data/SPEC.md +70 -0
  13. data/feature_matrix.yaml +227 -0
  14. data/lib/action_dispatch/middleware/session/moneta_store.rb +1 -0
  15. data/lib/active_support/cache/moneta_store.rb +102 -6
  16. data/lib/moneta/adapter.rb +52 -0
  17. data/lib/moneta/adapters/activerecord.rb +284 -99
  18. data/lib/moneta/adapters/activesupportcache.rb +120 -0
  19. data/lib/moneta/adapters/cassandra.rb +303 -51
  20. data/lib/moneta/adapters/client.rb +72 -23
  21. data/lib/moneta/adapters/couch.rb +353 -49
  22. data/lib/moneta/adapters/datamapper.rb +11 -5
  23. data/lib/moneta/adapters/daybreak.rb +31 -20
  24. data/lib/moneta/adapters/dbm.rb +10 -16
  25. data/lib/moneta/adapters/file.rb +34 -13
  26. data/lib/moneta/adapters/fog.rb +5 -6
  27. data/lib/moneta/adapters/gdbm.rb +10 -16
  28. data/lib/moneta/adapters/hbase.rb +11 -13
  29. data/lib/moneta/adapters/kyotocabinet.rb +78 -17
  30. data/lib/moneta/adapters/leveldb.rb +35 -15
  31. data/lib/moneta/adapters/lmdb.rb +47 -23
  32. data/lib/moneta/adapters/localmemcache.rb +7 -13
  33. data/lib/moneta/adapters/lruhash.rb +45 -48
  34. data/lib/moneta/adapters/memcached/dalli.rb +67 -30
  35. data/lib/moneta/adapters/memcached/native.rb +33 -30
  36. data/lib/moneta/adapters/memcached.rb +1 -0
  37. data/lib/moneta/adapters/memory.rb +7 -7
  38. data/lib/moneta/adapters/mongo.rb +265 -6
  39. data/lib/moneta/adapters/null.rb +1 -2
  40. data/lib/moneta/adapters/pstore.rb +68 -25
  41. data/lib/moneta/adapters/redis.rb +101 -32
  42. data/lib/moneta/adapters/restclient.rb +17 -16
  43. data/lib/moneta/adapters/riak.rb +10 -11
  44. data/lib/moneta/adapters/sdbm.rb +10 -16
  45. data/lib/moneta/adapters/sequel/mysql.rb +66 -0
  46. data/lib/moneta/adapters/sequel/postgres.rb +80 -0
  47. data/lib/moneta/adapters/sequel/postgres_hstore.rb +240 -0
  48. data/lib/moneta/adapters/sequel/sqlite.rb +57 -0
  49. data/lib/moneta/adapters/sequel.rb +253 -52
  50. data/lib/moneta/adapters/sqlite.rb +103 -23
  51. data/lib/moneta/adapters/tdb.rb +21 -12
  52. data/lib/moneta/adapters/tokyocabinet.rb +24 -16
  53. data/lib/moneta/adapters/tokyotyrant.rb +49 -28
  54. data/lib/moneta/adapters/yaml.rb +1 -5
  55. data/lib/moneta/builder.rb +2 -3
  56. data/lib/moneta/cache.rb +11 -1
  57. data/lib/moneta/config.rb +101 -0
  58. data/lib/moneta/create_support.rb +21 -0
  59. data/lib/moneta/dbm_adapter.rb +31 -0
  60. data/lib/moneta/defaults.rb +320 -0
  61. data/lib/moneta/each_key_support.rb +27 -0
  62. data/lib/moneta/enumerable.rb +38 -0
  63. data/lib/moneta/expires.rb +112 -11
  64. data/lib/moneta/expires_support.rb +59 -0
  65. data/lib/moneta/fallback.rb +84 -0
  66. data/lib/moneta/hash_adapter.rb +68 -0
  67. data/lib/moneta/increment_support.rb +16 -0
  68. data/lib/moneta/lock.rb +26 -2
  69. data/lib/moneta/logger.rb +2 -2
  70. data/lib/moneta/nil_values.rb +35 -0
  71. data/lib/moneta/option_support.rb +51 -0
  72. data/lib/moneta/optionmerger.rb +0 -1
  73. data/lib/moneta/pool.rb +339 -28
  74. data/lib/moneta/proxy.rb +75 -2
  75. data/lib/moneta/server.rb +230 -68
  76. data/lib/moneta/shared.rb +36 -14
  77. data/lib/moneta/stack.rb +7 -7
  78. data/lib/moneta/synchronize.rb +5 -11
  79. data/lib/moneta/transformer/config.rb +64 -42
  80. data/lib/moneta/transformer/helper/bson.rb +7 -14
  81. data/lib/moneta/transformer/helper.rb +5 -5
  82. data/lib/moneta/transformer.rb +217 -23
  83. data/lib/moneta/utils.rb +3 -9
  84. data/lib/moneta/version.rb +1 -1
  85. data/lib/moneta/weak_each_key.rb +72 -0
  86. data/lib/moneta/wrapper.rb +30 -0
  87. data/lib/moneta.rb +29 -10
  88. data/lib/rack/cache/moneta.rb +13 -11
  89. data/lib/rack/moneta_rest.rb +2 -2
  90. data/lib/rack/session/moneta.rb +3 -4
  91. data/moneta.gemspec +19 -4
  92. data/script/benchmarks +311 -100
  93. data/script/contributors +11 -6
  94. data/script/parallel-tests +58 -83
  95. data/script/start-couchdb +27 -0
  96. data/script/start-hbase +47 -0
  97. data/script/start-services +5 -6
  98. data/script/update-feature-matrix +148 -0
  99. data/spec/active_support/cache_moneta_store_spec.rb +129 -106
  100. data/spec/features/concurrent_create.rb +42 -0
  101. data/spec/features/concurrent_increment.rb +39 -0
  102. data/spec/features/create.rb +25 -0
  103. data/spec/features/create_expires.rb +19 -0
  104. data/spec/features/default_expires.rb +14 -0
  105. data/spec/features/each_key.rb +119 -0
  106. data/spec/features/expires.rb +296 -0
  107. data/spec/features/features.rb +16 -0
  108. data/spec/features/increment.rb +98 -0
  109. data/spec/features/marshallable_key.rb +43 -0
  110. data/spec/features/marshallable_value.rb +7 -0
  111. data/spec/features/multiprocess.rb +8 -0
  112. data/spec/features/not_create.rb +7 -0
  113. data/spec/features/not_each_key.rb +7 -0
  114. data/spec/features/not_increment.rb +13 -0
  115. data/spec/features/not_persist.rb +9 -0
  116. data/spec/features/null.rb +66 -0
  117. data/spec/features/persist.rb +14 -0
  118. data/spec/features/returndifferent.rb +9 -0
  119. data/spec/features/returnsame.rb +9 -0
  120. data/spec/features/store.rb +261 -0
  121. data/spec/features/store_large.rb +13 -0
  122. data/spec/features/transform_value.rb +44 -0
  123. data/spec/features/transform_value_expires.rb +41 -0
  124. data/spec/helper.rb +345 -78
  125. data/spec/moneta/adapters/activerecord/adapter_activerecord_existing_connection_spec.rb +61 -0
  126. data/spec/moneta/adapters/activerecord/adapter_activerecord_spec.rb +126 -0
  127. data/spec/moneta/adapters/activerecord/standard_activerecord_spec.rb +21 -0
  128. data/spec/moneta/adapters/activerecord/standard_activerecord_with_expires_spec.rb +27 -0
  129. data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_spec.rb +54 -0
  130. data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_with_default_expires_spec.rb +54 -0
  131. data/spec/moneta/adapters/activesupportcache/standard_activesupportcache_spec.rb +14 -0
  132. data/spec/moneta/adapters/cassandra/adapter_cassandra_spec.rb +17 -0
  133. data/spec/moneta/adapters/cassandra/adapter_cassandra_with_default_expires_spec.rb +18 -0
  134. data/spec/moneta/adapters/cassandra/helper.rb +18 -0
  135. data/spec/moneta/adapters/cassandra/standard_cassandra_spec.rb +18 -0
  136. data/spec/moneta/adapters/client/adapter_client_spec.rb +11 -0
  137. data/spec/moneta/adapters/client/client_helper.rb +25 -0
  138. data/spec/moneta/adapters/client/standard_client_tcp_spec.rb +23 -0
  139. data/spec/moneta/adapters/client/standard_client_unix_spec.rb +28 -0
  140. data/spec/moneta/adapters/cookie/adapter_cookie_spec.rb +7 -0
  141. data/spec/moneta/adapters/couch/adapter_couch_spec.rb +204 -0
  142. data/spec/moneta/adapters/couch/standard_couch_spec.rb +15 -0
  143. data/spec/moneta/adapters/couch/standard_couch_with_expires_spec.rb +19 -0
  144. data/spec/moneta/adapters/datamapper/adapter_datamapper_spec.rb +60 -0
  145. data/spec/moneta/adapters/datamapper/standard_datamapper_spec.rb +21 -0
  146. data/spec/moneta/adapters/datamapper/standard_datamapper_with_expires_spec.rb +26 -0
  147. data/spec/moneta/adapters/datamapper/standard_datamapper_with_repository_spec.rb +22 -0
  148. data/spec/moneta/adapters/daybreak/adapter_daybreak_spec.rb +7 -0
  149. data/spec/moneta/adapters/daybreak/standard_daybreak_spec.rb +7 -0
  150. data/spec/moneta/adapters/daybreak/standard_daybreak_with_expires_spec.rb +11 -0
  151. data/spec/moneta/adapters/dbm/adapter_dbm_spec.rb +7 -0
  152. data/spec/moneta/adapters/dbm/standard_dbm_spec.rb +7 -0
  153. data/spec/moneta/adapters/dbm/standard_dbm_with_expires_spec.rb +12 -0
  154. data/spec/moneta/adapters/faraday_helper.rb +10 -0
  155. data/spec/moneta/adapters/file/adapter_file_spec.rb +7 -0
  156. data/spec/moneta/adapters/file/standard_file_spec.rb +7 -0
  157. data/spec/moneta/adapters/file/standard_file_with_expires_spec.rb +11 -0
  158. data/spec/moneta/adapters/fog/adapter_fog_spec.rb +16 -0
  159. data/spec/moneta/adapters/fog/standard_fog_spec.rb +15 -0
  160. data/spec/moneta/adapters/fog/standard_fog_with_expires_spec.rb +20 -0
  161. data/spec/moneta/adapters/gdbm/adapter_gdbm_spec.rb +7 -0
  162. data/spec/moneta/adapters/gdbm/standard_gdbm_spec.rb +7 -0
  163. data/spec/moneta/adapters/gdbm/standard_gdbm_with_expires_spec.rb +11 -0
  164. data/spec/moneta/adapters/hashfile/standard_hashfile_spec.rb +7 -0
  165. data/spec/moneta/adapters/hashfile/standard_hashfile_with_expires_spec.rb +12 -0
  166. data/spec/moneta/adapters/hbase/adapter_hbase_spec.rb +7 -0
  167. data/spec/moneta/adapters/hbase/standard_hbase_spec.rb +4 -0
  168. data/spec/moneta/adapters/hbase/standard_hbase_with_expires_spec.rb +8 -0
  169. data/spec/moneta/adapters/kyotocabinet/adapter_kyotocabinet_spec.rb +7 -0
  170. data/spec/moneta/adapters/kyotocabinet/standard_kyotocabinet_spec.rb +7 -0
  171. data/spec/moneta/adapters/kyotocabinet/standard_kyotocabinet_with_expires_spec.rb +14 -0
  172. data/spec/moneta/adapters/leveldb/adapter_leveldb_spec.rb +7 -0
  173. data/spec/moneta/adapters/leveldb/standard_leveldb_spec.rb +7 -0
  174. data/spec/moneta/adapters/leveldb/standard_leveldb_with_expires_spec.rb +11 -0
  175. data/spec/moneta/adapters/lmdb/adapter_lmdb_spec.rb +7 -0
  176. data/spec/moneta/adapters/lmdb/adapter_lmdb_with_db_spec.rb +7 -0
  177. data/spec/moneta/adapters/lmdb/standard_lmdb_spec.rb +7 -0
  178. data/spec/moneta/adapters/lmdb/standard_lmdb_with_expires_spec.rb +11 -0
  179. data/spec/moneta/adapters/localmemcache/adapter_localmemcache_spec.rb +7 -0
  180. data/spec/moneta/adapters/localmemcache/standard_localmemcache_spec.rb +7 -0
  181. data/spec/moneta/adapters/localmemcache/standard_localmemcache_with_expires_spec.rb +11 -0
  182. data/spec/moneta/{adapter_lruhash_spec.rb → adapters/lruhash/adapter_lruhash_spec.rb} +15 -33
  183. data/spec/moneta/adapters/lruhash/standard_lruhash_spec.rb +4 -0
  184. data/spec/moneta/adapters/lruhash/standard_lruhash_with_expires_spec.rb +8 -0
  185. data/spec/moneta/adapters/memcached/adapter_memcached_spec.rb +13 -0
  186. data/spec/moneta/adapters/memcached/dalli/adapter_memcached_dalli_spec.rb +25 -0
  187. data/spec/moneta/adapters/memcached/dalli/standard_memcached_dalli_spec.rb +11 -0
  188. data/spec/moneta/adapters/memcached/native/adapter_memcached_native_spec.rb +25 -0
  189. data/spec/moneta/adapters/memcached/native/standard_memcached_native_spec.rb +11 -0
  190. data/spec/moneta/adapters/memcached/standard_memcached_spec.rb +17 -0
  191. data/spec/moneta/adapters/memcached_helper.rb +20 -0
  192. data/spec/moneta/adapters/memory/adapter_memory_spec.rb +7 -0
  193. data/spec/moneta/adapters/memory/standard_memory_spec.rb +4 -0
  194. data/spec/moneta/adapters/memory/standard_memory_with_compress_spec.rb +9 -0
  195. data/spec/moneta/adapters/memory/standard_memory_with_expires_spec.rb +8 -0
  196. data/spec/moneta/adapters/memory/standard_memory_with_json_key_serializer_spec.rb +4 -0
  197. data/spec/moneta/adapters/memory/standard_memory_with_json_serializer_spec.rb +9 -0
  198. data/spec/moneta/adapters/memory/standard_memory_with_json_value_serializer_spec.rb +9 -0
  199. data/spec/moneta/adapters/memory/standard_memory_with_prefix_spec.rb +41 -0
  200. data/spec/moneta/adapters/memory/standard_memory_with_snappy_compress_spec.rb +9 -0
  201. data/spec/moneta/adapters/mongo/adapter_mongo_spec.rb +41 -0
  202. data/spec/moneta/adapters/mongo/adapter_mongo_with_default_expires_spec.rb +14 -0
  203. data/spec/moneta/adapters/mongo/standard_mongo_spec.rb +7 -0
  204. data/spec/moneta/adapters/null/null_adapter_spec.rb +7 -0
  205. data/spec/moneta/adapters/null/standard_null_spec.rb +4 -0
  206. data/spec/moneta/adapters/pstore/adapter_pstore_spec.rb +7 -0
  207. data/spec/moneta/adapters/pstore/standard_pstore_spec.rb +9 -0
  208. data/spec/moneta/adapters/pstore/standard_pstore_with_expires_spec.rb +13 -0
  209. data/spec/moneta/adapters/redis/adapter_redis_spec.rb +20 -0
  210. data/spec/moneta/adapters/redis/standard_redis_spec.rb +14 -0
  211. data/spec/moneta/adapters/restclient/adapter_restclient_spec.rb +13 -0
  212. data/spec/moneta/adapters/restclient/helper.rb +12 -0
  213. data/spec/moneta/adapters/restclient/standard_restclient_spec.rb +13 -0
  214. data/spec/moneta/adapters/riak/adapter_riak_spec.rb +14 -0
  215. data/spec/moneta/adapters/riak/standard_riak_spec.rb +10 -0
  216. data/spec/moneta/adapters/riak/standard_riak_with_expires_spec.rb +14 -0
  217. data/spec/moneta/adapters/sdbm/adapter_sdbm_spec.rb +7 -0
  218. data/spec/moneta/adapters/sdbm/standard_sdbm_spec.rb +7 -0
  219. data/spec/moneta/adapters/sdbm/standard_sdbm_with_expires_spec.rb +11 -0
  220. data/spec/moneta/adapters/sequel/adapter_sequel_spec.rb +133 -0
  221. data/spec/moneta/adapters/sequel/helper.rb +80 -0
  222. data/spec/moneta/adapters/sequel/standard_sequel_spec.rb +8 -0
  223. data/spec/moneta/adapters/sequel/standard_sequel_with_expires_spec.rb +18 -0
  224. data/spec/moneta/adapters/sqlite/adapter_sqlite_spec.rb +7 -0
  225. data/spec/moneta/adapters/sqlite/standard_sqlite_spec.rb +7 -0
  226. data/spec/moneta/adapters/sqlite/standard_sqlite_with_expires_spec.rb +15 -0
  227. data/spec/moneta/adapters/tdb/adapter_tdb_spec.rb +7 -0
  228. data/spec/moneta/adapters/tdb/standard_tdb_spec.rb +7 -0
  229. data/spec/moneta/adapters/tdb/standard_tdb_with_expires_spec.rb +11 -0
  230. data/spec/moneta/adapters/tokyocabinet/adapter_tokyocabinet_bdb_spec.rb +7 -0
  231. data/spec/moneta/adapters/tokyocabinet/adapter_tokyocabinet_hdb_spec.rb +7 -0
  232. data/spec/moneta/adapters/tokyocabinet/standard_tokyocabinet_spec.rb +7 -0
  233. data/spec/moneta/adapters/tokyocabinet/standard_tokyocabinet_with_expires_spec.rb +11 -0
  234. data/spec/moneta/adapters/tokyotyrant/adapter_tokyotyrant_spec.rb +11 -0
  235. data/spec/moneta/adapters/tokyotyrant/helper.rb +12 -0
  236. data/spec/moneta/adapters/tokyotyrant/standard_tokyotyrant_spec.rb +7 -0
  237. data/spec/moneta/adapters/tokyotyrant/standard_tokyotyrant_with_expires_spec.rb +12 -0
  238. data/spec/moneta/adapters/yaml/adapter_yaml_spec.rb +7 -0
  239. data/spec/moneta/adapters/yaml/standard_yaml_spec.rb +9 -0
  240. data/spec/moneta/adapters/yaml/standard_yaml_with_expires_spec.rb +13 -0
  241. data/spec/moneta/builder_spec.rb +22 -1
  242. data/spec/moneta/config_spec.rb +219 -0
  243. data/spec/moneta/mutex_spec.rb +6 -23
  244. data/spec/moneta/proxies/cache/cache_file_memory_spec.rb +24 -0
  245. data/spec/moneta/proxies/cache/cache_memory_null_spec.rb +12 -0
  246. data/spec/moneta/proxies/enumerable/enumerable_spec.rb +26 -0
  247. data/spec/moneta/proxies/expires/expires_file_spec.rb +28 -0
  248. data/spec/moneta/proxies/expires/expires_memory_spec.rb +15 -0
  249. data/spec/moneta/proxies/expires/expires_memory_with_default_expires_spec.rb +16 -0
  250. data/spec/moneta/proxies/fallback/fallback_spec.rb +42 -0
  251. data/spec/moneta/proxies/lock/lock_spec.rb +10 -0
  252. data/spec/moneta/{optionmerger_spec.rb → proxies/optionmerger/optionmerger_spec.rb} +2 -18
  253. data/spec/moneta/proxies/pool/pool_spec.rb +353 -0
  254. data/spec/moneta/proxies/proxy/proxy_expires_memory_spec.rb +16 -0
  255. data/spec/moneta/proxies/shared/shared_tcp_spec.rb +59 -0
  256. data/spec/moneta/proxies/shared/shared_unix_spec.rb +58 -0
  257. data/spec/moneta/proxies/transformer/transformer_bencode_spec.rb +19 -0
  258. data/spec/moneta/proxies/transformer/transformer_bert_spec.rb +19 -0
  259. data/spec/moneta/proxies/transformer/transformer_bson_spec.rb +25 -0
  260. data/spec/moneta/proxies/transformer/transformer_bzip2_spec.rb +19 -0
  261. data/spec/moneta/proxies/transformer/transformer_json_spec.rb +19 -0
  262. data/spec/moneta/proxies/transformer/transformer_key_inspect_spec.rb +17 -0
  263. data/spec/moneta/proxies/transformer/transformer_key_marshal_spec.rb +17 -0
  264. data/spec/moneta/proxies/transformer/transformer_key_to_s_spec.rb +17 -0
  265. data/spec/moneta/proxies/transformer/transformer_key_yaml_spec.rb +17 -0
  266. data/spec/moneta/proxies/transformer/transformer_lz4_spec.rb +19 -0
  267. data/spec/moneta/proxies/transformer/transformer_lzma_spec.rb +19 -0
  268. data/spec/moneta/proxies/transformer/transformer_lzo_spec.rb +19 -0
  269. data/spec/moneta/proxies/transformer/transformer_marshal_base64_spec.rb +20 -0
  270. data/spec/moneta/proxies/transformer/transformer_marshal_city128_spec.rb +15 -0
  271. data/spec/moneta/proxies/transformer/transformer_marshal_city32_spec.rb +15 -0
  272. data/spec/moneta/proxies/transformer/transformer_marshal_city64_spec.rb +15 -0
  273. data/spec/moneta/proxies/transformer/transformer_marshal_escape_spec.rb +21 -0
  274. data/spec/moneta/proxies/transformer/transformer_marshal_hex_spec.rb +20 -0
  275. data/spec/moneta/proxies/transformer/transformer_marshal_hmac_spec.rb +19 -0
  276. data/spec/moneta/proxies/transformer/transformer_marshal_md5_spec.rb +15 -0
  277. data/spec/moneta/proxies/transformer/transformer_marshal_md5_spread_spec.rb +15 -0
  278. data/spec/moneta/proxies/transformer/transformer_marshal_prefix_base64_spec.rb +33 -0
  279. data/spec/moneta/proxies/transformer/transformer_marshal_prefix_spec.rb +15 -0
  280. data/spec/moneta/proxies/transformer/transformer_marshal_qp_spec.rb +20 -0
  281. data/spec/moneta/proxies/transformer/transformer_marshal_rmd160_spec.rb +15 -0
  282. data/spec/moneta/proxies/transformer/transformer_marshal_sha1_spec.rb +15 -0
  283. data/spec/moneta/proxies/transformer/transformer_marshal_sha256_spec.rb +15 -0
  284. data/spec/moneta/proxies/transformer/transformer_marshal_sha384_spec.rb +15 -0
  285. data/spec/moneta/proxies/transformer/transformer_marshal_sha512_spec.rb +15 -0
  286. data/spec/moneta/proxies/transformer/transformer_marshal_spec.rb +19 -0
  287. data/spec/moneta/proxies/transformer/transformer_marshal_truncate_spec.rb +15 -0
  288. data/spec/moneta/proxies/transformer/transformer_marshal_urlsafe_base64_spec.rb +20 -0
  289. data/spec/moneta/proxies/transformer/transformer_marshal_uuencode_spec.rb +19 -0
  290. data/spec/moneta/proxies/transformer/transformer_msgpack_spec.rb +19 -0
  291. data/spec/moneta/proxies/transformer/transformer_ox_spec.rb +19 -0
  292. data/spec/moneta/proxies/transformer/transformer_php_spec.rb +19 -0
  293. data/spec/moneta/proxies/transformer/transformer_quicklz_spec.rb +19 -0
  294. data/spec/moneta/proxies/transformer/transformer_snappy_spec.rb +19 -0
  295. data/spec/moneta/proxies/transformer/transformer_tnet_spec.rb +19 -0
  296. data/spec/moneta/proxies/transformer/transformer_value_marshal_spec.rb +19 -0
  297. data/spec/moneta/proxies/transformer/transformer_value_yaml_spec.rb +19 -0
  298. data/spec/moneta/proxies/transformer/transformer_yaml_spec.rb +19 -0
  299. data/spec/moneta/proxies/transformer/transformer_zlib_spec.rb +19 -0
  300. data/spec/moneta/proxies/weak_create/weak_create_spec.rb +21 -0
  301. data/spec/moneta/proxies/weak_each_key/weak_each_key_spec.rb +22 -0
  302. data/spec/moneta/proxies/weak_increment/weak_increment_spec.rb +21 -0
  303. data/spec/moneta/semaphore_spec.rb +6 -23
  304. data/spec/moneta/stack_file_memory_spec.rb +5 -29
  305. data/spec/moneta/stack_memory_file_spec.rb +5 -31
  306. data/spec/rack/session_moneta_spec.rb +44 -25
  307. data/spec/restserver.rb +44 -0
  308. data/{spec → test}/action_dispatch/fixtures/session_autoload_test/foo.rb +0 -0
  309. data/{spec/action_dispatch/session_moneta_store_spec.rb → test/action_dispatch/session_moneta_store_test.rb} +13 -5
  310. metadata +545 -369
  311. data/.travis.yml +0 -55
  312. data/lib/moneta/adapters/mongo/base.rb +0 -78
  313. data/lib/moneta/adapters/mongo/moped.rb +0 -107
  314. data/lib/moneta/adapters/mongo/official.rb +0 -117
  315. data/lib/moneta/mixins.rb +0 -343
  316. data/script/generate-specs +0 -2696
  317. data/script/install-kyotocabinet +0 -17
  318. data/spec/moneta/adapter_activerecord_exisiting_connection_spec.rb +0 -36
  319. data/spec/moneta/adapter_activerecord_spec.rb +0 -65
  320. data/spec/moneta/adapter_cassandra_spec.rb +0 -33
  321. data/spec/moneta/adapter_cassandra_with_default_expires_spec.rb +0 -34
  322. data/spec/moneta/adapter_client_spec.rb +0 -35
  323. data/spec/moneta/adapter_cookie_spec.rb +0 -30
  324. data/spec/moneta/adapter_couch_spec.rb +0 -36
  325. data/spec/moneta/adapter_datamapper_spec.rb +0 -64
  326. data/spec/moneta/adapter_daybreak_spec.rb +0 -31
  327. data/spec/moneta/adapter_dbm_spec.rb +0 -31
  328. data/spec/moneta/adapter_file_spec.rb +0 -34
  329. data/spec/moneta/adapter_fog_spec.rb +0 -37
  330. data/spec/moneta/adapter_gdbm_spec.rb +0 -31
  331. data/spec/moneta/adapter_hbase_spec.rb +0 -33
  332. data/spec/moneta/adapter_kyotocabinet_spec.rb +0 -31
  333. data/spec/moneta/adapter_leveldb_spec.rb +0 -31
  334. data/spec/moneta/adapter_lmdb_spec.rb +0 -32
  335. data/spec/moneta/adapter_lmdb_with_db_spec.rb +0 -32
  336. data/spec/moneta/adapter_localmemcache_spec.rb +0 -32
  337. data/spec/moneta/adapter_memcached_dalli_spec.rb +0 -36
  338. data/spec/moneta/adapter_memcached_dalli_with_default_expires_spec.rb +0 -37
  339. data/spec/moneta/adapter_memcached_native_spec.rb +0 -36
  340. data/spec/moneta/adapter_memcached_native_with_default_expires_spec.rb +0 -37
  341. data/spec/moneta/adapter_memcached_spec.rb +0 -36
  342. data/spec/moneta/adapter_memcached_with_default_expires_spec.rb +0 -37
  343. data/spec/moneta/adapter_memory_spec.rb +0 -184
  344. data/spec/moneta/adapter_mongo_moped_spec.rb +0 -64
  345. data/spec/moneta/adapter_mongo_moped_with_default_expires_spec.rb +0 -53
  346. data/spec/moneta/adapter_mongo_official_spec.rb +0 -64
  347. data/spec/moneta/adapter_mongo_official_with_default_expires_spec.rb +0 -53
  348. data/spec/moneta/adapter_mongo_spec.rb +0 -51
  349. data/spec/moneta/adapter_mongo_with_default_expires_spec.rb +0 -53
  350. data/spec/moneta/adapter_pstore_spec.rb +0 -250
  351. data/spec/moneta/adapter_redis_spec.rb +0 -36
  352. data/spec/moneta/adapter_redis_with_default_expires_spec.rb +0 -37
  353. data/spec/moneta/adapter_restclient_spec.rb +0 -33
  354. data/spec/moneta/adapter_riak_spec.rb +0 -36
  355. data/spec/moneta/adapter_sdbm_spec.rb +0 -30
  356. data/spec/moneta/adapter_sequel_spec.rb +0 -34
  357. data/spec/moneta/adapter_sqlite_spec.rb +0 -32
  358. data/spec/moneta/adapter_tdb_spec.rb +0 -31
  359. data/spec/moneta/adapter_tokyocabinet_bdb_spec.rb +0 -31
  360. data/spec/moneta/adapter_tokyocabinet_hdb_spec.rb +0 -31
  361. data/spec/moneta/adapter_tokyotyrant_spec.rb +0 -34
  362. data/spec/moneta/adapter_yaml_spec.rb +0 -57
  363. data/spec/moneta/cache_file_memory_spec.rb +0 -50
  364. data/spec/moneta/cache_memory_null_spec.rb +0 -35
  365. data/spec/moneta/expires_file_spec.rb +0 -78
  366. data/spec/moneta/expires_memory_spec.rb +0 -189
  367. data/spec/moneta/expires_memory_with_default_expires_spec.rb +0 -190
  368. data/spec/moneta/lock_spec.rb +0 -187
  369. data/spec/moneta/null_adapter_spec.rb +0 -86
  370. data/spec/moneta/pool_spec.rb +0 -38
  371. data/spec/moneta/proxy_expires_memory_spec.rb +0 -191
  372. data/spec/moneta/proxy_redis_spec.rb +0 -40
  373. data/spec/moneta/shared_tcp_spec.rb +0 -46
  374. data/spec/moneta/shared_unix_spec.rb +0 -46
  375. data/spec/moneta/standard_activerecord_spec.rb +0 -253
  376. data/spec/moneta/standard_activerecord_with_expires_spec.rb +0 -255
  377. data/spec/moneta/standard_cassandra_spec.rb +0 -252
  378. data/spec/moneta/standard_client_tcp_spec.rb +0 -269
  379. data/spec/moneta/standard_client_unix_spec.rb +0 -254
  380. data/spec/moneta/standard_couch_spec.rb +0 -252
  381. data/spec/moneta/standard_couch_with_expires_spec.rb +0 -254
  382. data/spec/moneta/standard_datamapper_spec.rb +0 -254
  383. data/spec/moneta/standard_datamapper_with_expires_spec.rb +0 -256
  384. data/spec/moneta/standard_datamapper_with_repository_spec.rb +0 -254
  385. data/spec/moneta/standard_daybreak_spec.rb +0 -250
  386. data/spec/moneta/standard_daybreak_with_expires_spec.rb +0 -252
  387. data/spec/moneta/standard_dbm_spec.rb +0 -250
  388. data/spec/moneta/standard_dbm_with_expires_spec.rb +0 -252
  389. data/spec/moneta/standard_file_spec.rb +0 -253
  390. data/spec/moneta/standard_file_with_expires_spec.rb +0 -255
  391. data/spec/moneta/standard_fog_spec.rb +0 -256
  392. data/spec/moneta/standard_fog_with_expires_spec.rb +0 -258
  393. data/spec/moneta/standard_gdbm_spec.rb +0 -250
  394. data/spec/moneta/standard_gdbm_with_expires_spec.rb +0 -252
  395. data/spec/moneta/standard_hashfile_spec.rb +0 -253
  396. data/spec/moneta/standard_hashfile_with_expires_spec.rb +0 -255
  397. data/spec/moneta/standard_hbase_spec.rb +0 -252
  398. data/spec/moneta/standard_hbase_with_expires_spec.rb +0 -255
  399. data/spec/moneta/standard_kyotocabinet_spec.rb +0 -250
  400. data/spec/moneta/standard_kyotocabinet_with_expires_spec.rb +0 -252
  401. data/spec/moneta/standard_leveldb_spec.rb +0 -250
  402. data/spec/moneta/standard_leveldb_with_expires_spec.rb +0 -252
  403. data/spec/moneta/standard_lmdb_spec.rb +0 -251
  404. data/spec/moneta/standard_lmdb_with_expires_spec.rb +0 -253
  405. data/spec/moneta/standard_localmemcache_spec.rb +0 -251
  406. data/spec/moneta/standard_localmemcache_with_expires_spec.rb +0 -252
  407. data/spec/moneta/standard_lruhash_spec.rb +0 -187
  408. data/spec/moneta/standard_lruhash_with_expires_spec.rb +0 -189
  409. data/spec/moneta/standard_memcached_dalli_spec.rb +0 -255
  410. data/spec/moneta/standard_memcached_native_spec.rb +0 -255
  411. data/spec/moneta/standard_memcached_spec.rb +0 -255
  412. data/spec/moneta/standard_memory_spec.rb +0 -187
  413. data/spec/moneta/standard_memory_with_compress_spec.rb +0 -187
  414. data/spec/moneta/standard_memory_with_expires_spec.rb +0 -189
  415. data/spec/moneta/standard_memory_with_json_key_serializer_spec.rb +0 -86
  416. data/spec/moneta/standard_memory_with_json_serializer_spec.rb +0 -49
  417. data/spec/moneta/standard_memory_with_json_value_serializer_spec.rb +0 -90
  418. data/spec/moneta/standard_memory_with_prefix_spec.rb +0 -187
  419. data/spec/moneta/standard_memory_with_snappy_compress_spec.rb +0 -187
  420. data/spec/moneta/standard_mongo_moped_spec.rb +0 -255
  421. data/spec/moneta/standard_mongo_official_spec.rb +0 -255
  422. data/spec/moneta/standard_mongo_spec.rb +0 -255
  423. data/spec/moneta/standard_null_spec.rb +0 -120
  424. data/spec/moneta/standard_pstore_spec.rb +0 -253
  425. data/spec/moneta/standard_pstore_with_expires_spec.rb +0 -255
  426. data/spec/moneta/standard_redis_spec.rb +0 -255
  427. data/spec/moneta/standard_restclient_spec.rb +0 -252
  428. data/spec/moneta/standard_riak_spec.rb +0 -255
  429. data/spec/moneta/standard_riak_with_expires_spec.rb +0 -256
  430. data/spec/moneta/standard_sdbm_spec.rb +0 -249
  431. data/spec/moneta/standard_sdbm_with_expires_spec.rb +0 -251
  432. data/spec/moneta/standard_sequel_spec.rb +0 -253
  433. data/spec/moneta/standard_sequel_with_expires_spec.rb +0 -255
  434. data/spec/moneta/standard_sqlite_spec.rb +0 -251
  435. data/spec/moneta/standard_sqlite_with_expires_spec.rb +0 -253
  436. data/spec/moneta/standard_tdb_spec.rb +0 -250
  437. data/spec/moneta/standard_tdb_with_expires_spec.rb +0 -252
  438. data/spec/moneta/standard_tokyocabinet_spec.rb +0 -250
  439. data/spec/moneta/standard_tokyocabinet_with_expires_spec.rb +0 -252
  440. data/spec/moneta/standard_tokyotyrant_spec.rb +0 -253
  441. data/spec/moneta/standard_tokyotyrant_with_expires_spec.rb +0 -255
  442. data/spec/moneta/standard_yaml_spec.rb +0 -250
  443. data/spec/moneta/standard_yaml_with_expires_spec.rb +0 -252
  444. data/spec/moneta/transformer_bencode_spec.rb +0 -55
  445. data/spec/moneta/transformer_bert_spec.rb +0 -55
  446. data/spec/moneta/transformer_bson_spec.rb +0 -60
  447. data/spec/moneta/transformer_bzip2_spec.rb +0 -55
  448. data/spec/moneta/transformer_json_spec.rb +0 -55
  449. data/spec/moneta/transformer_key_inspect_spec.rb +0 -91
  450. data/spec/moneta/transformer_key_marshal_spec.rb +0 -191
  451. data/spec/moneta/transformer_key_to_s_spec.rb +0 -91
  452. data/spec/moneta/transformer_key_yaml_spec.rb +0 -191
  453. data/spec/moneta/transformer_lz4_spec.rb +0 -55
  454. data/spec/moneta/transformer_lzma_spec.rb +0 -55
  455. data/spec/moneta/transformer_lzo_spec.rb +0 -55
  456. data/spec/moneta/transformer_marshal_base64_spec.rb +0 -194
  457. data/spec/moneta/transformer_marshal_city128_spec.rb +0 -194
  458. data/spec/moneta/transformer_marshal_city32_spec.rb +0 -194
  459. data/spec/moneta/transformer_marshal_city64_spec.rb +0 -194
  460. data/spec/moneta/transformer_marshal_escape_spec.rb +0 -194
  461. data/spec/moneta/transformer_marshal_hex_spec.rb +0 -194
  462. data/spec/moneta/transformer_marshal_hmac_spec.rb +0 -194
  463. data/spec/moneta/transformer_marshal_md5_spec.rb +0 -194
  464. data/spec/moneta/transformer_marshal_md5_spread_spec.rb +0 -194
  465. data/spec/moneta/transformer_marshal_prefix_spec.rb +0 -194
  466. data/spec/moneta/transformer_marshal_qp_spec.rb +0 -194
  467. data/spec/moneta/transformer_marshal_rmd160_spec.rb +0 -194
  468. data/spec/moneta/transformer_marshal_sha1_spec.rb +0 -194
  469. data/spec/moneta/transformer_marshal_sha256_spec.rb +0 -194
  470. data/spec/moneta/transformer_marshal_sha384_spec.rb +0 -194
  471. data/spec/moneta/transformer_marshal_sha512_spec.rb +0 -194
  472. data/spec/moneta/transformer_marshal_spec.rb +0 -191
  473. data/spec/moneta/transformer_marshal_truncate_spec.rb +0 -194
  474. data/spec/moneta/transformer_marshal_uuencode_spec.rb +0 -194
  475. data/spec/moneta/transformer_msgpack_spec.rb +0 -55
  476. data/spec/moneta/transformer_ox_spec.rb +0 -191
  477. data/spec/moneta/transformer_php_spec.rb +0 -55
  478. data/spec/moneta/transformer_quicklz_spec.rb +0 -55
  479. data/spec/moneta/transformer_snappy_spec.rb +0 -55
  480. data/spec/moneta/transformer_tnet_spec.rb +0 -55
  481. data/spec/moneta/transformer_value_marshal_spec.rb +0 -191
  482. data/spec/moneta/transformer_value_yaml_spec.rb +0 -191
  483. data/spec/moneta/transformer_yaml_spec.rb +0 -191
  484. data/spec/moneta/transformer_zlib_spec.rb +0 -55
  485. data/spec/moneta/weak_create_spec.rb +0 -41
  486. data/spec/moneta/weak_increment_spec.rb +0 -41
  487. data/spec/monetaspecs.rb +0 -51267
  488. data/spec/quality_spec.rb +0 -51
data/SPEC.md CHANGED
@@ -67,6 +67,67 @@ Closes the store
67
67
 
68
68
  Feature detection. Adapters MUST return <code>:create</code> and <code>:increment</code> if these methods are supported.
69
69
 
70
+ ### `each_key => Enumerator` and `each_key(&block) => Object`
71
+
72
+ Enumerates over the keys in the store. This method is not supported by all
73
+ stores. When not supported, this method MUST raise a `NotImplementedError`,
74
+ regardless of whether a block is supplied. When supported, this method allows
75
+ traversal of all keys in the store. The method behaves differently depending on
76
+ whether a block is supplied. In either case, for each key, `k` in the
77
+ traversal, `key?(k)` MUST return `true`; and for each key, `k` for which
78
+ `key?(k)` returns `true`, `k` MUST be traversed by `each_key`. Keys MAY be
79
+ traversed in any order. Mutation of the store while traversing keys MAY be
80
+ allowed. Querying the store (calling `fetch`, `key?`, etc.) while traversing
81
+ MUST be allowed.
82
+
83
+ * If no block is supplied, `each_key` MUST return an `Enumerator` that can be
84
+ used to traverse each key (e.g. by calling `each`). Calling methods on the
85
+ `Enumerator` such as `each` with a block MUST return the store object.
86
+
87
+ * If a block is supplied, that block MUST be called once with each traversed key
88
+ as the only argument. When called in this way, `each_key` MUST return the
89
+ store object.
90
+
91
+ ### `values_at(*keys[Array<Object>], **options[Hash]) => Array<Object>`
92
+
93
+ Returns an array containing the values associated with the given keys, in the
94
+ same order as the supplied keys. If a key is not present in the
95
+ key-value-store, `nil` MUST be returned in its place. For each key, and each
96
+ value, the same restrictions apply as apply to individual keys passed to, and
97
+ values received from the store in the specification of `[]` (see above). The
98
+ adapter MAY perform this operation atomically.
99
+
100
+ ### `fetch_values(*keys[Array<Object>], **options[Hash], &defaults) => Array<Object>`
101
+
102
+ Behaves identically to `values_at`, except that it MUST accept an optional
103
+ block. When supplied, the block will be called successively with each supplied
104
+ key that is not present in the store. The return value of the block call MUST
105
+ be used in place of `nil` in returned the array of values. As with `fetch`
106
+ (above), the adapter MUST NOT store the return value of the block call in the
107
+ key-value-store. The adapter MAY perform this operation atomically.
108
+
109
+ ### `slice(*keys[Array<Object>], **options[Hash]) => <Array(Object, Object)>`
110
+
111
+ Returns a collection of key-value pairs corresponding to those supplied keys
112
+ which are present in the key-value store, and their associated values. A key
113
+ MUST be present in the return value if and only if it was supplied in the `keys`
114
+ parameter and it is present in the key-value store. For each key, and each
115
+ value, the same restrictions apply as apply to individual keys passed to, and
116
+ values received from the store in the specification of `[]` (see above). The
117
+ adapter MAY perform this operation atomically.
118
+
119
+ ### `merge!(pairs[<Array(Object, Object)>], options[Hash] => {}, &block) => self`
120
+
121
+ Stores the pairs in the key-value-store, and returns the store object. This
122
+ method MUST behave identically to successively calling `[]=` with each key-value
123
+ pair and the options hash; except that the adapter MAY perform this operation
124
+ atomically, and the method MUST accept an optional block, which MUST be called
125
+ for each key that is to be overwritten. When the block is provided, it MUST be
126
+ called before overwriting any existing values with the key, old value and
127
+ supplied value, and the return value of the block MUST be used in place of the
128
+ supplied value. `merge!` MUST also be aliased as `update`.
129
+
130
+
70
131
  ## Additional Options Hashes
71
132
 
72
133
  The following methods may all take an additional Hash as a final argument. This allows the client to send additional options which can be specified by the adapter (and which may be specified by extensions to this specification). The methods MUST NOT modify the supplied option hash.
@@ -78,6 +139,15 @@ The following methods may all take an additional Hash as a final argument. This
78
139
  * key?
79
140
  * increment
80
141
  * clear
142
+ * merge!
143
+
144
+ Additionally, the following methods accept options as keyword arguments, after
145
+ non-keyword arguments. These keyword arguments are treated as a hash,
146
+ equivalent to supplying a hash to the above methods.
147
+
148
+ * values_at
149
+ * fetch_values
150
+ * slice
81
151
 
82
152
  In the case of methods with optional arguments, the Hash MUST be provided as the final argument. Keys in this Hash MUST be Symbols.
83
153
 
@@ -0,0 +1,227 @@
1
+ ---
2
+ group: Persistent stores
3
+ features: [ persist ]
4
+ notes:
5
+ poor multiprocess performance: >
6
+ Sqlite/YAML/PStore are multiprocess safe, but the performance suffers badly
7
+ since the whole database file must be locked for writing. Use a key/value
8
+ server if you want multiprocess concurrency!
9
+ backends:
10
+ - adapter: Mongo
11
+ platforms: [ MRI, JRuby ]
12
+ gems: mongo
13
+ features: [ threadsafe, multiprocess, increment, create, expires, each_key, bulk_read, bulk_write ]
14
+ description: "[MongoDB](http://www.mongodb.org/) database"
15
+ - adapter: Redis
16
+ platforms: [ MRI, JRuby ]
17
+ gems: redis
18
+ features: [ threadsafe, multiprocess, increment, create, expires, each_key, bulk_read, bulk_write ]
19
+ description: "[Redis](http://redis.io/) database"
20
+ - adapter: ActiveRecord
21
+ platforms: [ MRI, JRuby ]
22
+ gems: activerecord
23
+ features: [ threadsafe, multiprocess, increment, create, each_key, bulk_read, bulk_write ]
24
+ description: "[ActiveRecord](https://rubygems.org/gems/activerecord) ORM"
25
+ - adapter: File
26
+ platforms: [ MRI, JRuby ]
27
+ features: [ threadsafe, multiprocess, increment, create, each_key ]
28
+ description: "File store"
29
+ - adapter: LMDB
30
+ platforms: [ MRI ]
31
+ gems: lmdb
32
+ features: [ threadsafe, multiprocess, increment, create, each_key, bulk_read, bulk_write ]
33
+ description: "[Symas Lightning Memory-Mapped Database (LMDB)](http://symas.com/mdb/)"
34
+ - adapter: Sequel
35
+ platforms: [ MRI, JRuby ]
36
+ gems: sequel
37
+ features: [ threadsafe, multiprocess, increment, create, each_key, bulk_read, bulk_write ]
38
+ description: "[Sequel](http://sequel.rubyforge.org/) ORM"
39
+ - adapter: TokyoTyrant
40
+ platforms: [ MRI, JRuby ]
41
+ gems: tokyotyrant or ruby-tokyotyrant
42
+ features: [ multiprocess, increment, create, bulk_read ]
43
+ description: "[TokyoTyrant](http://fallabs.com/tokyotyrant/) database"
44
+ - adapter: PStore
45
+ platforms: [ MRI ]
46
+ features: [ multiprocess, increment, create, each_key, bulk_read, bulk_write ]
47
+ description: "[PStore](http://ruby-doc.org/stdlib/libdoc/pstore/rdoc/PStore.html) store"
48
+ notes:
49
+ multiprocess: poor multiprocess performance
50
+ - adapter: YAML
51
+ platforms: [ MRI, JRuby ]
52
+ features: [ multiprocess, increment, create, each_key ]
53
+ description: "[YAML](http://www.ruby-doc.org/stdlib/libdoc/yaml/rdoc/YAML/Store.html) store"
54
+ notes:
55
+ multiprocess: poor multiprocess performance
56
+ - adapter: Sqlite
57
+ platforms: [ MRI ]
58
+ gems: sqlite3
59
+ features: [ multiprocess, increment, create, bulk_read, bulk_write, each_key ]
60
+ description: "[Sqlite3](http://sqlite.org/) database"
61
+ unknown: [ threadsafe ]
62
+ notes:
63
+ multiprocess: poor multiprocess performance
64
+ - adapter: Daybreak
65
+ platforms: [ MRI, JRuby ]
66
+ gems: daybreak
67
+ features: [ multiprocess, increment, create, each_key, bulk_write ]
68
+ description: "Incredibly fast pure-ruby key/value store [Daybreak](http://propublica.github.com/daybreak/)"
69
+ - adapter: DBM
70
+ platforms: [ MRI ]
71
+ features: [ increment, create, each_key, bulk_read, bulk_write ]
72
+ description: "[Berkeley DB using DBM interface or NDBM (Depends on Ruby environment)](http://www.ruby-doc.org/stdlib/libdoc/dbm/rdoc/DBM.html)"
73
+ - adapter: GDBM
74
+ platforms: [ MRI, JRuby ]
75
+ gems: ffi-gdbm on JRuby
76
+ features: [ increment, create, each_key, bulk_read, bulk_write ]
77
+ description: "[GDBM](http://www.ruby-doc.org/stdlib/libdoc/gdbm/rdoc/GDBM.html) database"
78
+ - adapter: LevelDB
79
+ platforms: [ MRI ]
80
+ gems: leveldb
81
+ features: [ increment, create, each_key, bulk_read, bulk_write ]
82
+ description: "[LevelDB](http://code.google.com/p/leveldb/) database"
83
+ - adapter: SDBM
84
+ platforms: [ MRI ]
85
+ features: [ increment, create, each_key, bulk_read, bulk_write ]
86
+ description: "[SDBM](http://www.ruby-doc.org/stdlib/libdoc/sdbm/rdoc/SDBM.html) database"
87
+ - adapter: TDB
88
+ platforms: [ MRI ]
89
+ gems: tdb
90
+ features: [ increment, create, each_key ]
91
+ description: "[TDB](http://tdb.samba.org/) database"
92
+ - adapter: KyotoCabinet
93
+ platforms: [ MRI ]
94
+ gems: kyotocabinet-ruby or kyotocabinet-ruby-reanimated
95
+ features: [ increment, create, each_key, bulk_read, bulk_write ]
96
+ description: "[KyotoCabinet](http://fallabs.com/kyotocabinet/) database"
97
+ - adapter: TokyoCabinet
98
+ platforms: [ MRI ]
99
+ gems: tokyocabinet
100
+ features: [ increment, create, each_key ]
101
+ description: "[TokyoCabinet](http://fallabs.com/tokyocabinet/) database"
102
+ - adapter: DataMapper
103
+ platforms: [ MRI ]
104
+ gems: dm-core, dm-migrations
105
+ features: [ threadsafe, multiprocess, create ]
106
+ description: "[DataMapper](http://datamapper.org/) ORM"
107
+ - adapter: Couch
108
+ platforms: [ MRI, JRuby ]
109
+ gems: faraday, multi_json
110
+ features: [ multiprocess, create, each_key, bulk_read, bulk_write ]
111
+ description: "[CouchDB](http://couchdb.apache.org/) database"
112
+ - adapter: HBase
113
+ platforms: [ Unstable ]
114
+ gems: hbaserb
115
+ features: [ multiprocess, increment ]
116
+ unknown: [threadsafe]
117
+ description: "[HBase](http://hbase.apache.org/) database"
118
+ - adapter: Cassandra
119
+ platforms: [ MRI, JRuby ]
120
+ gems: cassandra
121
+ features: [ multiprocess, expires, each_key, bulk_read, bulk_write ]
122
+ unknown: [threadsafe]
123
+ description: "[Cassandra](http://cassandra.apache.org/) distributed database"
124
+ - adapter: LocalMemCache
125
+ platforms: [ MRI ]
126
+ gems: localmemcache
127
+ features: [ threadsafe, multiprocess ]
128
+ description: "[LocalMemCache](http://localmemcache.rubyforge.org/) database"
129
+ - adapter: Fog
130
+ platforms: [ MRI, JRuby ]
131
+ gems: fog
132
+ features: [multiprocess]
133
+ unknown: [threadsafe]
134
+ description: "[Fog](http://fog.io/) cloud store"
135
+ - adapter: Riak
136
+ platforms: [ Unstable ]
137
+ gems: riak-client
138
+ features: [multiprocess]
139
+ description: "[Riak](http://docs.basho.com/) database"
140
+ ---
141
+ group: Non-persistent stores
142
+ notes:
143
+ memcached protocol: >
144
+ There are some servers which use the memcached protocol but which are persistent
145
+ (e.g. [MemcacheDB](http://memcachedb.org/),
146
+ [Kai](http://sourceforge.net/apps/mediawiki/kai),
147
+ [IronCache](http://dev.iron.io/cache/reference/memcache/),
148
+ [Roma](https://github.com/roma/roma/tree),
149
+ [Flare](http://labs.gree.jp/Top/OpenSource/Flare-en.html) and
150
+ [Kumofs](https://github.com/etolabo/kumofs))
151
+ memcached backend: >
152
+ This feature is only available if the dalli backend is selected
153
+ in-memory multiprocess caveat: >
154
+ Store is multi-process safe because it is an in-memory store, values are not
155
+ shared between multiple processes
156
+ backends:
157
+ - adapter: MemcachedDalli
158
+ platforms: [ MRI, JRuby ]
159
+ gems: dalli
160
+ features: [ threadsafe, multiprocess, increment, create, expires, bulk_read, bulk_write ]
161
+ description: "[Memcached](http://memcached.org/) database with Dalli library"
162
+ notes:
163
+ persist: memcached protocol
164
+ - adapter: Memcached
165
+ platforms: [ MRI ]
166
+ gems: dalli or memcached
167
+ features: [ multiprocess, increment, create, expires ]
168
+ unknown: [ threadsafe, bulk_read, bulk_write, JRuby ]
169
+ description: "[Memcached](http://memcached.org/) database"
170
+ notes:
171
+ persist: memcached protocol
172
+ JRuby: memcached backend
173
+ threadsafe: memcached backend
174
+ bulk_read: memcached backend
175
+ bulk_write: memcached backend
176
+ - adapter: MemcachedNative
177
+ platforms: [ MRI ]
178
+ gems: memcached
179
+ features: [ multiprocess, increment, create, expires ]
180
+ description: "Memcached database with native library"
181
+ notes:
182
+ persist: memcached protocol
183
+ - adapter: Cookie
184
+ platforms: [ MRI, JRuby ]
185
+ features: [ multiprocess, increment, create, expires, each_key ]
186
+ description: "Cookie in memory store"
187
+ notes:
188
+ multiprocess: in-memory multiprocess caveat
189
+ - adapter: LRUHash
190
+ platforms: [ MRI, JRuby ]
191
+ features: [ multiprocess, increment, create, each_key ]
192
+ description: "LRU memory store"
193
+ notes:
194
+ multiprocess: in-memory multiprocess caveat
195
+ - adapter: Memory
196
+ platforms: [ MRI, JRuby ]
197
+ features: [ multiprocess, increment, create, each_key, bulk_read, bulk_write ]
198
+ description: Memory store
199
+ notes:
200
+ multiprocess: in-memory multiprocess caveat
201
+ - adapter: "Null"
202
+ platforms: [ MRI, JRuby ]
203
+ features: [ threadsafe, multiprocess ]
204
+ description: "No database"
205
+ ---
206
+ group: Network clients
207
+ notes:
208
+ depends on server: Depends on server
209
+ backends:
210
+ - adapter: Client
211
+ platforms: [ MRI, JRuby ]
212
+ features: [multiprocess]
213
+ unknown: [ increment, create, expires, persist, each_key ]
214
+ description: "Moneta client adapter"
215
+ notes:
216
+ increment: depends on server
217
+ create: depends on server
218
+ expires: depends on server
219
+ persist: depends on server
220
+ each_key: depends on server
221
+ - adapter: RestClient
222
+ platforms: [ MRI, JRuby ]
223
+ features: [ multiprocess ]
224
+ unknown: [ persist ]
225
+ description: "Moneta REST client adapter"
226
+ notes:
227
+ persist: depends on server
@@ -3,6 +3,7 @@ require 'action_dispatch/middleware/session/abstract_store'
3
3
 
4
4
  module ActionDispatch
5
5
  module Session
6
+ # A Rails cache backed by any Moneta store
6
7
  class MonetaStore < Rack::Session::Moneta
7
8
  include Compatibility
8
9
  include StaleSessionCheck
@@ -12,14 +12,14 @@ module ActiveSupport
12
12
  def increment(key, amount = 1, options = nil)
13
13
  options = merged_options(options)
14
14
  instrument(:increment, key, amount: amount) do
15
- @store.increment(namespaced_key(key, options), amount, moneta_options(options))
15
+ @store.increment(normalize_key(key, options), amount, moneta_options(options))
16
16
  end
17
17
  end
18
18
 
19
19
  def decrement(key, amount = 1, options = nil)
20
20
  options = merged_options(options)
21
21
  instrument(:decrement, key, amount: amount) do
22
- @store.increment(namespaced_key(key, options), -amount, moneta_options(options))
22
+ @store.increment(normalize_key(key, options), -amount, moneta_options(options))
23
23
  end
24
24
  end
25
25
 
@@ -30,11 +30,79 @@ module ActiveSupport
30
30
  end
31
31
  end
32
32
 
33
+ # This prevents underlying Moneta transformers from erroring on raw values
34
+ def exist?(name, options = {})
35
+ super
36
+ rescue
37
+ super(name, options.merge(raw: true))
38
+ end
39
+
40
+ # These are the rails 5.2 versions of these methods, which call into the
41
+ # lower-level read_multi_entries and write_multi_entries methods. We
42
+ # define them here only if the superclass versions don't use the *_entries
43
+ # methods.
44
+ unless [:read_multi_entries, :write_multi_entries].all? { |m| superclass.private_instance_methods.include? m }
45
+ def fetch_multi(*names)
46
+ raise ArgumentError, "Missing block: `Cache#fetch_multi` requires a block." \
47
+ unless block_given?
48
+
49
+ options = names.extract_options!
50
+ options = merged_options(options)
51
+
52
+ instrument :read_multi, names, options do |payload|
53
+ read_multi_entries(names, options).tap do |results|
54
+ payload[:hits] = results.keys
55
+ payload[:super_operation] = :fetch_multi
56
+
57
+ writes = {}
58
+
59
+ (names - results.keys).each do |name|
60
+ results[name] = writes[name] = yield(name)
61
+ end
62
+
63
+ write_multi writes, options
64
+ end
65
+ end
66
+ end
67
+
68
+ def read_multi(*names)
69
+ options = names.extract_options!
70
+ options = merged_options(options)
71
+
72
+ instrument :read_multi, names, options do |payload|
73
+ read_multi_entries(names, options).tap do |results|
74
+ payload[:hits] = results.keys
75
+ end
76
+ end
77
+ end
78
+
79
+ def write_multi(hash, options = nil)
80
+ options = merged_options(options)
81
+
82
+ instrument :write_multi, hash, options do
83
+ entries = hash.each_with_object({}) do |(name, value), memo|
84
+ memo[normalize_key(name, options)] = \
85
+ Entry.new(value, options.merge(version: normalize_version(name, options)))
86
+ end
87
+
88
+ write_multi_entries entries, options
89
+ end
90
+ end
91
+ end
92
+
33
93
  protected
34
94
 
95
+ def make_entry(value)
96
+ case value
97
+ when ActiveSupport::Cache::Entry, nil
98
+ value
99
+ else
100
+ ActiveSupport::Cache::Entry.new(value)
101
+ end
102
+ end
103
+
35
104
  def read_entry(key, options)
36
- entry = @store.load(key, moneta_options(options))
37
- entry && (ActiveSupport::Cache::Entry === entry ? entry : ActiveSupport::Cache::Entry.new(entry))
105
+ make_entry(@store.load(key, moneta_options(options, false)))
38
106
  end
39
107
 
40
108
  def write_entry(key, entry, options)
@@ -48,11 +116,39 @@ module ActiveSupport
48
116
  true
49
117
  end
50
118
 
119
+ def read_multi_entries(names, options)
120
+ keys = names.map { |name| normalize_key(name, options) }
121
+ entries = @store
122
+ .values_at(*keys, **moneta_options(options, false))
123
+ .map(&method(:make_entry))
124
+
125
+ names.zip(keys, entries).map do |name, key, entry|
126
+ next if entry == nil
127
+ delete_entry(key, options) if entry.expired?
128
+ next if entry.expired? || entry.mismatched?(normalize_version(name, options))
129
+
130
+ [name, entry.value]
131
+ end.compact.to_h
132
+ end
133
+
134
+ def write_multi_entries(hash, options)
135
+ pairs = if options[:raw]
136
+ hash.transform_values { |entry| entry.value.to_s }
137
+ else
138
+ hash
139
+ end
140
+
141
+ @store.merge!(pairs, moneta_options(options))
142
+ hash
143
+ end
144
+
51
145
  private
52
146
 
53
- def moneta_options(options)
147
+ def moneta_options(options, include_expires = true)
54
148
  new_options = options ? options.dup : {}
55
- new_options[:expires] = new_options.delete(:expires_in).to_i if new_options.include?(:expires_in)
149
+ if new_options.include?(:expires_in) and include_expires
150
+ new_options[:expires] = new_options.delete(:expires_in).to_r
151
+ end
56
152
  new_options
57
153
  end
58
154
  end
@@ -0,0 +1,52 @@
1
+ module Moneta
2
+ # Adapter base class
3
+ # @api public
4
+ class Adapter
5
+ include Defaults
6
+ include Config
7
+
8
+ attr_reader :backend
9
+
10
+ class << self
11
+ # Define a block used to build this adapter's backend. The block will
12
+ # receive as keyword arguments any options passed to the adapter during
13
+ # initialization that are not config settings.
14
+ #
15
+ # If the adapter is initialized with a `:backend` option, this will be used
16
+ # instead, and the block won't be called.
17
+ #
18
+ # @param [Boolean] required
19
+ # @yield [**options] options passed to the adapter's initialize method
20
+ # @yieldreturn [Object] The backend to use
21
+ def backend(required: true, &block)
22
+ raise "backend block already set" if class_variables(false).include?(:@@backend_block)
23
+ class_variable_set(:@@backend_block, block)
24
+ class_variable_set(:@@backend_required, true) if required
25
+ end
26
+
27
+ def backend_block
28
+ class_variable_get(:@@backend_block) if class_variable_defined?(:@@backend_block)
29
+ end
30
+
31
+ def backend_required?
32
+ class_variable_defined?(:@@backend_required)
33
+ end
34
+ end
35
+
36
+ # @param [Hash] options
37
+ def initialize(options = {})
38
+ set_backend(**configure(**options))
39
+ end
40
+
41
+ private
42
+
43
+ def set_backend(backend: nil, **options)
44
+ @backend = backend ||
45
+ if backend_block = self.class.backend_block
46
+ instance_exec(**options, &backend_block)
47
+ end
48
+
49
+ raise ArgumentError, 'backend needs to be set - refer to adapter documentation' if !@backend && self.class.backend_required?
50
+ end
51
+ end
52
+ end