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
@@ -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