class Parse::Client

Constants

API_SERVER
API_VERSION

Attributes

api_key[RW]
application_id[RW]
http_client[RW]
master_key[RW]
session_token[RW]

Public Class Methods

default() click to toggle source
# File lib/parse/client.rb, line 10
def self.default
  @@default_client ||= new
end
default=(default_client) click to toggle source
# File lib/parse/client.rb, line 14
def self.default= default_client
  @@default_client = default_client
end
new(application_id=nil, api_key=nil, master_key=nil, http_client=nil) click to toggle source
# File lib/parse/client.rb, line 18
    def initialize application_id=nil, api_key=nil, master_key=nil, http_client=nil
      @application_id = application_id || Parse.application_id
      @api_key = api_key || Parse.api_key
      @master_key = master_key || Parse.master_key
      if @application_id.nil? || @api_key.nil?
        raise ArgumentError.new <<-EOS.gsub(/^ +/, '')
          Both Application ID and API Key must be set.
          ex. Parse.credentials application_id: APPLICATION_ID, api_key: API_KEY
        EOS
      end
      @http_client = http_client || Parse::HttpClient.new(API_SERVER)
    end

Public Instance Methods

build_headers(opt_headers={}) click to toggle source
# File lib/parse/client.rb, line 49
def build_headers opt_headers={}
  headers = {
    'X-Parse-Application-Id' => @application_id,
    'Content-Type' => 'application/json',
    'Accept' => 'application/json',
    'User-Agent' => 'A parse.com client for ruby'
  }
  if @use_master_key
    headers['X-Parse-Master-Key'] = @master_key
  else
    headers['X-Parse-REST-API-Key'] = @api_key
  end
  headers['X-Parse-Session-Token'] = @session_token if @session_token
  headers.update(opt_headers).delete_if {|k, v| v.nil?}
end
call_api(method, endpoint, body=nil, opt_headers={}) click to toggle source
# File lib/parse/client.rb, line 39
def call_api method, endpoint, body=nil, opt_headers={}, &block
  endpoint = "/#{API_VERSION}/#{endpoint}" unless endpoint[0] == '/'
  endpoint = canonicalize_endpoint endpoint
  headers = build_headers opt_headers
  if body.is_a?(Hash)
    body = Hash[*(body.to_a.map{|k, v| [k, URI.encode(v.to_s)]}.flatten)].to_json 
  end
  @http_client.request method, endpoint, headers, body, &block
end
call_function(name, param) click to toggle source
# File lib/parse/client.rb, line 154
def call_function name, param
  func_name = Parse.auto_snake_case ? name.to_s.gsub(/_([a-z])/) {$1.upcase} : name
  call_api :post, "functions/#{func_name}", param.to_json do |resp_body|
    if resp_body.has_key? 'result'
      resp_body['result']
    else
      raise StandartError.new 'unknown error'
    end
  end
end
canonicalize_endpoint(endpoint) click to toggle source
# File lib/parse/client.rb, line 31
def canonicalize_endpoint endpoint
  if endpoint =~ %r</#{API_VERSION}/classes/_(User|Role|Installation)>
    endpoint.sub %r</#{API_VERSION}/classes/_(User|Role|Installation)>, "/#{API_VERSION}/#{$1.downcase}s"
  else
    endpoint
  end
end
create(parse_class_name, values, &block) click to toggle source
# File lib/parse/client.rb, line 142
def create parse_class_name, values, &block
  call_api :post, "classes/#{parse_class_name}", values.to_json, &block
end
delete(parse_class_name, parse_object_id, &block) click to toggle source
# File lib/parse/client.rb, line 150
def delete parse_class_name, parse_object_id, &block
  call_api :delete, "classes/#{parse_class_name}/#{parse_object_id}", &block
end
dry_run(&block) click to toggle source
# File lib/parse/client.rb, line 208
def dry_run &block
  return dry_run? unless block

  tmp = dry_run?
  dry_run!
  begin
    block.call
  ensure
    self.dry_run = tmp
  end
  nil
end
dry_run!() click to toggle source
# File lib/parse/client.rb, line 200
def dry_run!
  @http_client.dry_run!
