parsecom 0.0.6 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -87,12 +87,12 @@ another is using Parse::Object as a facade of a query object.
87
87
  # useing Query object directly
88
88
  query = Parse::Query.new GameScore
89
89
  query.where :objectId => 'Ed1nuqPvcm'
90
- results = query.invoke
90
+ results = query.run
91
91
 
92
92
  # using Query object through Parse::Object
93
93
  results = GameScore.find :where => {:objectId => 'Ed1nuqPvcm'}
94
94
  # if you would like to find by objectId, you can easily pass it directly
95
- result = GameScore.find 'Ed1nuqPvcm'
95
+ result = GameScore.find_by_id 'Ed1nuqPvcm'
96
96
  ```
97
97
 
98
98
  More complex query
@@ -123,9 +123,9 @@ To know more about retrieving objects, see spec/parse_query_spec.rb
123
123
  To update attributes, just update the attribute and save.
124
124
 
125
125
  ```ruby
126
- result = GameScore.find 'Ed1nuqPvcm'
127
- result.score = 73453
128
- result.save
126
+ game_score = GameScore.find_by_id 'Ed1nuqPvcm'
127
+ game_score.score = 73453
128
+ game_score.save
129
129
  ```
130
130
 
131
131
  If you want to update attributes without retrieving the object, you can use
@@ -135,9 +135,61 @@ the Parse::Client object for it.
135
135
  Parse::Client.default.update :GaemScore, 'Ed1nuqPvcm', :score => 73453
136
136
  ```
137
137
 
138
+ #### Counters
139
+
140
+ ```ruby
141
+ game_score = GameScore.find_by_id 'Ed1nuqPvcm'
142
+ game_score.score = Parse::Op::Increment.new 1
143
+ game_score.save
144
+ ```
145
+
146
+ #### Arrays
147
+
148
+ ```ruby
149
+ game_score = GameScore.find_by_id 'Ed1nuqPvcm'
150
+ game_score.skils = Parse::Op::AddUnique.new 'flying', 'kungfu'
151
+ game_score.save
152
+ ```
153
+
154
+ #### Relations
155
+
156
+ ```ruby
157
+ game_score = GameScore.find_by_id 'Ed1nuqPvcm'
158
+ game_score.opponents = Parse::Op::AddRelation.new player.pointer
159
+ game_score.save
160
+ ```
161
+
162
+ ```ruby
163
+ game_score = GameScore.find_by_id 'Ed1nuqPvcm'
164
+ game_score.opponents = Parse::Op::RemoveRelation.new player.pointer
165
+ game_score.save
166
+ ```
167
+
138
168
  ### Deleting Objects
139
169
 
140
- TBD
170
+ ```ruby
171
+ game_score = GameScore.find_by_id 'Ed1nuqPvcm'
172
+ game_score.delete
173
+ ```
174
+
175
+ ```ruby
176
+ game_score = GameScore.find_by_id 'Ed1nuqPvcm'
177
+ game_score.opponents = Parse::Op::Delete.new
178
+ game_score.save
179
+ ```
180
+
181
+ ### Batch Operations
182
+
183
+ ```ruby
184
+ seans_score = GameScore.new 'score' => 1337, 'playerName' => 'Sean Plott'
185
+ zerocools_score = GameScore.new 'score' => 1338, 'playerName' => 'ZeroCool'
186
+ batch = Parse::Batch.new
187
+ batch.add_request do
188
+ seans_score.save
189
+ zerocools_score.save
190
+ end
191
+ result = batch.run
192
+ ```
141
193
 
142
194
  ### Sign up
143
195
 
