moneta 1.4.1 → 1.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +425 -0
  3. data/CHANGES +17 -0
  4. data/CONTRIBUTORS +2 -0
  5. data/Gemfile +161 -60
  6. data/README.md +21 -17
  7. data/lib/moneta/adapter.rb +52 -0
  8. data/lib/moneta/adapters/activerecord.rb +77 -68
  9. data/lib/moneta/adapters/activesupportcache.rb +22 -31
  10. data/lib/moneta/adapters/cassandra.rb +114 -116
  11. data/lib/moneta/adapters/client.rb +17 -18
  12. data/lib/moneta/adapters/couch.rb +31 -26
  13. data/lib/moneta/adapters/datamapper.rb +9 -5
  14. data/lib/moneta/adapters/daybreak.rb +15 -21
  15. data/lib/moneta/adapters/dbm.rb +6 -12
  16. data/lib/moneta/adapters/file.rb +21 -13
  17. data/lib/moneta/adapters/fog.rb +5 -6
  18. data/lib/moneta/adapters/gdbm.rb +6 -12
  19. data/lib/moneta/adapters/hbase.rb +10 -12
  20. data/lib/moneta/adapters/kyotocabinet.rb +22 -27
  21. data/lib/moneta/adapters/leveldb.rb +14 -20
  22. data/lib/moneta/adapters/lmdb.rb +19 -22
  23. data/lib/moneta/adapters/localmemcache.rb +7 -13
  24. data/lib/moneta/adapters/lruhash.rb +20 -20
  25. data/lib/moneta/adapters/memcached/dalli.rb +25 -33
  26. data/lib/moneta/adapters/memcached/native.rb +14 -20
  27. data/lib/moneta/adapters/memory.rb +5 -7
  28. data/lib/moneta/adapters/mongo.rb +53 -52
  29. data/lib/moneta/adapters/pstore.rb +21 -27
  30. data/lib/moneta/adapters/redis.rb +42 -37
  31. data/lib/moneta/adapters/restclient.rb +17 -25
  32. data/lib/moneta/adapters/riak.rb +8 -9
  33. data/lib/moneta/adapters/sdbm.rb +6 -12
  34. data/lib/moneta/adapters/sequel/mysql.rb +8 -8
  35. data/lib/moneta/adapters/sequel/postgres.rb +17 -17
  36. data/lib/moneta/adapters/sequel/postgres_hstore.rb +47 -47
  37. data/lib/moneta/adapters/sequel/sqlite.rb +9 -9
  38. data/lib/moneta/adapters/sequel.rb +56 -65
  39. data/lib/moneta/adapters/sqlite.rb +37 -35
  40. data/lib/moneta/adapters/tdb.rb +8 -14
  41. data/lib/moneta/adapters/tokyocabinet.rb +19 -17
  42. data/lib/moneta/adapters/tokyotyrant.rb +29 -30
  43. data/lib/moneta/adapters/yaml.rb +1 -5
  44. data/lib/moneta/config.rb +101 -0
  45. data/lib/moneta/expires.rb +0 -1
  46. data/lib/moneta/expires_support.rb +3 -4
  47. data/lib/moneta/pool.rb +27 -7
  48. data/lib/moneta/proxy.rb +29 -0
  49. data/lib/moneta/server.rb +21 -14
  50. data/lib/moneta/version.rb +1 -1
  51. data/lib/moneta/wrapper.rb +5 -0
  52. data/lib/moneta.rb +2 -0
  53. data/moneta.gemspec +1 -0
  54. data/spec/active_support/cache_moneta_store_spec.rb +13 -13
  55. data/spec/features/null.rb +28 -28
  56. data/spec/features/persist.rb +3 -3
  57. data/spec/features/returndifferent.rb +4 -4
  58. data/spec/features/returnsame.rb +4 -4
  59. data/spec/features/store.rb +104 -104
  60. data/spec/helper.rb +15 -4
  61. data/spec/moneta/adapters/activerecord/adapter_activerecord_existing_connection_spec.rb +3 -1
  62. data/spec/moneta/adapters/activerecord/adapter_activerecord_spec.rb +15 -7
  63. data/spec/moneta/adapters/activerecord/standard_activerecord_spec.rb +5 -2
  64. data/spec/moneta/adapters/activerecord/standard_activerecord_with_expires_spec.rb +5 -2
  65. data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_spec.rb +3 -3
  66. data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_with_default_expires_spec.rb +2 -2
  67. data/spec/moneta/adapters/cassandra/adapter_cassandra_spec.rb +1 -1
  68. data/spec/moneta/adapters/cassandra/adapter_cassandra_with_default_expires_spec.rb +1 -1
  69. data/spec/moneta/adapters/cassandra/standard_cassandra_spec.rb +1 -1
  70. data/spec/moneta/adapters/client/client_helper.rb +4 -3
  71. data/spec/moneta/adapters/datamapper/adapter_datamapper_spec.rb +25 -8
  72. data/spec/moneta/adapters/datamapper/standard_datamapper_spec.rb +2 -2
  73. data/spec/moneta/adapters/datamapper/standard_datamapper_with_expires_spec.rb +2 -2
  74. data/spec/moneta/adapters/datamapper/standard_datamapper_with_repository_spec.rb +2 -2
  75. data/spec/moneta/adapters/faraday_helper.rb +3 -2
  76. data/spec/moneta/adapters/lruhash/adapter_lruhash_spec.rb +10 -6
  77. data/spec/moneta/adapters/memcached/dalli/adapter_memcached_dalli_spec.rb +13 -3
  78. data/spec/moneta/adapters/memcached/native/adapter_memcached_native_spec.rb +13 -3
  79. data/spec/moneta/adapters/mongo/adapter_mongo_spec.rb +2 -2
  80. data/spec/moneta/adapters/mongo/adapter_mongo_with_default_expires_spec.rb +1 -1
  81. data/spec/moneta/adapters/redis/adapter_redis_spec.rb +13 -3
  82. data/spec/moneta/adapters/redis/standard_redis_spec.rb +8 -1
  83. data/spec/moneta/adapters/sequel/adapter_sequel_spec.rb +4 -4
  84. data/spec/moneta/adapters/sequel/helper.rb +10 -5
  85. data/spec/moneta/adapters/sequel/standard_sequel_spec.rb +1 -1
  86. data/spec/moneta/adapters/sequel/standard_sequel_with_expires_spec.rb +1 -1
  87. data/spec/moneta/adapters/sqlite/adapter_sqlite_spec.rb +1 -1
  88. data/spec/moneta/adapters/sqlite/standard_sqlite_spec.rb +1 -1
  89. data/spec/moneta/adapters/sqlite/standard_sqlite_with_expires_spec.rb +1 -1
  90. data/spec/moneta/config_spec.rb +219 -0
  91. data/spec/moneta/proxies/enumerable/enumerable_spec.rb +2 -2
  92. data/spec/moneta/proxies/pool/pool_spec.rb +31 -3
  93. data/spec/moneta/proxies/transformer/transformer_bson_spec.rb +3 -1
  94. data/spec/moneta/proxies/transformer/transformer_marshal_escape_spec.rb +2 -0
  95. data/spec/rack/session_moneta_spec.rb +44 -25
  96. data/spec/restserver.rb +3 -14
  97. metadata +25 -15
  98. data/.travis.yml +0 -146
  99. data/spec/moneta/adapters/memcached/dalli/adapter_memcached_dalli_with_default_expires_spec.rb +0 -15
  100. data/spec/moneta/adapters/memcached/native/adapter_memcached_native_with_default_expires_spec.rb +0 -15
  101. data/spec/moneta/adapters/redis/adapter_redis_with_default_expires_spec.rb +0 -10
  102. data/spec/moneta/proxies/proxy/proxy_redis_spec.rb +0 -13
