parse-stack 1.8.0 → 1.8.1
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.
- checksums.yaml +4 -4
- data/.solargraph.yml +23 -0
- data/.travis.yml +0 -1
- data/Gemfile +13 -12
- data/Gemfile.lock +88 -51
- data/README.md +2 -4
- data/Rakefile +14 -14
- data/lib/parse/api/aggregate.rb +4 -7
- data/lib/parse/api/all.rb +1 -1
- data/lib/parse/api/analytics.rb +0 -3
- data/lib/parse/api/batch.rb +3 -5
- data/lib/parse/api/cloud_functions.rb +0 -3
- data/lib/parse/api/config.rb +0 -4
- data/lib/parse/api/files.rb +3 -7
- data/lib/parse/api/hooks.rb +4 -8
- data/lib/parse/api/objects.rb +7 -12
- data/lib/parse/api/push.rb +0 -4
- data/lib/parse/api/schema.rb +2 -6
- data/lib/parse/api/server.rb +4 -7
- data/lib/parse/api/sessions.rb +2 -5
- data/lib/parse/api/users.rb +9 -14
- data/lib/parse/client.rb +54 -50
- data/lib/parse/client/authentication.rb +29 -33
- data/lib/parse/client/batch.rb +8 -11
- data/lib/parse/client/body_builder.rb +19 -20
- data/lib/parse/client/caching.rb +23 -28
- data/lib/parse/client/protocol.rb +11 -12
- data/lib/parse/client/request.rb +4 -6
- data/lib/parse/client/response.rb +5 -7
- data/lib/parse/model/acl.rb +14 -12
- data/lib/parse/model/associations/belongs_to.rb +14 -21
- data/lib/parse/model/associations/collection_proxy.rb +328 -329
- data/lib/parse/model/associations/has_many.rb +18 -25
- data/lib/parse/model/associations/has_one.rb +6 -11
- data/lib/parse/model/associations/pointer_collection_proxy.rb +5 -8
- data/lib/parse/model/associations/relation_collection_proxy.rb +5 -9
- data/lib/parse/model/bytes.rb +8 -10
- data/lib/parse/model/classes/installation.rb +2 -4
- data/lib/parse/model/classes/product.rb +2 -5
- data/lib/parse/model/classes/role.rb +3 -5
- data/lib/parse/model/classes/session.rb +2 -5
- data/lib/parse/model/classes/user.rb +20 -16
- data/lib/parse/model/core/actions.rb +31 -46
- data/lib/parse/model/core/builder.rb +6 -6
- data/lib/parse/model/core/errors.rb +0 -1
- data/lib/parse/model/core/fetching.rb +45 -50
- data/lib/parse/model/core/properties.rb +51 -66
- data/lib/parse/model/core/querying.rb +291 -294
- data/lib/parse/model/core/schema.rb +89 -92
- data/lib/parse/model/date.rb +16 -17
- data/lib/parse/model/file.rb +171 -174
- data/lib/parse/model/geopoint.rb +12 -16
- data/lib/parse/model/model.rb +31 -37
- data/lib/parse/model/object.rb +47 -53
- data/lib/parse/model/pointer.rb +177 -176
- data/lib/parse/model/push.rb +8 -10
- data/lib/parse/model/shortnames.rb +1 -2
- data/lib/parse/model/time_zone.rb +3 -5
- data/lib/parse/query.rb +34 -35
- data/lib/parse/query/constraint.rb +4 -6
- data/lib/parse/query/constraints.rb +21 -29
- data/lib/parse/query/operation.rb +8 -11
- data/lib/parse/query/ordering.rb +45 -49
- data/lib/parse/stack.rb +11 -12
- data/lib/parse/stack/generators/rails.rb +28 -30
- data/lib/parse/stack/generators/templates/model.erb +5 -6
- data/lib/parse/stack/generators/templates/model_installation.rb +0 -1
- data/lib/parse/stack/generators/templates/model_role.rb +0 -1
- data/lib/parse/stack/generators/templates/model_session.rb +0 -1
- data/lib/parse/stack/generators/templates/model_user.rb +0 -1
- data/lib/parse/stack/generators/templates/parse.rb +9 -9
- data/lib/parse/stack/generators/templates/webhooks.rb +1 -2
- data/lib/parse/stack/railtie.rb +2 -4
- data/lib/parse/stack/tasks.rb +70 -86
- data/lib/parse/stack/version.rb +1 -1
- data/lib/parse/webhooks.rb +19 -26
- data/lib/parse/webhooks/payload.rb +26 -28
- data/lib/parse/webhooks/registration.rb +23 -31
- data/parse-stack.gemspec +25 -25
- data/parse-stack.png +0 -0
- metadata +13 -7
- data/.github/parse-ruby-sdk.png +0 -0
@@ -1,15 +1,14 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
4
|
+
require "faraday"
|
5
|
+
require "faraday_middleware"
|
6
|
+
require "active_support"
|
7
|
+
require "active_support/core_ext"
|
8
8
|
|
9
|
-
require_relative
|
9
|
+
require_relative "protocol"
|
10
10
|
|
11
11
|
module Parse
|
12
|
-
|
13
12
|
module Middleware
|
14
13
|
# This middleware handles sending the proper authentication headers to the
|
15
14
|
# Parse REST API endpoint.
|
@@ -53,38 +52,35 @@ module Parse
|
|
53
52
|
|
54
53
|
# @!visibility private
|
55
54
|
def call!(env)
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
55
|
+
# We add the main Parse protocol headers
|
56
|
+
headers = {}
|
57
|
+
raise ArgumentError, "No Parse Application Id specified for authentication." unless @application_id.present?
|
58
|
+
headers[APP_ID] = @application_id
|
59
|
+
headers[API_KEY] = @api_key unless @api_key.blank?
|
60
|
+
unless @master_key.blank? || env[:request_headers][DISABLE_MASTER_KEY].present?
|
61
|
+
headers[MASTER_KEY] = @master_key
|
62
|
+
end
|
64
63
|
|
65
|
-
|
64
|
+
env[:request_headers].delete(DISABLE_MASTER_KEY)
|
66
65
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
66
|
+
# delete the use of master key if we are using session token.
|
67
|
+
if env[:request_headers].key?(Parse::Protocol::SESSION_TOKEN)
|
68
|
+
headers.delete(MASTER_KEY)
|
69
|
+
end
|
70
|
+
# merge the headers with the current provided headers
|
71
|
+
env[:request_headers].merge! headers
|
72
|
+
# set the content type of the request if it was not provided already.
|
73
|
+
env[:request_headers][CONTENT_TYPE] ||= @content_type
|
74
|
+
# only modify header
|
76
75
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
76
|
+
@app.call(env).on_complete do |response_env|
|
77
|
+
# check for return code raise an error when authentication was a failure
|
78
|
+
# if response_env[:status] == 401
|
79
|
+
# warn "Unauthorized Parse API Credentials for Application Id: #{@application_id}"
|
80
|
+
# end
|
82
81
|
|
83
|
-
|
82
|
+
end
|
84
83
|
end
|
85
|
-
|
86
84
|
end # Authenticator
|
87
|
-
|
88
85
|
end
|
89
|
-
|
90
86
|
end
|
data/lib/parse/client/batch.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
require_relative
|
5
|
-
require_relative
|
6
|
-
|
4
|
+
require_relative "request"
|
5
|
+
require_relative "response"
|
7
6
|
|
8
7
|
module Parse
|
9
8
|
# Create a new batch operation.
|
@@ -44,7 +43,6 @@ module Parse
|
|
44
43
|
# @return [Array] the set of responses from this batch.
|
45
44
|
attr_accessor :requests, :responses
|
46
45
|
|
47
|
-
|
48
46
|
# @return [Parse::Client] the client to be used for the request.
|
49
47
|
def client
|
50
48
|
@client ||= Parse::Client.client
|
@@ -94,7 +92,7 @@ module Parse
|
|
94
92
|
|
95
93
|
# @return [Hash] a formatted payload for the batch request.
|
96
94
|
def as_json(*args)
|
97
|
-
{ requests:
|
95
|
+
{ requests: requests }.as_json
|
98
96
|
end
|
99
97
|
|
100
98
|
# @return [Integer] the number of requests in the batch.
|
@@ -117,7 +115,7 @@ module Parse
|
|
117
115
|
# @return [Boolean] true if the request had an error.
|
118
116
|
def error?
|
119
117
|
return false if @responses.empty?
|
120
|
-
!
|
118
|
+
!success?
|
121
119
|
end
|
122
120
|
|
123
121
|
# Submit the batch operation in chunks until they are all complete. In general,
|
@@ -131,16 +129,15 @@ module Parse
|
|
131
129
|
@responses = []
|
132
130
|
@requests.uniq!(&:signature)
|
133
131
|
@responses = @requests.each_slice(segment).to_a.threaded_map(2) do |slice|
|
134
|
-
|
132
|
+
client.batch_request(BatchOperation.new(slice))
|
135
133
|
end
|
136
134
|
@responses.flatten!
|
137
135
|
#puts "Requests: #{@requests.count} == Response: #{@responses.count}"
|
138
136
|
@requests.zip(@responses).each(&Proc.new) if block_given?
|
139
137
|
@responses
|
140
138
|
end
|
141
|
-
alias_method :save, :submit
|
142
|
-
|
143
139
|
|
140
|
+
alias_method :save, :submit
|
144
141
|
end
|
145
142
|
end
|
146
143
|
|
@@ -164,6 +161,7 @@ class Array
|
|
164
161
|
batch.submit
|
165
162
|
batch
|
166
163
|
end
|
164
|
+
|
167
165
|
# Do not alias method as :delete is already part of array.
|
168
166
|
# alias_method :delete, :destroy
|
169
167
|
|
@@ -204,11 +202,10 @@ class Array
|
|
204
202
|
o = objects[request.tag]
|
205
203
|
next unless o.is_a?(Parse::Object)
|
206
204
|
result = response.result
|
207
|
-
o.id = result[
|
205
|
+
o.id = result["objectId"] if o.id.blank?
|
208
206
|
o.set_attributes!(result)
|
209
207
|
o.clear_changes!
|
210
208
|
end
|
211
209
|
batch
|
212
210
|
end #save!
|
213
|
-
|
214
211
|
end
|
@@ -1,13 +1,13 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require_relative
|
7
|
-
require_relative
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
4
|
+
require "faraday"
|
5
|
+
require "faraday_middleware"
|
6
|
+
require_relative "response"
|
7
|
+
require_relative "protocol"
|
8
|
+
require "active_support"
|
9
|
+
require "active_support/core_ext"
|
10
|
+
require "active_model_serializers"
|
11
11
|
|
12
12
|
module Parse
|
13
13
|
|
@@ -30,7 +30,7 @@ module Parse
|
|
30
30
|
class BodyBuilder < Faraday::Middleware
|
31
31
|
include Parse::Protocol
|
32
32
|
# Header sent when a GET requests exceeds the limit.
|
33
|
-
HTTP_METHOD_OVERRIDE =
|
33
|
+
HTTP_METHOD_OVERRIDE = "X-Http-Method-Override"
|
34
34
|
# Maximum url length for most server requests before HTTP Method Override is used.
|
35
35
|
MAX_URL_LENGTH = 2_000.freeze
|
36
36
|
class << self
|
@@ -53,28 +53,28 @@ module Parse
|
|
53
53
|
# to be POST instead of GET and send the query parameters in the body of the POST request.
|
54
54
|
# The standard maximum POST request (which is a server setting), is usually set to 20MBs
|
55
55
|
if env[:method] == :get && env[:url].to_s.length >= MAX_URL_LENGTH
|
56
|
-
env[:request_headers][HTTP_METHOD_OVERRIDE] =
|
57
|
-
env[:request_headers][CONTENT_TYPE] =
|
56
|
+
env[:request_headers][HTTP_METHOD_OVERRIDE] = "GET"
|
57
|
+
env[:request_headers][CONTENT_TYPE] = "application/x-www-form-urlencoded"
|
58
58
|
# parse-sever looks for method overrides in the body under the `_method` param.
|
59
59
|
# so we will add it to the query string, which will now go into the body.
|
60
60
|
env[:body] = "_method=GET&" + env[:url].query
|
61
61
|
env[:url].query = nil
|
62
62
|
#override
|
63
63
|
env[:method] = :post
|
64
|
-
|
64
|
+
# else if not a get, always make sure the request is JSON encoded if the content type matches
|
65
65
|
elsif env[:request_headers][CONTENT_TYPE] == CONTENT_TYPE_FORMAT &&
|
66
|
-
|
67
|
-
|
66
|
+
(env[:body].is_a?(Hash) || env[:body].is_a?(Array))
|
67
|
+
env[:body] = env[:body].to_json
|
68
68
|
end
|
69
69
|
|
70
70
|
if self.class.logging
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
71
|
+
puts "[Request #{env.method.upcase}] #{env[:url]}"
|
72
|
+
env[:request_headers].each do |k, v|
|
73
|
+
next if k == Parse::Protocol::MASTER_KEY
|
74
|
+
puts "[Header] #{k} : #{v}"
|
75
|
+
end
|
76
76
|
|
77
|
-
|
77
|
+
puts "[Request Body] #{env[:body]}"
|
78
78
|
end
|
79
79
|
@app.call(env).on_complete do |response_env|
|
80
80
|
# on a response, create a new Parse::Response and replace the :body
|
@@ -98,7 +98,6 @@ module Parse
|
|
98
98
|
response_env[:body] = r
|
99
99
|
end
|
100
100
|
end
|
101
|
-
|
102
101
|
end
|
103
102
|
end #Middleware
|
104
103
|
end
|
data/lib/parse/client/caching.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require_relative
|
4
|
+
require "faraday"
|
5
|
+
require "faraday_middleware"
|
6
|
+
require "moneta"
|
7
|
+
require_relative "protocol"
|
8
8
|
|
9
9
|
module Parse
|
10
10
|
module Middleware
|
@@ -28,13 +28,13 @@ module Parse
|
|
28
28
|
# * 410 - 'Gone' - removed
|
29
29
|
CACHEABLE_HTTP_CODES = [200, 203, 300, 301, 302].freeze
|
30
30
|
# Cache control header
|
31
|
-
CACHE_CONTROL =
|
31
|
+
CACHE_CONTROL = "Cache-Control"
|
32
32
|
# Request env key for the content length
|
33
|
-
CONTENT_LENGTH_KEY =
|
33
|
+
CONTENT_LENGTH_KEY = "content-length"
|
34
34
|
# Header in response that is sent if this is a cached result
|
35
|
-
CACHE_RESPONSE_HEADER =
|
35
|
+
CACHE_RESPONSE_HEADER = "X-Cache-Response"
|
36
36
|
# Header in request to set caching information for the middleware.
|
37
|
-
CACHE_EXPIRES_DURATION =
|
37
|
+
CACHE_EXPIRES_DURATION = "X-Parse-Stack-Cache-Expires"
|
38
38
|
|
39
39
|
class << self
|
40
40
|
# @!attribute enabled
|
@@ -46,15 +46,14 @@ module Parse
|
|
46
46
|
attr_accessor :logging
|
47
47
|
|
48
48
|
def enabled
|
49
|
-
|
50
|
-
|
49
|
+
@enabled = true if @enabled.nil?
|
50
|
+
@enabled
|
51
51
|
end
|
52
52
|
|
53
53
|
# @return [Boolean] whether caching is enabled.
|
54
54
|
def caching?
|
55
55
|
@enabled
|
56
56
|
end
|
57
|
-
|
58
57
|
end
|
59
58
|
|
60
59
|
# @!attribute [rw] store
|
@@ -77,14 +76,13 @@ module Parse
|
|
77
76
|
def initialize(adapter, store, opts = {})
|
78
77
|
super(adapter)
|
79
78
|
@store = store
|
80
|
-
@opts = {expires: 0}
|
79
|
+
@opts = { expires: 0 }
|
81
80
|
@opts.merge!(opts) if opts.is_a?(Hash)
|
82
81
|
@expires = @opts[:expires]
|
83
82
|
|
84
83
|
unless [:key?, :[], :delete, :store].all? { |method| @store.respond_to?(method) }
|
85
84
|
raise ArgumentError, "Caching store object must a Moneta key/value store."
|
86
85
|
end
|
87
|
-
|
88
86
|
end
|
89
87
|
|
90
88
|
# Thread-safety
|
@@ -95,7 +93,7 @@ module Parse
|
|
95
93
|
|
96
94
|
# @!visibility private
|
97
95
|
def call!(env)
|
98
|
-
@request_headers =
|
96
|
+
@request_headers = env[:request_headers]
|
99
97
|
|
100
98
|
# get default caching state
|
101
99
|
@enabled = self.class.enabled
|
@@ -151,8 +149,8 @@ module Parse
|
|
151
149
|
end
|
152
150
|
|
153
151
|
if cache_data.present? && body.present?
|
154
|
-
response_headers[CACHE_RESPONSE_HEADER] =
|
155
|
-
response.finish({status: 200, response_headers: response_headers, body: body })
|
152
|
+
response_headers[CACHE_RESPONSE_HEADER] = "true"
|
153
|
+
response.finish({ status: 200, response_headers: response_headers, body: body })
|
156
154
|
return response
|
157
155
|
else
|
158
156
|
@store.delete @cache_key
|
@@ -177,23 +175,20 @@ module Parse
|
|
177
175
|
# Only cache GET requests with valid HTTP status codes whose content-length
|
178
176
|
# is between 20 bytes and 1MB. Otherwise they could be errors, successes and empty result sets.
|
179
177
|
|
180
|
-
if @enabled && method == :get &&
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
178
|
+
if @enabled && method == :get && CACHEABLE_HTTP_CODES.include?(response_env.status) &&
|
179
|
+
response_env.body.present? && response_env.response_headers[CONTENT_LENGTH_KEY].to_i.between?(20, 1_250_000)
|
180
|
+
begin
|
181
|
+
@store.store(@cache_key,
|
182
|
+
{ headers: response_env.response_headers, body: response_env.body },
|
183
|
+
expires: @expires)
|
184
|
+
rescue => e
|
185
|
+
puts "[Parse::Cache] Store Error: #{e}"
|
186
|
+
end
|
189
187
|
end # if
|
190
188
|
# do something with the response
|
191
189
|
# response_env[:response_headers].merge!(...)
|
192
190
|
end
|
193
191
|
end
|
194
|
-
|
195
192
|
end #Caching
|
196
|
-
|
197
193
|
end #Middleware
|
198
|
-
|
199
194
|
end
|
@@ -1,32 +1,31 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
5
4
|
module Parse
|
6
5
|
# Set of Parse protocol constants.
|
7
6
|
module Protocol
|
8
7
|
# The default server url, based on the hosted Parse platform.
|
9
|
-
SERVER_URL
|
8
|
+
SERVER_URL = "http://localhost:1337/parse".freeze
|
10
9
|
# The request header field to send the application Id.
|
11
|
-
APP_ID
|
10
|
+
APP_ID = "X-Parse-Application-Id"
|
12
11
|
# The request header field to send the REST API key.
|
13
|
-
API_KEY
|
12
|
+
API_KEY = "X-Parse-REST-API-Key"
|
14
13
|
# The request header field to send the Master key.
|
15
|
-
MASTER_KEY
|
14
|
+
MASTER_KEY = "X-Parse-Master-Key"
|
16
15
|
# The request header field to send the revocable Session key.
|
17
|
-
SESSION_TOKEN
|
16
|
+
SESSION_TOKEN = "X-Parse-Session-Token"
|
18
17
|
# The request header field to request a revocable session token.
|
19
|
-
REVOCABLE_SESSION =
|
18
|
+
REVOCABLE_SESSION = "X-Parse-Revocable-Session"
|
20
19
|
# The request header field to send the installation id.
|
21
|
-
INSTALLATION_ID
|
20
|
+
INSTALLATION_ID = "Parse-Installation-Id"
|
22
21
|
# The request header field to send an email when authenticating with Parse hosted platform.
|
23
|
-
EMAIL
|
22
|
+
EMAIL = "X-Parse-Email"
|
24
23
|
# The request header field to send the password when authenticating with the Parse hosted platform.
|
25
|
-
PASSWORD
|
24
|
+
PASSWORD = "X-Parse-Password"
|
26
25
|
# The request header field for the Content type.
|
27
|
-
CONTENT_TYPE
|
26
|
+
CONTENT_TYPE = "Content-Type"
|
28
27
|
# The default content type format for sending API requests.
|
29
|
-
CONTENT_TYPE_FORMAT =
|
28
|
+
CONTENT_TYPE_FORMAT = "application/json; charset=utf-8"
|
30
29
|
end
|
31
30
|
|
32
31
|
# All Parse error codes.
|
data/lib/parse/client/request.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
require
|
5
|
-
require
|
4
|
+
require "active_support"
|
5
|
+
require "active_support/json"
|
6
6
|
|
7
7
|
module Parse
|
8
8
|
#This class represents a Parse request.
|
@@ -68,19 +68,17 @@ module Parse
|
|
68
68
|
# Two requests objects are the same if they have the same signature.
|
69
69
|
# @return [Hash] A hash representing this request.
|
70
70
|
def signature
|
71
|
-
{method: @method.upcase, path: @path, body: @body}
|
71
|
+
{ method: @method.upcase, path: @path, body: @body }
|
72
72
|
end
|
73
73
|
|
74
74
|
# @!visibility private
|
75
75
|
def inspect
|
76
|
-
|
76
|
+
"#<#{self.class} @method=#{@method} @path='#{@path}'>"
|
77
77
|
end
|
78
78
|
|
79
79
|
# @return [String]
|
80
80
|
def to_s
|
81
81
|
"#{@method.to_s.upcase} #{@path}"
|
82
82
|
end
|
83
|
-
|
84
83
|
end
|
85
|
-
|
86
84
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
require
|
5
|
-
require
|
4
|
+
require "active_support"
|
5
|
+
require "active_support/json"
|
6
6
|
|
7
7
|
module Parse
|
8
8
|
|
@@ -86,7 +86,6 @@ module Parse
|
|
86
86
|
end
|
87
87
|
#if none match, set pure result
|
88
88
|
@result = res if @result.nil?
|
89
|
-
|
90
89
|
end
|
91
90
|
|
92
91
|
# true if this was a batch response.
|
@@ -98,7 +97,6 @@ module Parse
|
|
98
97
|
# of the ones in the batch.
|
99
98
|
# @return [Array] an array of Response objects.
|
100
99
|
def batch_responses
|
101
|
-
|
102
100
|
return [@result] unless @batch_response
|
103
101
|
# if batch response, generate array based on the response hash.
|
104
102
|
@result.map do |r|
|
@@ -123,8 +121,8 @@ module Parse
|
|
123
121
|
@result = h
|
124
122
|
@count = 1
|
125
123
|
end
|
126
|
-
|
127
124
|
end
|
125
|
+
|
128
126
|
alias_method :parse_results!, :parse_result!
|
129
127
|
|
130
128
|
# true if the response is successful.
|
@@ -136,7 +134,7 @@ module Parse
|
|
136
134
|
# true if the response has an error code.
|
137
135
|
# @see #success?
|
138
136
|
def error?
|
139
|
-
!
|
137
|
+
!success?
|
140
138
|
end
|
141
139
|
|
142
140
|
# true if the response has an error code of 'object not found'
|
@@ -155,6 +153,7 @@ module Parse
|
|
155
153
|
def first
|
156
154
|
@result.is_a?(Array) ? @result.first : @result
|
157
155
|
end
|
156
|
+
|
158
157
|
# Iterate through each result item.
|
159
158
|
# @yieldparam [Object] a result entry.
|
160
159
|
def each
|
@@ -177,6 +176,5 @@ module Parse
|
|
177
176
|
return "[E-#{@code}] #{@request} : #{@error} (#{@http_status})" if error?
|
178
177
|
@result.to_json
|
179
178
|
end
|
180
|
-
|
181
179
|
end
|
182
180
|
end
|