parse-stack 1.4.3 → 1.5.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 (64) hide show
  1. checksums.yaml +4 -4
  2. data/Changes.md +52 -39
  3. data/Gemfile.lock +2 -2
  4. data/README.md +609 -124
  5. data/bin/console +0 -9
  6. data/lib/parse/api/all.rb +3 -0
  7. data/lib/parse/api/analytics.rb +2 -2
  8. data/lib/parse/api/apps.rb +15 -17
  9. data/lib/parse/api/batch.rb +4 -1
  10. data/lib/parse/api/cloud_functions.rb +2 -0
  11. data/lib/parse/api/config.rb +14 -2
  12. data/lib/parse/api/files.rb +6 -3
  13. data/lib/parse/api/hooks.rb +4 -4
  14. data/lib/parse/api/objects.rb +14 -11
  15. data/lib/parse/api/push.rb +4 -2
  16. data/lib/parse/api/schemas.rb +6 -5
  17. data/lib/parse/api/sessions.rb +11 -1
  18. data/lib/parse/api/users.rb +65 -15
  19. data/lib/parse/client/authentication.rb +4 -2
  20. data/lib/parse/client/body_builder.rb +11 -3
  21. data/lib/parse/client/caching.rb +17 -6
  22. data/lib/parse/client/protocol.rb +14 -8
  23. data/lib/parse/client/request.rb +4 -1
  24. data/lib/parse/client/response.rb +59 -6
  25. data/lib/parse/client.rb +72 -42
  26. data/lib/parse/model/acl.rb +22 -4
  27. data/lib/parse/model/associations/belongs_to.rb +22 -10
  28. data/lib/parse/model/associations/collection_proxy.rb +14 -1
  29. data/lib/parse/model/associations/has_many.rb +76 -15
  30. data/lib/parse/model/associations/has_one.rb +69 -0
  31. data/lib/parse/model/associations/pointer_collection_proxy.rb +13 -6
  32. data/lib/parse/model/associations/relation_collection_proxy.rb +5 -2
  33. data/lib/parse/model/bytes.rb +6 -2
  34. data/lib/parse/model/classes/installation.rb +27 -0
  35. data/lib/parse/model/classes/role.rb +20 -0
  36. data/lib/parse/model/classes/session.rb +26 -0
  37. data/lib/parse/model/classes/user.rb +185 -0
  38. data/lib/parse/model/core/actions.rb +40 -26
  39. data/lib/parse/model/core/properties.rb +126 -20
  40. data/lib/parse/model/core/querying.rb +63 -3
  41. data/lib/parse/model/core/schema.rb +9 -6
  42. data/lib/parse/model/date.rb +5 -1
  43. data/lib/parse/model/file.rb +12 -9
  44. data/lib/parse/model/geopoint.rb +6 -4
  45. data/lib/parse/model/model.rb +29 -21
  46. data/lib/parse/model/object.rb +29 -76
  47. data/lib/parse/model/pointer.rb +8 -6
  48. data/lib/parse/model/push.rb +4 -1
  49. data/lib/parse/query/constraint.rb +3 -0
  50. data/lib/parse/query/constraints.rb +6 -3
  51. data/lib/parse/query/operation.rb +3 -0
  52. data/lib/parse/query/ordering.rb +3 -0
  53. data/lib/parse/query.rb +85 -38
  54. data/lib/parse/stack/generators/rails.rb +3 -0
  55. data/lib/parse/stack/railtie.rb +2 -0
  56. data/lib/parse/stack/tasks.rb +4 -1
  57. data/lib/parse/stack/version.rb +4 -1
  58. data/lib/parse/stack.rb +3 -0
  59. data/lib/parse/webhooks/payload.rb +14 -8
  60. data/lib/parse/webhooks/registration.rb +11 -8
  61. data/lib/parse/webhooks.rb +11 -8
  62. data/lib/parse-stack.rb +3 -0
  63. data/parse-stack.gemspec +10 -8
  64. metadata +16 -4
data/bin/console CHANGED
@@ -6,17 +6,8 @@ require 'dotenv'
6
6
  require 'byebug'