@@ -1,106 +1,106 @@
1
1
  shared_examples :store do
2
2
  it 'writes values to keys that like a Hash' do
3
- moneta_property_of(keys: 1, values: 1).check do |keys:, values:|
4
- store[keys[0]] = values[0]
5
- store[keys[0]].should == values[0]
6
- store.load(keys[0]).should == values[0]
3
+ moneta_property_of(keys: 1, values: 1).check do |m|
4
+ store[m.keys[0]] = m.values[0]
5
+ store[m.keys[0]].should == m.values[0]
6
+ store.load(m.keys[0]).should == m.values[0]
7
7
  end
8
8
  end
9
9
 
10
10
  it 'returns true from #key? if a key is available' do
11
- moneta_property_of(keys: 1, values: 1).check do |keys:, values:|
12
- store[keys[0]] = values[0]
13
- store.key?(keys[0]).should be true
11
+ moneta_property_of(keys: 1, values: 1).check do |m|
12
+ store[m.keys[0]] = m.values[0]
13
+ store.key?(m.keys[0]).should be true
14
14
  end
15
15
  end
16
16
 
17
17
  it 'stores values with #store' do
18
- moneta_property_of(keys: 1, values: 1).check do |keys:, values:|
19
- value = values[0]
20
- store.store(keys[0], value).should equal(value)
21
- store[keys[0]].should == values[0]
22
- store.load(keys[0]).should == values[0]
18
+ moneta_property_of(keys: 1, values: 1).check do |m|
19
+ value = m.values[0]
20
+ store.store(m.keys[0], value).should equal(value)
21
+ store[m.keys[0]].should == m.values[0]
22
+ store.load(m.keys[0]).should == m.values[0]
23
23
  end
