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/file.rb
CHANGED
@@ -4,11 +4,10 @@ module Moneta
|
|
4
4
|
module Adapters
|
5
5
|
# Filesystem backend
|
6
6
|
# @api public
|
7
|
-
class File
|
8
|
-
include
|
7
|
+
class File
|
8
|
+
include Defaults
|
9
|
+
include IncrementSupport
|
9
10
|
|
10
|
-
# Constructor
|
11
|
-
#
|
12
11
|
# @param [Hash] options
|
13
12
|
# @option options [String] :dir Directory where files will be stored
|
14
13
|
def initialize(options = {})
|
@@ -17,15 +16,18 @@ module Moneta
|
|
17
16
|
raise "#{@dir} is not a directory" unless ::File.directory?(@dir)
|
18
17
|
end
|
19
18
|
|
19
|
+
# (see Proxy#key?)
|
20
20
|
def key?(key, options = {})
|
21
21
|
::File.exist?(store_path(key))
|
22
22
|
end
|
23
23
|
|
24
|
+
# (see Proxy#load)
|
24
25
|
def load(key, options = {})
|
25
26
|
::File.read(store_path(key))
|
26
27
|
rescue Errno::ENOENT
|
27
28
|
end
|
28
29
|
|
30
|
+
# (see Proxy#store)
|
29
31
|
def store(key, value, options = {})
|
30
32
|
path = store_path(key)
|
31
33
|
temp_file = ::File.join(@dir, "value-#{$$}-#{Thread.current.object_id}")
|
@@ -39,6 +41,7 @@ module Moneta
|
|
39
41
|
value
|
40
42
|
end
|
41
43
|
|
44
|
+
# (see Proxy#delete)
|
42
45
|
def delete(key, options = {})
|
43
46
|
value = load(key, options)
|
44
47
|
::File.unlink(store_path(key))
|
@@ -46,6 +49,7 @@ module Moneta
|
|
46
49
|
rescue Errno::ENOENT
|
47
50
|
end
|
48
51
|
|
52
|
+
# (see Proxy#clear)
|
49
53
|
def clear(options = {})
|
50
54
|
temp_dir = "#{@dir}-#{$$}-#{Thread.current.object_id}"
|
51
55
|
::File.rename(@dir, temp_dir)
|
@@ -56,6 +60,7 @@ module Moneta
|
|
56
60
|
self
|
57
61
|
end
|
58
62
|
|
63
|
+
# (see Proxy#increment)
|
59
64
|
def increment(key, amount = 1, options = {})
|
60
65
|
lock(key) { super }
|
61
66
|
end
|
data/lib/moneta/adapters/fog.rb
CHANGED
@@ -4,9 +4,9 @@ module Moneta
|
|
4
4
|
module Adapters
|
5
5
|
# Fog backend (Cloud storage services)
|
6
6
|
# @api public
|
7
|
-
class Fog
|
8
|
-
|
9
|
-
|
7
|
+
class Fog
|
8
|
+
include Defaults
|
9
|
+
|
10
10
|
# @param [Hash] options
|
11
11
|
# @option options [String] :dir Fog directory
|
12
12
|
# @option options Other options passed to `Fog::Storage#new`
|
@@ -16,15 +16,18 @@ module Moneta
|
|
16
16
|
@directory = storage.directories.create(:key => dir)
|
17
17
|
end
|
18
18
|
|
19
|
+
# (see Proxy#key?)
|
19
20
|
def key?(key, options = {})
|
20
21
|
@directory.files.head(key) != nil
|
21
22
|
end
|
22
23
|
|
24
|
+
# (see Proxy#load)
|
23
25
|
def load(key, options = {})
|
24
26
|
value = @directory.files.get(key)
|
25
27
|
value && value.body
|
26
28
|
end
|
27
29
|
|
30
|
+
# (see Proxy#delete)
|
28
31
|
def delete(key, options = {})
|
29
32
|
if value = @directory.files.get(key)
|
30
33
|
body = value.body
|
@@ -33,11 +36,13 @@ module Moneta
|
|
33
36
|
end
|
34
37
|
end
|
35
38
|
|
39
|
+
# (see Proxy#store)
|
36
40
|
def store(key, value, options = {})
|
37
41
|
@directory.files.create(:key => key, :body => value)
|
38
42
|
value
|
39
43
|
end
|
40
44
|
|
45
|
+
# (see Proxy#clear)
|
41
46
|
def clear(options = {})
|
42
47
|
@directory.files.all.each do |file|
|
43
48
|
file.destroy
|
data/lib/moneta/adapters/gdbm.rb
CHANGED
@@ -5,8 +5,6 @@ module Moneta
|
|
5
5
|
# GDBM backend
|
6
6
|
# @api public
|
7
7
|
class GDBM < 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 = ::GDBM.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
|
# HBase thrift backend
|
6
6
|
# @api public
|
7
|
-
class HBase
|
8
|
-
|
9
|
-
|
7
|
+
class HBase
|
8
|
+
include Defaults
|
9
|
+
|
10
10
|
# @param [Hash] options
|
11
11
|
# @option options [String] :host ('127.0.0.1') Server host name
|
12
12
|
# @option options [Integer] :port (9090) Server port
|
@@ -25,20 +25,24 @@ module Moneta
|
|
25
25
|
@column = "#{cf}:#{options[:column]}"
|
26
26
|
end
|
27
27
|
|
28
|
+
# (see Proxy#key?)
|
28
29
|
def key?(key, options = {})
|
29
30
|
@table.get(key, @column).first != nil
|
30
31
|
end
|
31
32
|
|
33
|
+
# (see Proxy#load)
|
32
34
|
def load(key, options = {})
|
33
35
|
cell = @table.get(key, @column).first
|
34
36
|
cell && unpack(cell.value)
|
35
37
|
end
|
36
38
|
|
39
|
+
# (see Proxy#store)
|
37
40
|
def store(key, value, options = {})
|
38
41
|
@table.mutate_row(key, @column => pack(value))
|
39
42
|
value
|
40
43
|
end
|
41
44
|
|
45
|
+
# (see Proxy#increment)
|
42
46
|
def increment(key, amount = 1, options = {})
|
43
47
|
result = @table.atomic_increment(key, @column, amount)
|
44
48
|
# HACK: Throw error if applied to invalid value
|
@@ -49,6 +53,7 @@ module Moneta
|
|
49
53
|
result
|
50
54
|
end
|
51
55
|
|
56
|
+
# (see Proxy#delete)
|
52
57
|
def delete(key, options = {})
|
53
58
|
if value = load(key, options)
|
54
59
|
@table.delete_row(key)
|
@@ -56,6 +61,7 @@ module Moneta
|
|
56
61
|
end
|
57
62
|
end
|
58
63
|
|
64
|
+
# (see Proxy#clear)
|
59
65
|
def clear(options = {})
|
60
66
|
@table.create_scanner do |row|
|
61
67
|
@table.delete_row(row.row)
|
@@ -63,6 +69,7 @@ module Moneta
|
|
63
69
|
self
|
64
70
|
end
|
65
71
|
|
72
|
+
# (see Proxy#close)
|
66
73
|
def close
|
67
74
|
@db.close
|
68
75
|
nil
|
@@ -5,8 +5,6 @@ module Moneta
|
|
5
5
|
# LevelDB backend
|
6
6
|
# @api public
|
7
7
|
class LevelDB < Memory
|
8
|
-
# Constructor
|
9
|
-
#
|
10
8
|
# @param [Hash] options
|
11
9
|
# @option options [String] :dir - Database path
|
12
10
|
# @option options All other options passed to `LevelDB::DB#new`
|
@@ -15,15 +13,18 @@ module Moneta
|
|
15
13
|
@hash = ::LevelDB::DB.new(options[:dir])
|
16
14
|
end
|
17
15
|
|
16
|
+
# (see Proxy#key?)
|
18
17
|
def key?(key, options = {})
|
19
18
|
@hash.includes?(key)
|
20
19
|
end
|
21
20
|
|
21
|
+
# (see Proxy#clear)
|
22
22
|
def clear(options = {})
|
23
23
|
@hash.each {|k,v| delete(k, options) }
|
24
24
|
self
|
25
25
|
end
|
26
26
|
|
27
|
+
# (see Proxy#close)
|
27
28
|
def close
|
28
29
|
@hash.close
|
29
30
|
nil
|
@@ -4,11 +4,10 @@ module Moneta
|
|
4
4
|
module Adapters
|
5
5
|
# LocalMemCache backend
|
6
6
|
# @api public
|
7
|
-
class LocalMemCache
|
8
|
-
include
|
7
|
+
class LocalMemCache
|
8
|
+
include Defaults
|
9
|
+
include HashAdapter
|
9
10
|
|
10
|
-
# Constructor
|
11
|
-
#
|
12
11
|
# @param [Hash] options
|
13
12
|
# @option options [String] :file Database file
|
14
13
|
def initialize(options = {})
|
@@ -16,6 +15,7 @@ module Moneta
|
|
16
15
|
@hash = ::LocalMemCache.new(:filename => options[:file])
|
17
16
|
end
|
18
17
|
|
18
|
+
# (see Proxy#delete)
|
19
19
|
def delete(key, options = {})
|
20
20
|
value = load(key, options)
|
21
21
|
@hash.delete(key)
|
@@ -5,11 +5,10 @@ module Moneta
|
|
5
5
|
# Based on Hashery::LRUHash but simpler and measures memory usage instead of hash size.
|
6
6
|
#
|
7
7
|
# @api public
|
8
|
-
class LRUHash
|
9
|
-
include
|
8
|
+
class LRUHash
|
9
|
+
include Defaults
|
10
|
+
include IncrementSupport
|
10
11
|
|
11
|
-
# Constructor
|
12
|
-
#
|
13
12
|
# @param [Hash] options
|
14
13
|
# @option options [Integer] :max_size (1024000) Maximum total byte size of hash values
|
15
14
|
def initialize(options = {})
|
@@ -17,10 +16,12 @@ module Moneta
|
|
17
16
|
clear
|
18
17
|
end
|
19
18
|
|
19
|
+
# (see Proxy#key?)
|
20
20
|
def key?(key, options = {})
|
21
21
|
@entry.key?(key)
|
22
22
|
end
|
23
23
|
|
24
|
+
# (see Proxy#load)
|
24
25
|
def load(key, options = {})
|
25
26
|
if entry = @entry[key]
|
26
27
|
entry.insert_after(@list)
|
@@ -28,6 +29,7 @@ module Moneta
|
|
28
29
|
end
|
29
30
|
end
|
30
31
|
|
32
|
+
# (see Proxy#store)
|
31
33
|
def store(key, value, options = {})
|
32
34
|
if entry = @entry[key]
|
33
35
|
@size -= entry.value.bytesize
|
@@ -42,6 +44,7 @@ module Moneta
|
|
42
44
|
value
|
43
45
|
end
|
44
46
|
|
47
|
+
# (see Proxy#delete)
|
45
48
|
def delete(key, options = {})
|
46
49
|
if entry = @entry.delete(key)
|
47
50
|
@size -= entry.value.bytesize
|
@@ -50,6 +53,7 @@ module Moneta
|
|
50
53
|
end
|
51
54
|
end
|
52
55
|
|
56
|
+
# (see Proxy#clear)
|
53
57
|
def clear(options = {})
|
54
58
|
@entry, @size = {}, 0
|
55
59
|
@list = Entry.new
|
@@ -4,12 +4,12 @@ module Moneta
|
|
4
4
|
module Adapters
|
5
5
|
# Memcached backend (using gem dalli)
|
6
6
|
# @api public
|
7
|
-
class MemcachedDalli
|
8
|
-
|
9
|
-
|
7
|
+
class MemcachedDalli
|
8
|
+
include Defaults
|
9
|
+
|
10
10
|
# @param [Hash] options
|
11
11
|
# @option options [String] :server ('127.0.0.1:11211') Memcached server
|
12
|
-
# @option options [
|
12
|
+
# @option options [Integer] :expires Default expiration time
|
13
13
|
# @option options Other options passed to `Dalli::Client#new`
|
14
14
|
def initialize(options = {})
|
15
15
|
options[:expires_in] = options.delete(:expires)
|
@@ -17,6 +17,7 @@ module Moneta
|
|
17
17
|
@cache = ::Dalli::Client.new(server, options)
|
18
18
|
end
|
19
19
|
|
20
|
+
# (see Proxy#load)
|
20
21
|
def load(key, options = {})
|
21
22
|
value = @cache.get(key)
|
22
23
|
if value && options.include?(:expires)
|
@@ -26,17 +27,20 @@ module Moneta
|
|
26
27
|
end
|
27
28
|
end
|
28
29
|
|
30
|
+
# (see Proxy#store)
|
29
31
|
def store(key, value, options = {})
|
30
32
|
@cache.set(key, value, options[:expires], :raw => true)
|
31
33
|
value
|
32
34
|
end
|
33
35
|
|
36
|
+
# (see Proxy#delete)
|
34
37
|
def delete(key, options = {})
|
35
38
|
value = @cache.get(key)
|
36
39
|
@cache.delete(key)
|
37
40
|
value
|
38
41
|
end
|
39
42
|
|
43
|
+
# (see Proxy#increment)
|
40
44
|
def increment(key, amount = 1, options = {})
|
41
45
|
# FIXME: There is a Dalli bug, load(key) returns a wrong value after increment
|
42
46
|
# therefore we set default = nil and create the counter manually
|
@@ -53,11 +57,13 @@ module Moneta
|
|
53
57
|
end
|
54
58
|
end
|
55
59
|
|
60
|
+
# (see Proxy#clear)
|
56
61
|
def clear(options = {})
|
57
62
|
@cache.flush_all
|
58
63
|
self
|
59
64
|
end
|
60
65
|
|
66
|
+
# (see Proxy#close)
|
61
67
|
def close
|
62
68
|
@cache.close
|
63
69
|
nil
|
@@ -4,13 +4,13 @@ module Moneta
|
|
4
4
|
module Adapters
|
5
5
|
# Memcached backend (using gem memcached)
|
6
6
|
# @api public
|
7
|
-
class MemcachedNative
|
8
|
-
|
9
|
-
|
7
|
+
class MemcachedNative
|
8
|
+
include Defaults
|
9
|
+
|
10
10
|
# @param [Hash] options
|
11
11
|
# @option options [String] :server ('127.0.0.1:11211') Memcached server
|
12
12
|
# @option options [String] :namespace Key namespace
|
13
|
-
# @option options [
|
13
|
+
# @option options [Integer] :expires (604800) Default expiration time
|
14
14
|
# @option options Other options passed to `Memcached#new`
|
15
15
|
def initialize(options = {})
|
16
16
|
server = options.delete(:server) || '127.0.0.1:11211'
|
@@ -22,6 +22,7 @@ module Moneta
|
|
22
22
|
@cache = ::Memcached.new(server, options)
|
23
23
|
end
|
24
24
|
|
25
|
+
# (see Proxy#load)
|
25
26
|
def load(key, options = {})
|
26
27
|
value = @cache.get(key, false)
|
27
28
|
if value && options.include?(:expires)
|
@@ -32,12 +33,14 @@ module Moneta
|
|
32
33
|
rescue ::Memcached::NotFound
|
33
34
|
end
|
34
35
|
|
36
|
+
# (see Proxy#store)
|
35
37
|
def store(key, value, options = {})
|
36
38
|
# TTL must be Fixnum
|
37
39
|
@cache.set(key, value, options[:expires] || @expires, false)
|
38
40
|
value
|
39
41
|
end
|
40
42
|
|
43
|
+
# (see Proxy#delete)
|
41
44
|
def delete(key, options = {})
|
42
45
|
value = @cache.get(key, false)
|
43
46
|
@cache.delete(key)
|
@@ -45,6 +48,7 @@ module Moneta
|
|
45
48
|
rescue ::Memcached::NotFound
|
46
49
|
end
|
47
50
|
|
51
|
+
# (see Proxy#increment)
|
48
52
|
def increment(key, amount = 1, options = {})
|
49
53
|
result = if amount >= 0
|
50
54
|
@cache.increment(key, amount)
|
@@ -62,6 +66,7 @@ module Moneta
|
|
62
66
|
amount
|
63
67
|
end
|
64
68
|
|
69
|
+
# (see Proxy#clear)
|
65
70
|
def clear(options = {})
|
66
71
|
@cache.flush
|
67
72
|
self
|
@@ -2,9 +2,14 @@ module Moneta
|
|
2
2
|
module Adapters
|
3
3
|
# Memory backend using a hash to store the entries
|
4
4
|
# @api public
|
5
|
-
class Memory
|
6
|
-
include
|
7
|
-
include
|
5
|
+
class Memory
|
6
|
+
include Defaults
|
7
|
+
include HashAdapter
|
8
|
+
include IncrementSupport
|
9
|
+
|
10
|
+
def initialize(options = {})
|
11
|
+
@hash = {}
|
12
|
+
end
|
8
13
|
end
|
9
14
|
end
|
10
15
|
end
|
@@ -4,9 +4,9 @@ module Moneta
|
|
4
4
|
module Adapters
|
5
5
|
# MongoDB backend
|
6
6
|
# @api public
|
7
|
-
class Mongo
|
8
|
-
|
9
|
-
|
7
|
+
class Mongo
|
8
|
+
include Defaults
|
9
|
+
|
10
10
|
# @param [Hash] options
|
11
11
|
# @option options [String] :collection ('moneta') MongoDB collection name
|
12
12
|
# @option options [String] :host ('127.0.0.1') MongoDB server host
|
@@ -21,17 +21,20 @@ module Moneta
|
|
21
21
|
@collection = connection.db(db).collection(collection)
|
22
22
|
end
|
23
23
|
|
24
|
+
# (see Proxy#load)
|
24
25
|
def load(key, options = {})
|
25
26
|
value = @collection.find_one('_id' => ::BSON::Binary.new(key))
|
26
27
|
value && value['value'].to_s
|
27
28
|
end
|
28
29
|
|
30
|
+
# (see Proxy#delete)
|
29
31
|
def delete(key, options = {})
|
30
32
|
value = load(key, options)
|
31
33
|
@collection.remove('_id' => ::BSON::Binary.new(key)) if value
|
32
34
|
value
|
33
35
|
end
|
34
36
|
|
37
|
+
# (see Proxy#store)
|
35
38
|
def store(key, value, options = {})
|
36
39
|
key = ::BSON::Binary.new(key)
|
37
40
|
@collection.update({ '_id' => key },
|
@@ -40,6 +43,7 @@ module Moneta
|
|
40
43
|
value
|
41
44
|
end
|
42
45
|
|
46
|
+
# (see Proxy#clear)
|
43
47
|
def clear(options = {})
|
44
48
|
@collection.remove
|
45
49
|
self
|