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
data/spec/helper.rb DELETED
@@ -1,444 +0,0 @@
1
- require 'rspec/core/formatters/base_text_formatter'
2
- require 'moneta'
3
- require 'fileutils'
4
- require 'tmpdir'
5
-
6
- ENV['RANTLY_VERBOSE'] ||= '0'
7
-
8
- require 'rspec/retry'
9
- require 'rantly'
10
- require 'rantly/rspec_extensions'
11
- # rantly/shrinks
12
- require 'timecop'
13
-
14
- class MonetaParallelFormatter < RSpec::Core::Formatters::BaseTextFormatter
15
- def start(*args)
16
-
17
- output.puts colorise_summary("STARTING #{ARGV.join(' ')}")
18
- @stopped = false
19
- @passed_count = 0
20
- @heartbeat = Thread.new do
21
- count = 0
22
- until @stopped
23
- if (count += 1) % 60 == 0
24
- output.puts(color("RUNNING #{ARGV.join(' ')} - #{@passed_count} passed, #{failed_examples.size} failures",
25
- failed_examples.empty? ? RSpec.configuration.success_color : RSpec.configuration.failure_color))
26
- end
27
- sleep 0.5
28
- end
29
- end
30
- end
31
-
32
- def example_passed(example)
33
- super
34
- @passed_count += 1
35
- end
36
-
37
- def stop
38
- @stopped = true
39
- @heartbeat.join
40
- end
41
-
42
- def dump_summary(duration, example_count, failure_count, pending_count)
43
- @duration = duration
44
- @example_count = example_count
45
- @failure_count = failure_count
46
- @pending_count = pending_count
47
- output.puts colorise_summary(summary_line(example_count, failure_count, pending_count))
48
- dump_commands_to_rerun_failed_examples
49
- end
50
-
51
- def summary_line(example_count, failure_count, pending_count)
52
- "FINISHED #{ARGV.join(' ')} in #{format_duration(duration)} - #{super}"
53
- end
54
- end
55
-
56
- class MonetaSpecs
57
- KEYS = {
58
- 'nil' => [:choose, nil, 0],
59
- 'integer' => :integer,
60
- 'float' => :float,
61
- 'boolean' => :boolean,
62
- 'string' => proc{ sized(range 5, 10){ string(:alnum) } },
63
- 'path' => proc{ array(range 2, 3){ sized(range 5, 10){ string(:alpha) } }.join('/') },
64
- 'binary' => [:string, :cntrl],
65
- 'object' => proc{ choose Value.new(:objkey1), Value.new(:objkey2) },
66
- 'hash' => proc{ dict(2){ sized(range 5, 10){ [string(:alnum), string(:alnum)] } } }
67
- }
68
-
69
- VALUES = {
70
- 'nil' => [:literal, nil],
71
- 'integer' => :integer,
72
- 'float' => :float,
73
- 'boolean' => :boolean,
74
- 'string' => [:string, :alnum],
75
- 'binary' => [:string, :cntrl],
76
- 'object' => proc{ choose Value.new(:objval1), Value.new(:objval2) },
77
- 'hash' => proc{ dict{ [string(:alnum), array(2){ choose(string(:alnum), integer, dict{ [string(:alnum), integer] }) }] } },
78
- 'smallhash' => proc{ dict(2){ sized(range 5, 10){ [string(:alnum), string(:alnum)] } } }
79
- }
80
-
81
- attr_reader :key, :value, :specs, :features
82
-
83
- def initialize(options = {})
84
- @specs = options.delete(:specs).to_a
85
- @features = @specs & [:expires, :expires_native, :increment, :each_key, :create]
86
- @key = options.delete(:key) || %w(object string binary hash boolean nil integer float)
87
- @value = options.delete(:value) || %w(object string binary hash boolean nil integer float)
88
- end
89
-
90
- def new(options)
91
- self.class.new({specs: specs, key: key, value: value}.merge(options))
92
- end
93
-
94
- def with_keys(*keys)
95
- new(key: self.key | keys.map(&:to_s))
96
- end
97
-
98
- def without_keys(*keys)
99
- new(key: self.key - keys.map(&:to_s))
100
- end
101
-
102
- def with_values(*values)
103
- new(value: self.value | values.map(&:to_s))
104
- end
105
-
106
- def without_values(*values)
107
- new(value: self.value - values.map(&:to_s))
108
- end
109
-
110
- def without_keys_or_values(*types)
111
- without_keys(*types).without_values(*types)
112
- end
113
-
114
- def without_path
115
- new(key: key - %w(path))
116
- end
117
-
118
- def stringvalues_only
119
- new(value: %w(string))
120
- end
121
-
122
- def simplekeys_only
123
- new(key: %w(string hash integer))
124
- end
125
-
126
- def simplevalues_only
127
- new(value: %w(string hash integer))
128
- end
129
-
130
- def without_increment
131
- new(specs: specs - [:increment, :concurrent_increment] + [:not_increment])
132
- end
133
-
134
- def without_large
135
- new(specs: specs - [:store_large]).instance_exec do
136
- if value.include? 'hash'
137
- without_values(:hash).with_values(:smallhash)
138
- else
139
- self
140
- end
141
- end
142
- end
143
-
144
- def without_concurrent
145
- new(specs: specs - [:concurrent_increment, :concurrent_create])
146
- end
147
-
148
- def without_persist
149
- new(specs: specs - [:persist, :multiprocess, :concurrent_increment, :concurrent_create] + [:not_persist])
150
- end
151
-
152
- def without_multiprocess
153
- new(specs: specs - [:multiprocess, :concurrent_increment, :concurrent_create])
154
- end
155
-
156
- def with_expires
157
- a = specs.dup
158
- if a.include?(:transform_value)
159
- a.delete(:transform_value)
160
- a << :transform_value_expires
161
- end
162
- a << :create_expires if a.include?(:create)
163
- a << :expires
164
- new(specs: a)
165
- end
166
-
167
- def with_native_expires
168
- a = specs.dup
169
- a << :create_expires if a.include?(:create)
170
- new(specs: a + [:expires])
171
- end
172
-
173
- def without_marshallable
174
- new(specs: specs - [:marshallable_value, :marshallable_key])
175
- end
176
-
177
- def without_transform
178
- new(specs: specs - [:marshallable_value, :marshallable_key, :transform_value])
179
- end
180
-
181
- def returnsame
182
- new(specs: specs - [:returndifferent] + [:returnsame])
183
- end
184
-
185
- def without_marshallable_key
186
- new(specs: specs - [:marshallable_key])
187
- end
188
-
189
- def without_marshallable_value
190
- new(specs: specs - [:marshallable_value])
191
- end
192
-
193
- def without_store
194
- new(specs: specs - [:store, :store_large, :transform_value, :marshallable_value])
195
- end
196
-
197
- def with_default_expires
198
- new(specs: specs + [:default_expires])
199
- end
200
-
201
- def with_each_key
202
- new(specs: specs - [:not_each_key] | [:each_key])
203
- end
204
-
205
- def without_create
206
- new(specs: specs - [:create, :concurrent_create, :create_expires] + [:not_create])
207
- end
208
- end
209
-
210
- ADAPTER_SPECS = MonetaSpecs.new(
211
- specs: [:null, :store, :returndifferent,
212
- :increment, :concurrent_increment, :concurrent_create, :persist, :multiprocess,
213
- :create, :features, :store_large, :not_each_key],
214
- key: %w(string path),
215
- value: %w(string path binary))
216
-
217
- NATIVE_EXPIRY_SPECS = MonetaSpecs.new(
218
- specs: [:create, :expires, :create_expires],
219
- key: %w(string path),
220
- value: %w(string path binary))
221
-
222
- STANDARD_SPECS = MonetaSpecs.new(
223
- specs: [:null, :store, :returndifferent,
224
- :marshallable_key, :marshallable_value, :transform_value, :increment,
225
- :concurrent_increment, :concurrent_create, :persist, :multiprocess, :create,
226
- :features, :store_large, :not_each_key])
227
-
228
- TRANSFORMER_SPECS = MonetaSpecs.new(
229
- specs: [:null, :store, :returndifferent,
230
- :transform_value, :increment, :create, :features, :store_large,
231
- :not_each_key])
232
-
233
- module MonetaHelpers
234
- module ClassMethods
235
-
236
- def moneta_store store_name, options={}, &block
237
- name = self.description
238
- builder = proc do
239
- if block
240
- options = instance_exec(&block)
241
- end
242
-
243
- Moneta.new(store_name, options.merge(logger: {file: File.join(tempdir, "#{name}.log")}))
244
- end
245
-
246
- include_context :setup_moneta_store, builder
247
- end
248
-
249
- def moneta_build &block
250
- include_context :setup_moneta_store, block
251
- end
252
-
253
- def moneta_loader &block
254
- before do
255
- @moneta_value_loader = block
256
- end
257
- end
258
-
259
- def moneta_specs specs
260
- let(:features){ specs.features }
261
- let(:keys_meta) do
262
- [:branch, *specs.key.map{ |k| MonetaSpecs::KEYS[k] }.compact]
263
- end
264
- let(:values_meta) do
265
- [:branch, *specs.value.map{ |k| MonetaSpecs::VALUES[k] }.compact]
266
- end
267
-
268
- # Used by tests that rely on MySQL. These env vars can be used if you
269
- # want to run the tests but don't want to grant root access to moneta
270
- let(:mysql_host) { ENV['MYSQL_HOST'] || 'localhost' }
271
- let(:mysql_port) { ENV['MYSQL_TCP_PORT'] || '3306' }
272
- let(:mysql_username) { ENV['MONETA_MYSQL_USERNAME'] || 'root' }
273
- let(:mysql_password) { ENV['MONETA_MYSQL_PASSWORD'] }
274
- let(:mysql_database1) { ENV['MONETA_MYSQL_DATABASE1'] || 'moneta' }
275
- let(:mysql_database2) { ENV['MONETA_MYSQL_DATABASE2'] || 'moneta2' }
276
-
277
- let(:postgres_username) { ENV['PGUSER'] || 'postgres' }
278
- let(:postgres_password) { ENV['PGPASSWORD'] }
279
- let(:postgres_database1) { ENV['MONETA_POSTGRES_DATABSASE1'] || 'moneta1' }
280
- let(:postgres_database2) { ENV['MONETA_POSTGRES_DATABSASE1'] || 'moneta2' }
281
-
282
- let(:couch_login) { ENV['COUCH_LOGIN'] || 'admin' }
283
- let(:couch_password) { ENV['COUCH_PASSWORD'] || 'password' }
284
-
285
- let(:redis_host) { ENV.fetch('REDIS_HOST', 'localhost') }
286
- let(:redis_port) { ENV.fetch('REDIS_PORT', '6379') }
287
-
288
- before do
289
- store = new_store
290
- store.clear
291
- store.close
292
- end
293
-
294
- specs.specs.sort.each do |s|
295
- context "#{s} feature" do
296
- include_examples(s)
297
- end
298
- end
299
- end
300
-
301
- def use_timecop
302
- before { @timecop = true }
303
- after { Timecop.return }
304
- end
305
- end
306
-
307
- module InstanceMethods
308
- def tempdir
309
- @moneta_tempdir ||= Dir.mktmpdir
310
- end
311
-
312
- def new_store
313
- instance_eval(&@moneta_store_builder)
314
- end
315
-
316
- def store
317
- @store ||= new_store
318
- end
319
-
320
- def load_value value
321
- if @moneta_value_loader
322
- @moneta_value_loader.call value
323
- else
324
- Marshal.load(value)
325
- end
326
- end
327
-
328
- def moneta_property_of(keys: 0, values: 0)
329
- keys_meta = self.keys_meta
330
- values_meta = self.values_meta
331
- property_of do
332
- key_values = keys.times.map { call(keys_meta) }
333
- guard key_values.uniq.length == key_values.length
334
-
335
- value_values = values.times.map { call(values_meta) }
336
- guard value_values.uniq.length == value_values.length
337
-
338
- Struct.new(:keys, :values).new(key_values, value_values)
339
- end
340
- end
341
-
342
- def advance(seconds)
343
- return if seconds < 0
344
- if @timecop
345
- Timecop.freeze(Time.now + seconds)
346
- else
347
- sleep seconds
348
- end
349
- end
350
-
351
- def time_till_next(tick)
352
- now = Time.now.to_f
353
- tick - (now % tick)
354
- end
355
-
356
- # advance to the moment just after a tick. 1e-2 is needed in some
357
- # environments (JRuby) to be able to pass the "not in earlier half" test.
358
- def advance_next_tick
359
- tick = t_res
360
- offset = time_till_next(tick) + 1e-2
361
- advance offset
362
- raise "not in earlier half of tick" unless Time.now.to_f % tick < tick / 2.0
363
- end
364
- end
365
- end
366
-
367
- RSpec.configure do |config|
368
- config.verbose_retry = true
369
- config.color = true
370
- #config.tty = true
371
- #config.formatter = ENV['PARALLEL_TESTS'] ? MonetaParallelFormatter : :progress
372
- config.silence_filter_announcements = true if ENV['PARALLEL_TESTS']
373
-
374
- # Allow "should" syntax as well as "expect"
375
- config.expect_with(:rspec) { |c| c.syntax = [:should, :expect] }
376
-
377
- config.extend MonetaHelpers::ClassMethods
378
- config.include MonetaHelpers::InstanceMethods
379
- end
380
-
381
- # FIXME: Get rid of this once raise_error expectations no longer generate
382
- # warnings
383
- RSpec::Expectations.configuration.on_potential_false_positives = :nothing
384
-
385
- # Disable jruby stdout pollution by memcached
386
- if defined?(JRUBY_VERSION)
387
- require 'java'
388
- properties = java.lang.System.getProperties();
389
- properties.put('net.spy.log.LoggerImpl', 'net.spy.memcached.compat.log.SunLogger');
390
- java.lang.System.setProperties(properties);
391
- java.util.logging.Logger.getLogger('').setLevel(java.util.logging.Level::OFF)
392
- end
393
-
394
- class Value
395
- attr_accessor :x
396
- def initialize(x)
397
- @x = x
398
- end
399
-
400
- def ==(other)
401
- Value === other && other.x == x
402
- end
403
-
404
- def eql?(other)
405
- Value === other && other.x == x
406
- end
407
-
408
- def hash
409
- x.hash
410
- end
411
- end
412
-
413
-
414
- def marshal_error
415
- # HACK: Marshalling structs in rubinius without class name throws
416
- # NoMethodError (to_sym). TODO: Create an issue for rubinius!
417
- if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
418
- RUBY_VERSION < '1.9' ? ArgumentError : NoMethodError
419
- else
420
- TypeError
421
- end
422
- end
423
-
424
-
425
- RSpec.shared_context :setup_moneta_store do |builder|
426
- before do
427
- @moneta_store_builder = builder
428
- end
429
-
430
- after do
431
- if @store
432
- @store.close.should == nil
433
- @store = nil
434
- end
435
- end
436
-
437
- after :all do
438
- if @moneta_tempdir
439
- FileUtils.remove_dir(@moneta_tempdir)
440
- end
441
- end
442
- end
443
-
444
- Dir['./spec/features/*.rb'].each{ |rb| require rb }
@@ -1,61 +0,0 @@
1
- describe 'adapter_activerecord_existing_connection', adapter: :ActiveRecord, mysql: true do
2
- before :all do
3
- require 'active_record'
4
- end
5
-
6
- before do
7
- default_env = ActiveRecord::ConnectionHandling::DEFAULT_ENV.call
8
- ActiveRecord::Base.configurations = {
9
- default_env => {
10
- 'adapter' => (defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql2'),
11
- 'host' => mysql_host,
12
- 'port' => mysql_port,
13
- 'database' => mysql_database1,
14
- 'username' => mysql_username,
15
- 'password' => mysql_password
16
- }
17
- }
18
-
19
- ActiveRecord::Base.establish_connection
20
- end
21
-
22
- moneta_build do
23
- Moneta::Adapters::ActiveRecord.new(table: 'adapter_activerecord_existing_connection')
24
- end
25
-
26
- moneta_specs ADAPTER_SPECS.with_each_key
27
-
28
- # This is based on
29
- # https://github.com/jjb/rails/blob/ar-connection-management-guide/guides/source/active_record_connection_management.md
30
- it "supports use on a forking web server", unsupported: !Process.respond_to?(:fork) do
31
- store['a'] = 'b'
32
-
33
- # Before forking, the connection pool is disconnected so that the
34
- # forked processes don't use the same connections.
35
- ActiveRecord::Base.connection_pool.disconnect!
36
-
37
- pids = 8.times.map do
38
- Process.fork do
39
- # Connection is then reestablished in the forked process
40
- ActiveRecord::Base.establish_connection
41
-
42
- exit 1 unless store['a'] == 'b'
43
-
44
- store[Process.pid.to_s] = '1'
45
- exit 1 unless store[Process.pid.to_s] == '1'
46
- end
47
- end
48
-
49
- pids.each do |pid|
50
- pid2, status = Process.wait2(pid)
51
- expect(pid2).to eq pid
52
- expect(status.exitstatus).to eq 0
53
- end
54
-
55
- # Check that the stores were all operating on the same DB
56
- ActiveRecord::Base.establish_connection
57
- pids.each do |pid|
58
- expect(store[pid.to_s]).to eq '1'
59
- end
60
- end
61
- end
@@ -1,126 +0,0 @@
1
- describe 'adapter_activerecord', adapter: :ActiveRecord do
2
- activerecord_specs = ADAPTER_SPECS.with_values(:nil).with_each_key
3
-
4
- shared_examples :adapter_activerecord do |specs|
5
- moneta_build do
6
- Moneta::Adapters::ActiveRecord.new(
7
- table: 'adapter_activerecord',
8
- connection: connection1)
9
- end
10
-
11
-
12
- moneta_specs specs
13
-
14
- it 'updates an existing key/value' do
15
- store['foo/bar'] = '1'
16
- store['foo/bar'] = '2'
17
- store.with_connection do |conn|
18
- count = conn.select_value \
19
- store.table.
20
- where(store.table[:k].eq('foo/bar')).
21
- project(store.table[:k].count)
22
- expect(count).to eq 1
23
- end
24
- end
25
-
26
- it 'supports different tables same database' do
27
- store1 = Moneta::Adapters::ActiveRecord.new(
28
- table: 'adapter_activerecord1',
29
- connection: connection1)
30
- store2 = Moneta::Adapters::ActiveRecord.new(
31
- table: 'adapter_activerecord2',
32
- connection: connection1)
33
-
34
- store1['key'] = 'value1'
35
- store2['key'] = 'value2'
36
- store1['key'].should == 'value1'
37
- store2['key'].should == 'value2'
38
-
39
- store1.close
40
- store2.close
41
- end
42
-
43
- it 'supports different databases same table' do
44
- store1 = Moneta::Adapters::ActiveRecord.new(
45
- table: 'adapter_activerecord',
46
- connection: connection1)
47
- store2 = Moneta::Adapters::ActiveRecord.new(
48
- table: 'adapter_activerecord',
49
- connection: connection2)
50
-
51
- store1['key'] = 'value1'
52
- store2['key'] = 'value2'
53
- store1['key'].should == 'value1'
54
- store2['key'].should == 'value2'
55
-
56
- store1.close
57
- store2.close
58
- end
59
- end
60
-
61
- context "with MySQL", mysql: true do
62
- let(:connection1) do
63
- {
64
- adapter: (defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql2'),
65
- host: mysql_host,
66
- port: mysql_port,
67
- database: mysql_database1,
68
- username: mysql_username,
69
- password: mysql_password
70
- }
71
- end
72
-
73
- let(:connection2) do
74
- {
75
- adapter: (defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql2'),
76
- host: mysql_host,
77
- port: mysql_port,
78
- database: mysql_database2,
79
- username: mysql_username,
80
- password: mysql_password
81
- }
82
- end
83
-
84
- include_examples :adapter_activerecord, activerecord_specs
85
- end
86
-
87
- context "with PostgreSQL", postgres: true do
88
- let(:connection1) do
89
- {
90
- adapter: (defined?(JRUBY_VERSION) ? 'jdbcpostgresql' : 'postgresql'),
91
- database: postgres_database1,
92
- username: postgres_username,
93
- password: postgres_password
94
- }
95
- end
96
-
97
- let(:connection2) do
98
- {
99
- adapter: (defined?(JRUBY_VERSION) ? 'jdbcpostgresql' : 'postgresql'),
100
- database: postgres_database2,
101
- username: postgres_username,
102
- password: postgres_password
103
- }
104
- end
105
-
106
- include_examples :adapter_activerecord, activerecord_specs
107
- end
108
-
109
- context "with SQLite", sqlite: true do
110
- let(:connection1) do
111
- {
112
- adapter: (defined?(JRUBY_VERSION) ? 'jdbcsqlite3' : 'sqlite3'),
113
- database: File.join(tempdir, 'adapter_activerecord1.db')
114
- }
115
- end
116
-
117
- let(:connection2) do
118
- {
119
- adapter: (defined?(JRUBY_VERSION) ? 'jdbcsqlite3' : 'sqlite3'),
120
- database: File.join(tempdir, 'adapter_activerecord2.db')
121
- }
122
- end
123
-
124
- include_examples :adapter_activerecord, activerecord_specs.without_concurrent
125
- end
126
- end
@@ -1,21 +0,0 @@
1
- describe "standard_activerecord", adapter: :ActiveRecord, mysql: true do
2
- moneta_store :ActiveRecord do
3
- {
4
- table: 'standard_activerecord',
5
- connection: {
6
- adapter: (defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql2'),
7
- host: mysql_host,
8
- port: mysql_port,
9
- database: mysql_database1,
10
- username: mysql_username,
11
- password: mysql_password
12
- }
13
- }
14
- end
15
-
16
- moneta_loader do |value|
17
- ::Marshal.load(value.unpack('m').first)
18
- end
19
-
20
- moneta_specs STANDARD_SPECS.with_each_key
21
- end
@@ -1,27 +0,0 @@
1
- describe "standard_activerecord_with_expires", adapter: :ActiveRecord, mysql: true do
2
- let(:t_res) { 0.125 }
3
- let(:min_ttl) { t_res }
4
- use_timecop
5
-
6
- moneta_store :ActiveRecord do
7
- {
8
- table: 'standard_activerecord_with_expires',
9
- connection: {
10
- adapter: (defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql2'),
11
- host: mysql_host,
12
- port: mysql_port,
13
- database: mysql_database1,
14
- username: mysql_username,
15
- password: mysql_password
16
- },
17
- expires: true
18
- }
19
- end
20
-
21
-
22
- moneta_loader do |value|
23
- ::Marshal.load(value.unpack('m').first)
24
- end
25
-
26
- moneta_specs STANDARD_SPECS.with_expires.with_each_key
27
- end