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
@@ -4,11 +4,10 @@ module Moneta
4
4
  module Adapters
5
5
  # Filesystem backend
6
6
  # @api public
7
- class File < Base
8
- include Mixins::IncrementSupport
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
@@ -4,9 +4,9 @@ module Moneta
4
4
  module Adapters
5
5
  # Fog backend (Cloud storage services)
6
6
  # @api public
7
- class Fog < Base
8
- # Constructor
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
@@ -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 < Base
8
- # Constructor
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 < Base
8
- include Mixins::HashAdapter
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 < Base
9
- include Mixins::IncrementSupport
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 < Base
8
- # Constructor
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 [String] :expires Default expiration time
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 < Base
8
- # Constructor
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 [String] :expires (604800) Default expiration time
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 < Base
6
- include Mixins::IncrementSupport
7
- include Mixins::HashAdapter
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 < Base
8
- # Constructor
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