@@ -0,0 +1,37 @@
1
+ module Parse
2
+ class Batch
3
+ def initialize &block
4
+ @blocks = []
5
+ @blocks << block if block
6
+ end
7
+
8
+ def add_request &block
9
+ @blocks << block if block
10
+ end
11
+
12
+ def run
13
+ default_client = Parse::Client.default
14
+ default_http_client = default_client.http_client
15
+ batch_http_client = Parse::BatchHttpClient.new default_http_client.host
16
+ default_client.http_client = batch_http_client
17
+ begin
18
+ @blocks.map &:call
19
+ ensure
20
+ default_client.http_client = default_http_client
21
+ end
22
+
23
+ default_client.call_api :post, 'batch', %Q|{"requests":#{batch_http_client.requests.to_json}}| do |responses|
24
+ responses.each.with_index do |r, i|
25
+ if after_block = batch_http_client.after_blocks[i]
26
+ if r['success']
27
+ after_block.call r['success']
28
+ elsif r['error']
29
+ # do something
30
+ raise StandardError.new(r['error'].to_s)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,22 @@
1
+ module Parse
2
+ class BatchHttpClient < HttpClient
3
+ attr_accessor :requests, :after_blocks
4
+
5
+ def initialize host
6
+ @host = host
7
+ @requests = []
8
+ @after_blocks = []
9
+ end
10
+
11
+ def request method, endpoint, headers={}, body=nil, &block
12
+ raise 'find cannot be in a batch request.' if method.to_s.upcase == 'GET'
13
+
14
+ @after_blocks << block
15
+ @requests << {
16
+ "method" => method.to_s.upcase,
17
+ "path" => endpoint,
18
+ "body" => JSON.parse(body) # TODO: ??
19
+ }
20
+ end
21
+ end
22
+ end
data/lib/parse/client.rb CHANGED
@@ -11,6 +11,10 @@ module Parse
11
11
  @@default_client ||= new
12
12
  end
13
13
 
14
+ def self.default= default_client
15
+ @@default_client = default_client
16
+ end
17
+
14
18
  def initialize application_id=nil, api_key=nil, master_key=nil, http_client=nil
15
19
  @application_id = application_id || Parse.application_id
16
20
  @api_key = api_key || Parse.api_key
@@ -126,22 +130,16 @@ module Parse
126
130
  query.invoke
127
131
  end
128
132
 
129
- def create parse_class_name, values
130
- call_api :post, "classes/#{parse_class_name}", values.to_json do |resp_body|
131
- resp_body
132
- end
133
+ def create parse_class_name, values, &block
134
+ call_api :post, "classes/#{parse_class_name}", values.to_json, &block
133
135
  end
134
136
 
135
- def update parse_class_name, parse_object_id, values
136
- call_api :put, "classes/#{parse_class_name}/#{parse_object_id}", values.to_json do |resp_body|
137
- resp_body
138
- end
137
+ def update parse_class_name, parse_object_id, values, &block
138
+ call_api :put, "classes/#{parse_class_name}/#{parse_object_id}", values.to_json, &block
139
139
  end
140
140
 
141
- def delete parse_class_name, parse_object_id
142
- call_api :delete, "classes/#{parse_class_name}/#{parse_object_id}" do |resp_body|
143
- resp_body
144
- end
141
+ def delete parse_class_name, parse_object_id, &block
142
+ call_api :delete, "classes/#{parse_class_name}/#{parse_object_id}", &block
145
143
  end
146
144
 
147
145
  def call_function name, param
@@ -168,8 +166,11 @@ module Parse
168
166
  return @use_master_key unless block
169
167
 
170
168
  tmp, @use_master_key = @use_master_key, true
171
- ret = block.call
172
- @use_master_key = tmp
169
+ begin
170
+ ret = block.call
171
+ ensure
172
+ @use_master_key = tmp
173
+ end
173
174
  ret
174
175
  end
175
176
 
@@ -1,6 +1,8 @@
1
1
  # coding:utf-8
2
2
  module Parse
3
3
  class HttpClient
4
+ attr_accessor :host
5
+
4
6
  def initialize host
5
7
  @host = host
6
8
  end
@@ -15,7 +17,7 @@ module Parse
15
17
  resp = client.request req
16
18
  resp_body = JSON.parse resp.body
17
19
  raise StandardError.new "error calling #{endpoint}: #{
18
- resp_body['error']}" if resp_body.has_key? 'error'
20
+ resp_body['error']}" if resp_body.is_a?(Hash) && resp_body.has_key?('error')
19
21
  block.call resp_body if block
20
22
  end
21
23
  end
data/lib/parse/object.rb CHANGED
@@ -146,7 +146,7 @@ module Parse
146
146
  hash = string_keyed_hash hash
147
147
  @updated_hash.update hash
148
148
  method = use_master_key ? :create! : :create
149
- parse_client.send(method, self.parse_class_name, @updated_hash).tap do |response|
149
+ parse_client.send(method, self.parse_class_name, @updated_hash) do |response|
150
150
  @parse_object_id = response['objectId']
151
151
  @created_at = Date.parse response['createdAt']
152
152
  @updated_at = @created_at
@@ -163,11 +163,11 @@ module Parse
163
163
  def update hash, use_master_key=false
164
164
  check_deleted!
165
165
  hash = string_keyed_hash hash
