moneta 1.5.1 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (258) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +18 -0
  3. data/CONTRIBUTORS +4 -0
  4. data/LICENSE +1 -1
  5. data/README.md +4 -6
  6. data/lib/active_support/cache/moneta_store.rb +32 -6
  7. data/lib/moneta/adapters/activerecord/backend.rb +50 -0
  8. data/lib/moneta/adapters/activerecord/v5_backend.rb +80 -0
  9. data/lib/moneta/adapters/activerecord.rb +50 -95
  10. data/lib/moneta/adapters/activesupportcache.rb +69 -14
  11. data/lib/moneta/adapters/client.rb +1 -1
  12. data/lib/moneta/adapters/hbase.rb +1 -1
  13. data/lib/moneta/adapters/mongo.rb +5 -3
  14. data/lib/moneta/adapters/redis.rb +2 -1
  15. data/lib/moneta/adapters/sequel/mysql.rb +6 -18
  16. data/lib/moneta/adapters/sequel/postgres_hstore.rb +8 -1
  17. data/lib/moneta/adapters/sqlite.rb +4 -2
  18. data/lib/moneta/adapters/tokyotyrant.rb +1 -1
  19. data/lib/moneta/adapters/yaml.rb +7 -1
  20. data/lib/moneta/pool.rb +16 -18
  21. data/lib/moneta/proxy.rb +1 -1
  22. data/lib/moneta/server.rb +9 -11
  23. data/lib/moneta/transformer/config.rb +4 -4
  24. data/lib/moneta/transformer.rb +4 -0
  25. data/lib/moneta/version.rb +1 -1
  26. data/lib/moneta.rb +1 -1
  27. metadata +10 -453
  28. data/.github/workflows/ruby.yml +0 -425
  29. data/.gitignore +0 -15
  30. data/.rspec +0 -4
  31. data/.rubocop.yml +0 -194
  32. data/.yardopts +0 -6
  33. data/Gemfile +0 -210
  34. data/feature_matrix.yaml +0 -227
  35. data/moneta.gemspec +0 -36
  36. data/script/benchmarks +0 -605
  37. data/script/contributors +0 -12
  38. data/script/memusage +0 -40
  39. data/script/parallel-tests +0 -82
  40. data/script/start-couchdb +0 -27
  41. data/script/start-hbase +0 -47
  42. data/script/start-services +0 -10
  43. data/script/travis-logs +0 -14
  44. data/script/update-feature-matrix +0 -148
  45. data/spec/active_support/cache_moneta_store_spec.rb +0 -282
  46. data/spec/features/concurrent_create.rb +0 -42
  47. data/spec/features/concurrent_increment.rb +0 -39
  48. data/spec/features/create.rb +0 -25
  49. data/spec/features/create_expires.rb +0 -19
  50. data/spec/features/default_expires.rb +0 -14
  51. data/spec/features/each_key.rb +0 -119
  52. data/spec/features/expires.rb +0 -296
  53. data/spec/features/features.rb +0 -16
  54. data/spec/features/increment.rb +0 -98
  55. data/spec/features/marshallable_key.rb +0 -43
  56. data/spec/features/marshallable_value.rb +0 -7
  57. data/spec/features/multiprocess.rb +0 -8
  58. data/spec/features/not_create.rb +0 -7
  59. data/spec/features/not_each_key.rb +0 -7
  60. data/spec/features/not_increment.rb +0 -13
  61. data/spec/features/not_persist.rb +0 -9
  62. data/spec/features/null.rb +0 -66
  63. data/spec/features/persist.rb +0 -14
  64. data/spec/features/returndifferent.rb +0 -9
  65. data/spec/features/returnsame.rb +0 -9
  66. data/spec/features/store.rb +0 -261
  67. data/spec/features/store_large.rb +0 -13
  68. data/spec/features/transform_value.rb +0 -44
  69. data/spec/features/transform_value_expires.rb +0 -41
  70. data/spec/helper.rb +0 -444
  71. data/spec/moneta/adapters/activerecord/adapter_activerecord_existing_connection_spec.rb +0 -61
  72. data/spec/moneta/adapters/activerecord/adapter_activerecord_spec.rb +0 -126
  73. data/spec/moneta/adapters/activerecord/standard_activerecord_spec.rb +0 -21
  74. data/spec/moneta/adapters/activerecord/standard_activerecord_with_expires_spec.rb +0 -27
  75. data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_spec.rb +0 -54
  76. data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_with_default_expires_spec.rb +0 -54
  77. data/spec/moneta/adapters/activesupportcache/standard_activesupportcache_spec.rb +0 -14
  78. data/spec/moneta/adapters/cassandra/adapter_cassandra_spec.rb +0 -17
  79. data/spec/moneta/adapters/cassandra/adapter_cassandra_with_default_expires_spec.rb +0 -18
  80. data/spec/moneta/adapters/cassandra/helper.rb +0 -18
  81. data/spec/moneta/adapters/cassandra/standard_cassandra_spec.rb +0 -18
  82. data/spec/moneta/adapters/client/adapter_client_spec.rb +0 -11
  83. data/spec/moneta/adapters/client/client_helper.rb +0 -25
  84. data/spec/moneta/adapters/client/standard_client_tcp_spec.rb +0 -23
  85. data/spec/moneta/adapters/client/standard_client_unix_spec.rb +0 -28
  86. data/spec/moneta/adapters/cookie/adapter_cookie_spec.rb +0 -7
  87. data/spec/moneta/adapters/couch/adapter_couch_spec.rb +0 -204
  88. data/spec/moneta/adapters/couch/standard_couch_spec.rb +0 -15
  89. data/spec/moneta/adapters/couch/standard_couch_with_expires_spec.rb +0 -19
  90. data/spec/moneta/adapters/datamapper/adapter_datamapper_spec.rb +0 -60
  91. data/spec/moneta/adapters/datamapper/standard_datamapper_spec.rb +0 -21
  92. data/spec/moneta/adapters/datamapper/standard_datamapper_with_expires_spec.rb +0 -26
  93. data/spec/moneta/adapters/datamapper/standard_datamapper_with_repository_spec.rb +0 -22
  94. data/spec/moneta/adapters/daybreak/adapter_daybreak_spec.rb +0 -7
  95. data/spec/moneta/adapters/daybreak/standard_daybreak_spec.rb +0 -7
  96. data/spec/moneta/adapters/daybreak/standard_daybreak_with_expires_spec.rb +0 -11
  97. data/spec/moneta/adapters/dbm/adapter_dbm_spec.rb +0 -7
  98. data/spec/moneta/adapters/dbm/standard_dbm_spec.rb +0 -7
  99. data/spec/moneta/adapters/dbm/standard_dbm_with_expires_spec.rb +0 -12
  100. data/spec/moneta/adapters/faraday_helper.rb +0 -10
  101. data/spec/moneta/adapters/file/adapter_file_spec.rb +0 -7
  102. data/spec/moneta/adapters/file/standard_file_spec.rb +0 -7
  103. data/spec/moneta/adapters/file/standard_file_with_expires_spec.rb +0 -11
  104. data/spec/moneta/adapters/fog/adapter_fog_spec.rb +0 -16
  105. data/spec/moneta/adapters/fog/standard_fog_spec.rb +0 -15
  106. data/spec/moneta/adapters/fog/standard_fog_with_expires_spec.rb +0 -20
  107. data/spec/moneta/adapters/gdbm/adapter_gdbm_spec.rb +0 -7
  108. data/spec/moneta/adapters/gdbm/standard_gdbm_spec.rb +0 -7
  109. data/spec/moneta/adapters/gdbm/standard_gdbm_with_expires_spec.rb +0 -11
  110. data/spec/moneta/adapters/hashfile/standard_hashfile_spec.rb +0 -7
  111. data/spec/moneta/adapters/hashfile/standard_hashfile_with_expires_spec.rb +0 -12
  112. data/spec/moneta/adapters/hbase/adapter_hbase_spec.rb +0 -7
  113. data/spec/moneta/adapters/hbase/standard_hbase_spec.rb +0 -4
  114. data/spec/moneta/adapters/hbase/standard_hbase_with_expires_spec.rb +0 -8
  115. data/spec/moneta/adapters/kyotocabinet/adapter_kyotocabinet_spec.rb +0 -7
  116. data/spec/moneta/adapters/kyotocabinet/standard_kyotocabinet_spec.rb +0 -7
  117. data/spec/moneta/adapters/kyotocabinet/standard_kyotocabinet_with_expires_spec.rb +0 -14
  118. data/spec/moneta/adapters/leveldb/adapter_leveldb_spec.rb +0 -7
  119. data/spec/moneta/adapters/leveldb/standard_leveldb_spec.rb +0 -7
  120. data/spec/moneta/adapters/leveldb/standard_leveldb_with_expires_spec.rb +0 -11
  121. data/spec/moneta/adapters/lmdb/adapter_lmdb_spec.rb +0 -7
  122. data/spec/moneta/adapters/lmdb/adapter_lmdb_with_db_spec.rb +0 -7
  123. data/spec/moneta/adapters/lmdb/standard_lmdb_spec.rb +0 -7
  124. data/spec/moneta/adapters/lmdb/standard_lmdb_with_expires_spec.rb +0 -11
  125. data/spec/moneta/adapters/localmemcache/adapter_localmemcache_spec.rb +0 -7
  126. data/spec/moneta/adapters/localmemcache/standard_localmemcache_spec.rb +0 -7
  127. data/spec/moneta/adapters/localmemcache/standard_localmemcache_with_expires_spec.rb +0 -11
  128. data/spec/moneta/adapters/lruhash/adapter_lruhash_spec.rb +0 -118
  129. data/spec/moneta/adapters/lruhash/standard_lruhash_spec.rb +0 -4
  130. data/spec/moneta/adapters/lruhash/standard_lruhash_with_expires_spec.rb +0 -8
  131. data/spec/moneta/adapters/memcached/adapter_memcached_spec.rb +0 -13
  132. data/spec/moneta/adapters/memcached/dalli/adapter_memcached_dalli_spec.rb +0 -25
  133. data/spec/moneta/adapters/memcached/dalli/standard_memcached_dalli_spec.rb +0 -11
  134. data/spec/moneta/adapters/memcached/native/adapter_memcached_native_spec.rb +0 -25
  135. data/spec/moneta/adapters/memcached/native/standard_memcached_native_spec.rb +0 -11
  136. data/spec/moneta/adapters/memcached/standard_memcached_spec.rb +0 -17
  137. data/spec/moneta/adapters/memcached_helper.rb +0 -20
  138. data/spec/moneta/adapters/memory/adapter_memory_spec.rb +0 -7
  139. data/spec/moneta/adapters/memory/standard_memory_spec.rb +0 -4
  140. data/spec/moneta/adapters/memory/standard_memory_with_compress_spec.rb +0 -9
  141. data/spec/moneta/adapters/memory/standard_memory_with_expires_spec.rb +0 -8
  142. data/spec/moneta/adapters/memory/standard_memory_with_json_key_serializer_spec.rb +0 -4
  143. data/spec/moneta/adapters/memory/standard_memory_with_json_serializer_spec.rb +0 -9
  144. data/spec/moneta/adapters/memory/standard_memory_with_json_value_serializer_spec.rb +0 -9
  145. data/spec/moneta/adapters/memory/standard_memory_with_prefix_spec.rb +0 -41
  146. data/spec/moneta/adapters/memory/standard_memory_with_snappy_compress_spec.rb +0 -9
  147. data/spec/moneta/adapters/mongo/adapter_mongo_spec.rb +0 -41
  148. data/spec/moneta/adapters/mongo/adapter_mongo_with_default_expires_spec.rb +0 -14
  149. data/spec/moneta/adapters/mongo/standard_mongo_spec.rb +0 -7
  150. data/spec/moneta/adapters/null/null_adapter_spec.rb +0 -7
  151. data/spec/moneta/adapters/null/standard_null_spec.rb +0 -4
  152. data/spec/moneta/adapters/pstore/adapter_pstore_spec.rb +0 -7
  153. data/spec/moneta/adapters/pstore/standard_pstore_spec.rb +0 -9
  154. data/spec/moneta/adapters/pstore/standard_pstore_with_expires_spec.rb +0 -13
  155. data/spec/moneta/adapters/redis/adapter_redis_spec.rb +0 -20
  156. data/spec/moneta/adapters/redis/standard_redis_spec.rb +0 -14
  157. data/spec/moneta/adapters/restclient/adapter_restclient_spec.rb +0 -13
  158. data/spec/moneta/adapters/restclient/helper.rb +0 -12
  159. data/spec/moneta/adapters/restclient/standard_restclient_spec.rb +0 -13
  160. data/spec/moneta/adapters/riak/adapter_riak_spec.rb +0 -14
  161. data/spec/moneta/adapters/riak/standard_riak_spec.rb +0 -10
  162. data/spec/moneta/adapters/riak/standard_riak_with_expires_spec.rb +0 -14
  163. data/spec/moneta/adapters/sdbm/adapter_sdbm_spec.rb +0 -7
  164. data/spec/moneta/adapters/sdbm/standard_sdbm_spec.rb +0 -7
  165. data/spec/moneta/adapters/sdbm/standard_sdbm_with_expires_spec.rb +0 -11
  166. data/spec/moneta/adapters/sequel/adapter_sequel_spec.rb +0 -133
  167. data/spec/moneta/adapters/sequel/helper.rb +0 -80
  168. data/spec/moneta/adapters/sequel/standard_sequel_spec.rb +0 -8
  169. data/spec/moneta/adapters/sequel/standard_sequel_with_expires_spec.rb +0 -18
  170. data/spec/moneta/adapters/sqlite/adapter_sqlite_spec.rb +0 -7
  171. data/spec/moneta/adapters/sqlite/standard_sqlite_spec.rb +0 -7
  172. data/spec/moneta/adapters/sqlite/standard_sqlite_with_expires_spec.rb +0 -15
  173. data/spec/moneta/adapters/tdb/adapter_tdb_spec.rb +0 -7
  174. data/spec/moneta/adapters/tdb/standard_tdb_spec.rb +0 -7
  175. data/spec/moneta/adapters/tdb/standard_tdb_with_expires_spec.rb +0 -11
  176. data/spec/moneta/adapters/tokyocabinet/adapter_tokyocabinet_bdb_spec.rb +0 -7
  177. data/spec/moneta/adapters/tokyocabinet/adapter_tokyocabinet_hdb_spec.rb +0 -7
  178. data/spec/moneta/adapters/tokyocabinet/standard_tokyocabinet_spec.rb +0 -7
  179. data/spec/moneta/adapters/tokyocabinet/standard_tokyocabinet_with_expires_spec.rb +0 -11
  180. data/spec/moneta/adapters/tokyotyrant/adapter_tokyotyrant_spec.rb +0 -11
  181. data/spec/moneta/adapters/tokyotyrant/helper.rb +0 -12
  182. data/spec/moneta/adapters/tokyotyrant/standard_tokyotyrant_spec.rb +0 -7
  183. data/spec/moneta/adapters/tokyotyrant/standard_tokyotyrant_with_expires_spec.rb +0 -12
  184. data/spec/moneta/adapters/yaml/adapter_yaml_spec.rb +0 -7
  185. data/spec/moneta/adapters/yaml/standard_yaml_spec.rb +0 -9
  186. data/spec/moneta/adapters/yaml/standard_yaml_with_expires_spec.rb +0 -13
  187. data/spec/moneta/builder_spec.rb +0 -50
  188. data/spec/moneta/config_spec.rb +0 -219
  189. data/spec/moneta/mutex_spec.rb +0 -55
  190. data/spec/moneta/proxies/cache/cache_file_memory_spec.rb +0 -24
  191. data/spec/moneta/proxies/cache/cache_memory_null_spec.rb +0 -12
  192. data/spec/moneta/proxies/enumerable/enumerable_spec.rb +0 -26
  193. data/spec/moneta/proxies/expires/expires_file_spec.rb +0 -28
  194. data/spec/moneta/proxies/expires/expires_memory_spec.rb +0 -15
  195. data/spec/moneta/proxies/expires/expires_memory_with_default_expires_spec.rb +0 -16
  196. data/spec/moneta/proxies/fallback/fallback_spec.rb +0 -42
  197. data/spec/moneta/proxies/lock/lock_spec.rb +0 -10
  198. data/spec/moneta/proxies/optionmerger/optionmerger_spec.rb +0 -96
  199. data/spec/moneta/proxies/pool/pool_spec.rb +0 -353
  200. data/spec/moneta/proxies/proxy/proxy_expires_memory_spec.rb +0 -16
  201. data/spec/moneta/proxies/shared/shared_tcp_spec.rb +0 -59
  202. data/spec/moneta/proxies/shared/shared_unix_spec.rb +0 -58
  203. data/spec/moneta/proxies/transformer/transformer_bencode_spec.rb +0 -19
  204. data/spec/moneta/proxies/transformer/transformer_bert_spec.rb +0 -19
  205. data/spec/moneta/proxies/transformer/transformer_bson_spec.rb +0 -25
  206. data/spec/moneta/proxies/transformer/transformer_bzip2_spec.rb +0 -19
  207. data/spec/moneta/proxies/transformer/transformer_json_spec.rb +0 -19
  208. data/spec/moneta/proxies/transformer/transformer_key_inspect_spec.rb +0 -17
  209. data/spec/moneta/proxies/transformer/transformer_key_marshal_spec.rb +0 -17
  210. data/spec/moneta/proxies/transformer/transformer_key_to_s_spec.rb +0 -17
  211. data/spec/moneta/proxies/transformer/transformer_key_yaml_spec.rb +0 -17
  212. data/spec/moneta/proxies/transformer/transformer_lz4_spec.rb +0 -19
  213. data/spec/moneta/proxies/transformer/transformer_lzma_spec.rb +0 -19
  214. data/spec/moneta/proxies/transformer/transformer_lzo_spec.rb +0 -19
  215. data/spec/moneta/proxies/transformer/transformer_marshal_base64_spec.rb +0 -20
  216. data/spec/moneta/proxies/transformer/transformer_marshal_city128_spec.rb +0 -15
  217. data/spec/moneta/proxies/transformer/transformer_marshal_city32_spec.rb +0 -15
  218. data/spec/moneta/proxies/transformer/transformer_marshal_city64_spec.rb +0 -15
  219. data/spec/moneta/proxies/transformer/transformer_marshal_escape_spec.rb +0 -21
  220. data/spec/moneta/proxies/transformer/transformer_marshal_hex_spec.rb +0 -20
  221. data/spec/moneta/proxies/transformer/transformer_marshal_hmac_spec.rb +0 -19
  222. data/spec/moneta/proxies/transformer/transformer_marshal_md5_spec.rb +0 -15
  223. data/spec/moneta/proxies/transformer/transformer_marshal_md5_spread_spec.rb +0 -15
  224. data/spec/moneta/proxies/transformer/transformer_marshal_prefix_base64_spec.rb +0 -33
  225. data/spec/moneta/proxies/transformer/transformer_marshal_prefix_spec.rb +0 -15
  226. data/spec/moneta/proxies/transformer/transformer_marshal_qp_spec.rb +0 -20
  227. data/spec/moneta/proxies/transformer/transformer_marshal_rmd160_spec.rb +0 -15
  228. data/spec/moneta/proxies/transformer/transformer_marshal_sha1_spec.rb +0 -15
  229. data/spec/moneta/proxies/transformer/transformer_marshal_sha256_spec.rb +0 -15
  230. data/spec/moneta/proxies/transformer/transformer_marshal_sha384_spec.rb +0 -15
  231. data/spec/moneta/proxies/transformer/transformer_marshal_sha512_spec.rb +0 -15
  232. data/spec/moneta/proxies/transformer/transformer_marshal_spec.rb +0 -19
  233. data/spec/moneta/proxies/transformer/transformer_marshal_truncate_spec.rb +0 -15
  234. data/spec/moneta/proxies/transformer/transformer_marshal_urlsafe_base64_spec.rb +0 -20
  235. data/spec/moneta/proxies/transformer/transformer_marshal_uuencode_spec.rb +0 -19
  236. data/spec/moneta/proxies/transformer/transformer_msgpack_spec.rb +0 -19
  237. data/spec/moneta/proxies/transformer/transformer_ox_spec.rb +0 -19
  238. data/spec/moneta/proxies/transformer/transformer_php_spec.rb +0 -19
  239. data/spec/moneta/proxies/transformer/transformer_quicklz_spec.rb +0 -19
  240. data/spec/moneta/proxies/transformer/transformer_snappy_spec.rb +0 -19
  241. data/spec/moneta/proxies/transformer/transformer_tnet_spec.rb +0 -19
  242. data/spec/moneta/proxies/transformer/transformer_value_marshal_spec.rb +0 -19
  243. data/spec/moneta/proxies/transformer/transformer_value_yaml_spec.rb +0 -19
  244. data/spec/moneta/proxies/transformer/transformer_yaml_spec.rb +0 -19
  245. data/spec/moneta/proxies/transformer/transformer_zlib_spec.rb +0 -19
  246. data/spec/moneta/proxies/weak_create/weak_create_spec.rb +0 -21
  247. data/spec/moneta/proxies/weak_each_key/weak_each_key_spec.rb +0 -22
  248. data/spec/moneta/proxies/weak_increment/weak_increment_spec.rb +0 -21
  249. data/spec/moneta/semaphore_spec.rb +0 -68
  250. data/spec/moneta/stack_file_memory_spec.rb +0 -15
  251. data/spec/moneta/stack_memory_file_spec.rb +0 -13
  252. data/spec/rack/cache_moneta_spec.rb +0 -355
  253. data/spec/rack/moneta_cookies_spec.rb +0 -83
  254. data/spec/rack/moneta_store_spec.rb +0 -83
  255. data/spec/rack/session_moneta_spec.rb +0 -350
  256. data/spec/restserver.rb +0 -44
  257. data/test/action_dispatch/fixtures/session_autoload_test/foo.rb +0 -10
  258. data/test/action_dispatch/session_moneta_store_test.rb +0 -204
