parse-ruby-client 0.0.3 → 0.0.4

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 CHANGED
@@ -17,7 +17,7 @@ This currently depends on the gems 'json' and 'patron' for JSON support and HTTP
17
17
 
18
18
  ## Installation
19
19
 
20
- `gem "parse-ruby-client", "~> 0.0.3"`
20
+ `gem "parse-ruby-client", "~> 0.0.4"`
21
21
 
22
22
  ---
23
23
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.3
1
+ 0.0.4
@@ -21,3 +21,4 @@ require 'parse/query'
21
21
  require 'parse/datatypes'
22
22
  require 'parse/util'
23
23
  require 'parse/protocol'
24
+ require 'parse/user'
@@ -19,6 +19,7 @@ module Parse
19
19
  @api_key = data[:api_key]
20
20
  @session = Patron::Session.new
21
21
  @session.timeout = 10
22
+ @session.connect_timeout = 10
22
23
 
23
24
  @session.base_url = "https://#{host}"
24
25
  @session.headers["Content-Type"] = "application/json"
@@ -14,12 +14,16 @@ module Parse
14
14
  @parse_object_id = data[Protocol::KEY_OBJECT_ID]
15
15
  end
16
16
 
17
- def to_json(*a)
17
+ def as_json(*a)
18
18
  {
19
19
  Protocol::KEY_TYPE => Protocol::TYPE_POINTER,
20
20
  Protocol::KEY_CLASS_NAME => @class_name,
21
21
  Protocol::KEY_OBJECT_ID => @parse_object_id
22
- }.to_json(*a)
22
+ }
23
+ end
24
+
25
+ def to_json(*a)
26
+ as_json.to_json(*a)
23
27
  end
24
28
 
25
29
  # Retrieve the Parse object referenced by this pointer.
@@ -44,11 +48,15 @@ module Parse
44
48
  end
45
49
  end
46
50
 
47
- def to_json(*a)
51
+ def as_json(*a)
48
52
  {
49
53
  Protocol::KEY_TYPE => Protocol::TYPE_DATE,
50
54
  "iso" => value.iso8601
51
- }.to_json(*a)
55
+ }
56
+ end
57
+
58
+ def to_json(*a)
59
+ as_json.to_json(*a)
52
60
  end
53
61
  end
54
62
 
@@ -63,11 +71,15 @@ module Parse
63
71
  @value = Base64.decode64(bytes)
64
72
  end
65
73
 
66
- def to_json(*a)
74
+ def as_json(*a)
67
75
  {
68
76
  Protocol::KEY_TYPE => Protocol::TYPE_BYTES,
69
77
  "base64" => Base64.encode64(@value)
70
- }.to_json(*a)
78
+ }
79
+ end
80
+
81
+ def to_json(*a)
82
+ as_json.to_json(*a)
71
83
  end
72
84
  end
73
85
 
@@ -82,11 +94,15 @@ module Parse
82
94
  @amount = amount
83
95
  end
84
96
 
85
- def to_json(*a)
97
+ def as_json(*a)
86
98
  {
87
99
  Protocol::KEY_OP => Protocol::KEY_INCREMENT,
88
100
  Protocol::KEY_AMOUNT => @amount
89
- }.to_json(*a)
101
+ }
102
+ end
103
+
104
+ def to_json(*a)
105
+ as_json.to_json(*a)
90
106
  end
91
107
  end
92
108
 
@@ -98,11 +114,15 @@ module Parse
98
114
  @amount = amount
99
115
  end
100
116
 
101
- def to_json(*a)
117
+ def as_json(*a)
102
118
  {
103
119
  Protocol::KEY_OP => Protocol::KEY_DECREMENT,
104
120
  Protocol::KEY_AMOUNT => @amount
105
- }.to_json(*a)
121
+ }
122
+ end
123
+
124
+ def to_json(*a)
125
+ as_json.to_json(*a)
106
126
  end
107
127
  end
108
128
 
@@ -123,12 +143,16 @@ module Parse
123
143
  end
124
144
  end
125
145
 
126
- def to_json(*a)
146
+ def as_json(*a)
127
147
  {
128
148
  Protocol::KEY_TYPE => Protocol::TYPE_GEOPOINT,
129
149
  "latitude" => @latitude,
130
150
  "longitude" => @longitude
131
- }.to_json(*a)
151
+ }
152
+ end
153
+
154
+ def to_json(*a)
155
+ as_json.to_json(*a)
132
156
  end
