moneta 1.1.1 → 1.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (207) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.rubocop.yml +194 -0
  4. data/.travis.yml +65 -25
  5. data/CHANGES +36 -0
  6. data/CONTRIBUTORS +4 -2
  7. data/Gemfile +94 -65
  8. data/README.md +50 -25
  9. data/feature_matrix.yaml +3 -11
  10. data/lib/action_dispatch/middleware/session/moneta_store.rb +1 -0
  11. data/lib/active_support/cache/moneta_store.rb +5 -5
  12. data/lib/moneta.rb +18 -10
  13. data/lib/moneta/adapters/activerecord.rb +35 -19
  14. data/lib/moneta/adapters/activesupportcache.rb +3 -7
  15. data/lib/moneta/adapters/cassandra.rb +24 -16
  16. data/lib/moneta/adapters/client.rb +62 -21
  17. data/lib/moneta/adapters/couch.rb +225 -80
  18. data/lib/moneta/adapters/datamapper.rb +1 -0
  19. data/lib/moneta/adapters/file.rb +9 -6
  20. data/lib/moneta/adapters/hbase.rb +1 -1
  21. data/lib/moneta/adapters/kyotocabinet.rb +8 -7
  22. data/lib/moneta/adapters/leveldb.rb +1 -1
  23. data/lib/moneta/adapters/lmdb.rb +3 -4
  24. data/lib/moneta/adapters/lruhash.rb +29 -62
  25. data/lib/moneta/adapters/memcached.rb +1 -0
  26. data/lib/moneta/adapters/memcached/dalli.rb +1 -1
  27. data/lib/moneta/adapters/memcached/native.rb +10 -8
  28. data/lib/moneta/adapters/mongo.rb +264 -6
  29. data/lib/moneta/adapters/null.rb +1 -2
  30. data/lib/moneta/adapters/pstore.rb +3 -2
  31. data/lib/moneta/adapters/redis.rb +8 -4
  32. data/lib/moneta/adapters/restclient.rb +12 -3
  33. data/lib/moneta/adapters/riak.rb +2 -2
  34. data/lib/moneta/adapters/sequel.rb +68 -494
  35. data/lib/moneta/adapters/sequel/mysql.rb +66 -0
  36. data/lib/moneta/adapters/sequel/postgres.rb +80 -0
  37. data/lib/moneta/adapters/sequel/postgres_hstore.rb +240 -0
  38. data/lib/moneta/adapters/sequel/sqlite.rb +57 -0
  39. data/lib/moneta/adapters/sqlite.rb +10 -10
  40. data/lib/moneta/adapters/tokyotyrant.rb +1 -1
  41. data/lib/moneta/builder.rb +2 -3
  42. data/lib/moneta/create_support.rb +21 -0
  43. data/lib/moneta/dbm_adapter.rb +31 -0
  44. data/lib/moneta/{mixins.rb → defaults.rb} +3 -302
  45. data/lib/moneta/each_key_support.rb +27 -0
  46. data/lib/moneta/enumerable.rb +38 -0
  47. data/lib/moneta/expires.rb +12 -12
  48. data/lib/moneta/expires_support.rb +60 -0
  49. data/lib/moneta/fallback.rb +84 -0
  50. data/lib/moneta/hash_adapter.rb +68 -0
  51. data/lib/moneta/increment_support.rb +16 -0
  52. data/lib/moneta/lock.rb +7 -2
  53. data/lib/moneta/logger.rb +2 -2
  54. data/lib/moneta/nil_values.rb +35 -0
  55. data/lib/moneta/option_support.rb +51 -0
  56. data/lib/moneta/optionmerger.rb +0 -1
  57. data/lib/moneta/pool.rb +312 -30
  58. data/lib/moneta/proxy.rb +3 -3
  59. data/lib/moneta/server.rb +216 -65
  60. data/lib/moneta/shared.rb +13 -7
  61. data/lib/moneta/stack.rb +6 -6
  62. data/lib/moneta/synchronize.rb +3 -3
  63. data/lib/moneta/transformer.rb +68 -24
  64. data/lib/moneta/transformer/config.rb +63 -43
  65. data/lib/moneta/transformer/helper.rb +3 -3
  66. data/lib/moneta/transformer/helper/bson.rb +7 -14
  67. data/lib/moneta/utils.rb +3 -9
  68. data/lib/moneta/version.rb +1 -1
  69. data/lib/moneta/weak_each_key.rb +2 -4
  70. data/lib/rack/cache/moneta.rb +13 -11
  71. data/lib/rack/moneta_rest.rb +2 -2
  72. data/lib/rack/session/moneta.rb +3 -4
  73. data/moneta.gemspec +18 -4
  74. data/script/benchmarks +61 -34
  75. data/script/contributors +11 -6
  76. data/script/start-couchdb +27 -0
  77. data/script/start-hbase +3 -2
  78. data/script/start-services +3 -11
  79. data/spec/active_support/cache_moneta_store_spec.rb +30 -30
  80. data/spec/features/concurrent_create.rb +31 -10
  81. data/spec/features/concurrent_increment.rb +26 -19
  82. data/spec/features/create_expires.rb +15 -15
  83. data/spec/features/default_expires.rb +11 -12
  84. data/spec/features/expires.rb +215 -210
  85. data/spec/features/increment.rb +41 -41
  86. data/spec/features/store.rb +3 -3
  87. data/spec/helper.rb +21 -82
  88. data/spec/moneta/adapters/activerecord/standard_activerecord_spec.rb +1 -1
  89. data/spec/moneta/adapters/activerecord/standard_activerecord_with_expires_spec.rb +1 -1
  90. data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_spec.rb +4 -1
  91. data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_with_default_expires_spec.rb +4 -1
  92. data/spec/moneta/adapters/activesupportcache/standard_activesupportcache_spec.rb +14 -0
  93. data/spec/moneta/adapters/cassandra/standard_cassandra_spec.rb +1 -1
  94. data/spec/moneta/adapters/client/adapter_client_spec.rb +6 -6
  95. data/spec/moneta/adapters/client/client_helper.rb +24 -0
  96. data/spec/moneta/adapters/client/standard_client_tcp_spec.rb +8 -8
  97. data/spec/moneta/adapters/client/standard_client_unix_spec.rb +23 -7
  98. data/spec/moneta/adapters/couch/adapter_couch_spec.rb +199 -2
  99. data/spec/moneta/adapters/couch/standard_couch_spec.rb +9 -3
  100. data/spec/moneta/adapters/couch/standard_couch_with_expires_spec.rb +8 -2
  101. data/spec/moneta/adapters/daybreak/standard_daybreak_spec.rb +1 -1
  102. data/spec/moneta/adapters/daybreak/standard_daybreak_with_expires_spec.rb +1 -1
  103. data/spec/moneta/adapters/dbm/standard_dbm_spec.rb +1 -1
  104. data/spec/moneta/adapters/dbm/standard_dbm_with_expires_spec.rb +1 -1
  105. data/spec/moneta/adapters/faraday_helper.rb +9 -0
  106. data/spec/moneta/adapters/file/standard_file_spec.rb +2 -2
  107. data/spec/moneta/adapters/file/standard_file_with_expires_spec.rb +1 -1
  108. data/spec/moneta/adapters/gdbm/standard_gdbm_spec.rb +1 -1
  109. data/spec/moneta/adapters/gdbm/standard_gdbm_with_expires_spec.rb +1 -1
  110. data/spec/moneta/adapters/kyotocabinet/adapter_kyotocabinet_spec.rb +1 -1
  111. data/spec/moneta/adapters/kyotocabinet/standard_kyotocabinet_spec.rb +2 -2
  112. data/spec/moneta/adapters/kyotocabinet/standard_kyotocabinet_with_expires_spec.rb +2 -2
  113. data/spec/moneta/adapters/leveldb/standard_leveldb_spec.rb +1 -1
  114. data/spec/moneta/adapters/leveldb/standard_leveldb_with_expires_spec.rb +1 -1
  115. data/spec/moneta/adapters/lmdb/standard_lmdb_spec.rb +1 -1
  116. data/spec/moneta/adapters/lmdb/standard_lmdb_with_expires_spec.rb +1 -1
  117. data/spec/moneta/adapters/lruhash/adapter_lruhash_spec.rb +2 -2
  118. data/spec/moneta/adapters/lruhash/standard_lruhash_spec.rb +1 -1
  119. data/spec/moneta/adapters/lruhash/standard_lruhash_with_expires_spec.rb +1 -1
  120. data/spec/moneta/adapters/memcached/adapter_memcached_spec.rb +1 -1
  121. data/spec/moneta/adapters/memcached/dalli/adapter_memcached_dalli_spec.rb +1 -1
  122. data/spec/moneta/adapters/memcached/dalli/adapter_memcached_dalli_with_default_expires_spec.rb +1 -1
  123. data/spec/moneta/adapters/memcached/dalli/standard_memcached_dalli_spec.rb +1 -1
  124. data/spec/moneta/adapters/memcached/native/adapter_memcached_native_spec.rb +1 -1
  125. data/spec/moneta/adapters/memcached/native/adapter_memcached_native_with_default_expires_spec.rb +1 -1
  126. data/spec/moneta/adapters/memcached/native/standard_memcached_native_spec.rb +1 -1
  127. data/spec/moneta/adapters/memcached/standard_memcached_spec.rb +1 -1
  128. data/spec/moneta/adapters/{memcached/helper.rb → memcached_helper.rb} +0 -0
  129. data/spec/moneta/adapters/memory/standard_memory_spec.rb +1 -1
  130. data/spec/moneta/adapters/memory/standard_memory_with_compress_spec.rb +1 -1
  131. data/spec/moneta/adapters/memory/standard_memory_with_expires_spec.rb +1 -1
  132. data/spec/moneta/adapters/memory/standard_memory_with_json_key_serializer_spec.rb +1 -1
  133. data/spec/moneta/adapters/memory/standard_memory_with_json_serializer_spec.rb +1 -1
  134. data/spec/moneta/adapters/memory/standard_memory_with_json_value_serializer_spec.rb +2 -2
  135. data/spec/moneta/adapters/memory/standard_memory_with_prefix_spec.rb +39 -2
  136. data/spec/moneta/adapters/memory/standard_memory_with_snappy_compress_spec.rb +2 -2
  137. data/spec/moneta/adapters/mongo/adapter_mongo_spec.rb +32 -2
  138. data/spec/moneta/adapters/mongo/adapter_mongo_with_default_expires_spec.rb +5 -3
  139. data/spec/moneta/adapters/mongo/standard_mongo_spec.rb +2 -2
  140. data/spec/moneta/adapters/null/null_adapter_spec.rb +1 -1
  141. data/spec/moneta/adapters/pstore/standard_pstore_spec.rb +1 -1
  142. data/spec/moneta/adapters/pstore/standard_pstore_with_expires_spec.rb +1 -1
  143. data/spec/moneta/adapters/redis/standard_redis_spec.rb +1 -1
  144. data/spec/moneta/adapters/restclient/adapter_restclient_spec.rb +7 -5
  145. data/spec/moneta/adapters/restclient/helper.rb +12 -0
  146. data/spec/moneta/adapters/restclient/standard_restclient_spec.rb +9 -6
  147. data/spec/moneta/adapters/riak/standard_riak_with_expires_spec.rb +4 -0
  148. data/spec/moneta/adapters/sdbm/standard_sdbm_spec.rb +1 -1
  149. data/spec/moneta/adapters/sdbm/standard_sdbm_with_expires_spec.rb +1 -1
  150. data/spec/moneta/adapters/sequel/adapter_sequel_spec.rb +7 -34
  151. data/spec/moneta/adapters/sequel/helper.rb +37 -0
  152. data/spec/moneta/adapters/sequel/standard_sequel_spec.rb +5 -11
  153. data/spec/moneta/adapters/sequel/standard_sequel_with_expires_spec.rb +8 -9
  154. data/spec/moneta/adapters/sqlite/standard_sqlite_spec.rb +1 -1
  155. data/spec/moneta/adapters/sqlite/standard_sqlite_with_expires_spec.rb +1 -1
  156. data/spec/moneta/adapters/tdb/standard_tdb_spec.rb +1 -1
  157. data/spec/moneta/adapters/tdb/standard_tdb_with_expires_spec.rb +1 -1
  158. data/spec/moneta/adapters/tokyocabinet/standard_tokyocabinet_spec.rb +1 -1
  159. data/spec/moneta/adapters/tokyocabinet/standard_tokyocabinet_with_expires_spec.rb +1 -1
  160. data/spec/moneta/adapters/tokyotyrant/adapter_tokyotyrant_spec.rb +6 -2
  161. data/spec/moneta/adapters/tokyotyrant/helper.rb +12 -0
  162. data/spec/moneta/adapters/tokyotyrant/standard_tokyotyrant_spec.rb +5 -2
  163. data/spec/moneta/adapters/tokyotyrant/standard_tokyotyrant_with_expires_spec.rb +5 -1
  164. data/spec/moneta/adapters/yaml/standard_yaml_spec.rb +1 -1
  165. data/spec/moneta/adapters/yaml/standard_yaml_with_expires_spec.rb +1 -1
  166. data/spec/moneta/builder_spec.rb +22 -0
  167. data/spec/moneta/proxies/enumerable/enumerable_spec.rb +26 -0
  168. data/spec/moneta/proxies/expires/expires_file_spec.rb +1 -1
  169. data/spec/moneta/proxies/fallback/fallback_spec.rb +42 -0
  170. data/spec/moneta/proxies/pool/pool_spec.rb +319 -6
  171. data/spec/moneta/proxies/shared/shared_tcp_spec.rb +14 -4
  172. data/spec/moneta/proxies/shared/shared_unix_spec.rb +14 -4
  173. data/spec/moneta/proxies/transformer/transformer_bencode_spec.rb +1 -1
  174. data/spec/moneta/proxies/transformer/transformer_bert_spec.rb +3 -3
  175. data/spec/moneta/proxies/transformer/transformer_bson_spec.rb +2 -2
  176. data/spec/moneta/proxies/transformer/transformer_json_spec.rb +1 -1
  177. data/spec/moneta/proxies/transformer/transformer_key_marshal_spec.rb +1 -1
  178. data/spec/moneta/proxies/transformer/transformer_key_yaml_spec.rb +1 -1
  179. data/spec/moneta/proxies/transformer/transformer_marshal_base64_spec.rb +1 -1
  180. data/spec/moneta/proxies/transformer/transformer_marshal_escape_spec.rb +8 -4
  181. data/spec/moneta/proxies/transformer/transformer_marshal_hex_spec.rb +1 -1
  182. data/spec/moneta/proxies/transformer/transformer_marshal_hmac_spec.rb +1 -1
  183. data/spec/moneta/proxies/transformer/transformer_marshal_prefix_base64_spec.rb +33 -0
  184. data/spec/moneta/proxies/transformer/transformer_marshal_prefix_spec.rb +1 -1
  185. data/spec/moneta/proxies/transformer/transformer_marshal_qp_spec.rb +1 -1
  186. data/spec/moneta/proxies/transformer/transformer_marshal_spec.rb +1 -1
  187. data/spec/moneta/proxies/transformer/transformer_marshal_urlsafe_base64_spec.rb +1 -1
  188. data/spec/moneta/proxies/transformer/transformer_marshal_uuencode_spec.rb +1 -1
  189. data/spec/moneta/proxies/transformer/transformer_msgpack_spec.rb +1 -1
  190. data/spec/moneta/proxies/transformer/transformer_ox_spec.rb +1 -1
  191. data/spec/moneta/proxies/transformer/transformer_php_spec.rb +1 -1
  192. data/spec/moneta/proxies/transformer/transformer_tnet_spec.rb +1 -1
  193. data/spec/moneta/proxies/transformer/transformer_yaml_spec.rb +2 -2
  194. data/spec/moneta/proxies/weak_each_key/weak_each_key_spec.rb +0 -2
  195. data/spec/restserver.rb +55 -0
  196. metadata +136 -32
  197. data/lib/moneta/adapters/mongo/base.rb +0 -103
  198. data/lib/moneta/adapters/mongo/moped.rb +0 -164
  199. data/lib/moneta/adapters/mongo/official.rb +0 -157
  200. data/script/install-kyotocabinet +0 -17
  201. data/spec/moneta/adapters/mongo/adapter_mongo_moped_spec.rb +0 -25
  202. data/spec/moneta/adapters/mongo/adapter_mongo_moped_with_default_expires_spec.rb +0 -12
  203. data/spec/moneta/adapters/mongo/adapter_mongo_official_spec.rb +0 -25
  204. data/spec/moneta/adapters/mongo/adapter_mongo_official_with_default_expires_spec.rb +0 -12
  205. data/spec/moneta/adapters/mongo/standard_mongo_moped_spec.rb +0 -7
  206. data/spec/moneta/adapters/mongo/standard_mongo_official_spec.rb +0 -7
  207. data/spec/quality_spec.rb +0 -51
