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
data/script/contributors CHANGED
@@ -1,7 +1,12 @@
1
- #!/bin/sh
2
- git log --format='%aN <%aE>' |\
3
- sed -e 's/hiddenbek/Scott Wadden/g' |\
4
- sed -e 's/Asmod4n/Hendrik Beskow/' |\
5
- grep -v 'hannes.georg@xing.com\|spotapov\|yehuda-katzs-mac\|wycats ' |\
6
- sort -u | sort > CONTRIBUTORS
1
+ #!/usr/bin/env ruby
7
2
 
3
+ contributors = `git log --format='%aN <%aE>'`
4
+ .gsub(/hiddenbek/, 'Scott Wadden')
5
+ .gsub(/Asmod4n/, 'Hendrik Beskow')
6
+ .lines
7
+ .uniq
8
+ .reject { |line| line.match? /asppsa@gmail.com|hannes.georg@xing.com|spotapov|yehuda-katzs-mac|wycats / }
9
+ .sort { |str1, str2| str1.casecmp(str2) }
10
+
11
+ file = File.open('CONTRIBUTORS', 'w')
12
+ file << contributors.join
@@ -0,0 +1,27 @@
1
+ #!/bin/bash
2
+ set -e
3
+
4
+ # Copied from https://github.com/apache/couchdb-pkg/blob/master/debian/README.Debian
5
+ COUCHDB_PASSWORD=password
6
+ echo "couchdb couchdb/mode select standalone
7
+ couchdb couchdb/mode seen true
8
+ couchdb couchdb/bindaddress string 127.0.0.1
9
+ couchdb couchdb/bindaddress seen true
10
+ couchdb couchdb/adminpass password ${COUCHDB_PASSWORD}
11
+ couchdb couchdb/adminpass seen true
12
+ couchdb couchdb/adminpass_again password ${COUCHDB_PASSWORD}
13
+ couchdb couchdb/adminpass_again seen true" | sudo debconf-set-selections
14
+ DEBIAN_FRONTEND=noninteractive sudo apt-get install -y --force-yes couchdb
15
+
16
+ # Reconfigure CouchDB to use delayed commits for speed: http://guide.couchdb.org/draft/performance.html
17
+ sudo sed -i '/\[couchdb\]/a delayed_commits = true' /etc/couchdb/local.ini
18
+
19
+ # (Re)start couchdb
20
+ sudo systemctl restart couchdb
21
+
22
+ # Display some info about CouchDB
23
+ sudo systemctl status couchdb
24
+ until curl http://localhost:5984/; do
25
+ sleep 1
26
+ done
27
+
data/script/start-hbase CHANGED
@@ -8,13 +8,13 @@ mkdir -p zookeeper
8
8
  mkdir -p downloads
9
9
  root=$(pwd)
10
10
 
