moneta 1.2.0 → 1.4.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (166) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +418 -0
  3. data/.gitignore +2 -0
  4. data/.rubocop.yml +27 -9
  5. data/CHANGES +28 -0
  6. data/CONTRIBUTORS +4 -2
  7. data/Gemfile +12 -8
  8. data/README.md +20 -18
  9. data/feature_matrix.yaml +2 -11
  10. data/lib/moneta.rb +9 -9
  11. data/lib/moneta/adapters/client.rb +56 -19
  12. data/lib/moneta/adapters/couch.rb +5 -0
  13. data/lib/moneta/adapters/mongo.rb +264 -7
  14. data/lib/moneta/adapters/redis.rb +5 -1
  15. data/lib/moneta/adapters/sequel.rb +45 -464
  16. data/lib/moneta/adapters/sequel/mysql.rb +66 -0
  17. data/lib/moneta/adapters/sequel/postgres.rb +80 -0
  18. data/lib/moneta/adapters/sequel/postgres_hstore.rb +240 -0
  19. data/lib/moneta/adapters/sequel/sqlite.rb +57 -0
  20. data/lib/moneta/adapters/sqlite.rb +7 -7
  21. data/lib/moneta/builder.rb +2 -2
  22. data/lib/moneta/create_support.rb +21 -0
  23. data/lib/moneta/dbm_adapter.rb +31 -0
  24. data/lib/moneta/{mixins.rb → defaults.rb} +1 -302
  25. data/lib/moneta/each_key_support.rb +27 -0
  26. data/lib/moneta/expires_support.rb +60 -0
  27. data/lib/moneta/hash_adapter.rb +68 -0
  28. data/lib/moneta/increment_support.rb +16 -0
  29. data/lib/moneta/lock.rb +6 -1
  30. data/lib/moneta/nil_values.rb +35 -0
  31. data/lib/moneta/option_support.rb +51 -0
  32. data/lib/moneta/pool.rb +38 -6
  33. data/lib/moneta/proxy.rb +1 -1
  34. data/lib/moneta/server.rb +215 -61
  35. data/lib/moneta/shared.rb +13 -7
  36. data/lib/moneta/transformer.rb +50 -8
  37. data/lib/moneta/transformer/config.rb +59 -40
  38. data/lib/moneta/transformer/helper.rb +2 -2
  39. data/lib/moneta/transformer/helper/bson.rb +5 -15
  40. data/lib/moneta/version.rb +1 -1
  41. data/lib/rack/cache/moneta.rb +14 -15
  42. data/moneta.gemspec +14 -8
  43. data/script/benchmarks +7 -3
  44. data/script/contributors +11 -6
  45. data/script/start-couchdb +27 -0
  46. data/script/start-hbase +2 -2
  47. data/script/start-services +3 -3
  48. data/spec/active_support/cache_moneta_store_spec.rb +37 -39
  49. data/spec/features/concurrent_increment.rb +2 -3
  50. data/spec/features/create_expires.rb +15 -15
  51. data/spec/features/default_expires.rb +11 -12
  52. data/spec/features/expires.rb +215 -210
  53. data/spec/features/store.rb +3 -3
  54. data/spec/helper.rb +33 -41
  55. data/spec/moneta/adapters/activerecord/adapter_activerecord_existing_connection_spec.rb +3 -1
  56. data/spec/moneta/adapters/activerecord/adapter_activerecord_spec.rb +15 -7
  57. data/spec/moneta/adapters/activerecord/standard_activerecord_spec.rb +6 -3
  58. data/spec/moneta/adapters/activerecord/standard_activerecord_with_expires_spec.rb +6 -3
  59. data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_spec.rb +3 -3
  60. data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_with_default_expires_spec.rb +2 -2
  61. data/spec/moneta/adapters/cassandra/standard_cassandra_spec.rb +1 -1
  62. data/spec/moneta/adapters/client/adapter_client_spec.rb +6 -6
  63. data/spec/moneta/adapters/client/client_helper.rb +24 -0
  64. data/spec/moneta/adapters/client/standard_client_tcp_spec.rb +8 -8
  65. data/spec/moneta/adapters/client/standard_client_unix_spec.rb +23 -7
  66. data/spec/moneta/adapters/couch/adapter_couch_spec.rb +1 -1
  67. data/spec/moneta/adapters/couch/standard_couch_spec.rb +2 -2
  68. data/spec/moneta/adapters/couch/standard_couch_with_expires_spec.rb +2 -2
  69. data/spec/moneta/adapters/datamapper/adapter_datamapper_spec.rb +25 -8
  70. data/spec/moneta/adapters/datamapper/standard_datamapper_spec.rb +2 -2
  71. data/spec/moneta/adapters/datamapper/standard_datamapper_with_expires_spec.rb +2 -2
  72. data/spec/moneta/adapters/datamapper/standard_datamapper_with_repository_spec.rb +2 -2
  73. data/spec/moneta/adapters/daybreak/standard_daybreak_spec.rb +1 -1
  74. data/spec/moneta/adapters/daybreak/standard_daybreak_with_expires_spec.rb +1 -1
  75. data/spec/moneta/adapters/dbm/standard_dbm_spec.rb +1 -1
  76. data/spec/moneta/adapters/dbm/standard_dbm_with_expires_spec.rb +1 -1
  77. data/spec/moneta/adapters/file/standard_file_spec.rb +2 -2
  78. data/spec/moneta/adapters/file/standard_file_with_expires_spec.rb +1 -1
  79. data/spec/moneta/adapters/gdbm/standard_gdbm_spec.rb +1 -1
  80. data/spec/moneta/adapters/gdbm/standard_gdbm_with_expires_spec.rb +1 -1
  81. data/spec/moneta/adapters/kyotocabinet/adapter_kyotocabinet_spec.rb +1 -1
  82. data/spec/moneta/adapters/kyotocabinet/standard_kyotocabinet_spec.rb +2 -2
  83. data/spec/moneta/adapters/kyotocabinet/standard_kyotocabinet_with_expires_spec.rb +2 -2
  84. data/spec/moneta/adapters/leveldb/standard_leveldb_spec.rb +1 -1
  85. data/spec/moneta/adapters/leveldb/standard_leveldb_with_expires_spec.rb +1 -1
  86. data/spec/moneta/adapters/lmdb/standard_lmdb_spec.rb +1 -1
  87. data/spec/moneta/adapters/lmdb/standard_lmdb_with_expires_spec.rb +1 -1
  88. data/spec/moneta/adapters/lruhash/standard_lruhash_spec.rb +1 -1
  89. data/spec/moneta/adapters/lruhash/standard_lruhash_with_expires_spec.rb +1 -1
  90. data/spec/moneta/adapters/memcached/dalli/adapter_memcached_dalli_spec.rb +13 -3
  91. data/spec/moneta/adapters/memcached/native/adapter_memcached_native_spec.rb +13 -3
  92. data/spec/moneta/adapters/memory/standard_memory_spec.rb +1 -1
  93. data/spec/moneta/adapters/memory/standard_memory_with_compress_spec.rb +1 -1
  94. data/spec/moneta/adapters/memory/standard_memory_with_expires_spec.rb +1 -1
  95. data/spec/moneta/adapters/memory/standard_memory_with_json_key_serializer_spec.rb +1 -1
  96. data/spec/moneta/adapters/memory/standard_memory_with_json_serializer_spec.rb +1 -1
  97. data/spec/moneta/adapters/memory/standard_memory_with_json_value_serializer_spec.rb +2 -2
  98. data/spec/moneta/adapters/memory/standard_memory_with_prefix_spec.rb +39 -2
  99. data/spec/moneta/adapters/memory/standard_memory_with_snappy_compress_spec.rb +2 -2
  100. data/spec/moneta/adapters/mongo/adapter_mongo_spec.rb +32 -2
  101. data/spec/moneta/adapters/mongo/adapter_mongo_with_default_expires_spec.rb +6 -4
  102. data/spec/moneta/adapters/mongo/standard_mongo_spec.rb +2 -2
  103. data/spec/moneta/adapters/pstore/standard_pstore_spec.rb +1 -1
  104. data/spec/moneta/adapters/pstore/standard_pstore_with_expires_spec.rb +1 -1
  105. data/spec/moneta/adapters/redis/adapter_redis_spec.rb +13 -3
  106. data/spec/moneta/adapters/redis/standard_redis_spec.rb +9 -2
  107. data/spec/moneta/adapters/sdbm/standard_sdbm_spec.rb +1 -1
  108. data/spec/moneta/adapters/sdbm/standard_sdbm_with_expires_spec.rb +1 -1
  109. data/spec/moneta/adapters/sequel/adapter_sequel_spec.rb +11 -38
  110. data/spec/moneta/adapters/sequel/helper.rb +42 -0
  111. data/spec/moneta/adapters/sequel/standard_sequel_spec.rb +6 -12
  112. data/spec/moneta/adapters/sequel/standard_sequel_with_expires_spec.rb +9 -10
  113. data/spec/moneta/adapters/sqlite/adapter_sqlite_spec.rb +1 -1
  114. data/spec/moneta/adapters/sqlite/standard_sqlite_spec.rb +2 -2
  115. data/spec/moneta/adapters/sqlite/standard_sqlite_with_expires_spec.rb +2 -2
  116. data/spec/moneta/adapters/tdb/standard_tdb_spec.rb +1 -1
  117. data/spec/moneta/adapters/tdb/standard_tdb_with_expires_spec.rb +1 -1
  118. data/spec/moneta/adapters/tokyocabinet/standard_tokyocabinet_spec.rb +1 -1
  119. data/spec/moneta/adapters/tokyocabinet/standard_tokyocabinet_with_expires_spec.rb +1 -1
  120. data/spec/moneta/adapters/yaml/standard_yaml_spec.rb +1 -1
  121. data/spec/moneta/adapters/yaml/standard_yaml_with_expires_spec.rb +1 -1
  122. data/spec/moneta/builder_spec.rb +22 -0
  123. data/spec/moneta/proxies/expires/expires_file_spec.rb +1 -1
  124. data/spec/moneta/proxies/pool/pool_spec.rb +31 -3
  125. data/spec/moneta/proxies/shared/shared_tcp_spec.rb +14 -4
  126. data/spec/moneta/proxies/shared/shared_unix_spec.rb +14 -4
  127. data/spec/moneta/proxies/transformer/transformer_bencode_spec.rb +1 -1
  128. data/spec/moneta/proxies/transformer/transformer_bert_spec.rb +3 -3
  129. data/spec/moneta/proxies/transformer/transformer_bson_spec.rb +2 -2
  130. data/spec/moneta/proxies/transformer/transformer_json_spec.rb +1 -1
  131. data/spec/moneta/proxies/transformer/transformer_key_marshal_spec.rb +1 -1
  132. data/spec/moneta/proxies/transformer/transformer_key_yaml_spec.rb +1 -1
  133. data/spec/moneta/proxies/transformer/transformer_marshal_base64_spec.rb +1 -1
  134. data/spec/moneta/proxies/transformer/transformer_marshal_escape_spec.rb +8 -4
  135. data/spec/moneta/proxies/transformer/transformer_marshal_hex_spec.rb +1 -1
  136. data/spec/moneta/proxies/transformer/transformer_marshal_hmac_spec.rb +1 -1
  137. data/spec/moneta/proxies/transformer/transformer_marshal_prefix_base64_spec.rb +33 -0
  138. data/spec/moneta/proxies/transformer/transformer_marshal_prefix_spec.rb +1 -1
  139. data/spec/moneta/proxies/transformer/transformer_marshal_qp_spec.rb +1 -1
  140. data/spec/moneta/proxies/transformer/transformer_marshal_spec.rb +1 -1
  141. data/spec/moneta/proxies/transformer/transformer_marshal_urlsafe_base64_spec.rb +1 -1
  142. data/spec/moneta/proxies/transformer/transformer_marshal_uuencode_spec.rb +1 -1
  143. data/spec/moneta/proxies/transformer/transformer_msgpack_spec.rb +1 -1
  144. data/spec/moneta/proxies/transformer/transformer_ox_spec.rb +1 -1
  145. data/spec/moneta/proxies/transformer/transformer_php_spec.rb +1 -1
  146. data/spec/moneta/proxies/transformer/transformer_tnet_spec.rb +1 -1
  147. data/spec/moneta/proxies/transformer/transformer_yaml_spec.rb +2 -2
  148. data/spec/moneta/proxies/weak_each_key/weak_each_key_spec.rb +0 -2
  149. data/spec/restserver.rb +15 -0
  150. metadata +47 -66
  151. data/.travis.yml +0 -140
  152. data/lib/moneta/adapters/mongo/base.rb +0 -103
  153. data/lib/moneta/adapters/mongo/moped.rb +0 -163
  154. data/lib/moneta/adapters/mongo/official.rb +0 -156
  155. data/script/reconfigure-couchdb +0 -13
  156. data/spec/moneta/adapters/memcached/dalli/adapter_memcached_dalli_with_default_expires_spec.rb +0 -15
  157. data/spec/moneta/adapters/memcached/native/adapter_memcached_native_with_default_expires_spec.rb +0 -15
  158. data/spec/moneta/adapters/mongo/adapter_mongo_moped_spec.rb +0 -25
  159. data/spec/moneta/adapters/mongo/adapter_mongo_moped_with_default_expires_spec.rb +0 -12
  160. data/spec/moneta/adapters/mongo/adapter_mongo_official_spec.rb +0 -25
  161. data/spec/moneta/adapters/mongo/adapter_mongo_official_with_default_expires_spec.rb +0 -12
  162. data/spec/moneta/adapters/mongo/standard_mongo_moped_spec.rb +0 -7
  163. data/spec/moneta/adapters/mongo/standard_mongo_official_spec.rb +0 -7
  164. data/spec/moneta/adapters/redis/adapter_redis_with_default_expires_spec.rb +0 -10
  165. data/spec/moneta/proxies/proxy/proxy_redis_spec.rb +0 -13
  166. data/spec/quality_spec.rb +0 -51
