gcm 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2d3097180eb7e2fdcf713691a11c2d4e9dcc7d89
4
- data.tar.gz: 8bc696acca36e7b4472a6ceaa1aa69663339e945
3
+ metadata.gz: 4a6bbfaf64cd67f8f2008a650c0321ca5667717d
4
+ data.tar.gz: 4ba52e54a1239330ee62cc69acebca3efad1ff03
5
5
  SHA512:
6
- metadata.gz: 2bc02dc787c817c1b4a3b6a45141f13d62672946e55c927c60cd56ff998b4f8fbef93e8ee1155a56ad62c01d7db0662f56893ec0e03a3f63c86ffbe07e46928f
7
- data.tar.gz: 4228c061988eec7e0409bea59404ffe1c047f78a4c910738cd0008896516fcccf0268228c9705104741754198eeecb7a0b52948fa29e2912d81d07c763e79bd6
6
+ metadata.gz: 0d2418f9c98cb8f43194dddaba988cb61761d2142f19c05e8718780628ef07df519f3d19523212e987b7ce2ee86ff1b63fbeede50c364379b2c7090d75ce74d9
7
+ data.tar.gz: 5b2e606c93a2f79dc8c11fa4e0d442399ad23d6616740ef862ca8ad8840e04dc248f55fc0812558301ffd2ce7ac1f1d25b667e46e57a53d6417fe2caccf32d4c
@@ -1,6 +1,6 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.9.3
4
3
  - 2.0.0