7
7
  Dotenv.load
8
8
 
9
-
10
9
  Parse.setup
11
10
 
12
- class Song < Parse::Object
13
- property :name
14
-
15
- before_save do
16
- self.name = self.name.truncate(60)
17
- end
18
-
19
- end
20
11
  # You can add fixtures and/or initialization code here to make experimenting
21
12
  # with your gem easier. You can also use a different console, if you like.
22
13
 
data/lib/parse/api/all.rb CHANGED
@@ -1,3 +1,6 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
1
4
  require_relative '../client'
2
5
  require_relative "analytics"
3
6
  require_relative "apps"
@@ -1,5 +1,5 @@
1
-
2
-
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
3
 
4
4
  module Parse
5
5
 
@@ -1,3 +1,5 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
1
3
 
2
4
  module Parse
3
5
 
@@ -5,29 +7,25 @@ module Parse
5
7
 
6
8
  module Apps
7
9
 
8
-
9
- def fetch_app_keys(appid, email, password)
10
- headers = {}
11
- headers.merge!( { 'X-Parse-Email' => email, 'X-Parse-Password' => password } )
12
- request :get, "apps/#{appid}", headers: headers
10
+ APPS_PATH = "apps"
11
+ def fetch_app_keys(appid, email, password, headers: {})
12
+ headers.merge!( { Parse::Protocol::EMAIL => email, Parse::Protocol::PASSWORD => password } )
13
+ request :get, "#{APPS_PATH}/#{appid}", headers: headers
13
14
  end
14
15
 
15
- def fetch_apps(email, password)
16
- headers = {}
17
- headers.merge!( { 'X-Parse-Email' => email, 'X-Parse-Password' => password } )
18
- request :get, "apps", headers: headers
16
+ def fetch_apps(email, password, headers: {})
17
+ headers.merge!( { Parse::Protocol::EMAIL => email, Parse::Protocol::PASSWORD => password } )
18
+ request :get, APPS_PATH, headers: headers
19
19
  end
20
20
 
21
- def create_app(opts, email, password)
22
- headers = {}
23
- headers.merge!( { 'X-Parse-Email' => email, 'X-Parse-Password' => password } )
24
- request :post, "apps", body: opts, headers: headers
21
+ def create_app(body, email, password, headers: {})
22
+ headers.merge!( { Parse::Protocol::EMAIL => email, Parse::Protocol::PASSWORD => password } )
23
+ request :post, APPS_PATH, body: body, headers: headers
25
24
  end
26
25
 
27
- def update_app(appid, opts, email, password)
28
- headers = {}
29
- headers.merge!( { 'X-Parse-Email' => email, 'X-Parse-Password' => password } )
30
- request :put, "apps/#{appid}", body: opts, headers: headers
26
+ def update_app(appid, body, email, password, headers: {})
27
+ headers.merge!( { Parse::Protocol::EMAIL => email, Parse::Protocol::PASSWORD => password } )
28
+ request :put, "#{APPS_PATH}/#{appid}", body: body, headers: headers
31
29
  end
32
30
 
33
31
 
@@ -1,3 +1,6 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
1
4
  require 'parallel'
2
5
  require 'active_support'
3
6
  require 'active_support/core_ext'
@@ -53,7 +56,7 @@ module Parse
53
56
  include Enumerable
54
57
 
55
58
  def client
56
- @client ||= Parse::Client.session
59
+ @client ||= Parse::Client.client
57
60
  end
58
61
 
59
62
  def initialize(reqs = nil)
@@ -1,3 +1,5 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
1
3
 
2
4
  module Parse
3
5
 
@@ -1,3 +1,5 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
1
3
 
2
4
  module Parse
3
5
 
@@ -5,7 +7,7 @@ module Parse
5
7
  #object fetch methods
6
8
  module Config
7
9
  attr_accessor :config
8
-
10
+ CONFIG_PATH = "config"
9
11
  def config!
10
12
  @config = nil
11
13
  self.config
@@ -13,13 +15,23 @@ module Parse
13
15
 
