lib/moneta/adapters/couch.rb in moneta-1.4.2 vs lib/moneta/adapters/couch.rb in moneta-1.5.0
- old
+ new
@@ -10,13 +10,11 @@
# @example Store hashes
# db = Moneta::Adapters::Couch.new
# db['key'] = {a: 1, b: 2}
#
# @api public
- class Couch
- include Defaults
-
+ class Couch < Adapter
# @api private
class HTTPError < StandardError
attr_reader :status, :request_method, :key
def initialize(status, request_method, key)
@@ -26,14 +24,25 @@
super "HTTP Error: #{@status} (#{@request_method.to_s.upcase} #{@key})"
end
end
- attr_reader :backend
-
supports :create, :each_key
+ config :value_field, default: 'value'
+ config :type_field, default: 'type'
+ config :login
+ config :password
+ config :adapter
+ config :skip_create_db
+
+ backend do |scheme: 'http', host: '127.0.0.1', port: 5984, db: 'moneta', adapter: nil, **options|
+ ::Faraday.new "#{scheme}://#{host}:#{port}/#{db}", options do |faraday|
+ faraday.adapter adapter if adapter
+ end
+ end
+
# @param [Hash] options
# @option options [String] :host ('127.0.0.1') Couch host
# @option options [String] :port (5984) Couch port
# @option options [String] :db ('moneta') Couch database
# @option options [String] :scheme ('http') HTTP scheme to use
@@ -44,30 +53,26 @@
# @option options [Symbol] :adapter Adapter to use with Faraday
# @option options [Faraday::Connecton] :backend Use existing backend instance
# @option options Other options passed to {Faraday::new} (unless
# :backend option is provided).
def initialize(options = {})
- @value_field = options.delete(:value_field) || 'value'
- @type_field = options.delete(:type_field) || 'type'
- login = options.delete(:login)
- password = options.delete(:password)
- @backend = options.delete(:backend) || begin
- host = options.delete(:host) || '127.0.0.1'
- port = options.delete(:port) || 5984
- db = options.delete(:db) || 'moneta'
- scheme = options.delete(:scheme) || 'http'
- block = if faraday_adapter = options.delete(:adapter)
- proc { |faraday| faraday.adapter(faraday_adapter) }
- end
- ::Faraday.new("#{scheme}://#{host}:#{port}/#{db}", options, &block)
+ super
+
+ if config.login && config.password
+ # Faraday 1.x had a `basic_auth` function
+ if backend.respond_to? :basic_auth
+ backend.basic_auth(config.login, config.password)
+ else
+ backend.request :authorization, :basic, config.login, config.password
+ end
end
- @backend.basic_auth(login, password) if login && password
+
@rev_cache = Moneta.build do
use :Lock
adapter :LRUHash
end
- create_db
+ create_db unless config.skip_create_db
end
# (see Proxy#key?)
# @option options [Boolean] :cache_rev (true) Whether to cache the rev of
# the document for faster updating
@@ -276,30 +281,30 @@
def body_to_value(body)
doc_to_value(MultiJson.load(body))
end
def doc_to_value(doc)
- case doc[@type_field]
+ case doc[config.type_field]
when 'Hash'
doc = doc.dup
doc.delete('_id')
doc.delete('_rev')
- doc.delete(@type_field)
+ doc.delete(config.type_field)
doc
else
- doc[@value_field]
+ doc[config.value_field]
end
end
def value_to_doc(value, rev, id = nil)
doc =
case value
when Hash
- value.merge(@type_field => 'Hash')
+ value.merge(config.type_field => 'Hash')
when String
- { @value_field => value, @type_field => 'String' }
+ { config.value_field => value, config.type_field => 'String' }
when Float, Integer
- { @value_field => value, @type_field => 'Number' }
+ { config.value_field => value, config.type_field => 'Number' }
else
raise ArgumentError, "Invalid value type: #{value.class}"
end
doc['_rev'] = rev if rev
doc['_id'] = id if id