@@ -15,20 +15,29 @@ module Moneta
15
15
 
16
16
  # (see Proxy#key?)
17
17
  def key?(key, options = {})
18
- backend.exist?(key).tap do |exists|
19
- if exists && (expires = expires_value(options, nil)) != nil
20
- value = backend.read(key, options)
21
- backend.write(key, value, options.merge(expires_in: expires ? expires.seconds : nil))
18
+ exists =
19
+ begin
20
+ backend_exist?(key)
21
+ rescue ArgumentError, TypeError
22
+ # these errors happen when certain adapters try to deserialize
23
+ # values, which means there's something present
24
+ true
22
25
  end
26
+
27
+ if exists && (expires = expires_value(options, nil)) != nil
28
+ value = backend_read(key, **options)
29
+ backend_write(key, value, expires_in: expires ? expires.seconds : nil, **options)
23
30
  end
31
+
32
+ exists
24
33
  end
25
34
 
26
35
  # (see Proxy#load)
27
36
  def load(key, options = {})
28
37
  expires = expires_value(options, nil)
29
- value = backend.read(key, options)
38
+ value = backend_read(key, **options)
30
39
  if value and expires != nil
31
- backend.write(key, value, options.merge(expires_in: expires ? expires.seconds : nil))
40
+ backend_write(key, value, expires_in: expires ? expires.seconds : nil, **options)
32
41
  end