24
24
  end
25
25
 
26
26
  it 'stores values after clear' do
27
- moneta_property_of(keys: 2, values: 2).check do |keys:, values:|
28
- store[keys[0]] = values[0]
29
- store[keys[1]] = values[1]
27
+ moneta_property_of(keys: 2, values: 2).check do |m|
28
+ store[m.keys[0]] = m.values[0]
29
+ store[m.keys[1]] = m.values[1]
30
30
  store.clear.should equal(store)
31
- store[keys[0]] = values[0]
32
- store[keys[0]].should == values[0]
33
- store[keys[1]].should be_nil
31
+ store[m.keys[0]] = m.values[0]
32
+ store[m.keys[0]].should == m.values[0]
33
+ store[m.keys[1]].should be_nil
34
34
  end
35
35
  end
36
36
 
37
37
  it 'removes and returns a value from the backing store via delete if it exists' do
38
- moneta_property_of(keys: 1, values: 1).check do |keys:, values:|
39
- store[keys[0]] = values[0]
40
- store.delete(keys[0]).should == values[0]
41
- store.key?(keys[0]).should be false
38
+ moneta_property_of(keys: 1, values: 1).check do |m|
39
+ store[m.keys[0]] = m.values[0]
40
+ store.delete(m.keys[0]).should == m.values[0]
41
+ store.key?(m.keys[0]).should be false
42
42
  end
43
43
  end
44
44
 
45
45
  it 'overwrites existing values' do
46
- moneta_property_of(keys: 1, values: 2).check do |keys:, values:|
47
- store[keys[0]] = values[0]
48
- store[keys[0]].should == values[0]
49
- store[keys[0]] = values[1]
50
- store[keys[0]].should == values[1]
46
+ moneta_property_of(keys: 1, values: 2).check do |m|
47
+ store[m.keys[0]] = m.values[0]
48
+ store[m.keys[0]].should == m.values[0]
49
+ store[m.keys[0]] = m.values[1]
50
+ store[m.keys[0]].should == m.values[1]
51
51
  end
52
52
  end
53
53
 
54
54
  it 'stores frozen values' do