166
- #parse_client.update(self, hash).tap do |response|
167
166
  method = use_master_key ? :update! : :update
168
- parse_client.send(method, parse_class_name, parse_object_id, hash).tap do |response|
169
- @updated_at = Date.parse response['updatedAt']
167
+ parse_client.send(method, parse_class_name, parse_object_id, hash) do |response|
170
168
  @raw_hash.update @updated_hash
169
+ @raw_hash.update response
170
+ @updated_at = Date.parse response['updatedAt']
171
171
  @updated_hash.clear
172
172
  end
173
173
  end
@@ -180,7 +180,7 @@ module Parse
180
180
  raise 'You cannot delete new object' if new?
181
181
  check_deleted!
182
182
  method = use_master_key ? :delete! : :delete
183
- parse_client.send(method, parse_class_name, parse_object_id).tap do |response|
183
+ parse_client.send(method, parse_class_name, parse_object_id) do |response|
184
184
  @deleted = true
185
185
  end
186
186
  end
@@ -216,7 +216,7 @@ module Parse
216
216
  @updated_hash[name] = value
217
217
  end
218
218
 
219
- def to_pointer
219
+ def pointer
220
220
  Pointer.new 'className' => parse_class_name, 'objectId' => parse_object_id
221
221
  end
222
222
 