133
157
  end
134
158
 
@@ -5,11 +5,12 @@ require 'parse/error'
5
5
  module Parse
6
6
 
7
7
  # Represents an individual Parse API object.
8
- class Object < Hash
8
+ class Object < Hash
9
9
  attr_reader :parse_object_id
10
10
  attr_reader :class_name
11
11
  attr_reader :created_at
12
12
  attr_reader :updated_at
13
+ alias :id :parse_object_id
13
14
 
14
15
  def initialize(class_name, data = nil)
15
16
  @class_name = class_name
@@ -45,17 +46,22 @@ module Parse
45
46
  @updated_at = DateTime.parse data[Protocol::KEY_UPDATED_AT]
46
47
  end
47
48
 
48
- self.merge! data
49
+ data.each do |k,v|
50
+ if k.is_a? Symbol
51
+ k = k.to_s
52
+ end
53
+ #if Protocol::RESERVED_KEYS.include? k
54
+ self[k] = v
55
+ #end
56
+ end
57
+
58
+ self
59
+ end
49
60
 
50
- #data.each { |k,v|
51
- # if k.is_a? Symbol
52
- # k = k.to_s
53
- # end
54
- # if !Protocol::RESERVED_KEYS.include? k
55
- # self[k] = v
56
- # end
57
- #}
61
+ def new?
62
+ self["objectId"].nil?
58
63
  end
64
+
59
65
  private :parse
60
66
 
61
67
  # Write the current state of the local object to the API.
@@ -63,13 +69,22 @@ module Parse
63
69
  # a new object, otherwise it will update the existing stored object.
64
70
  def save
65
71
  method = @parse_object_id ? :put : :post
72
+
66
73
  Protocol::RESERVED_KEYS.each { |k| self.delete(k) }
67
74
  body = self.to_json
68
75
 
69
76
  data = Parse.client.request(self.uri, method, body)
77
+
70
78
  if data
71
79
  parse data
72
80
  end
81
+
82
+ if @class_name == Parse::Protocol::CLASS_USER
83
+ self.delete("password")
84
+ self.delete(:username)
85
+ self.delete(:password)
86
+ end
87
+
73
88
  self
74
89
  end
75
90
 
@@ -82,6 +97,7 @@ module Parse
82
97
  parse data
83
98
  end
84
99
  end
100
+
85
101
  self
86
102
  end
87
103
 
@@ -90,7 +106,9 @@ module Parse
90
106
  if @parse_object_id
91
107
  response = Parse.client.delete self.uri
92
108
  end
93
- nil
109
+
110
+ self.clear
111
+ self
94
112
  end
95
113
 
96
114
  # Increment the given field by an amount, which defaults to 1.
@@ -59,7 +59,7 @@ module Parse
59
59
  # increment/decrement API call.
60
60
  KEY_AMOUNT = "amount"
61
61
 
62
- RESERVED_KEYS = [ KEY_CLASS_NAME, KEY_CREATED_AT, KEY_OBJECT_ID ]
62
+ RESERVED_KEYS = [ KEY_CLASS_NAME, KEY_CREATED_AT, KEY_OBJECT_ID ]
63
63
 
64
64
  # Other Constants
65
65
  # ----------------------------------------
@@ -92,6 +92,9 @@ module Parse
92
92
 
93
93
  # The class name for User objects, when referenced by a Pointer.
94
94
  CLASS_USER = "_User"
95
+ USER_LOGIN_URI = "/#{VERSION}/login"
96
+
97
+ KEY_USER_SESSION_TOKEN = "sessionToken"
95
98
 
96
99
  # URI Helpers
97
100
  # ----------------------------------------
@@ -105,6 +108,7 @@ module Parse
105
108
  "/#{VERSION}/classes/#{class_name}"
106
109
  end
107
110
  end
111
+
108
112
 
109
113
  # Construct a uri referencing a given Parse user
110
114
  # instance or the users category.