11
- version=$(curl -sS https://www-us.apache.org/dist/hbase/stable/ | grep -oP '(?<=hbase-)(\d+\.?)+' | head -n1)
11
+ version=$(curl -sS https://downloads.apache.org/hbase/stable/RELEASENOTES.md | grep -oP '(?<=# HBASE\s\s)(\d+\.?)+' | head -n1)
12
12
 
13
13
  echo HBase stable version is $version
14
14
 
15
15
  if [ ! -f downloads/hbase-$version-bin.tar.gz ]; then
16
16
  echo Downloading HBase ...
17
- wget -P downloads http://www-us.apache.org/dist/hbase/stable/hbase-$version-bin.tar.gz
17
+ wget -P downloads https://downloads.apache.org/hbase/stable/hbase-$version-bin.tar.gz
18
18
  fi
19
19
 
20
20
  echo Extracting HBase ...
@@ -1,9 +1,9 @@
1
1
  #!/bin/bash
2
2
 
3
- # Restart CouchDB
4
- $(dirname $0)/reconfigure-couchdb
3
+ # Install and start CouchDB
4
+ $(dirname $0)/start-couchdb
5
5
 
6
- # Start HBase
6
+ # Install and start HBase
7
7
  $(dirname $0)/start-hbase
8
8
 
9
9
  # Waiting for servers to start
@@ -74,45 +74,43 @@ describe "cache_moneta_store" do
74
74
  end
75
75
  expect(result['rabbit']).to eq rabbit
76
76
  expect(result['irish whisky']).to eq 'irish whisky was missing'
77
- expect(store.fetch 'irish whisky').to eq 'irish whisky was missing'
77
+ expect(store.fetch('irish whisky')).to eq 'irish whisky was missing'
78
78
  end
79
79
  end
80
80
 
81
81
  shared_examples :expiry do
82
- at_each_usec do
83
- it 'writes the data with expiration time' do
84
- store.write 'rabbit', white_rabbit, expires_in: 0.2.second
85
- expect(store.read('rabbit')).to eq white_rabbit
86
- sleep 0.3
87
- expect(store.read('rabbit')).to be_nil
88
- end
82
+ it 'writes the data with expiration time' do
83
+ store.write 'rabbit', white_rabbit, expires_in: 0.2.second
84
+ expect(store.read('rabbit')).to eq white_rabbit
85
+ sleep 0.3
86
+ expect(store.read('rabbit')).to be_nil
87
+ end
89
88
 
90
- it 'writes multiple values with expiration time' do
91
- store.write_multi({
92
- 'rabbit' => white_rabbit,
93
- 'irish whisky' => 'Jameson'
94
- }, expires_in: 0.2.second)
89
+ it 'writes multiple values with expiration time' do
90
+ store.write_multi({
91
+ 'rabbit' => white_rabbit,
92
+ 'irish whisky' => 'Jameson'
93
+ }, expires_in: 0.2.second)
95
94
 
96
- expect(store.read_multi('rabbit', 'irish whisky')).to eq \
97
- 'rabbit' => white_rabbit,
98
- 'irish whisky' => 'Jameson'
95
+ expect(store.read_multi('rabbit', 'irish whisky')).to eq \
96
+ 'rabbit' => white_rabbit,
97
+ 'irish whisky' => 'Jameson'
99
98
 
100
- sleep 0.3
101
- expect(store.read_multi('rabbit', 'irish whisky')).to be_empty
102
- end
99
+ sleep 0.3
100
+ expect(store.read_multi('rabbit', 'irish whisky')).to be_empty
101
+ end
103
102
 
104
- it "sets expiry on cache miss" do
105
- store.fetch('rabbit', force: true, expires_in: 0.2.second) { white_rabbit }
106
- expect(store.fetch('rabbit')).to eq white_rabbit
107
- sleep 0.3
108
- expect(store.fetch('rabbit')).to be_nil
109
- end
103
+ it "sets expiry on cache miss" do
104
+ store.fetch('rabbit', force: true, expires_in: 0.2.second) { white_rabbit }
105
+ expect(store.fetch('rabbit')).to eq white_rabbit
106
+ sleep 0.3
107
+ expect(store.fetch('rabbit')).to be_nil
108
+ end
110
109
 
111
- it 'does not set expiry on cache hit' do
112
- expect(store.fetch('rabbit', expires_in: 0.2.second) { white_rabbit }).to eq rabbit
113
- sleep 0.3
114
- expect(store.fetch('rabbit')).to eq rabbit
115
- end
110
+ it 'does not set expiry on cache hit' do
111
+ expect(store.fetch('rabbit', expires_in: 0.2.second) { white_rabbit }).to eq rabbit
112
+ sleep 0.3
113
+ expect(store.fetch('rabbit')).to eq rabbit
116
114
  end
117
115
  end
118
116
 
@@ -236,23 +234,23 @@ describe "cache_moneta_store" do
236
234
  end
237
235
 
238
236
  context "with :Memory store" do
239
- let(:store){ described_class.new(store: :Memory) }
237
+ let(:store) { described_class.new(store: :Memory) }
240
238
  include_examples :moneta_store
241
239
  end
242
240
 
243
241
  context "with existing :Memory store" do
244
- let(:store){ described_class.new(store: ::Moneta.new(:Memory)) }
242
+ let(:store) { described_class.new(store: ::Moneta.new(:Memory)) }
245
243
  include_examples :moneta_store
246
244
  end
247
245
 
248
- context "with Redis store" do
249
- let(:store) {described_class.new(store: :Redis) }
246
+ context "with Redis store", adapter: :Redis do
247
+ let(:store) { described_class.new(store: :Redis) }
250
248
  include_examples :moneta_store
251
249
  end
252
250
  end
253
251
 
254
252
  describe ActiveSupport::Cache::MemoryStore do
255
- let(:store){ described_class.new }
253
+ let(:store) { described_class.new }
256
254
 
257
255
  include_examples :basic_store
258
256
  include_examples :expiry
@@ -260,8 +258,8 @@ describe "cache_moneta_store" do
260
258
  include_examples :basic_instrumentation
261
259
  end
262
260
 
263
- describe ActiveSupport::Cache::MemCacheStore do
264
- let(:store){ described_class.new('127.0.0.1:11213') }
261
+ describe ActiveSupport::Cache::MemCacheStore, memcached: true do
262
+ let(:store) { described_class.new('127.0.0.1:11213') }
265
263
 
266
264
  include_context :start_memcached, 11213
267
265
 
@@ -272,8 +270,8 @@ describe "cache_moneta_store" do
272
270
  include_examples :increment_decrement_instrumentation
273
271
  end
274
272
 
275
- describe ActiveSupport::Cache::RedisCacheStore do
276
- let(:store){ described_class.new(url: 'redis:///3') }
273
+ describe ActiveSupport::Cache::RedisCacheStore, redis: true do
274
+ let(:store) { described_class.new(url: "redis:///3") }
277
275
 
278
276
  include_examples :basic_store
279
277
  include_examples :expiry
@@ -8,9 +8,8 @@ shared_examples :concurrent_increment do
8
8
  increments = (0...100).map { [] }
9
9
  100.times do
10
10
  100.times do |j|
11
- increments[j] << s.increment(j.to_s, 1, expires: false).tap do
12
- Thread.pass if rand(1000) >= 995
13
- end
11
+ increments[j] << s.increment(j.to_s, 1, expires: false)
12
+ Thread.pass if rand(1000) >= 995
14
13
  end
15
14
  end
16
15
  increments
@@ -1,19 +1,19 @@
1
1
  shared_examples :create_expires do
2
- at_each_usec do
3
- it 'creates the given key and expires it' do
4
- store.create('key','value', expires: min_ttl).should be true
5
- store['key'].should == 'value'
6
- advance min_ttl + t_res
7
- store.key?('key').should be false
8
- end
2
+ it 'creates the given key and expires it' do
3
+ store.create('key','value', expires: min_ttl).should be true
4
+ store['key'].should == 'value'
5
+ advance min_ttl
6
+ 2.times { advance_next_tick }
7
+ store.key?('key').should be false
8
+ end
9
9
 
10
- it 'does not change expires if the key exists' do
11
- store.store('key', 'value', expires: false).should == 'value'
12
- store.create('key','another value', expires: min_ttl).should be false
13
- store['key'].should == 'value'
14
- advance min_ttl + t_res
15
- store['key'].should == 'value'
16
- store.key?('key').should be true
17
- end
10
+ it 'does not change expires if the key exists' do
11
+ store.store('key', 'value', expires: false).should == 'value'
12
+ store.create('key','another value', expires: min_ttl).should be false
13
+ store['key'].should == 'value'
14
+ advance min_ttl
15
+ 2.times { advance_next_tick }
16
+ store['key'].should == 'value'
17
+ store.key?('key').should be true
18
18
  end
19
19
  end
@@ -1,15 +1,14 @@
1
1
  shared_examples :default_expires do
2
- at_each_usec do
3
- it 'sets the default expiration time', default_expires: true do
4
- store['key1'] = 'val1'
5
- advance(t_res / 4.0) # sleep less than a single time-space
6
- store.key?('key1').should be true
7
- store.fetch('key1').should == 'val1'
8
- store.load('key1').should == 'val1'
9
- advance min_ttl + t_res
10
- store.key?('key1').should be false
11
- store.fetch('key1').should be_nil
12
- store.load('key1').should be_nil
13
- end
2
+ it 'sets the default expiration time', default_expires: true do
3
+ store['key1'] = 'val1'
4
+ advance(t_res / 4.0) # sleep less than a single time-space
5
+ store.key?('key1').should be true
6
+ store.fetch('key1').should == 'val1'
7
+ store.load('key1').should == 'val1'
8
+ advance min_ttl
9
+ 2.times { advance_next_tick }
10
+ store.key?('key1').should be false
11
+ store.fetch('key1').should be_nil
12
+ store.load('key1').should be_nil
14
13
  end
15
14
  end
@@ -3,289 +3,294 @@ shared_examples :expires do
3
3
  raise "t_res must be <= min_ttl" unless t_res <= min_ttl
4
4
  end
5
5
 
6
- at_each_usec do
7
- # All methods that are used for updating that include an :expires parameter
8
- shared_examples :updater_expiry do
9
- context "with a positive numeric :expires parameter" do
10
- before do
11
- updater.call(expires: min_ttl)
12
- end
6
+ # All methods that are used for updating that include an :expires parameter
7
+ shared_examples :updater_expiry do
8
+ context "with a positive numeric :expires parameter" do
9
+ before do
10
+ updater.call(expires: min_ttl)
11
+ end
13
12
 
14
- it 'causes the value to expire after the given number of seconds' do
15
- keys.zip(values).each do |key, value|
16
- expect(store.load(key)).to eq value
17
- expect(store[key]).to eq value
18
- end
19
- advance min_ttl + t_res
20
- keys.each do |key, value|
21
- expect(store.load(key)).to be_nil
22
- expect(store[key]).to be_nil
23
- end
13
+ it 'causes the value to expire after the given number of seconds' do
14
+ keys.zip(values).each do |key, value|
15
+ expect(store.load(key)).to eq value
16
+ expect(store[key]).to eq value
17
+ end
18
+ advance min_ttl
19
+ 2.times { advance_next_tick }
20
+ keys.each do |key, value|
21
+ expect(store.load(key)).to be_nil
22
+ expect(store[key]).to be_nil
24
23
  end
25
24
  end
25
+ end
26
26
 
27
- shared_examples :updater_no_expires do
28
- it 'causes the value not to expire after the given number of seconds' do
29
- updater.call(expires: expires)
30
- keys.zip(values).each do |key, value|
31
- expect(store.load(key)).to eq value
32
- expect(store[key]).to eq value
33
- end
34
- advance min_ttl + t_res
35
- keys.zip(values).each do |key, value|
36
- expect(store.load(key)).to eq value
37
- expect(store[key]).to eq value
38
- end
27
+ shared_examples :updater_no_expires do
28
+ it 'causes the value not to expire after the given number of seconds' do
29
+ updater.call(expires: expires)
30
+ keys.zip(values).each do |key, value|
31
+ expect(store.load(key)).to eq value
32
+ expect(store[key]).to eq value
33
+ end
34
+ advance min_ttl
35
+ 2.times { advance_next_tick }
36
+ keys.zip(values).each do |key, value|
37
+ expect(store.load(key)).to eq value
38
+ expect(store[key]).to eq value
39
39
  end
40
40
  end
41
+ end
41
42
 
42
- context "with a zero :expires parameter" do
43
- let(:expires) { 0 }
44
- include_examples :updater_no_expires
45
- end
43
+ context "with a zero :expires parameter" do
44
+ let(:expires) { 0 }
45
+ include_examples :updater_no_expires
46
+ end
46
47
 
47
- context "with a false :expires parameter" do
48
- let(:expires) { false }
49
- include_examples :updater_no_expires
50
- end
48
+ context "with a false :expires parameter" do
49
+ let(:expires) { false }
50
+ include_examples :updater_no_expires
51
51
  end
52
+ end
52
53
 
53
- # All methods that are used to for loading, and that include an expire parameter
54
- shared_examples :loader_expiry do
55
- it "does not affect expiry if the value is not present" do
56
- expect(loader.call(expires: min_ttl)).to be_absent
57
- expect(loader.call).to be_absent
58
- end
54
+ # All methods that are used to for loading, and that include an expire parameter
55
+ shared_examples :loader_expiry do
56
+ it "does not affect expiry if the value is not present" do
57
+ expect(loader.call(expires: min_ttl)).to be_absent
58
+ expect(loader.call).to be_absent
59
+ end
59
60
 
60
- shared_examples :loader_expires do
61
- context 'when passed a positive numeric :expires parameter' do
62
- it 'changes the expiry of the value(s) to the given number of seconds' do
63
- expect(loader.call).to be_present
64
- expect(loader.call(expires: min_ttl + 2 * t_res)).to be_present
65
- advance min_ttl + t_res
66
- expect(loader.call).to be_present
67
- advance 2 * t_res
68
- expect(loader.call).to be_absent
69
- end
61
+ shared_examples :loader_expires do
62
+ context 'when passed a positive numeric :expires parameter' do
63
+ it 'changes the expiry of the value(s) to the given number of seconds' do
64
+ expect(loader.call).to be_present
65
+ expect(loader.call(expires: min_ttl + 2 * t_res)).to be_present
66
+ advance min_ttl
67
+ advance_next_tick
68
+ expect(loader.call).to be_present
69
+ 2.times { advance_next_tick }
70
+ expect(loader.call).to be_absent
70
71
  end
71
72
  end
73
+ end
72
74
 
73
- context 'with previously stored expiring value(s)' do
74
- before do
75
- keys.zip(values).each do |key, value|
76
- store.store(key, value, expires: min_ttl)
77
- end
75
+ context 'with previously stored expiring value(s)' do
76
+ before do
77
+ keys.zip(values).each do |key, value|
78
+ store.store(key, value, expires: min_ttl)
78
79
  end
79
- include_examples :loader_expires
80
-
81
- shared_examples :loader_no_expires do
82
- it "changes the expiry of the value(s) so that they don't expire" do
83
- expect(loader.call(expires: expires)).to be_present
84
- advance min_ttl + t_res
85
- expect(loader.call).to be_present
86
- end
80
+ end
81
+ include_examples :loader_expires
82
+
83
+ shared_examples :loader_no_expires do
84
+ it "changes the expiry of the value(s) so that they don't expire" do
85
+ expect(loader.call(expires: expires)).to be_present
86
+ advance min_ttl
87
+ advance_next_tick
88
+ expect(loader.call).to be_present
87
89
  end
90
+ end
88
91
 
89
- context "when passed a zero :expires parameter" do
90
- let(:expires) { 0 }
91
- include_examples :loader_no_expires
92
- end
92
+ context "when passed a zero :expires parameter" do
93
+ let(:expires) { 0 }
94
+ include_examples :loader_no_expires
95
+ end
93
96
 
94
- context "when passed false :expires parameter" do
95
- let(:expires) { false }
96
- include_examples :loader_no_expires
97
- end
97
+ context "when passed false :expires parameter" do
98
+ let(:expires) { false }
99
+ include_examples :loader_no_expires
100
+ end
98
101
 
99
- shared_examples :loader_no_effect do
100
- it 'does not affect the expiry time' do
101
- expect(loader_no_effect.call).to be_present
102
- advance min_ttl + t_res
103
- expect(loader.call).to be_absent
104
- end
102
+ shared_examples :loader_no_effect do
103
+ it 'does not affect the expiry time' do
104
+ expect(loader_no_effect.call).to be_present
105
+ advance min_ttl
106
+ advance_next_tick
107
+ expect(loader.call).to be_absent
105
108
  end
109
+ end
106
110
 
107
- context 'when passed a nil :expires parameter' do
108
- let(:loader_no_effect) { lambda { loader.call(expires: nil) } }
109
- include_examples :loader_no_effect
110
- end
111
+ context 'when passed a nil :expires parameter' do
112
+ let(:loader_no_effect) { lambda { loader.call(expires: nil) } }
113
+ include_examples :loader_no_effect
114
+ end
111
115
 
112
- context 'when not passed an :expires parameter' do
113
- let(:loader_no_effect) { loader }
114
- include_examples :loader_no_effect
115
- end
116
+ context 'when not passed an :expires parameter' do
117
+ let(:loader_no_effect) { loader }
118
+ include_examples :loader_no_effect
116
119
  end
120
+ end
117
121
 
118
- context "with previously stored not expiring value(s)" do
119
- before do
120
- keys.zip(values).each do |key, value|
121
- store.store(key, value, expires: false)
122
- end
122
+ context "with previously stored not expiring value(s)" do
123
+ before do
124
+ keys.zip(values).each do |key, value|
125
+ store.store(key, value, expires: false)
123
126
  end
124
- include_examples :loader_expires
125
127
  end
128
+ include_examples :loader_expires
126
129
  end
130
+ end
127
131
 
128
- describe '#store' do
129
- let(:keys) { ['key1'] }
130
- let(:values) { ['value1'] }
131
- let(:updater) do
132
- lambda do |**options|
133
- expect(store.store(keys[0], values[0], options)).to eq values[0]
134
- end
132
+ describe '#store' do
133
+ let(:keys) { ['key1'] }
134
+ let(:values) { ['value1'] }
135
+ let(:updater) do
136
+ lambda do |**options|
137
+ expect(store.store(keys[0], values[0], options)).to eq values[0]
135
138
  end
139
+ end
136
140
 
137
- include_examples :updater_expiry
141
+ include_examples :updater_expiry
142
+ end
143
+
144
+ describe '#load' do
145
+ let(:keys) { ['key1'] }
146
+ let(:values) { ['value1'] }
147
+ let(:loader) do
148
+ lambda { |**options| store.load('key1', options) }
149
+ end
150
+ let(:be_present) { eq 'value1' }
151
+ let(:be_absent) { be_nil }
152
+
153
+ include_examples :loader_expiry
154
+ end
155
+
156
+ describe '#key?' do
157
+ let(:keys) { ['key1'] }
158
+ let(:values) { ['value1'] }
159
+ let(:loader) do
160
+ lambda { |**options| store.key?('key1', options) }
138
161
  end
162
+ let(:be_present) { be true }
163
+ let(:be_absent) { be false }
164
+
165
+ include_examples :loader_expiry
166
+ end
139
167
 
140
- describe '#load' do
141
- let(:keys) { ['key1'] }
142
- let(:values) { ['value1'] }
168
+ describe '#fetch' do
169
+ let(:keys) { ['key1'] }
170
+ let(:values) { ['value1'] }
171
+ let(:be_present) { eq 'value1' }
172
+
173
+ context "with default given as second parameter" do
143
174
  let(:loader) do
144
- lambda { |**options| store.load('key1', options) }
175
+ lambda { |**options| store.fetch('key1', 'missing', options) }
145
176
  end
146
- let(:be_present) { eq 'value1' }
147
- let(:be_absent) { be_nil }
177
+ let(:be_absent) { eq 'missing' }
148
178
 
149
179
  include_examples :loader_expiry
150
180
  end
151
181
 
152
- describe '#key?' do
153
- let(:keys) { ['key1'] }
154
- let(:values) { ['value1'] }
182
+ context "with default given as a block" do
155
183
  let(:loader) do
156
- lambda { |**options| store.key?('key1', options) }
184
+ lambda { |**options| store.fetch('key1', options) { 'missing' } }
157
185
  end
158
- let(:be_present) { be true }
159
- let(:be_absent) { be false }
186
+ let(:be_absent) { eq 'missing' }
160
187
 
161
188
  include_examples :loader_expiry
162
189
  end
163
190
 
164
- describe '#fetch' do
165
- let(:keys) { ['key1'] }
166
- let(:values) { ['value1'] }
167
- let(:be_present) { eq 'value1' }
168
-
169
- context "with default given as second parameter" do
170
- let(:loader) do
171
- lambda { |**options| store.fetch('key1', 'missing', options) }
172
- end
173
- let(:be_absent) { eq 'missing' }
174
-
175
- include_examples :loader_expiry
191
+ context "with nil default given" do
192
+ let(:loader) do
193
+ lambda { |**options| store.fetch('key1', nil, options) }
176
194
  end
195
+ let(:be_absent) { be_nil }
177
196
 
178
- context "with default given as a block" do
179
- let(:loader) do
180
- lambda { |**options| store.fetch('key1', options) { 'missing' } }
181
- end
182
- let(:be_absent) { eq 'missing' }
197
+ include_examples :loader_expiry
198
+ end
199
+ end
183
200
 
184
- include_examples :loader_expiry
201
+ describe '#delete' do
202
+ context 'with an already expired value' do
203
+ before do
204
+ store.store('key2', 'val2', expires: min_ttl)
205
+ expect(store['key2']).to eq 'val2'
206
+ advance min_ttl
207
+ advance_next_tick
185
208
  end
186
209
 
187
- context "with nil default given" do
188
- let(:loader) do
189
- lambda { |**options| store.fetch('key1', nil, options) }
190
- end
191
- let(:be_absent) { be_nil }
192
-
193
- include_examples :loader_expiry
210
+ it 'does not return the expired value' do
211
+ expect(store.delete('key2')).to be_nil
194
212
  end
195
213
  end
214
+ end
196
215
 
197
- describe '#delete' do
198
- context 'with an already expired value' do
199
- before do
200
- store.store('key2', 'val2', expires: min_ttl)
201
- expect(store['key2']).to eq 'val2'
202
- advance min_ttl + t_res
203
- end
216
+ describe '#expires' do
217
+ it "returns a store with access to the same items" do
218
+ store.store('persistent_key', 'persistent_value', expires: false)
219
+ store_expires = store.expires(min_ttl)
220
+ expect(store_expires['persistent_key']).to eq 'persistent_value'
221
+ end
204
222
 
205
- it 'does not return the expired value' do
206
- expect(store.delete('key2')).to be_nil
207
- end
208
- end
223
+ it "returns a store with default expiry set" do
224
+ store_expires = store.expires(min_ttl)
225
+ expect(store_expires.store('key1', 'val1')).to eq 'val1'
226
+ expect(store_expires['key1']).to eq 'val1'
227
+ advance min_ttl
228
+ advance_next_tick
229
+ expect(store['key1']).to be_nil
209
230
  end
231
+ end
210
232
 
211
- describe '#expires' do
212
- it "returns a store with access to the same items" do
213
- store.store('persistent_key', 'persistent_value', expires: false)
214
- store_expires = store.expires(min_ttl)
215
- expect(store_expires['persistent_key']).to eq 'persistent_value'
233
+ describe '#merge!' do
234
+ let(:keys) { ['key1', 'key2'] }
235
+ let(:values) { ['value1', 'value2'] }
236
+ let(:updater) do
237
+ lambda do |**options|
238
+ expect(store.merge!(keys.zip(values), options)).to eq store
216
239
  end
240
+ end
217
241
 
218
- it "returns a store with default expiry set" do
219
- store_expires = store.expires(min_ttl)
220
- expect(store_expires.store('key1', 'val1')).to eq 'val1'
221
- expect(store_expires['key1']).to eq 'val1'
222
- advance min_ttl + t_res
223
- expect(store['key1']).to be_nil
224
- end
242
+ include_examples :updater_expiry
243
+ end
244
+
245
+ describe '#values_at' do
246
+ let(:keys) { ['key1', 'key2'] }
247
+ let(:values) { ['value1', 'value2'] }
248
+ let(:loader) do
249
+ lambda { |**options| store.values_at('key1', 'key2', **options) }
225
250
  end
251
+ let(:be_present) { eq ['value1', 'value2'] }
252
+ let(:be_absent) { eq [nil, nil] }
226
253
 
227
- describe '#merge!' do
228
- let(:keys) { ['key1', 'key2'] }
229
- let(:values) { ['value1', 'value2'] }
230
- let(:updater) do
254
+ include_examples :loader_expiry
255
+ end
256
+
257
+ describe '#fetch_values' do
258
+ let(:keys) { ['key1', 'key2'] }
259
+ let(:values) { ['value1', 'value2'] }
260
+ let(:be_present) { eq ['value1', 'value2'] }
261
+
262
+ context 'with default values given via a block' do
263
+ let(:loader) do
231
264
  lambda do |**options|
232
- expect(store.merge!(keys.zip(values), options)).to eq store
265
+ store.fetch_values('key1', 'key2', **options) { |k| "#{k} missing" }
233
266
  end
234
267
  end
268
+ let(:be_absent) { eq ['key1 missing', 'key2 missing'] }
235
269
 
236
- include_examples :updater_expiry
270
+ include_examples :loader_expiry
237
271
  end
238
272
 
239
- describe '#values_at' do
240
- let(:keys) { ['key1', 'key2'] }
241
- let(:values) { ['value1', 'value2'] }
273
+ context 'without default values given' do
242
274
  let(:loader) do
243
- lambda { |**options| store.values_at('key1', 'key2', **options) }
275
+ lambda do |**options|
276
+ store.fetch_values('key1', 'key2', **options)
277
+ end
244
278
  end
245
- let(:be_present) { eq ['value1', 'value2'] }
246
279
  let(:be_absent) { eq [nil, nil] }
247
280
 
248
281
  include_examples :loader_expiry
249
282
  end
283
+ end
250
284
 
251
- describe '#fetch_values' do
252
- let(:keys) { ['key1', 'key2'] }
253
- let(:values) { ['value1', 'value2'] }
254
- let(:be_present) { eq ['value1', 'value2'] }
255
-
256
- context 'with default values given via a block' do
257
- let(:loader) do
258
- lambda do |**options|
259
- store.fetch_values('key1', 'key2', **options) { |k| "#{k} missing" }
260
- end
261
- end
262
- let(:be_absent) { eq ['key1 missing', 'key2 missing'] }
263
-
264
- include_examples :loader_expiry
265
- end
266
-
267
- context 'without default values given' do
268
- let(:loader) do
269
- lambda do |**options|
270
- store.fetch_values('key1', 'key2', **options)
271
- end
272
- end
273
- let(:be_absent) { eq [nil, nil] }
274
-
275
- include_examples :loader_expiry
276
- end
285
+ describe '#slice' do
286
+ let(:keys) { ['key1', 'key2'] }
287
+ let(:values) { ['value1', 'value2'] }
288
+ let(:loader) do
289
+ lambda { |**options| store.slice('key1', 'key2', **options) }
277
290
  end
291
+ let(:be_present) { contain_exactly(['key1', 'value1'], ['key2', 'value2']) }
292
+ let(:be_absent) { be_empty }
278
293
 
279
- describe '#slice' do
280
- let(:keys) { ['key1', 'key2'] }
281
- let(:values) { ['value1', 'value2'] }
282
- let(:loader) do
283
- lambda { |**options| store.slice('key1', 'key2', **options) }
284
- end
285
- let(:be_present) { contain_exactly(['key1', 'value1'], ['key2', 'value2']) }
286
- let(:be_absent) { be_empty }
287
-
288
- include_examples :loader_expiry
289
- end
294
+ include_examples :loader_expiry
290
295
  end
291
296
  end