parsecom 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -42,15 +42,16 @@ Yet-Another Parse.com Library written in Pure Ruby
42
42
  - [Uploading Files](#uploading-files)
43
43
  - [Associating with Objects](#associating-with-objects)
44
44
  - [Deleting Files](#deleting-files)
45
- - [Analytics](#analytics)
46
- - [TBD](#tbd-2)
47
- - [Push Notifications](#push-notifications)
48
- - [TBD](#tbd-3)
49
45
  - [Installations](#installations)
50
- - [TBD](#tbd-4)
46
+ - [Uploading Installation Data](#uploading-installation-data)
47
+ - [Retrieving Installations](#retrieving-installations)
48
+ - [Updating Installations](#updating-installations)
49
+ - [Querying Installations](#querying-installations)
50
+ - [Deleting Installations](#deleting-installations)
51
51
  - [Cloud Functions](#cloud-functions)
52
52
  - [GeoPoints](#geopoints)
53
- - [TBD](#tbd-5)
53
+ - [GeoPoint](#geopoint)
54
+ - [Geo Queries](#geo-queries)
54
55
  - [Security](#security)
55
56
 
56
57
  ## Usage
@@ -345,7 +346,7 @@ game_scores = GameScore.find :where => proc {
345
346
 
346
347
  #### Counting Objects
347
348
 
348
- ##### TBD
349
+ TBD
349
350
 
350
351
  #### Compound Queries
351
352
 
@@ -404,7 +405,7 @@ user.delete
404
405
 
405
406
  #### Linking Users
406
407
 
407
- ##### TBD
408
+ TBD
408
409
 
409
410
  ### Roles
410
411
 
@@ -487,15 +488,47 @@ file.delete!
487
488
 
488
489
  ### Analytics
489
490
 
490
- #### TBD
491
+ TBD
491
492
 
492
493
  ### Push Notifications
493
494
 
494
- #### TBD
495
+ TBD
495
496
 
496
497
  ### Installations
497
498
 
498
- #### TBD
499
+ #### Uploading Installation Data
500
+
501
+ ```ruby
502
+ installation = Parse::Installation.new :deviceType => 'ios', :deviceToken => '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef', :channels => ['']
503
+ installation.save
504
+ ```
505
+
506
+ #### Retrieving Installations
507
+
508
+ ```ruby
509
+ installation = Parse::Installation.find_by_id :mrmBZvsErB
510
+ ```
511
+
512
+ #### Updating Installations
513
+
514
+ ```ruby
515
+ installation = Parse::Installation.find_by_id :mrmBZvsErB
516
+ installation.channels = ['', 'foo']
517
+ installation.save
518
+ ```
519
+
520
+ #### Querying Installations
521
+
522
+ ```ruby
523
+ installations = Parse::Installation.find! :all
524
+ ```
525
+
526
+ #### Deleting Installations
527
+
528
+ ```ruby
529
+ installation = Parse::Installation.find_by_id :mrmBZvsErB
530
+ installation.delete!
531
+ ```
499
532
 
500
533
  ### Cloud Functions
501
534
 
@@ -506,7 +539,36 @@ client.hello
506
539
 
507
540
  ### GeoPoints
508
541
 
509
- #### TBD
542
+ #### GeoPoint
543
+
544
+ ```ruby
545
+ geo_point = Parse::GeoPoint.new :latitude => 40.0, :longitude => -30.0
546
+ place = PlaceObject.new :location => geo_point
547
+ ```
548
+
549
+ #### Geo Queries
550
+
551
+ ```ruby
552
+ place = PlaceObject.find :limit => 10, :where => proc {
553
+ geo_point = Parse::GeoPoint.new :latitude => 30.0, :longitude => -20.0
554
+ column(:location).near_sphere geop_point
555
+ }
556
+ ```
557
+
558
+ ```ruby
559
+ places = PlaceObject.find :limit => 10, :where => proc {
560
+ geo_point = Parse::GeoPoint.new :latitude => 30.0, :longitude => -20.0
561
+ column(:location).near_sphere(geop_point).max_distance_in_miles(10.0)
562
+ }
563
+ ```
564
+
565
+ ```ruby
566
+ places = PizzaPlaceObject.find :limit => 10, :where => proc {
567
+ southwest = Parse::GeoPoint.new :latitude => 37.71, :longitude => -122.53
568
+ northeast = Parse::GeoPoint.new :latitude => 30.82, :longitude => -122.37
569
+ column(:location).within(southwest, northeast)
570
+ }
571
+ ```
510
572
 
511
573
  ### Security
512
574
 
data/lib/parse/client.rb CHANGED
@@ -29,11 +29,8 @@ module Parse
29
29
  end
30
30
 
31
31
  def canonical_endpoint endpoint
32
- case endpoint
33
- when %r|/#{API_VERSION}/classes/_User|
34
- endpoint.sub %r|/#{API_VERSION}/classes/_User|, "/#{API_VERSION}/users"
35
- when %r|/#{API_VERSION}/classes/_Role|
36
- endpoint.sub %r|/#{API_VERSION}/classes/_Role|, "/#{API_VERSION}/roles"
32
+ if endpoint =~ %r</#{API_VERSION}/classes/_(User|Role|Installation)>
33
+ endpoint.sub %r</#{API_VERSION}/classes/_(User|Role|Installation)>, "/#{API_VERSION}/#{$1.downcase}s"
37
34
  else
38
35
  endpoint
39
36
  end
data/lib/parse/file.rb CHANGED
@@ -1,10 +1,13 @@
1
1
  # encoding:utf-8
2
2
  module Parse
3
3
  class File
4
+ include Util
5
+
4
6
  attr_accessor :name, :url, :content, :type
5
7
 
6
8
  def initialize hash
7
- @name = hash['name'] || hash[:name]
9
+ hash = string_keyed_hash hash
10
+ @name = hash['name']
8
11
  raise 'name is mandatory' unless @name
9
12
  @url = hash['url']
10
13
  @content = hash['content']
@@ -0,0 +1,26 @@
1
+ # coding:utf-8
2
+ module Parse
3
+ class GeoPoint
4
+ include Util
5
+
6
+ attr_accessor :latitude, :longitude
7
+
8
+ def initialize hash={}
9
+ hash = string_keyed_hash hash
10
+ @latitude = hash['latitude']
11
+ @longitude = hash['longitude']
12
+ end
13
+
14
+ def to_h
15
+ {
16
+ "__type" => "GeoPoint",
17
+ "latitude" => @latitude,
18
+ "longitude" => @longitude
19
+ }
20
+ end
21
+
22
+ def to_json *args
23
+ to_h.to_json
24
+ end
25
+ end
26
+ end
@@ -1,6 +1,10 @@
1
1
  # coding:utf-8
2
2
  module Parse
3
3
  class Installation < Object
4
- # TODO
4
+ class << self
5
+ def parse_class_name
6
+ '_Installation'
7
+ end
8
+ end
5
9
  end
6
10
  end
data/lib/parse/object.rb CHANGED
@@ -7,6 +7,8 @@ module Parse
7
7
  }
8
8
 
9
9
  class Object
10
+ include Parse::Util
11
+
10
12
  @@parse_class_vs_class_table = {}
11
13
 
12
14
  class << self
@@ -97,6 +99,8 @@ module Parse
97
99
  Parse::Pointer.new v, self
98
100
  when 'Relation'
99
101
  Parse::Relation.new self, k, v
102
+ when 'GeoPoint'
103
+ Parse::GeoPoint.new v
100
104
  else
101
105
  v
102
106
  end
@@ -241,14 +245,6 @@ module Parse
241
245
 
242
246
  private
243
247
 
244
- def string_keyed_hash hash
245
- new_hash = {}
246
- hash.each do |k, v|
247
- new_hash[k.to_s] = v
248
- end
249
- new_hash
250
- end
251
-
252
248
  def check_deleted!
253
249
  raise 'This object has already been deleted.' if deleted?
254
250
  end
data/lib/parse/query.rb CHANGED
@@ -236,6 +236,33 @@ module Parse
236
236
  @query.where.push or_cond
237
237
  end
238
238
 
239
+ # conditions for GeoPoints
240
+
241
+ def near_sphere geo_point
242
+ @conditions.push ['$nearSphere', geo_point]
243
+ self
244
+ end
245
+
246
+ def max_distance_in_miles miles
247
+ @conditions.push ['$maxDistanceInMiles', miles]
248
+ self
249
+ end
250
+
251
+ def max_distance_in_kilometers kilometers
252
+ @conditions.push ['$maxDistanceInKilometers', kilometers]
253
+ self
254
+ end
255
+
256
+ def max_distance_in_radians radians
257
+ @conditions.push ['$maxDistanceInRadians', radians]
258
+ self
259
+ end
260
+
261
+ def within southwest_geo_point, northeast_geo_point
262
+ @conditions.push WithinCondition.new(southwest_geo_point, northeast_geo_point)
263
+ self
264
+ end
265
+
239
266
  def to_s
240
267
  if @conditions.size == 1 && !@conditions[0].is_a?(Array)
241
268
  "#{@column_name.to_s.inspect}:#{condition_to_s @conditions[0]}"
@@ -253,8 +280,11 @@ module Parse
253
280
  case val
254
281
  when Parse::Object
255
282
  %Q|{"__type":"Pointer","className":"#{val.parse_class_name}","objectId":"#{val.parse_object_id}"}|
283
+ when Parse::GeoPoint
284
+ val.to_json
256
285
  else
257
286
  val.inspect
287
+ #val.to_json
258
288
  end
259
289
  end
260
290
 
@@ -293,6 +323,17 @@ module Parse
293
323
  %Q|"$relatedTo":{"object":#{@pointer.to_json},"key":"#{@column_name}"}|
294
324
  end
295
325
  end
326
+
327
+ class WithinCondition
328
+ def initialize southwest_geo_point, northeast_geo_point
329
+ @southwest_geo_point = southwest_geo_point
330
+ @northeast_geo_point = northeast_geo_point
331
+ end
332
+
333
+ def to_s
334
+ %Q|{"$within":{"$box":[#{@southwest_geo_point.to_json},#{@northeast_geo_point.to_json}]}}|
335
+ end
336
+ end
296
337
  end
297
338
 
298
339
  def Query parse_class_name=nil
data/lib/parse/util.rb ADDED
@@ -0,0 +1,11 @@
1
+ module Parse
2
+ module Util
3
+ def string_keyed_hash hash
4
+ new_hash = {}
5
+ hash.each do |k, v|
6
+ new_hash[k.to_s] = v
7
+ end
8
+ new_hash
9
+ end
10
+ end
11
+ end
data/lib/parse/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Parse
2
- VERSION = "0.3.0"
2
+ VERSION = "0.4.0"
3
3
  end
data/lib/parsecom.rb CHANGED
@@ -8,6 +8,7 @@ require 'date'
8
8
  require 'net/https'
9
9
  require 'uri'
10
10
  require 'parse/ext/string'
11
+ require 'parse/util'
11
12
  require 'parse/http_client'
12
13
  require 'parse/client'
13
14
  require 'parse/query'
@@ -16,6 +17,7 @@ require 'parse/object'
16
17
  require 'parse/user'
17
18
  require 'parse/role'
18
19
  require 'parse/installation'
20
+ require 'parse/geo_point'
19
21
  require 'parse/pointer'
20
22
  require 'parse/relation'
21
23
  require 'parse/file'
@@ -132,6 +132,26 @@ describe Parse::Query, 'when it builds conditions' do
132
132
  end
133
133
  query.to_params.should have_params('where' => '{"$or":[{"wins":{"$gt":150}},{"wins":{"$lt":5}},{"loses":{"$lt":5}}]}')
134
134
  query.where.clear
135
+
136
+ geo_point1 = Parse::GeoPoint.new :latitude => 12, :longitude => 34
137
+ geo_point2 = Parse::GeoPoint.new :latitude => 56, :longitude => 78
138
+ query.where do
139
+ column(:location).near_sphere(geo_point1)
140
+ end
141
+ query.to_params.should have_params('where' => '{"location":{"$nearSphere":{"__type":"GeoPoint","latitude":12,"longitude":34}}}')
142
+ query.where.clear
143
+
144
+ query.where do
145
+ column(:location).near_sphere(geo_point1).max_distance_in_miles(10)
146
+ end
147
+ query.to_params.should have_params('where' => '{"location":{"$nearSphere":{"__type":"GeoPoint","latitude":12,"longitude":34},"$maxDistanceInMiles":10}}')
148
+ query.where.clear
149
+
150
+ query.where do
151
+ column(:location).within(geo_point1, geo_point2)
152
+ end
153
+ query.to_params.should have_params('where' => '{"location":{"$within":{"$box":[{"__type":"GeoPoint","latitude":12,"longitude":34},{"__type":"GeoPoint","latitude":56,"longitude":78}]}}}')
154
+ query.where.clear
135
155
  end
136
156
 
137
157
  it 'should build a correct "order" parameter' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parsecom
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-10-19 00:00:00.000000000 Z
12
+ date: 2013-10-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -79,6 +79,7 @@ files:
79
79
  - lib/parse/cloud_code.rb
80
80
  - lib/parse/ext/string.rb
81
81
  - lib/parse/file.rb
82
+ - lib/parse/geo_point.rb
82
83
  - lib/parse/http_client.rb
83
84
  - lib/parse/installation.rb
84
85
  - lib/parse/object.rb
@@ -94,6 +95,7 @@ files:
94
95
  - lib/parse/relation.rb
95
96
  - lib/parse/role.rb
96
97
  - lib/parse/user.rb
98
+ - lib/parse/util.rb
97
99
  - lib/parse/version.rb
98
100
  - lib/parsecom.rb
99
101
  - parsecom.gemspec