urbanairship 2.3.3 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.markdown CHANGED
@@ -38,6 +38,12 @@ Unregistering a device token
38
38
  Urbanairship.unregister_device('DEVICE-TOKEN')
39
39
  ```
40
40
 
41
+ Retrieving Device Info
42
+ ----------------------------
43
+ ```ruby
44
+ Urbanairship.device_info('DEVICE-TOKEN')
45
+ ```
46
+
41
47
  Sending a push notification
42
48
  ---------------------------
43
49
  ```ruby
@@ -52,6 +58,12 @@ Urbanairship.push(notification) # =>
52
58
  # "scheduled_notifications" => ["https://go.urbanairship.com/api/push/scheduled/123456"]
53
59
  # }
54
60
  ```
61
+
62
+ If you wish to use v3 of the Urbanairship API, just add `version: 3` as an option:
63
+
64
+ ```ruby
65
+ Urbanairship.push(notification, version: 3)
66
+ ```
55
67
  ### Using aliases instead of device tokens ###
56
68
 
57
69
  ```ruby
@@ -198,6 +210,17 @@ Urbanairship.update_segment('abcd-efgh-ijkl', {
198
210
  Urbanairship.delete_segment("abcd-efgh-ijkl") # => {}
199
211
  ```
200
212
 
213
+ Getting your device tokens
214
+ -------------------------------------
215
+ ```ruby
216
+ Urbanairship.device_tokens # =>
217
+ # {
218
+ # "device_tokens" => {"device_token"=>"<token>", "active"=>true, "alias"=>"<alias>", "tags"=>[]},
219
+ # "device_tokens_count" => 3,
220
+ # "active_device_tokens_count" => 1
221
+ # }
222
+ ```
223
+
201
224
  Getting a count of your device tokens
202
225
  -------------------------------------
203
226
  ```ruby
data/lib/urbanairship.rb CHANGED
@@ -34,27 +34,39 @@ module Urbanairship
34
34
  end
35
35
  end
36
36
 
37
+ def device_info(device_token, options = {})
38
+ if ( (options[:provider] || @provider) == :android ) || ( (options[:provider] || @provider) == 'android' )
39
+ do_request(:get, "/api/apids/#{device_token}", :authenticate_with => :application_secret)
40
+ else
41
+ do_request(:get, "/api/device_tokens/#{device_token}", :authenticate_with => :application_secret)
42
+ end
43
+ end
44
+
37
45
  def delete_scheduled_push(param)
46
+ warn "[DEPRECATED] http://docs.urbanairship.com/reference/api/v3/api-v3-migration-guide.html#api-push-batch"
38
47
  path = param.is_a?(Hash) ? "/api/push/scheduled/alias/#{param[:alias].to_s}" : "/api/push/scheduled/#{param.to_s}"
39
48
  do_request(:delete, path, :authenticate_with => :master_secret)
40
49
  end
41
50
 
42
51
  def push(options = {})
43
- body = parse_push_options(options).to_json
44
- do_request(:post, "/api/push/", :body => body, :authenticate_with => :master_secret)
52
+ body = parse_push_options(options.dup).to_json
53
+ do_request(:post, "/api/push/", :body => body, :authenticate_with => :master_secret, :version => options[:version])
45
54
  end
46
55
 
47
56
  def push_to_segment(options = {})
57
+ warn "[DEPRECATED] http://docs.urbanairship.com/reference/api/v3/api-v3-migration-guide.html#api-push-segments"
48
58
  body = parse_push_options(options).to_json
49
59
  do_request(:post, "/api/push/segments", :body => body, :authenticate_with => :master_secret)
50
60
  end
51
61
 
52
62
  def batch_push(notifications = [])
63
+ warn "[DEPRECATION] http://docs.urbanairship.com/reference/api/v3/api-v3-migration-guide.html#api-push-batch"
53
64
  body = notifications.map{|notification| parse_push_options(notification)}.to_json
54
65
  do_request(:post, "/api/push/batch/", :body => body, :authenticate_with => :master_secret)
55
66
  end
56
67
 
57
68
  def broadcast_push(options = {})
69
+ warn "[DEPRECATED] http://docs.urbanairship.com/reference/api/v3/api-v3-migration-guide.html#api-push-broadcast"
58
70
  body = parse_push_options(options).to_json
59
71
  do_request(:post, "/api/push/broadcast/", :body => body, :authenticate_with => :master_secret)
60
72
  end
@@ -89,6 +101,10 @@ module Urbanairship
89
101
  do_request(:post, "/api/tags/#{params[:tag]}", :body => {provider_field => {:remove => [params[:device_token]]}}.to_json, :authenticate_with => :master_secret)
90
102
  end
91
103
 
104
+ def device_tokens
105
+ do_request(:get, "/api/device_tokens/", :authenticate_with => :master_secret)
106
+ end
107
+
92
108
  def device_tokens_count
93
109
  do_request(:get, "/api/device_tokens/count/", :authenticate_with => :master_secret)
94
110
  end
@@ -124,6 +140,7 @@ module Urbanairship
124
140
  request.basic_auth @application_key, instance_variable_get("@#{options[:authenticate_with]}")
125
141
  request.add_field "Content-Type", options[:content_type] || "application/json"
126
142
  request.body = options[:body] if options[:body]
143
+ request["Accept"] = "application/vnd.urbanairship+json; version=#{options[:version]};" if options[:version]
127
144
 
128
145
  Timer.timeout(request_timeout) do
129
146
  start_time = Time.now
@@ -135,7 +152,7 @@ module Urbanairship
135
152
  unless logger.nil?
136
153
  logger.error "Urbanairship request timed out after #{request_timeout} seconds: [#{http_method} #{request.path} #{request.body}]"
137
154
  end
138
- Urbanairship::Response.wrap(nil, :body => {:error => 'Request timeout'}, :code => '503')
155
+ Urbanairship::Response.wrap(nil, :body => {'error' => 'Request timeout'}, :code => '503')
139
156
  end
140
157
 
141
158
  def verify_configuration_values(*symbols)
@@ -155,6 +172,7 @@ module Urbanairship
155
172
  def parse_push_options(hash = {})
156
173
  hash[:aliases] = hash[:aliases].map{|a| a.to_s} unless hash[:aliases].nil?
157
174
  hash[:schedule_for] = hash[:schedule_for].map{|elem| process_scheduled_elem(elem)} unless hash[:schedule_for].nil?
175
+ hash.delete(:version)
158
176
  hash
159
177
  end
160
178
 
@@ -18,7 +18,7 @@ module Urbanairship
18
18
  else
19
19
  begin
20
20
  output = JSON.parse(response.body || '{}')
21
- rescue JSON::ParserError
21
+ rescue JSON::ParserError => e
22
22
  output = {}
23
23
  end
24
24
  end
@@ -16,6 +16,15 @@ shared_examples_for "an Urbanairship client" do
16
16
  FakeWeb.register_uri(:delete, /my_app_key\:my_app_secret\@go\.urbanairship.com\/api\/device_tokens\/.+/, :status => ["204", "No Content"])
17
17
  FakeWeb.register_uri(:delete, /bad_key\:my_app_secret\@go\.urbanairship.com\/api\/device_tokens\/.+/, :status => ["401", "Unauthorized"])
18
18
 
19
+ # device_info
20
+ FakeWeb.register_uri(:get, /my_app_key\:my_app_secret\@go\.urbanairship.com\/api\/apids\/.+/, :status => ["200", "OK"], :body => "{\"active\":true,\"alias\":null}")
21
+ FakeWeb.register_uri(:get, /my_app_key\:my_app_secret\@go\.urbanairship.com\/api\/device_tokens\/.+/, :status => ["200", "OK"], :body => "{\"active\":true,\"alias\":null}")
22
+ FakeWeb.register_uri(:get, /bad_key\:my_app_secret\@go\.urbanairship.com\/api\/device_tokens\/.+/, :status => ["401", "Unauthorized"])
23
+
24
+ # device_tokens
25
+ FakeWeb.register_uri(:get, "https://my_app_key:my_master_secret@go.urbanairship.com/api/device_tokens/", :status => ["200", "OK"], :body => '{"device_tokens":[{"device_token": "0101F9929660BAD9FFF31A0B5FA32620FA988507DFFA52BD6C1C1F4783EDA2DB","active": false,"alias": null, "tags": []}], "device_tokens_count":50, "active_device_tokens_count":55}')
26
+ FakeWeb.register_uri(:get, "https://my_app_key2:my_master_secret2@go.urbanairship.com/api/device_tokens/", :status => ["401", "OK"])
27
+
19
28
  # push
20
29
  FakeWeb.register_uri(:post, "https://my_app_key:my_master_secret@go.urbanairship.com/api/push/", :status => ["200", "OK"])
21
30
  FakeWeb.register_uri(:post, "https://my_app_key2:my_master_secret2@go.urbanairship.com/api/push/", :status => ["400", "Bad Request"])
@@ -485,6 +494,68 @@ shared_examples_for "an Urbanairship client" do
485
494
 
486
495
  end
487
496
 
497
+ describe "::device_info" do
498
+ before(:each) do
499
+ @valid_params = {:alias => 'one'}
500
+ subject.application_key = "my_app_key"
501
+ subject.application_secret = "my_app_secret"
502
+ end
503
+
504
+ it "raises an error if call is made without an app key and secret configured" do
505
+ subject.application_key = nil
506
+ subject.application_secret = nil
507
+
508
+ lambda {
509
+ subject.device_info("asdf1234")
510
+ }.should raise_error(RuntimeError, "Must configure application_key, application_secret before making this request.")
511
+ end
512
+
513
+ it "uses app key and secret to sign the request" do
514
+ subject.device_info("device_token")
515
+ FakeWeb.last_request['authorization'].should == "Basic #{Base64::encode64('my_app_key:my_app_secret').chomp}"
516
+ end
517
+
518
+ it "takes and sends a device token" do
519
+ subject.device_info("device_token")
520
+ FakeWeb.last_request.path.should == "/api/device_tokens/device_token"
521
+ end
522
+
523
+ it "returns false when the authorization is invalid" do
524
+ subject.application_key = "bad_key"
525
+ subject.device_info("device_token").success?.should == false
526
+ end
527
+
528
+ it "uses the iOS interface by default" do
529
+ subject.device_info("device_token")
530
+ FakeWeb.last_request.path.should == "/api/device_tokens/device_token"
531
+ end
532
+
533
+ it "uses the android interface if 'provider' configuration option is set to :android Symbol" do
534
+ subject.provider = :android
535
+ subject.device_info("device_token")
536
+ FakeWeb.last_request.path.should == "/api/apids/device_token"
537
+ subject.provider = nil
538
+ end
539
+
540
+ it "uses the android interface if 'provider' configuration option is set to 'android' String" do
541
+ subject.provider = 'android'
542
+ subject.device_info("device_token")
543
+ FakeWeb.last_request.path.should == "/api/apids/device_token"
544
+ subject.provider = nil
545
+ end
546
+
547
+ it "uses the android interface if :provider Symbol key is passed an :android Symbol value" do
548
+ subject.device_info("device_token", :provider => :android)
549
+ FakeWeb.last_request.path.should == "/api/apids/device_token"
550
+ end
551
+
552
+ it "uses the android interface if 'provider' Symbol key is passed an 'android' String value" do
553
+ subject.device_info("device_token", :provider => "android")
554
+ FakeWeb.last_request.path.should == "/api/apids/device_token"
555
+ end
556
+
557
+ end
558
+
488
559
  describe "::delete_scheduled_push" do
489
560
  before(:each) do
490
561
  subject.application_key = "my_app_key"
@@ -561,6 +632,11 @@ shared_examples_for "an Urbanairship client" do
561
632
  subject.push(@valid_params).success?.should == false
562
633
  end
563
634
 
635
+ it "uses v3 of the API when requested" do
636
+ subject.push(@valid_params.merge(:version => 3)).success?.should == true
637
+ FakeWeb.last_request["Accept"].should == "application/vnd.urbanairship+json; version=3;"
638
+ end
639
+
564
640
  it "adds schedule_for to the JSON payload" do
565
641
  time = Time.parse("Oct 17th, 2010, 8:00 PM UTC")
566
642
  subject.push(@valid_params.merge(:schedule_for => [time]))
@@ -781,6 +857,42 @@ shared_examples_for "an Urbanairship client" do
781
857
  end
782
858
  end
783
859
 
860
+ describe "::device_tokens" do
861
+
862
+ before(:each) do
863
+ subject.application_key = "my_app_key"
864
+ subject.master_secret = "my_master_secret"
865
+ end
866
+
867
+ it "raises an error if call is made without an app key and master secret configured" do
868
+ subject.application_key = nil
869
+ subject.master_secret = nil
870
+
871
+ lambda {
872
+ subject.device_tokens_count
873
+ }.should raise_error(RuntimeError, "Must configure application_key, master_secret before making this request.")
874
+ end
875
+
876
+ it "uses app key and secret to sign the request" do
877
+ subject.device_tokens_count
878
+ FakeWeb.last_request['authorization'].should == "Basic #{Base64::encode64('my_app_key:my_master_secret').chomp}"
879
+ end
880
+
881
+ it "returns a hash as response from the Device Token List API with an array of device tokens" do
882
+ response = subject.device_tokens
883
+ response["device_tokens"].class.should == Array
884
+ response["device_tokens_count"].should == 50
885
+ response["active_device_tokens_count"].should == 55
886
+ end
887
+
888
+ it "success? is false when the call doesn't return 200" do
889
+ subject.application_key = "my_app_key2"
890
+ subject.master_secret = "my_master_secret2"
891
+ subject.device_tokens.success?.should == false
892
+ end
893
+
894
+ end
895
+
784
896
  describe "::device_tokens_count" do
785
897
 
786
898
  before(:each) do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: urbanairship
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.3
4
+ version: 2.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -76,7 +76,8 @@ files:
76
76
  - spec/spec_helper.rb
77
77
  - spec/urbanairship_spec.rb
78
78
  homepage: http://github.com/groupon/urbanairship
79
- licenses: []
79
+ licenses:
80
+ - BSD
80
81
  post_install_message:
81
82
  rdoc_options: []
82
83
  require_paths:
@@ -95,7 +96,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
95
96
  version: '0'
96
97
  requirements: []
97
98
  rubyforge_project:
98
- rubygems_version: 1.8.25
99
+ rubygems_version: 1.8.23
99
100
  signing_key:
100
101
  specification_version: 3
101
102
  summary: A Ruby wrapper for the Urban Airship API