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
data/lib/moneta/server.rb CHANGED
@@ -4,14 +4,17 @@ module Moneta
4
4
  # Moneta server to be used together with Moneta::Adapters::Client
5
5
  # @api public
6
6
  class Server
7
- TIMEOUT = 1
8
- MAXSIZE = 0x100000
7
+ include Config
8
+
9
+ config :timeout, default: 1
10
+ config :max_size, default: 0x100000
9
11
 
10
12
  # @api private
11
13
  class Connection
12
- def initialize(io, store)
14
+ def initialize(io, store, max_size)
13
15
  @io = io
14
16
  @store = store
17
+ @max_size = max_size
15
18
  @fiber = Fiber.new { run }
16
19
  end
17
20
 
@@ -58,7 +61,7 @@ module Moneta
58
61
 
59
62
  def read_msg
60
63
  size = read(4).unpack('N').first
61
- throw :closed, 'Message too big' if size > MAXSIZE
64
+ throw :closed, 'Message too big' if size > @max_size
62
65
  Marshal.load(read(size))
63
66
  end
64
67
 
@@ -155,9 +158,13 @@ module Moneta
155
158
  # @param [Hash] options
156
159
  # @option options [Integer] :port (9000) TCP port
157
160
  # @option options [String] :socket Alternative Unix socket file name
161
+ # @option options [Integer] :timeout (1) Number of seconds to timeout on IO.select
162
+ # @option options [Integer] :max_size (0x100000) Maximum number of bytes
163
+ # allowed to be sent by clients in requests
158
164
  def initialize(store, options = {})
165
+ options = configure(**options)
159
166
  @store = store
160
- @server = start(options)
167
+ @server = start(**options)
161
168
  @ios = [@server]
162
169
  @reads = @ios.dup
163
170
  @writes = []
@@ -187,7 +194,7 @@ module Moneta
187
194
  @ios
188
195
  .reject { |io| io == @server }
189
196
  .each { |io| close_connection(io) }
190
- File.unlink(@socket) if @socket rescue nil
197
+ File.unlink(config.socket) if config.socket rescue nil
191
198
  end
192
199
  end
193
200
 
@@ -202,7 +209,7 @@ module Moneta
202
209
  private
203
210
 
204
211
  def mainloop
205
- if ready = IO.select(@reads, @writes, @ios, TIMEOUT)
212
+ if ready = IO.select(@reads, @writes, @ios, config.timeout)
206
213
  reads, writes, errors = ready
207
214
  errors.each { |io| close_connection(io) }
208
215
 
@@ -229,7 +236,7 @@ module Moneta
229
236
 
230
237
  def accept_connection
231
238
  io = @server.accept
232
- @connections[io] = Connection.new(io, @store)
239
+ @connections[io] = Connection.new(io, @store, config.max_size)
233
240
  @ios << io
234
241
  resume(io)
235
242
  ensure
@@ -261,21 +268,21 @@ module Moneta
261
268
  end
262
269
  end
263
270
 
264
- def start(options)
265
- if @socket = options[:socket]
271
+ def start(host: '127.0.0.1', port: 9000, socket: nil)
272
+ if socket
266
273
  begin
267
- UNIXServer.open(@socket)
274
+ UNIXServer.open(socket)
268
275
  rescue Errno::EADDRINUSE
269
- if client = (UNIXSocket.open(@socket) rescue nil)
276
+ if client = (UNIXSocket.open(socket) rescue nil)
270
277
  client.close
271
278
  raise
272
279
  end
273
- File.unlink(@socket)
280
+ File.unlink(socket)
274
281
  tries ||= 0
275
282
  (tries += 1) < 3 ? retry : raise
276
283
  end
277
284
  else
278
- TCPServer.open(options[:host] || '127.0.0.1', options[:port] || 9000)
285
+ TCPServer.open(host, port)
279
286
  end
280
287
  end
281
288
 
@@ -1,5 +1,5 @@
1
1
  module Moneta
2
2
  # Moneta version number
3
3
  # @api public
4
- VERSION = '1.4.1'.freeze
4
+ VERSION = '1.5.1'.freeze
5
5
  end
@@ -71,5 +71,10 @@ module Moneta
71
71
  def merge!(pairs, options = {})
72
72
  wrap(:merge!, pairs, options) { super }
73
73
  end
74
+
75
+ # (see Proxy#config)
76
+ def config
77
+ wrap(:config) { super }
78
+ end
74
79
  end
75
80
  end
data/lib/moneta.rb CHANGED
@@ -3,9 +3,11 @@
3
3
  # * {Moneta.new}
4
4
  # * {Moneta.build}
5
5
  module Moneta
6
+ autoload :Adapter, 'moneta/adapter'
6
7
  autoload :Builder, 'moneta/builder'
7
8
  autoload :Cache, 'moneta/cache'
8
9
  autoload :CreateSupport, 'moneta/create_support'
10
+ autoload :Config, 'moneta/config'
9
11
  autoload :DBMAdapter, 'moneta/dbm_adapter'
