parse-stack 1.0.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.
Files changed (59) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +6 -0
  3. data/Gemfile.lock +77 -0
  4. data/LICENSE +20 -0
  5. data/README.md +1281 -0
  6. data/Rakefile +12 -0
  7. data/bin/console +20 -0
  8. data/bin/server +10 -0
  9. data/bin/setup +7 -0
  10. data/lib/parse/api/all.rb +13 -0
  11. data/lib/parse/api/analytics.rb +16 -0
  12. data/lib/parse/api/apps.rb +37 -0
  13. data/lib/parse/api/batch.rb +148 -0
  14. data/lib/parse/api/cloud_functions.rb +18 -0
  15. data/lib/parse/api/config.rb +22 -0
  16. data/lib/parse/api/files.rb +21 -0
  17. data/lib/parse/api/hooks.rb +68 -0
  18. data/lib/parse/api/objects.rb +77 -0
  19. data/lib/parse/api/push.rb +16 -0
  20. data/lib/parse/api/schemas.rb +25 -0
  21. data/lib/parse/api/sessions.rb +11 -0
  22. data/lib/parse/api/users.rb +43 -0
  23. data/lib/parse/client.rb +225 -0
  24. data/lib/parse/client/authentication.rb +59 -0
  25. data/lib/parse/client/body_builder.rb +69 -0
  26. data/lib/parse/client/caching.rb +103 -0
  27. data/lib/parse/client/protocol.rb +15 -0
  28. data/lib/parse/client/request.rb +43 -0
  29. data/lib/parse/client/response.rb +116 -0
  30. data/lib/parse/model/acl.rb +182 -0
  31. data/lib/parse/model/associations/belongs_to.rb +121 -0
  32. data/lib/parse/model/associations/collection_proxy.rb +202 -0
  33. data/lib/parse/model/associations/has_many.rb +218 -0
  34. data/lib/parse/model/associations/pointer_collection_proxy.rb +71 -0
  35. data/lib/parse/model/associations/relation_collection_proxy.rb +134 -0
  36. data/lib/parse/model/bytes.rb +50 -0
  37. data/lib/parse/model/core/actions.rb +499 -0
  38. data/lib/parse/model/core/properties.rb +377 -0
  39. data/lib/parse/model/core/querying.rb +100 -0
  40. data/lib/parse/model/core/schema.rb +92 -0
  41. data/lib/parse/model/date.rb +50 -0
  42. data/lib/parse/model/file.rb +127 -0
  43. data/lib/parse/model/geopoint.rb +98 -0
  44. data/lib/parse/model/model.rb +120 -0
  45. data/lib/parse/model/object.rb +347 -0
  46. data/lib/parse/model/pointer.rb +106 -0
  47. data/lib/parse/model/push.rb +99 -0
  48. data/lib/parse/query.rb +378 -0
  49. data/lib/parse/query/constraint.rb +130 -0
  50. data/lib/parse/query/constraints.rb +176 -0
  51. data/lib/parse/query/operation.rb +66 -0
  52. data/lib/parse/query/ordering.rb +49 -0
  53. data/lib/parse/stack.rb +11 -0
  54. data/lib/parse/stack/version.rb +5 -0
  55. data/lib/parse/webhooks.rb +228 -0
  56. data/lib/parse/webhooks/payload.rb +115 -0
  57. data/lib/parse/webhooks/registration.rb +139 -0
  58. data/parse-stack.gemspec +45 -0
  59. metadata +340 -0