@@ -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]
data/spec/helper.rb CHANGED
@@ -213,11 +213,18 @@ ADAPTER_SPECS = MonetaSpecs.new(
213
213
  :create, :features, :store_large, :not_each_key],
214
214
  key: %w(string path),
215
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
+
216
222
  STANDARD_SPECS = MonetaSpecs.new(
217
223
  specs: [:null, :store, :returndifferent,
218
224
  :marshallable_key, :marshallable_value, :transform_value, :increment,
219
225
  :concurrent_increment, :concurrent_create, :persist, :multiprocess, :create,
220
226
  :features, :store_large, :not_each_key])
227
+
221
228
  TRANSFORMER_SPECS = MonetaSpecs.new(
222
229
  specs: [:null, :store, :returndifferent,
223
230
  :transform_value, :increment, :create, :features, :store_large,
@@ -260,15 +267,24 @@ module MonetaHelpers
260
267
 
261
268
  # Used by tests that rely on MySQL. These env vars can be used if you
262
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' }
263
272
  let(:mysql_username) { ENV['MONETA_MYSQL_USERNAME'] || 'root' }
264
273
  let(:mysql_password) { ENV['MONETA_MYSQL_PASSWORD'] }
265
274
  let(:mysql_database1) { ENV['MONETA_MYSQL_DATABASE1'] || 'moneta' }
266
275
  let(:mysql_database2) { ENV['MONETA_MYSQL_DATABASE2'] || 'moneta2' }
267
276
 
268
- let(:postgres_username) { ENV['MONETA_POSTGRES_USERNAME'] || 'postgres' }
277
+ let(:postgres_username) { ENV['PGUSER'] || 'postgres' }
278
+ let(:postgres_password) { ENV['PGPASSWORD'] }
269
279
  let(:postgres_database1) { ENV['MONETA_POSTGRES_DATABSASE1'] || 'moneta1' }
270
280
  let(:postgres_database2) { ENV['MONETA_POSTGRES_DATABSASE1'] || 'moneta2' }
271
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
+
272
288
  before do
273
289
  store = new_store
274
290
  store.clear
@@ -282,23 +298,9 @@ module MonetaHelpers
282
298
  end
283
299
  end
284
300
 
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
301
  def use_timecop
301
- before{ @timecop = true }
302
+ before { @timecop = true }
303
+ after { Timecop.return }
302
304
  end
303
305
  end
304
306
 
@@ -323,14 +325,6 @@ module MonetaHelpers
323
325
  end
324
326
  end
325
327
 
326
- def start_server(*args)
327
- server = Moneta::Server.new(*args)
328
- Thread.new { server.run }
329
- sleep 0.1 until server.running?
330
- rescue Exception => ex
331
- puts "Failed to start server - #{ex.message}"
332
- end
333
-
334
328
  def moneta_property_of(keys: 0, values: 0)
335
329
  keys_meta = self.keys_meta
336
330
  values_meta = self.values_meta
@@ -355,6 +349,20 @@ module MonetaHelpers
355
349
  sleep seconds
356
350
  end
357
351
  end
352
+
353
+ def time_till_next(tick)
354
+ now = Time.now.to_f
355
+ tick - (now % tick)
356
+ end
357
+
358
+ # advance to the moment just after a tick. 1e-2 is needed in some
359
+ # environments (JRuby) to be able to pass the "not in earlier half" test.
360
+ def advance_next_tick
361
+ tick = t_res
362
+ offset = time_till_next(tick) + 1e-2
363
+ advance offset
364
+ raise "not in earlier half of tick" unless Time.now.to_f % tick < tick / 2.0
365
+ end
358
366
  end
359
367
  end
360
368
 
@@ -435,20 +443,4 @@ RSpec.shared_context :setup_moneta_store do |builder|
435
443
  end
436
444
  end
437
445
 
438
- RSpec.shared_examples :at_usec do |usec|
439
- before do
440
- now = Time.now
441
- # 1000us is a rough guess at how many microseconds this code will take to run
442
- if now.usec + 1000 > usec
443
- advance(1 - 1e-6 * (now.usec - usec))
444
- else
445
- advance(1e-6 * (usec - now.usec))
446
- end
447
- end
448
-
449
- after do
450
- Timecop.return if @timecop
451
- end
452
- end
453
-
454
446
  Dir['./spec/features/*.rb'].each{ |rb| require rb }
@@ -1,4 +1,4 @@
1
- describe 'adapter_activerecord_existing_connection', adapter: :ActiveRecord do
1
+ describe 'adapter_activerecord_existing_connection', adapter: :ActiveRecord, mysql: true do
2
2
  before :all do
3
3
  require 'active_record'
4
4
  end
@@ -8,6 +8,8 @@ describe 'adapter_activerecord_existing_connection', adapter: :ActiveRecord do
8
8
  ActiveRecord::Base.configurations = {
9
9
  default_env => {
10
10
  'adapter' => (defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql2'),
11
+ 'host' => mysql_host,
12
+ 'port' => mysql_port,
11
13
  'database' => mysql_database1,
12
14
  'username' => mysql_username,
13
15
  'password' => mysql_password
@@ -58,32 +58,39 @@ describe 'adapter_activerecord', adapter: :ActiveRecord do
58
58
  end
59
59
  end
60
60
 
61
- context "with MySQL" do
61
+ context "with MySQL", mysql: true do
62
62
  let(:connection1) do
63
63
  {
64
64
  adapter: (defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql2'),
65
+ host: mysql_host,
66
+ port: mysql_port,
65
67
  database: mysql_database1,
66
- username: mysql_username
68
+ username: mysql_username,
69
+ password: mysql_password
67
70
  }
68
71
  end
69
72
 
70
73
  let(:connection2) do
71
74
  {
72
75
  adapter: (defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql2'),
76
+ host: mysql_host,
77
+ port: mysql_port,
73
78
  database: mysql_database2,
74
- username: mysql_username
79
+ username: mysql_username,
80
+ password: mysql_password
75
81
  }
76
82
  end
77
83
 
78
84
  include_examples :adapter_activerecord, activerecord_specs
79
85
  end
80
86
 
81
- context "with PostgreSQL" do
87
+ context "with PostgreSQL", postgres: true do
82
88
  let(:connection1) do
83
89
  {
84
90
  adapter: (defined?(JRUBY_VERSION) ? 'jdbcpostgresql' : 'postgresql'),
85
91
  database: postgres_database1,
86
- username: postgres_username
92
+ username: postgres_username,
93
+ password: postgres_password
87
94
  }
88
95
  end
89
96
 
@@ -91,14 +98,15 @@ describe 'adapter_activerecord', adapter: :ActiveRecord do
91
98
  {
92
99
  adapter: (defined?(JRUBY_VERSION) ? 'jdbcpostgresql' : 'postgresql'),
93
100
  database: postgres_database2,
94
- username: postgres_username
101
+ username: postgres_username,
102
+ password: postgres_password
95
103
  }
96
104
  end
97
105
 
98
106
  include_examples :adapter_activerecord, activerecord_specs
99
107
  end
100
108
 
101
- context "with SQLite" do
109
+ context "with SQLite", sqlite: true do
102
110
  let(:connection1) do
103
111
  {
104
112
  adapter: (defined?(JRUBY_VERSION) ? 'jdbcsqlite3' : 'sqlite3'),
@@ -1,11 +1,14 @@
1
- describe "standard_activerecord", adapter: :ActiveRecord do
1
+ describe "standard_activerecord", adapter: :ActiveRecord, mysql: true do
2
2
  moneta_store :ActiveRecord do
3
3
  {
4
4
  table: 'standard_activerecord',
5
5
  connection: {
6
6
  adapter: (defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql2'),
7
+ host: mysql_host,
8
+ port: mysql_port,
7
9
  database: mysql_database1,
8
- username: mysql_username
10
+ username: mysql_username,
11
+ password: mysql_password
9
12
  }
10
13
  }
11
14
  end
@@ -14,5 +17,5 @@ describe "standard_activerecord", adapter: :ActiveRecord do
14
17
  ::Marshal.load(value.unpack('m').first)
15
18
  end
16
19
 
17
- moneta_specs STANDARD_SPECS
20
+ moneta_specs STANDARD_SPECS.with_each_key
18
21
  end
@@ -1,4 +1,4 @@
1
- describe "standard_activerecord_with_expires", adapter: :ActiveRecord do
1
+ describe "standard_activerecord_with_expires", adapter: :ActiveRecord, mysql: true do
2
2
  let(:t_res) { 0.125 }
3
3
  let(:min_ttl) { t_res }
4
4
  use_timecop
@@ -8,8 +8,11 @@ describe "standard_activerecord_with_expires", adapter: :ActiveRecord do
8
8
  table: 'standard_activerecord_with_expires',
9
9
  connection: {
10
10
  adapter: (defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql2'),
11
+ host: mysql_host,
12
+ port: mysql_port,
11
13
  database: mysql_database1,
12
- username: mysql_username
14
+ username: mysql_username,
15
+ password: mysql_password
13
16
  },
14
17
  expires: true
15
18
  }
@@ -20,5 +23,5 @@ describe "standard_activerecord_with_expires", adapter: :ActiveRecord do
20
23
  ::Marshal.load(value.unpack('m').first)
21
24
  end
22
25
 
23
- moneta_specs STANDARD_SPECS.with_expires
26
+ moneta_specs STANDARD_SPECS.with_expires.with_each_key
24
27
  end
@@ -23,7 +23,7 @@ describe 'adapter_activesupportcache', adapter: :ActiveSupportCache do
23
23
  include_examples :adapter_activesupportcache
24
24
  end
25
25
 
26
- context 'using MemCacheStore' do
26
+ context 'using MemCacheStore', memcached: true do
27
27
  let(:t_res) { 1 }
28
28
  let(:min_ttl) { 2 }
29
29
  use_timecop
@@ -34,12 +34,12 @@ describe 'adapter_activesupportcache', adapter: :ActiveSupportCache do
34
34
  include_examples :adapter_activesupportcache
35
35
  end
36
36
 
37
- context 'using RedisCacheStore' do
37
+ context 'using RedisCacheStore', redis: true do
38
38
  let(:t_res) { 1 }
39
39
  let(:min_ttl) { t_res }
40
40
  use_timecop
41
41
 
42
- let(:backend) { ActiveSupport::Cache::RedisCacheStore.new(url: 'redis:///1') }
42
+ let(:backend) { ActiveSupport::Cache::RedisCacheStore.new(url: "redis://#{redis_host}:#{redis_port}/1") }
43
43
  include_examples :adapter_activesupportcache
44
44
  end
45
45
 
@@ -23,7 +23,7 @@ describe 'adapter_activesupportcache_with_default_expires', adapter: :ActiveSupp
23
23
  include_examples :adapter_activesupportcache_with_default_expires
24
24
  end
25
25
 
26
- context 'using MemCacheStore' do
26
+ context 'using MemCacheStore', memcached: true do
27
27
  let(:t_res) { 1 }
28
28
  let(:min_ttl) { 2 }
29
29
  use_timecop
@@ -39,7 +39,7 @@ describe 'adapter_activesupportcache_with_default_expires', adapter: :ActiveSupp
39
39
  let(:min_ttl) { t_res }
40
40
  use_timecop
41
41
 
42
- let(:backend) { ActiveSupport::Cache::RedisCacheStore.new(url: 'redis:///2') }
42
+ let(:backend) { ActiveSupport::Cache::RedisCacheStore.new(url: "redis://#{redis_host}:#{redis_port}/2") }
43
43
  include_examples :adapter_activesupportcache_with_default_expires
44
44
  end
45
45
 
@@ -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
@@ -4,7 +4,7 @@ describe 'adapter_couch', adapter: :Couch do
4
4
  include_context :faraday_adapter
5
5
 
6
6
  moneta_build do
7
- Moneta::Adapters::Couch.new(db: 'adapter_couch', adapter: faraday_adapter)
7
+ Moneta::Adapters::Couch.new(db: 'adapter_couch', adapter: faraday_adapter, login: couch_login, password: couch_password)
8
8
  end
9
9
 
10
10
  moneta_specs ADAPTER_SPECS.without_increment.simplevalues_only.without_path.with_each_key