parse-stack 1.7.3 → 1.9.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.
Files changed (85) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/ruby.yml +36 -0
  3. data/.solargraph.yml +23 -0
  4. data/.travis.yml +6 -3
  5. data/Changes.md +84 -22
  6. data/Gemfile +14 -12
  7. data/Gemfile.lock +110 -60
  8. data/README.md +67 -24
  9. data/Rakefile +14 -14
  10. data/bin/parse-console +1 -0
  11. data/lib/parse/api/aggregate.rb +59 -0
  12. data/lib/parse/api/all.rb +2 -1
  13. data/lib/parse/api/analytics.rb +0 -3
  14. data/lib/parse/api/batch.rb +3 -5
  15. data/lib/parse/api/cloud_functions.rb +0 -3
  16. data/lib/parse/api/config.rb +0 -4
  17. data/lib/parse/api/files.rb +3 -7
  18. data/lib/parse/api/hooks.rb +4 -8
  19. data/lib/parse/api/objects.rb +9 -14
  20. data/lib/parse/api/push.rb +0 -4
  21. data/lib/parse/api/schema.rb +2 -6
  22. data/lib/parse/api/server.rb +4 -7
  23. data/lib/parse/api/sessions.rb +2 -5
  24. data/lib/parse/api/users.rb +9 -14
  25. data/lib/parse/client.rb +55 -50
  26. data/lib/parse/client/authentication.rb +29 -33
  27. data/lib/parse/client/batch.rb +8 -11
  28. data/lib/parse/client/body_builder.rb +19 -20
  29. data/lib/parse/client/caching.rb +23 -28
  30. data/lib/parse/client/protocol.rb +11 -12
  31. data/lib/parse/client/request.rb +4 -6
  32. data/lib/parse/client/response.rb +5 -7
  33. data/lib/parse/model/acl.rb +14 -12
  34. data/lib/parse/model/associations/belongs_to.rb +19 -24
  35. data/lib/parse/model/associations/collection_proxy.rb +328 -317
  36. data/lib/parse/model/associations/has_many.rb +22 -27
  37. data/lib/parse/model/associations/has_one.rb +7 -12
  38. data/lib/parse/model/associations/pointer_collection_proxy.rb +5 -13
  39. data/lib/parse/model/associations/relation_collection_proxy.rb +5 -9
  40. data/lib/parse/model/bytes.rb +8 -10
  41. data/lib/parse/model/classes/installation.rb +2 -4
  42. data/lib/parse/model/classes/product.rb +2 -5
  43. data/lib/parse/model/classes/role.rb +3 -5
  44. data/lib/parse/model/classes/session.rb +2 -5
  45. data/lib/parse/model/classes/user.rb +21 -17
  46. data/lib/parse/model/core/actions.rb +31 -46
  47. data/lib/parse/model/core/builder.rb +6 -6
  48. data/lib/parse/model/core/errors.rb +0 -1
  49. data/lib/parse/model/core/fetching.rb +45 -50
  50. data/lib/parse/model/core/properties.rb +53 -68
  51. data/lib/parse/model/core/querying.rb +292 -282
  52. data/lib/parse/model/core/schema.rb +89 -92
  53. data/lib/parse/model/date.rb +16 -23
  54. data/lib/parse/model/file.rb +171 -174
  55. data/lib/parse/model/geopoint.rb +12 -16
  56. data/lib/parse/model/model.rb +31 -37
  57. data/lib/parse/model/object.rb +58 -70
  58. data/lib/parse/model/pointer.rb +177 -176
  59. data/lib/parse/model/push.rb +8 -10
  60. data/lib/parse/model/shortnames.rb +1 -2
  61. data/lib/parse/model/time_zone.rb +3 -5
  62. data/lib/parse/query.rb +70 -37
  63. data/lib/parse/query/constraint.rb +4 -6
  64. data/lib/parse/query/constraints.rb +62 -20
  65. data/lib/parse/query/operation.rb +8 -11
  66. data/lib/parse/query/ordering.rb +45 -49
  67. data/lib/parse/stack.rb +15 -11
  68. data/lib/parse/stack/generators/rails.rb +28 -30
  69. data/lib/parse/stack/generators/templates/model.erb +5 -6
  70. data/lib/parse/stack/generators/templates/model_installation.rb +0 -1
  71. data/lib/parse/stack/generators/templates/model_role.rb +0 -1
  72. data/lib/parse/stack/generators/templates/model_session.rb +0 -1
  73. data/lib/parse/stack/generators/templates/model_user.rb +0 -1
  74. data/lib/parse/stack/generators/templates/parse.rb +9 -9
  75. data/lib/parse/stack/generators/templates/webhooks.rb +1 -2
  76. data/lib/parse/stack/railtie.rb +2 -4
  77. data/lib/parse/stack/tasks.rb +70 -86
  78. data/lib/parse/stack/version.rb +1 -1
  79. data/lib/parse/webhooks.rb +19 -26
  80. data/lib/parse/webhooks/payload.rb +26 -28
  81. data/lib/parse/webhooks/registration.rb +23 -31
  82. data/parse-stack.gemspec +28 -28
  83. data/parse-stack.png +0 -0
  84. metadata +27 -25
  85. data/.github/parse-ruby-sdk.png +0 -0
