moneta 1.4.1 → 1.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +425 -0
  3. data/CHANGES +17 -0
  4. data/CONTRIBUTORS +2 -0
  5. data/Gemfile +161 -60
  6. data/README.md +21 -17
  7. data/lib/moneta/adapter.rb +52 -0
  8. data/lib/moneta/adapters/activerecord.rb +77 -68
  9. data/lib/moneta/adapters/activesupportcache.rb +22 -31
  10. data/lib/moneta/adapters/cassandra.rb +114 -116
  11. data/lib/moneta/adapters/client.rb +17 -18
  12. data/lib/moneta/adapters/couch.rb +31 -26
  13. data/lib/moneta/adapters/datamapper.rb +9 -5
  14. data/lib/moneta/adapters/daybreak.rb +15 -21
  15. data/lib/moneta/adapters/dbm.rb +6 -12
  16. data/lib/moneta/adapters/file.rb +21 -13
  17. data/lib/moneta/adapters/fog.rb +5 -6
  18. data/lib/moneta/adapters/gdbm.rb +6 -12
  19. data/lib/moneta/adapters/hbase.rb +10 -12
  20. data/lib/moneta/adapters/kyotocabinet.rb +22 -27
  21. data/lib/moneta/adapters/leveldb.rb +14 -20
  22. data/lib/moneta/adapters/lmdb.rb +19 -22
  23. data/lib/moneta/adapters/localmemcache.rb +7 -13
  24. data/lib/moneta/adapters/lruhash.rb +20 -20
  25. data/lib/moneta/adapters/memcached/dalli.rb +25 -33
  26. data/lib/moneta/adapters/memcached/native.rb +14 -20
  27. data/lib/moneta/adapters/memory.rb +5 -7
  28. data/lib/moneta/adapters/mongo.rb +53 -52
  29. data/lib/moneta/adapters/pstore.rb +21 -27
  30. data/lib/moneta/adapters/redis.rb +42 -37
  31. data/lib/moneta/adapters/restclient.rb +17 -25
  32. data/lib/moneta/adapters/riak.rb +8 -9
  33. data/lib/moneta/adapters/sdbm.rb +6 -12
  34. data/lib/moneta/adapters/sequel/mysql.rb +8 -8
  35. data/lib/moneta/adapters/sequel/postgres.rb +17 -17
  36. data/lib/moneta/adapters/sequel/postgres_hstore.rb +47 -47
  37. data/lib/moneta/adapters/sequel/sqlite.rb +9 -9
  38. data/lib/moneta/adapters/sequel.rb +56 -65
  39. data/lib/moneta/adapters/sqlite.rb +37 -35
  40. data/lib/moneta/adapters/tdb.rb +8 -14
  41. data/lib/moneta/adapters/tokyocabinet.rb +19 -17
  42. data/lib/moneta/adapters/tokyotyrant.rb +29 -30
  43. data/lib/moneta/adapters/yaml.rb +1 -5
  44. data/lib/moneta/config.rb +101 -0
  45. data/lib/moneta/expires.rb +0 -1
  46. data/lib/moneta/expires_support.rb +3 -4
  47. data/lib/moneta/pool.rb +27 -7
  48. data/lib/moneta/proxy.rb +29 -0
  49. data/lib/moneta/server.rb +21 -14
  50. data/lib/moneta/version.rb +1 -1
  51. data/lib/moneta/wrapper.rb +5 -0
  52. data/lib/moneta.rb +2 -0
  53. data/moneta.gemspec +1 -0
  54. data/spec/active_support/cache_moneta_store_spec.rb +13 -13
  55. data/spec/features/null.rb +28 -28
  56. data/spec/features/persist.rb +3 -3
  57. data/spec/features/returndifferent.rb +4 -4
  58. data/spec/features/returnsame.rb +4 -4
  59. data/spec/features/store.rb +104 -104
  60. data/spec/helper.rb +15 -4
  61. data/spec/moneta/adapters/activerecord/adapter_activerecord_existing_connection_spec.rb +3 -1
  62. data/spec/moneta/adapters/activerecord/adapter_activerecord_spec.rb +15 -7
  63. data/spec/moneta/adapters/activerecord/standard_activerecord_spec.rb +5 -2
  64. data/spec/moneta/adapters/activerecord/standard_activerecord_with_expires_spec.rb +5 -2
  65. data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_spec.rb +3 -3
  66. data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_with_default_expires_spec.rb +2 -2
  67. data/spec/moneta/adapters/cassandra/adapter_cassandra_spec.rb +1 -1
  68. data/spec/moneta/adapters/cassandra/adapter_cassandra_with_default_expires_spec.rb +1 -1
  69. data/spec/moneta/adapters/cassandra/standard_cassandra_spec.rb +1 -1
  70. data/spec/moneta/adapters/client/client_helper.rb +4 -3
  71. data/spec/moneta/adapters/datamapper/adapter_datamapper_spec.rb +25 -8
  72. data/spec/moneta/adapters/datamapper/standard_datamapper_spec.rb +2 -2
  73. data/spec/moneta/adapters/datamapper/standard_datamapper_with_expires_spec.rb +2 -2
  74. data/spec/moneta/adapters/datamapper/standard_datamapper_with_repository_spec.rb +2 -2
  75. data/spec/moneta/adapters/faraday_helper.rb +3 -2
  76. data/spec/moneta/adapters/lruhash/adapter_lruhash_spec.rb +10 -6
  77. data/spec/moneta/adapters/memcached/dalli/adapter_memcached_dalli_spec.rb +13 -3
  78. data/spec/moneta/adapters/memcached/native/adapter_memcached_native_spec.rb +13 -3
  79. data/spec/moneta/adapters/mongo/adapter_mongo_spec.rb +2 -2
  80. data/spec/moneta/adapters/mongo/adapter_mongo_with_default_expires_spec.rb +1 -1
  81. data/spec/moneta/adapters/redis/adapter_redis_spec.rb +13 -3
  82. data/spec/moneta/adapters/redis/standard_redis_spec.rb +8 -1
  83. data/spec/moneta/adapters/sequel/adapter_sequel_spec.rb +4 -4
  84. data/spec/moneta/adapters/sequel/helper.rb +10 -5
  85. data/spec/moneta/adapters/sequel/standard_sequel_spec.rb +1 -1
  86. data/spec/moneta/adapters/sequel/standard_sequel_with_expires_spec.rb +1 -1
  87. data/spec/moneta/adapters/sqlite/adapter_sqlite_spec.rb +1 -1
  88. data/spec/moneta/adapters/sqlite/standard_sqlite_spec.rb +1 -1
  89. data/spec/moneta/adapters/sqlite/standard_sqlite_with_expires_spec.rb +1 -1
  90. data/spec/moneta/config_spec.rb +219 -0
  91. data/spec/moneta/proxies/enumerable/enumerable_spec.rb +2 -2
  92. data/spec/moneta/proxies/pool/pool_spec.rb +31 -3
  93. data/spec/moneta/proxies/transformer/transformer_bson_spec.rb +3 -1
  94. data/spec/moneta/proxies/transformer/transformer_marshal_escape_spec.rb +2 -0
  95. data/spec/rack/session_moneta_spec.rb +44 -25
  96. data/spec/restserver.rb +3 -14
  97. metadata +25 -15
  98. data/.travis.yml +0 -146
  99. data/spec/moneta/adapters/memcached/dalli/adapter_memcached_dalli_with_default_expires_spec.rb +0 -15
  100. data/spec/moneta/adapters/memcached/native/adapter_memcached_native_with_default_expires_spec.rb +0 -15
  101. data/spec/moneta/adapters/redis/adapter_redis_with_default_expires_spec.rb +0 -10
  102. data/spec/moneta/proxies/proxy/proxy_redis_spec.rb +0 -13