14
16
  def config
15
17
  if @config.nil?
16
- response = request :get, "config"
18
+ response = request :get, CONFIG_PATH
17
19
  unless response.error?
18
20
  @config = response.result["params"]
19
21
  end
20
22
  end
21
23
  @config
22
24
  end
25
+
26
+ def update_config(params)
27
+ body = { params: params }
28
+ response = request :put, CONFIG_PATH, body: body
29
+ return false if response.error?
30
+ result = response.result["result"]
31
+ @config.merge!(params) if result && @config.present?
32
+ result
33
+ end
34
+
23
35
  end
24
36
 
25
37
  end
@@ -1,3 +1,6 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
1
4
  require 'active_support'
2
5
  require 'active_support/core_ext'
3
6
 
@@ -6,13 +9,13 @@ module Parse
6
9
  module API
7
10
  #object fetch methods
8
11
  module Files
9
-
12
+ FILES_PATH = "files"
10
13
  # /1/classes/<className> POST Creating Objects
11
14
  def create_file(fileName, data = {}, content_type = nil)
12
15
  headers = {}
13
16
  headers.merge!( { Parse::Protocol::CONTENT_TYPE => content_type.to_s } ) if content_type.present?
14
- response = request :post, "files/#{fileName}", body: data, headers: headers
15
- response.parse_class = "_File".freeze
17
+ response = request :post, "#{FILES_PATH}/#{fileName}", body: data, headers: headers
18
+ response.parse_class = Parse::Model::TYPE_FILE
16
19
  response
17
20
  end
18
21
 
@@ -1,16 +1,16 @@
1
-
2
-
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
3
 
4
4
  module Parse
5
5
 
6
6
 
7
7
  module API
8
8
  module Hooks
9
- HOOKS_PREFIX = "hooks/".freeze
9
+ HOOKS_PREFIX = "hooks/"
10
10
  TRIGGER_NAMES = [:beforeSave, :afterSave, :beforeDelete, :afterDelete].freeze
11
11
  def _verify_trigger(triggerName)
12
12
  triggerName = triggerName.to_s.camelize(:lower).to_sym
13
- raise "Invalid trigger name #{triggerName}" unless TRIGGER_NAMES.include?(triggerName)
13
+ raise ArgumentError, "Invalid trigger name #{triggerName}" unless TRIGGER_NAMES.include?(triggerName)
14
14
  triggerName
15
15
  end
16
16
 
@@ -1,3 +1,6 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
1
4
  require 'active_support'
2
5
  require 'active_support/core_ext'
3
6
 
@@ -7,7 +10,7 @@ module Parse
7
10
  #object fetch methods
8
11
  module Objects
9
12
 
