moneta 0.7.1 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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