gcm 0.1.0 → 0.1.1

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.
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