55
- moneta_property_of(keys: 1, values: 1).check do |keys:, values:|
56
- value = values[0].freeze
57
- (store[keys[0]] = value).should equal(value)
58
- store[keys[0]].should == values[0]
55
+ moneta_property_of(keys: 1, values: 1).check do |m|
56
+ value = m.values[0].freeze
57
+ (store[m.keys[0]] = value).should equal(value)
58
+ store[m.keys[0]].should == m.values[0]
59
59
  end
60
60
  end
61
61
 
62
62
  it 'stores frozen keys' do
63
- moneta_property_of(keys: 1, values: 1).check do |keys:, values:|
64
- key = keys[0].freeze
65
- store[key] = values[0]
66
- store[keys[0]].should == values[0]
63
+ moneta_property_of(keys: 1, values: 1).check do |m|
64
+ key = m.keys[0].freeze
65
+ store[key] = m.values[0]
66
+ store[m.keys[0]].should == m.values[0]
67
67
  end
68
68
  end
69
69
 
70
70
  it 'fetches a key with a default value with fetch, if the key is available' do
71
- moneta_property_of(keys: 1, values: 2).check do |keys:, values:|
72
- next if values[0].nil?
73
- store[keys[0]] = values[0]
74
- store.fetch(keys[0], values[1]).should == values[0]
71
+ moneta_property_of(keys: 1, values: 2).check do |m|
72
+ next if m.values[0].nil?
73
+ store[m.keys[0]] = m.values[0]
74
+ store.fetch(m.keys[0], m.values[1]).should == m.values[0]
75
75
  end
76
76
  end
77
77
 
78
78
  it 'does not run the block in fetch if the key is available' do
79
- moneta_property_of(keys: 1, values: 1).check do |keys:, values:|
80
- next if values[0].nil?
81
- store[keys[0]] = values[0]
79
+ moneta_property_of(keys: 1, values: 1).check do |m|
80
+ next if m.values[0].nil?
81
+ store[m.keys[0]] = m.values[0]
82
82
  unaltered = 'unaltered'
83
- store.fetch(keys[0]) { unaltered = 'altered' }
83
+ store.fetch(m.keys[0]) { unaltered = 'altered' }
84
84
  unaltered.should == 'unaltered'
85
85
  end
86
86
  end
87
87
 
88
88
  shared_examples :values_at do |name|
89
89
  it 'retrieves stored values' do
90
- moneta_property_of(keys: 3, values: 3).check do |keys:, values:|
91
- store[keys[0]] = values[0]
92
- store[keys[1]] = values[1]
93
- store[keys[2]] = values[2]
94
- expect(store.public_send(name, keys[1], keys[2], keys[0])).to eq [values[1], values[2], values[0]]
90
+ moneta_property_of(keys: 3, values: 3).check do |m|
91
+ store[m.keys[0]] = m.values[0]
92
+ store[m.keys[1]] = m.values[1]
93
+ store[m.keys[2]] = m.values[2]
94
+ expect(store.public_send(name, m.keys[1], m.keys[2], m.keys[0])).to eq [m.values[1], m.values[2], m.values[0]]
95
95
  store.clear
96
96
  end
97
97
  end
98
98
 
99
99
  it 'returns nil in place of missing values' do
100
- moneta_property_of(keys: 3, values: 2).check do |keys:, values:|
101
- store[keys[0]] = values[0]
102
- store[keys[1]] = values[1]
103
- expect(store.public_send(name, keys[1], keys[2], keys[0])).to eq [values[1], nil, values[0]]
100
+ moneta_property_of(keys: 3, values: 2).check do |m|
101
+ store[m.keys[0]] = m.values[0]
102
+ store[m.keys[1]] = m.values[1]
103
+ expect(store.public_send(name, m.keys[1], m.keys[2], m.keys[0])).to eq [m.values[1], nil, m.values[0]]
104
104
  store.clear
105
105
  end
106
106
  end
@@ -114,29 +114,29 @@ shared_examples :store do
114
114
  include_examples :values_at, :fetch_values
