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/expires.rb
CHANGED
@@ -6,8 +6,6 @@ module Moneta
|
|
6
6
|
#
|
7
7
|
# @api public
|
8
8
|
class Expires < Proxy
|
9
|
-
# Constructor
|
10
|
-
#
|
11
9
|
# @param [Moneta store] adapter The underlying store
|
12
10
|
# @param [Hash] options
|
13
11
|
# @option options [String] :expires Default expiration time
|
@@ -17,7 +15,11 @@ module Moneta
|
|
17
15
|
end
|
18
16
|
|
19
17
|
def key?(key, options = {})
|
18
|
+
# Transformer might raise exception
|
20
19
|
load_entry(key, options) != nil
|
20
|
+
rescue Exception
|
21
|
+
options.include?(:expires) && (options = options.dup; options.delete(:expires))
|
22
|
+
super(key, options)
|
21
23
|
end
|
22
24
|
|
23
25
|
def load(key, options = {})
|
@@ -28,10 +30,13 @@ module Moneta
|
|
28
30
|
|
29
31
|
def store(key, value, options = {})
|
30
32
|
return super if options.include?(:raw)
|
31
|
-
|
33
|
+
expires = options.include?(:expires) && (options = options.dup; options.delete(:expires))
|
34
|
+
if expires ||= @expires
|
32
35
|
super(key, [value, Time.now.to_i + expires], options)
|
33
|
-
|
36
|
+
elsif Array === value || value == nil
|
34
37
|
super(key, [value], options)
|
38
|
+
else
|
39
|
+
super(key, value, options)
|
35
40
|
end
|
36
41
|
value
|
37
42
|
end
|
@@ -45,8 +50,9 @@ module Moneta
|
|
45
50
|
private
|
46
51
|
|
47
52
|
def load_entry(key, options)
|
48
|
-
new_expires = options.delete(:expires)
|
49
|
-
|
53
|
+
new_expires = options.include?(:expires) && (options = options.dup; options.delete(:expires))
|
54
|
+
entry = @adapter.load(key, options)
|
55
|
+
if entry != nil
|
50
56
|
value, expires = entry
|
51
57
|
if expires && Time.now.to_i > expires
|
52
58
|
delete(key)
|
data/lib/moneta/lock.rb
CHANGED
data/lib/moneta/logger.rb
CHANGED
data/lib/moneta/mixins.rb
CHANGED
@@ -1,65 +1,193 @@
|
|
1
1
|
module Moneta
|
2
2
|
# @api private
|
3
|
-
module
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
module OptionSupport
|
4
|
+
# @api public
|
5
|
+
def with(options)
|
6
|
+
OptionMerger.new(self, options)
|
7
|
+
end
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
9
|
+
# @api public
|
10
|
+
def raw
|
11
|
+
@raw_store ||=
|
12
|
+
begin
|
13
|
+
store = with(:raw => true, :only => [:load, :store, :delete])
|
14
|
+
store.instance_variable_set(:@raw_store, store)
|
15
|
+
store
|
16
|
+
end
|
17
|
+
end
|
17
18
|
|
18
|
-
|
19
|
-
|
20
|
-
|
19
|
+
# @api public
|
20
|
+
def prefix(prefix)
|
21
|
+
with(:prefix => prefix, :except => :clear)
|
22
|
+
end
|
21
23
|
|
22
|
-
|
23
|
-
|
24
|
-
|
24
|
+
# @api public
|
25
|
+
def expires(expires)
|
26
|
+
with(:expires => expires, :only => [:store, :increment])
|
25
27
|
end
|
28
|
+
end
|
26
29
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
30
|
+
# Simple interface to key/value stores with Hash-like interface.
|
31
|
+
# @api public
|
32
|
+
module Defaults
|
33
|
+
include OptionSupport
|
34
|
+
|
35
|
+
# Exists the value with key
|
36
|
+
#
|
37
|
+
# @param [Object] key
|
38
|
+
# @return [Boolean]
|
39
|
+
# @param [Hash] options
|
40
|
+
# @api public
|
41
|
+
def key?(key, options = {})
|
42
|
+
load(key, options) != nil
|
36
43
|
end
|
37
44
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
45
|
+
# Atomically increment integer value with key
|
46
|
+
#
|
47
|
+
# Not every Moneta store implements this method,
|
48
|
+
# a NotImplementedError if it is not supported.
|
49
|
+
#
|
50
|
+
# This method also accepts negative amounts.
|
51
|
+
#
|
52
|
+
# @param [Object] key
|
53
|
+
# @param [Integer] amount
|
54
|
+
# @param [Hash] options
|
55
|
+
# @return [Object] value from store
|
56
|
+
# @api public
|
57
|
+
def increment(key, amount = 1, options = {})
|
58
|
+
raise NotImplementedError, 'increment is not supported'
|
59
|
+
end
|
42
60
|
|
43
|
-
|
44
|
-
|
45
|
-
|
61
|
+
# Atomically decrement integer value with key
|
62
|
+
#
|
63
|
+
# This is just syntactic sugar for calling #increment with a negative value.
|
64
|
+
#
|
65
|
+
# This method also accepts negative amounts.
|
66
|
+
#
|
67
|
+
# @param [Object] key
|
68
|
+
# @param [Integer] amount
|
69
|
+
# @param [Hash] options
|
70
|
+
# @return [Object] value from store
|
71
|
+
# @api public
|
72
|
+
def decrement(key, amount = 1, options = {})
|
73
|
+
increment(key, -amount, options)
|
74
|
+
end
|
46
75
|
|
47
|
-
|
48
|
-
|
49
|
-
|
76
|
+
# Explicitly close the store
|
77
|
+
# @return nil
|
78
|
+
# @api public
|
79
|
+
def close
|
80
|
+
end
|
50
81
|
|
51
|
-
|
52
|
-
|
82
|
+
# Fetch a value with a key
|
83
|
+
#
|
84
|
+
# @overload fetch(key, options = {}, &block)
|
85
|
+
# retrieve a key. if the key is not available, execute the
|
86
|
+
# block and return its return value.
|
87
|
+
# @param [Object] key
|
88
|
+
# @param [Hash] options
|
89
|
+
# @return [Object] value from store
|
90
|
+
#
|
91
|
+
# @overload fetch(key, default, options = {})
|
92
|
+
# retrieve a key. if the key is not available, return the default value.
|
93
|
+
# @param [Object] key
|
94
|
+
# @param [Object] default Default value
|
95
|
+
# @param [Hash] options
|
96
|
+
# @return [Object] value from store
|
97
|
+
#
|
98
|
+
# @api public
|
99
|
+
def fetch(key, default = nil, options = nil)
|
100
|
+
if block_given?
|
101
|
+
raise ArgumentError, 'Only one argument accepted if block is given' if options
|
102
|
+
result = load(key, default || {})
|
103
|
+
result == nil ? yield(key) : result
|
104
|
+
else
|
105
|
+
result = load(key, options || {})
|
106
|
+
result == nil ? default : result
|
53
107
|
end
|
108
|
+
end
|
54
109
|
|
55
|
-
|
56
|
-
|
57
|
-
|
110
|
+
# Fetch value with key. Return nil if the key doesn't exist
|
111
|
+
#
|
112
|
+
# @param [Object] key
|
113
|
+
# @return [Object] value
|
114
|
+
# @api public
|
115
|
+
def [](key)
|
116
|
+
load(key)
|
117
|
+
end
|
58
118
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
119
|
+
# Store value with key
|
120
|
+
#
|
121
|
+
# @param [Object] key
|
122
|
+
# @param [Object] value
|
123
|
+
# @return value
|
124
|
+
# @api public
|
125
|
+
def []=(key, value)
|
126
|
+
store(key, value)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
# @api private
|
131
|
+
module IncrementSupport
|
132
|
+
# (see Defaults#increment)
|
133
|
+
# @api public
|
134
|
+
def increment(key, amount = 1, options = {})
|
135
|
+
value = load(key, options)
|
136
|
+
intvalue = value.to_i
|
137
|
+
raise 'Tried to increment non integer value' unless value == nil || intvalue.to_s == value.to_s
|
138
|
+
intvalue += amount
|
139
|
+
store(key, intvalue.to_s, options)
|
140
|
+
intvalue
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
# @api private
|
145
|
+
module HashAdapter
|
146
|
+
# (see Proxy#key?)
|
147
|
+
def key?(key, options = {})
|
148
|
+
@hash.has_key?(key)
|
149
|
+
end
|
150
|
+
|
151
|
+
# (see Proxy#load)
|
152
|
+
def load(key, options = {})
|
153
|
+
@hash[key]
|
154
|
+
end
|
155
|
+
|
156
|
+
# (see Proxy#store)
|
157
|
+
def store(key, value, options = {})
|
158
|
+
@hash[key] = value
|
159
|
+
end
|
160
|
+
|
161
|
+
# (see Proxy#delete)
|
162
|
+
def delete(key, options = {})
|
163
|
+
@hash.delete(key)
|
164
|
+
end
|
165
|
+
|
166
|
+
# (see Proxy#clear)
|
167
|
+
def clear(options = {})
|
168
|
+
@hash.clear
|
169
|
+
self
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
# @api private
|
174
|
+
module Net
|
175
|
+
DEFAULT_PORT = 9000
|
176
|
+
|
177
|
+
class Error < RuntimeError; end
|
178
|
+
|
179
|
+
def pack(o)
|
180
|
+
s = Marshal.dump(o)
|
181
|
+
[s.bytesize].pack('N') << s
|
182
|
+
end
|
183
|
+
|
184
|
+
def read(io)
|
185
|
+
size = io.read(4).unpack('N').first
|
186
|
+
Marshal.load(io.read(size))
|
187
|
+
end
|
188
|
+
|
189
|
+
def write(io, o)
|
190
|
+
io.write(pack(o))
|
63
191
|
end
|
64
192
|
end
|
65
193
|
end
|
data/lib/moneta/optionmerger.rb
CHANGED
data/lib/moneta/proxy.rb
CHANGED
@@ -1,27 +1,32 @@
|
|
1
1
|
module Moneta
|
2
2
|
# Proxy base class
|
3
3
|
# @api public
|
4
|
-
class Proxy
|
4
|
+
class Proxy
|
5
|
+
include Defaults
|
6
|
+
|
5
7
|
attr_reader :adapter
|
6
8
|
|
7
|
-
# Constructor
|
8
|
-
#
|
9
9
|
# @param [Moneta store] adapter underlying adapter
|
10
10
|
# @param [Hash] options
|
11
11
|
def initialize(adapter, options = {})
|
12
12
|
@adapter = adapter
|
13
13
|
end
|
14
14
|
|
15
|
-
#
|
16
|
-
#
|
17
|
-
# @param [Object] key
|
18
|
-
# @return [Boolean]
|
19
|
-
# @param [Hash] options
|
20
|
-
# @api public
|
15
|
+
# (see Defaults#key?)
|
21
16
|
def key?(key, options = {})
|
22
17
|
@adapter.key?(key, options)
|
23
18
|
end
|
24
19
|
|
20
|
+
# (see Defaults#increment)
|
21
|
+
def increment(key, amount = 1, options = {})
|
22
|
+
@adapter.increment(key, amount, options)
|
23
|
+
end
|
24
|
+
|
25
|
+
# (see Defaults#close)
|
26
|
+
def close
|
27
|
+
@adapter.close
|
28
|
+
end
|
29
|
+
|
25
30
|
# Fetch value with key. Return nil if the key doesn't exist
|
26
31
|
#
|
27
32
|
# @param [Object] key
|
@@ -53,20 +58,6 @@ module Moneta
|
|
53
58
|
@adapter.delete(key, options)
|
54
59
|
end
|
55
60
|
|
56
|
-
# Atomically increment integer value with key
|
57
|
-
#
|
58
|
-
# Not every Moneta store implements this method,
|
59
|
-
# a NotImplementedError if it is not supported.
|
60
|
-
#
|
61
|
-
# @param [Object] key
|
62
|
-
# @param [Integer] amount
|
63
|
-
# @param [Hash] options
|
64
|
-
# @return [Object] value from store
|
65
|
-
# @api public
|
66
|
-
def increment(key, amount = 1, options = {})
|
67
|
-
@adapter.increment(key, amount, options)
|
68
|
-
end
|
69
|
-
|
70
61
|
# Clear all keys in this store
|
71
62
|
#
|
72
63
|
# @param [Hash] options
|
@@ -76,12 +67,5 @@ module Moneta
|
|
76
67
|
@adapter.clear(options)
|
77
68
|
self
|
78
69
|
end
|
79
|
-
|
80
|
-
# Close this store
|
81
|
-
# @return nil
|
82
|
-
# @api public
|
83
|
-
def close
|
84
|
-
@adapter.close
|
85
|
-
end
|
86
70
|
end
|
87
71
|
end
|
data/lib/moneta/server.rb
CHANGED
data/lib/moneta/shared.rb
CHANGED
@@ -11,8 +11,6 @@ module Moneta
|
|
11
11
|
#
|
12
12
|
# @api public
|
13
13
|
class Shared < Wrapper
|
14
|
-
# Constructor
|
15
|
-
#
|
16
14
|
# @param [Hash] options
|
17
15
|
# @option options [Integer] :port (9000) TCP port
|
18
16
|
# @option options [String] :host Server hostname
|
@@ -34,7 +32,7 @@ module Moneta
|
|
34
32
|
end
|
35
33
|
end
|
36
34
|
|
37
|
-
|
35
|
+
protected
|
38
36
|
|
39
37
|
def wrap(*args)
|
40
38
|
@adapter ||= Adapters::Client.new(@options)
|
data/lib/moneta/stack.rb
CHANGED
@@ -12,7 +12,9 @@ module Moneta
|
|
12
12
|
# end
|
13
13
|
#
|
14
14
|
# @api public
|
15
|
-
class Stack
|
15
|
+
class Stack
|
16
|
+
include Defaults
|
17
|
+
|
16
18
|
# @api private
|
17
19
|
class DSL
|
18
20
|
attr_reader :stack
|
@@ -22,6 +24,7 @@ module Moneta
|
|
22
24
|
instance_eval(&block)
|
23
25
|
end
|
24
26
|
|
27
|
+
# @api public
|
25
28
|
def add(store = nil, &block)
|
26
29
|
raise ArgumentError, 'Only argument or block allowed' if store && block
|
27
30
|
@stack << (store || Moneta.build(&block))
|
@@ -35,23 +38,34 @@ module Moneta
|
|
35
38
|
@stack = DSL.new(options, &block).stack
|
36
39
|
end
|
37
40
|
|
41
|
+
# (see Proxy#key?)
|
38
42
|
def key?(key, options = {})
|
39
|
-
@stack.any? {|s| s.key?(key) }
|
43
|
+
@stack.any? {|s| s.key?(key, options) }
|
40
44
|
end
|
41
45
|
|
46
|
+
# (see Proxy#load)
|
42
47
|
def load(key, options = {})
|
43
48
|
@stack.each do |s|
|
44
49
|
value = s.load(key, options)
|
45
|
-
return value if value
|
50
|
+
return value if value != nil
|
46
51
|
end
|
47
52
|
nil
|
48
53
|
end
|
49
54
|
|
55
|
+
# (see Proxy#store)
|
50
56
|
def store(key, value, options = {})
|
51
57
|
@stack.each {|s| s.store(key, value, options) }
|
52
58
|
value
|
53
59
|
end
|
54
60
|
|
61
|
+
# (see Proxy#increment)
|
62
|
+
def increment(key, amount = 1, options = {})
|
63
|
+
last = nil
|
64
|
+
@stack.each {|s| last = s.increment(key, amount, options) }
|
65
|
+
last
|
66
|
+
end
|
67
|
+
|
68
|
+
# (see Proxy#delete)
|
55
69
|
def delete(key, options = {})
|
56
70
|
@stack.inject(nil) do |value, s|
|
57
71
|
v = s.delete(key, options)
|
@@ -59,17 +73,13 @@ module Moneta
|
|
59
73
|
end
|
60
74
|
end
|
61
75
|
|
62
|
-
|
63
|
-
last = nil
|
64
|
-
@stack.each {|s| last = s.increment(key, amount, options) }
|
65
|
-
last
|
66
|
-
end
|
67
|
-
|
76
|
+
# (see Proxy#clear)
|
68
77
|
def clear(options = {})
|
69
|
-
@stack.each {|s| s.clear }
|
78
|
+
@stack.each {|s| s.clear(options) }
|
70
79
|
self
|
71
80
|
end
|
72
81
|
|
82
|
+
# (see Proxy#close)
|
73
83
|
def close
|
74
84
|
@stack.each {|s| s.close }
|
75
85
|
nil
|