5
- - 2.1.5
6
- - 2.2.0
4
+ - 2.1.8
5
+ - 2.2.4
6
+ - 2.3.0
@@ -1,4 +1,4 @@
1
- Copyright (c) 2015 Kashif Rasul and Shoaib Burq
1
+ Copyright (c) 2016 Kashif Rasul and Shoaib Burq
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Google Cloud Messaging for Android (GCM)
2
- [![Build Status](https://secure.travis-ci.org/spacialdb/gcm.png?branch=master)](http://travis-ci.org/spacialdb/gcm)
2
+ [![Gem Version](https://badge.fury.io/rb/gcm.svg)](http://badge.fury.io/rb/gcm) [![Build Status](https://secure.travis-ci.org/spacialdb/gcm.png?branch=master)](http://travis-ci.org/spacialdb/gcm)
3
3
 
4
- GCM sends notifications to Android devices via [GCM](http://developer.android.com/guide/google/gcm/gcm.html).
4
+ GCM sends notifications to Android devices via [GCM](https://developers.google.com/cloud-messaging/gcm).
5
5
 
6
6
  ##Installation
7
7
 
@@ -15,18 +15,18 @@ gem 'gcm'
15
15
 
16
16
  ##Requirements
17
17
 
18
- An Android device running 2.3 or newer and an API key as per [GCM getting started guide](http://developer.android.com/google/gcm/gs.html).
18
+ An Android device running 2.3 (or newer) or an iOS device and an API key as per [GCM getting started guide](https://developers.google.com/cloud-messaging/android/start).
19
19
 
20
20
  One of the following, tested Ruby versions:
21
21
 
22
- * `1.9.3`
23
22
  * `2.0.0`
24
- * `2.1.5`
25
- * `2.2.0`
23
+ * `2.1.8`
24
+ * `2.2.4`
25
+ * `2.3.0`
26
26
 
27
27
  ##Usage
28
28
 
29
- For your server to send a message to one or more devices, you must first initialise a new `GCM` class with your [api key](https://developer.android.com/google/gcm/gs.html#access-key), and then call the `send` method on this and give it 1 or more (up to 1000) registration IDs as an array of strings. You can also optionally send further [HTTP message parameters](http://developer.android.com/google/gcm/server.html#params) like `data` or `time_to_live` etc. as a hash via the second optional argument to `send`.
29
+ For your server to send a message to one or more devices, you must first initialise a new `GCM` class with your Api key, and then call the `send` method on this and give it 1 or more (up to 1000) registration tokens as an array of strings. You can also optionally send further [HTTP message parameters](https://developers.google.com/cloud-messaging/http-server-ref) like `data` or `time_to_live` etc. as a hash via the second optional argument to `send`.
30
30
 
31
31
  Example sending notifications:
32
32
 
@@ -36,31 +36,31 @@ require 'gcm'
36
36
  gcm = GCM.new("my_api_key")
37
37
  # you can set option parameters in here
38
38
  # - all options are pass to HTTParty method arguments
39
- # - ref: https://github.com/jnunemaker/httparty/blob/master/lib/httparty.rb#L40-L68
39
+ # - ref: https://github.com/jnunemaker/httparty/blob/master/lib/httparty.rb#L29-L60
40
40
  # gcm = GCM.new("my_api_key", timeout: 3)
41
41
 
42
- registration_ids= ["12", "13"] # an array of one or more client registration IDs
42
+ registration_ids= ["12", "13"] # an array of one or more client registration tokens
43
43
  options = {data: {score: "123"}, collapse_key: "updated_score"}
44
44
  response = gcm.send(registration_ids, options)
45
45
  ```
46
46
 
47
- Currently `response` is just a hash containing the response `body`, `headers` and `status`. Check [here](http://developer.android.com/google/gcm/http.html#response) to see how to interpret the responses.
47
+ Currently `response` is just a hash containing the response `body`, `headers` and `status`. Check [here](https://developers.google.com/cloud-messaging/http#response) to see how to interpret the responses.
48
48
 
49
- ## User Notifications
49
+ ## Device Group Messaging
50
50
 
51
- With [user notifications](http://developer.android.com/google/gcm/notifications.html), you can send a single message to multiple instance of an app running on devices owned by a single user. To use this feature, you will first need an initialised `GCM` class.
51
+ With [device group messaging](https://developers.google.com/cloud-messaging/notifications), you can send a single message to multiple instance of an app running on devices belonging to a group. Typically, "group" refers a set of different devices that belong to a single user. However, a group could also represent a set of devices where the app instance functions in a highly correlated manner. To use this feature, you will first need an initialised `GCM` class.
52
52
 
53
- ### Generate a Notification Key
54
- Then you will need a notification key which you can create for a particular `key_name` which needs to be uniquely named per app in case you have multiple apps for the same `project_id`. This ensures that notifications only go to the intended target app. The `create` method will do this and return the token `notification_key` in the response:
53
+ ### Generate a Notification Key for device group
54
+ Then you will need a notification key which you can create for a particular `key_name` which needs to be uniquely named per app in case you have multiple apps for the same `project_id`. This ensures that notifications only go to the intended target app. The `create` method will do this and return the token `notification_key`, that represents the device group, in the response:
55
55
 
56
56
  ```ruby
57
57
  response = gcm.create(key_name: "appUser-Chris",
58
- project_id: "my_project_id",
58
+ project_id: "my_project_id", # https://developers.google.com/cloud-messaging/gcm#senderid
59
59
  registration_ids:["4", "8", "15", "16", "23", "42"])
60
60
  ```
61
61
 
62
62
  ### Send to Notification Key
63
- Now you can send a message to a particular `notification_key` via the `send_with_notification_key` method. This allows the server to send a single data to multiple app instances (typically on multiple devices) owned by a single user (instead of sending to registration IDs). Note: the maximum number of members allowed for a `notification_key` is 10.
63
+ Now you can send a message to a particular `notification_key` via the `send_with_notification_key` method. This allows the server to send a single data to multiple app instances (typically on multiple devices) owned by a single user (instead of sending to some registration tokens). Note: the maximum number of members allowed for a `notification_key` is 20.
64
64
 
65
65
  ```ruby
66
66
  response = gcm.send_with_notification_key("notification_key", {
@@ -68,9 +68,9 @@ response = gcm.send_with_notification_key("notification_key", {
68
68
  collapse_key: "updated_score"})
69
69
  ```
70
70
 
71
- ### Add/Remove Registration IDs
71
+ ### Add/Remove Registration Tokens
72
72
 
73
- You can also add/remove registration IDs to/from a particular `notification_key` of some `project_id`. For example:
73
+ You can also add/remove registration Tokens to/from a particular `notification_key` of some `project_id`. For example:
74
74
 
75
75
  ```ruby
76
76
  response = gcm.add(key_name: "appUser-Chris",
@@ -84,6 +84,22 @@ response = gcm.remove(key_name: "appUser-Chris",
84
84
  registration_ids:["8", "15"])
85
85
  ```
86
86
 
87
+ ## Send Messages to Topics
88
+
89
+ GCM topic messaging allows your app server to send a message to multiple devices that have opted in to a particular topic. Based on the publish/subscribe model, topic messaging supports unlimited subscriptions per app. Sending to a topic is very similar to sending to an individual device or to a user group, in the sense that you can use the `gcm.send_with_notification_key()` method where the `noticiation_key` matches the regular expression `"/topics/[a-zA-Z0-9-_.~%]+"`:
90
+
91
+ ```ruby
92
+ response = gcm.send_with_notification_key("/topics/yourTopic", {
93
+ data: {message: "This is a GCM Topic Message!"})
94
+ ```
95
+
96
+ Or you can use the helper:
97
+
98
+ ```ruby
99
+ response = gcm.send_to_topic("yourTopic", {
100
+ data: {message: "This is a GCM Topic Message!"})
101
+ ```
102
+
87
103
  ## Blog Posts
88
104
 
89
105
  * [How to send iOS and Android notifications from your Rails backend](http://juretriglav.si/how-to-send-ios-and-android-notifications-from-your-rails-backend/)
@@ -91,13 +107,21 @@ response = gcm.remove(key_name: "appUser-Chris",
91
107
  * [GCM – 서버 만들기](http://susemi99.kr/1023)
92
108
  * [ruby から gcm を使って android 端末へメッセージを送信する](http://qiita.com/ma2saka/items/5852308b7c2855eef552)
93
109
  * [titanium alloy android push通知 by ruby](http://shoprev.hatenablog.com/entry/2014/08/30/202531)
110
+ * [Android Push Notifications via Rails](http://azukiweb.com/blog/2015/android-push-nots/)
94
111
 
95
- ## Android Client
112
+ ## Mobile Clients
96
113
 
97
- You can find a guide to implement an Android Client app to receive notifications here: [Implementing GCM Client](https://developer.android.com/google/gcm/client.html).
114
+ You can find a guide to implement an Android Client app to receive notifications here: [Set up a GCM Client App on Android](https://developers.google.com/cloud-messaging/android/client).
115
+
116
+ The guide to set up an iOS app to get notifications is here: [Setting up a GCM Client App on iOS](https://developers.google.com/cloud-messaging/ios/client).
98
117
 
99
118
  ## ChangeLog
100
119
 
120
+ ### 0.1.1
121
+
122
+ * Added helper `send_to_topic` to send messages to [topics](https://developers.google.com/cloud-messaging/topic-messaging).
123
+ * Fixed documentation and updated base uri to `https://gcm-http.googleapis.com/gcm`
124
+
101
125
  ### 0.1.0
102
126
  * Added `send_with_notification_key` to send message to a notification key since the documented API for it is [wrong]( http://stackoverflow.com/questions/19720767/gcm-user-notifications-missing-registration-ids-field/25183892#25183892).
103
127
 
@@ -121,7 +145,7 @@ You can find a guide to implement an Android Client app to receive notifications
121
145
 
122
146
  ##MIT License
123
147
 
124
- * Copyright (c) 2015 Kashif Rasul and Shoaib Burq. See LICENSE.txt for details.
148
+ * Copyright (c) 2016 Kashif Rasul and Shoaib Burq. See LICENSE.txt for details.
125
149
 
126
150
  ##Many thanks to all the contributors
127
151
 
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "gcm"
6
- s.version = "0.1.0"
6
+ s.version = "0.1.1"
7
7
  s.platform = Gem::Platform::RUBY
8
8
  s.authors = ["Kashif Rasul", "Shoaib Burq"]
9
9
  s.email = ["kashif@spacialdb.com", "shoaib@spacialdb.com"]
data/lib/gcm.rb CHANGED
@@ -4,7 +4,7 @@ require 'json'
4
4
 
5
5
  class GCM
6
6
  include HTTParty
7
- base_uri 'https://android.googleapis.com/gcm'
7
+ base_uri 'https://gcm-http.googleapis.com/gcm'
8
8
  default_timeout 30
9
9
  format :json
10
10
 
@@ -31,25 +31,24 @@ class GCM
31
31
  post_body = build_post_body(registration_ids, options)
32
32
 
33
33
  params = {
34
- :body => post_body.to_json,
35
- :headers => {
34
+ body: post_body.to_json,
35
+ headers: {
36
36
  'Authorization' => "key=#{@api_key}",
37
- 'Content-Type' => 'application/json',
37
+ 'Content-Type' => 'application/json'
38
38
  }
39
39
  }
40
40
  response = self.class.post('/send', params.merge(@client_options))
41
41
  build_response(response, registration_ids)
42
42
  end
43
- alias_method :send, :send_notification
43
+ alias send send_notification
44
44
 
45
- def create_notification_key(key_name, project_id, registration_ids=[])
46
- post_body = build_post_body(registration_ids, {
47
- :operation => "create",
48
- :notification_key_name => key_name})
45
+ def create_notification_key(key_name, project_id, registration_ids = [])
46
+ post_body = build_post_body(registration_ids, operation: 'create',
47
+ notification_key_name: key_name)
49
48
 
50
49
  params = {
51
- :body => post_body.to_json,
52
- :headers => {
50
+ body: post_body.to_json,
51
+ headers: {
53
52
  'Content-Type' => 'application/json',
54
53
  'project_id' => project_id,
55
54
  'Authorization' => "key=#{@api_key}"
@@ -59,17 +58,16 @@ class GCM
59
58
  response = self.class.post('/notification', params.merge(@client_options))
60
59
  build_response(response)
61
60
  end
62
- alias_method :create, :create_notification_key
61
+ alias create create_notification_key
63
62
 
64
63
  def add_registration_ids(key_name, project_id, notification_key, registration_ids)
65
- post_body = build_post_body(registration_ids, {
66
- :operation => "add",
67
- :notification_key_name => key_name,
68
- :notification_key => notification_key})
64
+ post_body = build_post_body(registration_ids, operation: 'add',
65
+ notification_key_name: key_name,
66
+ notification_key: notification_key)
69
67
 
70
68
  params = {
71
- :body => post_body.to_json,
72
- :headers => {
69
+ body: post_body.to_json,
70
+ headers: {
73
71
  'Content-Type' => 'application/json',
74
72
  'project_id' => project_id,
75
73
  'Authorization' => "key=#{@api_key}"
@@ -79,17 +77,16 @@ class GCM
79
77
  response = self.class.post('/notification', params.merge(@client_options))
80
78
  build_response(response)
81
79
  end
82
- alias_method :add, :add_registration_ids
80
+ alias add add_registration_ids
83
81
 
84
82
  def remove_registration_ids(key_name, project_id, notification_key, registration_ids)
85
- post_body = build_post_body(registration_ids, {
86
- :operation => "remove",
87
- :notification_key_name => key_name,
88
- :notification_key => notification_key})
83
+ post_body = build_post_body(registration_ids, operation: 'remove',
84
+ notification_key_name: key_name,
85
+ notification_key: notification_key)
89
86
 
90
87
  params = {
91
- :body => post_body.to_json,
92
- :headers => {
88
+ body: post_body.to_json,
89
+ headers: {
93
90
  'Content-Type' => 'application/json',
94
91
  'project_id' => project_id,
95
92
  'Authorization' => "key=#{@api_key}"
@@ -99,45 +96,51 @@ class GCM
99
96
  response = self.class.post('/notification', params.merge(@client_options))
100
97
  build_response(response)
101
98
  end
102
- alias_method :remove, :remove_registration_ids
99
+ alias remove remove_registration_ids
103
100
 
104
- def send_with_notification_key(notification_key, options)
105
- body = { :to => notification_key }.merge(options)
101
+ def send_with_notification_key(notification_key, options = {})
102
+ body = { to: notification_key }.merge(options)
106
103
 
107
104
  params = {
108
- :body => body.to_json,
109
- :headers => {
105
+ body: body.to_json,
106
+ headers: {
110
107
  'Authorization' => "key=#{@api_key}",
111
- 'Content-Type' => 'application/json',
108
+ 'Content-Type' => 'application/json'
112
109
  }
113
110
  }
114
111
  response = self.class.post('/send', params.merge(@client_options))
115
112
  build_response(response)
116
113
  end
117
114
 
115
+ def send_to_topic(topic, options = {})
116
+ if topic =~ /[a-zA-Z0-9\-_.~%]+/
117
+ send_with_notification_key('/topics/' + topic, options)
118
+ end
119
+ end
120
+
118
121
  private
119
122
 
120
- def build_post_body(registration_ids, options={})
121
- { :registration_ids => registration_ids }.merge(options)
123
+ def build_post_body(registration_ids, options = {})
124
+ { registration_ids: registration_ids }.merge(options)
122
125
  end
123
126
 
124
- def build_response(response, registration_ids=[])
127
+ def build_response(response, registration_ids = [])
125
128
  body = response.body || {}
126
- response_hash = {:body => body, :headers => response.headers, :status_code => response.code}
129
+ response_hash = { body: body, headers: response.headers, status_code: response.code }
127
130
  case response.code
128
- when 200
129
- response_hash[:response] = 'success'
130
- body = JSON.parse(body) unless body.empty?
131
- response_hash[:canonical_ids] = build_canonical_ids(body, registration_ids) unless registration_ids.empty?
132
- response_hash[:not_registered_ids] = build_not_registered_ids(body,registration_ids) unless registration_ids.empty?
133
- when 400
134
- response_hash[:response] = 'Only applies for JSON requests. Indicates that the request could not be parsed as JSON, or it contained invalid fields.'
135
- when 401
136
- response_hash[:response] = 'There was an error authenticating the sender account.'
137
- when 503
138
- response_hash[:response] = 'Server is temporarily unavailable.'
139
- when 500..599
140
- response_hash[:response] = 'There was an internal error in the GCM server while trying to process the request.'
131
+ when 200
132
+ response_hash[:response] = 'success'
133
+ body = JSON.parse(body) unless body.empty?
134
+ response_hash[:canonical_ids] = build_canonical_ids(body, registration_ids) unless registration_ids.empty?
135
+ response_hash[:not_registered_ids] = build_not_registered_ids(body, registration_ids) unless registration_ids.empty?
136
+ when 400
137
+ response_hash[:response] = 'Only applies for JSON requests. Indicates that the request could not be parsed as JSON, or it contained invalid fields.'
138
+ when 401
139
+ response_hash[:response] = 'There was an error authenticating the sender account.'
140
+ when 503
141
+ response_hash[:response] = 'Server is temporarily unavailable.'
142
+ when 500..599
143
+ response_hash[:response] = 'There was an internal error in the GCM server while trying to process the request.'
141
144
  end
142
145
  response_hash
143
146
  end
@@ -147,7 +150,7 @@ class GCM
147
150
  unless body.empty?
148
151
  if body['canonical_ids'] > 0
149
152
  body['results'].each_with_index do |result, index|
150
- canonical_ids << { :old => registration_ids[index], :new => result['registration_id'] } if has_canonical_id?(result)
153
+ canonical_ids << { old: registration_ids[index], new: result['registration_id'] } if has_canonical_id?(result)
151
154
  end
152
155
  end
153
156
  end
@@ -158,7 +161,7 @@ class GCM
158
161
  not_registered_ids = []
159
162
  unless body.empty?
160
163
  if body['failure'] > 0
161
- body['results'].each_with_index do |result,index|
164
+ body['results'].each_with_index do |result, index|
162
165
  not_registered_ids << registration_id[index] if is_not_registered?(result)
163
166
  end
164
167
  end
@@ -1,38 +1,38 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe GCM do
4
- let(:send_url) { "#{GCM::base_uri}/send" }
4
+ let(:send_url) { "#{GCM.base_uri}/send" }
5
5
 
6
- it "should raise an error if the api key is not provided" do
7
- expect {GCM.new}.to raise_error
6
+ it 'should raise an error if the api key is not provided' do
7
+ expect { GCM.new }.to raise_error
8
8
  end
9
9
 
10
- it "should raise error if time_to_live is given" do
10
+ it 'should raise error if time_to_live is given' do
11
11
  # ref: http://developer.android.com/guide/google/gcm/gcm.html#send-msg
12
12
  end
13
13
 
14
- describe "sending notification" do
14
+ describe 'sending notification' do
15
15
  let(:api_key) { 'AIzaSyB-1uEai2WiUapxCs2Q0GZYzPu7Udno5aA' }
16
- let(:registration_ids) { [ "42" ]}
16
+ let(:registration_ids) { ['42'] }
17
17
  let(:valid_request_body) do
18
- { :registration_ids => registration_ids }
18
+ { registration_ids: registration_ids }
19
19
  end
20
20
  let(:valid_request_headers) do
21
21
  {
22
- "Content-Type" => 'application/json',
23
- "Authorization" => "key=#{api_key}"
22
+ 'Content-Type' => 'application/json',
23
+ 'Authorization' => "key=#{api_key}"
24
24
  }
25
25
  end
26
26
 
27
27
  let(:stub_gcm_send_request) do
28
28
  stub_request(:post, send_url).with(
29
- :body => valid_request_body.to_json,
30
- :headers => valid_request_headers
29
+ body: valid_request_body.to_json,
30
+ headers: valid_request_headers
31
31
  ).to_return(
32
32
  # ref: http://developer.android.com/guide/google/gcm/gcm.html#success
33
- :body => "{}",
34
- :headers => {},
35
- :status => 200
33
+ body: '{}',
34
+ headers: {},
35
+ status: 200
36
36
  )
37
37
  end
38
38
 
@@ -40,7 +40,7 @@ describe GCM do
40
40
  uri = URI.parse(send_url)
41
41
  uri.user = 'a'
42
42
  uri.password = 'b'
43
- stub_request(:post, uri.to_s).to_return(:body => "{}", :headers => {}, :status => 200)
43
+ stub_request(:post, uri.to_s).to_return(body: '{}', headers: {}, status: 200)
44
44
  end
45
45
 
46
46
  before(:each) do
@@ -48,212 +48,198 @@ describe GCM do
48
48
  stub_gcm_send_request_with_basic_auth
49
49
  end
50
50
 
51
- it "should send notification using POST to GCM server" do
51
+ it 'should send notification using POST to GCM server' do
52
52
  gcm = GCM.new(api_key)
53
- gcm.send(registration_ids).should eq({:response => 'success', :body => "{}", :headers => {}, :status_code => 200, :canonical_ids => [], :not_registered_ids => []})
53
+ gcm.send(registration_ids).should eq(response: 'success', body: '{}', headers: {}, status_code: 200, canonical_ids: [], not_registered_ids: [])
54
54
  stub_gcm_send_request.should have_been_made.times(1)
55
55
  end
56
56
 
57
- it "should use basic authentication provided by options" do
58
- gcm = GCM.new(api_key, basic_auth: {username: 'a', password: 'b'})
59
- gcm.send(registration_ids).should eq({:response => 'success', :body => "{}", :headers => {}, :status_code => 200, :canonical_ids => [],:not_registered_ids => []})
57
+ it 'should use basic authentication provided by options' do
58
+ gcm = GCM.new(api_key, basic_auth: { username: 'a', password: 'b' })
59
+ gcm.send(registration_ids).should eq(response: 'success', body: '{}', headers: {}, status_code: 200, canonical_ids: [], not_registered_ids: [])
60
60
  stub_gcm_send_request_with_basic_auth.should have_been_made.times(1)
61
61
  end
62
62
 
63
- context "send notification with data" do
64
- let!(:stub_with_data){
65
- stub_request(:post, send_url).
66
- with(:body => "{\"registration_ids\":[\"42\"],\"data\":{\"score\":\"5x1\",\"time\":\"15:10\"}}",
67
- :headers => valid_request_headers ).
68
- to_return(:status => 200, :body => "", :headers => {})
69
- }
63
+ context 'send notification with data' do
64
+ let!(:stub_with_data) do
65
+ stub_request(:post, send_url)
66
+ .with(body: '{"registration_ids":["42"],"data":{"score":"5x1","time":"15:10"}}',
67
+ headers: valid_request_headers)
68
+ .to_return(status: 200, body: '', headers: {})
69
+ end
70
70
  before do
71
71
  end
72
- it "should send the data in a post request to gcm" do
72
+ it 'should send the data in a post request to gcm' do
73
73
  gcm = GCM.new(api_key)
74
- gcm.send(registration_ids, { :data => { :score => "5x1", :time => "15:10"} })
74
+ gcm.send(registration_ids, data: { score: '5x1', time: '15:10' })
75
75
  stub_with_data.should have_been_requested
76
76
  end
77
77
  end
78
78
 
79
- context "when send_notification responds with failure" do
80
-
79
+ context 'when send_notification responds with failure' do
81
80
  let(:mock_request_attributes) do
82
81
  {
83
- :body => valid_request_body.to_json,
84
- :headers => valid_request_headers
82
+ body: valid_request_body.to_json,
83
+ headers: valid_request_headers
85
84
  }
86
85
  end
87
86
 
88
87
  subject { GCM.new(api_key) }
89
88
 
90
- context "on failure code 400" do
89
+ context 'on failure code 400' do
91
90
  before do
92
91
  stub_request(:post, send_url).with(
93
92
  mock_request_attributes
94
93
  ).to_return(
95
94
  # ref: http://developer.android.com/guide/google/gcm/gcm.html#success
96
- :body => "{}",
97
- :headers => {},
98
- :status => 400
95
+ body: '{}',
96
+ headers: {},
97
+ status: 400
99
98
  )
100
99
  end
101
- it "should not send notification due to 400" do
102
- subject.send(registration_ids).should eq({
103
- :body => "{}",
104
- :headers => {},
105
- :response => "Only applies for JSON requests. Indicates that the request could not be parsed as JSON, or it contained invalid fields.",
106
- :status_code => 400
107
- })
100
+ it 'should not send notification due to 400' do
101
+ subject.send(registration_ids).should eq(body: '{}',
102
+ headers: {},
103
+ response: 'Only applies for JSON requests. Indicates that the request could not be parsed as JSON, or it contained invalid fields.',
104
+ status_code: 400)
108
105
  end
109
106
  end
110
107
 
111
- context "on failure code 401" do
108
+ context 'on failure code 401' do
112
109
  before do
113
110
  stub_request(:post, send_url).with(
114
111
  mock_request_attributes
115
112
  ).to_return(
116
113
  # ref: http://developer.android.com/guide/google/gcm/gcm.html#success
117
- :body => "{}",
118
- :headers => {},
119
- :status => 401
114
+ body: '{}',
115
+ headers: {},
116
+ status: 401
120
117
  )
121
118
  end
122
119
 
123
- it "should not send notification due to 401" do
124
- subject.send(registration_ids).should eq({
125
- :body => "{}",
126
- :headers => {},
127
- :response => "There was an error authenticating the sender account.",
128
- :status_code => 401
129
- })
120
+ it 'should not send notification due to 401' do
121
+ subject.send(registration_ids).should eq(body: '{}',
122
+ headers: {},
123
+ response: 'There was an error authenticating the sender account.',
124
+ status_code: 401)
130
125
  end
131
126
  end
132
127
 
133
- context "on failure code 503" do
128
+ context 'on failure code 503' do
134
129
  before do
135
130
  stub_request(:post, send_url).with(
136
131
  mock_request_attributes
137
132
  ).to_return(
138
133
  # ref: http://developer.android.com/guide/google/gcm/gcm.html#success
139
- :body => "{}",
140
- :headers => {},
141
- :status => 503
134
+ body: '{}',
135
+ headers: {},
136
+ status: 503
142
137
  )
143
138
  end
144
139
 
145
- it "should not send notification due to 503" do
146
- subject.send(registration_ids).should eq({
147
- :body => "{}",
148
- :headers => {},
149
- :response => 'Server is temporarily unavailable.',
150
- :status_code => 503
151
- })
140
+ it 'should not send notification due to 503' do
141
+ subject.send(registration_ids).should eq(body: '{}',
142
+ headers: {},
143
+ response: 'Server is temporarily unavailable.',
144
+ status_code: 503)
152
145
  end
153
146
  end
154
147
 
155
- context "on failure code 5xx" do
148
+ context 'on failure code 5xx' do
156
149
  before do
157
150
  stub_request(:post, send_url).with(
158
151
  mock_request_attributes
159
152
  ).to_return(
160
153
  # ref: http://developer.android.com/guide/google/gcm/gcm.html#success
161
- :body => "{\"body-key\" => \"Body value\"}",
162
- :headers => { "header-key" => "Header value" },
163
- :status => 599
154
+ body: '{"body-key" => "Body value"}',
155
+ headers: { 'header-key' => 'Header value' },
156
+ status: 599
164
157
  )
165
158
  end
166
159
 
167
- it "should not send notification due to 599" do
168
- subject.send(registration_ids).should eq({
169
- :body => "{\"body-key\" => \"Body value\"}",
170
- :headers => { "header-key" => ["Header value"] },
171
- :response => 'There was an internal error in the GCM server while trying to process the request.',
172
- :status_code => 599
173
- })
160
+ it 'should not send notification due to 599' do
161
+ subject.send(registration_ids).should eq(body: '{"body-key" => "Body value"}',
162
+ headers: { 'header-key' => ['Header value'] },
163
+ response: 'There was an internal error in the GCM server while trying to process the request.',
164
+ status_code: 599)
174
165
  end
175
166
  end
176
167
  end
177
168
 
178
- context "when send_notification responds canonical_ids" do
179
-
169
+ context 'when send_notification responds canonical_ids' do
180
170
  let(:mock_request_attributes) do
181
171
  {
182
- :body => valid_request_body.to_json,
183
- :headers => valid_request_headers
172
+ body: valid_request_body.to_json,
173
+ headers: valid_request_headers
184
174
  }
185
175
  end
186
176
 
187
177
  let(:valid_response_body_with_canonical_ids) do
188
178
  {
189
- :failure => 0, :canonical_ids => 1, :results => [{:registration_id => "43", :message_id => "0:1385025861956342%572c22801bb3" }]
179
+ failure: 0, canonical_ids: 1, results: [{ registration_id: '43', message_id: '0:1385025861956342%572c22801bb3' }]
190
180
  }
191
181
  end
192
182
 
193
183
  subject { GCM.new(api_key) }
194
184
 
195
-
196
185
  before do
197
186
  stub_request(:post, send_url).with(
198
- mock_request_attributes
187
+ mock_request_attributes
199
188
  ).to_return(
200
189
  # ref: http://developer.android.com/guide/google/gcm/gcm.html#success
201
- :body => valid_response_body_with_canonical_ids.to_json,
202
- :headers => {},
203
- :status => 200
190
+ body: valid_response_body_with_canonical_ids.to_json,
191
+ headers: {},
192
+ status: 200
204
193
  )
205
194
  end
206
195
 
207
- it "should contain canonical_ids" do
196
+ it 'should contain canonical_ids' do
208
197
  response = subject.send(registration_ids)
209
198
 
210
- response.should eq({
211
- :headers => {},
212
- :canonical_ids => [{:old => "42", :new => "43"}],
213
- :not_registered_ids => [],
214
- :status_code => 200,
215
- :response => 'success',
216
- :body => "{\"failure\":0,\"canonical_ids\":1,\"results\":[{\"registration_id\":\"43\",\"message_id\":\"0:1385025861956342%572c22801bb3\"}]}"
217
- })
199
+ response.should eq(headers: {},
200
+ canonical_ids: [{ old: '42', new: '43' }],
201
+ not_registered_ids: [],
202
+ status_code: 200,
203
+ response: 'success',
204
+ body: '{"failure":0,"canonical_ids":1,"results":[{"registration_id":"43","message_id":"0:1385025861956342%572c22801bb3"}]}')
218
205
  end
219
206
  end
220
207
 
221
- context "when send_notification responds with NotRegistered" do
222
-
208
+ context 'when send_notification responds with NotRegistered' do
223
209
  subject { GCM.new(api_key) }
224
210
 
225
211
  let(:mock_request_attributes) do
226
212
  {
227
- :body => valid_request_body.to_json,
228
- :headers => valid_request_headers
213
+ body: valid_request_body.to_json,
214
+ headers: valid_request_headers
229
215
  }
230
216
  end
231
217
 
232
218
  let(:valid_response_body_with_not_registered_ids) do
233
219
  {
234
- :canonical_ids => 0, :failure => 1, :results => [{ :error => "NotRegistered" }]
220
+ canonical_ids: 0, failure: 1, results: [{ error: 'NotRegistered' }]
235
221
  }
236
222
  end
237
223
 
238
224
  before do
239
- stub_request(:post,send_url).with(
225
+ stub_request(:post, send_url).with(
240
226
  mock_request_attributes
241
227
  ).to_return(
242
- :body => valid_response_body_with_not_registered_ids.to_json,
243
- :headers => {},
244
- :status => 200
228
+ body: valid_response_body_with_not_registered_ids.to_json,
229
+ headers: {},
230
+ status: 200
245
231
  )
246
232
  end
247
233
 
248
- it "should contain not_registered_ids" do
234
+ it 'should contain not_registered_ids' do
249
235
  response = subject.send(registration_ids)
250
236
  response.should eq(
251
- :headers => {},
252
- :canonical_ids => [],
253
- :not_registered_ids => registration_ids,
254
- :status_code => 200,
255
- :response => 'success',
256
- :body => "{\"canonical_ids\":0,\"failure\":1,\"results\":[{\"error\":\"NotRegistered\"}]}"
237
+ headers: {},
238
+ canonical_ids: [],
239
+ not_registered_ids: registration_ids,
240
+ status_code: 200,
241
+ response: 'success',
242
+ body: '{"canonical_ids":0,"failure":1,"results":[{"error":"NotRegistered"}]}'
257
243
  )
258
244
  end
259
245
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gcm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kashif Rasul
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-01-15 00:00:00.000000000 Z
12
+ date: 2016-02-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: httparty
@@ -79,7 +79,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
79
79
  version: '0'
80
80
  requirements: []
81
81
  rubyforge_project: gcm
82
- rubygems_version: 2.4.5
82
+ rubygems_version: 2.5.2
83
83
  signing_key:
84
84
  specification_version: 4
85
85
  summary: send data to Android applications on Android devices