pushio 0.0.2 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -1
- data/LICENSE +1 -1
- data/README.md +31 -7
- data/lib/push_io.rb +1 -0
- data/lib/push_io/client.rb +101 -8
- data/lib/push_io/configuration.rb +2 -0
- data/lib/push_io/errors.rb +4 -0
- data/lib/push_io/utils.rb +5 -0
- data/lib/push_io/version.rb +1 -1
- data/pushio.gemspec +1 -1
- data/spec/push_io_spec.rb +71 -10
- data/spec/pushio_config.example.yml +2 -0
- metadata +12 -9
data/.gitignore
CHANGED
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -1,26 +1,36 @@
|
|
1
1
|
# PushIoClient
|
2
2
|
|
3
|
-
An easy to use client for integrating push notifications into Ruby-based applications.
|
3
|
+
An easy to use client for integrating push notifications into Ruby-based applications.
|
4
|
+
This gem uses the Push IO API to trigger notification delivery to whatever audience you specify.
|
5
|
+
In order to get full use of this gem you will need to have an active account on
|
6
|
+
https://manage.push.io and have recipient devices registered to receive notifications.
|
7
|
+
Learn more at http://push.io
|
4
8
|
|
5
9
|
## Installation
|
6
10
|
|
7
11
|
Add this line to your application's Gemfile:
|
8
|
-
|
12
|
+
```
|
9
13
|
gem 'pushio'
|
14
|
+
```
|
10
15
|
|
11
16
|
And then execute:
|
12
17
|
|
18
|
+
```
|
13
19
|
$ bundle
|
20
|
+
```
|
14
21
|
|
15
22
|
Or install it yourself as:
|
16
23
|
|
24
|
+
```
|
17
25
|
$ gem install pushio
|
26
|
+
```
|
27
|
+
|
18
28
|
|
19
29
|
## Usage
|
20
30
|
|
21
31
|
Configure the client:
|
22
32
|
|
23
|
-
```
|
33
|
+
```ruby
|
24
34
|
PushIo::Client.configure do |config|
|
25
35
|
config.app_guid = [your app guid from https://manage.push.io]
|
26
36
|
config.sender_secret = [for your app on https://manage.push.io]
|
@@ -28,14 +38,28 @@ end
|
|
28
38
|
```
|
29
39
|
|
30
40
|
Send a broadcast push to everyone registered for your app:
|
31
|
-
```
|
32
|
-
|
33
|
-
notification_id = push_client.broadcast :message => "Hello everyone!"
|
41
|
+
```ruby
|
42
|
+
notification_id = PushIo::Client.deliver_broadcast :payload => {:message => "Broadcast Test"}
|
34
43
|
```
|
35
44
|
|
36
45
|
Send a push to an audience:
|
46
|
+
```ruby
|
47
|
+
notification_id = PushIo::Client.deliver_to_audience "friends", :payload => {:message => "Howdy Friends", :payload_apns => {:badge => 8}}
|
48
|
+
```
|
49
|
+
|
50
|
+
Send a push to a targeted query:
|
51
|
+
```ruby
|
52
|
+
notification_id = PushIo::Client.deliver_to_query "Alpha or Bravo", :payload => {:message => "Query Test"}
|
37
53
|
```
|
38
|
-
|
54
|
+
|
55
|
+
Send a push to a known device ID:
|
56
|
+
```ruby
|
57
|
+
notification_id = PushIo::Client.deliver_to_ids "APIKEY1234_a123", ['B3606524-AE35-458A-9FE9-7B6FE8D99CE4'], :payload => {:message => "Hello Push IO"}
|
58
|
+
```
|
59
|
+
|
60
|
+
Send a push to a known device Token:
|
61
|
+
```ruby
|
62
|
+
notification_id = PushIo::Client.deliver_to_tokens "APIKEY1234_a123", ['abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd'], :payload => {:message => "Hello Push IO"}
|
39
63
|
```
|
40
64
|
|
41
65
|
|
data/lib/push_io.rb
CHANGED
data/lib/push_io/client.rb
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
module PushIo
|
2
2
|
class Client
|
3
3
|
attr_reader :config
|
4
|
+
attr_accessor :httpclient
|
5
|
+
|
4
6
|
def initialize(attributes = {})
|
5
7
|
@config = PushIo::Client.config.dup
|
8
|
+
self.httpclient = HTTPClient.new
|
6
9
|
attributes.each do |name, value|
|
7
10
|
@config.send("#{name}=", value) if @config.respond_to?("#{name}=")
|
8
11
|
end
|
@@ -23,23 +26,113 @@ module PushIo
|
|
23
26
|
end
|
24
27
|
end
|
25
28
|
|
26
|
-
def
|
27
|
-
|
29
|
+
def deliver(*args)
|
30
|
+
opts = args.extract_options!
|
31
|
+
send_post(opts) if ready_to_deliver?(opts)
|
32
|
+
end
|
33
|
+
|
34
|
+
def deliver_broadcast(*args)
|
35
|
+
opts = args.extract_options!
|
36
|
+
opts.delete(:audience) if opts[:audience]
|
37
|
+
opts.delete(:tag_query) if opts[:tag_query]
|
38
|
+
opts[:audience] = 'broadcast'
|
39
|
+
send_post(opts) if ready_to_deliver?(opts)
|
40
|
+
end
|
41
|
+
|
42
|
+
def deliver_to_audience(audience, *args)
|
43
|
+
opts = args.extract_options!
|
44
|
+
opts.delete(:tag_query) if opts[:tag_query]
|
45
|
+
opts[:audience] = audience
|
46
|
+
raise PushIo::MissingOptionsError, "An audience was not specified" unless opts[:audience]
|
47
|
+
send_post(opts) if ready_to_deliver?(opts)
|
48
|
+
end
|
49
|
+
|
50
|
+
def deliver_to_query(query, *args)
|
51
|
+
opts = args.extract_options!
|
52
|
+
opts.delete(:audience) if opts[:audience]
|
53
|
+
opts[:tag_query] = query
|
54
|
+
raise PushIo::MissingOptionsError, "A query was not specified" unless opts[:tag_query]
|
55
|
+
send_post(opts) if ready_to_deliver?(opts)
|
28
56
|
end
|
29
57
|
|
30
|
-
def
|
31
|
-
|
58
|
+
def deliver_to_ids(api_key, device_id_array, *args)
|
59
|
+
opts = args.extract_options!
|
60
|
+
opts.delete(:audience) if opts[:audience]
|
61
|
+
opts.delete(:tag_query) if opts[:tag_query]
|
62
|
+
raise PushIo::MissingOptionsError, "A valid API Key was not specified" unless api_key =~ PushIo::API_KEY_REGEX
|
63
|
+
raise PushIo::MissingOptionsError, "Device IDs need to be specified in an array" unless device_id_array.is_a? Array
|
64
|
+
opts[:recipient_ids] = {api_key => device_id_array}
|
65
|
+
send_devices_post(opts) if ready_to_deliver_to_devices?(opts)
|
32
66
|
end
|
33
67
|
|
68
|
+
def deliver_to_tokens(api_key, device_token_array, *args)
|
69
|
+
opts = args.extract_options!
|
70
|
+
opts.delete(:audience) if opts[:audience]
|
71
|
+
opts.delete(:tag_query) if opts[:tag_query]
|
72
|
+
raise PushIo::MissingOptionsError, "A valid API Key was not specified" unless api_key =~ PushIo::API_KEY_REGEX
|
73
|
+
raise PushIo::MissingOptionsError, "Device tokens need to be specified in an array" unless device_token_array.is_a? Array
|
74
|
+
opts[:recipient_tokens] = {api_key => device_token_array}
|
75
|
+
send_devices_post(opts) if ready_to_deliver_to_devices?(opts)
|
76
|
+
end
|
77
|
+
|
78
|
+
|
34
79
|
private
|
80
|
+
|
81
|
+
def ready_to_deliver?(opts)
|
82
|
+
if (opts.keys & [:tag_query, :audience]).empty?
|
83
|
+
raise PushIo::MissingOptionsError, "No tag_query or audience was specified"
|
84
|
+
end
|
85
|
+
if (opts.keys & [:tag_query, :audience]).length == 2
|
86
|
+
raise PushIo::MissingOptionsError, "Please specify tag_query or audience but not both"
|
87
|
+
end
|
88
|
+
raise PushIo::MissingOptionsError, "Please specify a payload" unless opts[:payload]
|
89
|
+
true
|
90
|
+
end
|
91
|
+
|
35
92
|
def send_url
|
36
93
|
"#{@config.endpoint_url}#{PushIo::NOTIFY_APP_PATH}#{@config.app_guid}/#{@config.sender_secret}"
|
37
94
|
end
|
38
|
-
|
39
|
-
|
95
|
+
|
96
|
+
def send_post(opts)
|
97
|
+
response = self.httpclient.post(send_url, {:body => build_post(opts)})
|
98
|
+
parse_response(response)
|
99
|
+
end
|
100
|
+
|
101
|
+
def build_post(opts)
|
102
|
+
opts[:payload] = MultiJson.dump(opts[:payload])
|
103
|
+
opts[:recipient_ids] = MultiJson.dump(opts[:recipient_ids]) if opts[:recipient_ids]
|
104
|
+
opts[:recipient_tokens] = MultiJson.dump(opts[:recipient_tokens]) if opts[:recipient_tokens]
|
105
|
+
opts
|
106
|
+
end
|
107
|
+
|
108
|
+
def parse_response(response)
|
109
|
+
if response.code == 201
|
110
|
+
response_hash = MultiJson.load(response.body)
|
111
|
+
return response_hash['notification_guid']
|
112
|
+
end
|
113
|
+
raise PushIo::DeliveryError, response.body
|
40
114
|
end
|
41
|
-
|
42
|
-
|
115
|
+
|
116
|
+
|
117
|
+
def send_devices_url
|
118
|
+
"#{@config.endpoint_url}#{PushIo::NOTIFY_DEVICES_PATH}#{@config.app_guid}/#{@config.sender_secret}"
|
43
119
|
end
|
120
|
+
|
121
|
+
def send_devices_post(opts)
|
122
|
+
response = self.httpclient.post(send_devices_url, {:body => build_post(opts)})
|
123
|
+
parse_response(response)
|
124
|
+
end
|
125
|
+
|
126
|
+
def ready_to_deliver_to_devices?(opts)
|
127
|
+
if (opts.keys & [:recipient_ids, :recipient_tokens]).empty?
|
128
|
+
raise PushIo::MissingOptionsError, "No tag_query or audience was specified"
|
129
|
+
end
|
130
|
+
if (opts.keys & [:recipient_ids, :recipient_tokens]).length == 2
|
131
|
+
raise PushIo::MissingOptionsError, "Please specify recipient_ids or recipient_tokens but not both"
|
132
|
+
end
|
133
|
+
raise PushIo::MissingOptionsError, "Please specify a payload" unless opts[:payload]
|
134
|
+
true
|
135
|
+
end
|
136
|
+
|
44
137
|
end
|
45
138
|
end
|
data/lib/push_io/errors.rb
CHANGED
data/lib/push_io/version.rb
CHANGED
data/pushio.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
require File.expand_path('../lib/push_io/version', __FILE__)
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
|
-
gem.authors = ["Push IO
|
5
|
+
gem.authors = ["Push IO Inc.", "Sean McKibben"]
|
6
6
|
gem.email = ["sean@push.io"]
|
7
7
|
gem.description = %q{Ruby client library to send push notifications via the Push IO API. See: http://push.io for more information and to set up your account.}
|
8
8
|
gem.summary = %q{This gem enables developers to easily create new notifications and send them via the Push IO API from Ruby apps.}
|
data/spec/push_io_spec.rb
CHANGED
@@ -4,21 +4,34 @@ require 'push_io'
|
|
4
4
|
describe PushIo do
|
5
5
|
context "unconfigured" do
|
6
6
|
it "should tell you how to configure" do
|
7
|
-
expect{PushIo::Client.new}.to raise_error(PushIo::UnconfiguredClientError)
|
7
|
+
expect { PushIo::Client.new }.to raise_error(PushIo::UnconfiguredClientError)
|
8
8
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
context "configured" do
|
12
|
+
test_keys_path = File.expand_path("../pushio_config.yml", __FILE__)
|
13
|
+
test_keys = {}
|
14
|
+
if File.exists? test_keys_path
|
15
|
+
test_keys = YAML.load_file(test_keys_path)
|
16
|
+
end
|
17
|
+
let(:endpoint_url) { test_keys[:endpoint_url] || "https://manage.push.io" }
|
18
|
+
let(:app_guid) { test_keys[:app_guid] || "abcdefghij" }
|
19
|
+
let(:api_key) { test_keys[:api_key] || "abcdefghij_apns" }
|
20
|
+
let(:sender_secret) { test_keys[:sender_secret] || "m42PGzAqQAdEcY1w2fpN" }
|
21
|
+
let(:device_id) { test_keys[:device_id] || "B3606524-AE35-458A-9FE9-7B6FE8D99CE4" }
|
22
|
+
let(:device_token) { test_keys[:device_token] || "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd" }
|
12
23
|
before :each do
|
13
24
|
PushIo::Client.configure do |config|
|
14
|
-
config.
|
15
|
-
config.
|
25
|
+
config.endpoint_url = endpoint_url
|
26
|
+
config.app_guid = app_guid
|
27
|
+
config.sender_secret = sender_secret
|
16
28
|
end
|
17
29
|
end
|
18
30
|
it "should allow configuration" do
|
19
31
|
client = PushIo::Client.new
|
20
|
-
client.config.app_guid.should ==
|
21
|
-
client.config.sender_secret.should ==
|
32
|
+
client.config.app_guid.should == app_guid
|
33
|
+
client.config.sender_secret.should == sender_secret
|
34
|
+
client.config.endpoint_url.should == endpoint_url
|
22
35
|
end
|
23
36
|
it "should allow configuration override" do
|
24
37
|
client = PushIo::Client.new(:app_guid => "aaaa", :sender_secret => "qqqq")
|
@@ -27,11 +40,59 @@ describe PushIo do
|
|
27
40
|
end
|
28
41
|
it "makes a send url" do
|
29
42
|
client = PushIo::Client.new
|
30
|
-
client.send(:send_url).should == "
|
31
|
-
client = PushIo::Client.new(:app_guid => "aaaa", :sender_secret => "qqqq")
|
32
|
-
client.send(:send_url).should == "
|
33
|
-
|
34
|
-
|
43
|
+
client.send(:send_url).should == "#{endpoint_url}/api/v1/notify_app/#{app_guid}/#{sender_secret}"
|
44
|
+
client = PushIo::Client.new(:endpoint_url => "http://localhost:3000", :app_guid => "aaaa", :sender_secret => "qqqq")
|
45
|
+
client.send(:send_url).should == "http://localhost:3000/api/v1/notify_app/aaaa/qqqq"
|
46
|
+
end
|
47
|
+
|
48
|
+
it "sends inlined" do
|
49
|
+
notification_id = PushIo::Client.new.deliver_broadcast :payload => {:message => "Inlined Test"}
|
50
|
+
notification_id.should_not be_nil
|
51
|
+
notification_id.should start_with app_guid
|
52
|
+
end
|
53
|
+
it "sends a generic push" do
|
54
|
+
client = PushIo::Client.new
|
55
|
+
client.send(:httpclient).send(:debug_dev=, STDOUT)
|
56
|
+
notification_id = client.deliver :payload => {:message => "Generic Test"}, :tag_query => "Alpha or Bravo"
|
57
|
+
notification_id.should_not be_nil
|
58
|
+
notification_id.should start_with app_guid
|
59
|
+
end
|
60
|
+
it "sends a broadcast" do
|
61
|
+
client = PushIo::Client.new
|
62
|
+
client.send(:httpclient).send(:debug_dev=, STDOUT)
|
63
|
+
notification_id = client.deliver_broadcast :payload => {:message => "Broadcast Test"}
|
64
|
+
notification_id.should_not be_nil
|
65
|
+
notification_id.should start_with app_guid
|
66
|
+
end
|
67
|
+
it "sends to an audience" do
|
68
|
+
client = PushIo::Client.new
|
69
|
+
client.send(:httpclient).send(:debug_dev=, STDOUT)
|
70
|
+
notification_id = client.deliver_to_audience "broadcast", :payload => {:message => "Howdy Friends", :payload_apns => {:badge => 8}}
|
71
|
+
notification_id.should_not be_nil
|
72
|
+
notification_id.should start_with app_guid
|
73
|
+
end
|
74
|
+
it "sends a query push" do
|
75
|
+
client = PushIo::Client.new
|
76
|
+
client.send(:httpclient).send(:debug_dev=, STDOUT)
|
77
|
+
notification_id = client.deliver_to_query "Alpha or Bravo", :payload => {:message => "Query Test"}
|
78
|
+
notification_id.should_not be_nil
|
79
|
+
notification_id.should start_with app_guid
|
80
|
+
end
|
81
|
+
|
82
|
+
it "sends to device ids" do
|
83
|
+
client = PushIo::Client.new
|
84
|
+
client.send(:httpclient).send(:debug_dev=, STDOUT)
|
85
|
+
notification_id = client.deliver_to_ids api_key, [device_id], :payload => {:message => "Device ID Test"}
|
86
|
+
notification_id.should_not be_nil
|
87
|
+
notification_id.should start_with app_guid
|
88
|
+
end
|
89
|
+
|
90
|
+
it "sends to device tokens" do
|
91
|
+
client = PushIo::Client.new
|
92
|
+
client.send(:httpclient).send(:debug_dev=, STDOUT)
|
93
|
+
notification_id = client.deliver_to_tokens api_key, [device_token], :payload => {:message => "Device Token Test"}
|
94
|
+
notification_id.should_not be_nil
|
95
|
+
notification_id.should start_with app_guid
|
35
96
|
end
|
36
97
|
end
|
37
98
|
|
metadata
CHANGED
@@ -1,20 +1,20 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pushio
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
|
-
- Push IO
|
8
|
+
- Push IO Inc.
|
9
9
|
- Sean McKibben
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2013-07-18 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: httpclient
|
17
|
-
requirement: &
|
17
|
+
requirement: &70111734375140 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: 2.2.7
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *70111734375140
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: multi_json
|
28
|
-
requirement: &
|
28
|
+
requirement: &70111734374220 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ! '>='
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: 1.3.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *70111734374220
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: rspec
|
39
|
-
requirement: &
|
39
|
+
requirement: &70111734373300 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ! '>='
|
@@ -44,7 +44,7 @@ dependencies:
|
|
44
44
|
version: 2.11.0
|
45
45
|
type: :development
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *70111734373300
|
48
48
|
description: ! 'Ruby client library to send push notifications via the Push IO API.
|
49
49
|
See: http://push.io for more information and to set up your account.'
|
50
50
|
email:
|
@@ -62,9 +62,11 @@ files:
|
|
62
62
|
- lib/push_io/client.rb
|
63
63
|
- lib/push_io/configuration.rb
|
64
64
|
- lib/push_io/errors.rb
|
65
|
+
- lib/push_io/utils.rb
|
65
66
|
- lib/push_io/version.rb
|
66
67
|
- pushio.gemspec
|
67
68
|
- spec/push_io_spec.rb
|
69
|
+
- spec/pushio_config.example.yml
|
68
70
|
homepage: ''
|
69
71
|
licenses: []
|
70
72
|
post_install_message:
|
@@ -92,3 +94,4 @@ summary: This gem enables developers to easily create new notifications and send
|
|
92
94
|
via the Push IO API from Ruby apps.
|
93
95
|
test_files:
|
94
96
|
- spec/push_io_spec.rb
|
97
|
+
- spec/pushio_config.example.yml
|