33
42
  value
34
43
  end
@@ -36,7 +45,7 @@ module Moneta
36
45
  # (see Proxy#store)
37
46
  def store(key, value, options = {})
38
47
  expires = expires_value(options)
39
- backend.write(key, value, options.merge(expires_in: expires ? expires.seconds : nil))
48
+ backend_write(key, value, expires_in: expires ? expires.seconds : nil, **options)
40
49
  value
41
50
  end
42
51
 
@@ -44,11 +53,11 @@ module Moneta
44
53
  def increment(key, amount = 1, options = {})
45
54
  expires = expires_value(options)
46
55
  options.delete(:raw)
47
- existing = Integer(backend.fetch(key, options.merge(raw: true)) { 0 })
56
+ existing = Integer(backend_fetch(key, raw: true, **options) { 0 })
48
57
  if amount > 0
49
- backend.increment(key, amount, options.merge(expires_in: expires ? expires.seconds : nil))
58
+ backend_increment(key, amount, expires_in: expires ? expires.seconds : nil, **options)
50
59
  elsif amount < 0
51
- backend.decrement(key, -amount, options.merge(expires_in: expires ? expires.seconds : nil))
60
+ backend_decrement(key, -amount, expires_in: expires ? expires.seconds : nil, **options)
52
61
  else