@@ -1,72 +1,72 @@
1
1
  shared_examples :increment do
2
2
  it 'initializes in #increment with 1' do
3
- store.key?('inckey').should be false
4
- store.increment('inckey').should == 1
5
- store.key?('inckey').should be true
6
- store.raw['inckey'].should == '1'
7
- store.raw.load('inckey').should == '1'
8
- store.load('inckey', raw: true).should == '1'
3
+ expect(store.key?('inckey')).to be false
4
+ expect(store.increment('inckey')).to eq 1
5
+ expect(store.key?('inckey')).to be true
6
+ expect(store.raw['inckey'].to_s).to match(/^1\b/)
7
+ expect(store.raw.load('inckey').to_s).to match(/^1\b/)
8
+ expect(store.load('inckey', raw: true).to_s).to match(/^1\b/)
9
9
 
10
- store.delete('inckey', raw: true).should == '1'
11
- store.key?('inckey').should be false
10
+ expect(store.delete('inckey', raw: true).to_s).to match(/^1\b/)
11
+ expect(store.key?('inckey')).to be false
12
12
  end
13
13
 
14
14
  it 'initializes in #increment with higher value' do
15
- store.increment('inckey', 42).should == 42
16
- store.key?('inckey').should be true
17
- store.raw['inckey'].should == '42'
18
- store.delete('inckey', raw: true).should == '42'
15
+ expect(store.increment('inckey', 42)).to eq 42
16
+ expect(store.key?('inckey')).to be true
17
+ expect(store.raw['inckey'].to_s).to match(/^42\b/)
18
+ expect(store.delete('inckey', raw: true).to_s).to match(/^42\b/)
19
19
  end