@@ -12,9 +12,7 @@ module Moneta
12
12
  # db['key'] = {a: 1, b: 2}
13
13
  #
14
14
  # @api public
15
- class Couch
16
- include Defaults
17
-
15
+ class Couch < Adapter
18
16
  # @api private
19
17
  class HTTPError < StandardError
20
18
  attr_reader :status, :request_method, :key
@@ -28,10 +26,21 @@ module Moneta
28
26
  end
29
27
  end
30
28
 
31
- attr_reader :backend
32
-
33
29
  supports :create, :each_key
34
30
 
31
+ config :value_field, default: 'value'
32
+ config :type_field, default: 'type'
33
+ config :login
34
+ config :password
35
+ config :adapter
36
+ config :skip_create_db
37
+
38
+ backend do |scheme: 'http', host: '127.0.0.1', port: 5984, db: 'moneta', adapter: nil, **options|
39
+ ::Faraday.new "#{scheme}://#{host}:#{port}/#{db}", options do |faraday|
40
+ faraday.adapter adapter if adapter
41
+ end
42
+ end
43
+
35
44
  # @param [Hash] options
36
45
  # @option options [String] :host ('127.0.0.1') Couch host
37
46
  # @option options [String] :port (5984) Couch port
@@ -46,26 +55,22 @@ module Moneta
46
55
  # @option options Other options passed to {Faraday::new} (unless