115
115
 
116
116
  it 'yields to the block, if given, for keys that are not in the store' do
117
- moneta_property_of(keys: 4, values: 3).check do |keys:, values:|
118
- store[keys[0]] = values[0]
119
- store[keys[1]] = values[1]
120
- store[keys[2]] = values[2]
117
+ moneta_property_of(keys: 4, values: 3).check do |m|
118
+ store[m.keys[0]] = m.values[0]
119
+ store[m.keys[1]] = m.values[1]
120
+ store[m.keys[2]] = m.values[2]
121
121
 
122
122
  expect do |b|
123
- store.fetch_values(keys[0], keys[1], keys[2], keys[3], &b)
124
- end.to yield_with_args(keys[3])
123
+ store.fetch_values(m.keys[0], m.keys[1], m.keys[2], m.keys[3], &b)
124
+ end.to yield_with_args(m.keys[3])
125
125
 
126
126
  store.clear
127
127
  end
128
128
  end
129
129
 
130
130
  it 'uses the value of the block, if given, for keys that are not in the store' do
131
- moneta_property_of(keys: 4, values: 4).check do |keys:, values:|
132
- store[keys[0]] = values[0]
133
- store[keys[1]] = values[1]
134
- store[keys[2]] = values[2]
131
+ moneta_property_of(keys: 4, values: 4).check do |m|
132
+ store[m.keys[0]] = m.values[0]
133
+ store[m.keys[1]] = m.values[1]
134
+ store[m.keys[2]] = m.values[2]
135
135
 
136
- expect(store.fetch_values(keys[0], keys[1], keys[2], keys[3]) do |key|
137
- expect(key).to eq keys[3]
138
- values[3]
139
- end).to eq [values[0], values[1], values[2], values[3]]
136
+ expect(store.fetch_values(m.keys[0], m.keys[1], m.keys[2], m.keys[3]) do |key|
137
+ expect(key).to eq m.keys[3]
138
+ m.values[3]
139
+ end).to eq [m.values[0], m.values[1], m.values[2], m.values[3]]
140
140
 
141
141
  store.clear
142
142
  end
@@ -149,26 +149,26 @@ shared_examples :store do
149
149
 
150
150
  describe '#slice' do
151
151
  it 'returns pairs of stored keys and values' do
152
- moneta_property_of(keys: 3, values: 3).check do |keys:, values:|
153
- store[keys[0]] = values[0]
154
- store[keys[1]] = values[1]
155
- store[keys[2]] = values[2]
152
+ moneta_property_of(keys: 3, values: 3).check do |m|
153
+ store[m.keys[0]] = m.values[0]
154
+ store[m.keys[1]] = m.values[1]
155
+ store[m.keys[2]] = m.values[2]
156
156
 
157
- expect(store.slice(*[keys[0], keys[1], keys[2]].shuffle).to_a).to \
158
- contain_exactly([keys[0], values[0]], [keys[1], values[1]], [keys[2], values[2]])
157
+ expect(store.slice(*[m.keys[0], m.keys[1], m.keys[2]].shuffle).to_a).to \
158
+ contain_exactly([m.keys[0], m.values[0]], [m.keys[1], m.values[1]], [m.keys[2], m.values[2]])
159
159
 
160
160
  store.clear
161
161
  end
162
162
  end
163
163
 
164
164
  it 'does not return pairs for any keys absent from the store' do
165
- moneta_property_of(keys: 4, values: 3).check do |keys:, values:|
166
- store[keys[0]] = values[0]
167
- store[keys[1]] = values[1]
168
- store[keys[2]] = values[2]
165
+ moneta_property_of(keys: 4, values: 3).check do |m|
166
+ store[m.keys[0]] = m.values[0]
167
+ store[m.keys[1]] = m.values[1]
168
+ store[m.keys[2]] = m.values[2]
169
169
 