20
20
 
21
21
  it 'initializes in #increment with 0' do
22
- store.increment('inckey', 0).should == 0
23
- store.key?('inckey').should be true
24
- store.raw['inckey'].should == '0'
25
- store.delete('inckey', raw: true).should == '0'
22
+ expect(store.increment('inckey', 0)).to eq 0
23
+ expect(store.key?('inckey')).to be true
24
+ expect(store.raw['inckey'].to_s).to match(/^0\b/)
25
+ expect(store.delete('inckey', raw: true).to_s).to match(/^0\b/)
26
26
  end
27
27
 
28
28
  it 'initializes in #decrement with 0' do
29
- store.decrement('inckey', 0).should == 0
30
- store.raw['inckey'].should == '0'
29
+ expect(store.decrement('inckey', 0)).to eq 0
30
+ expect(store.raw['inckey'].to_s).to match(/^0\b/)
31
31
  end
32
32
 
33
33
  it 'initializes in #decrement with negative value' do
34
- store.decrement('inckey', -42).should == 42
35
- store.raw['inckey'].should == '42'
34
+ expect(store.decrement('inckey', -42)).to eq 42
35
+ expect(store.raw['inckey'].to_s).to match(/^42\b/)
36
36
  end
37
37
 
38
38
  it 'supports incrementing existing value by value' do