@@ -24,7 +24,7 @@ module Parse
24
24
  #
25
25
  class GeoPoint < Model
26
26
  # The default attributes in a Parse GeoPoint hash.
27
- ATTRIBUTES = { __type: :string, latitude: :float, longitude: :float }.freeze
27
+ ATTRIBUTES = { __type: :string, latitude: :float, longitude: :float }.freeze
28
28
 
29
29
  # @return [Float] latitude value between -90.0 and 90.0
30
30
  attr_accessor :latitude
@@ -47,9 +47,10 @@ module Parse
47
47
  alias_method :lat, :latitude
48
48
  alias_method :lng, :longitude
49
49
  # @return [Model::TYPE_GEOPOINT]
50
- def self.parse_class; TYPE_GEOPOINT; end;
50
+ def self.parse_class; TYPE_GEOPOINT; end
51
51
  # @return [Model::TYPE_GEOPOINT]
52
- def parse_class; self.class.parse_class; end;
52
+ def parse_class; self.class.parse_class; end
53
+
53
54
  alias_method :__type, :parse_class
54
55
 
55
56
  # The initializer can create a GeoPoint with a hash, array or values.
@@ -77,7 +78,6 @@ module Parse
77
78
 
78
79
  # @!visibility private
79
80
  def _validate_point
80
-
81
81
  unless @latitude.nil? || @latitude.between?(LAT_MIN, LAT_MAX)
82
82
  warn "[Parse::GeoPoint] Latitude (#{@latitude}) is not between #{LAT_MIN}, #{LAT_MAX}!"
83
83
  warn "Attempting to use GeoPoint’s with latitudes outside these ranges will raise an exception in a future release."
@@ -87,7 +87,6 @@ module Parse
87
87
  warn "[Parse::GeoPoint] Longitude (#{@longitude}) is not between #{LNG_MIN}, #{LNG_MAX}!"
88
88
  warn "Attempting to use GeoPoint’s with longitude outside these ranges will raise an exception in a future release."
89
89
  end
90
-
91
90
  end
92
91
 
93
92
  # @return [Hash] attributes for a Parse GeoPoint.
@@ -99,7 +98,7 @@ module Parse
99
98
  # @return [Array] containing [lat,lng,miles]
100
99
  def max_miles(m)
101
100
  m = 0 if m.nil?
102
- [@latitude,@longitude,m]
101
+ [@latitude, @longitude, m]
103
102
  end
104
103
 
105
104
  def latitude=(l)
@@ -118,7 +117,7 @@ module Parse
118
117
  if h.is_a?(Hash)
119
118
  h = h.symbolize_keys
120
119
  @latitude = h[:latitude].to_f || h[:lat].to_f || @latitude
121
- @longitude = h[:longitude].to_f || h[:lng].to_f || @longitude
120
+ @longitude = h[:longitude].to_f || h[:lng].to_f || @longitude
122
121
  elsif h.is_a?(Array) && h.count == 2
123
122
  @latitude = h.first.to_f
124
123
  @longitude = h.last.to_f
@@ -142,7 +141,7 @@ module Parse
142
141
  # Returns a tuple containing latitude and longitude
143
142
  # @return [Array]
144
143
  def to_a
145
- [@latitude,@longitude]
144
+ [@latitude, @longitude]
146
145
  end
147
146
 
148
147
  # @!visibility private
@@ -161,7 +160,7 @@ module Parse
161
160
  # is longitude instead of a GeoPoint.
162
161
  # @return [Float] number of miles between geopoints.
163
162
  # @see #distance_in_km