53
62
  existing
54
63
  end
@@ -56,9 +65,9 @@ module Moneta
56
65
 
57
66
  # (see Proxy#delete)
58
67
  def delete(key, options = {})
59
- value = backend.read(key, options)
68
+ value = backend_read(key, options)
60
69
  if value != nil
61
- backend.delete(key, options)
70
+ backend_delete(key, **options)
62
71
  options[:raw] ? value.to_s : value
63
72
  end
64
73
  end
@@ -74,7 +83,7 @@ module Moneta
74
83
  hash = backend.read_multi(*keys)
75
84
  if (expires = expires_value(options, nil)) != nil
76
85
  hash.each do |key, value|
77
- backend.write(key, value, options.merge(expires_in: expires ? expires.seconds : nil))
86
+ backend_write(key, value, expires_in: expires ? expires.seconds : nil, **options)
78
87
  end
79
88
  end
80
89
  if options[:raw]
@@ -106,7 +115,7 @@ module Moneta
106
115
 
107
116
  hash = Hash === pairs ? pairs : Hash[pairs.to_a]
108
117
  expires = expires_value(options)
109
- backend.write_multi(hash, options.merge(expires_in: expires ? expires.seconds : nil))
118
+ backend_write_multi(hash, expires_in: expires ? expires.seconds : nil, **options)
110
119
  self
