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.
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