@@ -0,0 +1,39 @@
1
+ require 'parse/protocol'
2
+ require 'parse/client'
3
+ require 'parse/error'
4
+ require 'parse/object'
5
+
6
+ module Parse
7
+ class User < Parse::Object
8
+
9
+ def self.authenticate(username, password)
10
+ body = {
11
+ "username" => username,
12
+ "password" => password
13
+ }
14
+
15
+ response = Parse.client.request(Parse::Protocol::USER_LOGIN_URI, :get, nil, body)
16
+
17
+ new(response)
18
+ end
19
+
20
+ def initialize(data = nil)
21
+ @class_name = Parse::Protocol::CLASS_USER
22
+
23
+ #stringify symbol keys
24
+ data["username"] = data[:username] if data[:username]
25
+ data["password"] = data[:password] if data[:password]
26
+
27
+ if data
28
+ parse data
29
+ end
30
+
31
+ self
32
+ end
33
+
34
+ def uri
35
+ Protocol.user_uri @parse_object_id
36
+ end
37
+
38
+ end
39
+ end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "parse-ruby-client"
8
- s.version = "0.0.3"
8
+ s.version = "0.0.4"
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 = "2012-02-20"
12
+ s.date = "2012-04-06"
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 = [
@@ -32,6 +32,7 @@ Gem::Specification.new do |s|
32
32
  "lib/parse/object.rb",
33
33
  "lib/parse/protocol.rb",
34
34
  "lib/parse/query.rb",
35
+ "lib/parse/user.rb",
35
36
  "lib/parse/util.rb",
36
37
  "parse-ruby-client.gemspec",
37
38
  "pkg/parse-ruby-client-0.0.1.gem",
@@ -42,7 +43,9 @@ Gem::Specification.new do |s|
42
43
  "test/test_client.rb",
43
44
  "test/test_datatypes.rb",
44
45
  "test/test_init.rb",
45
- "test/test_query.rb"
46
+ "test/test_object.rb",
47
+ "test/test_query.rb",
48
+ "test/test_user.rb"
46
49
  ]
47
50
  s.homepage = "http://github.com/adelevie/parse-ruby-client"
48
51
  s.licenses = ["MIT"]
@@ -29,4 +29,13 @@ class TestClient < Test::Unit::TestCase
29
29
  assert_equal foo["age"], 40
30
30
  assert_equal foo[Parse::Protocol::KEY_UPDATED_AT].class, String
31
31
  end
32
+
33
+ def test_destroy
34
+ d = Parse::Object.new "toBeDeleted"
35
+ d["foo"] = "bar"
36
+ d.save
37
+ d.parse_delete
38
+
39
+ assert_equal d.keys.length, 0
40
+ end
32
41
  end
@@ -0,0 +1,56 @@
1
+ require 'helper'
2
+
3
+ class TestObject < Test::Unit::TestCase
4
+ def setup
5
+ Parse.init
6
+ end
7
+
8
+ def test_new?
9
+ post = Parse::Object.new "Post"
10
+ assert_equal post.new?, true
11
+ post.save
12
+ assert_equal post.new?, false
13
+ end
14
+
15
+ def test_id
16
+ post = Parse::Object.new "Post"
17
+ assert_equal post.id, nil
18
+ post["title"] = "hello world"
19
+ post.save
20
+ assert_equal post.id.class, String
21
+ end
22
+
23
+ def test_created_at
24
+ post = Parse::Object.new "Post"
25
+ assert_equal post.created_at, nil
26
+ post.save
27
+ assert_equal post.created_at.class, DateTime
28
+ end
29
+
30
+ def test_updated_at
31
+ post = Parse::Object.new "Post"
32
+ assert_equal post.updated_at, nil
33
+ post["title"] = "hello"
34
+ post.save
35
+ assert_equal post.updated_at, nil
36
+ post["title"] = "hello 2"
37
+ post.save
38
+ assert_equal post.updated_at.class, DateTime
39
+ end
40
+
41
+ def test_parse_delete
42
+ post = Parse::Object.new "Post"
43
+ post.save
44
+ assert_equal post.id.class, String
45
+
46
+ q = Parse.get("Post", post.id)
47
+ assert_equal q.id, post.id
48
+
49
+ post.parse_delete
50
+
51
+ assert_raise Parse::ParseError do
52
+ q = Parse.get("Post", post.id)
53
+ end
54
+ end
55
+
56
+ end
@@ -3,6 +3,18 @@ require 'helper'
3
3
  Parse.init
4
4
 
5
5
  class TestQuery < Test::Unit::TestCase