10
12
  autoload :Defaults, 'moneta/defaults'
11
13
  autoload :EachKeySupport, 'moneta/each_key_support'
data/moneta.gemspec CHANGED
@@ -26,6 +26,7 @@ Gem::Specification.new do |s|
26
26
 
27
27
  s.required_ruby_version = '>= 2.3.0'
28
28
 
29
+ s.add_development_dependency 'multi_json', '~> 1.15.0'
29
30
  s.add_development_dependency 'parallel_tests', '~> 2.29.2'
30
31
  s.add_development_dependency 'rantly', '~> 1.2.0'
31
32
  s.add_development_dependency 'rspec', '~> 3.0'
@@ -74,7 +74,7 @@ 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
 
@@ -88,9 +88,9 @@ describe "cache_moneta_store" do
88
88
 
89
89
  it 'writes multiple values with expiration time' do
90
90
  store.write_multi({
91
- 'rabbit' => white_rabbit,
92
- 'irish whisky' => 'Jameson'
93
- }, expires_in: 0.2.second)
91
+ 'rabbit' => white_rabbit,
92
+ 'irish whisky' => 'Jameson'
93
+ }, expires_in: 0.2.second)
94
94
 
95
95
  expect(store.read_multi('rabbit', 'irish whisky')).to eq \
96
96
  'rabbit' => white_rabbit,
@@ -234,23 +234,23 @@ describe "cache_moneta_store" do
234
234
  end
235
235
 
236
236
  context "with :Memory store" do
237
- let(:store){ described_class.new(store: :Memory) }
237
+ let(:store) { described_class.new(store: :Memory) }
238
238
  include_examples :moneta_store
239
239
  end
240
240
 
241
241
  context "with existing :Memory store" do
242
- let(:store){ described_class.new(store: ::Moneta.new(:Memory)) }
242
+ let(:store) { described_class.new(store: ::Moneta.new(:Memory)) }
243
243
  include_examples :moneta_store
244
244
  end
245
245
 
246
- context "with Redis store" do
247
- let(:store) {described_class.new(store: :Redis) }
246
+ context "with Redis store", adapter: :Redis do
247
+ let(:store) { described_class.new(store: :Redis) }
248
248
  include_examples :moneta_store
249
249
  end
250
250
  end
251
251
 
252
252
  describe ActiveSupport::Cache::MemoryStore do
253
- let(:store){ described_class.new }
253
+ let(:store) { described_class.new }
254
254
 
255
255
  include_examples :basic_store
256
256
  include_examples :expiry
@@ -258,8 +258,8 @@ describe "cache_moneta_store" do
258
258
  include_examples :basic_instrumentation
259
259
  end
260
260
 
261
- describe ActiveSupport::Cache::MemCacheStore do
262
- 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') }
263
263
 
264
264
  include_context :start_memcached, 11213
265
265
 
@@ -270,8 +270,8 @@ describe "cache_moneta_store" do
270
270
  include_examples :increment_decrement_instrumentation
271
271
  end
272
272
 
273
- describe ActiveSupport::Cache::RedisCacheStore do
274
- 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") }
275
275
 
276
276
  include_examples :basic_store
277
277
  include_examples :expiry
@@ -1,66 +1,66 @@
1
1
  shared_examples :null do
2
2
  it 'reads from keys like a Hash' do
3
- moneta_property_of(keys: 1).check do |keys:|
4
- store[keys[0]].should be_nil
5
- store.load(keys[0]).should be_nil
3
+ moneta_property_of(keys: 1).check do |m|
4
+ store[m.keys[0]].should be_nil
5
+ store.load(m.keys[0]).should be_nil
6
6
  end
7
7
  end
8
8
 
9
9
  it 'guarantees that the same value is returned when setting a key' do
10
- moneta_property_of(keys: 1, values: 1).check do |keys:, values:|
11
- (store[keys[0]] = values[0]).should equal(values[0])
10
+ moneta_property_of(keys: 1, values: 1).check do |m|
11
+ (store[m.keys[0]] = m.values[0]).should equal(m.values[0])
12
12
  end
13
13
  end
14
14
 
15
15
  it 'returns false from #key? if a key is not available' do
16
- moneta_property_of(keys: 1).check(1) do |keys:|
17
- store.key?(keys[0]).should be false
16
+ moneta_property_of(keys: 1).check(1) do |m|
17
+ store.key?(m.keys[0]).should be false
18
18
  end
19
19
  end
20
20
 
21
21
  it 'returns nil from delete if a value for a key does not exist' do
22
- moneta_property_of(keys: 1).check do |keys:|
23
- store.delete(keys[0]).should be_nil
22
+ moneta_property_of(keys: 1).check do |m|
23
+ store.delete(m.keys[0]).should be_nil
24
24
  end
25
25
  end
26
26
 
27
27
  it 'removes all keys from the store with clear' do