10
- CLASS_PATH_PREFIX = "classes/".freeze
13
+ CLASS_PATH_PREFIX = "classes/"
11
14
  PREFIX_MAP = { installation: "installations", _installation: "installations",
12
15
  user: "users", _user: "users",
13
16
  role: "roles", _role: "roles",
@@ -39,36 +42,36 @@ module Parse
39
42
  end
40
43
 
41
44
  # /1/classes/<className> POST Creating Objects
42
- def create_object(className, data = {})
43
- response = request :post, uri_path(className) , body: data
45
+ def create_object(className, body = {}, headers: {}, **opts)
46
+ response = request :post, uri_path(className) , body: body, headers: headers, opts: opts
44
47
  response.parse_class = className if response.present?
45
48
  response
46
49
  end
47
50
 
48
51
  # /1/classes/<className>/<objectId> DELETE Deleting Objects
49
- def delete_object(className, id)
50
- response = request :delete, uri_path(className, id)
52
+ def delete_object(className, id, headers: {}, **opts)
53
+ response = request :delete, uri_path(className, id), headers: headers, opts: opts
51
54
  response.parse_class = className if response.present?
52
55
  response
53
56
  end
54
57
 
55
58
  # /1/classes/<className>/<objectId> GET Retrieving Objects
56
- def fetch_object(className, id, opts = {})
57
- response = request :get, uri_path(className, id), opts: opts
59
+ def fetch_object(className, id, headers: {}, **opts)
60
+ response = request :get, uri_path(className, id), headers: headers, opts: opts
58
61
  response.parse_class = className if response.present?
59
62
  response
60
63
  end
61
64
 
62
65
  # /1/classes/<className> GET Queries
63
- def find_objects(className, query = {}, opts = {})
64
- response = request :get, uri_path(className), query: query, opts: opts
66
+ def find_objects(className, query = {}, headers: {}, **opts)
67
+ response = request :get, uri_path(className), query: query, headers: headers, opts: opts
65
68
  response.parse_class = className if response.present?
66
69
  response
67
70
  end
68
71
 
69
72
  # /1/classes/<className>/<objectId> PUT Updating Objects
70
- def update_object(className, id, data = {})
71
- response = request :put, uri_path(className,id) , body: data
73
+ def update_object(className, id, body = {}, headers: {}, **opts)
74
+ response = request :put, uri_path(className,id) , body: body, headers: headers, opts: opts
72
75
  response.parse_class = className if response.present?
73
76
  response
74
77
  end
@@ -1,12 +1,14 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
1
3
 
2
4
  module Parse
3
5
 
4
6
  module API
5
7
  #object fetch methods
6
8
  module Push
7
-
9
+ PUSH_PATH = "push"
8
10
  def push(payload = {})
9
- request :post, "push".freeze, body: payload.as_json
11
+ request :post, PUSH_PATH, body: payload.as_json
10
12
  end
11
13
 
12
14
  end
@@ -1,21 +1,22 @@
1
-
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Parse
4
5
 
5
6
  module API
6
7
  #object fetch methods
7
8
  module Schema
8
- SCHEMA_PREFIX = "schemas/".freeze
9
+ SCHEMAS_PATH = "schemas"
9
10
  def schema(className)
10
- request :get, "#{SCHEMA_PREFIX}#{className}"
11
+ request :get, "#{SCHEMAS_PATH}/#{className}"
11
12
  end
12
13
 
13
14
  def create_schema(className, schema)
14
- request :post, "#{SCHEMA_PREFIX}#{className}", body: schema
15
+ request :post, "#{SCHEMAS_PATH}/#{className}", body: schema
15
16
  end
16
17
 
17
18
  def update_schema(className, schema)
18
- request :put, "#{SCHEMA_PREFIX}#{className}", body: schema
19
+ request :put, "#{SCHEMAS_PATH}/#{className}", body: schema
19
20
  end
20
21
 
21
22
  end #Schema
@@ -1,9 +1,19 @@
1
-
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Parse
4
5
 
5
6
  module API
6
7
  module Sessions
8
+ SESSION_PATH_PREFIX = "sessions"
9
+
10
+ def fetch_session(session_token, **opts)
11
+ opts.merge!({use_master_key: false, cache: false})
12
+ headers = {Parse::Protocol::SESSION_TOKEN => session_token}
13
+ response = request :get, "#{SESSION_PATH_PREFIX}/me", headers: headers, opts: opts
14
+ response.parse_class = Parse::Model::CLASS_SESSION
15
+ response
16
+ end
7
17
 
8
18
  end
9
19
  end
@@ -1,4 +1,7 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
1
3
 
4
+ require 'open-uri'
2
5
 
3
6
  module Parse
4
7
 
@@ -6,34 +9,81 @@ module Parse
6
9
  module Users
7
10
  # Note that Parse::Objects mainly use the objects.rb API since we can
8
11
  # detect class names to proper URI handlers
9
- USER_PATH_PREFIX = "users".freeze
10
- USER_CLASS = "_User".freeze
11
- def fetch_user(id)
12
- request :get, "#{USER_PATH_PREFIX}/#{id}"
12
+ USER_PATH_PREFIX = "users"
13
+ LOGOUT_PATH = "logout"
14
+ LOGIN_PATH = "login"
15
+ REQUEST_PASSWORD_RESET = "requestPasswordReset"
16
+
17
+ def fetch_user(id, headers: {}, **opts)
18
+ request :get, "#{USER_PATH_PREFIX}/#{id}", headers: headers, opts: opts
19
+ end
20
+
21
+ def find_users(query = {}, headers: {}, **opts)
22
+ response = request :get, USER_PATH_PREFIX, query: query, headers: headers, opts: opts
23
+ response.parse_class = Parse::Model::CLASS_USER
24
+ response
25
+ end
26
+
27
+ def current_user(session_token, headers: {}, **opts)
28
+ headers.merge!({Parse::Protocol::SESSION_TOKEN => session_token})
29
+ response = request :get, "#{USER_PATH_PREFIX}/me", headers: headers, opts: opts
30
+ response.parse_class = Parse::Model::CLASS_USER
31
+ response
13
32
  end
14
33
 
15
- def find_users(query = {})
16
- response = request :get, "#{USER_PATH_PREFIX}", query: query
17
- response.parse_class = USER_CLASS
34
+ def create_user(body, headers: {}, **opts)
35
+ headers.merge!({ Parse::Protocol::REVOCABLE_SESSION => '1'})
36
+ if opts[:session_token].present?
37
+ headers.merge!({ Parse::Protocol::SESSION_TOKEN => opts[:session_token]})
38
+ end
39
+ response = request :post, USER_PATH_PREFIX, body: body, headers: headers, opts: opts
40
+ response.parse_class = Parse::Model::CLASS_USER
18
41
  response
19
42
  end
20
43
 
21
- def fetch_me(query = {})
22
- response = request :get, "#{USER_PATH_PREFIX}/me", query: query
23
- response.parse_class = USER_CLASS
44
+ def update_user(id, body = {}, headers: {}, **opts)
45
+ response = request :put, "#{USER_PATH_PREFIX}/#{id}", body: body, opts: opts
46
+ response.parse_class = Parse::Model::CLASS_USER
24
47
  response
25
48
  end
26
49
 
27
- def update_user(id, body = {})
28
- response = request :put, "#{USER_PATH_PREFIX}/#{id}", body: body
29
- response.parse_class = USER_CLASS
50
+ # deleting or unlinking is done by setting the authData of the service name to nil
51
+ def set_service_auth_data(id, service_name, auth_data, headers: {}, **opts)
52
+ body = { authData: { service_name => auth_data } }
53
+ update_user(id, body, opts)
54
+ end
55
+
56
+ def delete_user(id, headers: {}, **opts)
57
+ request :delete, "#{USER_PATH_PREFIX}/#{id}", headers: headers, opts: opts
58
+ end
59
+
60
+ def request_password_reset(email, **opts)
61
+ body = {email: email}
62
+ request :post, REQUEST_PASSWORD_RESET, body: body, opts: opts
63
+ end
64
+
65
+ def login(username, password, headers: {}, **opts)
66
+ # Probably pass Installation-ID as header
67
+ query = { username: username, password: password }
68
+ headers.merge!({ Parse::Protocol::REVOCABLE_SESSION => '1'})
69
+ # headers.merge!( { Parse::Protocol::INSTALLATION_ID => ''} )
70
+ response = request :get, LOGIN_PATH, query: query, headers: headers, opts: opts
71
+ response.parse_class = Parse::Model::CLASS_USER
30
72
  response
31
73
  end
32
74
 
33
- def delete_user(id)
34
- request :delete, "#{USER_PATH_PREFIX}/#{id}"
75
+ def logout(session_token, headers: {}, **opts)
76
+ headers.merge!({ Parse::Protocol::SESSION_TOKEN => session_token})
77
+ opts.merge!({use_master_key: false, session_token: session_token})
78
+ request :post, LOGOUT_PATH, headers: headers, opts: opts
35
79
  end
36
80
 
81
+ # {username: "", password: "", email: nil} # minimum
82
+ def signup(username, password, email = nil, body: {}, **opts)
83
+ body = body.merge({ username: username, password: password })
84
+ body[:email] = email || body[:email]
85
+ create_user(body, opts)
86
+ end
37
87
 
38
88
 
39
89
  end # Users
@@ -1,3 +1,6 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
1
4
  require 'faraday'
2
5
  require 'faraday_middleware'
3
6
  require 'active_support'
@@ -34,10 +37,9 @@ module Parse
34
37
  def call!(env)
35
38
  # We add the main Parse protocol headers
36
39
  headers = {}
37
- raise "No Parse Application Id specified for authentication." unless @application_id.present?
40
+ raise ArgumentError, "No Parse Application Id specified for authentication." unless @application_id.present?
38
41
  headers[APP_ID] = @application_id
39
42
  headers[API_KEY] = @api_key unless @api_key.blank?
40
-
41
43
  unless @master_key.blank? || env[:request_headers][DISABLE_MASTER_KEY].present?
42
44
  headers[MASTER_KEY] = @master_key
43
45
  end
@@ -1,3 +1,6 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
1
4
  require 'faraday'
2
5
  require 'faraday_middleware'
3
6
  require_relative 'response'
@@ -15,7 +18,7 @@ module Parse
15
18
  end
16
19
 
17
20
  include Parse::Protocol
18
- HTTP_OVERRIDE = 'X-Http-Method-Override'.freeze
21
+ HTTP_OVERRIDE = 'X-Http-Method-Override'
19
22
 
20
23
  # thread-safety
21
24
  def call(env)
@@ -29,7 +32,7 @@ module Parse
29
32
  # The standard maximum POST request (which is a server setting), is usually set to 20MBs
30
33
  if env[:method] == :get && env[:url].to_s.length > 2_000
31
34
  env[:request_headers][HTTP_OVERRIDE] = 'GET'
32
- env[:request_headers][CONTENT_TYPE] = 'application/x-www-form-urlencoded'.freeze
35
+ env[:request_headers][CONTENT_TYPE] = 'application/x-www-form-urlencoded'
33
36
  env[:body] = env[:url].query
34
37
  env[:url].query = nil
35
38
  #override
@@ -42,6 +45,11 @@ module Parse
42
45
 
43
46
  if self.class.logging
44
47
  puts "[Request #{env.method.upcase}] #{env[:url]}"
48
+ env[:request_headers].each do |k,v|
49
+ next if k == Parse::Protocol::MASTER_KEY
50
+ puts "[Header] #{k} : #{v}"
51
+ end
52
+
45
53
  puts "[Request Body] #{env[:body]}"
46
54
  end
47
55
  @app.call(env).on_complete do |response_env|
@@ -56,7 +64,7 @@ module Parse
56
64
 
57
65
  begin
58
66
  r = Parse::Response.new(response_env.body)
59
- rescue Exception => e
67
+ rescue => e
60
68
  r = Parse::Response.new
61
69
  r.code = response_env.status
62
70
  r.error = "Invalid response for #{env[:method]} #{env[:url]}: #{e}"
@@ -1,3 +1,6 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
1
4
  require 'faraday'
2
5
  require 'faraday_middleware'
3
6
  require 'moneta'
@@ -5,7 +8,7 @@ require_relative 'protocol'
5
8
  # This is a caching middleware for Parse queries using Moneta.
6
9
  module Parse
7
10
  module Middleware
8
- class CachingError < Exception; end;
11
+ class CachingError < StandardError; end;
9
12
  class Caching < Faraday::Middleware
10
13
  include Parse::Protocol
11
14
  # Cache-Control: no-cache
@@ -17,9 +20,9 @@ module Parse
17
20
  # * 302 - 'Found'
18
21
  # * 404 - 'Not Found' - removed
19
22
  # * 410 - 'Gone' - removed
20
- CACHEABLE_HTTP_CODES = [200, 203, 300, 301, 302].freeze
21
- CACHE_CONTROL = 'Cache-Control'.freeze
22
- CACHE_EXPIRES_DURATION = 'X-Parse-Stack-Cache-Expires'.freeze
23
+ CACHEABLE_HTTP_CODES = [200, 203, 300, 301, 302]
24
+ CACHE_CONTROL = 'Cache-Control'
25
+ CACHE_EXPIRES_DURATION = 'X-Parse-Stack-Cache-Expires'
23
26
 
24
27
  class << self
25
28
  attr_accessor :enabled, :logging
@@ -60,7 +63,7 @@ module Parse
60
63
  # get default caching state
61
64
  @enabled = self.class.enabled
62
65
  # disable cache for this request if "no-cache" was passed
63
- if @request_headers[CACHE_CONTROL] == "no-cache".freeze
66
+ if @request_headers[CACHE_CONTROL] == "no-cache"
64
67
  @enabled = false
65
68
  end
66
69
 
@@ -80,6 +83,14 @@ module Parse
80
83
  url = env.url
81
84
  method = env.method
82
85
  @cache_key = url.to_s
86
+
87
+ if @request_headers.key?(SESSION_TOKEN)
88
+ session_token = @request_headers[SESSION_TOKEN]
89
+ @cache_key = "#{session_token}#{@cache_key}" # prefix tokens
90
+ elsif @request_headers.key?(MASTER_KEY)
91
+ @cache_key = "mk:#{@cache_key}" # prefix for master key requests
92
+ end
93
+
83
94
  begin
84
95
  if method == :get && @cache_key.present? && @store.key?(@cache_key)
85
96
  puts("[Parse::Cache::Hit] >> #{url}") if self.class.logging.present?
@@ -111,7 +122,7 @@ module Parse
111
122
  # Only cache GET requests with valid HTTP status codes whose content-length
112
123
  # is greater than 20. Otherwise they could be errors, successes and empty result sets.
113
124
  if @enabled && method == :get && CACHEABLE_HTTP_CODES.include?(response_env.status) &&
114
- response_env.present? && response_env.response_headers["content-length".freeze].to_i > 20
125
+ response_env.present? && response_env.response_headers["content-length"].to_i > 20
115
126
  @store.store(@cache_key, response_env, expires: @expires) # ||= response_env.body
116
127
  end # if
117
128
  # do something with the response
@@ -1,16 +1,22 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
1
3
 
2
4
  # A module to contain all the main constants.
3
5
  module Parse
4
6
 
5
7
  module Protocol
6
- HOST = "api.parse.com".freeze
7
- SERVER_URL = "https://api.parse.com/1/".freeze
8
- APP_ID = 'X-Parse-Application-Id'.freeze
9
- API_KEY = 'X-Parse-REST-API-Key'.freeze
10
- MASTER_KEY = 'X-Parse-Master-Key'.freeze
11
- SESSION_TOKEN = 'X-Parse-Session-Token'.freeze
12
- CONTENT_TYPE = "Content-Type".freeze
13
- CONTENT_TYPE_FORMAT = "application/json; charset=utf-8".freeze
8
+ HOST = 'api.parse.com'
9
+ SERVER_URL = 'https://api.parse.com/1/'
10
+ APP_ID = 'X-Parse-Application-Id'
11
+ API_KEY = 'X-Parse-REST-API-Key'
12
+ MASTER_KEY = 'X-Parse-Master-Key'
13
+ SESSION_TOKEN = 'X-Parse-Session-Token'
14
+ REVOCABLE_SESSION = 'X-Parse-Revocable-Session'
15
+ EMAIL = 'X-Parse-Email'
16
+ PASSWORD = 'X-Parse-Password'
17
+ INSTALLATION_ID = 'Parse-Installation-Id'
18
+ CONTENT_TYPE = 'Content-Type'
19
+ CONTENT_TYPE_FORMAT = 'application/json; charset=utf-8'
14
20
  end
15
21
 
16
22
  end
@@ -1,3 +1,6 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
1
4
  require 'active_support'
2
5
  require 'active_support/json'
3
6
 
@@ -11,7 +14,7 @@ module Parse
11
14
  @tag = 0
12
15
  method = method.downcase.to_sym
13
16
  unless method == :get || method == :put || method == :post || method == :delete
14
- raise "Invalid method #{method} for request : '#{uri}'"
17
+ raise ArgumentError, "Invalid method #{method} for request : '#{uri}'"
15
18
  end
16
19
  self.method = method
17
20
  self.path = uri