@@ -0,0 +1,115 @@
1
+ require 'active_model'
2
+ require 'active_support'
3
+ require 'active_support/inflector'
4
+ require 'active_support/core_ext/object'
5
+ require 'active_model_serializers'
6
+
7
+ module Parse
8
+
9
+ class Payload
10
+ include ::ActiveModel::Serializers::JSON
11
+ attr_accessor :master, :user, :installation_id, :params, :function_name, :object, :trigger_name
12
+
13
+ attr_accessor :original, :update, :raw
14
+ alias_method :installationId, :installation_id
15
+ alias_method :functionName, :function_name
16
+ alias_method :triggerName, :trigger_name
17
+
18
+ def initialize(hash = {})
19
+ hash = JSON.parse(hash) if hash.is_a?(String)
20
+ hash = Hash[hash.map{ |k, v| [k.to_s.underscore.to_sym, v] }]
21
+ @raw = hash
22
+ @master = hash[:master]
23
+ @user = Parse::User.new hash[:user] if hash[:user].present?
24
+ @installation_id = hash[:installation_id]
25
+ @params = hash[:params]
26
+ @function_name = hash[:function_name]
27
+ @object = hash[:object]
28
+ @trigger_name = hash[:trigger_name]
29
+ @original = hash[:original]
30
+ @update = hash[:update] #it comes as an update hash
31
+ end
32
+
33
+ def function?
34
+ @function_name.present?
35
+ end
36
+
37
+ def parse_class
38
+ return nil unless @object.present?
39
+ @object["className".freeze] || @object[:className]
40
+ end
41
+
42
+ def parse_id
43
+ return nil unless @object.present?
44
+ @object["objectId".freeze] || @object[:objectId]
45
+ end; alias_method :objectId, :parse_id
46
+
47
+ def trigger?
48
+ @trigger_name.present?
49
+ end
50
+
51
+ def before_trigger?
52
+ before_save? || before_delete?
53
+ end
54
+
55
+ def after_trigger?
56
+ after_save? || after_delete?
57
+ end
58
+
59
+ def before_save?
60
+ trigger? && @trigger_name.to_sym == :beforeSave
61
+ end
62
+
63
+ def after_save?
64
+ trigger? && @trigger_name.to_sym == :afterSave
65
+ end
66
+
67
+ def before_delete?
68
+ trigger? && @trigger_name.to_sym == :beforeDelete
69
+ end
70
+
71
+ def after_delete?
72
+ trigger? && @trigger_name.to_sym == :afterDelete
73
+ end
74
+
75
+ def object?
76
+ trigger? && @object.present?
77
+ end
78
+
79
+ def original_parse_object
80
+ return nil unless @original.is_a?(Hash)
81
+ Parse::Object.build(@original)
82
+ end
83
+
84
+ def parse_object(pristine = false)
85
+ return nil unless object?
86
+ return Parse::Object.build(@object) if pristine
87
+ # if its a before trigger, then we build the original object and apply the updates
88
+ # in order to create a Parse::Object that has the dirty tracking information
89
+ # if no original is nil, then it means this is a brand new object, so we create
90
+ # one from the className
91
+ if before_trigger?
92
+ # if original is present, then this is a modified object
93
+ if @original.present? && @original.is_a?(Hash)
94
+ o = Parse::Object.build @original
95
+ o.apply_attributes! @object, dirty_track: true
96
+ return o
97
+ else #else the object must be new
98
+ klass = Parse::Object.find_class parse_class
99
+ # if we have a class, return that with updated changes, otherwise
100
+ # default to regular object
101
+ return klass.new(@object || {}) if klass.present?
102
+ end
103
+ end
104
+ Parse::Object.build(@object)
105
+ end
106
+
107
+
108
+ def attributes
109
+ { master: nil, user: nil, installationId: nil, params: nil,
110
+ functionName: nil, object: nil, original: nil, update: nil, triggerName: nil }.freeze
111
+ end
112
+
113
+ end # Payload
114
+
115
+ end
@@ -0,0 +1,139 @@
1
+
2
+ module Parse
3
+
4
+ module Webhook
5
+
6
+ module Registration
7
+
8
+ ALLOWED_HOOKS = Parse::API::Hooks::TRIGGER_NAMES + [:function]
9
+
10
+
11
+ def remove_all_functions!
12
+
13
+ client.functions.results.each do |f|
14
+ next unless f["url"].present?
15
+ client.delete_function f['functionName']
16
+ puts "[Webhook] Removed function - #{f['functionName']}"
17
+ end
18
+ end
19
+
20
+ def remove_all_triggers!
21
+
22
+ client.triggers.results.each do |f|
23
+ next unless f["url"].present?
24
+ triggerName = f["triggerName"]
25
+ className = f["className"]
26
+ client.delete_trigger triggerName, className
27
+ puts "[Webhook] Removed #{f['triggerName']} - #{f['className']}"
28
+ end
29
+
30
+ end
31
+
32
+ def register_functions!(endpoint)
33
+
34
+ unless endpoint.starts_with?('https://')
35
+ raise "The HOOKS_URL must be https: '#{endpoint}''"
36
+ end
37
+ endpoint += '/' unless endpoint.ends_with?('/')
38
+ functionsMap = {}
39
+ client.functions.results.each do |f|
40
+ next unless f["url"].present?
41
+ functionsMap[ f['functionName'] ] = f["url"]
42
+ end
43
+
44
+ routes.function.keys.each do |functionName|
45
+ url = endpoint + functionName
46
+ if functionsMap[functionName].present? #you may need to update
47
+ next if functionsMap[functionName] == url
48
+ client.update_function(functionName, url)
49
+ else
50
+ client.create_function(functionName, url)
51
+ end
52
+ puts "[Webhook] Registered function - #{functionName}"
53
+ end
54
+
55
+ end
56
+
57
+ def register_triggers!(endpoint, include_wildcard: false)
58
+
59
+ unless endpoint.starts_with?('https://')
60
+ raise "The HOOKS_URL must be https: '#{endpoint}''"
61
+ end
62
+ endpoint += '/' unless endpoint.ends_with?('/')
63
+
64
+ current_triggers = {
65
+ after_save: {},
66
+ after_delete: {},
67
+ before_delete: {},
68
+ before_save: {}
69
+ }
70
+
71
+ client.triggers.each do |t|
72
+ next unless t["url"].present?
73
+ trigger_name = t["triggerName".freeze].underscore.to_sym
74
+ current_triggers[trigger_name] ||= {}
75
+ current_triggers[trigger_name][ t["className"] ] = t["url"]
76
+ end
77
+
78
+ [:after_save, :after_delete, :before_delete, :before_save].each do |trigger|
79
+ classNames = routes[trigger].keys.dup
80
+ if include_wildcard && classNames.include?('*') #then create the list for all classes
81
+ classNames.delete '*' #delete the wildcard before we expand it
82
+ classNames = classNames + Parse.registered_classes
83
+ classNames.uniq!
84
+ end
85
+
86
+ classNames.each do |className|
87
+ next if className == '*'.freeze
88
+ url = endpoint + "#{trigger}/#{className}"
89
+ if current_triggers[trigger][className].present? #then you may need to update
90
+ next if current_triggers[trigger][className] == url
91
+ client.update_trigger(trigger, className, url)
92
+ else
93
+ client.create_trigger(trigger, className, url)
94
+ end
95
+ puts "[Webhook] Registered #{trigger} - #{className}"
96
+ end
97
+
98
+ end
99
+ end
100
+
101
+ def register_webhook!(trigger, name, url)
102
+ trigger = trigger.to_s.camelize(:lower).to_sym
103
+ raise "Invalid hook trigger #{trigger}" unless ALLOWED_HOOKS.include?(trigger)
104
+ if trigger == :function
105
+ response = client.fetch_function(name)
106
+ # if it is either an error (which has no results) or there is a result but
107
+ # no registered item with a URL (which implies either none registered or only cloud code registered)
108
+ # then create it.
109
+ if response.results.none? { |d| d.has_key?("url".freeze) }
110
+ response = client.create_function(name, url)
111
+ else
112
+ # update it
113
+ response = client.update_function(name, url)
114
+ end
115
+ warn "Webhook Registration warning: #{response.result["warning"]}" if response.result.has_key?("warning")
116
+ warn "Failed to register Cloud function #{name} with #{url}" if response.error?
117
+ return response
118
+ else # must be trigger
119
+
120
+ response = client.fetch_trigger(trigger, name)
121
+ # if it is either an error (which has no results) or there is a result but
122
+ # no registered item with a URL (which implies either none registered or only cloud code registered)
123
+ # then create it.
124
+ if response.results.none? { |d| d.has_key?("url".freeze) }
125
+ # create it
126
+ response = client.create_trigger(trigger, name, url)
127
+ else
128
+ # update it
129
+ response = client.update_trigger(trigger, name, url)
130
+ end
131
+
132
+ warn "Webhook Registration warning: #{response.result["warning"]}" if response.result.has_key?("warning")
133
+ warn "Webhook Registration error: #{response.error}" if response.error?
134
+ return response
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,45 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'parse/stack/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "parse-stack"
8
+ spec.version = Parse::Stack::VERSION
9
+ spec.authors = ["Anthony Persaud"]
10
+ spec.email = ["persaud@modernistik.com"]
11
+
12
+ spec.summary = %q{Ruby Parse SDK Client and Object Relational Mapping stack}
13
+ spec.description = %q{A Parse Ruby Client, ORM, and Query engine to manage larger scale Parse applications}
14
+ spec.homepage = "https://github.com/modernistik/parse-stack"
15
+ spec.license = "Nonstandard"
16
+ # Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
17
+ # delete this section to allow pushing this gem to any host.
18
+ # if spec.respond_to?(:metadata)
19
+ # spec.metadata['allowed_push_host'] = "http://www.modernistik.com"
20
+ # else
21
+ # raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
22
+ # end
23
+
24
+ spec.files = Dir.glob("**/*").reject { |f| f.match(%r{^(test|spec|features)/} ) || f.match(%r{\.gem$}) } # `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
+ spec.bindir = "exe"
26
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
+ spec.require_paths = ["lib"]
28
+
29
+ spec.add_runtime_dependency "activemodel", [">= 4", "< 5"]
30
+ spec.add_runtime_dependency "activesupport", [">= 4", "< 5"]
31
+ spec.add_runtime_dependency "active_model_serializers", [">= 0.9", "< 1"]
32
+ spec.add_runtime_dependency "parallel", [">= 1.6", "< 2"]
33
+ spec.add_runtime_dependency "faraday", [">= 0.8", "< 1"]
34
+ spec.add_runtime_dependency "faraday_middleware", [">= 0.9", "< 1"]
35
+ spec.add_runtime_dependency "moneta", [">= 0.7", "< 1"]
36
+ spec.add_runtime_dependency "rack", ["< 2"]
37
+
38
+ spec.add_development_dependency "bundler", "~> 1"
39
+ spec.add_development_dependency "rake", "~> 10"
40
+ spec.add_development_dependency "minitest", "~> 5"
41
+ spec.add_development_dependency "pry", "< 1"
42
+ spec.add_development_dependency 'pry-stack_explorer', "< 1"
43
+ spec.add_development_dependency 'pry-nav', "< 1"
44
+
45
+ end
metadata ADDED
@@ -0,0 +1,340 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: parse-stack
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Anthony Persaud
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-01-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activemodel
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '4'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '5'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '4'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '5'
33
+ - !ruby/object:Gem::Dependency
34
+ name: activesupport
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '4'
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '5'
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '4'
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '5'
53
+ - !ruby/object:Gem::Dependency
54
+ name: active_model_serializers
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '0.9'
60
+ - - "<"
61
+ - !ruby/object:Gem::Version
62
+ version: '1'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0.9'
70
+ - - "<"
71
+ - !ruby/object:Gem::Version
72
+ version: '1'
73
+ - !ruby/object:Gem::Dependency
74
+ name: parallel
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '1.6'
80
+ - - "<"
81
+ - !ruby/object:Gem::Version
82
+ version: '2'
83
+ type: :runtime
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '1.6'
90
+ - - "<"
91
+ - !ruby/object:Gem::Version
92
+ version: '2'
93
+ - !ruby/object:Gem::Dependency
94
+ name: faraday
95
+ requirement: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0.8'
100
+ - - "<"
101
+ - !ruby/object:Gem::Version
102
+ version: '1'
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0.8'
110
+ - - "<"
111
+ - !ruby/object:Gem::Version
112
+ version: '1'
113
+ - !ruby/object:Gem::Dependency
114
+ name: faraday_middleware
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: '0.9'
120
+ - - "<"
121
+ - !ruby/object:Gem::Version
122
+ version: '1'
123
+ type: :runtime
124
+ prerelease: false
125
+ version_requirements: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: '0.9'
130
+ - - "<"
131
+ - !ruby/object:Gem::Version
132
+ version: '1'
133
+ - !ruby/object:Gem::Dependency
134
+ name: moneta
135
+ requirement: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0.7'
140
+ - - "<"
141
+ - !ruby/object:Gem::Version
142
+ version: '1'
143
+ type: :runtime
144
+ prerelease: false
145
+ version_requirements: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ version: '0.7'
150
+ - - "<"
151
+ - !ruby/object:Gem::Version
152
+ version: '1'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rack
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "<"
158
+ - !ruby/object:Gem::Version
159
+ version: '2'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "<"
165
+ - !ruby/object:Gem::Version
166
+ version: '2'
167
+ - !ruby/object:Gem::Dependency
168
+ name: bundler
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '1'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '1'
181
+ - !ruby/object:Gem::Dependency
182
+ name: rake
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: '10'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: '10'
195
+ - !ruby/object:Gem::Dependency
196
+ name: minitest
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '5'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: '5'
209
+ - !ruby/object:Gem::Dependency
210
+ name: pry
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - "<"
214
+ - !ruby/object:Gem::Version
215
+ version: '1'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - "<"
221
+ - !ruby/object:Gem::Version
222
+ version: '1'
223
+ - !ruby/object:Gem::Dependency
224
+ name: pry-stack_explorer
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "<"
228
+ - !ruby/object:Gem::Version
229
+ version: '1'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - "<"
235
+ - !ruby/object:Gem::Version
236
+ version: '1'
237
+ - !ruby/object:Gem::Dependency
238
+ name: pry-nav
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - "<"
242
+ - !ruby/object:Gem::Version
243
+ version: '1'
244
+ type: :development
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - "<"
249
+ - !ruby/object:Gem::Version
250
+ version: '1'
251
+ description: A Parse Ruby Client, ORM, and Query engine to manage larger scale Parse
252
+ applications
253
+ email:
254
+ - persaud@modernistik.com
255
+ executables: []
256
+ extensions: []
257
+ extra_rdoc_files: []
258
+ files:
259
+ - Gemfile
260
+ - Gemfile.lock
261
+ - LICENSE
262
+ - README.md
263
+ - Rakefile
264
+ - bin/console
265
+ - bin/server
266
+ - bin/setup
267
+ - lib/parse/api/all.rb
268
+ - lib/parse/api/analytics.rb
269
+ - lib/parse/api/apps.rb
270
+ - lib/parse/api/batch.rb
271
+ - lib/parse/api/cloud_functions.rb
272
+ - lib/parse/api/config.rb
273
+ - lib/parse/api/files.rb
274
+ - lib/parse/api/hooks.rb
275
+ - lib/parse/api/objects.rb
276
+ - lib/parse/api/push.rb
277
+ - lib/parse/api/schemas.rb
278
+ - lib/parse/api/sessions.rb
279
+ - lib/parse/api/users.rb
280
+ - lib/parse/client.rb
281
+ - lib/parse/client/authentication.rb
282
+ - lib/parse/client/body_builder.rb
283
+ - lib/parse/client/caching.rb
284
+ - lib/parse/client/protocol.rb
285
+ - lib/parse/client/request.rb
286
+ - lib/parse/client/response.rb
287
+ - lib/parse/model/acl.rb
288
+ - lib/parse/model/associations/belongs_to.rb
289
+ - lib/parse/model/associations/collection_proxy.rb
290
+ - lib/parse/model/associations/has_many.rb
291
+ - lib/parse/model/associations/pointer_collection_proxy.rb
292
+ - lib/parse/model/associations/relation_collection_proxy.rb
293
+ - lib/parse/model/bytes.rb
294
+ - lib/parse/model/core/actions.rb
295
+ - lib/parse/model/core/properties.rb
296
+ - lib/parse/model/core/querying.rb
297
+ - lib/parse/model/core/schema.rb
298
+ - lib/parse/model/date.rb
299
+ - lib/parse/model/file.rb
300
+ - lib/parse/model/geopoint.rb
301
+ - lib/parse/model/model.rb
302
+ - lib/parse/model/object.rb
303
+ - lib/parse/model/pointer.rb
304
+ - lib/parse/model/push.rb
305
+ - lib/parse/query.rb
306
+ - lib/parse/query/constraint.rb
307
+ - lib/parse/query/constraints.rb
308
+ - lib/parse/query/operation.rb
309
+ - lib/parse/query/ordering.rb
310
+ - lib/parse/stack.rb
311
+ - lib/parse/stack/version.rb
312
+ - lib/parse/webhooks.rb
313
+ - lib/parse/webhooks/payload.rb
314
+ - lib/parse/webhooks/registration.rb
315
+ - parse-stack.gemspec
316
+ homepage: https://github.com/modernistik/parse-stack
317
+ licenses:
318
+ - Nonstandard
319
+ metadata: {}
320
+ post_install_message:
321
+ rdoc_options: []
322
+ require_paths:
323
+ - lib
324
+ required_ruby_version: !ruby/object:Gem::Requirement
325
+ requirements:
326
+ - - ">="
327
+ - !ruby/object:Gem::Version
328
+ version: '0'
329
+ required_rubygems_version: !ruby/object:Gem::Requirement
330
+ requirements:
331
+ - - ">="
332
+ - !ruby/object:Gem::Version
333
+ version: '0'
334
+ requirements: []
335
+ rubyforge_project:
336
+ rubygems_version: 2.5.1
337
+ signing_key:
338
+ specification_version: 4
339
+ summary: Ruby Parse SDK Client and Object Relational Mapping stack
340
+ test_files: []