Module: Parse

Defined in:
lib/parse/user.rb,
lib/parse/push.rb,
lib/parse/util.rb,
lib/parse/query.rb,
lib/parse/model.rb,
lib/parse/error.rb,
lib/parse/batch.rb,
lib/parse/cloud.rb,
lib/parse/client.rb,
lib/parse/object.rb,
lib/parse/protocol.rb,
lib/parse/datatypes.rb,
lib/parse/application.rb,
lib/parse/installation.rb

Defined Under Namespace

Modules: Cloud, Protocol Classes: Application, ArrayOp, Batch, Bytes, Client, Date, File, GeoPoint, Increment, Installation, Model, Object, ParseError, ParseProtocolError, ParseProtocolRetry, Pointer, Push, Query, User

Class Method Summary collapse

Class Method Details

.clientObject

Raises:


128
129
130
131
# File 'lib/parse/client.rb', line 128

def client
  raise ParseError, "API not initialized" if !@@client
  @@client
end

.destroyObject

Used mostly for testing. Lets you delete the api key global vars.


123
124
125
126
# File 'lib/parse/client.rb', line 123

def destroy
  @@client = nil
  self
end

.get(class_name, object_id = nil) ⇒ Object

Perform a simple retrieval of a simple object, or all objects of a given class. If object_id is supplied, a single object will be retrieved. If object_id is not supplied, then all objects of the given class will be retrieved and returned in an Array.


137
138
139
140
141
142
143
144
145
# File 'lib/parse/client.rb', line 137

def get(class_name, object_id = nil)
  data = self.client.get( Protocol.class_uri(class_name, object_id) )
  self.parse_json class_name, data
rescue ParseProtocolError => e
  if e.code == Protocol::ERROR_OBJECT_NOT_FOUND_FOR_GET
    e.message += ": #{class_name}:#{object_id}"
  end
  raise
end

.init(data = {}, &blk) ⇒ Object

Initialize the singleton instance of Client which is used by all API methods. Parse.init must be called before saving or retrieving any objects.


103
104
105
106
107
108
109
110
# File 'lib/parse/client.rb', line 103

def init(data = {}, &blk)
  defaults = {:application_id => ENV["PARSE_APPLICATION_ID"], :api_key => ENV["PARSE_REST_API_KEY"]}
  defaults.merge!(data)

  # use less permissive key if both are specified
  defaults[:master_key] = ENV["PARSE_MASTER_API_KEY"] unless data[:master_key] || defaults[:api_key]
  @@client = Client.new(defaults, &blk)
end

.init_from_cloud_code(path = "../config/global.json") ⇒ Object

A convenience method for using global.json


113
114
115
116
117
118
119
120
# File 'lib/parse/client.rb', line 113

def init_from_cloud_code(path = "../config/global.json")
  # warning: toplevel constant File referenced by Parse::Object::File
  global = JSON.parse(Object::File.open(path).read)
  application_name  = global["applications"]["_default"]["link"]
  application_id    = global["applications"][application_name]["applicationId"]
  master_key        = global["applications"][application_name]["masterKey"]
  self.init(:application_id => application_id, :master_key => master_key)
end

.object_pointer_equality?(a, b) ⇒ Boolean

Returns:

  • (Boolean)

73
74
75
76
77
78
79
80
# File 'lib/parse/util.rb', line 73

def Parse.object_pointer_equality?(a, b)
  classes = [Parse::Object, Parse::Pointer]
  return false unless classes.any? { |c| a.kind_of?(c) } && classes.any? { |c| b.kind_of?(c) }
  return true if a.equal?(b)
  return false if a.new? || b.new?

  a.class_name == b.class_name && a.id == b.id
end

.object_pointer_hash(v) ⇒ Object


82
83
84
85
86
87
88
# File 'lib/parse/util.rb', line 82

def Parse.object_pointer_hash(v)
  if v.new?
    v.object_id
  else
    v.class_name.hash ^ v.id.hash
  end
end

.parse_datatype(obj) ⇒ Object


36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/parse/util.rb', line 36

def Parse.parse_datatype(obj)
  type = obj[Protocol::KEY_TYPE]

  case type
    when Protocol::TYPE_POINTER
      Parse::Pointer.new obj
    when Protocol::TYPE_BYTES
      Parse::Bytes.new obj
    when Protocol::TYPE_DATE
      Parse::Date.new obj
    when Protocol::TYPE_GEOPOINT
      Parse::GeoPoint.new obj
    when Protocol::TYPE_FILE
      Parse::File.new obj
    when Protocol::TYPE_OBJECT # used for relation queries, e.g. "?include=post"
      Parse::Object.new obj[Protocol::KEY_CLASS_NAME], Hash[obj.map{|k,v| [k, parse_json(nil, v)]}]
  end
end

.parse_json(class_name, obj) ⇒ Object

Parse a JSON representation into a fully instantiated class. obj can be either a primitive or a Hash of primitives as parsed by JSON.parse

Parameters:


10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/parse/util.rb', line 10

def Parse.parse_json(class_name, obj)
  if obj.nil?
    nil

  # Array
  elsif obj.is_a? Array
    obj.collect { |o| parse_json(class_name, o) }

  # Hash
  elsif obj.is_a? Hash

    # If it's a datatype hash
    if obj.has_key?(Protocol::KEY_TYPE)
      parse_datatype obj
    elsif class_name # otherwise it must be a regular object, so deep parse it avoiding re-JSON.parsing raw Strings
      Parse::Object.new class_name, Hash[obj.map{|k,v| [k, parse_json(nil, v)]}]
    else # plain old hash
      obj
    end

  # primitive
  else
    obj
  end
end

.pointerize_value(obj) ⇒ Object


55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/parse/util.rb', line 55

def Parse.pointerize_value(obj)
  if obj.kind_of?(Parse::Object)
    p = obj.pointer
    raise ArgumentError.new("new object used in context requiring pointer #{obj}") unless p
    p
  elsif obj.is_a?(Array)
    obj.map do |v|
      Parse.pointerize_value(v)
    end
  elsif obj.is_a?(Hash)
    Hash[obj.map do |k, v|
      [k, Parse.pointerize_value(v)]
    end]
  else
    obj
  end
end