164
- def distance_in_miles(geopoint,lng = nil)
163
+ def distance_in_miles(geopoint, lng = nil)
165
164
  distance_in_km(geopoint, lng) * 0.621371
166
165
  end
167
166
 
@@ -175,12 +174,12 @@ module Parse
175
174
  # @param lng [Float] Longitude assuming that the first parameter is a latitude instead of a GeoPoint.
176
175
  # @return [Float] number of miles between geopoints.
177
176
  # @see #distance_in_miles
178
- def distance_in_km(geopoint,lng = nil)
177
+ def distance_in_km(geopoint, lng = nil)
179
178
  unless geopoint.is_a?(Parse::GeoPoint)
180
179
  geopoint = Parse::GeoPoint.new(geopoint, lng)
181
180
  end
182
181
 
183
- dtor = Math::PI/180
182
+ dtor = Math::PI / 180
184
183
  r = 6378.14
185
184
  r_lat1 = self.latitude * dtor
186
185
  r_lng1 = self.longitude * dtor
@@ -190,13 +189,10 @@ module Parse
190
189
  delta_lat = r_lat1 - r_lat2
191
190
  delta_lng = r_lng1 - r_lng2
192
191
 
193
- a = (Math::sin(delta_lat/2.0) ** 2).to_f + (Math::cos(r_lat1) * Math::cos(r_lat2) * ( Math::sin(delta_lng/2.0) ** 2 ) )
194
- c = 2.0 * Math::atan2(Math::sqrt(a), Math::sqrt(1.0-a))
192
+ a = (Math::sin(delta_lat / 2.0) ** 2).to_f + (Math::cos(r_lat1) * Math::cos(r_lat2) * (Math::sin(delta_lng / 2.0) ** 2))
193
+ c = 2.0 * Math::atan2(Math::sqrt(a), Math::sqrt(1.0 - a))
195
194
  d = r * c
196
195
  d
197
196
  end
198
-
199
-
200
197
  end
201
-
202
198
  end
@@ -1,12 +1,12 @@
1
1
  # encoding: UTF-8
2
2
  # frozen_string_literal: true
3
3
 
4
- require 'active_model'
5
- require 'active_support'
6
- require 'active_support/inflector'
7
- require 'active_support/core_ext/object'
8
- require 'active_model_serializers'
9
- require_relative '../client'
4
+ require "active_model"
5
+ require "active_support"
6
+ require "active_support/inflector"
7
+ require "active_support/core_ext/object"
8
+ require "active_model_serializers"
9
+ require_relative "../client"
10
10
 
11
11
  module Parse
12
12
  # Find a corresponding Parse::Object subclass for this string or symbol
@@ -21,61 +21,59 @@ module Parse
21
21
  # serialization, dirty tracking, callbacks, etc.
22
22
  # @see ActiveModel
23
23
  class Model
24
-
25
24
  include Client::Connectable # allows easy default Parse::Client access
26
25
  include ::ActiveModel::Model
27
26
  include ::ActiveModel::Serializers::JSON # support for JSON Serializers
28
27
  include ::ActiveModel::Dirty # adds dirty tracking support
29
28
  include ::ActiveModel::Conversion
30
- extend ::ActiveModel::Callbacks # callback support on save, update, delete, etc.
31
- extend ::ActiveModel::Naming # provides the methods for getting class names from Model classes
29
+ extend ::ActiveModel::Callbacks # callback support on save, update, delete, etc.
30
+ extend ::ActiveModel::Naming # provides the methods for getting class names from Model classes
32
31
 
33
32
  # The name of the field in a hash that contains information about the type
34
33
  # of data the hash represents.
35
- TYPE_FIELD = '__type'.freeze
34
+ TYPE_FIELD = "__type".freeze
36
35
 
37
36
  # The objectId field in Parse Objects.
38
- OBJECT_ID = 'objectId'.freeze
37
+ OBJECT_ID = "objectId".freeze
39
38
  # @see OBJECT_ID
40
39
  ID = "id".freeze
41
40
 
42
41
  # The key field for getting class information.
43
- KEY_CLASS_NAME = 'className'.freeze
42
+ KEY_CLASS_NAME = "className".freeze
44
43
  # @deprecated Use OBJECT_ID instead.
45
- KEY_OBJECT_ID = 'objectId'.freeze
44
+ KEY_OBJECT_ID = "objectId".freeze
46
45
  # The key field for getting the created at date of an object hash.