39
- store.increment('inckey').should == 1
40
- store.increment('inckey', 42).should == 43
41
- store.raw['inckey'].should == '43'
39
+ expect(store.increment('inckey')).to eq 1
40
+ expect(store.increment('inckey', 42)).to eq 43
41
+ expect(store.raw['inckey'].to_s).to match(/^43\b/)
42
42
  end
43
43
 
44
44
  it 'supports decrementing existing value by value' do
45
- store.increment('inckey').should == 1
46
- store.decrement('inckey').should == 0
47
- store.increment('inckey', 42).should == 42
48
- store.decrement('inckey', 2).should == 40
49
- store.raw['inckey'].should == '40'
45
+ expect(store.increment('inckey')).to eq 1
46
+ expect(store.decrement('inckey')).to eq 0
47
+ expect(store.increment('inckey', 42)).to eq 42
48
+ expect(store.decrement('inckey', 2)).to eq 40
49
+ expect(store.raw['inckey'].to_s).to match(/^40\b/)
50
50
  end
51
51
 
52
52
  it 'supports incrementing existing value by 0' do
53
- store.increment('inckey').should == 1
54
- store.increment('inckey', 0).should == 1
55
- store.raw['inckey'].should == '1'
53
+ expect(store.increment('inckey')).to eq 1
54
+ expect(store.increment('inckey', 0)).to eq 1
55
+ expect(store.raw['inckey'].to_s).to match(/^1\b/)
56
56
  end