170
- expect(store.slice(*[keys[0], keys[1], keys[2], keys[3]].shuffle).to_a).to \
171
- contain_exactly([keys[0], values[0]], [keys[1], values[1]], [keys[2], values[2]])
170
+ expect(store.slice(*[m.keys[0], m.keys[1], m.keys[2], m.keys[3]].shuffle).to_a).to \
171
+ contain_exactly([m.keys[0], m.values[0]], [m.keys[1], m.values[1]], [m.keys[2], m.values[2]])
172
172
 
173
173
  store.clear
174
174
  end
@@ -177,44 +177,44 @@ shared_examples :store do
177
177
 
178
178
  shared_examples :merge! do
179
179
  it 'stores values' do
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
182
- expect(store.key?(keys[0])).to be true
183
- expect(store[keys[0]]).to eq values[0]
184
- expect(store.key?(keys[1])).to be true
185
- expect(store[keys[1]]).to eq values[1]
186
- expect(store.key?(keys[2])).to be true
187
- expect(store[keys[2]]).to eq values[2]
180
+ moneta_property_of(keys: 3, values: 3).check do |m|
181
+ expect(store.public_send(method, pairs.call({ m.keys[0] => m.values[0], m.keys[1] => m.values[1], m.keys[2] => m.values[2] }))).to be store
182
+ expect(store.key?(m.keys[0])).to be true
183
+ expect(store[m.keys[0]]).to eq m.values[0]
184
+ expect(store.key?(m.keys[1])).to be true
185
+ expect(store[m.keys[1]]).to eq m.values[1]
186
+ expect(store.key?(m.keys[2])).to be true
187
+ expect(store[m.keys[2]]).to eq m.values[2]
188
188
  store.clear
189
189
  end
190
190
  end
191
191
 
192
192
  it 'overwrites existing values' do
193
- moneta_property_of(keys: 2, values: 3).check do |keys:, values:|
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
196
- expect(store.key?(keys[0])).to be true
197
- expect(store[keys[0]]).to eq values[1]
198
- expect(store.key?(keys[1])).to be true
199
- expect(store[keys[1]]).to eq values[2]
193
+ moneta_property_of(keys: 2, values: 3).check do |m|
194
+ expect(store[m.keys[0]] = m.values[0]).to eq m.values[0]
195
+ expect(store.public_send(method, pairs.call({ m.keys[0] => m.values[1], m.keys[1] => m.values[2] }))).to be store
196
+ expect(store.key?(m.keys[0])).to be true
197
+ expect(store[m.keys[0]]).to eq m.values[1]
198
+ expect(store.key?(m.keys[1])).to be true
199
+ expect(store[m.keys[1]]).to eq m.values[2]
200
200
  store.clear
201
201
  end
202
202
  end
203
203
 
204
204
  it 'stores the return value of the block, if given, for keys that will be overwritten' do
205
- moneta_property_of(keys: 2, values: 4).check do |keys:, values:|
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|
208
- expect(key).to eq keys[0]
209
- expect(old_val).to eq values[0]
210
- expect(new_val).to eq values[1]
211
- values[3]
205
+ moneta_property_of(keys: 2, values: 4).check do |m|
206
+ expect(store[m.keys[0]] = m.values[0]).to eq m.values[0]
207
+ expect(store.public_send(method, pairs.call({ m.keys[0] => m.values[1], m.keys[1] => m.values[2] })) do |key, old_val, new_val|
208
+ expect(key).to eq m.keys[0]
209
+ expect(old_val).to eq m.values[0]
210
+ expect(new_val).to eq m.values[1]
211
+ m.values[3]
212
212
  end).to be store
213
213
 
214
- expect(store.key?(keys[0])).to be true
215
- expect(store[keys[0]]).to eq values[3]
216
- expect(store.key?(keys[1])).to be true
217
- expect(store[keys[1]]).to eq values[2]
214
+ expect(store.key?(m.keys[0])).to be true
215
+ expect(store[m.keys[0]]).to eq m.values[3]
216
+ expect(store.key?(m.keys[1])).to be true
217
+ expect(store[m.keys[1]]).to eq m.values[2]
218
218
  store.clear