47
- KEY_CREATED_AT = 'createdAt'
46
+ KEY_CREATED_AT = "createdAt"
48
47
  # The key field for getting the updated at date of an object hash.
49
- KEY_UPDATED_AT = 'updatedAt'
48
+ KEY_UPDATED_AT = "updatedAt"
50
49
  # The collection for Users in Parse. Used by Parse::User.
51
- CLASS_USER = '_User'
50
+ CLASS_USER = "_User"
52
51
  # The collection for Installations in Parse. Used by Parse::Installation.
53
- CLASS_INSTALLATION = '_Installation'
52
+ CLASS_INSTALLATION = "_Installation"
54
53
  # The collection for revocable Sessions in Parse. Used by Parse::Session.
55
- CLASS_SESSION = '_Session'
54
+ CLASS_SESSION = "_Session"
56
55
  # The collection for Roles in Parse. Used by Parse::Role.
57
- CLASS_ROLE = '_Role'
56
+ CLASS_ROLE = "_Role"
58
57
  # The collection for to store Products (in-App purchases) in Parse. Used by Parse::Product.
59
- CLASS_PRODUCT = '_Product'
58
+ CLASS_PRODUCT = "_Product"
60
59
  # The type label for hashes containing file data. Used by Parse::File.
61
- TYPE_FILE = 'File'
60
+ TYPE_FILE = "File"
62
61
  # The type label for hashes containing geopoints. Used by Parse::GeoPoint.
63
- TYPE_GEOPOINT = 'GeoPoint'
62
+ TYPE_GEOPOINT = "GeoPoint"
64
63
  # The type label for hashes containing a Parse object. Used by Parse::Object and subclasses.
65
- TYPE_OBJECT = 'Object'
64
+ TYPE_OBJECT = "Object"
66
65
  # The type label for hashes containing a Parse date object. Used by Parse::Date.
67
- TYPE_DATE = 'Date'
66
+ TYPE_DATE = "Date"
68
67
  # The type label for hashes containing 'byte' data. Used by Parse::Bytes.
69
- TYPE_BYTES = 'Bytes'
68
+ TYPE_BYTES = "Bytes"
70
69
  # The type label for hashes containing ACL data. Used by Parse::ACL
71
- TYPE_ACL = 'ACL'
70
+ TYPE_ACL = "ACL"
72
71
  # The type label for hashes storing numeric data.
73
- TYPE_NUMBER = 'Number'
72
+ TYPE_NUMBER = "Number"
74
73
  # The type label for hashes containing a Parse pointer.
75
- TYPE_POINTER = 'Pointer'
74
+ TYPE_POINTER = "Pointer"
76
75
  # The type label for hashes representing relational data.
77
- TYPE_RELATION = 'Relation'
78
-
76
+ TYPE_RELATION = "Relation"
79
77
 
80
78
  # To support being able to have different ruby class names from the 'table'
81
79
  # names used in Parse, we will need to have a dynamic lookup system where
@@ -115,7 +113,6 @@ module Parse
115
113
  def raise_on_save_failure=(bool)
116
114
  @global_raise_on_save_failure = bool
117
115
  end
118
-
119
116
  end
120
117
 
121
118
  # Find a Parse::Model subclass matching this type or Pares collection name.
@@ -149,11 +146,8 @@ module Parse
149
146
  @@model_cache[str] ||= Parse::Object.descendants.find do |f|
150
147
  f.parse_class == str || f.parse_class == "_#{str}"
151
148
  end
152
-
153
149
  end
154
-
155
150
  end
156
-
157
151
  end
158
152
 
159
153
  # Add extensions to the String class.
@@ -172,9 +166,9 @@ class String
172
166
  # @return [String]
173
167
  # @see Parse::Query.field_formatter
174
168
  def columnize
175
- return Parse::Model::OBJECT_ID if self == Parse::Model::ID
176
- u = '_'.freeze
177
- (first == u ? sub(u,'') : self).camelize(:lower)
169
+ return Parse::Model::OBJECT_ID if self == Parse::Model::ID
170
+ u = "_".freeze
171
+ (first == u ? sub(u, "") : self).camelize(:lower)
178
172
  end
179
173
 
180
174
  # Convert a string to a Parse class name. This method tries to find a
@@ -1,42 +1,41 @@
1
1
  # encoding: UTF-8
2
2
  # frozen_string_literal: true
3
3
 