28
- moneta_property_of(keys: 2, values: 2).check do |keys:, values:|
29
- store[keys[0]] = values[0]
30
- store[keys[1]] = values[1]
28
+ moneta_property_of(keys: 2, values: 2).check do |m|
29
+ store[m.keys[0]] = m.values[0]
30
+ store[m.keys[1]] = m.values[1]
31
31
  store.clear.should equal(store)
32
- store.key?(keys[0]).should be false
33
- store.key?(keys[1]).should be false
32
+ store.key?(m.keys[0]).should be false
33
+ store.key?(m.keys[1]).should be false
34
34
  end
35
35
  end
36
36
 
37
37
  it 'fetches a key with a default value with fetch, if the key is not available' do
38
- moneta_property_of(keys: 1, values: 1).check do |keys:, values:|
39
- store.fetch(keys[0], values[0]).should == values[0]
38
+ moneta_property_of(keys: 1, values: 1).check do |m|
39
+ store.fetch(m.keys[0], m.values[0]).should == m.values[0]
40
40
  end
41
41
  end
42
42
 
43
43
  it 'fetches a key with a block with fetch, if the key is not available' do
44
- moneta_property_of(keys: 1, values: 1).check do |keys:, values:|
45
- store.fetch(keys[0]) do |k|
46
- k.should equal(keys[0])
47
- values[0]
48
- end.should equal(values[0])
44
+ moneta_property_of(keys: 1, values: 1).check do |m|
45
+ store.fetch(m.keys[0]) do |k|
46
+ k.should equal(m.keys[0])
47
+ m.values[0]
48
+ end.should equal(m.values[0])
49
49
  end
50
50
  end
51
51
 
52
52
  it 'accepts frozen options' do
53
- moneta_property_of(keys: 1, values: 1).check do |keys:, values:|
53
+ moneta_property_of(keys: 1, values: 1).check do |m|
54
54
  options = {option1: 1, options2: 2}
55
55
  options.freeze
56
56
  store.clear.should equal(store)
57
- store.key?(keys[0], options).should be false
58
- store.load(keys[0], options).should be_nil
59
- store.fetch(keys[0], 42, options).should == 42
60
- store.fetch(keys[0], options) { 42 }.should == 42
61
- store.delete(keys[0], options).should be_nil
57
+ store.key?(m.keys[0], options).should be false
58
+ store.load(m.keys[0], options).should be_nil
59
+ store.fetch(m.keys[0], 42, options).should == 42
60
+ store.fetch(m.keys[0], options) { 42 }.should == 42
61
+ store.delete(m.keys[0], options).should be_nil
62
62
  store.clear(options).should equal(store)
63
- store.store(keys[0], values[0], options).should == values[0]
63
+ store.store(m.keys[0], m.values[0], options).should == m.values[0]
64
64
  end
65
65
  end
66
66
  end
@@ -1,12 +1,12 @@
1
1
  shared_examples :persist do
2
2
  it 'persists values' do
3
- moneta_property_of(keys: 1, values: 1).check do |keys:, values:|
3
+ moneta_property_of(keys: 1, values: 1).check do |m|
4
4
  new_store.tap do |store|
5
- store[keys[0]] = values[0]
5
+ store[m.keys[0]] = m.values[0]
6
6
  store.close
7
7
  end
8
8
  new_store.tap do |store|
9
- store[keys[0]].should == values[0]
9
+ store[m.keys[0]].should == m.values[0]
10
10
  store.close
11
11
  end
12
12
  end
@@ -1,9 +1,9 @@
1
1
  shared_examples :returndifferent do
2
2
  it 'guarantees that a different value is retrieved' do
3
- moneta_property_of(keys: 1, values: 1).check do |keys:, values:|
4
- next if [TrueClass,FalseClass,NilClass,Numeric].any?(&values[0].method(:is_a?))
5
- store[keys[0]] = values[0]
6
- store[keys[0]].should_not be_equal(values[0])
3
+ moneta_property_of(keys: 1, values: 1).check do |m|
4
+ next if [TrueClass,FalseClass,NilClass,Numeric].any?(&m.values[0].method(:is_a?))
5
+ store[m.keys[0]] = m.values[0]
6
+ store[m.keys[0]].should_not be_equal(m.values[0])
7
7
  end
8
8
  end
9
9
  end
@@ -1,9 +1,9 @@
1
1
  shared_examples :returnsame do
2
2
  it 'guarantees that the same value is retrieved' do
3
- moneta_property_of(keys: 1, values: 1).check do |keys:, values:|
4
- next if [TrueClass,FalseClass,Numeric].any?(&values[0].method(:is_a?))
5
- store[keys[0]] = values[0]
6
- store[keys[0]].should be_equal(values[0])
3
+ moneta_property_of(keys: 1, values: 1).check do |m|
4
+ next if [TrueClass, FalseClass, Numeric].any?(&m.values[0].method(:is_a?))
5
+ store[m.keys[0]] = m.values[0]
6
+ store[m.keys[0]].should be_equal(m.values[0])
7
7
  end
8
8
  end
9
9
  end