moneta 1.5.1 → 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 (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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 057afad07820c6a0099c1c8f0d08e8a8db0d8f163ae699a6c492b5114e7690da
4
- data.tar.gz: 277352fb763982da85855f170234cf6a2660afeb3b90f6bf34df6dccda586291
3
+ metadata.gz: 4b7e4bbe0345dcfa33a7217af5a4bbcef559b3d9cb0d8a53301a7c9ff30a7118
4
+ data.tar.gz: 7d3fe5f86885f39a418e8647f15243cb3728fad2daf12fd841b237c23d796fd4
5
5
  SHA512:
6
- metadata.gz: 0266a4e3016c53408a92a5929152f088ff26c0981561e279e0812726a085e65a6ea90305d362ca04383ee0225915bd470f687c97d9eeafeff960ca21de716616
7
- data.tar.gz: 95f6df87a40afeeff7d0c490c88f9c9950a12949358df57da9014cff3ffba1e7893ca43cdfb1d90c20750050d6bc0617e76655a025bff58caa1c89567256a894
6
+ metadata.gz: 667443d645a8b75775bc43633e58eab9434e5c291043e2f4165a971391c67f5fdd5dffdda76f76924de56b28d2bd1f14c25eef0d16c032859aa91e67a22d123c
7
+ data.tar.gz: cf76836caa72d5fa5a2179b8937e06a24571f42eb7e26ba6ad4b606fbd70305817dbf6d33ae75a181d91e4f76b267db15b7fbb26e4471d148826a00ab8f9f6b6
data/CHANGES CHANGED
@@ -1,3 +1,21 @@
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
+
13
+ 1.5.2
14
+
15
+ * Proxy - handle returning config when the adapter does not use config
16
+ * Avoid calling `supports?(:expires)` when expiry isn't needed
17
+ * Adapters::Mongo - fix `merge!` behaviour when no values are inserted
18
+
1
19
  1.5.1
2
20
 
3
21
  * Adapters::File - fix an implicit hash issue in Ruby 3 (#222)
data/CONTRIBUTORS CHANGED
@@ -3,11 +3,13 @@ Alastair Pharo <me@asph.dev>
3
3
  Alejandro Crosa <acrosa@sharing.local>
4
4
  Alessio Signorini <alessio@signorini.us>
5
5
  Anthony Eden <anthonyeden@gmail.com>
6
+ Antoine Beaupré <anarcat@debian.org>
6
7
  Antonio Terceiro <terceiro@debian.org>
7
8
  Atoxhybrid <atoxhybrid@gmail.com>
8
9
  AtoxIO <atoxhybrid@gmail.com>
9
10
  Ben Schwarz <ben.schwarz@gmail.com>
10
11
  Benjamin Yu <benjaminlyu@gmail.com>
12
+ Corey Smith <korkey128k@gmail.com>
11
13
  Daniel Mendler <mail@daniel-mendler.de>
12
14
  Denis Defreyne <denis.defreyne@stoneship.org>
13
15
  Derek Kastner <dkastner@gmail.com>
@@ -20,6 +22,7 @@ Jay Mitchell <jaybmitchell@gmail.com>
20
22
  Jeremy Voorhis <jvoorhis@gmail.com>
21
23
  Jon Crosby <jon@joncrosby.me>
22
24
  Jonathan Gnagy <jonathan.l.gnagy@sherwin.com>
25
+ Jérôme Charaoui <jerome@riseup.net>
23
26
  lakshan <lakshan@web2media.net>
24
27
  Mal McKay <mal.mckay@gmail.com>
25
28
  Marek Skrobacki <skrobul@skrobul.com>
@@ -34,6 +37,7 @@ Quin Hoxie <quin@aboutus.org>
34
37
  Ryan T. Hosford <tad.hosford@gmail.com>
35
38
  Scott Wadden <scott.wadden@gmail.com>
36
39
  Sven Riedel <sr@gimp.org>
40
+ Thomas R. Koll <tomk32@tomk32.de>
37
41
  Timo Goebel <timo.goebel@dm.de>
38
42
  Tom Meier <ozmeier@yahoo.co.uk>
39
43
  Tony Han <h.bing612@gmail.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
data/README.md CHANGED
@@ -106,11 +106,11 @@ Out of the box, it supports the following backends. Use the backend name symbol
106
106
  * Key/value databases:
107
107
  * [Berkeley DB using DBM interface or NDBM (Depends on Ruby environment)](http://www.ruby-doc.org/stdlib/libdoc/dbm/rdoc/DBM.html) (`:DBM`)
108
108
  * [Cassandra](http://cassandra.apache.org/) (`:Cassandra`)
109
- * [Daybreak](http://propublica.github.com/daybreak/) (`:Daybreak`)
109
+ * [Daybreak](https://propublica.github.io/daybreak/) (`:Daybreak`)
110
110
  * [GDBM](http://www.ruby-doc.org/stdlib/libdoc/gdbm/rdoc/GDBM.html) (`:GDBM`)
111
111
  * [HBase](http://hbase.apache.org/) (`:HBase`)
112
112
  * [LevelDB](http://code.google.com/p/leveldb/) (`:LevelDB`)
113
- * [LMDB](http://symas.com/mdb/) (`:LMDB`)
113
+ * [LMDB](http://symas.com/lmdb) (`:LMDB`)
114
114
  * [Redis](http://redis.io/) (`:Redis`)
115
115
  * [Riak](http://docs.basho.com/) (`:Riak`)
116
116
  * [SDBM](http://www.ruby-doc.org/stdlib/libdoc/sdbm/rdoc/SDBM.html) (`:SDBM`)
@@ -150,7 +150,7 @@ __NOTE:__ <a name="backend-matrix"></a>The backend matrix is much more readable
150
150
 
151
151
  <tr><td>File</td><td>-</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td>File store</td></tr>
152
152
 
153
- <tr><td>LMDB</td><td>lmdb</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://symas.com/mdb/">Symas Lightning Memory-Mapped Database (LMDB)</a></td></tr>
153
+ <tr><td>LMDB</td><td>lmdb</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://symas.com/lmdb">Symas Lightning Memory-Mapped Database (LMDB)</a></td></tr>
154
154
 
155
155
  <tr><td>Sequel</td><td>sequel</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://sequel.rubyforge.org/">Sequel</a> ORM</td></tr>
156
156
 
@@ -221,9 +221,7 @@ __NOTE:__ <a name="backend-matrix"></a>The backend matrix is much more readable
221
221
  3. Share a Moneta store between multiple processes using `Moneta::Shared` (See below).
222
222
  4. If a store provides atomic increment it can be used with `Moneta::Semaphore`. You can add weak `#increment` support using the `Moneta::WeakIncrement` proxy.
223
223
  5. If a store provides atomic creation it can be used with `Moneta::Mutex`. You can add weak `#create` support using the `Moneta::WeakCreate` proxy.
224
- 6. Add expiration support by using `Moneta::Expires` or by passing the option
225
- `expires: true` (or `expires: <seconds>` if you want all values to expire by
226
- default) to `Moneta#new`.
224
+ 6. Add expiration support by using `Moneta::Expires` or by passing the option `expires: true` to `Moneta#new`.
227
225
  7. This indicates that there is some performance gain when fetching multiple values at once using `#values_at`/`#fetch_values` or `#slice`. For instance, the `MGET` instruction in Redis, or the ability to retrieve several rows in one query in SQL.
228
226
  8. This indicates that there is some performance gain when storing multiple key/value pairs at once using `#merge!`/`#update`.
229
227
  9. Sqlite/YAML/PStore are multiprocess safe, but the performance suffers badly since the whole database file must be locked for writing. Use a key/value server if you want multiprocess concurrency!
@@ -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