4
- require 'active_model'
5
- require 'active_support'
6
- require 'active_support/inflector'
7
- require 'active_support/core_ext'
8
- require 'active_support/core_ext/object'
9
- require 'active_support/core_ext/string'
10
- require 'active_model_serializers'
11
- require 'time'
12
- require 'open-uri'
13
-
14
- require_relative '../client'
15
- require_relative 'model'
16
- require_relative 'pointer'
17
- require_relative 'geopoint'
18
- require_relative 'file'
19
- require_relative 'bytes'
20
- require_relative 'date'
21
- require_relative 'time_zone'
22
- require_relative 'acl'
23
- require_relative 'push'
24
- require_relative 'core/actions'
25
- require_relative 'core/fetching'
26
- require_relative 'core/querying'
27
- require_relative 'core/schema'
28
- require_relative 'core/properties'
29
- require_relative 'core/errors'
30
- require_relative 'core/builder'
31
- require_relative 'associations/has_one'
32
- require_relative 'associations/belongs_to'
33
- require_relative 'associations/has_many'
34
-
4
+ require "active_model"
5
+ require "active_support"
6
+ require "active_support/inflector"
7
+ require "active_support/core_ext"
8
+ require "active_support/core_ext/object"
9
+ require "active_support/core_ext/string"
10
+ require "active_model_serializers"
11
+ require "time"
12
+ require "open-uri"
13
+
14
+ require_relative "../client"
15
+ require_relative "model"
16
+ require_relative "pointer"
17
+ require_relative "geopoint"
18
+ require_relative "file"
19
+ require_relative "bytes"
20
+ require_relative "date"
21
+ require_relative "time_zone"
22
+ require_relative "acl"
23
+ require_relative "push"
24
+ require_relative "core/actions"
25
+ require_relative "core/fetching"
26
+ require_relative "core/querying"
27
+ require_relative "core/schema"
28
+ require_relative "core/properties"
29
+ require_relative "core/errors"
30
+ require_relative "core/builder"
31
+ require_relative "associations/has_one"
32
+ require_relative "associations/belongs_to"
33
+ require_relative "associations/has_many"
35
34
 
36
35
  module Parse
37
36
  # @return [Array] an array of registered Parse::Object subclasses.
38
37
  def self.registered_classes
39
- Parse::Object.descendants.map(&:parse_class).uniq
38
+ Parse::Object.descendants.map(&:parse_class).uniq
40
39
  end
41
40
 
42
41
  # @return [Array<Hash>] the list of all schemas for this application.
@@ -65,7 +64,7 @@ module Parse
65
64
  # Alias shorter names of core Parse class names.
66
65
  # Ex, alias Parse::User to User, Parse::Installation to Installation, etc.
67
66
  def self.use_shortnames!
68
- require_relative 'shortnames'
67
+ require_relative "shortnames"
69
68
  end
70
69
 
71
70
  # This is the core class for all app specific Parse table subclasses. This class
@@ -139,7 +138,7 @@ module Parse
139
138
  BASE_OBJECT_CLASS = "Parse::Object".freeze
140
139
 
141
140
  # @return [Model::TYPE_OBJECT]
142
- def __type; Parse::Model::TYPE_OBJECT; end;
141
+ def __type; Parse::Model::TYPE_OBJECT; end
143
142
 
144
143
  # Default ActiveModel::Callbacks
145
144
  # @!group Callbacks
@@ -183,13 +182,8 @@ module Parse
183
182
  # the remote Parse table is named 'Artist'. You may override this behavior by utilizing the `parse_class(<className>)` method
184
183
  # to set it to something different.
185
184
  class << self
186
-
187
- attr_accessor :disable_serialized_string_date, :parse_class
185
+ attr_accessor :parse_class
188
186
  attr_reader :default_acls
189
- # @!attribute disable_serialized_string_date
190
- # Disables returning a serialized string date properties when encoding to JSON.
191
- # This affects created_at and updated_at fields in order to be backwards compatible with old SDKs.
192
- # @return [Boolean] the disabled status of whether string dates should be serialized.
193
187
 
194
188
  # The class method to override the implicitly assumed Parse collection name
195
189
  # in your Parse database. The default Parse collection name is the singular form
@@ -257,7 +251,6 @@ module Parse
257
251
  def acl(acls, owner: nil)
258
252
  raise "[#{self}.acl DEPRECATED] - Use `#{self}.default_acl` instead."
