moneta 0.7.1 → 0.7.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.yardopts +1 -0
- data/CHANGES +21 -10
- data/README.md +1 -1
- data/SPEC.md +4 -12
- data/lib/moneta.rb +7 -5
- data/lib/moneta/adapters/activerecord.rb +9 -3
- data/lib/moneta/adapters/cassandra.rb +9 -4
- data/lib/moneta/adapters/client.rb +9 -3
- data/lib/moneta/adapters/cookie.rb +3 -0
- data/lib/moneta/adapters/couch.rb +8 -3
- data/lib/moneta/adapters/datamapper.rb +8 -3
- data/lib/moneta/adapters/dbm.rb +1 -2
- data/lib/moneta/adapters/file.rb +9 -4
- data/lib/moneta/adapters/fog.rb +8 -3
- data/lib/moneta/adapters/gdbm.rb +1 -2
- data/lib/moneta/adapters/hbase.rb +10 -3
- data/lib/moneta/adapters/leveldb.rb +3 -2
- data/lib/moneta/adapters/localmemcache.rb +4 -4
- data/lib/moneta/adapters/lruhash.rb +8 -4
- data/lib/moneta/adapters/memcached/dalli.rb +10 -4
- data/lib/moneta/adapters/memcached/native.rb +9 -4
- data/lib/moneta/adapters/memory.rb +8 -3
- data/lib/moneta/adapters/mongo.rb +7 -3
- data/lib/moneta/adapters/null.rb +8 -1
- data/lib/moneta/adapters/pstore.rb +9 -3
- data/lib/moneta/adapters/redis.rb +10 -4
- data/lib/moneta/adapters/riak.rb +12 -7
- data/lib/moneta/adapters/sdbm.rb +1 -2
- data/lib/moneta/adapters/sequel.rb +9 -3
- data/lib/moneta/adapters/sqlite.rb +10 -4
- data/lib/moneta/adapters/tokyocabinet.rb +2 -2
- data/lib/moneta/builder.rb +11 -7
- data/lib/moneta/cache.rb +16 -6
- data/lib/moneta/expires.rb +12 -6
- data/lib/moneta/lock.rb +0 -2
- data/lib/moneta/logger.rb +0 -2
- data/lib/moneta/mixins.rb +175 -47
- data/lib/moneta/optionmerger.rb +2 -0
- data/lib/moneta/proxy.rb +14 -30
- data/lib/moneta/server.rb +0 -2
- data/lib/moneta/shared.rb +1 -3
- data/lib/moneta/stack.rb +20 -10
- data/lib/moneta/transformer.rb +84 -61
- data/lib/moneta/version.rb +1 -1
- data/lib/rack/moneta_rest.rb +56 -0
- data/moneta.gemspec +1 -1
- data/spec/active_support/cache_moneta_store_spec.rb +4 -4
- data/spec/generate.rb +216 -203
- data/spec/helper.rb +0 -6
- data/spec/moneta/adapter_cassandra_spec.rb +2 -2
- data/spec/moneta/adapter_datamapper_spec.rb +1 -1
- data/spec/moneta/adapter_lruhash_spec.rb +1 -1
- data/spec/moneta/adapter_memcached_dalli_spec.rb +2 -2
- data/spec/moneta/adapter_memcached_native_spec.rb +2 -2
- data/spec/moneta/adapter_memcached_spec.rb +2 -2
- data/spec/moneta/adapter_redis_spec.rb +2 -2
- data/spec/moneta/cache_file_memory_spec.rb +3 -3
- data/spec/moneta/expires_file_spec.rb +4 -4
- data/spec/moneta/expires_memory_spec.rb +2 -2
- data/spec/moneta/optionmerger_spec.rb +6 -6
- data/spec/moneta/shared_spec.rb +1 -1
- data/spec/moneta/simple_client_tcp_spec.rb +1 -1
- data/spec/moneta/transformer_key_marshal_spec.rb +109 -0
- data/spec/moneta/transformer_key_yaml_spec.rb +109 -0
- data/spec/moneta/transformer_marshal_spec.rb +109 -0
- data/spec/moneta/transformer_value_marshal_spec.rb +109 -0
- data/spec/moneta/transformer_value_yaml_spec.rb +109 -0
- data/spec/monetaspecs.rb +14460 -3956
- metadata +16 -6
- data/lib/moneta/base.rb +0 -98
- data/lib/moneta/net.rb +0 -22
data/lib/moneta/adapters/null.rb
CHANGED
@@ -2,26 +2,33 @@ module Moneta
|
|
2
2
|
module Adapters
|
3
3
|
# Null backend which doesn't store anything
|
4
4
|
# @api public
|
5
|
-
class Null
|
5
|
+
class Null
|
6
|
+
include Defaults
|
7
|
+
|
6
8
|
def initialize(options = {})
|
7
9
|
end
|
8
10
|
|
11
|
+
# (see Proxy#key?)
|
9
12
|
def key?(key, options = {})
|
10
13
|
false
|
11
14
|
end
|
12
15
|
|
16
|
+
# (see Proxy#load)
|
13
17
|
def load(key, options = {})
|
14
18
|
nil
|
15
19
|
end
|
16
20
|
|
21
|
+
# (see Proxy#store)
|
17
22
|
def store(key, value, options = {})
|
18
23
|
value
|
19
24
|
end
|
20
25
|
|
26
|
+
# (see Proxy#delete)
|
21
27
|
def delete(key, options = {})
|
22
28
|
nil
|
23
29
|
end
|
24
30
|
|
31
|
+
# (see Proxy#clear)
|
25
32
|
def clear(options = {})
|
26
33
|
self
|
27
34
|
end
|
@@ -4,9 +4,9 @@ module Moneta
|
|
4
4
|
module Adapters
|
5
5
|
# PStore backend
|
6
6
|
# @api public
|
7
|
-
class PStore
|
8
|
-
|
9
|
-
|
7
|
+
class PStore
|
8
|
+
include Defaults
|
9
|
+
|
10
10
|
# @param [Hash] options
|
11
11
|
# @option options [String] :file PStore file
|
12
12
|
def initialize(options = {})
|
@@ -15,22 +15,27 @@ module Moneta
|
|
15
15
|
@pstore = new_store(options)
|
16
16
|
end
|
17
17
|
|
18
|
+
# (see Proxy#key?)
|
18
19
|
def key?(key, options = {})
|
19
20
|
@pstore.transaction(true) { @pstore.root?(key) }
|
20
21
|
end
|
21
22
|
|
23
|
+
# (see Proxy#load)
|
22
24
|
def load(key, options = {})
|
23
25
|
@pstore.transaction(true) { @pstore[key] }
|
24
26
|
end
|
25
27
|
|
28
|
+
# (see Proxy#store)
|
26
29
|
def store(key, value, options = {})
|
27
30
|
@pstore.transaction { @pstore[key] = value }
|
28
31
|
end
|
29
32
|
|
33
|
+
# (see Proxy#delete)
|
30
34
|
def delete(key, options = {})
|
31
35
|
@pstore.transaction { @pstore.delete(key) }
|
32
36
|
end
|
33
37
|
|
38
|
+
# (see Proxy#increment)
|
34
39
|
def increment(key, amount = 1, options = {})
|
35
40
|
@pstore.transaction do
|
36
41
|
value = @pstore[key]
|
@@ -42,6 +47,7 @@ module Moneta
|
|
42
47
|
end
|
43
48
|
end
|
44
49
|
|
50
|
+
# (see Proxy#clear)
|
45
51
|
def clear(options = {})
|
46
52
|
@pstore.transaction do
|
47
53
|
@pstore.roots.each do |key|
|
@@ -4,17 +4,18 @@ module Moneta
|
|
4
4
|
module Adapters
|
5
5
|
# Redis backend
|
6
6
|
# @api public
|
7
|
-
class Redis
|
8
|
-
|
9
|
-
|
7
|
+
class Redis
|
8
|
+
include Defaults
|
9
|
+
|
10
10
|
# @param [Hash] options
|
11
|
-
# @option options [
|
11
|
+
# @option options [Integer] :expires Default expiration time
|
12
12
|
# @option options Other options passed to `Redis#new`
|
13
13
|
def initialize(options = {})
|
14
14
|
@expires = options.delete(:expires)
|
15
15
|
@redis = ::Redis.new(options)
|
16
16
|
end
|
17
17
|
|
18
|
+
# (see Proxy#key?)
|
18
19
|
def key?(key, options = {})
|
19
20
|
if @redis.exists(key)
|
20
21
|
if expires = options[:expires]
|
@@ -26,6 +27,7 @@ module Moneta
|
|
26
27
|
end
|
27
28
|
end
|
28
29
|
|
30
|
+
# (see Proxy#load)
|
29
31
|
def load(key, options = {})
|
30
32
|
value = @redis.get(key)
|
31
33
|
if value && (expires = options[:expires])
|
@@ -34,6 +36,7 @@ module Moneta
|
|
34
36
|
value
|
35
37
|
end
|
36
38
|
|
39
|
+
# (see Proxy#store)
|
37
40
|
def store(key, value, options = {})
|
38
41
|
if expires = (options[:expires] || @expires)
|
39
42
|
@redis.setex(key, expires, value)
|
@@ -43,6 +46,7 @@ module Moneta
|
|
43
46
|
value
|
44
47
|
end
|
45
48
|
|
49
|
+
# (see Proxy#delete)
|
46
50
|
def delete(key, options = {})
|
47
51
|
if value = load(key, options)
|
48
52
|
@redis.del(key)
|
@@ -50,6 +54,7 @@ module Moneta
|
|
50
54
|
end
|
51
55
|
end
|
52
56
|
|
57
|
+
# (see Proxy#increment)
|
53
58
|
def increment(key, amount = 1, options = {})
|
54
59
|
value = @redis.incrby(key, amount)
|
55
60
|
expires = (options[:expires] || @expires)
|
@@ -57,6 +62,7 @@ module Moneta
|
|
57
62
|
value
|
58
63
|
end
|
59
64
|
|
65
|
+
# (see Proxy#clear)
|
60
66
|
def clear(options = {})
|
61
67
|
@redis.flushdb
|
62
68
|
self
|
data/lib/moneta/adapters/riak.rb
CHANGED
@@ -7,9 +7,9 @@ module Moneta
|
|
7
7
|
module Adapters
|
8
8
|
# Riak backend
|
9
9
|
# @api public
|
10
|
-
class Riak
|
11
|
-
|
12
|
-
|
10
|
+
class Riak
|
11
|
+
include Defaults
|
12
|
+
|
13
13
|
# @param [Hash] options
|
14
14
|
# @option options [String] :bucket ('moneta') Bucket name
|
15
15
|
# @option options [String] :content_type ('application/octet-stream') Default content type
|
@@ -20,30 +20,35 @@ module Moneta
|
|
20
20
|
@bucket = ::Riak::Client.new(options).bucket(bucket)
|
21
21
|
end
|
22
22
|
|
23
|
+
# (see Proxy#key?)
|
23
24
|
def key?(key, options = {})
|
24
|
-
@bucket.exists?(key, options)
|
25
|
+
@bucket.exists?(key, options.dup)
|
25
26
|
end
|
26
27
|
|
28
|
+
# (see Proxy#load)
|
27
29
|
def load(key, options = {})
|
28
|
-
@bucket.get(key, options).raw_data
|
30
|
+
@bucket.get(key, options.dup).raw_data
|
29
31
|
rescue ::Riak::FailedRequest => ex
|
30
32
|
nil
|
31
33
|
end
|
32
34
|
|
35
|
+
# (see Proxy#delete)
|
33
36
|
def delete(key, options = {})
|
34
37
|
value = load(key, options)
|
35
|
-
@bucket.delete(key, options)
|
38
|
+
@bucket.delete(key, options.dup)
|
36
39
|
value
|
37
40
|
end
|
38
41
|
|
42
|
+
# (see Proxy#store)
|
39
43
|
def store(key, value, options = {})
|
40
44
|
obj = ::Riak::RObject.new(@bucket, key)
|
41
45
|
obj.content_type = options[:content_type] || @content_type
|
42
46
|
obj.raw_data = value
|
43
|
-
obj.store(options)
|
47
|
+
obj.store(options.dup)
|
44
48
|
value
|
45
49
|
end
|
46
50
|
|
51
|
+
# (see Proxy#clear)
|
47
52
|
def clear(options = {})
|
48
53
|
@bucket.keys do |keys|
|
49
54
|
keys.each{ |key| @bucket.delete(key) }
|
data/lib/moneta/adapters/sdbm.rb
CHANGED
@@ -5,8 +5,6 @@ module Moneta
|
|
5
5
|
# SDBM backend
|
6
6
|
# @api public
|
7
7
|
class SDBM < Memory
|
8
|
-
# Constructor
|
9
|
-
#
|
10
8
|
# @param [Hash] options
|
11
9
|
# @option options [String] :file Database file
|
12
10
|
def initialize(options = {})
|
@@ -14,6 +12,7 @@ module Moneta
|
|
14
12
|
@hash = ::SDBM.new(options[:file])
|
15
13
|
end
|
16
14
|
|
15
|
+
# (see Proxy#close)
|
17
16
|
def close
|
18
17
|
@hash.close
|
19
18
|
nil
|
@@ -4,9 +4,9 @@ module Moneta
|
|
4
4
|
module Adapters
|
5
5
|
# Sequel backend
|
6
6
|
# @api public
|
7
|
-
class Sequel
|
8
|
-
|
9
|
-
|
7
|
+
class Sequel
|
8
|
+
include Defaults
|
9
|
+
|
10
10
|
# @param [Hash] options
|
11
11
|
# @option options [String] :db Sequel database
|
12
12
|
# @option options [String/Symbol] :table (:moneta) Table name
|
@@ -22,15 +22,18 @@ module Moneta
|
|
22
22
|
@table = @db[table]
|
23
23
|
end
|
24
24
|
|
25
|
+
# (see Proxy#key?)
|
25
26
|
def key?(key, options = {})
|
26
27
|
@table[:k => key] != nil
|
27
28
|
end
|
28
29
|
|
30
|
+
# (see Proxy#load)
|
29
31
|
def load(key, options = {})
|
30
32
|
record = @table[:k => key]
|
31
33
|
record && record[:v]
|
32
34
|
end
|
33
35
|
|
36
|
+
# (see Proxy#store)
|
34
37
|
def store(key, value, options = {})
|
35
38
|
@db.transaction do
|
36
39
|
if key?(key, options)
|
@@ -42,6 +45,7 @@ module Moneta
|
|
42
45
|
end
|
43
46
|
end
|
44
47
|
|
48
|
+
# (see Proxy#increment)
|
45
49
|
def increment(key, amount = 1, options = {})
|
46
50
|
@db.transaction do
|
47
51
|
locked_table = @table.for_update
|
@@ -59,6 +63,7 @@ module Moneta
|
|
59
63
|
end
|
60
64
|
end
|
61
65
|
|
66
|
+
# (see Proxy#delete)
|
62
67
|
def delete(key, options = {})
|
63
68
|
@db.transaction do
|
64
69
|
if value = load(key, options)
|
@@ -68,6 +73,7 @@ module Moneta
|
|
68
73
|
end
|
69
74
|
end
|
70
75
|
|
76
|
+
# (see Proxy#clear)
|
71
77
|
def clear(options = {})
|
72
78
|
@table.delete
|
73
79
|
self
|
@@ -4,11 +4,10 @@ module Moneta
|
|
4
4
|
module Adapters
|
5
5
|
# Sqlite3 backend
|
6
6
|
# @api public
|
7
|
-
class Sqlite
|
8
|
-
include
|
7
|
+
class Sqlite
|
8
|
+
include Defaults
|
9
|
+
include IncrementSupport
|
9
10
|
|
10
|
-
# Constructor
|
11
|
-
#
|
12
11
|
# @param [Hash] options
|
13
12
|
# @option options [String] :file Database file
|
14
13
|
# @option options [String] :table ('moneta') Table name
|
@@ -24,35 +23,42 @@ module Moneta
|
|
24
23
|
@clear = @db.prepare("delete from #{table}")]
|
25
24
|
end
|
26
25
|
|
26
|
+
# (see Proxy#key?)
|
27
27
|
def key?(key, options = {})
|
28
28
|
!@select.execute!(key).empty?
|
29
29
|
end
|
30
30
|
|
31
|
+
# (see Proxy#load)
|
31
32
|
def load(key, options = {})
|
32
33
|
rows = @select.execute!(key)
|
33
34
|
rows.empty? ? nil : rows.first.first
|
34
35
|
end
|
35
36
|
|
37
|
+
# (see Proxy#store)
|
36
38
|
def store(key, value, options = {})
|
37
39
|
@replace.execute!(key, value)
|
38
40
|
value
|
39
41
|
end
|
40
42
|
|
43
|
+
# (see Proxy#delete)
|
41
44
|
def delete(key, options = {})
|
42
45
|
value = load(key, options)
|
43
46
|
@delete.execute!(key)
|
44
47
|
value
|
45
48
|
end
|
46
49
|
|
50
|
+
# (see Proxy#increment)
|
47
51
|
def increment(key, amount = 1, options = {})
|
48
52
|
@db.transaction(:exclusive) { return super }
|
49
53
|
end
|
50
54
|
|
55
|
+
# (see Proxy#clear)
|
51
56
|
def clear(options = {})
|
52
57
|
@clear.execute!
|
53
58
|
self
|
54
59
|
end
|
55
60
|
|
61
|
+
# (see Proxy#close)
|
56
62
|
def close
|
57
63
|
@stmts.each {|s| s.close }
|
58
64
|
@db.close
|
@@ -5,8 +5,6 @@ module Moneta
|
|
5
5
|
# TokyoCabinet backend
|
6
6
|
# @api public
|
7
7
|
class TokyoCabinet < Memory
|
8
|
-
# Constructor
|
9
|
-
#
|
10
8
|
# @param [Hash] options
|
11
9
|
# @option options [String] :file Database file
|
12
10
|
# @option options [Symbol] :type (:hdb) Database type (:bdb and :hdb possible)
|
@@ -22,6 +20,7 @@ module Moneta
|
|
22
20
|
end or raise @hash.errmsg(@hash.ecode)
|
23
21
|
end
|
24
22
|
|
23
|
+
# (see Proxy#delete)
|
25
24
|
def delete(key, options = {})
|
26
25
|
value = load(key, options)
|
27
26
|
if value
|
@@ -30,6 +29,7 @@ module Moneta
|
|
30
29
|
end
|
31
30
|
end
|
32
31
|
|
32
|
+
# (see Proxy#close)
|
33
33
|
def close
|
34
34
|
@hash.close
|
35
35
|
nil
|
data/lib/moneta/builder.rb
CHANGED
@@ -2,7 +2,15 @@ module Moneta
|
|
2
2
|
# Builder implements the DSL to build a stack of Moneta store proxies
|
3
3
|
# @api private
|
4
4
|
class Builder
|
5
|
-
|
5
|
+
def initialize(&block)
|
6
|
+
raise ArgumentError, 'No block given' unless block_given?
|
7
|
+
@proxies = []
|
8
|
+
instance_eval(&block)
|
9
|
+
end
|
10
|
+
|
11
|
+
# Build proxy stack
|
12
|
+
# @return [Object] Generated Moneta proxy stack
|
13
|
+
# @api public
|
6
14
|
def build
|
7
15
|
klass, options, block = @proxies.first
|
8
16
|
@proxies[1..-1].inject([klass.new(options, &block)]) do |stores, proxy|
|
@@ -11,16 +19,11 @@ module Moneta
|
|
11
19
|
end
|
12
20
|
end
|
13
21
|
|
14
|
-
def initialize(&block)
|
15
|
-
raise ArgumentError, 'No block given' unless block_given?
|
16
|
-
@proxies = []
|
17
|
-
instance_eval(&block)
|
18
|
-
end
|
19
|
-
|
20
22
|
# Add proxy to stack
|
21
23
|
#
|
22
24
|
# @param [Symbol or Class] proxy Name of proxy class or proxy class
|
23
25
|
# @param [Hash] options Options hash
|
26
|
+
# @api public
|
24
27
|
def use(proxy, options = {}, &block)
|
25
28
|
proxy = Moneta.const_get(proxy) if Symbol === proxy
|
26
29
|
raise ArgumentError, 'You must give a Class or a Symbol' unless Class === proxy
|
@@ -32,6 +35,7 @@ module Moneta
|
|
32
35
|
#
|
33
36
|
# @param [Symbol] name Name of adapter class
|
34
37
|
# @param [Hash] options Options hash
|
38
|
+
# @api public
|
35
39
|
def adapter(name, options = {}, &block)
|
36
40
|
use(Adapters.const_get(name), options, &block)
|
37
41
|
end
|
data/lib/moneta/cache.rb
CHANGED
@@ -10,7 +10,9 @@ module Moneta
|
|
10
10
|
# end
|
11
11
|
#
|
12
12
|
# @api public
|
13
|
-
class Cache
|
13
|
+
class Cache
|
14
|
+
include Defaults
|
15
|
+
|
14
16
|
# @api private
|
15
17
|
class DSL
|
16
18
|
def initialize(options, &block)
|
@@ -18,12 +20,14 @@ module Moneta
|
|
18
20
|
instance_eval(&block)
|
19
21
|
end
|
20
22
|
|
23
|
+
# @api public
|
21
24
|
def backend(store = nil, &block)
|
22
25
|
raise 'Backend already set' if @backend
|
23
26
|
raise ArgumentError, 'Only argument or block allowed' if store && block
|
24
27
|
@backend = store || Moneta.build(&block)
|
25
28
|
end
|
26
29
|
|
30
|
+
# @api public
|
27
31
|
def cache(store = nil, &block)
|
28
32
|
raise 'Cache already set' if @cache
|
29
33
|
raise ArgumentError, 'Only argument or block allowed' if store && block
|
@@ -41,41 +45,47 @@ module Moneta
|
|
41
45
|
@cache, @backend = DSL.new(options, &block).result
|
42
46
|
end
|
43
47
|
|
48
|
+
# (see Proxy#key?)
|
44
49
|
def key?(key, options = {})
|
45
50
|
@cache.key?(key, options) || @backend.key?(key, options)
|
46
51
|
end
|
47
52
|
|
53
|
+
# (see Proxy#load)
|
48
54
|
def load(key, options = {})
|
49
55
|
value = @cache.load(key, options)
|
50
|
-
|
56
|
+
if value == nil
|
51
57
|
value = @backend.load(key, options)
|
52
|
-
@cache.store(key, value, options) if value
|
58
|
+
@cache.store(key, value, options) if value != nil
|
53
59
|
end
|
54
60
|
value
|
55
61
|
end
|
56
62
|
|
63
|
+
# (see Proxy#store)
|
57
64
|
def store(key, value, options = {})
|
58
65
|
@cache.store(key, value, options)
|
59
66
|
@backend.store(key, value, options)
|
60
67
|
end
|
61
68
|
|
69
|
+
# (see Proxy#increment)
|
62
70
|
def increment(key, amount = 1, options = {})
|
63
|
-
|
64
|
-
@
|
65
|
-
value
|
71
|
+
@cache.delete(key, options)
|
72
|
+
@backend.increment(key, amount, options)
|
66
73
|
end
|
67
74
|
|
75
|
+
# (see Proxy#delete)
|
68
76
|
def delete(key, options = {})
|
69
77
|
@cache.delete(key, options)
|
70
78
|
@backend.delete(key, options)
|
71
79
|
end
|
72
80
|
|
81
|
+
# (see Proxy#clear)
|
73
82
|
def clear(options = {})
|
74
83
|
@cache.clear(options)
|
75
84
|
@backend.clear(options)
|
76
85
|
self
|
77
86
|
end
|
78
87
|
|
88
|
+
# (see Proxy#close)
|
79
89
|
def close
|
80
90
|
@cache.close
|
81
91
|
@backend.close
|