219
219
  end
220
220
  end
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,18 +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
 
272
282
  let(:couch_login) { ENV['COUCH_LOGIN'] || 'admin' }
273
283
  let(:couch_password) { ENV['COUCH_PASSWORD'] || 'password' }
274
284
 
285
+ let(:redis_host) { ENV.fetch('REDIS_HOST', 'localhost') }
286
+ let(:redis_port) { ENV.fetch('REDIS_PORT', '6379') }
287
+
275
288
  before do
276
289
  store = new_store
277
290
  store.clear
@@ -322,9 +335,7 @@ module MonetaHelpers
322
335
  value_values = values.times.map { call(values_meta) }
323
336
  guard value_values.uniq.length == value_values.length
324
337
 
325
- [[:keys, key_values], [:values, value_values]].
326
- reject { |key, value| value.empty? }.
327
- to_h
338
+ Struct.new(:keys, :values).new(key_values, value_values)
328
339
  end
329
340
  end
330
341
 
@@ -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
@@ -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
  }
@@ -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
 
@@ -1,6 +1,6 @@
1
1
  require_relative './helper.rb'
2
2
 
3
- describe 'adapter_cassandra', retry: 3, adapter: :Cassandra do
3
+ describe 'adapter_cassandra', retry: 3, adapter: :Cassandra, unsupported: RUBY_ENGINE == 'ruby' && Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.0.0') do
4
4
  let(:t_res) { 1 }
5
5
  let(:min_ttl) { 2 }
6
6
 
@@ -1,6 +1,6 @@
1
1
  require_relative './helper.rb'
2
2
 
3
- describe 'adapter_cassandra_with_default_expires', isolate: true, retry: 3, adapter: :Cassandra do
3
+ describe 'adapter_cassandra_with_default_expires', isolate: true, retry: 3, adapter: :Cassandra, unsupported: RUBY_ENGINE == 'ruby' && Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.0.0') do
4
4
  let(:t_res) { 1 }
5
5
  let(:min_ttl) { 2 }
6
6
 
@@ -1,6 +1,6 @@
1
1
  require_relative './helper.rb'
2
2
 
3
- describe "standard_cassandra", retry: 3, adapter: :Cassandra do
3
+ describe "standard_cassandra", retry: 3, adapter: :Cassandra, unsupported: RUBY_ENGINE == 'ruby' && Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.0.0') do
4
4
  let(:t_res) { 1 }
5
5
  let(:min_ttl) { 2 }
6
6
 
@@ -12,13 +12,14 @@ RSpec.shared_context :start_server do |**options|
12
12
  puts "Failed to start server - #{ex.message}"
13
13
  tries ||= 0
14
14
  tries += 1
15
- sleep Moneta::Server::TIMEOUT
15
+ timeout = options[:timeout] || Moneta::Server.config_defaults[:timeout]
16
+ sleep 1
16
17
  tries < 3 ? retry : raise
17
18
  end
18
19
  end
19
20
 
20
21
  after :context do
21
- @server.stop
22
- @thread.join
22
+ @server&.stop
23
+ @thread&.join
23
24
  end
24
25
  end
@@ -1,22 +1,32 @@
1
- describe 'adapter_datamapper', broken: defined?(JRUBY_VERSION), adapter: :DataMapper do
1
+ describe 'adapter_datamapper', unsupported: defined?(JRUBY_VERSION) || RUBY_ENGINE == 'ruby' && Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.0.0'), adapter: :DataMapper, mysql: true do
2
2
  before :all do
3
3
  require 'dm-core'
4
4
 
5
5
  # DataMapper needs default repository to be setup
6
6
  DataMapper.setup(:default, adapter: :in_memory)
7
7
  end
8
-
8
+
9
9
  moneta_build do