111
120
  end
112
121
 
@@ -115,6 +124,52 @@ module Moneta
115
124
  def expires_value(options, default = config.expires)
116
125
  super.tap { options.delete(:expires) unless options.frozen? }
117
126
  end
127
+
128
+ delegate :decrement, :delete, :exist?, :fetch, :increment, :read, :write, :write_multi,
129
+ to: :@backend,
130
+ prefix: :backend
131
+ private :backend_decrement, :backend_delete, :backend_exist?,
132
+ :backend_fetch, :backend_increment, :backend_read,
133
+ :backend_write, :backend_write_multi
134
+
135
+ # @api private
136
+ module Rails5Support
137
+ private
138
+
139
+ def backend_decrement(*args, **options)
140
+ super(*args, options)
141
+ end
142
+
143
+ def backend_delete(*args, **options)
144
+ super(*args, options)
145
+ end
146
+
147
+ def backend_exist?(*args, **options)
148
+ super(*args, options)
149
+ end
150
+
151
+ def backend_fetch(*args, **options)
152
+ super(*args, options)
153
+ end
154
+
155
+ def backend_increment(*args, **options)
156
+ super(*args, options)
157
+ end
158
+
159
+ def backend_read(*args, **options)
160
+ super(*args, options)
161
+ end
162
+
163
+ def backend_write(*args, **options)
164
+ super(*args, options)
165
+ end
166
+
167
+ def backend_write_multi(*args, **options)
168
+ super(*args, options)
169
+ end
170
+ end
171
+
172
+ prepend Rails5Support if ::ActiveSupport.version < ::Gem::Version.new('6.1.0')
118
173
  end