end
dry_run=(val) click to toggle source
# File lib/parse/client.rb, line 204
def dry_run= val
  @http_client = val
end
dry_run?() click to toggle source
# File lib/parse/client.rb, line 196
def dry_run?
  @http_client.dry_run?
end
find(parse_class_name, object_id_or_conditions, opts={}) click to toggle source
# File lib/parse/client.rb, line 78
def find parse_class_name, object_id_or_conditions, opts={}
  case object_id_or_conditions
  when :all
    find_by_query parse_class_name, opts
  when String, Symbol
    find_by_id parse_class_name, object_id_or_conditions, opts
  when Hash
    find_by_query parse_class_name, object_id_or_conditions
  else
    raise ArgumentError.new('the first argument should be a string, a symbol, or a hash.')
  end
end
find_by_id(parse_class_name, object_id, opts={}) click to toggle source
# File lib/parse/client.rb, line 91
def find_by_id parse_class_name, object_id, opts={}
  call_api :get, "classes/#{parse_class_name}/#{object_id}" do |resp_body|
    if opts.has_key? :include
      included_keys = [opts[:include]].flatten
      included_keys.each do |included_key|
        resp_body[included_key].tap do |pointer|
          if pointer['__type'] == 'Pointer'
            pointer['body'] = self.find_by_id pointer['className'], pointer['objectId']
          else
            raise ArgumentError.new('included column should be a pointer.')
          end
        end
      end
    end
    resp_body
  end
end
find_by_query(parse_class_name, conditions) click to toggle source
# File lib/parse/client.rb, line 109
def find_by_query parse_class_name, conditions
  query = Query.new parse_class_name, self
  query.limit conditions[:limit] if conditions.has_key? :limit
  query.skip conditions[:skip] if conditions.has_key? :skip
  query.count conditions[:count] if conditions.has_key? :count
  if conditions.has_key? :order
    order = conditions[:order]
    order = [order] unless order.is_a? Array
    query.order order
  end
  if conditions.has_key? :keys
    keys = conditions[:keys]
    keys = [keys] unless keys.is_a? Array
    query.keys keys
  end
  if conditions.has_key? :include
    include = conditions[:include]
    include = [include] unless include.is_a? Array
    query.include include
  end
  if conditions.has_key? :where
    case condition = conditions[:where]
    when Hash
      query.where condition
    when Proc
      query.where condition
    else
      raise 'wrong condition'
    end
  end
  query.invoke
end
log_in(username, password, &block) click to toggle source
# File lib/parse/client.rb, line 69
def log_in username, password, &block
  call_api :get, "login?username=#{URI.encode username}&password=#{
    URI.encode password}", nil, &block
end
log_out() click to toggle source
# File lib/parse/client.rb, line 74
def log_out
  @session_token = nil
end
method_missing(name, *args, &block) click to toggle source
# File lib/parse/client.rb, line 221
def method_missing name, *args, &block
  call_function name, args.first
end
sign_up(username, password, opts={}) click to toggle source
# File lib/parse/client.rb, line 65
def sign_up username, password, opts={}, &block
  call_api :post, 'users', {'username' => username, 'password' => password}.update(opts || {}), &block
end
update(parse_class_name, parse_object_id, values, &block) click to toggle source
# File lib/parse/client.rb, line 146
def update parse_class_name, parse_object_id, values, &block
  call_api :put, "classes/#{parse_class_name}/#{parse_object_id}", values.to_json, &block
end
use_master_key(&block) click to toggle source
# File lib/parse/client.rb, line 174
def use_master_key &block
  return @use_master_key unless block

  tmp, @use_master_key = @use_master_key, true
  begin
    ret = block.call
  ensure
    @use_master_key = tmp
  end
  ret
end
use_master_key!() click to toggle source
# File lib/parse/client.rb, line 165
def use_master_key!
  self.use_master_key = true
end
use_master_key=(val) click to toggle source
# File lib/parse/client.rb, line 169
def use_master_key= val
  raise ArgumentError.new('master_key is not set.') if val && !@master_key
  @use_master_key = val
end