57
57
 
58
58
  it 'supports decrementing existing value' do
59
- store.increment('inckey', 10).should == 10
60
- store.increment('inckey', -5).should == 5
61
- store.raw['inckey'].should == '5'
62
- store.increment('inckey', -5).should == 0
63
- store.raw['inckey'].should == '0'
59
+ expect(store.increment('inckey', 10)).to eq 10
60
+ expect(store.increment('inckey', -5)).to eq 5
61
+ expect(store.raw['inckey'].to_s).to match(/^5\b/)
62
+ expect(store.increment('inckey', -5)).to eq 0
63
+ expect(store.raw['inckey'].to_s).to match(/^0\b/)
64
64
  end
65
65
 
66
66
  it 'interprets raw value as integer' do
67
67
  store.store('inckey', '42', raw: true)
68
- store.increment('inckey').should == 43
69
- store.raw['inckey'].should == '43'
68
+ expect(store.increment('inckey')).to eq 43
69
+ expect(store.raw['inckey'].to_s).to match(/^43\b/)
70
70
  end
71
71
 
72
72
  it 'raises error in #increment on non integer value' do
@@ -88,10 +88,10 @@ shared_examples :increment do
88
88
  b = Moneta::Semaphore.new(store, 'semaphore', 2)
89
89
  c = Moneta::Semaphore.new(store, 'semaphore', 2)
90
90
  a.synchronize do
91
- a.locked?.should be true
91
+ expect(a.locked?).to be true
92
92
  b.synchronize do
93
- b.locked?.should be true
94
- c.try_lock.should be false
93
+ expect(b.locked?).to be true
94
+ expect(c.try_lock).to be false
95
95
  end
96
96
  end
97
97
  end
@@ -178,7 +178,7 @@ shared_examples :store do
178
178
  shared_examples :merge! do
179
179
  it 'stores values' do
180
180
  moneta_property_of(keys: 3, values: 3).check do |keys:, values:|
181
- expect(store.public_send(method, pairs.call(keys[0] => values[0], keys[1] => values[1], keys[2] => values[2]))).to be store
181
+ expect(store.public_send(method, pairs.call({ keys[0] => values[0], keys[1] => values[1], keys[2] => values[2] }))).to be store
182
182
  expect(store.key?(keys[0])).to be true