47
56
  # :backend option is provided).
48
57
  def initialize(options = {})
49
- @value_field = options.delete(:value_field) || 'value'
50
- @type_field = options.delete(:type_field) || 'type'
51
- login = options.delete(:login)
52
- password = options.delete(:password)
53
- @backend = options.delete(:backend) || begin
54
- host = options.delete(:host) || '127.0.0.1'
55
- port = options.delete(:port) || 5984
56
- db = options.delete(:db) || 'moneta'
57
- scheme = options.delete(:scheme) || 'http'
58
- block = if faraday_adapter = options.delete(:adapter)
59
- proc { |faraday| faraday.adapter(faraday_adapter) }
60
- end
61
- ::Faraday.new("#{scheme}://#{host}:#{port}/#{db}", options, &block)
58
+ super
59
+
60
+ if config.login && config.password
61
+ # Faraday 1.x had a `basic_auth` function
62
+ if backend.respond_to? :basic_auth
63
+ backend.basic_auth(config.login, config.password)
64
+ else
65
+ backend.request :authorization, :basic, config.login, config.password
66
+ end
62
67
  end
63
- @backend.basic_auth(login, password) if login && password
68
+
64
69
  @rev_cache = Moneta.build do
65
70
  use :Lock
66
71
  adapter :LRUHash
67
72
  end
68
- create_db
73
+ create_db unless config.skip_create_db
69
74
  end
70
75
 
71
76
  # (see Proxy#key?)
@@ -278,15 +283,15 @@ module Moneta
278
283
  end
279
284
 
280
285
  def doc_to_value(doc)
281
- case doc[@type_field]
286
+ case doc[config.type_field]
282
287
  when 'Hash'
283
288
  doc = doc.dup
284
289
  doc.delete('_id')
285
290
  doc.delete('_rev')
286
- doc.delete(@type_field)
291
+ doc.delete(config.type_field)
287
292
  doc
288
293
  else
289
- doc[@value_field]
294
+ doc[config.value_field]
290
295
  end
291
296
  end
292
297
 
@@ -294,11 +299,11 @@ module Moneta
294
299
  doc =
295
300
  case value
296
301
  when Hash
297
- value.merge(@type_field => 'Hash')
302
+ value.merge(config.type_field => 'Hash')
298
303
  when String
299
- { @value_field => value, @type_field => 'String' }
304
+ { config.value_field => value, config.type_field => 'String' }
300
305
  when Float, Integer
301
- { @value_field => value, @type_field => 'Number' }
306
+ { config.value_field => value, config.type_field => 'Number' }
302
307
  else
303
308
  raise ArgumentError, "Invalid value type: #{value.class}"
304
309
  end
@@ -7,6 +7,7 @@ module Moneta
7
7
  # @api public
8
8
  class DataMapper
9
9
  include Defaults
10
+ include Config
10
11
  include NilValues
11
12
 
12
13
  supports :create
@@ -19,15 +20,18 @@ module Moneta
19
20
  self.raise_on_save_failure = true
20
21
  end
21
22
 
23
+ config :setup, required: true
24
+ config :repository, default: :moneta, coerce: :to_sym
25
+ config :table, default: :moneta, coerce: :to_sym
26
+
22
27
  # @param [Hash] options
23
28
  # @option options [String] :setup Datamapper setup string
24
29
  # @option options [String/Symbol] :repository (:moneta) Repository name
25
30
  # @option options [String/Symbol] :table (:moneta) Table name
26
31
  def initialize(options = {})
27
- raise ArgumentError, 'Option :setup is required' unless options[:setup]
28
- @repository = (options.delete(:repository) || :moneta).to_sym
29
- Store.storage_names[@repository] = (options.delete(:table) || :moneta).to_s
30
- ::DataMapper.setup(@repository, options[:setup])
32
+ configure(options)
33
+ Store.storage_names[config.repository] = config.table.to_s
34
+ ::DataMapper.setup(config.repository, config.setup)
31
35
  context { Store.auto_upgrade! }
32
36
  end
33
37
 
@@ -91,7 +95,7 @@ module Moneta
91
95
  private
92
96
 
93
97
  def context
94
- ::DataMapper.repository(@repository) { yield }
98
+ ::DataMapper.repository(config.repository) { yield }
95
99
  end
96
100
  end
97
101
  end
@@ -4,58 +4,52 @@ module Moneta
4
4
  module Adapters
5
5
  # Daybreak backend
6
6
  # @api public
7
- class Daybreak
8
- include Defaults
7
+ class Daybreak < Adapter
9
8
  include DBMAdapter
10
9
  include IncrementSupport
11
10
  include CreateSupport
12
11
  include EachKeySupport
13
12
 
14
- # @param [Hash] options
15
- # @option options [String] :file Database file
16
- # @option options [::Daybreak] :backend Use existing backend instance
17
- def initialize(options = {})
18
- @backend = options[:backend] ||
19
- begin
20
- raise ArgumentError, 'Option :file is required' unless options[:file]
21
- ::Daybreak::DB.new(options[:file], serializer: ::Daybreak::Serializer::None)
22
- end
23
- end
13
+ # @!method initialize(options = {})
14
+ # @param [Hash] options
15
+ # @option options [String] :file Database file
16
+ # @option options [::Daybreak] :backend Use existing backend instance
17
+ backend { |file:| ::Daybreak::DB.new(file, serializer: ::Daybreak::Serializer::None) }
24
18
 
25
19
  # (see Proxy#load)
26
20
  def load(key, options = {})
27
- @backend.load if options[:sync]
28
- @backend[key]
21
+ backend.load if options[:sync]
22
+ backend[key]
29
23
  end
30
24
 
31
25
  # (see Proxy#store)
32
26
  def store(key, value, options = {})
33
- @backend[key] = value
34
- @backend.flush if options[:sync]
27
+ backend[key] = value
28
+ backend.flush if options[:sync]
35
29
  value
36
30
  end
37
31
 
38
32
  # (see Proxy#increment)
39
33
  def increment(key, amount = 1, options = {})
40
- @backend.lock { super }
34
+ backend.lock { super }
41
35
  end
42
36
 
43
37
  # (see Proxy#create)
44
38
  def create(key, value, options = {})
45
- @backend.lock { super }
39
+ backend.lock { super }
46
40
  end
47
41
 
48
42
  # (see Proxy#merge!)
49
43
  def merge!(pairs, options = {})
50
44
  if block_given?