119
174
  end
120
175
  end
@@ -132,7 +132,7 @@ module Moneta
132
132
  end
133
133
 
134
134
  def read_msg
135
- size = read(4).unpack('N').first
135
+ size = read(4).unpack1('N')
136
136
  result = Marshal.load(read(size))
137
137
  raise result if Exception === result
138
138
  result
@@ -95,7 +95,7 @@ module Moneta
95
95
  def unpack(value)
96
96
  if value.bytesize == 8
97
97
  # Unpack 8 byte big endian
98
- value.unpack('Q>').first.to_s
98
+ value.unpack1('Q>').to_s
99
99
  elsif value.bytesize >= 9 && value[-1] == ?\0
100
100
  # Remove nul character
101
101
  value[0..-2]
@@ -164,9 +164,11 @@ module Moneta
164
164
  existing = Hash[slice(*pairs.map { |key, _| key })]
165
165
  update_pairs, insert_pairs = pairs.partition { |key, _| existing.key?(key) }
166
166
 
167
- @collection.insert_many(insert_pairs.map do |key, value|
168
- value_to_doc(to_binary(key), value, options)
169
- end)
167
+ unless insert_pairs.empty?
168
+ @collection.insert_many(insert_pairs.map do |key, value|
169
+ value_to_doc(to_binary(key), value, options)
170
+ end)
171
+ end
170
172
 
171
173
  update_pairs.each do |key, value|
172
174
  value = yield(key, existing[key], value) if block_given?
@@ -106,7 +106,8 @@ module Moneta
106
106
 
107
107
  # (see Defaults#merge!)
108
108
  def merge!(pairs, options = {})
109
- keys = pairs.map { |key, _| key }
109
+ keys = pairs.map { |key, _| key }.to_a
110
+ return self if keys.empty?
110
111
 
111
112
  if block_given?
112
113
  old_values = @backend.mget(*keys)
@@ -9,21 +9,10 @@ module Moneta
9
9
  end
10
10
 
11
11
  def increment(key, amount = 1, options = {})
12
- @backend.transaction do
13
- # this creates a row-level lock even if there is no existing row (a
14
- # "gap lock").
15
- if row = @load_for_update.call(key: key)
16
- # Integer() will raise an exception if the existing value cannot be parsed
17
- amount += Integer(row[config.value_column])
18
- @increment_update.call(key: key, value: amount)
19
- else
20
- @create.call(key: key, value: amount)
21
- end
22
- amount
12
+ @backend.transaction(retry_on: [::Sequel::SerializationFailure]) do
13
+ @increment.call(key: key, amount: amount)
14
+ Integer(load(key))
23
15
  end
