moneta 0.7.1 → 0.7.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. data/.yardopts +1 -0
  2. data/CHANGES +21 -10
  3. data/README.md +1 -1
  4. data/SPEC.md +4 -12
  5. data/lib/moneta.rb +7 -5
  6. data/lib/moneta/adapters/activerecord.rb +9 -3
  7. data/lib/moneta/adapters/cassandra.rb +9 -4
  8. data/lib/moneta/adapters/client.rb +9 -3
  9. data/lib/moneta/adapters/cookie.rb +3 -0
  10. data/lib/moneta/adapters/couch.rb +8 -3
  11. data/lib/moneta/adapters/datamapper.rb +8 -3
  12. data/lib/moneta/adapters/dbm.rb +1 -2
  13. data/lib/moneta/adapters/file.rb +9 -4
  14. data/lib/moneta/adapters/fog.rb +8 -3
  15. data/lib/moneta/adapters/gdbm.rb +1 -2
  16. data/lib/moneta/adapters/hbase.rb +10 -3
  17. data/lib/moneta/adapters/leveldb.rb +3 -2
  18. data/lib/moneta/adapters/localmemcache.rb +4 -4
  19. data/lib/moneta/adapters/lruhash.rb +8 -4
  20. data/lib/moneta/adapters/memcached/dalli.rb +10 -4
  21. data/lib/moneta/adapters/memcached/native.rb +9 -4
  22. data/lib/moneta/adapters/memory.rb +8 -3
  23. data/lib/moneta/adapters/mongo.rb +7 -3
  24. data/lib/moneta/adapters/null.rb +8 -1
  25. data/lib/moneta/adapters/pstore.rb +9 -3
  26. data/lib/moneta/adapters/redis.rb +10 -4
  27. data/lib/moneta/adapters/riak.rb +12 -7
  28. data/lib/moneta/adapters/sdbm.rb +1 -2
  29. data/lib/moneta/adapters/sequel.rb +9 -3
  30. data/lib/moneta/adapters/sqlite.rb +10 -4
  31. data/lib/moneta/adapters/tokyocabinet.rb +2 -2
  32. data/lib/moneta/builder.rb +11 -7
  33. data/lib/moneta/cache.rb +16 -6
  34. data/lib/moneta/expires.rb +12 -6
  35. data/lib/moneta/lock.rb +0 -2
  36. data/lib/moneta/logger.rb +0 -2
  37. data/lib/moneta/mixins.rb +175 -47
  38. data/lib/moneta/optionmerger.rb +2 -0
  39. data/lib/moneta/proxy.rb +14 -30
  40. data/lib/moneta/server.rb +0 -2
  41. data/lib/moneta/shared.rb +1 -3
  42. data/lib/moneta/stack.rb +20 -10
  43. data/lib/moneta/transformer.rb +84 -61
  44. data/lib/moneta/version.rb +1 -1
  45. data/lib/rack/moneta_rest.rb +56 -0
  46. data/moneta.gemspec +1 -1
  47. data/spec/active_support/cache_moneta_store_spec.rb +4 -4
  48. data/spec/generate.rb +216 -203
  49. data/spec/helper.rb +0 -6
  50. data/spec/moneta/adapter_cassandra_spec.rb +2 -2
  51. data/spec/moneta/adapter_datamapper_spec.rb +1 -1
  52. data/spec/moneta/adapter_lruhash_spec.rb +1 -1
  53. data/spec/moneta/adapter_memcached_dalli_spec.rb +2 -2
  54. data/spec/moneta/adapter_memcached_native_spec.rb +2 -2
  55. data/spec/moneta/adapter_memcached_spec.rb +2 -2
  56. data/spec/moneta/adapter_redis_spec.rb +2 -2
  57. data/spec/moneta/cache_file_memory_spec.rb +3 -3
  58. data/spec/moneta/expires_file_spec.rb +4 -4
  59. data/spec/moneta/expires_memory_spec.rb +2 -2
  60. data/spec/moneta/optionmerger_spec.rb +6 -6
  61. data/spec/moneta/shared_spec.rb +1 -1
  62. data/spec/moneta/simple_client_tcp_spec.rb +1 -1
  63. data/spec/moneta/transformer_key_marshal_spec.rb +109 -0
  64. data/spec/moneta/transformer_key_yaml_spec.rb +109 -0
  65. data/spec/moneta/transformer_marshal_spec.rb +109 -0
  66. data/spec/moneta/transformer_value_marshal_spec.rb +109 -0
  67. data/spec/moneta/transformer_value_yaml_spec.rb +109 -0
  68. data/spec/monetaspecs.rb +14460 -3956
  69. metadata +16 -6
  70. data/lib/moneta/base.rb +0 -98
  71. data/lib/moneta/net.rb +0 -22
@@ -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 < Base
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 < Base
8
- # Constructor
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 < Base
8
- # Constructor
9
- #
7
+ class Redis
8
+ include Defaults
9
+
10
10
  # @param [Hash] options
11
- # @option options [String] :expires Default expiration time
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
@@ -7,9 +7,9 @@ module Moneta
7
7
  module Adapters
8
8
  # Riak backend
9
9
  # @api public
10
- class Riak < Base
11
- # Constructor
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) }
@@ -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 < Base
8
- # Constructor
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 < Base
8
- include Mixins::IncrementSupport
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
@@ -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
- # @api private
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 < Base
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
- unless value
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
- value = @backend.increment(key, amount, options)
64
- @cache.store(key, value.to_s, options)
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