259
253
  end
260
-
261
254
  end # << self
262
255
 
263
256
  # @return [String] the Parse class for this object.
@@ -265,6 +258,7 @@ module Parse
265
258
  def parse_class
266
259
  self.class.parse_class
267
260
  end
261
+
268
262
  alias_method :className, :parse_class
269
263
 
270
264
  # @return [Hash] the schema structure for this Parse collection from the server.
@@ -351,7 +345,7 @@ module Parse
351
345
  # @param opts [Hash] a set of options to send to fetch!
352
346
  # @see Fetching#fetch!
353
347
  def reload!(opts = {})
354
- # get the values from the persistence layer
348
+ # get the values from the persistence layer
355
349
  fetch!(opts)
356
350
  clear_changes!
357
351
  end
@@ -440,7 +434,7 @@ module Parse
440
434
  # @return [String] a pretty-formatted JSON string
441
435
  # @see JSON.pretty_generate
442
436
  def pretty
443
- JSON.pretty_generate( as_json )
437
+ JSON.pretty_generate(as_json)
444
438
  end
445
439
 
446
440
  # clear all change and dirty tracking information.
@@ -487,10 +481,10 @@ module Parse
487
481
  o = Parse::Pointer.new className, (json[Parse::Model::OBJECT_ID] || json[:objectId])
488
482
  end
489
483
  return o
490
- # rescue NameError => e
491
- # puts "Parse::Object.build constant class error: #{e}"
492
- # rescue Exception => e
493
- # puts "Parse::Object.build error: #{e}"
484
+ # rescue NameError => e
485
+ # puts "Parse::Object.build constant class error: #{e}"
486
+ # rescue Exception => e
487
+ # puts "Parse::Object.build error: #{e}"
494
488
  end
495
489
 
496
490
  # @!attribute id
@@ -509,20 +503,6 @@ module Parse
509
503
  # @return [ACL] the access control list (permissions) object for this record.
510
504
  property :acl, :acl, field: :ACL
511
505
 
512
- # Alias to {created_at}
513
- # @return (see #created_at)
514
- def createdAt
515
- return @created_at if Parse::Object.disable_serialized_string_date.present?
516
- @created_at.to_time.utc.iso8601(3) if @created_at.present?
517
- end
518
-
519
- # Alias to {updated_at}
520
- # @return (see #updated_at)
521
- def updatedAt
522
- return @updated_at if Parse::Object.disable_serialized_string_date.present?
523
- @updated_at.to_time.utc.iso8601(3) if @updated_at.present?
524
- end
525
-
526
506
  # Access the value for a defined property through hash accessor. This method
527
507
  # returns nil if the key is not one of the defined properties for this Parse::Object
528
508
  # subclass.
@@ -539,14 +519,23 @@ module Parse
539
519
  # @param key (see Parse::Object#[])
540
520
  # @param value [Object] the value to set this property.
541
521
  # @return [Object] the value passed in.
542
- def []=(key,value)
522
+ def []=(key, value)
543
523
  return unless self.class.fields[key.to_sym].present?
544
- send("#{key}=",value)
524
+ send("#{key}=", value)
545
525
  end
546
-
547
526
  end
527
+ end
548
528
 
529
+ class Hash
549
530
 
531
+ # Turns a Parse formatted JSON hash into a Parse-Stack class object, if one is found.
532
+ # This is equivalent to calling `Parse::Object.build` on the hash object itself, but allows
533
+ # for doing this in loops, such as `map` when using symbol to proc. However, you can also use
534
+ # the Array extension `Array#parse_objects` for doing that more safely.
535
+ # @return [Parse::Object] A Parse::Object subclass represented the built class.
536
+ def parse_object
537
+ Parse::Object.build(self)
538
+ end
550
539
  end
551
540
 
552
541
  class Array
@@ -571,12 +560,11 @@ class Array
571
560
  def parse_ids
572
561
  parse_objects.map(&:id)
573
562
  end
574
-
575
563
  end
576
564
 
577
565
  # Load all the core classes.
578
- require_relative 'classes/installation'
579
- require_relative 'classes/product'
580
- require_relative 'classes/role'
581
- require_relative 'classes/session'
582
- require_relative 'classes/user'
566
+ require_relative "classes/installation"
567
+ require_relative "classes/product"
568
+ require_relative "classes/role"
569
+ require_relative "classes/session"
570
+ require_relative "classes/user"