parse-stack 1.4.3 → 1.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Changes.md +52 -39
- data/Gemfile.lock +2 -2
- data/README.md +609 -124
- data/bin/console +0 -9
- data/lib/parse/api/all.rb +3 -0
- data/lib/parse/api/analytics.rb +2 -2
- data/lib/parse/api/apps.rb +15 -17
- data/lib/parse/api/batch.rb +4 -1
- data/lib/parse/api/cloud_functions.rb +2 -0
- data/lib/parse/api/config.rb +14 -2
- data/lib/parse/api/files.rb +6 -3
- data/lib/parse/api/hooks.rb +4 -4
- data/lib/parse/api/objects.rb +14 -11
- data/lib/parse/api/push.rb +4 -2
- data/lib/parse/api/schemas.rb +6 -5
- data/lib/parse/api/sessions.rb +11 -1
- data/lib/parse/api/users.rb +65 -15
- data/lib/parse/client/authentication.rb +4 -2
- data/lib/parse/client/body_builder.rb +11 -3
- data/lib/parse/client/caching.rb +17 -6
- data/lib/parse/client/protocol.rb +14 -8
- data/lib/parse/client/request.rb +4 -1
- data/lib/parse/client/response.rb +59 -6
- data/lib/parse/client.rb +72 -42
- data/lib/parse/model/acl.rb +22 -4
- data/lib/parse/model/associations/belongs_to.rb +22 -10
- data/lib/parse/model/associations/collection_proxy.rb +14 -1
- data/lib/parse/model/associations/has_many.rb +76 -15
- data/lib/parse/model/associations/has_one.rb +69 -0
- data/lib/parse/model/associations/pointer_collection_proxy.rb +13 -6
- data/lib/parse/model/associations/relation_collection_proxy.rb +5 -2
- data/lib/parse/model/bytes.rb +6 -2
- data/lib/parse/model/classes/installation.rb +27 -0
- data/lib/parse/model/classes/role.rb +20 -0
- data/lib/parse/model/classes/session.rb +26 -0
- data/lib/parse/model/classes/user.rb +185 -0
- data/lib/parse/model/core/actions.rb +40 -26
- data/lib/parse/model/core/properties.rb +126 -20
- data/lib/parse/model/core/querying.rb +63 -3
- data/lib/parse/model/core/schema.rb +9 -6
- data/lib/parse/model/date.rb +5 -1
- data/lib/parse/model/file.rb +12 -9
- data/lib/parse/model/geopoint.rb +6 -4
- data/lib/parse/model/model.rb +29 -21
- data/lib/parse/model/object.rb +29 -76
- data/lib/parse/model/pointer.rb +8 -6
- data/lib/parse/model/push.rb +4 -1
- data/lib/parse/query/constraint.rb +3 -0
- data/lib/parse/query/constraints.rb +6 -3
- data/lib/parse/query/operation.rb +3 -0
- data/lib/parse/query/ordering.rb +3 -0
- data/lib/parse/query.rb +85 -38
- data/lib/parse/stack/generators/rails.rb +3 -0
- data/lib/parse/stack/railtie.rb +2 -0
- data/lib/parse/stack/tasks.rb +4 -1
- data/lib/parse/stack/version.rb +4 -1
- data/lib/parse/stack.rb +3 -0
- data/lib/parse/webhooks/payload.rb +14 -8
- data/lib/parse/webhooks/registration.rb +11 -8
- data/lib/parse/webhooks.rb +11 -8
- data/lib/parse-stack.rb +3 -0
- data/parse-stack.gemspec +10 -8
- metadata +16 -4
data/lib/parse/model/object.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
1
4
|
require 'active_model'
|
2
5
|
require 'active_support'
|
3
6
|
require 'active_support/inflector'
|
@@ -21,6 +24,7 @@ require_relative 'core/actions'
|
|
21
24
|
require_relative 'core/querying'
|
22
25
|
require_relative "core/schema"
|
23
26
|
require_relative "core/properties"
|
27
|
+
require_relative "associations/has_one"
|
24
28
|
require_relative "associations/belongs_to"
|
25
29
|
require_relative "associations/has_many"
|
26
30
|
|
@@ -87,16 +91,18 @@ module Parse
|
|
87
91
|
|
88
92
|
class Object < Pointer
|
89
93
|
include Properties
|
94
|
+
include Associations::HasOne
|
90
95
|
include Associations::BelongsTo
|
91
96
|
include Associations::HasMany
|
92
97
|
include Querying
|
93
98
|
include Fetching
|
94
99
|
include Actions
|
95
100
|
include Schema
|
101
|
+
BASE_OBJECT_CLASS = "Parse::Object".freeze # used for comparison
|
96
102
|
|
97
103
|
def __type; Parse::Model::TYPE_OBJECT; end;
|
98
104
|
# These define callbacks
|
99
|
-
define_model_callbacks :save, :destroy
|
105
|
+
define_model_callbacks :create, :save, :destroy, only: [:after, :before]
|
100
106
|
#core attributes. In general these should be treated as read_only, but the
|
101
107
|
# setters are available since we will be decoding objects from Parse. The :acl
|
102
108
|
# type is documented in its own class file.
|
@@ -141,7 +147,7 @@ module Parse
|
|
141
147
|
elsif opts.is_a?(Hash)
|
142
148
|
#if the objectId is provided we will consider the object pristine
|
143
149
|
#and not track dirty items
|
144
|
-
dirty_track = opts[
|
150
|
+
dirty_track = opts[Parse::Model::OBJECT_ID] || opts[:objectId] || opts[:id]
|
145
151
|
apply_attributes!(opts, dirty_track: !dirty_track)
|
146
152
|
end
|
147
153
|
|
@@ -211,6 +217,7 @@ module Parse
|
|
211
217
|
remote_field = self.field_map[key.to_sym] || key
|
212
218
|
h[remote_field] = send key
|
213
219
|
# make an exception to Parse::Objects, we should return a pointer to them instead
|
220
|
+
h[remote_field] = h[remote_field].parse_pointers if h[remote_field].is_a?(Parse::PointerCollectionProxy)
|
214
221
|
h[remote_field] = h[remote_field].pointer if h[remote_field].respond_to?(:pointer)
|
215
222
|
end
|
216
223
|
h
|
@@ -221,10 +228,18 @@ module Parse
|
|
221
228
|
restore_attributes
|
222
229
|
end
|
223
230
|
|
231
|
+
# overrides ActiveModel::Validations validate! instance method
|
232
|
+
# if it fails, it raises ActiveModel::ValidationError
|
233
|
+
# otherwise return self instead of true
|
234
|
+
def validate!
|
235
|
+
super
|
236
|
+
self
|
237
|
+
end
|
238
|
+
|
224
239
|
# Returns a twin copy of the object without the objectId
|
225
240
|
def twin
|
226
241
|
h = self.as_json
|
227
|
-
h.delete(
|
242
|
+
h.delete(Parse::Model::OBJECT_ID)
|
228
243
|
h.delete(:objectId)
|
229
244
|
h.delete(:id)
|
230
245
|
self.class.new h
|
@@ -246,10 +261,11 @@ module Parse
|
|
246
261
|
# will be returned instead.
|
247
262
|
def self.build(json, table = nil)
|
248
263
|
className = table
|
249
|
-
className ||= (json[
|
264
|
+
className ||= (json[Parse::Model::KEY_CLASS_NAME] || json[:className]) if json.is_a?(Hash)
|
250
265
|
if json.is_a?(Hash) && json["error"].present? && json["code"].present?
|
251
266
|
warn "[Parse::Object] Detected object hash with 'error' and 'code' set. : #{json}"
|
252
267
|
end
|
268
|
+
className = parse_class unless parse_class == BASE_OBJECT_CLASS
|
253
269
|
return if className.nil?
|
254
270
|
# we should do a reverse lookup on who is registered for a different class type
|
255
271
|
# than their name with parse_class
|
@@ -260,7 +276,7 @@ module Parse
|
|
260
276
|
# we are considering these objects as "pristine"
|
261
277
|
o = klass.new(json)
|
262
278
|
else
|
263
|
-
o = Parse::Pointer.new className, (json[
|
279
|
+
o = Parse::Pointer.new className, (json[Parse::Model::OBJECT_ID] || json[:objectId])
|
264
280
|
end
|
265
281
|
return o
|
266
282
|
# rescue NameError => e
|
@@ -287,86 +303,17 @@ module Parse
|
|
287
303
|
@updated_at.to_time.utc.iso8601(3) if @updated_at.present?
|
288
304
|
end
|
289
305
|
|
290
|
-
|
291
|
-
|
292
|
-
end
|
293
|
-
|
294
|
-
# The User class provided by Parse with the required fields. You may
|
295
|
-
# add mixings to this class to add the app specific properties
|
296
|
-
class User < Parse::Object
|
297
|
-
parse_class "_User".freeze
|
298
|
-
property :auth_data, :object
|
299
|
-
property :email
|
300
|
-
property :password
|
301
|
-
property :username
|
302
|
-
|
303
|
-
before_save do
|
304
|
-
# You cannot specify user ACLs.
|
305
|
-
self.clear_attribute_change!(:acl)
|
306
|
-
end
|
307
|
-
|
308
|
-
def anonymous?
|
309
|
-
auth_data.present? && auth_data["anonymous"].present?
|
310
|
-
end
|
311
|
-
end
|
312
|
-
|
313
|
-
class Installation < Parse::Object
|
314
|
-
parse_class "_Installation".freeze
|
315
|
-
|
316
|
-
property :gcm_sender_id, :string, field: :GCMSenderId
|
317
|
-
property :app_identifier
|
318
|
-
property :app_name
|
319
|
-
property :app_version
|
320
|
-
property :badge, :integer
|
321
|
-
property :channels, :array
|
322
|
-
property :device_token
|
323
|
-
property :device_token_last_modified, :integer
|
324
|
-
property :device_type
|
325
|
-
property :installation_id
|
326
|
-
property :locale_identifier
|
327
|
-
property :parse_version
|
328
|
-
property :push_type
|
329
|
-
property :time_zone
|
330
|
-
|
331
|
-
end
|
332
|
-
|
333
|
-
class Role < Parse::Object
|
334
|
-
parse_class "_Role".freeze
|
335
|
-
property :name
|
336
|
-
|
337
|
-
has_many :roles, through: :relation
|
338
|
-
has_many :users, through: :relation
|
339
|
-
|
340
|
-
def update_acl
|
341
|
-
acl.everyone true, false
|
342
|
-
end
|
343
|
-
|
344
|
-
before_save do
|
345
|
-
update_acl
|
346
|
-
end
|
347
|
-
end
|
348
|
-
|
349
|
-
class Session < Parse::Object
|
350
|
-
parse_class "_Session".freeze
|
351
|
-
property :created_with, :object
|
352
|
-
property :expires_at, :date
|
353
|
-
property :installation_id
|
354
|
-
property :restricted, :boolean
|
355
|
-
property :session_token
|
356
|
-
|
357
|
-
belongs_to :user
|
358
306
|
end
|
359
307
|
|
360
308
|
end
|
361
309
|
|
362
|
-
|
363
310
|
class Array
|
364
311
|
# This helper method selects all objects in an array that are either inherit from
|
365
312
|
# Parse::Pointer or are a hash. If it is a hash, a Pare::Object will be built from it
|
366
313
|
# if it constains the proper fields. Non convertible objects will be removed
|
367
314
|
# If the className is not contained or known, you can pass a table name as an argument
|
368
315
|
def parse_objects(table = nil)
|
369
|
-
f =
|
316
|
+
f = Parse::Model::KEY_CLASS_NAME
|
370
317
|
map do |m|
|
371
318
|
next m if m.is_a?(Parse::Pointer)
|
372
319
|
if m.is_a?(Hash) && (m[f] || m[:className] || table)
|
@@ -377,7 +324,13 @@ class Array
|
|
377
324
|
end
|
378
325
|
|
379
326
|
def parse_ids
|
380
|
-
parse_objects.map
|
327
|
+
parse_objects.map(&:id)
|
381
328
|
end
|
382
329
|
|
383
330
|
end
|
331
|
+
|
332
|
+
# Load all the core classes.
|
333
|
+
require_relative 'classes/installation'
|
334
|
+
require_relative 'classes/role'
|
335
|
+
require_relative 'classes/session'
|
336
|
+
require_relative 'classes/user'
|
data/lib/parse/model/pointer.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
1
4
|
require 'active_model'
|
2
5
|
require 'active_support'
|
3
6
|
require 'active_support/inflector'
|
@@ -13,10 +16,10 @@ module Parse
|
|
13
16
|
# based on your Parse application tables - however they are used for when a class is found that cannot be
|
14
17
|
# associated with a defined ruby class or used when specifically saving Parse relation types.
|
15
18
|
class Pointer < Model
|
16
|
-
|
19
|
+
ATTRIBUTES = { __type: :string, className: :string, objectId: :string}.freeze
|
17
20
|
attr_accessor :parse_class, :id
|
18
21
|
|
19
|
-
def __type; "Pointer"
|
22
|
+
def __type; "Pointer"; end;
|
20
23
|
alias_method :className, :parse_class
|
21
24
|
# A Parse object as a className field and objectId. In ruby, we will use the
|
22
25
|
# id attribute method, but for usability, we will also alias it to objectId
|
@@ -32,10 +35,9 @@ module Parse
|
|
32
35
|
end
|
33
36
|
|
34
37
|
def attributes
|
35
|
-
|
38
|
+
ATTRIBUTES
|
36
39
|
end
|
37
40
|
|
38
|
-
|
39
41
|
def json_hash
|
40
42
|
JSON.parse to_json
|
41
43
|
end
|
@@ -98,8 +100,8 @@ class Array
|
|
98
100
|
#if its an exact Parse::Pointer
|
99
101
|
if m.is_a?(Parse::Pointer) || m.respond_to?(:pointer)
|
100
102
|
next m.pointer
|
101
|
-
elsif m.is_a?(Hash) && m[
|
102
|
-
next Parse::Pointer.new m[
|
103
|
+
elsif m.is_a?(Hash) && m[Parse::Model::KEY_CLASS_NAME] && m[Parse::Model::OBJECT_ID]
|
104
|
+
next Parse::Pointer.new m[Parse::Model::KEY_CLASS_NAME], m[Parse::Model::OBJECT_ID]
|
103
105
|
elsif m.is_a?(Hash) && m[:className] && m[:objectId]
|
104
106
|
next Parse::Pointer.new m[:className], m[:objectId]
|
105
107
|
end
|
data/lib/parse/model/push.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
1
4
|
require_relative '../query.rb'
|
2
5
|
require_relative '../client.rb'
|
3
6
|
require 'active_model_serializers'
|
@@ -57,7 +60,7 @@ module Parse
|
|
57
60
|
msg = {
|
58
61
|
data: {
|
59
62
|
alert: alert,
|
60
|
-
badge: badge || "Increment"
|
63
|
+
badge: badge || "Increment"
|
61
64
|
}
|
62
65
|
}
|
63
66
|
msg[:data][:sound] = sound if sound.present?
|
@@ -1,3 +1,6 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
1
4
|
require_relative 'constraint'
|
2
5
|
|
3
6
|
# Eac constraint type is a subclass of Parse::Constraint
|
@@ -7,7 +10,7 @@ require_relative 'constraint'
|
|
7
10
|
# For more information: https://parse.com/docs/rest/guide#queries
|
8
11
|
# For more information about the query design pattern from DataMapper
|
9
12
|
# that inspired this, see http://datamapper.org/docs/find.html
|
10
|
-
class ParseConstraintError <
|
13
|
+
class ParseConstraintError < StandardError; end;
|
11
14
|
module Parse
|
12
15
|
|
13
16
|
class ObjectIdConstraint < Constraint
|
@@ -184,14 +187,14 @@ module Parse
|
|
184
187
|
remote_field_name = res[:key] || remote_field_name
|
185
188
|
query = res[:query]
|
186
189
|
unless query.is_a?(Parse::Query)
|
187
|
-
raise "Invalid Parse::Query object provided in :query field of value: #{@operation.operand}.#{$dontSelect} => #{@value}"
|
190
|
+
raise ParseConstraintError, "Invalid Parse::Query object provided in :query field of value: #{@operation.operand}.#{$dontSelect} => #{@value}"
|
188
191
|
end
|
189
192
|
query = query.compile(encode: false, includeClassName: true)
|
190
193
|
elsif @value.is_a?(Parse::Query)
|
191
194
|
# if its a query, then assume dontSelect key is the same name as operand.
|
192
195
|
query = @value.compile(encode: false, includeClassName: true)
|
193
196
|
else
|
194
|
-
raise "Invalid `:select` query constraint. It should follow the format: :field.select => { key: 'key', query: '<Parse::Query>' }"
|
197
|
+
raise ParseConstraintError, "Invalid `:select` query constraint. It should follow the format: :field.select => { key: 'key', query: '<Parse::Query>' }"
|
195
198
|
end
|
196
199
|
{ @operation.operand => { :$select => { key: remote_field_name, query: query } } }
|
197
200
|
end
|
data/lib/parse/query/ordering.rb
CHANGED
data/lib/parse/query.rb
CHANGED
@@ -1,7 +1,11 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
1
4
|
require_relative "client"
|
2
5
|
require_relative "query/operation"
|
3
6
|
require_relative "query/constraints"
|
4
7
|
require_relative "query/ordering"
|
8
|
+
require 'active_model'
|
5
9
|
require 'active_model_serializers'
|
6
10
|
require 'active_support'
|
7
11
|
require 'active_support/inflector'
|
@@ -20,7 +24,10 @@ module Parse
|
|
20
24
|
# constraints - as Parse::Constraint
|
21
25
|
|
22
26
|
class Query
|
27
|
+
extend ::ActiveModel::Callbacks
|
23
28
|
include Parse::Client::Connectable
|
29
|
+
include Enumerable
|
30
|
+
define_model_callbacks :prepare, only: [:after, :before]
|
24
31
|
# A query needs to be tied to a Parse table name (Parse class)
|
25
32
|
# The client object is of type Parse::Client in order to send query requests.
|
26
33
|
# You can modify the default client being used by all Parse::Query objects by setting
|
@@ -87,7 +94,9 @@ module Parse
|
|
87
94
|
end
|
88
95
|
|
89
96
|
def initialize(table, constraints = {})
|
90
|
-
|
97
|
+
table = table.to_s.to_parse_class if table.is_a?(Symbol)
|
98
|
+
table = table.parse_class if table.respond_to?(:parse_class)
|
99
|
+
raise ArgumentError, "First parameter should be the name of the Parse class (table)" unless table.is_a?(String)
|
91
100
|
@count = 0 #non-zero/1 implies a count query request
|
92
101
|
@where = []
|
93
102
|
@order = []
|
@@ -122,13 +131,14 @@ module Parse
|
|
122
131
|
self.use_master_key = value
|
123
132
|
elsif expression == :session
|
124
133
|
# you can pass a session token or a Parse::Session
|
125
|
-
value = value.
|
134
|
+
value = value.respond_to?(:session_token) ? value.session_token : value
|
126
135
|
self.session_token = value
|
127
136
|
else
|
128
137
|
add_constraint(expression, value)
|
129
138
|
end
|
130
139
|
end # each
|
131
|
-
|
140
|
+
self #chaining
|
141
|
+
end; alias_method :query, :conditions
|
132
142
|
|
133
143
|
def table=(t)
|
134
144
|
@table = t.to_s.camelize
|
@@ -186,9 +196,9 @@ module Parse
|
|
186
196
|
end
|
187
197
|
|
188
198
|
def related_to(field, pointer)
|
189
|
-
raise "Object value must be a Parse::Pointer type" unless pointer.is_a?(Parse::Pointer)
|
199
|
+
raise ArgumentError, "Object value must be a Parse::Pointer type" unless pointer.is_a?(Parse::Pointer)
|
190
200
|
add_constraint field.to_sym.related_to, pointer
|
191
|
-
self
|
201
|
+
self #chaining
|
192
202
|
end
|
193
203
|
|
194
204
|
def includes(*fields)
|
@@ -204,9 +214,18 @@ module Parse
|
|
204
214
|
end
|
205
215
|
alias_method :include, :includes
|
206
216
|
|
207
|
-
def
|
217
|
+
def add_constraints(list)
|
218
|
+
list = Array.wrap(list).select { |m| m.is_a?(Parse::Constraint) }
|
219
|
+
@where = @where + list
|
220
|
+
self
|
221
|
+
end
|
222
|
+
|
223
|
+
def add_constraint(operator, value = nil, **opts)
|
208
224
|
@where ||= []
|
209
|
-
constraint = Parse::Constraint
|
225
|
+
constraint = operator # assume Parse::Constraint
|
226
|
+
unless constraint.is_a?(Parse::Constraint)
|
227
|
+
constraint = Parse::Constraint.create(operator, value)
|
228
|
+
end
|
210
229
|
return unless constraint.is_a?(Parse::Constraint)
|
211
230
|
# to support select queries where you have to pass a `key` parameter for matching
|
212
231
|
# different tables.
|
@@ -222,7 +241,10 @@ module Parse
|
|
222
241
|
@results = nil
|
223
242
|
self #chaining
|
224
243
|
end
|
225
|
-
|
244
|
+
|
245
|
+
def constraints
|
246
|
+
@where
|
247
|
+
end
|
226
248
|
|
227
249
|
def where(conditions = nil, opts = {})
|
228
250
|
return @where if conditions.nil?
|
@@ -231,7 +253,7 @@ module Parse
|
|
231
253
|
add_constraint(operator, value, opts)
|
232
254
|
end
|
233
255
|
end
|
234
|
-
self
|
256
|
+
self #chaining
|
235
257
|
end
|
236
258
|
|
237
259
|
def or_where(where_clauses = [])
|
@@ -256,17 +278,16 @@ module Parse
|
|
256
278
|
end
|
257
279
|
|
258
280
|
def |(other_query)
|
259
|
-
raise "Parse queries must be of the same class #{@table}." unless @table == other_query.table
|
281
|
+
raise ArgumentError, "Parse queries must be of the same class #{@table}." unless @table == other_query.table
|
260
282
|
copy_query = self.clone
|
261
283
|
copy_query.or_where other_query.where
|
262
284
|
copy_query
|
263
285
|
end
|
264
286
|
|
265
287
|
def count
|
266
|
-
@results = nil
|
267
288
|
old_value = @count
|
268
289
|
@count = 1
|
269
|
-
res = client.find_objects(@table, compile.as_json ).count
|
290
|
+
res = client.find_objects(@table, compile.as_json, _opts ).count
|
270
291
|
@count = old_value
|
271
292
|
res
|
272
293
|
end
|
@@ -276,8 +297,27 @@ module Parse
|
|
276
297
|
results.each(&Proc.new)
|
277
298
|
end
|
278
299
|
|
300
|
+
def map
|
301
|
+
return results.enum_for(:map) unless block_given? # Sparkling magic!
|
302
|
+
results.map(&Proc.new)
|
303
|
+
end
|
304
|
+
|
305
|
+
def select
|
306
|
+
return results.enum_for(:select) unless block_given? # Sparkling magic!
|
307
|
+
results.select(&Proc.new)
|
308
|
+
end
|
309
|
+
|
310
|
+
def to_a
|
311
|
+
results.to_a
|
312
|
+
end
|
313
|
+
|
314
|
+
def select
|
315
|
+
return results.enum_for(:select) unless block_given? # Sparkling magic!
|
316
|
+
results.select(&Proc.new)
|
317
|
+
end
|
318
|
+
|
279
319
|
def first(limit = 1)
|
280
|
-
@results = nil
|
320
|
+
@results = nil if @limit != limit
|
281
321
|
@limit = limit
|
282
322
|
limit == 1 ? results.first : results.first(limit)
|
283
323
|
end
|
@@ -313,22 +353,27 @@ module Parse
|
|
313
353
|
results
|
314
354
|
end
|
315
355
|
|
316
|
-
def
|
356
|
+
def _opts
|
317
357
|
opts = {}
|
318
358
|
opts[:cache] = self.cache || false
|
319
359
|
opts[:use_master_key] = self.use_master_key
|
320
360
|
opts[:session_token] = self.session_token
|
321
361
|
# for now, don't cache requests where we disable master_key or provide session token
|
322
|
-
if opts[:use_master_key] == false || opts[:session_token].present?
|
323
|
-
|
324
|
-
end
|
362
|
+
# if opts[:use_master_key] == false || opts[:session_token].present?
|
363
|
+
# opts[:cache] = false
|
364
|
+
# end
|
365
|
+
opts
|
366
|
+
end
|
367
|
+
|
368
|
+
def fetch!(compiled_query)
|
325
369
|
|
326
|
-
response = client.find_objects(@table, compiled_query.as_json,
|
370
|
+
response = client.find_objects(@table, compiled_query.as_json, _opts )
|
327
371
|
if response.error?
|
328
372
|
puts "[ParseQuery] #{response.error}"
|
329
373
|
end
|
330
374
|
response
|
331
375
|
end
|
376
|
+
alias_method :execute!, :fetch!
|
332
377
|
|
333
378
|
def results(raw: false)
|
334
379
|
if @results.nil?
|
@@ -361,28 +406,30 @@ module Parse
|
|
361
406
|
end
|
362
407
|
|
363
408
|
def compile(encode: true, includeClassName: false)
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
409
|
+
run_callbacks :prepare do
|
410
|
+
q = {} #query
|
411
|
+
q[:limit] = 11_000 if @limit == :max || @limit == :all
|
412
|
+
q[:limit] = @limit if @limit.is_a?(Numeric) && @limit > 0
|
413
|
+
q[:skip] = @skip if @skip > 0
|
414
|
+
|
415
|
+
q[:include] = @includes.join(',') unless @includes.empty?
|
416
|
+
q[:keys] = @keys.join(',') unless @keys.empty?
|
417
|
+
q[:order] = @order.join(',') unless @order.empty?
|
418
|
+
unless @where.empty?
|
419
|
+
q[:where] = Parse::Query.compile_where(@where)
|
420
|
+
q[:where] = q[:where].to_json if encode
|
421
|
+
end
|
376
422
|
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
423
|
+
if @count && @count > 0
|
424
|
+
# if count is requested
|
425
|
+
q[:limit] = 0
|
426
|
+
q[:count] = 1
|
427
|
+
end
|
428
|
+
if includeClassName
|
429
|
+
q[:className] = @table
|
430
|
+
end
|
431
|
+
q
|
384
432
|
end
|
385
|
-
q
|
386
433
|
end
|
387
434
|
|
388
435
|
def compile_where
|
data/lib/parse/stack/railtie.rb
CHANGED
data/lib/parse/stack/tasks.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
1
4
|
require_relative '../stack.rb'
|
2
5
|
require 'active_support'
|
3
6
|
require 'active_support/inflector'
|
@@ -44,7 +47,7 @@ module Parse
|
|
44
47
|
|
45
48
|
task :verify_env => :env do
|
46
49
|
|
47
|
-
unless Parse::Client.
|
50
|
+
unless Parse::Client.client?
|
48
51
|
raise "Please make sure you have setup the Parse.setup configuration before invoking task. Usually done in the :environment task."
|
49
52
|
end
|
50
53
|
|
data/lib/parse/stack/version.rb
CHANGED
data/lib/parse/stack.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
1
4
|
require 'active_model'
|
2
5
|
require 'active_support'
|
3
6
|
require 'active_support/inflector'
|
@@ -9,6 +12,11 @@ require 'active_model_serializers'
|
|
9
12
|
module Parse
|
10
13
|
|
11
14
|
class Payload
|
15
|
+
ATTRIBUTES = { master: nil, user: nil,
|
16
|
+
installationId: nil, params: nil,
|
17
|
+
functionName: nil, object: nil,
|
18
|
+
original: nil, update: nil,
|
19
|
+
triggerName: nil }.freeze
|
12
20
|
include ::ActiveModel::Serializers::JSON
|
13
21
|
attr_accessor :master, :user, :installation_id, :params, :function_name, :object, :trigger_name
|
14
22
|
|
@@ -32,18 +40,22 @@ module Parse
|
|
32
40
|
@update = hash[:update] || {} #it comes as an update hash
|
33
41
|
end
|
34
42
|
|
43
|
+
def attributes
|
44
|
+
ATTRIBUTES
|
45
|
+
end
|
46
|
+
|
35
47
|
def function?
|
36
48
|
@function_name.present?
|
37
49
|
end
|
38
50
|
|
39
51
|
def parse_class
|
40
52
|
return nil unless @object.present?
|
41
|
-
@object[
|
53
|
+
@object[Parse::Model::KEY_CLASS_NAME] || @object[:className]
|
42
54
|
end
|
43
55
|
|
44
56
|
def parse_id
|
45
57
|
return nil unless @object.present?
|
46
|
-
@object[
|
58
|
+
@object[Parse::Model::OBJECT_ID] || @object[:objectId]
|
47
59
|
end; alias_method :objectId, :parse_id
|
48
60
|
|
49
61
|
def trigger?
|
@@ -117,12 +129,6 @@ module Parse
|
|
117
129
|
Parse::Object.build(@object)
|
118
130
|
end
|
119
131
|
|
120
|
-
|
121
|
-
def attributes
|
122
|
-
{ master: nil, user: nil, installationId: nil, params: nil,
|
123
|
-
functionName: nil, object: nil, original: nil, update: nil, triggerName: nil }.freeze
|
124
|
-
end
|
125
|
-
|
126
132
|
end # Payload
|
127
133
|
|
128
134
|
end
|