moneta 1.4.1 → 1.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +425 -0
- data/CHANGES +17 -0
- data/CONTRIBUTORS +2 -0
- data/Gemfile +161 -60
- data/README.md +21 -17
- data/lib/moneta/adapter.rb +52 -0
- data/lib/moneta/adapters/activerecord.rb +77 -68
- data/lib/moneta/adapters/activesupportcache.rb +22 -31
- data/lib/moneta/adapters/cassandra.rb +114 -116
- data/lib/moneta/adapters/client.rb +17 -18
- data/lib/moneta/adapters/couch.rb +31 -26
- data/lib/moneta/adapters/datamapper.rb +9 -5
- data/lib/moneta/adapters/daybreak.rb +15 -21
- data/lib/moneta/adapters/dbm.rb +6 -12
- data/lib/moneta/adapters/file.rb +21 -13
- data/lib/moneta/adapters/fog.rb +5 -6
- data/lib/moneta/adapters/gdbm.rb +6 -12
- data/lib/moneta/adapters/hbase.rb +10 -12
- data/lib/moneta/adapters/kyotocabinet.rb +22 -27
- data/lib/moneta/adapters/leveldb.rb +14 -20
- data/lib/moneta/adapters/lmdb.rb +19 -22
- data/lib/moneta/adapters/localmemcache.rb +7 -13
- data/lib/moneta/adapters/lruhash.rb +20 -20
- data/lib/moneta/adapters/memcached/dalli.rb +25 -33
- data/lib/moneta/adapters/memcached/native.rb +14 -20
- data/lib/moneta/adapters/memory.rb +5 -7
- data/lib/moneta/adapters/mongo.rb +53 -52
- data/lib/moneta/adapters/pstore.rb +21 -27
- data/lib/moneta/adapters/redis.rb +42 -37
- data/lib/moneta/adapters/restclient.rb +17 -25
- data/lib/moneta/adapters/riak.rb +8 -9
- data/lib/moneta/adapters/sdbm.rb +6 -12
- data/lib/moneta/adapters/sequel/mysql.rb +8 -8
- data/lib/moneta/adapters/sequel/postgres.rb +17 -17
- data/lib/moneta/adapters/sequel/postgres_hstore.rb +47 -47
- data/lib/moneta/adapters/sequel/sqlite.rb +9 -9
- data/lib/moneta/adapters/sequel.rb +56 -65
- data/lib/moneta/adapters/sqlite.rb +37 -35
- data/lib/moneta/adapters/tdb.rb +8 -14
- data/lib/moneta/adapters/tokyocabinet.rb +19 -17
- data/lib/moneta/adapters/tokyotyrant.rb +29 -30
- data/lib/moneta/adapters/yaml.rb +1 -5
- data/lib/moneta/config.rb +101 -0
- data/lib/moneta/expires.rb +0 -1
- data/lib/moneta/expires_support.rb +3 -4
- data/lib/moneta/pool.rb +27 -7
- data/lib/moneta/proxy.rb +29 -0
- data/lib/moneta/server.rb +21 -14
- data/lib/moneta/version.rb +1 -1
- data/lib/moneta/wrapper.rb +5 -0
- data/lib/moneta.rb +2 -0
- data/moneta.gemspec +1 -0
- data/spec/active_support/cache_moneta_store_spec.rb +13 -13
- data/spec/features/null.rb +28 -28
- data/spec/features/persist.rb +3 -3
- data/spec/features/returndifferent.rb +4 -4
- data/spec/features/returnsame.rb +4 -4
- data/spec/features/store.rb +104 -104
- data/spec/helper.rb +15 -4
- data/spec/moneta/adapters/activerecord/adapter_activerecord_existing_connection_spec.rb +3 -1
- data/spec/moneta/adapters/activerecord/adapter_activerecord_spec.rb +15 -7
- data/spec/moneta/adapters/activerecord/standard_activerecord_spec.rb +5 -2
- data/spec/moneta/adapters/activerecord/standard_activerecord_with_expires_spec.rb +5 -2
- data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_spec.rb +3 -3
- data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_with_default_expires_spec.rb +2 -2
- data/spec/moneta/adapters/cassandra/adapter_cassandra_spec.rb +1 -1
- data/spec/moneta/adapters/cassandra/adapter_cassandra_with_default_expires_spec.rb +1 -1
- data/spec/moneta/adapters/cassandra/standard_cassandra_spec.rb +1 -1
- data/spec/moneta/adapters/client/client_helper.rb +4 -3
- data/spec/moneta/adapters/datamapper/adapter_datamapper_spec.rb +25 -8
- data/spec/moneta/adapters/datamapper/standard_datamapper_spec.rb +2 -2
- data/spec/moneta/adapters/datamapper/standard_datamapper_with_expires_spec.rb +2 -2
- data/spec/moneta/adapters/datamapper/standard_datamapper_with_repository_spec.rb +2 -2
- data/spec/moneta/adapters/faraday_helper.rb +3 -2
- data/spec/moneta/adapters/lruhash/adapter_lruhash_spec.rb +10 -6
- data/spec/moneta/adapters/memcached/dalli/adapter_memcached_dalli_spec.rb +13 -3
- data/spec/moneta/adapters/memcached/native/adapter_memcached_native_spec.rb +13 -3
- data/spec/moneta/adapters/mongo/adapter_mongo_spec.rb +2 -2
- data/spec/moneta/adapters/mongo/adapter_mongo_with_default_expires_spec.rb +1 -1
- data/spec/moneta/adapters/redis/adapter_redis_spec.rb +13 -3
- data/spec/moneta/adapters/redis/standard_redis_spec.rb +8 -1
- data/spec/moneta/adapters/sequel/adapter_sequel_spec.rb +4 -4
- data/spec/moneta/adapters/sequel/helper.rb +10 -5
- data/spec/moneta/adapters/sequel/standard_sequel_spec.rb +1 -1
- data/spec/moneta/adapters/sequel/standard_sequel_with_expires_spec.rb +1 -1
- data/spec/moneta/adapters/sqlite/adapter_sqlite_spec.rb +1 -1
- data/spec/moneta/adapters/sqlite/standard_sqlite_spec.rb +1 -1
- data/spec/moneta/adapters/sqlite/standard_sqlite_with_expires_spec.rb +1 -1
- data/spec/moneta/config_spec.rb +219 -0
- data/spec/moneta/proxies/enumerable/enumerable_spec.rb +2 -2
- data/spec/moneta/proxies/pool/pool_spec.rb +31 -3
- data/spec/moneta/proxies/transformer/transformer_bson_spec.rb +3 -1
- data/spec/moneta/proxies/transformer/transformer_marshal_escape_spec.rb +2 -0
- data/spec/rack/session_moneta_spec.rb +44 -25
- data/spec/restserver.rb +3 -14
- metadata +25 -15
- data/.travis.yml +0 -146
- data/spec/moneta/adapters/memcached/dalli/adapter_memcached_dalli_with_default_expires_spec.rb +0 -15
- data/spec/moneta/adapters/memcached/native/adapter_memcached_native_with_default_expires_spec.rb +0 -15
- data/spec/moneta/adapters/redis/adapter_redis_with_default_expires_spec.rb +0 -10
- data/spec/moneta/proxies/proxy/proxy_redis_spec.rb +0 -13
data/spec/features/store.rb
CHANGED
@@ -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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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['
|
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
|
-
|
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:
|
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
|
|
data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_with_default_expires_spec.rb
CHANGED
@@ -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:
|
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
|
-
|
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
|
22
|
-
@thread
|
22
|
+
@server&.stop
|
23
|
+
@thread&.join
|
23
24
|
end
|
24
25
|
end
|
@@ -1,22 +1,32 @@
|
|
1
|
-
describe 'adapter_datamapper',
|
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(
|
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(
|
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(
|
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(
|
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(
|
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",
|
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}
|
11
|
+
setup: "mysql://#{mysql_username}:#{mysql_password}@#{mysql_host}:#{mysql_port}/#{mysql_database1}",
|
12
12
|
table: "simple_datamapper"
|
13
13
|
}
|
14
14
|
end
|