183
183
  expect(store[keys[0]]).to eq values[0]
184
184
  expect(store.key?(keys[1])).to be true
@@ -192,7 +192,7 @@ shared_examples :store do
192
192
  it 'overwrites existing values' do
193
193
  moneta_property_of(keys: 2, values: 3).check do |keys:, values:|
194
194
  expect(store[keys[0]] = values[0]).to eq values[0]
195
- expect(store.public_send(method, pairs.call(keys[0] => values[1], keys[1] => values[2]))).to be store
195
+ expect(store.public_send(method, pairs.call({ keys[0] => values[1], keys[1] => values[2] }))).to be store
196
196
  expect(store.key?(keys[0])).to be true
197
197
  expect(store[keys[0]]).to eq values[1]
198
198
  expect(store.key?(keys[1])).to be true
@@ -204,7 +204,7 @@ shared_examples :store do
204
204
  it 'stores the return value of the block, if given, for keys that will be overwritten' do
205
205
  moneta_property_of(keys: 2, values: 4).check do |keys:, values:|
206
206
  expect(store[keys[0]] = values[0]).to eq values[0]
207
- expect(store.public_send(method, pairs.call(keys[0] => values[1], keys[1] => values[2])) do |key, old_val, new_val|
207
+ expect(store.public_send(method, pairs.call({ keys[0] => values[1], keys[1] => values[2] })) do |key, old_val, new_val|
208
208
  expect(key).to eq keys[0]
209
209
  expect(old_val).to eq values[0]
210
210
  expect(new_val).to eq values[1]
@@ -262,13 +262,16 @@ module MonetaHelpers
262
262
  # want to run the tests but don't want to grant root access to moneta
263
263
  let(:mysql_username) { ENV['MONETA_MYSQL_USERNAME'] || 'root' }
264
264
  let(:mysql_password) { ENV['MONETA_MYSQL_PASSWORD'] }
265
- let(:mysql_database1) { ENV['MONETA_MYSQL_DATABSASE1'] || 'moneta' }
266
- let(:mysql_database2) { ENV['MONETA_MYSQL_DATABSASE2'] || 'moneta2' }
265
+ let(:mysql_database1) { ENV['MONETA_MYSQL_DATABASE1'] || 'moneta' }
266
+ let(:mysql_database2) { ENV['MONETA_MYSQL_DATABASE2'] || 'moneta2' }
267
267
 
268
268
  let(:postgres_username) { ENV['MONETA_POSTGRES_USERNAME'] || 'postgres' }
269
269
  let(:postgres_database1) { ENV['MONETA_POSTGRES_DATABSASE1'] || 'moneta1' }
270
270
  let(:postgres_database2) { ENV['MONETA_POSTGRES_DATABSASE1'] || 'moneta2' }
271
271
 
272
+ let(:couch_login) { ENV['COUCH_LOGIN'] || 'admin' }
273
+ let(:couch_password) { ENV['COUCH_PASSWORD'] || 'password' }
274
+
272
275
  before do
273
276
  store = new_store
274
277
  store.clear
@@ -282,36 +285,9 @@ module MonetaHelpers
282
285
  end
283
286
  end
284
287
 
285
- # Used to test time-dependent specs (e.g. expiry at different positions
286
- # within a second). Once close to the start of the second, and once close
287
- # to the end.
288
- def usecs
289
- [1e4, 99e4].map(&:to_i)
290
- end
291
-
292
- def at_each_usec(&block)
293
- usecs.each do |usec|
294
- context "at #{usec} microseconds", isolate: true do
295
- include_examples :at_usec, usec, &block
296
- end
297
- end
298
- end
299
-
300
288
  def use_timecop
301
- before{ @timecop = true }
302
- end
303
-
304
- def start_memcached(port)
305
- before :context do
306
- @memcached = spawn("memcached -p #{port}")
307
- sleep 0.5
308
- end
309
-
310
- after :context do
311
- Process.kill("TERM", @memcached)
312
- Process.wait(@memcached)
313
- @memcached = nil
314
- end
289
+ before { @timecop = true }
290
+ after { Timecop.return }
315
291
  end
316
292
  end
317
293
 
@@ -336,41 +312,6 @@ module MonetaHelpers
336
312
  end
337
313
  end
338
314
 
339
- def start_restserver
340
- require 'rack'
341
- require 'webrick'
342
- require 'rack/moneta_rest'
343
-
344
- # Keep webrick quiet
345
- ::WEBrick::HTTPServer.class_eval do
346
- def access_log(config, req, res); end
347
- end
348
- ::WEBrick::BasicLog.class_eval do
349
- def log(level, data); end
350
- end
351
-
352
- Thread.start do
353
- Rack::Server.start(:app => Rack::Builder.app do
354
- use Rack::Lint
355
- map '/moneta' do
356
- run Rack::MonetaRest.new(:store => :Memory)
357
- end
358
- end,
359
- :environment => :none,
360
- :server => :webrick,
361
- :Port => 8808)
362
- end
363
- sleep 1
364
- end
365
-
366
- def start_server(*args)
367
- server = Moneta::Server.new(*args)
368
- Thread.new { server.run }
369
- sleep 0.1 until server.running?
370
- rescue Exception => ex
371
- puts "Failed to start server - #{ex.message}"
372
- end
373
-
374
315
  def moneta_property_of(keys: 0, values: 0)
375
316
  keys_meta = self.keys_meta
376
317
  values_meta = self.values_meta
@@ -395,6 +336,20 @@ module MonetaHelpers
395
336
  sleep seconds
396
337
  end
397
338
  end
339
+
340
+ def time_till_next(tick)
341
+ now = Time.now.to_f
342
+ tick - (now % tick)
343
+ end
344
+
345
+ # advance to the moment just after a tick. 1e-2 is needed in some
346
+ # environments (JRuby) to be able to pass the "not in earlier half" test.
347
+ def advance_next_tick
348
+ tick = t_res
349
+ offset = time_till_next(tick) + 1e-2
350
+ advance offset
351
+ raise "not in earlier half of tick" unless Time.now.to_f % tick < tick / 2.0
352
+ end
398
353
  end
399
354
  end
400
355
 
@@ -475,20 +430,4 @@ RSpec.shared_context :setup_moneta_store do |builder|
475
430
  end
476
431
  end
477
432
 
478
- RSpec.shared_examples :at_usec do |usec|
479
- before do
480
- now = Time.now
481
- # 1000us is a rough guess at how many microseconds this code will take to run
482
- if now.usec + 1000 > usec
483
- advance(1 - 1e-6 * (now.usec - usec))
484
- else
485
- advance(1e-6 * (usec - now.usec))
486
- end
487
- end
488
-
489
- after do
490
- Timecop.return if @timecop
491
- end
492
- end
493
-
494
433
  Dir['./spec/features/*.rb'].each{ |rb| require rb }
@@ -14,5 +14,5 @@ describe "standard_activerecord", adapter: :ActiveRecord do
14
14
  ::Marshal.load(value.unpack('m').first)
15
15
  end
16
16
 
17
- moneta_specs STANDARD_SPECS
17
+ moneta_specs STANDARD_SPECS.with_each_key
18
18
  end
@@ -20,5 +20,5 @@ describe "standard_activerecord_with_expires", adapter: :ActiveRecord do
20
20
  ::Marshal.load(value.unpack('m').first)
21
21
  end
22
22
 
23
- moneta_specs STANDARD_SPECS.with_expires
23
+ moneta_specs STANDARD_SPECS.with_expires.with_each_key
24
24
  end
@@ -1,3 +1,5 @@
1
+ require_relative '../memcached_helper.rb'
2
+
1
3
  describe 'adapter_activesupportcache', adapter: :ActiveSupportCache do
2
4
  before :all do
3
5
  require 'active_support'
@@ -25,7 +27,8 @@ describe 'adapter_activesupportcache', adapter: :ActiveSupportCache do
25
27
  let(:t_res) { 1 }
26
28
  let(:min_ttl) { 2 }
27
29
  use_timecop
28
- start_memcached 11215
30
+
31
+ include_context :start_memcached, 11215
29
32
 
30
33
  let(:backend) { ActiveSupport::Cache::MemCacheStore.new('127.0.0.1:11215') }
31
34
  include_examples :adapter_activesupportcache
@@ -1,3 +1,5 @@
1
+ require_relative '../memcached_helper'
2
+
1
3
  describe 'adapter_activesupportcache_with_default_expires', adapter: :ActiveSupportCache do
2
4
  before :all do
3
5
  require 'active_support'
@@ -25,7 +27,8 @@ describe 'adapter_activesupportcache_with_default_expires', adapter: :ActiveSupp
25
27
  let(:t_res) { 1 }
26
28
  let(:min_ttl) { 2 }
27
29
  use_timecop
28
- start_memcached 11223
30
+
31
+ include_context :start_memcached, 11223
29
32
 
30
33
  let(:backend) { ActiveSupport::Cache::MemCacheStore.new('127.0.0.1:11223') }
31
34
  include_examples :adapter_activesupportcache_with_default_expires
@@ -0,0 +1,14 @@
1
+ describe 'standard_activesupportcache' do
2
+ before :context do
3
+ require 'active_support'
4
+ end
5
+
6
+ let(:t_res) { 0.1 }
7
+ let(:min_ttl) { 0.1 }
8
+
9
+ moneta_store :ActiveSupportCache do
10
+ { backend: ActiveSupport::Cache::MemoryStore.new }
11
+ end
12
+
13
+ moneta_specs STANDARD_SPECS.without_create.without_persist.with_native_expires
14
+ end
@@ -14,5 +14,5 @@ describe "standard_cassandra", retry: 3, adapter: :Cassandra do
14
14
  }
15
15
  end
16
16
 
17
- moneta_specs STANDARD_SPECS.without_increment.without_create.with_native_expires
17
+ moneta_specs STANDARD_SPECS.without_increment.without_create.with_native_expires.with_each_key
18
18
  end
@@ -1,11 +1,11 @@
1
- describe 'adapter_client', isolate: true, adapter: :Client do
2
- before :all do
3
- start_server(Moneta::Adapters::Memory.new)
4
- end
1
+ require_relative './client_helper.rb'
2
+
3
+ describe 'adapter_client', adapter: :Client do
4
+ include_context :start_server, port: 9002, backend: ->{ Moneta::Adapters::Memory.new }
5
5
 
6
6
  moneta_build do
7
- Moneta::Adapters::Client.new
7
+ Moneta::Adapters::Client.new(port: 9002)
8
8
  end
9
9
 
10
- moneta_specs ADAPTER_SPECS
10
+ moneta_specs ADAPTER_SPECS.with_each_key
11
11
  end
@@ -0,0 +1,24 @@
1
+ RSpec.shared_context :start_server do |**options|
2
+ before :context do
3
+ begin
4
+ options.each do |key, value|
5
+ options[key] = instance_exec(&value) if value.respond_to? :call
6
+ end
7
+ backend = options.delete(:backend)
8
+ @server = Moneta::Server.new(backend, options)
9
+ @thread = Thread.new { @server.run }
10
+ sleep 0.1 until @server.running?
11
+ rescue Exception => ex
12
+ puts "Failed to start server - #{ex.message}"
13
+ tries ||= 0
14
+ tries += 1
15
+ sleep Moneta::Server::TIMEOUT
16
+ tries < 3 ? retry : raise
17
+ end
18
+ end
19
+
20
+ after :context do
21
+ @server.stop
22
+ @thread.join
23
+ end
24
+ end
@@ -1,17 +1,17 @@
1
- describe "standard_client_tcp", isolate: true, adapter: :Client do
2
- before :all do
3
- start_server(Moneta::Adapters::Memory.new)
4
- end
1
+ require_relative './client_helper.rb'
2
+
3
+ describe "standard_client_tcp", adapter: :Client do
4
+ include_context :start_server, port: 9003, backend: ->{ Moneta::Adapters::Memory.new }
5
5
 
6
- moneta_store :Client
7
- moneta_specs STANDARD_SPECS
6
+ moneta_store :Client, port: 9003
7
+ moneta_specs STANDARD_SPECS.with_each_key
8
8
 
9
9
  it 'supports multiple clients' do
10
10
  store['shared_key'] = 'shared_val'
11
- threads = (1..100).map do |i|
11
+ threads = (1..32).map do |i|
12
12
  Thread.new do
13
13
  client = new_store
14
- (1..100).each do |j|
14
+ (1..31).each do |j|
15
15
  client['shared_key'].should == 'shared_val'
16
16
  client["key-\#{j}-\#{i}"] = "val-\#{j}-\#{i}"
17
17
  client["key-\#{j}-\#{i}"].should == "val-\#{j}-\#{i}"
@@ -1,12 +1,28 @@
1
- describe "standard_client_unix", isolate: true, adapter: :Client do
2
- before :all do
3
- start_server Moneta::Adapters::Memory.new,
4
- socket: File.join(tempdir, 'standard_client_unix')
5
- end
1
+ require_relative './client_helper.rb'
2
+
3
+ describe "standard_client_unix", adapter: :Client do
4
+ include_context :start_server,
5
+ backend: ->{ Moneta::Adapters::Memory.new },
6
+ socket: ->{ File.join(tempdir, 'standard_client_unix') }
6
7
 
7
8
  moneta_store :Client do
8
- {socket: File.join(tempdir, 'standard_client_unix')}
9
+ { socket: File.join(tempdir, 'standard_client_unix') }
9
10
  end
10
11
 
11
- moneta_specs STANDARD_SPECS
12
+ moneta_specs STANDARD_SPECS.with_each_key
13
+
14
+ it 'supports multiple clients' do
15
+ store['shared_key'] = 'shared_val'
16
+ threads = (1..32).map do |i|
17
+ Thread.new do
18
+ client = new_store
19
+ (1..31).each do |j|
20
+ client['shared_key'].should == 'shared_val'
21
+ client["key-\#{j}-\#{i}"] = "val-\#{j}-\#{i}"
22
+ client["key-\#{j}-\#{i}"].should == "val-\#{j}-\#{i}"
23
+ end
24
+ end
25
+ end
26
+ threads.map(&:join)
27
+ end
12
28
  end