6
+
7
+ def test_get
8
+ post = Parse::Object.new "Post"
9
+ post["title"] = "foo"
10
+ post.save
11
+
12
+ q = Parse.get("Post", post.id)
13
+
14
+ assert_equal q.id, post.id
15
+ assert_equal q["title"], post["title"]
16
+ end
17
+
6
18
  def test_add_contraint
7
19
  # I know this method *should* be private.
8
20
  # But then it would be a PITA to test.
@@ -0,0 +1,41 @@
1
+ require 'helper'
2
+
3
+ class TestUser < Test::Unit::TestCase
4
+
5
+ def setup
6
+ Parse.init
7
+ end
8
+
9
+ def test_save
10
+ username = rand.to_s
11
+ data = {
12
+ :username => username,
13
+ :password => "topsecret"
14
+ }
15
+ user = Parse::User.new data
16
+ user.save
17
+ assert_equal user[Parse::Protocol::KEY_OBJECT_ID].class, String
18
+ assert_equal user[Parse::Protocol::KEY_CREATED_AT].class, String
19
+ end
20
+
21
+ def test_login
22
+ u = "alan" + rand(10000000000000).to_s
23
+ data = {
24
+ :username => u,
25
+ :password => "secret"
26
+ }
27
+
28
+ user = Parse::User.new(data)
29
+
30
+ user.save
31
+
32
+ assert_equal user["username"], u
33
+ assert_equal user[Parse::Protocol::KEY_USER_SESSION_TOKEN].class, String
34
+
35
+ login = Parse::User.authenticate(u, "secret")
36
+
37
+ assert_equal login["username"], user["username"]
38
+ assert_equal login["sessionToken"].class, String
39
+ end
40
+
41
+ end
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.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-02-20 00:00:00.000000000Z
13
+ date: 2012-04-06 00:00:00.000000000Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: patron
17
- requirement: &70330439891380 !ruby/object:Gem::Requirement
17
+ requirement: &70183947794580 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: '0'
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *70330439891380
25
+ version_requirements: *70183947794580
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: shoulda
28
- requirement: &70330439890500 !ruby/object:Gem::Requirement
28
+ requirement: &70183947794100 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
- version_requirements: *70330439890500
36
+ version_requirements: *70183947794100
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: bundler
39
- requirement: &70330439889720 !ruby/object:Gem::Requirement
39
+ requirement: &70183947793620 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ~>
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: 1.0.0
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *70330439889720
47
+ version_requirements: *70183947793620
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: jeweler
50
- requirement: &70330439889080 !ruby/object:Gem::Requirement
50
+ requirement: &70183947793140 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ~>
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: 1.6.4
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *70330439889080
58
+ version_requirements: *70183947793140
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: rcov
61
- requirement: &70330439888560 !ruby/object:Gem::Requirement
61
+ requirement: &70183947792660 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ! '>='
@@ -66,7 +66,7 @@ dependencies:
66
66
  version: '0'
67
67
  type: :development
68
68
  prerelease: false
69
- version_requirements: *70330439888560
69
+ version_requirements: *70183947792660
70
70
  description: A simple Ruby client for the parse.com REST API
71
71
  email: adelevie@gmail.com
72
72
  executables: []
@@ -90,6 +90,7 @@ files:
90
90
  - lib/parse/object.rb
91
91
  - lib/parse/protocol.rb
92
92
  - lib/parse/query.rb
93
+ - lib/parse/user.rb
93
94
  - lib/parse/util.rb
94
95
  - parse-ruby-client.gemspec
95
96
  - pkg/parse-ruby-client-0.0.1.gem
@@ -100,7 +101,9 @@ files:
100
101
  - test/test_client.rb
101
102
  - test/test_datatypes.rb
102
103
  - test/test_init.rb
104
+ - test/test_object.rb
103
105
  - test/test_query.rb
106
+ - test/test_user.rb
104
107
  homepage: http://github.com/adelevie/parse-ruby-client
105
108
  licenses:
106
109
  - MIT
@@ -116,7 +119,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
116
119
  version: '0'
117
120
  segments:
118
121
  - 0
119
- hash: -4138204071645448362
122
+ hash: 4137621541877558226
120
123
  required_rubygems_version: !ruby/object:Gem::Requirement
121
124
  none: false
122
125
  requirements: