class Leanback::Couchdb

Attributes

address[R]
database[R]
password[R]
port[R]
username[R]

Public Class Methods

new(args = {}) click to toggle source
# File lib/leanback.rb, line 19
def initialize(args = {})
  @database = args.fetch(:database, nil)
  @address = args.fetch(:address, 'http://127.0.0.1')
  @port = args.fetch(:port, '5984')
  @username = args.fetch(:username, nil)
  @password = args.fetch(:password, nil)
end

Public Instance Methods

create() click to toggle source
# File lib/leanback.rb, line 26
def create
 api_request { RestClient.put "#{address_port}/#{db_uri}", content_type, cookies }
end
create_doc(doc_id, doc) click to toggle source
# File lib/leanback.rb, line 32
def create_doc(doc_id, doc)
  api_request { RestClient.put "#{address_port}/#{db_uri}/#{doc_uri(doc_id)}", generate_json(doc), cookies }
end
delete() click to toggle source
# File lib/leanback.rb, line 29
def delete
  api_request { RestClient.delete "#{address_port}/#{db_uri}", cookies }
end
delete_config(section, key) click to toggle source
# File lib/leanback.rb, line 79
def delete_config(section, key)
  !!(RestClient.delete "#{address_port}/_config/#{URI.escape(section)}/#{URI.escape(key)}", cookies)
rescue => e
  raise_error(e)
end
delete_doc(doc_id, rev) click to toggle source
# File lib/leanback.rb, line 35
def delete_doc(doc_id, rev)
  api_request {  RestClient.delete "#{address_port}/#{db_uri}/#{doc_uri(doc_id)}?rev=#{rev}", cookies }
end
delete_doc!(doc_id) click to toggle source
# File lib/leanback.rb, line 38
def delete_doc!(doc_id)
  document = get_doc(doc_id)
  delete_doc(document[:_id], document[:_rev])
end
edit_doc!(doc_id, data) click to toggle source
# File lib/leanback.rb, line 48
def edit_doc!(doc_id, data)
  document = get_doc(doc_id)
  document_with_rev = document.merge(data)
  update_doc(doc_id, document_with_rev)
end
get_config(section, key) click to toggle source
# File lib/leanback.rb, line 74
def get_config(section, key)
  RestClient.get "#{address_port}/_config/#{URI.escape(section)}/#{URI.escape(key)}", cookies
rescue => e
  raise_error(e)
end
get_doc(doc_id) click to toggle source
# File lib/leanback.rb, line 42
def get_doc(doc_id)
  api_request { RestClient.get "#{address_port}/#{@database}/#{doc_id}", cookies }
end
security_object() click to toggle source
# File lib/leanback.rb, line 68
def security_object
  api_request { RestClient.get "#{address_port}/#{db_uri}/_security/", cookies }
end
security_object=(security_settings) click to toggle source
# File lib/leanback.rb, line 65
def security_object=(security_settings)
  api_request { RestClient.put "#{address_port}/#{db_uri}/_security/", generate_json(security_settings), cookies }
end
set_config(section, key, value) click to toggle source
# File lib/leanback.rb, line 71
def set_config(section, key, value)
  !!(RestClient.put "#{address_port}/_config/#{URI.escape(section)}/#{URI.escape(key)}", value, cookies)
end
update_doc(doc_id, data) click to toggle source
# File lib/leanback.rb, line 45
def update_doc(doc_id, data)
  api_request { RestClient.put "#{address_port}/#{db_uri}/#{doc_uri(doc_id)}", generate_json(data), cookies }
end
view(design_doc_name, view_name, options = {}) click to toggle source
# File lib/leanback.rb, line 53
def view(design_doc_name, view_name, options = {})
  api_request { RestClient.get "#{address_port}/#{db_uri}/#{URI.escape(design_doc_name)}/_view/#{URI.escape(view_name)}?#{URI.encode_www_form(options)}", cookies }
end
where(hash, options = {}) click to toggle source
# File lib/leanback.rb, line 56
def where(hash, options = {})
  search_term = hash.values
  index = hash.keys.join("_")
  new_options = options.merge({startkey: search_term.to_s, endkey: search_term.to_s})
  view!("_design/#{index}_keys_finder", "find_by_keys_#{index}", new_options)
rescue CouchdbException => e
  add_multiple_finder(hash.keys)
  view!("_design/#{index}_keys_finder", "find_by_keys_#{index}", new_options)
end

Private Instance Methods

add_multiple_finder(keys) click to toggle source
# File lib/leanback.rb, line 91
def add_multiple_finder(keys)
  view_name = keys.join("_")
  condition = keys.join(" && doc.")
  key = keys.join(",doc.")
  design_doc_name = "#{view_name}_keys_finder"
  design_doc = {
                  language: "javascript",
                  views: {
                            "find_by_keys_#{view_name}" => {
                              map: "function(doc){ if(doc.#{condition}) emit([doc.#{key}]);}"
                            }
                         }
               }
  create_doc "_design/#{design_doc_name}", design_doc
end
address_port() click to toggle source
# File lib/leanback.rb, line 128
def address_port
  "#{@address}:#{@port}"
end
api_request() { || ... } click to toggle source
# File lib/leanback.rb, line 106
def api_request
  response = yield
  parse_json(response)
rescue => e
  raise_error(e)
end
auth_session() click to toggle source
# File lib/leanback.rb, line 145
def auth_session
  return "" if @username.nil? && @password.nil?
  data = "name=#{@username}&password=#{@password}"
  response = RestClient.post "#{@address}:#{@port}/_session/", data, {content_type: 'application/x-www-form-urlencoded'}
  hash = response.cookies
  hash["AuthSession"]
rescue => e
  raise_error(e)
end
content_type() click to toggle source
# File lib/leanback.rb, line 122
def content_type
  {content_type: :json}
end
cookies() click to toggle source
# File lib/leanback.rb, line 125
def cookies
  {cookies: {"AuthSession" => auth_session}}
end
db_uri() click to toggle source
# File lib/leanback.rb, line 117
def db_uri
  error_message = "Invalid database name: #{@database}"
  raise(Leanback::InvalidDatabaseName.new(error_message), error_message) unless @database.is_a?(String)
  URI.escape(@database)
end
doc_uri(doc_id) click to toggle source
# File lib/leanback.rb, line 112
def doc_uri(doc_id)
  error_message = "Invalid Document ID: #{doc_id}"
  raise(Leanback::InvalidDocumentID.new(error_message), error_message) unless doc_id.is_a?(String)
  URI.escape(doc_id)
end
generate_json(data) click to toggle source
# File lib/leanback.rb, line 134
def generate_json(data)
  MultiJson.dump(data)
end
parse_json(json_doc) click to toggle source
# File lib/leanback.rb, line 131
def parse_json(json_doc)
  MultiJson.load(json_doc, symbolize_names: true)
end
raise_error(exception) click to toggle source
# File lib/leanback.rb, line 137
def raise_error(exception)
  if exception.respond_to?('response')
    response = parse_json(exception.response) rescue exception.response
    raise(CouchdbException.new(response), response)
  else
    raise(exception)
  end
end
view!(design_doc_name, view_name, options = {}) click to toggle source
# File lib/leanback.rb, line 85
def view!(design_doc_name, view_name, options = {})
  new_options = options.merge({include_docs: true})
  result = view(design_doc_name, view_name, new_options)
  rows = result[:rows]
  rows.map { |row| row[:doc] }
end