parse-stack 1.7.3 → 1.9.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/workflows/ruby.yml +36 -0
- data/.solargraph.yml +23 -0
- data/.travis.yml +6 -3
- data/Changes.md +84 -22
- data/Gemfile +14 -12
- data/Gemfile.lock +110 -60
- data/README.md +67 -24
- data/Rakefile +14 -14
- data/bin/parse-console +1 -0
- data/lib/parse/api/aggregate.rb +59 -0
- data/lib/parse/api/all.rb +2 -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 +9 -14
- 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 +55 -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 +19 -24
- data/lib/parse/model/associations/collection_proxy.rb +328 -317
- data/lib/parse/model/associations/has_many.rb +22 -27
- data/lib/parse/model/associations/has_one.rb +7 -12
- data/lib/parse/model/associations/pointer_collection_proxy.rb +5 -13
- 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 +21 -17
- 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 +53 -68
- data/lib/parse/model/core/querying.rb +292 -282
- data/lib/parse/model/core/schema.rb +89 -92
- data/lib/parse/model/date.rb +16 -23
- 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 +58 -70
- 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 +70 -37
- data/lib/parse/query/constraint.rb +4 -6
- data/lib/parse/query/constraints.rb +62 -20
- data/lib/parse/query/operation.rb +8 -11
- data/lib/parse/query/ordering.rb +45 -49
- data/lib/parse/stack.rb +15 -11
- 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 +28 -28
- data/parse-stack.png +0 -0
- metadata +27 -25
- 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
|