parse-ruby-client 0.1.9 → 0.1.10
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.
- data/README.md +1 -1
- data/VERSION +1 -1
- data/fixtures/vcr_cassettes/test_user_save.yml +52 -73
- data/lib/parse/client.rb +3 -3
- data/lib/parse/protocol.rb +5 -3
- data/lib/parse/query.rb +8 -16
- data/lib/parse/user.rb +5 -4
- data/lib/parse/util.rb +3 -0
- data/parse-ruby-client.gemspec +2 -2
- data/test/test_client.rb +1 -1
- data/test/test_user.rb +13 -10
- metadata +3 -3
data/README.md
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.10
|
@@ -1,83 +1,62 @@
|
|
1
|
-
---
|
2
|
-
http_interactions:
|
3
|
-
- request:
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
4
|
method: post
|
5
5
|
uri: https://api.parse.com/1/users
|
6
|
-
body:
|
6
|
+
body:
|
7
7
|
encoding: UTF-8
|
8
|
-
string:
|
9
|
-
headers:
|
10
|
-
Content-Type:
|
8
|
+
string: "{\"username\":\"0.40493766445323776\",\"password\":\"topsecret\"}"
|
9
|
+
headers:
|
10
|
+
Content-Type:
|
11
11
|
- application/json
|
12
|
-
Accept:
|
12
|
+
Accept:
|
13
13
|
- application/json
|
14
|
-
User-Agent:
|
14
|
+
User-Agent:
|
15
15
|
- Parse for Ruby, 0.0
|
16
|
-
X-Parse-Master-Key:
|
17
|
-
-
|
18
|
-
X-Parse-Rest-Api-Key:
|
19
|
-
-
|
20
|
-
X-Parse-Application-Id:
|
21
|
-
-
|
22
|
-
X-Parse-Session-Token:
|
23
|
-
-
|
24
|
-
Expect:
|
25
|
-
-
|
26
|
-
response:
|
27
|
-
status:
|
16
|
+
X-Parse-Master-Key:
|
17
|
+
- ""
|
18
|
+
X-Parse-Rest-Api-Key:
|
19
|
+
- jYdptjS76YHikuIFfJEgHD8UMIjH6cp2rWz4fo2C
|
20
|
+
X-Parse-Application-Id:
|
21
|
+
- hnJRtntbYPvWfjqcqLZsdFaOKT0F3SfNU7Kc7woN
|
22
|
+
X-Parse-Session-Token:
|
23
|
+
- ""
|
24
|
+
Expect:
|
25
|
+
- ""
|
26
|
+
response:
|
27
|
+
status:
|
28
28
|
code: 201
|
29
|
-
message:
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
-
|
34
|
-
|
35
|
-
|
36
|
-
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
-
|
43
|
-
|
44
|
-
|
45
|
-
-
|
46
|
-
|
47
|
-
|
48
|
-
-
|
49
|
-
|
50
|
-
|
51
|
-
-
|
52
|
-
|
53
|
-
|
54
|
-
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
OyBkb21haW49LnBhcnNlLmNvbTsgcGF0aD0vOyBleHBpcmVzPVN1biwgMDkt
|
59
|
-
T2N0LTIwMjIgMjE6NDU6MzQgR01UOyBzZWN1cmU7IEh0dHBPbmx5
|
60
|
-
!binary "U3RhdHVz":
|
61
|
-
- !binary |-
|
62
|
-
MjAxIENyZWF0ZWQ=
|
63
|
-
!binary "WC1SdW50aW1l":
|
64
|
-
- !binary |-
|
65
|
-
MC4yNDczNTA=
|
66
|
-
!binary "WC1VYS1Db21wYXRpYmxl":
|
67
|
-
- !binary |-
|
68
|
-
SUU9RWRnZSxjaHJvbWU9MQ==
|
69
|
-
!binary "Q29udGVudC1MZW5ndGg=":
|
70
|
-
- !binary |-
|
71
|
-
MTA3
|
72
|
-
!binary "Q29ubmVjdGlvbg==":
|
73
|
-
- !binary |-
|
74
|
-
a2VlcC1hbGl2ZQ==
|
75
|
-
body:
|
29
|
+
message: Created
|
30
|
+
headers:
|
31
|
+
Access-Control-Allow-Origin:
|
32
|
+
- "*"
|
33
|
+
Access-Control-Request-Method:
|
34
|
+
- "*"
|
35
|
+
Cache-Control:
|
36
|
+
- no-cache
|
37
|
+
Content-Type:
|
38
|
+
- application/json; charset=utf-8
|
39
|
+
Date:
|
40
|
+
- Thu, 10 Jan 2013 17:13:29 GMT
|
41
|
+
Location:
|
42
|
+
- https://api.parse.com/1/users/TjN5LVdT83
|
43
|
+
Server:
|
44
|
+
- nginx/1.2.2
|
45
|
+
Set-Cookie:
|
46
|
+
- _parse_session=BAh7BkkiD3Nlc3Npb25faWQGOgZFRiIlNDhiYjExOGE4MzY1ZmEzNGVjN2NmYjUxMzk2YjFjNzk%3D--242cb8875ea6f8b5c353b05bf1b9dcc351e5197e; domain=.parse.com; path=/; expires=Tue, 10-Jan-2023 17:13:29 GMT; secure; HttpOnly
|
47
|
+
Status:
|
48
|
+
- 201 Created
|
49
|
+
X-Runtime:
|
50
|
+
- "0.312384"
|
51
|
+
X-Ua-Compatible:
|
52
|
+
- IE=Edge,chrome=1
|
53
|
+
Content-Length:
|
54
|
+
- "107"
|
55
|
+
Connection:
|
56
|
+
- keep-alive
|
57
|
+
body:
|
76
58
|
encoding: ASCII-8BIT
|
77
|
-
string:
|
78
|
-
eyJjcmVhdGVkQXQiOiIyMDEyLTEwLTA5VDIxOjQ1OjM0LjI4N1oiLCJvYmpl
|
79
|
-
Y3RJZCI6Ikw5Z1ptRVZGRUgiLCJzZXNzaW9uVG9rZW4iOiJjejU0YmtmMm8w
|
80
|
-
eXg4dDF5cnpvMndjMHE4In0=
|
59
|
+
string: "{\"createdAt\":\"2013-01-10T17:13:29.400Z\",\"objectId\":\"TjN5LVdT83\",\"sessionToken\":\"ltj1s0ms3rft92u1avdnys7vn\"}"
|
81
60
|
http_version:
|
82
|
-
recorded_at:
|
61
|
+
recorded_at: Thu, 10 Jan 2013 17:13:29 GMT
|
83
62
|
recorded_with: VCR 2.0.1
|
data/lib/parse/client.rb
CHANGED
@@ -8,14 +8,13 @@ module Parse
|
|
8
8
|
# API server. Currently uses the Patron library for low-level HTTP
|
9
9
|
# communication.
|
10
10
|
class Client
|
11
|
-
DEFAULT_RETRIES = 2
|
12
|
-
|
13
11
|
attr_accessor :host
|
14
12
|
attr_accessor :application_id
|
15
13
|
attr_accessor :api_key
|
16
14
|
attr_accessor :master_key
|
17
15
|
attr_accessor :session_token
|
18
16
|
attr_accessor :session
|
17
|
+
attr_accessor :max_retries
|
19
18
|
|
20
19
|
def initialize(data = {})
|
21
20
|
@host = data[:host] || Protocol::HOST
|
@@ -23,6 +22,7 @@ module Parse
|
|
23
22
|
@api_key = data[:api_key]
|
24
23
|
@master_key = data[:master_key]
|
25
24
|
@session_token = data[:session_token]
|
25
|
+
@max_retries = data[:max_retries] || 3
|
26
26
|
@session = Patron::Session.new
|
27
27
|
@session.timeout = 30
|
28
28
|
@session.connect_timeout = 30
|
@@ -37,7 +37,7 @@ module Parse
|
|
37
37
|
# with common basic response handling. Will raise a
|
38
38
|
# ParseProtocolError if the response has an error status code,
|
39
39
|
# and will return the parsed JSON body on success, if there is one.
|
40
|
-
def request(uri, method = :get, body = nil, query = nil
|
40
|
+
def request(uri, method = :get, body = nil, query = nil)
|
41
41
|
@session.headers[Protocol::HEADER_MASTER_KEY] = @master_key
|
42
42
|
@session.headers[Protocol::HEADER_API_KEY] = @api_key
|
43
43
|
@session.headers[Protocol::HEADER_APP_ID] = @application_id
|
data/lib/parse/protocol.rb
CHANGED
@@ -48,6 +48,8 @@ module Parse
|
|
48
48
|
# of Parse objects in their JSON representation.
|
49
49
|
KEY_UPDATED_AT = "updatedAt"
|
50
50
|
|
51
|
+
KEY_USER_SESSION_TOKEN = "sessionToken"
|
52
|
+
|
51
53
|
# The JSON key used in the top-level response object
|
52
54
|
# to indicate that the response contains an array of objects.
|
53
55
|
RESPONSE_KEY_RESULTS = "results"
|
@@ -71,11 +73,13 @@ module Parse
|
|
71
73
|
# The JSON key used to identify the datatype of a special value.
|
72
74
|
KEY_TYPE = "__type"
|
73
75
|
|
76
|
+
TYPE_OBJECT = "Object"
|
77
|
+
|
74
78
|
# The JSON key used to specify the numerical value in the
|
75
79
|
# increment/decrement API call.
|
76
80
|
KEY_AMOUNT = "amount"
|
77
81
|
|
78
|
-
|
82
|
+
RESERVED_KEYS = [ KEY_CLASS_NAME, KEY_CREATED_AT, KEY_OBJECT_ID, KEY_UPDATED_AT, KEY_USER_SESSION_TOKEN]
|
79
83
|
|
80
84
|
# Other Constants
|
81
85
|
# ----------------------------------------
|
@@ -118,8 +122,6 @@ module Parse
|
|
118
122
|
USER_LOGIN_URI = "/#{VERSION}/login"
|
119
123
|
PASSWORD_RESET_URI = "/#{VERSION}/requestPasswordReset"
|
120
124
|
|
121
|
-
KEY_USER_SESSION_TOKEN = "sessionToken"
|
122
|
-
|
123
125
|
CLOUD_FUNCTIONS_PATH = "functions"
|
124
126
|
|
125
127
|
BATCH_REQUEST_URI = "batch"
|
data/lib/parse/query.rb
CHANGED
@@ -10,6 +10,7 @@ module Parse
|
|
10
10
|
attr_accessor :limit
|
11
11
|
attr_accessor :skip
|
12
12
|
attr_accessor :count
|
13
|
+
attr_accessor :include
|
13
14
|
|
14
15
|
def initialize(cls_name)
|
15
16
|
@class_name = cls_name
|
@@ -29,6 +30,11 @@ module Parse
|
|
29
30
|
end
|
30
31
|
#private :add_constraint
|
31
32
|
|
33
|
+
def includes(class_name)
|
34
|
+
@includes = class_name
|
35
|
+
self
|
36
|
+
end
|
37
|
+
|
32
38
|
def or(query)
|
33
39
|
raise ArgumentError, "you must pass an entire #{self.class} to \#or" unless query.is_a?(self.class)
|
34
40
|
@ors << query
|
@@ -85,22 +91,11 @@ module Parse
|
|
85
91
|
self
|
86
92
|
end
|
87
93
|
|
88
|
-
def in_query(field, query)
|
94
|
+
def in_query(field, query=nil)
|
89
95
|
query_hash = {Parse::Protocol::KEY_CLASS_NAME => query.class_name, "where" => query.where}
|
90
96
|
add_constraint(field, "$inQuery" => query_hash)
|
91
97
|
self
|
92
98
|
end
|
93
|
-
|
94
|
-
def set_limit(num)
|
95
|
-
@limit = num
|
96
|
-
self
|
97
|
-
end
|
98
|
-
|
99
|
-
def set_order(field, order = :ascending)
|
100
|
-
@order_by = field
|
101
|
-
@order = order
|
102
|
-
self
|
103
|
-
end
|
104
99
|
|
105
100
|
def count
|
106
101
|
@count = true
|
@@ -120,12 +115,9 @@ module Parse
|
|
120
115
|
if @class_name == Parse::Protocol::CLASS_USER
|
121
116
|
uri = Protocol.user_uri
|
122
117
|
end
|
123
|
-
|
124
|
-
|
125
118
|
query = { "where" => CGI.escape(where_as_json.to_json) }
|
126
119
|
set_order(query)
|
127
|
-
[:count, :limit, :skip].each {|a| merge_attribute(a, query)}
|
128
|
-
|
120
|
+
[:count, :limit, :skip, :include].each {|a| merge_attribute(a, query)}
|
129
121
|
response = Parse.client.request uri, :get, nil, query
|
130
122
|
Parse.parse_json class_name, response
|
131
123
|
end
|
data/lib/parse/user.rb
CHANGED
@@ -5,7 +5,7 @@ require 'parse/object'
|
|
5
5
|
|
6
6
|
module Parse
|
7
7
|
class User < Parse::Object
|
8
|
-
|
8
|
+
|
9
9
|
def self.authenticate(username, password)
|
10
10
|
body = {
|
11
11
|
"username" => username,
|
@@ -13,7 +13,8 @@ module Parse
|
|
13
13
|
}
|
14
14
|
|
15
15
|
response = Parse.client.request(Parse::Protocol::USER_LOGIN_URI, :get, nil, body)
|
16
|
-
|
16
|
+
Parse.client.session_token = response[Parse::Protocol::KEY_USER_SESSION_TOKEN]
|
17
|
+
|
17
18
|
new(response)
|
18
19
|
end
|
19
20
|
|
@@ -27,10 +28,10 @@ module Parse
|
|
27
28
|
data["password"] = data[:password] if data[:password]
|
28
29
|
super(Parse::Protocol::CLASS_USER, data)
|
29
30
|
end
|
30
|
-
|
31
|
+
|
31
32
|
def uri
|
32
33
|
Protocol.user_uri @parse_object_id
|
33
34
|
end
|
34
|
-
|
35
|
+
|
35
36
|
end
|
36
37
|
end
|
data/lib/parse/util.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'pp'
|
1
2
|
module Parse
|
2
3
|
|
3
4
|
# Parse a JSON representation into a fully instantiated
|
@@ -46,6 +47,8 @@ module Parse
|
|
46
47
|
Parse::GeoPoint.new obj
|
47
48
|
when Protocol::TYPE_FILE
|
48
49
|
Parse::File.new obj
|
50
|
+
when Protocol::TYPE_OBJECT # used for relation queries, e.g. "?include=post"
|
51
|
+
Parse::Object.new(obj[Parse::Protocol::KEY_CLASS_NAME], obj)
|
49
52
|
end
|
50
53
|
end
|
51
54
|
end
|
data/parse-ruby-client.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "parse-ruby-client"
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.10"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Alan deLevie", "Adam Alpern"]
|
12
|
-
s.date = "2013-01-
|
12
|
+
s.date = "2013-01-12"
|
13
13
|
s.description = "A simple Ruby client for the parse.com REST API"
|
14
14
|
s.email = "adelevie@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
data/test/test_client.rb
CHANGED
@@ -10,7 +10,7 @@ class TestClient < Test::Unit::TestCase
|
|
10
10
|
response = mock()
|
11
11
|
response.stubs(:body).returns({'code' => Parse::Protocol::ERROR_TIMEOUT}.to_json)
|
12
12
|
response.stubs(:status).returns(400)
|
13
|
-
@client.session.expects(:request).times(
|
13
|
+
@client.session.expects(:request).times(@client.max_retries + 1).returns(response)
|
14
14
|
assert_raise do
|
15
15
|
@client.request(nil)
|
16
16
|
end
|
data/test/test_user.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
3
|
class TestUser < Test::Unit::TestCase
|
4
|
-
|
4
|
+
|
5
5
|
def setup
|
6
6
|
Parse.init
|
7
7
|
end
|
@@ -19,42 +19,45 @@ class TestUser < Test::Unit::TestCase
|
|
19
19
|
assert_equal user[Parse::Protocol::KEY_CREATED_AT].class, String
|
20
20
|
end
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
def test_user_login
|
24
24
|
#VCR.use_cassette('test_user_login', :record => :new_episodes) do
|
25
25
|
u = "alan" + rand(10000000000000).to_s
|
26
26
|
data = {
|
27
|
-
:username => u,
|
27
|
+
:username => u,
|
28
28
|
:password => "secret"
|
29
29
|
}
|
30
30
|
|
31
31
|
user = Parse::User.new(data)
|
32
32
|
|
33
33
|
user.save
|
34
|
-
|
34
|
+
|
35
35
|
assert_equal user["username"], u
|
36
36
|
assert_equal user[Parse::Protocol::KEY_USER_SESSION_TOKEN].class, String
|
37
|
-
|
37
|
+
|
38
38
|
login = Parse::User.authenticate(u, "secret")
|
39
|
-
|
39
|
+
|
40
40
|
assert_equal login["username"], user["username"]
|
41
41
|
assert_equal login["sessionToken"].class, String
|
42
|
+
|
43
|
+
user = user.pointer.get
|
44
|
+
user.save
|
42
45
|
#end
|
43
46
|
end
|
44
47
|
|
45
48
|
def test_reset_password
|
46
|
-
u = "alan" + rand(10000000000000).to_s + "@gmail.com"
|
49
|
+
u = "alan" + rand(10000000000000).to_s + "@gmail.com"
|
47
50
|
data = {
|
48
|
-
:username => u,
|
51
|
+
:username => u,
|
49
52
|
:password => "secret"
|
50
53
|
}
|
51
54
|
|
52
55
|
user = Parse::User.new(data)
|
53
56
|
|
54
57
|
user.save
|
55
|
-
|
58
|
+
|
56
59
|
reset_password = Parse::User.reset_password(u)
|
57
|
-
|
60
|
+
|
58
61
|
assert true
|
59
62
|
end
|
60
63
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: parse-ruby-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.10
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-01-
|
13
|
+
date: 2013-01-12 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: patron
|
@@ -237,7 +237,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
237
237
|
version: '0'
|
238
238
|
segments:
|
239
239
|
- 0
|
240
|
-
hash:
|
240
|
+
hash: 1980852008607816263
|
241
241
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
242
242
|
none: false
|
243
243
|
requirements:
|