gcm 0.0.2 → 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.
- checksums.yaml +7 -0
- data/.gitignore +2 -1
- data/.travis.yml +3 -0
- data/Gemfile +3 -2
- data/README.md +11 -7
- data/Rakefile +16 -0
- data/gcm.gemspec +1 -1
- data/lib/gcm.rb +20 -6
- data/spec/gcm_spec.rb +103 -12
- metadata +12 -18
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5c2094f1f941e71303802d03af0af0c60841598e
|
4
|
+
data.tar.gz: 533de2aad017e25cc44b8d56af68932655869881
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b9d5138d41d34d02bffc3b8c0c6a71d61b7862b4eb9c8de5647df9cc52e127b9e5510709de0bfb13a346823588eb6740b41e4de51c7fa19ef4192a5560b2cb83
|
7
|
+
data.tar.gz: a838377705386fe708f8cdfc281fba52d586c36d9da3472fe3d7086016a2ee1228ae6a22745b0049c8d5ad5d3afe25b242b61f894bf68c1b9dbbc6d164d2e648
|
data/.gitignore
CHANGED
@@ -14,7 +14,7 @@ doc
|
|
14
14
|
# jeweler generated
|
15
15
|
pkg
|
16
16
|
|
17
|
-
# Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
|
17
|
+
# Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
|
18
18
|
#
|
19
19
|
# * Create a file at ~/.gitignore
|
20
20
|
# * Include files you want ignored
|
@@ -47,3 +47,4 @@ gems
|
|
47
47
|
specifications
|
48
48
|
Gemfile.lock
|
49
49
|
.rvmrc
|
50
|
+
spec/reports
|
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# Google Cloud Messaging for Android (GCM)
|
2
|
+
[](http://travis-ci.org/shamithc/gcm)
|
2
3
|
|
3
4
|
GCM sends notifications to Android devices via [GCM](http://developer.android.com/guide/google/gcm/gcm.html).
|
4
5
|
|
@@ -12,24 +13,27 @@ An Android device running 2.0 or newer and an API key as per [GCM getting starte
|
|
12
13
|
|
13
14
|
##Usage
|
14
15
|
|
15
|
-
|
16
16
|
Sending notifications:
|
17
17
|
|
18
18
|
```ruby
|
19
|
+
require 'gcm'
|
20
|
+
|
19
21
|
gcm = GCM.new(api_key)
|
20
22
|
registration_ids= ["12", "13"] # an array of one or more client registration IDs
|
21
|
-
options = {
|
23
|
+
options = {data: {score: "123"}, collapse_key: "updated_score"}
|
22
24
|
response = gcm.send_notification(registration_ids, options)
|
23
25
|
```
|
24
26
|
|
25
27
|
Currently `response` is just a hash containing the response `body`, `headers` and `status`.
|
26
28
|
|
27
|
-
|
29
|
+
If the above code is stored in a file like `trigger_gcm.rb`, thats how you can call it.
|
28
30
|
|
29
|
-
|
31
|
+
$ ruby -rubygems trigger_gcm.rb
|
30
32
|
|
31
|
-
##
|
33
|
+
##MIT License
|
34
|
+
|
35
|
+
* Copyright (c) 2012 Kashif Rasul and Shoaib Burq. See LICENSE.txt for details.
|
32
36
|
|
33
|
-
|
37
|
+
##Many thanks to all the contributors
|
34
38
|
|
35
|
-
* [
|
39
|
+
* [Contributors](https://github.com/spacialdb/gcm/contributors)
|
data/Rakefile
CHANGED
@@ -1 +1,17 @@
|
|
1
|
+
require 'rspec/core/rake_task'
|
1
2
|
require "bundler/gem_tasks"
|
3
|
+
require "rake/tasklib"
|
4
|
+
require 'ci/reporter/rake/rspec'
|
5
|
+
|
6
|
+
RSpec::Core::RakeTask.new(:spec => ["ci:setup:rspec"]) do |t|
|
7
|
+
t.pattern = 'spec/**/*_spec.rb'
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
12
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
13
|
+
spec.rspec_opts = ['--format documentation']
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
task :default => :spec
|
data/gcm.gemspec
CHANGED
@@ -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.0.
|
6
|
+
s.version = "0.0.4"
|
7
7
|
s.authors = ["Amro Mousa", "Kashif Rasul", "Shoaib Burq"]
|
8
8
|
s.email = ["amromousa@gmail.com", "kashif@spacialdb.com", "shoaib@spacialdb.com"]
|
9
9
|
s.homepage = "http://github.com/spacialdb/gcm"
|
data/lib/gcm.rb
CHANGED
@@ -31,22 +31,36 @@ class GCM
|
|
31
31
|
post_body = build_post_body(registration_ids, options)
|
32
32
|
|
33
33
|
params = {
|
34
|
-
:body
|
34
|
+
:body => post_body.to_json,
|
35
35
|
:headers => {
|
36
|
-
'Authorization'
|
37
|
-
'Content-Type'
|
36
|
+
'Authorization' => "key=#{@api_key}",
|
37
|
+
'Content-Type' => 'application/json',
|
38
38
|
}
|
39
39
|
}
|
40
40
|
|
41
41
|
response = self.class.post('', params)
|
42
|
-
|
42
|
+
build_response(response)
|
43
43
|
end
|
44
44
|
|
45
45
|
private
|
46
46
|
|
47
47
|
def build_post_body(registration_ids, options={})
|
48
|
-
|
49
|
-
#raise exception if options[:time_to_live] && !options[:collapse_key]
|
48
|
+
{ :registration_ids => registration_ids }.merge(options)
|
50
49
|
end
|
51
50
|
|
51
|
+
def build_response(response)
|
52
|
+
case response.code
|
53
|
+
when 200
|
54
|
+
body = response.body || {}
|
55
|
+
{ :response => 'success', :body => body, :headers => response.headers, :status_code => response.code }
|
56
|
+
when 400
|
57
|
+
{ :response => 'Only applies for JSON requests. Indicates that the request could not be parsed as JSON, or it contained invalid fields.', :status_code => response.code }
|
58
|
+
when 401
|
59
|
+
{ :response => 'There was an error authenticating the sender account.', :status_code => response.code }
|
60
|
+
when 500
|
61
|
+
{ :response => 'There was an internal error in the GCM server while trying to process the request.', :status_code => response.code }
|
62
|
+
when 503
|
63
|
+
{ :response => 'Server is temporarily unavailable.', :status_code => response.code }
|
64
|
+
end
|
65
|
+
end
|
52
66
|
end
|
data/spec/gcm_spec.rb
CHANGED
@@ -13,7 +13,7 @@ describe GCM do
|
|
13
13
|
let(:api_key) { 'AIzaSyB-1uEai2WiUapxCs2Q0GZYzPu7Udno5aA' }
|
14
14
|
let(:registration_ids) { [ "42" ]}
|
15
15
|
let(:valid_request_body) do
|
16
|
-
{ registration_ids
|
16
|
+
{ :registration_ids => registration_ids }
|
17
17
|
end
|
18
18
|
let(:valid_request_headers) do
|
19
19
|
{
|
@@ -24,35 +24,126 @@ describe GCM do
|
|
24
24
|
|
25
25
|
before(:each) do
|
26
26
|
stub_request(:post, GCM::PUSH_URL).with(
|
27
|
-
body
|
28
|
-
headers
|
27
|
+
:body => valid_request_body.to_json,
|
28
|
+
:headers => valid_request_headers
|
29
29
|
).to_return(
|
30
30
|
# ref: http://developer.android.com/guide/google/gcm/gcm.html#success
|
31
|
-
body
|
32
|
-
headers
|
33
|
-
status
|
31
|
+
:body => {},
|
32
|
+
:headers => {},
|
33
|
+
:status => 200
|
34
34
|
)
|
35
35
|
end
|
36
36
|
|
37
37
|
it "should send notification using POST to GCM server" do
|
38
38
|
gcm = GCM.new(api_key)
|
39
|
-
gcm.send_notification(registration_ids).should eq({
|
39
|
+
gcm.send_notification(registration_ids).should eq({:response => 'success', :body => {}, :headers => {}, :status_code => 200})
|
40
40
|
end
|
41
41
|
|
42
42
|
context "send notification with data" do
|
43
43
|
let!(:stub_with_data){
|
44
44
|
stub_request(:post, GCM::PUSH_URL).
|
45
|
-
with(body
|
46
|
-
headers
|
47
|
-
to_return(status
|
45
|
+
with(:body => "{\"data\":{\"score\":\"5x1\",\"time\":\"15:10\"},\"registration_ids\":[\"42\"]}",
|
46
|
+
:headers => valid_request_headers ).
|
47
|
+
to_return(:status => 200, :body => "", :headers => {})
|
48
48
|
}
|
49
49
|
before do
|
50
50
|
end
|
51
51
|
it "should send the data in a post request to gcm" do
|
52
52
|
gcm = GCM.new(api_key)
|
53
|
-
gcm.send_notification(registration_ids, { data
|
53
|
+
gcm.send_notification(registration_ids, { :data => { :score => "5x1", :time => "15:10"} })
|
54
54
|
stub_with_data.should have_been_requested
|
55
55
|
end
|
56
56
|
end
|
57
|
+
|
58
|
+
context " when send_notification responds with failure" do
|
59
|
+
|
60
|
+
let(:mock_request_attributes) do
|
61
|
+
{
|
62
|
+
:body => valid_request_body.to_json,
|
63
|
+
:headers => valid_request_headers
|
64
|
+
}
|
65
|
+
end
|
66
|
+
|
67
|
+
subject { GCM.new(api_key) }
|
68
|
+
|
69
|
+
context "on failure code 400" do
|
70
|
+
before do
|
71
|
+
stub_request(:post, GCM::PUSH_URL).with(
|
72
|
+
mock_request_attributes
|
73
|
+
).to_return(
|
74
|
+
# ref: http://developer.android.com/guide/google/gcm/gcm.html#success
|
75
|
+
:body => {},
|
76
|
+
:headers => {},
|
77
|
+
:status => 400
|
78
|
+
)
|
79
|
+
end
|
80
|
+
it "should not send notification due to 400" do
|
81
|
+
subject.send_notification(registration_ids).should eq({
|
82
|
+
:response => "Only applies for JSON requests. Indicates that the request could not be parsed as JSON, or it contained invalid fields.",
|
83
|
+
:status_code => 400
|
84
|
+
})
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
context "on failure code 401" do
|
89
|
+
before do
|
90
|
+
stub_request(:post, GCM::PUSH_URL).with(
|
91
|
+
mock_request_attributes
|
92
|
+
).to_return(
|
93
|
+
# ref: http://developer.android.com/guide/google/gcm/gcm.html#success
|
94
|
+
:body => {},
|
95
|
+
:headers => {},
|
96
|
+
:status => 401
|
97
|
+
)
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should not send notification due to 401" do
|
101
|
+
subject.send_notification(registration_ids).should eq({
|
102
|
+
:response => "There was an error authenticating the sender account.",
|
103
|
+
:status_code => 401
|
104
|
+
})
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
context "on failure code 500" do
|
109
|
+
before do
|
110
|
+
stub_request(:post, GCM::PUSH_URL).with(
|
111
|
+
mock_request_attributes
|
112
|
+
).to_return(
|
113
|
+
# ref: http://developer.android.com/guide/google/gcm/gcm.html#success
|
114
|
+
:body => {},
|
115
|
+
:headers => {},
|
116
|
+
:status => 500
|
117
|
+
)
|
118
|
+
end
|
119
|
+
|
120
|
+
it "should not send notification due to 500" do
|
121
|
+
subject.send_notification(registration_ids).should eq({
|
122
|
+
:response => 'There was an internal error in the GCM server while trying to process the request.',
|
123
|
+
:status_code => 500
|
124
|
+
})
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
context "on failure code 503" do
|
129
|
+
before do
|
130
|
+
stub_request(:post, GCM::PUSH_URL).with(
|
131
|
+
mock_request_attributes
|
132
|
+
).to_return(
|
133
|
+
# ref: http://developer.android.com/guide/google/gcm/gcm.html#success
|
134
|
+
:body => {},
|
135
|
+
:headers => {},
|
136
|
+
:status => 503
|
137
|
+
)
|
138
|
+
end
|
139
|
+
|
140
|
+
it "should not send notification due to 503" do
|
141
|
+
subject.send_notification(registration_ids).should eq({
|
142
|
+
:response => 'Server is temporarily unavailable.',
|
143
|
+
:status_code => 503
|
144
|
+
})
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
57
148
|
end
|
58
|
-
end
|
149
|
+
end
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gcm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.4
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Amro Mousa
|
@@ -11,38 +10,34 @@ authors:
|
|
11
10
|
autorequire:
|
12
11
|
bindir: bin
|
13
12
|
cert_chain: []
|
14
|
-
date:
|
13
|
+
date: 2013-06-04 00:00:00.000000000 Z
|
15
14
|
dependencies:
|
16
15
|
- !ruby/object:Gem::Dependency
|
17
16
|
name: httparty
|
18
17
|
requirement: !ruby/object:Gem::Requirement
|
19
|
-
none: false
|
20
18
|
requirements:
|
21
|
-
- -
|
19
|
+
- - '>='
|
22
20
|
- !ruby/object:Gem::Version
|
23
21
|
version: '0'
|
24
22
|
type: :runtime
|
25
23
|
prerelease: false
|
26
24
|
version_requirements: !ruby/object:Gem::Requirement
|
27
|
-
none: false
|
28
25
|
requirements:
|
29
|
-
- -
|
26
|
+
- - '>='
|
30
27
|
- !ruby/object:Gem::Version
|
31
28
|
version: '0'
|
32
29
|
- !ruby/object:Gem::Dependency
|
33
30
|
name: json
|
34
31
|
requirement: !ruby/object:Gem::Requirement
|
35
|
-
none: false
|
36
32
|
requirements:
|
37
|
-
- -
|
33
|
+
- - '>='
|
38
34
|
- !ruby/object:Gem::Version
|
39
35
|
version: '0'
|
40
36
|
type: :runtime
|
41
37
|
prerelease: false
|
42
38
|
version_requirements: !ruby/object:Gem::Requirement
|
43
|
-
none: false
|
44
39
|
requirements:
|
45
|
-
- -
|
40
|
+
- - '>='
|
46
41
|
- !ruby/object:Gem::Version
|
47
42
|
version: '0'
|
48
43
|
description: gcm is a service that helps developers send data from servers to their
|
@@ -57,6 +52,7 @@ extra_rdoc_files: []
|
|
57
52
|
files:
|
58
53
|
- .gitignore
|
59
54
|
- .rspec
|
55
|
+
- .travis.yml
|
60
56
|
- Gemfile
|
61
57
|
- LICENSE.txt
|
62
58
|
- README.md
|
@@ -68,29 +64,27 @@ files:
|
|
68
64
|
homepage: http://github.com/spacialdb/gcm
|
69
65
|
licenses:
|
70
66
|
- MIT
|
67
|
+
metadata: {}
|
71
68
|
post_install_message:
|
72
69
|
rdoc_options: []
|
73
70
|
require_paths:
|
74
71
|
- lib
|
75
72
|
required_ruby_version: !ruby/object:Gem::Requirement
|
76
|
-
none: false
|
77
73
|
requirements:
|
78
|
-
- -
|
74
|
+
- - '>='
|
79
75
|
- !ruby/object:Gem::Version
|
80
76
|
version: '0'
|
81
77
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
|
-
none: false
|
83
78
|
requirements:
|
84
|
-
- -
|
79
|
+
- - '>='
|
85
80
|
- !ruby/object:Gem::Version
|
86
81
|
version: '0'
|
87
82
|
requirements: []
|
88
83
|
rubyforge_project: gcm
|
89
|
-
rubygems_version:
|
84
|
+
rubygems_version: 2.0.0
|
90
85
|
signing_key:
|
91
|
-
specification_version:
|
86
|
+
specification_version: 4
|
92
87
|
summary: send data to Android applications on Android devices
|
93
88
|
test_files:
|
94
89
|
- spec/gcm_spec.rb
|
95
90
|
- spec/spec_helper.rb
|
96
|
-
has_rdoc:
|