24
- rescue ::Sequel::SerializationFailure # Thrown on deadlock
25
- tries ||= 0
26
- (tries += 1) <= 3 ? retry : raise
27
16
  end
28
17
 
29
18
  def merge!(pairs, options = {}, &block)
@@ -55,10 +44,9 @@ module Moneta
55
44
  end
56
45
 
57
46
  def prepare_increment
58
- @increment_update = @table
59
- .where(config.key_column => :$key)
60
- .prepare(:update, statement_id(:increment_update), config.value_column => :$value)
61
- super
47
+ @increment = @table
48
+ .on_duplicate_key_update(config.value_column => ::Sequel.cast(config.value_column, Integer) + :$amount)
49
+ .prepare(:insert, statement_id(:increment_insert), config.key_column => :$key, config.value_column => :$amount)
62
50
  end
63
51
  end
64
52
  end
@@ -213,9 +213,16 @@ module Moneta
213
213
  end
214
214
 
215
215
  def prepare_values_at
216
+ # Sequel's hstore_ops gets confused if we try to construct this
217
+ # directly, because the CAST is not an array literal, or a PG array
218
+ lookup = ::Sequel::SQL::PlaceholderLiteralString.new(
219
+ ['(', '->', ')'],
220
+ [config.value_column, ::Sequel.cast(:$keys, :"text[]")]
221
+ )
222
+
216
223
  @values_at = @table
217
224
  .where(config.key_column => :$row)
218
- .select(::Sequel[config.value_column].hstore[::Sequel.cast(:$keys, :"text[]")].as(:values))
225
+ .select(lookup.as(:values))
219
226
  .prepare(:first, statement_id(:hstore_values_at))
220
227
  end
221
228
 
@@ -148,8 +148,10 @@ module Moneta
148
148
  pairs = pairs.to_a
149
149
  end
150
150
 
151
- query = "replace into #{config.table} (k, v) values" + (['(?, ?)'] * pairs.length).join(',')
152
- backend.query(query, pairs.flatten).close
151
+ unless pairs.empty?
152
+ query = "replace into #{config.table} (k, v) values" + (['(?, ?)'] * pairs.length).join(',')
153
+ backend.query(query, pairs.flatten).close
154
+ end
153
155
  rescue
154
156
  backend.rollback if transaction
155
157
  raise
@@ -131,7 +131,7 @@ module Moneta
131
131
  def unpack(value)
132
132
  if value.bytesize == 4
133
133
  # Unpack 4 byte integer
134
- value.unpack(@pack).first.to_s
134
+ value.unpack1(@pack).to_s
135
135
  elsif value.bytesize >= 5 && value[-1] == ?\0
136
136
  # Remove nul character
137
137
  value[0..-2]
@@ -5,7 +5,13 @@ module Moneta
5
5
  # YAML::Store backend
6
6
  # @api public
7
7
  class YAML < PStore
8
- backend { |file:| ::YAML::Store.new(file) }
8
+ # @!method initialize(options = {})
9
+ # @param [Hash] options
10
+ # @option options [YAML::Store] :backend YAML store to use
11
+ # @option options [String] :file YAML file to open - required unless using :backend
12
+ # @option options [Boolean] :threadsafe (false) Makes the YAML store thread-safe
13
+ # @option options Other options passed to `YAML::Store#new`
14
+ backend { |file:, threadsafe: false, **options| ::YAML::Store.new(file, threadsafe, options) }
9
15
  end
10
16
  end
11
17
  end
data/lib/moneta/pool.rb CHANGED
@@ -123,30 +123,28 @@ module Moneta
123
123
 
124
124
  def run
125
125
  Thread.new do
126
- begin
127
- populate_stores
126
+ populate_stores
128
127
 
129
- until @stopping && @stores.empty?
130
- loop_start = Time.now
128
+ until @stopping && @stores.empty?
129
+ loop_start = Time.now
131
130
 
132
- # Block until a message arrives, or until we time out for some reason
133
- request = pop
131
+ # Block until a message arrives, or until we time out for some reason
132
+ request = pop
134
133
 
135
- # Record how long we were idle, for stats purposes
136
- @idle_time = Time.now - loop_start
134
+ # Record how long we were idle, for stats purposes
135
+ @idle_time = Time.now - loop_start
137
136
 
138
- # If a message arrived, handle it
139
- handle_request(request) if request
137
+ # If a message arrived, handle it
138
+ handle_request(request) if request
140
139
 
141
- # Handle any stale checkout requests
142
- handle_timed_out_requests
143
- # Drop any stores that are no longer needed
144
- remove_unneeded_stores
145
- end
146
- rescue => e
147
- reject_waiting(e.message)
148
- raise
140
+ # Handle any stale checkout requests
141
+ handle_timed_out_requests
142
+ # Drop any stores that are no longer needed
143
+ remove_unneeded_stores
149
144
  end
145
+ rescue => e
146
+ reject_waiting(e.message)
147
+ raise
150
148
  end