@@ -0,0 +1,13 @@
1
+ module Parse
2
+ module Op
3
+ class Add
4
+ def initialize *objects
5
+ @objects = objects
6
+ end
7
+
8
+ def to_json *args
9
+ %Q|{"__op":"Add","objects":#{@objects.inspect}}|
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Parse
2
+ module Op
3
+ class AddRelation
4
+ def initialize *pointers
5
+ @pointers = pointers
6
+ end
7
+
8
+ def to_json *args
9
+ %Q|{"__op":"AddRelation","objects":[#{@pointers.map(&:to_json).join(',')}]}|
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Parse
2
+ module Op
3
+ class AddUnique
4
+ def initialize *objects
5
+ @objects = objects
6
+ end
7
+
8
+ def to_json *args
9
+ %Q|{"__op":"AddUnique","objects":#{@objects.inspect}}|
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ module Parse
2
+ module Op
3
+ class Delete
4
+ def to_json *args
5
+ %Q|{"__op":"Delete"}|
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ module Parse
2
+ module Op
3
+ class Increment
4
+ def initialize amount
5
+ @amount = amount
6
+ end
7
+
8
+ def to_json *args
9
+ %Q|{"__op":"Increment","amount":#{@amount}}|
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Parse
2
+ module Op
3
+ class Remove
4
+ def initialize *objects
5
+ @objects = objects
6
+ end
7
+
8
+ def to_json *args
9
+ %Q|{"__op":"Remove","objects":#{@objects.inspect}}|
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Parse
2
+ module Op
3
+ class RemoveRelation
4
+ def initialize *pointers
5
+ @pointers = pointers
6
+ end
7
+
8
+ def to_json *args
9
+ %Q|{"__op":"RemoveRelation","objects":[#{@pointers.map(&:to_json).join(',')}]}|
10
+ end
11
+ end
12
+ end
13
+ end
@@ -9,7 +9,7 @@ module Parse
9
9
 
10
10
  def load parse_client=Parse::Client.default
11
11
  unless @objects
12
- pointer = @parent_object.to_pointer
12
+ pointer = @parent_object.pointer
13
13
  key = @column_name
14
14
  related_class = Parse::Object @raw_hash['className']
15
15
  @objects = related_class.find :where => proc {
data/lib/parse/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Parse
2
- VERSION = "0.0.6"
2
+ VERSION = "0.1.0"
3
3
  end
data/lib/parsecom.rb CHANGED
@@ -18,6 +18,15 @@ require 'parse/installation'
18
18
  require 'parse/pointer'
19
19
  require 'parse/relation'
20
20
  require 'parse/file'
21
+ require 'parse/op/increment'
22
+ require 'parse/op/add'
23
+ require 'parse/op/add_unique'
24
+ require 'parse/op/remove'
25
+ require 'parse/op/add_relation'
26
+ require 'parse/op/remove_relation'
27
+ require 'parse/op/delete'
28
+ require 'parse/batch'
29
+ require 'parse/batch_http_client'
21
30
 
22
31
  module Parse
23
32
  @@application_id = ENV['PARSE_APPLICATION_ID']
@@ -0,0 +1,109 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.parse.com/1/classes/ClassA?limit=1
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ X-Parse-Application-Id:
11
+ - <X-Parse-Application-Id>
12
+ Content-Type:
13
+ - application/json
14
+ Accept:
15
+ - application/json
16
+ User-Agent:
17
+ - A parse.com client for ruby
18
+ X-Parse-Rest-Api-Key:
19
+ - <X-Parse-REST-API-Key>
20
+ response:
21
+ status:
22
+ code: 200
23
+ message: OK
24
+ headers:
25
+ Access-Control-Allow-Origin:
26
+ - ! '*'
27
+ Access-Control-Request-Method:
28
+ - ! '*'
29
+ Cache-Control:
30
+ - max-age=0, private, must-revalidate
31
+ Content-Type:
32
+ - application/json; charset=utf-8
33
+ Date:
34
+ - Tue, 15 Oct 2013 12:50:22 GMT
35
+ Etag:
36
+ - ! '"e305fd3b81a57c52f61e6ae93b8eda1f"'
37
+ Server:
38
+ - nginx/1.4.2
39
+ Set-Cookie:
40
+ - <COOKIE-KEY>
41
+ Status:
42
+ - 200 OK
43
+ X-Runtime:
44
+ - '0.124765'
45
+ X-Ua-Compatible:
46
+ - IE=Edge,chrome=1
47
+ Content-Length:
48
+ - '252'
49
+ Connection:
50
+ - keep-alive
51
+ body:
52
+ encoding: US-ASCII
53
+ string: ! '{"results":[{"columnA":"Hello, parse.com","columnD":{"__type":"Relation","className":"ClassB"},"columnC":{"__type":"Relation","className":"ClassB"},"createdAt":"2013-10-04T04:25:12.585Z","updatedAt":"2013-10-04T04:25:12.585Z","objectId":"4Ks88ukAUE"}]}'
54
+ http_version:
55
+ recorded_at: Tue, 15 Oct 2013 12:50:22 GMT
56
+ - request:
57
+ method: post
58
+ uri: https://api.parse.com/1/batch
59
+ body:
60
+ encoding: US-ASCII
61
+ string: ! '{"requests":[{"method":"POST","path":"/1/classes/ClassA","body":{"columnA":"hello"}},{"method":"POST","path":"/1/classes/ClassA","body":{"columnA":"world"}},{"method":"PUT","path":"/1/classes/ClassA/4Ks88ukAUE","body":{"columnA":"updated!"}}]}'
62
+ headers:
63
+ X-Parse-Application-Id:
64
+ - <X-Parse-Application-Id>
65
+ Content-Type:
66
+ - application/json
67
+ Accept:
68
+ - application/json
69
+ User-Agent:
70
+ - A parse.com client for ruby
71
+ X-Parse-Rest-Api-Key:
72
+ - <X-Parse-REST-API-Key>
73
+ response:
74
+ status:
75
+ code: 200
76
+ message: OK
77
+ headers:
78
+ Access-Control-Allow-Origin:
79
+ - ! '*'
80
+ Access-Control-Request-Method:
81
+ - ! '*'
82
+ Cache-Control:
83
+ - max-age=0, private, must-revalidate
84
+ Content-Type:
85
+ - application/json; charset=utf-8
86
+ Date:
87
+ - Tue, 15 Oct 2013 12:50:23 GMT
88
+ Etag:
89
+ - ! '"2d26115f97cbd8d4143d8fb6e9a0b296"'
90
+ Server:
91
+ - nginx/1.4.2
92
+ Set-Cookie:
93
+ - <COOKIE-KEY>
94
+ Status:
95
+ - 200 OK
96
+ X-Runtime:
97
+ - '0.154472'
98
+ X-Ua-Compatible:
99
+ - IE=Edge,chrome=1
100
+ Content-Length:
101
+ - '208'
102
+ Connection:
103
+ - keep-alive
104
+ body:
105
+ encoding: US-ASCII
106
+ string: ! '[{"success":{"createdAt":"2013-10-15T12:50:23.934Z","objectId":"za4TGQV39W"}},{"success":{"createdAt":"2013-10-15T12:50:23.951Z","objectId":"Y3ypX9OJ0v"}},{"success":{"updatedAt":"2013-10-15T12:50:23.977Z"}}]'
107
+ http_version:
108
+ recorded_at: Tue, 15 Oct 2013 12:50:24 GMT
109
+ recorded_with: VCR 2.4.0
@@ -0,0 +1,109 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.parse.com/1/classes/ClassA?limit=1
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ X-Parse-Application-Id:
11
+ - <X-Parse-Application-Id>
12
+ Content-Type:
13
+ - application/json
14
+ Accept:
15
+ - application/json
16
+ User-Agent:
17
+ - A parse.com client for ruby
18
+ X-Parse-Rest-Api-Key:
19
+ - <X-Parse-REST-API-Key>
20
+ response:
21
+ status:
22
+ code: 200
23
+ message: OK
24
+ headers:
25
+ Access-Control-Allow-Origin:
26
+ - ! '*'
27
+ Access-Control-Request-Method:
28
+ - ! '*'
29
+ Cache-Control:
30
+ - max-age=0, private, must-revalidate
31
+ Content-Type:
32
+ - application/json; charset=utf-8
33
+ Date:
34
+ - Sun, 13 Oct 2013 08:48:13 GMT
35
+ Etag:
36
+ - ! '"21f1d56465316b4627e035fe84754e22"'
37
+ Server:
38
+ - nginx/1.4.2
39
+ Set-Cookie:
40
+ - <COOKIE-KEY>
41
+ Status:
42
+ - 200 OK
43
+ X-Runtime:
44
+ - '0.051473'
45
+ X-Ua-Compatible:
46
+ - IE=Edge,chrome=1
47
+ Content-Length:
48
+ - '199'
49
+ Connection:
50
+ - keep-alive
51
+ body:
52
+ encoding: US-ASCII
53
+ string: ! '{"results":[{"columnA":"Hello, parse.com","columnD":{"__type":"Relation","className":"ClassB"},"createdAt":"2013-10-04T04:24:31.089Z","updatedAt":"2013-10-04T04:24:31.089Z","objectId":"OGKnxa5IiZ"}]}'
54
+ http_version:
55
+ recorded_at: Sun, 13 Oct 2013 08:48:15 GMT
56
+ - request:
57
+ method: put
58
+ uri: https://api.parse.com/1/classes/ClassA/OGKnxa5IiZ
59
+ body:
60
+ encoding: UTF-8
61
+ string: ! '{"columnB":{"__op":"Increment","amount":1}}'
62
+ headers:
63
+ X-Parse-Application-Id:
64
+ - <X-Parse-Application-Id>
65
+ Content-Type:
66
+ - application/json
67
+ Accept:
68
+ - application/json
69
+ User-Agent:
70
+ - A parse.com client for ruby
71
+ X-Parse-Rest-Api-Key:
72
+ - <X-Parse-REST-API-Key>
73
+ response:
74
+ status:
75
+ code: 200
76
+ message: OK
77
+ headers:
78
+ Access-Control-Allow-Origin:
79
+ - ! '*'
80
+ Access-Control-Request-Method:
81
+ - ! '*'
82
+ Cache-Control:
83
+ - max-age=0, private, must-revalidate
84
+ Content-Type:
85
+ - application/json; charset=utf-8
86
+ Date:
87
+ - Sun, 13 Oct 2013 08:48:14 GMT
88
+ Etag:
89
+ - ! '"89006920f12e748cde369d09a7b90cd5"'
90
+ Server:
91
+ - nginx/1.4.2
92
+ Set-Cookie:
93
+ - <COOKIE-KEY>
94
+ Status:
95
+ - 200 OK
96
+ X-Runtime:
97
+ - '0.045789'
98
+ X-Ua-Compatible:
99
+ - IE=Edge,chrome=1
100
+ Content-Length:
101
+ - '52'
102
+ Connection:
103
+ - keep-alive
104
+ body:
105
+ encoding: US-ASCII
106
+ string: ! '{"columnB":1,"updatedAt":"2013-10-13T08:48:14.448Z"}'
107
+ http_version:
108
+ recorded_at: Sun, 13 Oct 2013 08:48:16 GMT
109
+ recorded_with: VCR 2.4.0
@@ -0,0 +1,26 @@
1
+ # coding:utf-8
2
+ require 'spec_helper'
3
+ require 'parsecom'
4
+
5
+ describe Parse::Batch, 'when executing a batch request' do
6
+ it 'should be success' do
7
+ VCR.use_cassette 'batch' do
8
+ a1 = ClassA.new 'columnA' => 'hello'
9
+ a2 = ClassA.new 'columnA' => 'world'
10
+ a3 = ClassA.find(:all, :limit =>1).first
11
+ a3.columnA = 'updated!'
12
+ a3_updated_at = a3.updatedAt
13
+ batch = Parse::Batch.new
14
+ batch.add_request do
15
+ a1.save
16
+ a2.save
17
+ a3.save
18
+ end
19
+ batch.run
20
+ a1.parse_object_id.should_not be_nil
21
+ a2.parse_object_id.should_not be_nil
22
+ a3.columnA.should == 'updated!'
23
+ a3.updatedAt.should_not == a3_updated_at
24
+ end
25
+ end
26
+ end
@@ -60,3 +60,24 @@ describe Parse::Object, 'when it creates a new parse object' do
60
60
  end
61
61
  end
62
62
 
63
+ describe Parse::Object, 'when it updates an existing parse object' do
64
+ it 'should increment a field' do
65
+ VCR.use_cassette 'object_increment' do
66
+ class_a = ClassA.find(:all, :limit =>1).first
67
+ val = class_a.columnB || 0
68
+ class_a.columnB = Parse::Op::Increment.new 1
69
+ class_a.save
70
+ class_a.columnB.should == (val + 1)
71
+ end
72
+ end
73
+
74
+ # it 'should add unique objects to an array field' do
75
+ # VCR.use_cassette 'object_add_unique' do
76
+ # class_a = ClassA.find(:all, :limit =>1).first
77
+ # size = class_a.columnF.size
78
+ # class_a.columnF = Parse::Op::AddUnique.new 'flying', 'kungfu'
79
+ # class_a.save
80
+ # class_a.columnF.size.should == (size + 2)
81
+ # end
82
+ # end
83
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parsecom
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-10-12 00:00:00.000000000 Z
12
+ date: 2013-10-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -72,6 +72,8 @@ files:
72
72
  - LICENSE.txt
73
73
  - README.md
74
74
  - Rakefile
75
+ - lib/parse/batch.rb
76
+ - lib/parse/batch_http_client.rb
75
77
  - lib/parse/client.rb
76
78
  - lib/parse/cloud_code.rb
77
79
  - lib/parse/ext/string.rb
@@ -79,6 +81,13 @@ files:
79
81
  - lib/parse/http_client.rb
80
82
  - lib/parse/installation.rb
81
83
  - lib/parse/object.rb
84
+ - lib/parse/op/add.rb
85
+ - lib/parse/op/add_relation.rb
86
+ - lib/parse/op/add_unique.rb
87
+ - lib/parse/op/delete.rb
88
+ - lib/parse/op/increment.rb
89
+ - lib/parse/op/remove.rb
90
+ - lib/parse/op/remove_relation.rb
82
91
  - lib/parse/pointer.rb
83
92
  - lib/parse/query.rb
84
93
  - lib/parse/relation.rb
@@ -87,11 +96,14 @@ files:
87
96
  - lib/parse/version.rb
88
97
  - lib/parsecom.rb
89
98
  - parsecom.gemspec
99
+ - spec/fixtures/vcr_cassettes/batch.yml
90
100
  - spec/fixtures/vcr_cassettes/object_find.yml
101
+ - spec/fixtures/vcr_cassettes/object_increment.yml
91
102
  - spec/fixtures/vcr_cassettes/object_new.yml
92
103
  - spec/fixtures/vcr_cassettes/user_find.yml
93
104
  - spec/fixtures/vcr_cassettes/user_log_in.yml
94
105
  - spec/fixtures/vcr_cassettes/user_sign_up.yml
106
+ - spec/parse_batch_spec.rb
95
107
  - spec/parse_client_spec.rb
96
108
  - spec/parse_object_spec.rb
97
109
  - spec/parse_query_spec.rb
@@ -123,11 +135,14 @@ signing_key:
123
135
  specification_version: 3
124
136
  summary: Pure Ruby version of parse.com client
125
137
  test_files:
138
+ - spec/fixtures/vcr_cassettes/batch.yml
126
139
  - spec/fixtures/vcr_cassettes/object_find.yml
140
+ - spec/fixtures/vcr_cassettes/object_increment.yml
127
141
  - spec/fixtures/vcr_cassettes/object_new.yml
128
142
  - spec/fixtures/vcr_cassettes/user_find.yml
129
143
  - spec/fixtures/vcr_cassettes/user_log_in.yml
130
144
  - spec/fixtures/vcr_cassettes/user_sign_up.yml
145
+ - spec/parse_batch_spec.rb
131
146
  - spec/parse_client_spec.rb
132
147
  - spec/parse_object_spec.rb
133
148
  - spec/parse_query_spec.rb