moneta 1.5.2 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
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
data/spec/helper.rb DELETED
@@ -1,445 +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_socket) { ENV['MYSQL_SOCKET'] }
273
- let(:mysql_username) { ENV['MONETA_MYSQL_USERNAME'] || 'root' }
274
- let(:mysql_password) { ENV['MONETA_MYSQL_PASSWORD'] }
275
- let(:mysql_database1) { ENV['MONETA_MYSQL_DATABASE1'] || 'moneta' }
276
- let(:mysql_database2) { ENV['MONETA_MYSQL_DATABASE2'] || 'moneta2' }
277
-
278
- let(:postgres_username) { ENV['PGUSER'] || 'postgres' }
279
- let(:postgres_password) { ENV['PGPASSWORD'] }
280
- let(:postgres_database1) { ENV['MONETA_POSTGRES_DATABSASE1'] || 'moneta1' }
281
- let(:postgres_database2) { ENV['MONETA_POSTGRES_DATABSASE1'] || 'moneta2' }
282
-
283
- let(:couch_login) { ENV['COUCH_LOGIN'] || 'admin' }
284
- let(:couch_password) { ENV['COUCH_PASSWORD'] || 'password' }
285
-
286
- let(:redis_host) { ENV.fetch('REDIS_HOST', 'localhost') }
287
- let(:redis_port) { ENV.fetch('REDIS_PORT', '6379') }
288
-
289
- before do
290
- store = new_store
291
- store.clear
292
- store.close
293
- end
294
-
295
- specs.specs.sort.each do |s|
296
- context "#{s} feature" do
297
- include_examples(s)
298
- end
299
- end
300
- end
301
-
302
- def use_timecop
303
- before { @timecop = true }
304
- after { Timecop.return }
305
- end
306
- end
307
-
308
- module InstanceMethods
309
- def tempdir
310
- @moneta_tempdir ||= Dir.mktmpdir
311
- end
312
-
313
- def new_store
314
- instance_eval(&@moneta_store_builder)
315
- end
316
-
317
- def store
318
- @store ||= new_store
319
- end
320
-
321
- def load_value value
322
- if @moneta_value_loader
323
- @moneta_value_loader.call value
324
- else
325
- Marshal.load(value)
326
- end
327
- end
328
-
329
- def moneta_property_of(keys: 0, values: 0)
330
- keys_meta = self.keys_meta
331
- values_meta = self.values_meta
332
- property_of do
333
- key_values = keys.times.map { call(keys_meta) }
334
- guard key_values.uniq.length == key_values.length
335
-
336
- value_values = values.times.map { call(values_meta) }
337
- guard value_values.uniq.length == value_values.length
338
-
339
- Struct.new(:keys, :values).new(key_values, value_values)
340
- end
341
- end
342
-
343
- def advance(seconds)
344
- return if seconds < 0
345
- if @timecop
346
- Timecop.freeze(Time.now + seconds)
347
- else
348
- sleep seconds
349
- end
350
- end
351
-
352
- def time_till_next(tick)
353
- now = Time.now.to_f
354
- tick - (now % tick)
355
- end
356
-
357
- # advance to the moment just after a tick. 1e-2 is needed in some
358
- # environments (JRuby) to be able to pass the "not in earlier half" test.
359
- def advance_next_tick
360
- tick = t_res
361
- offset = time_till_next(tick) + 1e-2
362
- advance offset
363
- raise "not in earlier half of tick" unless Time.now.to_f % tick < tick / 2.0
364
- end
365
- end
366
- end
367
-
368
- RSpec.configure do |config|
369
- config.verbose_retry = true
370
- config.color = true
371
- #config.tty = true
372
- #config.formatter = ENV['PARALLEL_TESTS'] ? MonetaParallelFormatter : :progress
373
- config.silence_filter_announcements = true if ENV['PARALLEL_TESTS']
374
-
375
- # Allow "should" syntax as well as "expect"
376
- config.expect_with(:rspec) { |c| c.syntax = [:should, :expect] }
377
-
378
- config.extend MonetaHelpers::ClassMethods
379
- config.include MonetaHelpers::InstanceMethods
380
- end
381
-
382
- # FIXME: Get rid of this once raise_error expectations no longer generate
383
- # warnings
384
- RSpec::Expectations.configuration.on_potential_false_positives = :nothing
385
-
386
- # Disable jruby stdout pollution by memcached
387
- if defined?(JRUBY_VERSION)
388
- require 'java'
389
- properties = java.lang.System.getProperties();
390
- properties.put('net.spy.log.LoggerImpl', 'net.spy.memcached.compat.log.SunLogger');
391
- java.lang.System.setProperties(properties);
392
- java.util.logging.Logger.getLogger('').setLevel(java.util.logging.Level::OFF)
393
- end
394
-
395
- class Value
396
- attr_accessor :x
397
- def initialize(x)
398
- @x = x
399
- end
400
-
401
- def ==(other)
402
- Value === other && other.x == x
403
- end
404
-
405
- def eql?(other)
406
- Value === other && other.x == x
407
- end
408
-
409
- def hash
410
- x.hash
411
- end
412
- end
413
-
414
-
415
- def marshal_error
416
- # HACK: Marshalling structs in rubinius without class name throws
417
- # NoMethodError (to_sym). TODO: Create an issue for rubinius!
418
- if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
419
- RUBY_VERSION < '1.9' ? ArgumentError : NoMethodError
420
- else
421
- TypeError
422
- end
423
- end
424
-
425
-
426
- RSpec.shared_context :setup_moneta_store do |builder|
427
- before do
428
- @moneta_store_builder = builder
429
- end
430
-
431
- after do
432
- if @store
433
- @store.close.should == nil
434
- @store = nil
435
- end
436
- end
437
-
438
- after :all do
439
- if @moneta_tempdir
440
- FileUtils.remove_dir(@moneta_tempdir)
441
- end
442
- end
443
- end
444
-
445
- Dir['./spec/features/*.rb'].each{ |rb| require rb }
@@ -1,62 +0,0 @@
1
- describe 'adapter_activerecord_existing_connection', adapter: :ActiveRecord, mysql: true, broken: ::Gem::Version.new(RUBY_ENGINE_VERSION) >= ::Gem::Version.new('3.0.0') 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
- 'socket' => mysql_socket,
12
- 'host' => mysql_host,
13
- 'port' => mysql_port,
14
- 'database' => mysql_database1,
15
- 'username' => mysql_username,
16
- 'password' => mysql_password
17
- }
18
- }
19
-
20
- ActiveRecord::Base.establish_connection
21
- end
22
-
23
- moneta_build do
24
- Moneta::Adapters::ActiveRecord.new(table: 'adapter_activerecord_existing_connection')
25
- end
26
-
27
- moneta_specs ADAPTER_SPECS.with_each_key
28
-
29
- # This is based on
30
- # https://github.com/jjb/rails/blob/ar-connection-management-guide/guides/source/active_record_connection_management.md
31
- it "supports use on a forking web server", unsupported: !Process.respond_to?(:fork) do
32
- store['a'] = 'b'
33
-
34
- # Before forking, the connection pool is disconnected so that the
35
- # forked processes don't use the same connections.
36
- ActiveRecord::Base.connection_pool.disconnect!
37
-
38
- pids = 8.times.map do
39
- Process.fork do
40
- # Connection is then reestablished in the forked process
41
- ActiveRecord::Base.establish_connection
42
-
43
- exit 1 unless store['a'] == 'b'
44
-
45
- store[Process.pid.to_s] = '1'
46
- exit 1 unless store[Process.pid.to_s] == '1'
47
- end
48
- end
49
-
50
- pids.each do |pid|
51
- pid2, status = Process.wait2(pid)
52
- expect(pid2).to eq pid
53
- expect(status.exitstatus).to eq 0
54
- end
55
-
56
- # Check that the stores were all operating on the same DB
57
- ActiveRecord::Base.establish_connection
58
- pids.each do |pid|
59
- expect(store[pid.to_s]).to eq '1'
60
- end
61
- end
62
- end
@@ -1,128 +0,0 @@
1
- describe 'adapter_activerecord', adapter: :ActiveRecord, broken: ::Gem::Version.new(RUBY_ENGINE_VERSION) >= ::Gem::Version.new('3.0.0') 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
- socket: mysql_socket,
68
- database: mysql_database1,
69
- username: mysql_username,
70
- password: mysql_password
71
- }
72
- end
73
-
74
- let(:connection2) do
75
- {
76
- adapter: (defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql2'),
77
- host: mysql_host,
78
- port: mysql_port,
79
- socket: mysql_socket,
80
- database: mysql_database2,
81
- username: mysql_username,
82
- password: mysql_password
83
- }
84
- end
85
-
86
- include_examples :adapter_activerecord, activerecord_specs
87
- end
88
-
89
- context "with PostgreSQL", postgres: true do
90
- let(:connection1) do
91
- {
92
- adapter: (defined?(JRUBY_VERSION) ? 'jdbcpostgresql' : 'postgresql'),
93
- database: postgres_database1,
94
- username: postgres_username,
95
- password: postgres_password
96
- }
97
- end
98
-
99
- let(:connection2) do
100
- {
101
- adapter: (defined?(JRUBY_VERSION) ? 'jdbcpostgresql' : 'postgresql'),
102
- database: postgres_database2,
103
- username: postgres_username,
104
- password: postgres_password
105
- }
106
- end
107
-
108
- include_examples :adapter_activerecord, activerecord_specs
109
- end
110
-
111
- context "with SQLite", sqlite: true do
112
- let(:connection1) do
113
- {
114
- adapter: (defined?(JRUBY_VERSION) ? 'jdbcsqlite3' : 'sqlite3'),
115
- database: File.join(tempdir, 'adapter_activerecord1.db')
116
- }
117
- end
118
-
119
- let(:connection2) do
120
- {
121
- adapter: (defined?(JRUBY_VERSION) ? 'jdbcsqlite3' : 'sqlite3'),
122
- database: File.join(tempdir, 'adapter_activerecord2.db')
123
- }
124
- end
125
-
126
- include_examples :adapter_activerecord, activerecord_specs.without_concurrent
127
- end
128
- end
@@ -1,22 +0,0 @@
1
- describe "standard_activerecord", adapter: :ActiveRecord, mysql: true, broken: ::Gem::Version.new(RUBY_ENGINE_VERSION) >= ::Gem::Version.new('3.0.0') 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
- socket: mysql_socket,
10
- database: mysql_database1,
11
- username: mysql_username,
12
- password: mysql_password
13
- }
14
- }
15
- end
16
-
17
- moneta_loader do |value|
18
- ::Marshal.load(value.unpack('m').first)
19
- end
20
-
21
- moneta_specs STANDARD_SPECS.with_each_key
22
- end
@@ -1,28 +0,0 @@
1
- describe "standard_activerecord_with_expires", adapter: :ActiveRecord, mysql: true, broken: ::Gem::Version.new(RUBY_ENGINE_VERSION) >= ::Gem::Version.new('3.0.0') 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
- socket: mysql_socket,
14
- database: mysql_database1,
15
- username: mysql_username,
16
- password: mysql_password
17
- },
18
- expires: true
19
- }
20
- end
21
-
22
-
23
- moneta_loader do |value|
24
- ::Marshal.load(value.unpack('m').first)
25
- end
26
-
27
- moneta_specs STANDARD_SPECS.with_expires.with_each_key
28
- end