51
- @backend.lock do
52
- @backend.update(pairs.map do |key, new_value|
45
+ backend.lock do
46
+ backend.update(pairs.map do |key, new_value|
53
47
  new_value = yield(key, load(key), new_value) if key?(key)
54
48
  [key, new_value]
55
49
  end)
56
50
  end
57
51
  else
58
- @backend.update(pairs)
52
+ backend.update(pairs)
59
53
  end
60
54
 
61
55
  self
@@ -4,23 +4,17 @@ module Moneta
4
4
  module Adapters
5
5
  # DBM backend (Berkeley DB)
6
6
  # @api public
7
- class DBM
8
- include Defaults
7
+ class DBM < Adapter
9
8
  include DBMAdapter
10
9
  include IncrementSupport
11
10
  include CreateSupport
12
11
  include EachKeySupport
13
12
 
14
- # @param [Hash] options
15
- # @option options [String] :file Database file
16
- # @option options [::DBM] :backend Use existing backend instance
17
- def initialize(options = {})
18
- @backend = options[:backend] ||
19
- begin
20
- raise ArgumentError, 'Option :file is required' unless options[:file]
21
- ::DBM.new(options[:file])
22
- end
23
- end
13
+ # @!method initialize(options = {})
14
+ # @param [Hash] options
15
+ # @option options [String] :file Database file
16
+ # @option options [::DBM] :backend Use existing backend instance
17
+ backend { |file:| ::DBM.new(file) }
24
18
  end
25
19
  end
26
20
  end
@@ -7,14 +7,18 @@ module Moneta
7
7
  # @api public
8
8
  class File
9
9
  include Defaults
10
+ include Config
11
+
10
12
  supports :create, :increment, :each_key
11
13
 
14
+ config :dir, required: true
15
+
12
16
  # @param [Hash] options
13
17
  # @option options [String] :dir Directory where files will be stored
14
18
  def initialize(options = {})
15
- raise ArgumentError, 'Option :dir is required' unless @dir = options[:dir]
16
- FileUtils.mkpath(@dir)
17
- raise "#{@dir} is not a directory" unless ::File.directory?(@dir)
19
+ configure(**options)
20
+ FileUtils.mkpath(config.dir)
21
+ raise "#{config.dir} is not a directory" unless ::File.directory?(config.dir)
18
22
  end
19
23
 
20
24
  # (see Proxy#key?)
@@ -24,12 +28,16 @@ module Moneta
24
28
 
25
29
  # (see Proxy#each_key)
26
30
  def each_key(&block)
27
- entries = ::Dir.entries(@dir).reject { |k| ::File.directory?(::File.join(@dir, k)) }
28
-
29
- return enum_for(:each_key) { ::Dir.entries(@dir).length - 2 } unless block_given?
31
+ entries = ::Dir.entries(config.dir).reject do |k|
32
+ ::File.directory?(::File.join(config.dir, k))
33
+ end
30
34
 
31
- entries.each { |k| yield(k) }
32
- self
35
+ if block_given?
36
+ entries.each { |k| yield(k) }
37
+ self
38
+ else
39
+ enum_for(:each_key) { ::Dir.entries(config.dir).length - 2 }
40
+ end
33
41
  end
34
42
 
35
43
  # (see Proxy#load)
@@ -41,7 +49,7 @@ module Moneta
41
49
 
42
50
  # (see Proxy#store)
43
51
  def store(key, value, options = {})
44
- temp_file = ::File.join(@dir, "value-#{$PROCESS_ID}-#{Thread.current.object_id}")
52
+ temp_file = ::File.join(config.dir, "value-#{$PROCESS_ID}-#{Thread.current.object_id}")
45
53
  path = store_path(key)
46
54
  FileUtils.mkpath(::File.dirname(path))
47
55
  ::File.open(temp_file, 'wb') { |f| f.write(value) }
@@ -63,9 +71,9 @@ module Moneta
63
71
 
64
72
  # (see Proxy#clear)
65
73
  def clear(options = {})
66
- temp_dir = "#{@dir}-#{$PROCESS_ID}-#{Thread.current.object_id}"
67
- ::File.rename(@dir, temp_dir)
68
- FileUtils.mkpath(@dir)
74
+ temp_dir = "#{config.dir}-#{$PROCESS_ID}-#{Thread.current.object_id}"
75
+ ::File.rename(config.dir, temp_dir)
76
+ FileUtils.mkpath(config.dir)
69
77
  self
70
78
  rescue Errno::ENOENT
71
79
  self
@@ -120,7 +128,7 @@ module Moneta
120
128
  protected
121
129
 
122
130
  def store_path(key)
123
- ::File.join(@dir, key)
131
+ ::File.join(config.dir, key)
124
132
  end
125
133
  end
126
134
  end
@@ -4,19 +4,18 @@ module Moneta
4
4
  module Adapters
5
5
  # Fog backend (Cloud storage services)
6
6
  # @api public
7
- class Fog
8
- include Defaults
7
+ class Fog < Adapter
8
+ config :dir, required: true
9
9
 
10
- attr_reader :backend
10
+ backend { |**options| ::Fog::Storage.new(options) }
11
11
 
12
12
  # @param [Hash] options
13
13
  # @option options [String] :dir Fog directory
14
14
  # @option options [::Fog::Storage] :backend Use existing backend instance
15
15
  # @option options Other options passed to `Fog::Storage#new`
16
16
  def initialize(options = {})
17
- raise ArgumentError, 'Option :dir is required' unless dir = options.delete(:dir)
18
- @backend = options[:backend] || ::Fog::Storage.new(options)
19
- @directory = @backend.directories.get(dir) || @backend.directories.create(key: dir)
17
+ super
18
+ @directory = backend.directories.get(config.dir) || backend.directories.create(key: config.dir)
20
19
  end
21
20
 
22
21
  # (see Proxy#key?)
@@ -4,23 +4,17 @@ module Moneta
4
4
  module Adapters
5
5
  # GDBM backend
6
6
  # @api public
7
- class GDBM
8
- include Defaults
7
+ class GDBM < Adapter
9
8
  include DBMAdapter
10
9
  include IncrementSupport
11
10
  include CreateSupport
12
11
  include EachKeySupport
13
12
 
14
- # @param [Hash] options
15
- # @option options [String] :file Database file
16
- # @option options [::GDBM] :backend Use existing backend instance
17
- def initialize(options = {})
18
- @backend = options[:backend] ||
19
- begin
20
- raise ArgumentError, 'Option :file is required' unless options[:file]
21
- ::GDBM.new(options[:file])
22
- end
23
- end
13
+ # @!method initialize(options = {})
14
+ # @param [Hash] options
15
+ # @option options [String] :file Database file
16
+ # @option options [::GDBM] :backend Use existing backend instance
17
+ backend { |file:| ::GDBM.new(file) }
24
18
  end
25
19
  end
26
20
  end
@@ -4,10 +4,12 @@ module Moneta
4
4
  module Adapters
5
5
  # HBase thrift backend
6
6
  # @api public
7
- class HBase
8
- include Defaults
7
+ class HBase < Adapter
8
+ config :column, 'value'
9
+ config :table, 'moneta'
10
+ config :column_family, 'moneta'
9
11
 
10
- attr_reader :backend
12
+ backend { |host: '127.0.0.1', port: 9090| HBaseRb::Client.new(host, port) }
11
13
 
12
14
  # TODO: Add create support using checkAndPut if added to thrift api
13
15
  # https://issues.apache.org/jira/browse/HBASE-3307
@@ -22,14 +24,10 @@ module Moneta
22
24
  # @option options [String] :column ('value') Column
23
25
  # @option options [::HBaseRb::Client] :backend Use existing backend instance
24
26
  def initialize(options = {})
25
- options[:column] ||= 'value'
26
- options[:table] ||= 'moneta'
27
- cf = (options[:column_family] || 'moneta')
28
- @column = "#{cf}:#{options[:column]}"
29
- @backend = options[:backend] ||
30
- HBaseRb::Client.new(options[:host] || '127.0.0.1', options[:port] || '9090')
31
- @backend.create_table(options[:table], cf) unless @backend.has_table?(options[:table])
32
- @table = @backend.get_table(options[:table])
27
+ super
28
+ @column = [config.column_family, config.column].join(':')
29
+ backend.create_table(config.table, config.column_family) unless backend.has_table?(config.table)
30
+ @table = backend.get_table(config.table)
33
31
  end
34
32
 
35
33
  # (see Proxy#key?)
@@ -75,7 +73,7 @@ module Moneta
75
73
 
76
74
  # (see Proxy#close)
77
75
  def close
78
- @backend.close
76
+ backend.close
79
77
  nil
80
78
  end
81
79
 
@@ -4,58 +4,53 @@ module Moneta
4
4
  module Adapters
5
5
  # KyotoCabinet backend
6
6
  # @api public
7
- class KyotoCabinet
8
- include Defaults
7
+ class KyotoCabinet < Adapter
9
8
  include HashAdapter
10
9
 
11
10
  supports :each_key, :increment, :create
12
11
 
13
- # @param [Hash] options
14
- # @option options [String] :file Database file
15
- # @option options [::KyotoCabinet::DB] :backend Use existing backend instance
16
- def initialize(options = {})
17
- if options[:backend]
18
- @backend = options[:backend]
19
- else
20
- raise ArgumentError, 'Option :file is required' unless options[:file]
21
- @backend = ::KyotoCabinet::DB.new
22
- raise @backend.error.to_s unless @backend.open(options[:file],
23
- ::KyotoCabinet::DB::OWRITER | ::KyotoCabinet::DB::OCREATE)
24
- end
12
+ # @!method initialize(options = {})
13
+ # @param [Hash] options
14
+ # @option options [String] :file Database file
15
+ # @option options [::KyotoCabinet::DB] :backend Use existing backend instance
16
+ backend do |file:|
17
+ backend = ::KyotoCabinet::DB.new
18
+ raise backend.error.to_s unless backend.open(file, ::KyotoCabinet::DB::OWRITER | ::KyotoCabinet::DB::OCREATE)
19
+ backend
25
20
  end
26
21
 
27
22
  # (see Proxy#key?)
28
23
  def key?(key, options = {})
29
- @backend.check(key) >= 0
24
+ backend.check(key) >= 0
30
25
  end
31
26
 
32
27
  # (see Proxy#delete)
33
28
  def delete(key, options = {})
34
- @backend.seize(key)
29
+ backend.seize(key)
35
30
  end
36
31
 
37
32
  # (see Proxy#create)
38
33
  def create(key, value, options = {})
39
- @backend.add(key, value)
34
+ backend.add(key, value)
40
35
  end
41
36
 
42
37
  # (see Proxy#close)
43
38
  def close
44
- @backend.close
39
+ backend.close
45
40
  nil
46
41
  end
47
42
 
48
43
  # (see Proxy#each_key)
49
44
  def each_key
50
- return enum_for(:each_key) { @backend.count } unless block_given?
51
- @backend.each_key { |arr| yield arr[0] }
45
+ return enum_for(:each_key) { backend.count } unless block_given?
46
+ backend.each_key { |arr| yield arr[0] }
52
47
  self
53
48
  end
54
49
 
55
50
  # (see Proxy#increment)
56
51
  def increment(key, amount = 1, options = {})
57
52
  ret = nil
58
- success = @backend.accept(key) do |_, value|
53
+ success = backend.accept(key) do |_, value|
59
54
  ret =
60
55
  if value
61
56
  Integer(value) + amount
@@ -65,13 +60,13 @@ module Moneta
65
60
  ret.to_s
66
61
  end
67
62
 
68
- raise @backend.error unless success
63
+ raise backend.error unless success
69
64
  ret
70
65
  end
71
66
 
72
67
  # (see Proxy#slice)
73
68
  def slice(*keys, atomic: true, **options)
74
- @backend.get_bulk(keys, atomic)
69
+ backend.get_bulk(keys, atomic)
75
70
  end
76
71
 
77
72
  # (see Proxy#values_at)
@@ -87,7 +82,7 @@ module Moneta
87
82
 
88
83
  success =
89
84
  if block_given?
90
- @backend.transaction(hard) do
85
+ backend.transaction(hard) do
91
86
  existing = slice(*pairs.map { |k, _| k }, **options)
92
87
  pairs = pairs.map do |key, new_value|
93
88
  if existing.key?(key)
@@ -96,13 +91,13 @@ module Moneta
96
91
  [key, new_value]
97
92
  end
98
93
  end
99
- @backend.set_bulk(pairs.to_h, atomic) >= 0
94
+ backend.set_bulk(pairs.to_h, atomic) >= 0
100
95
  end
101
96
  else
102
- @backend.set_bulk(pairs.to_h, atomic) >= 0
97
+ backend.set_bulk(pairs.to_h, atomic) >= 0
103
98
  end
104
99
 
105
- raise @backend.error unless success
100
+ raise backend.error unless success
106
101
  self
107
102
  end
108
103
  end
@@ -4,59 +4,53 @@ module Moneta
4
4
  module Adapters
5
5
  # LevelDB backend
6
6
  # @api public
7
- class LevelDB
8
- include Defaults
7
+ class LevelDB < Adapter
9
8
  include HashAdapter
10
9
  include IncrementSupport
11
10
  include CreateSupport
12
11
  include EachKeySupport
13
12
 
14
- # @param [Hash] options
15
- # @option options [String] :dir - Database path
16
- # @option options All other options passed to `LevelDB::DB#new`
17
- # @option options [::LevelDB::DB] :backend Use existing backend instance
18
- def initialize(options = {})
19
- @backend = options[:backend] ||
20
- begin
21
- raise ArgumentError, 'Option :dir is required' unless options[:dir]
22
- ::LevelDB::DB.new(options[:dir])
23
- end
24
- end
13
+ # @!method initialize(options = {})
14
+ # @param [Hash] options
15
+ # @option options [String] :dir - Database path
16
+ # @option options All other options passed to `LevelDB::DB#new`
17
+ # @option options [::LevelDB::DB] :backend Use existing backend instance
18
+ backend { |dir:| ::LevelDB::DB.new(dir) }
25
19
 
26
20
  # (see Proxy#key?)
27
21
  def key?(key, options = {})
28
- @backend.includes?(key)
22
+ backend.includes?(key)
29
23
  end
30
24
 
31
25
  # (see Proxy#clear)
32
26
  def clear(options = {})
33
- @backend.each { |k,| delete(k, options) }
27
+ backend.each { |k,| delete(k, options) }
34
28
  self
35
29
  end
36
30
 
37
31
  # (see Proxy#close)
38
32
  def close
39
- @backend.close
33
+ backend.close
40
34
  nil
41
35
  end
42
36
 
43
37
  # (see Proxy#each_key)
44
38
  def each_key
45
- return enum_for(:each_key) { @backend.size } unless block_given?
46
- @backend.each { |key, _| yield key }
39
+ return enum_for(:each_key) { backend.size } unless block_given?
40
+ backend.each { |key, _| yield key }
47
41
  self
48
42
  end
49
43
 
50
44
  # (see Proxy#values_at)
51
45
  def values_at(*keys, **options)
52
46
  ret = nil
53
- @backend.batch { ret = super }
47
+ backend.batch { ret = super }
54
48
  ret
55
49
  end
56
50
 
57
51
  # (see Proxy#merge!)
58
52
  def merge!(*keys, **options)
59
- @backend.batch { super }
53
+ backend.batch { super }
60
54
  self
61
55
  end
62
56
  end