10
- Moneta::Adapters::DataMapper.new(setup: "mysql://#{mysql_username}:#{mysql_password}@localhost/#{mysql_database1}", table: "adapter_datamapper")
10
+ Moneta::Adapters::DataMapper.new(
11
+ setup: "mysql://#{mysql_username}:#{mysql_password}@#{mysql_host}:#{mysql_port}/#{mysql_database1}",
12
+ table: "adapter_datamapper"
13
+ )
11
14
  end
12
15
 
13
16
  moneta_specs ADAPTER_SPECS.without_increment.with_values(:nil).without_values(:binary)
14
-
17
+
15
18
  it 'does not cross contaminate when storing' do
16
- first = Moneta::Adapters::DataMapper.new(setup: "mysql://#{mysql_username}:#{mysql_password}@localhost/#{mysql_database1}", table: "datamapper_first")
19
+ first = Moneta::Adapters::DataMapper.new(
20
+ setup: "mysql://#{mysql_username}:#{mysql_password}@#{mysql_host}:#{mysql_port}/#{mysql_database1}",
21
+ table: "datamapper_first"
22
+ )
17
23
  first.clear
18
24
 
19
- second = Moneta::Adapters::DataMapper.new(repository: :sample, setup: "mysql://#{mysql_username}:#{mysql_password}@localhost/#{mysql_database1}", table: "datamapper_second")
25
+ second = Moneta::Adapters::DataMapper.new(
26
+ repository: :sample,
27
+ setup: "mysql://#{mysql_username}:#{mysql_password}@#{mysql_host}:#{mysql_port}/#{mysql_database1}",
28
+ table: "datamapper_second"
29
+ )
20
30
  second.clear
21
31
 
22
32
  first['key'] = 'value'
@@ -27,10 +37,17 @@ describe 'adapter_datamapper', broken: defined?(JRUBY_VERSION), adapter: :DataMa
27
37
  end
28
38
 
29
39
  it 'does not cross contaminate when deleting' do
30
- first = Moneta::Adapters::DataMapper.new(setup: "mysql://#{mysql_username}:#{mysql_password}@localhost/#{mysql_database1}", table: "datamapper_first")
40
+ first = Moneta::Adapters::DataMapper.new(
41
+ setup: "mysql://#{mysql_username}:#{mysql_password}@#{mysql_host}:#{mysql_port}/#{mysql_database1}",
42
+ table: "datamapper_first"
43
+ )
31
44
  first.clear
32
45
 
33
- second = Moneta::Adapters::DataMapper.new(repository: :sample, setup: "mysql://#{mysql_username}:#{mysql_password}@localhost/#{mysql_database1}", table: "datamapper_second")
46
+ second = Moneta::Adapters::DataMapper.new(
47
+ repository: :sample,
48
+ setup: "mysql://#{mysql_username}:#{mysql_password}@#{mysql_host}:#{mysql_port}/#{mysql_database1}",
49
+ table: "datamapper_second"
50
+ )
34
51
  second.clear
35
52
 
36
53
  first['key'] = 'value'
@@ -1,4 +1,4 @@
1
- describe "standard_datamapper", broken: defined?(JRUBY_VERSION), adapter: :DataMapper do
1
+ describe "standard_datamapper", unsupported: defined?(JRUBY_VERSION) || RUBY_ENGINE == 'ruby' && Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.0.0'), adapter: :DataMapper, mysql: true do
2
2
  before :all do
3
3
  require 'dm-core'
4
4
 
@@ -8,7 +8,7 @@ describe "standard_datamapper", broken: defined?(JRUBY_VERSION), adapter: :DataM
8
8
 
9
9
  moneta_store :DataMapper do
10
10
  {
11
- setup: "mysql://#{mysql_username}:#{mysql_password}@localhost/#{mysql_database1}",
11
+ setup: "mysql://#{mysql_username}:#{mysql_password}@#{mysql_host}:#{mysql_port}/#{mysql_database1}",
12
12
  table: "simple_datamapper"
13
13
  }
14
14
  end