moneta 1.5.2 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (254) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +12 -0
  3. data/CONTRIBUTORS +1 -0
  4. data/LICENSE +1 -1
  5. data/lib/active_support/cache/moneta_store.rb +32 -6
  6. data/lib/moneta/adapters/activerecord/backend.rb +50 -0
  7. data/lib/moneta/adapters/activerecord/v5_backend.rb +80 -0
  8. data/lib/moneta/adapters/activerecord.rb +50 -95
  9. data/lib/moneta/adapters/activesupportcache.rb +69 -14
  10. data/lib/moneta/adapters/client.rb +1 -1
  11. data/lib/moneta/adapters/hbase.rb +1 -1
  12. data/lib/moneta/adapters/redis.rb +2 -1
  13. data/lib/moneta/adapters/sequel/mysql.rb +6 -18
  14. data/lib/moneta/adapters/sequel/postgres_hstore.rb +8 -1
  15. data/lib/moneta/adapters/sqlite.rb +4 -2
  16. data/lib/moneta/adapters/tokyotyrant.rb +1 -1
  17. data/lib/moneta/adapters/yaml.rb +7 -1
  18. data/lib/moneta/pool.rb +16 -18
  19. data/lib/moneta/server.rb +9 -11
  20. data/lib/moneta/transformer/config.rb +4 -4
  21. data/lib/moneta/transformer.rb +4 -0
  22. data/lib/moneta/version.rb +1 -1
  23. metadata +9 -452
  24. data/.github/workflows/ruby.yml +0 -425
  25. data/.gitignore +0 -15
  26. data/.rspec +0 -4
  27. data/.rubocop.yml +0 -194
  28. data/.yardopts +0 -6
  29. data/Gemfile +0 -206
  30. data/feature_matrix.yaml +0 -227
  31. data/moneta.gemspec +0 -36
  32. data/script/benchmarks +0 -605
  33. data/script/contributors +0 -12
  34. data/script/memusage +0 -40
  35. data/script/parallel-tests +0 -82
  36. data/script/start-couchdb +0 -27
  37. data/script/start-hbase +0 -47
  38. data/script/start-services +0 -10
  39. data/script/travis-logs +0 -14
  40. data/script/update-feature-matrix +0 -148
  41. data/spec/active_support/cache_moneta_store_spec.rb +0 -282
  42. data/spec/features/concurrent_create.rb +0 -42
  43. data/spec/features/concurrent_increment.rb +0 -39
  44. data/spec/features/create.rb +0 -25
  45. data/spec/features/create_expires.rb +0 -19
  46. data/spec/features/default_expires.rb +0 -14
  47. data/spec/features/each_key.rb +0 -119
  48. data/spec/features/expires.rb +0 -296
  49. data/spec/features/features.rb +0 -16
  50. data/spec/features/increment.rb +0 -98
  51. data/spec/features/marshallable_key.rb +0 -43
  52. data/spec/features/marshallable_value.rb +0 -7
  53. data/spec/features/multiprocess.rb +0 -8
  54. data/spec/features/not_create.rb +0 -7
  55. data/spec/features/not_each_key.rb +0 -7
  56. data/spec/features/not_increment.rb +0 -13
  57. data/spec/features/not_persist.rb +0 -9
  58. data/spec/features/null.rb +0 -66
  59. data/spec/features/persist.rb +0 -14
  60. data/spec/features/returndifferent.rb +0 -9
  61. data/spec/features/returnsame.rb +0 -9
  62. data/spec/features/store.rb +0 -261
  63. data/spec/features/store_large.rb +0 -13
  64. data/spec/features/transform_value.rb +0 -44
  65. data/spec/features/transform_value_expires.rb +0 -41
  66. data/spec/helper.rb +0 -445
  67. data/spec/moneta/adapters/activerecord/adapter_activerecord_existing_connection_spec.rb +0 -62
  68. data/spec/moneta/adapters/activerecord/adapter_activerecord_spec.rb +0 -128
  69. data/spec/moneta/adapters/activerecord/standard_activerecord_spec.rb +0 -22
  70. data/spec/moneta/adapters/activerecord/standard_activerecord_with_expires_spec.rb +0 -28
  71. data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_spec.rb +0 -54
  72. data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_with_default_expires_spec.rb +0 -54
  73. data/spec/moneta/adapters/activesupportcache/standard_activesupportcache_spec.rb +0 -14
  74. data/spec/moneta/adapters/cassandra/adapter_cassandra_spec.rb +0 -17
  75. data/spec/moneta/adapters/cassandra/adapter_cassandra_with_default_expires_spec.rb +0 -18
  76. data/spec/moneta/adapters/cassandra/helper.rb +0 -18
  77. data/spec/moneta/adapters/cassandra/standard_cassandra_spec.rb +0 -18
  78. data/spec/moneta/adapters/client/adapter_client_spec.rb +0 -11
  79. data/spec/moneta/adapters/client/client_helper.rb +0 -25
  80. data/spec/moneta/adapters/client/standard_client_tcp_spec.rb +0 -23
  81. data/spec/moneta/adapters/client/standard_client_unix_spec.rb +0 -28
  82. data/spec/moneta/adapters/cookie/adapter_cookie_spec.rb +0 -7
  83. data/spec/moneta/adapters/couch/adapter_couch_spec.rb +0 -204
  84. data/spec/moneta/adapters/couch/standard_couch_spec.rb +0 -15
  85. data/spec/moneta/adapters/couch/standard_couch_with_expires_spec.rb +0 -19
  86. data/spec/moneta/adapters/datamapper/adapter_datamapper_spec.rb +0 -64
  87. data/spec/moneta/adapters/datamapper/standard_datamapper_spec.rb +0 -21
  88. data/spec/moneta/adapters/datamapper/standard_datamapper_with_expires_spec.rb +0 -26
  89. data/spec/moneta/adapters/datamapper/standard_datamapper_with_repository_spec.rb +0 -22
  90. data/spec/moneta/adapters/daybreak/adapter_daybreak_spec.rb +0 -7
  91. data/spec/moneta/adapters/daybreak/standard_daybreak_spec.rb +0 -7
  92. data/spec/moneta/adapters/daybreak/standard_daybreak_with_expires_spec.rb +0 -11
  93. data/spec/moneta/adapters/dbm/adapter_dbm_spec.rb +0 -7
  94. data/spec/moneta/adapters/dbm/standard_dbm_spec.rb +0 -7
  95. data/spec/moneta/adapters/dbm/standard_dbm_with_expires_spec.rb +0 -12
  96. data/spec/moneta/adapters/faraday_helper.rb +0 -10
  97. data/spec/moneta/adapters/file/adapter_file_spec.rb +0 -7
  98. data/spec/moneta/adapters/file/standard_file_spec.rb +0 -7
  99. data/spec/moneta/adapters/file/standard_file_with_expires_spec.rb +0 -11
  100. data/spec/moneta/adapters/fog/adapter_fog_spec.rb +0 -16
  101. data/spec/moneta/adapters/fog/standard_fog_spec.rb +0 -15
  102. data/spec/moneta/adapters/fog/standard_fog_with_expires_spec.rb +0 -20
  103. data/spec/moneta/adapters/gdbm/adapter_gdbm_spec.rb +0 -7
  104. data/spec/moneta/adapters/gdbm/standard_gdbm_spec.rb +0 -7
  105. data/spec/moneta/adapters/gdbm/standard_gdbm_with_expires_spec.rb +0 -11
  106. data/spec/moneta/adapters/hashfile/standard_hashfile_spec.rb +0 -7
  107. data/spec/moneta/adapters/hashfile/standard_hashfile_with_expires_spec.rb +0 -12
  108. data/spec/moneta/adapters/hbase/adapter_hbase_spec.rb +0 -7
  109. data/spec/moneta/adapters/hbase/standard_hbase_spec.rb +0 -4
  110. data/spec/moneta/adapters/hbase/standard_hbase_with_expires_spec.rb +0 -8
  111. data/spec/moneta/adapters/kyotocabinet/adapter_kyotocabinet_spec.rb +0 -7
  112. data/spec/moneta/adapters/kyotocabinet/standard_kyotocabinet_spec.rb +0 -7
  113. data/spec/moneta/adapters/kyotocabinet/standard_kyotocabinet_with_expires_spec.rb +0 -14
  114. data/spec/moneta/adapters/leveldb/adapter_leveldb_spec.rb +0 -7
  115. data/spec/moneta/adapters/leveldb/standard_leveldb_spec.rb +0 -7
  116. data/spec/moneta/adapters/leveldb/standard_leveldb_with_expires_spec.rb +0 -11
  117. data/spec/moneta/adapters/lmdb/adapter_lmdb_spec.rb +0 -7
  118. data/spec/moneta/adapters/lmdb/adapter_lmdb_with_db_spec.rb +0 -7
  119. data/spec/moneta/adapters/lmdb/standard_lmdb_spec.rb +0 -7
  120. data/spec/moneta/adapters/lmdb/standard_lmdb_with_expires_spec.rb +0 -11
  121. data/spec/moneta/adapters/localmemcache/adapter_localmemcache_spec.rb +0 -7
  122. data/spec/moneta/adapters/localmemcache/standard_localmemcache_spec.rb +0 -7
  123. data/spec/moneta/adapters/localmemcache/standard_localmemcache_with_expires_spec.rb +0 -11
  124. data/spec/moneta/adapters/lruhash/adapter_lruhash_spec.rb +0 -118
  125. data/spec/moneta/adapters/lruhash/standard_lruhash_spec.rb +0 -4
  126. data/spec/moneta/adapters/lruhash/standard_lruhash_with_expires_spec.rb +0 -8
  127. data/spec/moneta/adapters/memcached/adapter_memcached_spec.rb +0 -13
  128. data/spec/moneta/adapters/memcached/dalli/adapter_memcached_dalli_spec.rb +0 -25
  129. data/spec/moneta/adapters/memcached/dalli/standard_memcached_dalli_spec.rb +0 -11
  130. data/spec/moneta/adapters/memcached/native/adapter_memcached_native_spec.rb +0 -25
  131. data/spec/moneta/adapters/memcached/native/standard_memcached_native_spec.rb +0 -11
  132. data/spec/moneta/adapters/memcached/standard_memcached_spec.rb +0 -17
  133. data/spec/moneta/adapters/memcached_helper.rb +0 -20
  134. data/spec/moneta/adapters/memory/adapter_memory_spec.rb +0 -7
  135. data/spec/moneta/adapters/memory/standard_memory_spec.rb +0 -4
  136. data/spec/moneta/adapters/memory/standard_memory_with_compress_spec.rb +0 -9
  137. data/spec/moneta/adapters/memory/standard_memory_with_expires_spec.rb +0 -8
  138. data/spec/moneta/adapters/memory/standard_memory_with_json_key_serializer_spec.rb +0 -4
  139. data/spec/moneta/adapters/memory/standard_memory_with_json_serializer_spec.rb +0 -9
  140. data/spec/moneta/adapters/memory/standard_memory_with_json_value_serializer_spec.rb +0 -9
  141. data/spec/moneta/adapters/memory/standard_memory_with_prefix_spec.rb +0 -41
  142. data/spec/moneta/adapters/memory/standard_memory_with_snappy_compress_spec.rb +0 -9
  143. data/spec/moneta/adapters/mongo/adapter_mongo_spec.rb +0 -41
  144. data/spec/moneta/adapters/mongo/adapter_mongo_with_default_expires_spec.rb +0 -14
  145. data/spec/moneta/adapters/mongo/standard_mongo_spec.rb +0 -7
  146. data/spec/moneta/adapters/null/null_adapter_spec.rb +0 -7
  147. data/spec/moneta/adapters/null/standard_null_spec.rb +0 -9
  148. data/spec/moneta/adapters/pstore/adapter_pstore_spec.rb +0 -7
  149. data/spec/moneta/adapters/pstore/standard_pstore_spec.rb +0 -9
  150. data/spec/moneta/adapters/pstore/standard_pstore_with_expires_spec.rb +0 -13
  151. data/spec/moneta/adapters/redis/adapter_redis_spec.rb +0 -20
  152. data/spec/moneta/adapters/redis/standard_redis_spec.rb +0 -14
  153. data/spec/moneta/adapters/restclient/adapter_restclient_spec.rb +0 -13
  154. data/spec/moneta/adapters/restclient/helper.rb +0 -12
  155. data/spec/moneta/adapters/restclient/standard_restclient_spec.rb +0 -13
  156. data/spec/moneta/adapters/riak/adapter_riak_spec.rb +0 -14
  157. data/spec/moneta/adapters/riak/standard_riak_spec.rb +0 -10
  158. data/spec/moneta/adapters/riak/standard_riak_with_expires_spec.rb +0 -14
  159. data/spec/moneta/adapters/sdbm/adapter_sdbm_spec.rb +0 -7
  160. data/spec/moneta/adapters/sdbm/standard_sdbm_spec.rb +0 -7
  161. data/spec/moneta/adapters/sdbm/standard_sdbm_with_expires_spec.rb +0 -11
  162. data/spec/moneta/adapters/sequel/adapter_sequel_spec.rb +0 -133
  163. data/spec/moneta/adapters/sequel/helper.rb +0 -83
  164. data/spec/moneta/adapters/sequel/standard_sequel_spec.rb +0 -8
  165. data/spec/moneta/adapters/sequel/standard_sequel_with_expires_spec.rb +0 -18
  166. data/spec/moneta/adapters/sqlite/adapter_sqlite_spec.rb +0 -7
  167. data/spec/moneta/adapters/sqlite/standard_sqlite_spec.rb +0 -7
  168. data/spec/moneta/adapters/sqlite/standard_sqlite_with_expires_spec.rb +0 -15
  169. data/spec/moneta/adapters/tdb/adapter_tdb_spec.rb +0 -7
  170. data/spec/moneta/adapters/tdb/standard_tdb_spec.rb +0 -7
  171. data/spec/moneta/adapters/tdb/standard_tdb_with_expires_spec.rb +0 -11
  172. data/spec/moneta/adapters/tokyocabinet/adapter_tokyocabinet_bdb_spec.rb +0 -7
  173. data/spec/moneta/adapters/tokyocabinet/adapter_tokyocabinet_hdb_spec.rb +0 -7
  174. data/spec/moneta/adapters/tokyocabinet/standard_tokyocabinet_spec.rb +0 -7
  175. data/spec/moneta/adapters/tokyocabinet/standard_tokyocabinet_with_expires_spec.rb +0 -11
  176. data/spec/moneta/adapters/tokyotyrant/adapter_tokyotyrant_spec.rb +0 -11
  177. data/spec/moneta/adapters/tokyotyrant/helper.rb +0 -12
  178. data/spec/moneta/adapters/tokyotyrant/standard_tokyotyrant_spec.rb +0 -7
  179. data/spec/moneta/adapters/tokyotyrant/standard_tokyotyrant_with_expires_spec.rb +0 -12
  180. data/spec/moneta/adapters/yaml/adapter_yaml_spec.rb +0 -7
  181. data/spec/moneta/adapters/yaml/standard_yaml_spec.rb +0 -9
  182. data/spec/moneta/adapters/yaml/standard_yaml_with_expires_spec.rb +0 -13
  183. data/spec/moneta/builder_spec.rb +0 -50
  184. data/spec/moneta/config_spec.rb +0 -219
  185. data/spec/moneta/mutex_spec.rb +0 -55
  186. data/spec/moneta/proxies/cache/cache_file_memory_spec.rb +0 -24
  187. data/spec/moneta/proxies/cache/cache_memory_null_spec.rb +0 -12
  188. data/spec/moneta/proxies/enumerable/enumerable_spec.rb +0 -26
  189. data/spec/moneta/proxies/expires/expires_file_spec.rb +0 -28
  190. data/spec/moneta/proxies/expires/expires_memory_spec.rb +0 -15
  191. data/spec/moneta/proxies/expires/expires_memory_with_default_expires_spec.rb +0 -16
  192. data/spec/moneta/proxies/fallback/fallback_spec.rb +0 -42
  193. data/spec/moneta/proxies/lock/lock_spec.rb +0 -10
  194. data/spec/moneta/proxies/optionmerger/optionmerger_spec.rb +0 -96
  195. data/spec/moneta/proxies/pool/pool_spec.rb +0 -353
  196. data/spec/moneta/proxies/proxy/proxy_expires_memory_spec.rb +0 -16
  197. data/spec/moneta/proxies/shared/shared_tcp_spec.rb +0 -59
  198. data/spec/moneta/proxies/shared/shared_unix_spec.rb +0 -58
  199. data/spec/moneta/proxies/transformer/transformer_bencode_spec.rb +0 -19
  200. data/spec/moneta/proxies/transformer/transformer_bert_spec.rb +0 -19
  201. data/spec/moneta/proxies/transformer/transformer_bson_spec.rb +0 -25
  202. data/spec/moneta/proxies/transformer/transformer_bzip2_spec.rb +0 -19
  203. data/spec/moneta/proxies/transformer/transformer_json_spec.rb +0 -19
  204. data/spec/moneta/proxies/transformer/transformer_key_inspect_spec.rb +0 -17
  205. data/spec/moneta/proxies/transformer/transformer_key_marshal_spec.rb +0 -17
  206. data/spec/moneta/proxies/transformer/transformer_key_to_s_spec.rb +0 -17
  207. data/spec/moneta/proxies/transformer/transformer_key_yaml_spec.rb +0 -17
  208. data/spec/moneta/proxies/transformer/transformer_lz4_spec.rb +0 -19
  209. data/spec/moneta/proxies/transformer/transformer_lzma_spec.rb +0 -19
  210. data/spec/moneta/proxies/transformer/transformer_lzo_spec.rb +0 -19
  211. data/spec/moneta/proxies/transformer/transformer_marshal_base64_spec.rb +0 -20
  212. data/spec/moneta/proxies/transformer/transformer_marshal_city128_spec.rb +0 -15
  213. data/spec/moneta/proxies/transformer/transformer_marshal_city32_spec.rb +0 -15
  214. data/spec/moneta/proxies/transformer/transformer_marshal_city64_spec.rb +0 -15
  215. data/spec/moneta/proxies/transformer/transformer_marshal_escape_spec.rb +0 -21
  216. data/spec/moneta/proxies/transformer/transformer_marshal_hex_spec.rb +0 -20
  217. data/spec/moneta/proxies/transformer/transformer_marshal_hmac_spec.rb +0 -19
  218. data/spec/moneta/proxies/transformer/transformer_marshal_md5_spec.rb +0 -15
  219. data/spec/moneta/proxies/transformer/transformer_marshal_md5_spread_spec.rb +0 -15
  220. data/spec/moneta/proxies/transformer/transformer_marshal_prefix_base64_spec.rb +0 -33
  221. data/spec/moneta/proxies/transformer/transformer_marshal_prefix_spec.rb +0 -15
  222. data/spec/moneta/proxies/transformer/transformer_marshal_qp_spec.rb +0 -20
  223. data/spec/moneta/proxies/transformer/transformer_marshal_rmd160_spec.rb +0 -15
  224. data/spec/moneta/proxies/transformer/transformer_marshal_sha1_spec.rb +0 -15
  225. data/spec/moneta/proxies/transformer/transformer_marshal_sha256_spec.rb +0 -15
  226. data/spec/moneta/proxies/transformer/transformer_marshal_sha384_spec.rb +0 -15
  227. data/spec/moneta/proxies/transformer/transformer_marshal_sha512_spec.rb +0 -15
  228. data/spec/moneta/proxies/transformer/transformer_marshal_spec.rb +0 -19
  229. data/spec/moneta/proxies/transformer/transformer_marshal_truncate_spec.rb +0 -15
  230. data/spec/moneta/proxies/transformer/transformer_marshal_urlsafe_base64_spec.rb +0 -20
  231. data/spec/moneta/proxies/transformer/transformer_marshal_uuencode_spec.rb +0 -19
  232. data/spec/moneta/proxies/transformer/transformer_msgpack_spec.rb +0 -19
  233. data/spec/moneta/proxies/transformer/transformer_ox_spec.rb +0 -19
  234. data/spec/moneta/proxies/transformer/transformer_php_spec.rb +0 -19
  235. data/spec/moneta/proxies/transformer/transformer_quicklz_spec.rb +0 -19
  236. data/spec/moneta/proxies/transformer/transformer_snappy_spec.rb +0 -19
  237. data/spec/moneta/proxies/transformer/transformer_tnet_spec.rb +0 -19
  238. data/spec/moneta/proxies/transformer/transformer_value_marshal_spec.rb +0 -19
  239. data/spec/moneta/proxies/transformer/transformer_value_yaml_spec.rb +0 -19
  240. data/spec/moneta/proxies/transformer/transformer_yaml_spec.rb +0 -19
  241. data/spec/moneta/proxies/transformer/transformer_zlib_spec.rb +0 -19
  242. data/spec/moneta/proxies/weak_create/weak_create_spec.rb +0 -21
  243. data/spec/moneta/proxies/weak_each_key/weak_each_key_spec.rb +0 -22
  244. data/spec/moneta/proxies/weak_increment/weak_increment_spec.rb +0 -21
  245. data/spec/moneta/semaphore_spec.rb +0 -68
  246. data/spec/moneta/stack_file_memory_spec.rb +0 -15
  247. data/spec/moneta/stack_memory_file_spec.rb +0 -13
  248. data/spec/rack/cache_moneta_spec.rb +0 -355
  249. data/spec/rack/moneta_cookies_spec.rb +0 -83
  250. data/spec/rack/moneta_store_spec.rb +0 -83
  251. data/spec/rack/session_moneta_spec.rb +0 -350
  252. data/spec/restserver.rb +0 -44
  253. data/test/action_dispatch/fixtures/session_autoload_test/foo.rb +0 -10
  254. data/test/action_dispatch/session_moneta_store_test.rb +0 -204
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 61d01584fc8497503e70aa6cb4fcea5ead6a05b9f4f1c2c9db138cd0470f948f
4
- data.tar.gz: b7e2822f9aac62ab718964f4f8a3b4bf7a4473aa6ab9291b0df28882a3de2bca
3
+ metadata.gz: 4b7e4bbe0345dcfa33a7217af5a4bbcef559b3d9cb0d8a53301a7c9ff30a7118
4
+ data.tar.gz: 7d3fe5f86885f39a418e8647f15243cb3728fad2daf12fd841b237c23d796fd4
5
5
  SHA512:
6
- metadata.gz: fd8eb44d64eb8b62529497770bbea915fdd6880e907d697de82156aa1c9ca2f7bb58b7bb68157eefab138a8bc9aab8debf4186d4a8828bb664385c59027cd2a3
7
- data.tar.gz: 1d97a4b4de9f0242fa260e1b197d35333a527019c43b01fab3a913c3f833a5963b47776ac78c3b9da7be70a117eaafcbb09e81108b233135ea6a018280f1b3a3
6
+ metadata.gz: 667443d645a8b75775bc43633e58eab9434e5c291043e2f4165a971391c67f5fdd5dffdda76f76924de56b28d2bd1f14c25eef0d16c032859aa91e67a22d123c
7
+ data.tar.gz: cf76836caa72d5fa5a2179b8937e06a24571f42eb7e26ba6ad4b606fbd70305817dbf6d33ae75a181d91e4f76b267db15b7fbb26e4471d148826a00ab8f9f6b6
data/CHANGES CHANGED
@@ -1,3 +1,15 @@
1
+ 1.6.0
2
+
3
+ * Adapters - Support for Rails 6.1 and above (Adapters::ActiveRecord,
4
+ Adapters::ActiveSupportCache, ActiveSupportCache::MonetaStore)
5
+ * Adapters::YAML - add `theadsafe` option
6
+ * Adapters::Sequel - fix deadlock issue with #increment on MySQL in newer
7
+ Sequel versions (#244)
8
+ * Adapters::Sequel - fix issue with Postgres HStore on newer Postgres (#243)
9
+ * Adapters - fixed an issue many adapters had where #merge! errored if passed
10
+ an empty hash (#246)
11
+ * Support changes - Drop support for 2.3 and 2.4, add support for 3.x
12
+
1
13
  1.5.2
2
14
 
3
15
  * Proxy - handle returning config when the adapter does not use config
data/CONTRIBUTORS CHANGED
@@ -22,6 +22,7 @@ Jay Mitchell <jaybmitchell@gmail.com>
22
22
  Jeremy Voorhis <jvoorhis@gmail.com>
23
23
  Jon Crosby <jon@joncrosby.me>
24
24
  Jonathan Gnagy <jonathan.l.gnagy@sherwin.com>
25
+ Jérôme Charaoui <jerome@riseup.net>
25
26
  lakshan <lakshan@web2media.net>
26
27
  Mal McKay <mal.mckay@gmail.com>
27
28
  Marek Skrobacki <skrobul@skrobul.com>
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2009 - 2019 Daniel Mendler, Yehuda Katz, Alastair Pharo
1
+ Copyright (c) 2009 - 2023 Daniel Mendler, Yehuda Katz, Alastair Pharo
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -101,37 +101,38 @@ module ActiveSupport
101
101
  end
102
102
  end
103
103
 
104
- def read_entry(key, options)
104
+ def read_entry(key, **options)
105
105
  make_entry(@store.load(key, moneta_options(options, false)))
106
106
  end
107
107
 
108
- def write_entry(key, entry, options)
108
+ def write_entry(key, entry, **options)
109
109
  value = options[:raw] ? entry.value.to_s : entry
110
110
  @store.store(key, value, moneta_options(options))
111
111
  true
112
112
  end
113
113
 
114
- def delete_entry(key, options)
114
+ def delete_entry(key, **options)
115
115
  @store.delete(key, moneta_options(options))
116
116
  true
117
117
  end
118
118
 
119
- def read_multi_entries(names, options)
119
+ def read_multi_entries(names, **options)
120
120
  keys = names.map { |name| normalize_key(name, options) }
121
121
  entries = @store
122
122
  .values_at(*keys, **moneta_options(options, false))
123
123
  .map(&method(:make_entry))
124
124
 
125
+ delete_options = moneta_options(options)
125
126
  names.zip(keys, entries).map do |name, key, entry|
126
127
  next if entry == nil
127
- delete_entry(key, options) if entry.expired?
128
+ @store.delete(key, delete_options) if entry.expired?
128
129
  next if entry.expired? || entry.mismatched?(normalize_version(name, options))
129
130
 
130
131
  [name, entry.value]
131
132
  end.compact.to_h
132
133
  end
133
134
 
134
- def write_multi_entries(hash, options)
135
+ def write_multi_entries(hash, **options)
135
136
  pairs = if options[:raw]
136
137
  hash.transform_values { |entry| entry.value.to_s }
137
138
  else
@@ -142,6 +143,31 @@ module ActiveSupport
142
143
  hash
143
144
  end
144
145
 
146
+ # Before Rails 6.1, the `*_entry` methods didn't use keyword args
147
+ module Rails5Support
148
+ def read_entry(key, options)
149
+ super(key, **options)
150
+ end
151
+
152
+ def write_entry(key, entry, options)
153
+ super(key, entry, **options)
154
+ end
155
+
156
+ def delete_entry(key, options)
157
+ super(key, **options)
158
+ end
159
+
160
+ def read_multi_entries(names, options)
161
+ super(names, **options)
162
+ end
163
+
164
+ def write_multi_entries(hash, options)
165
+ super(hash, **options)
166
+ end
167
+ end
168
+
169
+ prepend Rails5Support if ActiveSupport.version < ::Gem::Version.new('6.1.0')
170
+
145
171
  private
146
172
 
147
173
  def moneta_options(options, include_expires = true)
@@ -0,0 +1,50 @@
1
+ require 'uri'
2
+
3
+ module Moneta
4
+ module Adapters
5
+ class ActiveRecord
6
+ # @api private
7
+ class Backend
8
+ @connection_lock = ::Mutex.new
9
+
10
+ class << self
11
+ attr_reader :connection_lock
12
+ end
13
+
14
+ attr_reader :table_name
15
+ delegate :connection_handler, to: ::ActiveRecord::Base
16
+
17
+ def initialize(table:, connection: nil, **options)
18
+ @table_name = table
19
+ @connection = connection
20
+ if connection
21
+ @owner_name =
22
+ case connection
23
+ when Symbol, String
24
+ connection.to_s
25
+ when Hash
26
+ hash = connection.reject { |key| [:username, 'username', :password, 'password'].member?(key) }
27
+ 'moneta?' + URI.encode_www_form(hash.to_a.sort)
28
+ when nil
29
+ nil
30
+ else
31
+ raise "Unexpected connection: #{connection}"
32
+ end
33
+ end
34
+ end
35
+
36
+ def connection_pool
37
+ if @connection
38
+ connection_handler.retrieve_connection_pool(@owner_name) ||
39
+ self.class.connection_lock.synchronize do
40
+ connection_handler.retrieve_connection_pool(@owner_name) ||
41
+ connection_handler.establish_connection(@connection, owner_name: @owner_name)
42
+ end
43
+ else
44
+ ::ActiveRecord::Base.connection_pool
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,80 @@
1
+ require 'uri'
2
+
3
+ module Moneta
4
+ module Adapters
5
+ class ActiveRecord
6
+ # @api private
7
+ class V5Backend
8
+ @connection_lock = ::Mutex.new
9
+
10
+ class << self
11
+ attr_reader :connection_lock
12
+ delegate :configurations, :configurations=, :connection_handler, to: ::ActiveRecord::Base
13
+
14
+ def retrieve_connection_pool(spec_name)
15
+ connection_handler.retrieve_connection_pool(spec_name.to_s)
16
+ end
17
+
18
+ def establish_connection(spec_name)
19
+ connection_lock.synchronize do
20
+ if connection_pool = retrieve_connection_pool(spec_name)
21
+ connection_pool
22
+ else
23
+ connection_handler.establish_connection(spec_name.to_sym)
24
+ end
25
+ end
26
+ end
27
+
28
+ def retrieve_or_establish_connection_pool(spec_name)
29
+ retrieve_connection_pool(spec_name) || establish_connection(spec_name)
30
+ end
31
+ end
32
+
33
+ attr_reader :table_name
34
+
35
+ def initialize(table:, connection: nil, **options)
36
+ @table_name = table
37
+ @spec =
38
+ case connection
39
+ when Symbol
40
+ connection
41
+ when Hash, String
42
+ # Normalize the connection specification to a hash
43
+ resolver = ::ActiveRecord::ConnectionAdapters::ConnectionSpecification::Resolver.new \
44
+ 'dummy' => connection
45
+
46
+ # Turn the config into a standardised hash, sans a couple of bits
47
+ hash = resolver.resolve(:dummy)
48
+ hash.delete('name')
49
+ hash.delete(:username) # For security
50
+ hash.delete(:password) # For security
51
+ # Make a name unique to this config
52
+ name = 'moneta?' + URI.encode_www_form(hash.to_a.sort)
53
+ # Add into configurations unless its already there (initially done without locking for
54
+ # speed)
55
+ unless self.class.configurations.key? name
56
+ self.class.connection_lock.synchronize do
57
+ self.class.configurations[name] = connection \
58
+ unless self.class.configurations.key? name
59
+ end
60
+ end
61
+
62
+ name.to_sym
63
+ when nil
64
+ nil
65
+ else
66
+ raise "Unexpected connection: #{connection}"
67
+ end
68
+ end
69
+
70
+ def connection_pool
71
+ if @spec
72
+ self.class.retrieve_or_establish_connection_pool(@spec)
73
+ else
74
+ ::ActiveRecord::Base.connection_pool
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -1,59 +1,49 @@
1
1
  require 'active_record'
2
- require 'uri'
3
2
 
4
3
  module Moneta
5
4
  module Adapters
6
5
  # ActiveRecord as key/value stores
7
6
  # @api public
8
7
  class ActiveRecord < Adapter
9
- supports :create, :increment, :each_key
8
+ autoload :V5Backend, 'moneta/adapters/activerecord/v5_backend'
9
+ autoload :Backend, 'moneta/adapters/activerecord/backend'
10
10
 
11
- attr_reader :table
12
- delegate :with_connection, to: :connection_pool
11
+ @table_create_lock = ::Mutex.new
13
12
 
14
- @connection_lock = ::Mutex.new
15
13
  class << self
16
- attr_reader :connection_lock
17
- delegate :configurations, :configurations=, :connection_handler, to: ::ActiveRecord::Base
18
-
19
- def retrieve_connection_pool(spec_name)
20
- connection_handler.retrieve_connection_pool(spec_name.to_s)
21
- end
14
+ attr_reader :table_create_lock
15
+ end
22
16
 
23
- def establish_connection(spec_name)
24
- connection_lock.synchronize do
25
- if connection_pool = retrieve_connection_pool(spec_name)
26
- connection_pool
27
- else
28
- connection_handler.establish_connection(spec_name.to_sym)
29
- end
30
- end
31
- end
17
+ supports :create, :increment, :each_key
32
18
 
33
- def retrieve_or_establish_connection_pool(spec_name)
34
- retrieve_connection_pool(spec_name) || establish_connection(spec_name)
35
- end
36
- end
19
+ attr_reader :table
20
+ delegate :connection_pool, to: :@backend
21
+ delegate :with_connection, to: :connection_pool
37
22
 
38
23
  config :key_column, default: :k
39
24
  config :value_column, default: :v
40
25
 
41
- backend required: false do |table: :moneta, connection: nil, create_table: nil|
42
- @spec = spec_for_connection(connection)
43
-
26
+ backend do |table: :moneta, create_table: true, **options|
44
27
  # Ensure the table name is a symbol.
45
28
  table_name = table.to_sym
46
29
 
47
- if create_table == nil
48
- default_create_table(table_name)
49
- elsif create_table
50
- with_connection(&create_table)
51
- end
30
+ backend =
31
+ if ::ActiveRecord.version < ::Gem::Version.new('6.0.0')
32
+ ::Moneta::Adapters::ActiveRecord::V5Backend.new(table: table_name, **options)
33
+ else
34
+ ::Moneta::Adapters::ActiveRecord::Backend.new(table: table_name, **options)
35
+ end
52
36
 
53
- @table = ::Arel::Table.new(table_name)
37
+ case create_table
38
+ when Proc
39
+ backend.connection_pool.with_connection(&create_table)
40
+ when true
41
+ backend.connection_pool.with_connection do |conn|
42
+ default_create_table(conn, table_name)
43
+ end
44
+ end
54
45
 
55
- # backend is only used if there's an existing ActiveRecord model
56
- nil
46
+ backend
57
47
  end
58
48
 
59
49
  # @param [Hash] options
@@ -67,12 +57,7 @@ module Moneta
67
57
  # @option options [Symbol] :value_column (:v) The name of the column to use for values
68
58
  def initialize(options = {})
69
59
  super
70
-
71
- # If a :backend was provided, use it to set the spec and table
72
- if backend
73
- @spec = backend.connection_pool.spec
74
- @table = ::Arel::Table.new(backend.table_name)
75
- end
60
+ @table = ::Arel::Table.new(backend.table_name)
76
61
  end
77
62
 
78
63
  # (see Proxy#key?)
@@ -127,19 +112,17 @@ module Moneta
127
112
  # (see Proxy#increment)
128
113
  def increment(key, amount = 1, options = {})
129
114
  with_connection do |conn|
130
- begin
131
- conn_ins(conn, key, amount.to_s)
132
- amount
133
- rescue ::ActiveRecord::RecordNotUnique
134
- conn.transaction do
135
- sel = arel_sel_key(key).project(table[config.value_column]).lock
136
- value = decode(conn, conn.select_value(sel))
137
- value = (value ? Integer(value) : 0) + amount
138
- # Re-raise if the upate affects no rows (i.e. row deleted after attempted insert,
139
- # before select for update)
140
- raise unless conn_upd(conn, key, value.to_s) == 1
141
- value
142
- end
115
+ conn_ins(conn, key, amount.to_s)
116
+ amount
117
+ rescue ::ActiveRecord::RecordNotUnique
118
+ conn.transaction do
119
+ sel = arel_sel_key(key).project(table[config.value_column]).lock
120
+ value = decode(conn, conn.select_value(sel))
121
+ value = (value ? Integer(value) : 0) + amount
122
+ # Re-raise if the upate affects no rows (i.e. row deleted after attempted insert,
123
+ # before select for update)
124
+ raise unless conn_upd(conn, key, value.to_s) == 1
125
+ value
143
126
  end
144
127
  end
145
128
  rescue ::ActiveRecord::RecordNotUnique, ::ActiveRecord::Deadlocked
@@ -170,7 +153,7 @@ module Moneta
170
153
  # (see Proxy#close)
171
154
  def close
172
155
  @table = nil
173
- @spec = nil
156
+ @connection_pool = nil
174
157
  end
175
158
 
176
159
  # (see Proxy#slice)
@@ -248,16 +231,13 @@ module Moneta
248
231
 
249
232
  private
250
233
 
251
- def connection_pool
252
- self.class.retrieve_or_establish_connection_pool(@spec)
253
- end
254
-
255
- def default_create_table(table_name)
256
- with_connection do |conn|
234
+ def default_create_table(conn, table_name)
235
+ # From 6.1, we can use the `if_not_exists?` check
236
+ if ::ActiveRecord.version < ::Gem::Version.new('6.1.0')
257
237
  return if conn.table_exists?(table_name)
258
238
 
259
239
  # Prevent multiple connections from attempting to create the table simultaneously.
260
- self.class.connection_lock.synchronize do
240
+ self.class.table_create_lock.synchronize do
261
241
  conn.create_table(table_name, id: false) do |t|
262
242
  # Do not use binary key (Issue #17)
263
243
  t.string config.key_column, null: false
@@ -265,6 +245,13 @@ module Moneta
265
245
  end
266
246
  conn.add_index(table_name, config.key_column, unique: true)
267
247
  end
248
+ else
249
+ conn.create_table(table_name, id: false, if_not_exists: true) do |t|
250
+ # Do not use binary key (Issue #17)
251
+ t.string config.key_column, null: false
252
+ t.binary config.value_column
253
+ end
254
+ conn.add_index(table_name, config.key_column, unique: true, if_not_exists: true)
268
255
  end
269
256
  end
270
257
 
@@ -305,7 +292,7 @@ module Moneta
305
292
  conn.escape_bytea(value)
306
293
  elsif defined?(::ActiveRecord::ConnectionAdapters::SQLite3Adapter) &&
307
294
  conn.is_a?(::ActiveRecord::ConnectionAdapters::SQLite3Adapter)
308
- Arel::Nodes::SqlLiteral.new("X'#{value.unpack('H*').first}'")
295
+ Arel::Nodes::SqlLiteral.new("X'#{value.unpack1('H*')}'")
309
296
  else
310
297
  value
311
298
  end
@@ -323,38 +310,6 @@ module Moneta
323
310
  value
324
311
  end
325
312
  end
326
-
327
- # Feed the connection info into ActiveRecord and get back a name to use
328
- # for getting the connection pool
329
- def spec_for_connection(connection)
330
- case connection
331
- when Symbol
332
- connection
333
- when Hash, String
334
- # Normalize the connection specification to a hash
335
- resolver = ::ActiveRecord::ConnectionAdapters::ConnectionSpecification::Resolver.new \
336
- 'dummy' => connection
337
-
338
- # Turn the config into a standardised hash, sans a couple of bits
339
- hash = resolver.resolve(:dummy)
340
- hash.delete('name')
341
- hash.delete(:password) # For security
342
- # Make a name unique to this config
343
- name = 'moneta?' + URI.encode_www_form(hash.to_a.sort)
344
- # Add into configurations unless its already there (initially done without locking for
345
- # speed)
346
- unless self.class.configurations.key? name
347
- self.class.connection_lock.synchronize do
348
- self.class.configurations[name] = connection \
349
- unless self.class.configurations.key? name
350
- end
351
- end
352
-
353
- name.to_sym
354
- else
355
- ::ActiveRecord::Base.connection_pool.spec.name.to_s
356
- end
357
- end
358
313
  end
359
314
  end
360
315
  end
@@ -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]
@@ -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)