151
149
  end
152
150
 
data/lib/moneta/proxy.rb CHANGED
@@ -145,7 +145,7 @@ module Moneta
145
145
  def config
146
146
  unless @proxy_config
147
147
  config = super
148
- adapter_config = adapter&.config
148
+ adapter_config = adapter.config if adapter.class.include?(Config)
149
149
 
150
150
  @proxy_config =
151
151
  if config && adapter_config
data/lib/moneta/server.rb CHANGED
@@ -60,7 +60,7 @@ module Moneta
60
60
  end
61
61
 
62
62
  def read_msg
63
- size = read(4).unpack('N').first
63
+ size = read(4).unpack1('N')
64
64
  throw :closed, 'Message too big' if size > @max_size
65
65
  Marshal.load(read(size))
66
66
  end
@@ -107,16 +107,14 @@ module Moneta
107
107
 
108
108
  # Detect support for socket#sendmsg_nonblock
109
109
  Socket.new(Socket::AF_INET, Socket::SOCK_STREAM).tap do |socket|
110
- begin
111
- socket.sendmsg_nonblock('probe')
112
- rescue Errno::EPIPE, Errno::ENOTCONN
113
- def sendmsg(msg)
114
- @io.sendmsg_nonblock(msg)
115
- end
116
- rescue NotImplementedError
117
- def sendmsg(msg)
118
- @io.write_nonblock(msg)
119
- end
110
+ socket.sendmsg_nonblock('probe')
111
+ rescue Errno::EPIPE, Errno::ENOTCONN
112
+ def sendmsg(msg)
113
+ @io.sendmsg_nonblock(msg)
114
+ end
115
+ rescue NotImplementedError
116
+ def sendmsg(msg)
117
+ @io.write_nonblock(msg)
120
118
  end
121
119
  end
122
120
 
@@ -20,7 +20,7 @@ module Moneta
20
20
  snappy: [ :compress, '::Snappy.inflate(%s)', '::Snappy.deflate(%s)', 'snappy' ],
21
21
  quicklz: [ :compress, '::QuickLZ.decompress(%s)', '::QuickLZ.compress(%s)', 'qlzruby' ],
22
22
  zlib: [ :compress, '::Zlib::Inflate.inflate(%s)', '::Zlib::Deflate.deflate(%s)', 'zlib' ],
23
- base64: [ :encode, "%s.unpack('m0').first", "[%s].pack('m0')" ],
23
+ base64: [ :encode, "%s.unpack1('m0')", "[%s].pack('m0')" ],
24
24
  urlsafe_base64: [
25
25
  :encode,
26
26
  'Base64.urlsafe_decode64(%s)',
@@ -28,9 +28,9 @@ module Moneta
28
28
  'base64'
29
29
  ],
30
30
  escape: [ :encode, 'Helper.unescape(%s)', 'Helper.escape(%s)' ],
31
- hex: [ :encode, "[%s].pack('H*')", "%s.unpack('H*').first" ],
32
- qp: [ :encode, "%s.unpack('M').first", "[%s].pack('M')" ],
33
- uuencode: [ :encode, "%s.unpack('u').first", "[%s].pack('u')" ],
31
+ hex: [ :encode, "[%s].pack('H*')", "%s.unpack1('H*')" ],
32
+ qp: [ :encode, "%s.unpack1('M')", "[%s].pack('M')" ],
33
+ uuencode: [ :encode, "%s.unpack1('u')", "[%s].pack('u')" ],
34
34
  hmac: [
35
35
  :hmac,
36
36
  'Helper.hmacverify(%s, options[:secret] || @secret)',
@@ -141,6 +141,8 @@ module Moneta
141
141
  end
142
142
  def merge!(pairs, options = {})
143
143
  keys, values = pairs.to_a.transpose
144
+ keys ||= []
145
+ values ||= []
144
146
  t_keys = keys.map { |key| #{key} }
145
147
  block = if block_given?
146
148
  key_lookup = Hash[t_keys.zip(keys)]
@@ -296,6 +298,8 @@ module Moneta
296
298
  end
297
299
  def merge!(pairs, options = {})
298
300
  keys, values = pairs.to_a.transpose
301
+ keys ||= []
302
+ values ||= []
299
303
  t_keys = keys.map { |key| #{key} }
300
304
  key_lookup = Hash[t_keys.zip(keys)]
301
305
 
@@ -1,5 +1,5 @@
1
1
  module Moneta
2
2
  # Moneta version number
3
3
  # @api public
4
- VERSION = '1.5.1'.freeze
4
+ VERSION = '1.6.0'.freeze
5
5
  end
data/lib/moneta.rb CHANGED
@@ -144,7 +144,7 @@ module Moneta
144
144
  a = Adapters.const_get(name).new(options)
145
145
  build do
146
146
  use :Logger, Hash === logger ? logger : {} if logger
147
- use :Expires, expires: options[:expires] if !a.supports?(:expires) && expires
147
+ use :Expires, expires: options[:expires] if expires && !a.supports?(:expires)
148
148
  use :Transformer, transformer
149
149
  use :Lock if threadsafe
150
150
  adapter a