houston 0.1.1 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +9 -9
- data/README.md +33 -19
- data/Rakefile +0 -1
- data/bin/apn +34 -14
- data/houston.gemspec +5 -4
- data/lib/houston.rb +1 -1
- data/lib/houston/client.rb +20 -36
- data/lib/houston/connection.rb +50 -17
- data/lib/houston/notification.rb +6 -4
- metadata +17 -33
- data/houston-0.1.0.gem +0 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 665f646fd8d10f128f8b408a5723bdfa846a6e49
|
4
|
+
data.tar.gz: a7d075a67f504cbdfcbebe585d21e8e26d770d9e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 00c7bc4612f323d159411ce835a21e5c28acf85395c685bab5b7ad87e9d1a7d0378d02e2c4980e29bbb10bfe32c4ad844d04447c37edb18954ff36bafa58ab87
|
7
|
+
data.tar.gz: 4b4be23b6122e002f391e5d4577cae6897f519696008c5c926e1e39de917055bba0e6740cf53533b967cd14da8581076e2f4d65ab5e89ff84681f4fece50e530
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
houston (0.
|
5
|
-
commander (~> 4.1
|
6
|
-
json
|
4
|
+
houston (0.2.1)
|
5
|
+
commander (~> 4.1)
|
6
|
+
json
|
7
7
|
|
8
8
|
GEM
|
9
|
-
remote:
|
9
|
+
remote: https://rubygems.org/
|
10
10
|
specs:
|
11
|
-
commander (4.1.
|
11
|
+
commander (4.1.3)
|
12
12
|
highline (~> 1.6.11)
|
13
|
-
highline (1.6.
|
14
|
-
json (1.7.
|
13
|
+
highline (1.6.18)
|
14
|
+
json (1.7.7)
|
15
15
|
rake (0.9.2.2)
|
16
16
|
rspec (0.6.4)
|
17
17
|
|
@@ -20,5 +20,5 @@ PLATFORMS
|
|
20
20
|
|
21
21
|
DEPENDENCIES
|
22
22
|
houston!
|
23
|
-
rake (~> 0.9
|
24
|
-
rspec (~> 0.6
|
23
|
+
rake (~> 0.9)
|
24
|
+
rspec (~> 0.6)
|
data/README.md
CHANGED
@@ -1,23 +1,23 @@
|
|
1
1
|
# Houston
|
2
2
|
**Apple Push Notifications. No Dirigible Required**
|
3
3
|
|
4
|
-
> Houston, We Have Liftoff!
|
5
|
-
|
6
4
|
Push Notifications don't have to be difficult.
|
7
5
|
|
8
6
|
Houston is a simple gem for sending Apple Push Notifications. Pass your credentials, construct your message, and send it.
|
9
7
|
|
10
8
|
In a production application, you will probably want to schedule or queue notifications into a background job. Whether you're using [queue_classic](https://github.com/ryandotsmith/queue_classic), [resque](https://github.com/defunkt/resque), or rolling you own infrastructure, integrating Houston couldn't be simpler.
|
11
9
|
|
12
|
-
Another caveat is that Houston doesn't manage device tokens for you.
|
10
|
+
Another caveat is that Houston doesn't manage device tokens for you. For that, you should check out [Helios](http://helios.io)
|
11
|
+
|
12
|
+
> Houston's is named for [Houston, TX](http://en.wikipedia.org/wiki/Houston), the metonymical home of [NASA's Johnson Space Center](http://en.wikipedia.org/wiki/Lyndon_B._Johnson_Space_Center), as in _Houston, We Have Liftoff!_.
|
13
|
+
|
14
|
+
> It's part of a series of world-class command-line utilities for iOS development, which includes [Cupertino](https://github.com/mattt/cupertino) (Apple Dev Center management), [Shenzhen](https://github.com/mattt/shenzhen) (Building & Distribution), [Venice](https://github.com/mattt/venice) (In-App Purchase Receipt Verification), and [Dubai](https://github.com/mattt/dubai) (Passbook pass generation).
|
13
15
|
|
14
|
-
|
16
|
+
> This project is also part of a series of open source libraries covering the mission-critical aspects of an iOS app's infrastructure. Be sure to check out its sister projects: [GroundControl](https://github.com/mattt/GroundControl), [SkyLab](https://github.com/mattt/SkyLab), [houston](https://github.com/mattt/houston), and [Orbiter](https://github.com/mattt/Orbiter).
|
15
17
|
|
16
18
|
## Installation
|
17
19
|
|
18
|
-
|
19
|
-
$ gem install houston
|
20
|
-
```
|
20
|
+
$ gem install houston
|
21
21
|
|
22
22
|
## Usage
|
23
23
|
|
@@ -34,22 +34,38 @@ token = "<ce8be627 2e43e855 16033e24 b4c28922 0eeda487 9c477160 b2545e95 b68b596
|
|
34
34
|
notification = Houston::Notification.new(device: token)
|
35
35
|
notification.alert = "Hello, World!"
|
36
36
|
|
37
|
-
# Notifications can also change the badge count, have a custom sound, or pass along arbitrary data.
|
37
|
+
# Notifications can also change the badge count, have a custom sound, indicate available Newsstand content, or pass along arbitrary data.
|
38
38
|
notification.badge = 57
|
39
39
|
notification.sound = "sosumi.aiff"
|
40
|
+
notification.content_available = true
|
40
41
|
notification.custom_data = {foo: "bar"}
|
41
42
|
|
42
43
|
# And... sent! That's all it takes.
|
43
44
|
APN.push(notification)
|
44
45
|
```
|
45
46
|
|
47
|
+
### Persistent Connections
|
48
|
+
|
49
|
+
If you want to manage your own persistent connection to Apple push services, such as for background workers, here's how to do it:
|
50
|
+
|
51
|
+
```ruby
|
52
|
+
certificate = File.read("/path/to/apple_push_notification.pem")
|
53
|
+
passphrase = "..."
|
54
|
+
connection = Houston::Connection.new(APPLE_DEVELOPMENT_GATEWAY_URI, certificate, passphrase)
|
55
|
+
connection.open
|
56
|
+
|
57
|
+
notification = Houston::Notification.new(device: token)
|
58
|
+
notification.alert = "Hello, World!"
|
59
|
+
connection.write(notification.message)
|
60
|
+
|
61
|
+
connection.close
|
62
|
+
```
|
63
|
+
|
46
64
|
## Command Line Tool
|
47
65
|
|
48
66
|
Houston also comes with the `apn` binary, which provides a convenient way to test notifications from the command line.
|
49
67
|
|
50
|
-
|
51
|
-
$ apn push "<token>" -c /path/to/apple_push_notification.pem -m "Hello from the command line!"
|
52
|
-
```
|
68
|
+
$ apn push "<token>" -c /path/to/apple_push_notification.pem -m "Hello from the command line!"
|
53
69
|
|
54
70
|
## Enabling Push Notifications on iOS
|
55
71
|
|
@@ -62,8 +78,8 @@ $ apn push "<token>" -c /path/to/apple_push_notification.pem -m "Hello from the
|
|
62
78
|
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
|
63
79
|
}
|
64
80
|
|
65
|
-
- (void)application:(UIApplication *)application
|
66
|
-
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
|
81
|
+
- (void)application:(UIApplication *)application
|
82
|
+
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
|
67
83
|
{
|
68
84
|
NSLog(@"application:didRegisterForRemoteNotificationsWithDeviceToken: %@", deviceToken);
|
69
85
|
|
@@ -71,7 +87,7 @@ didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
|
|
71
87
|
}
|
72
88
|
|
73
89
|
- (void)application:(UIApplication *)application
|
74
|
-
didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
|
90
|
+
didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
|
75
91
|
{
|
76
92
|
NSLog(@"Error: %@", error);
|
77
93
|
}
|
@@ -84,15 +100,13 @@ didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
|
|
84
100
|
Once you have the certificate from Apple for your application, export your key
|
85
101
|
and the apple certificate as p12 files. Here is a quick walkthrough on how to do this:
|
86
102
|
|
87
|
-
1. Click the disclosure arrow next to your certificate in Keychain Access and select the certificate and the key.
|
88
|
-
2. Right click and choose `Export 2 items…`.
|
103
|
+
1. Click the disclosure arrow next to your certificate in Keychain Access and select the certificate and the key.
|
104
|
+
2. Right click and choose `Export 2 items…`.
|
89
105
|
3. Choose the p12 format from the drop down and name it `cert.p12`.
|
90
106
|
|
91
107
|
Now covert the p12 file to a pem file:
|
92
108
|
|
93
|
-
|
94
|
-
$ openssl pkcs12 -in cert.p12 -out apple_push_notification.pem -nodes -clcerts
|
95
|
-
```
|
109
|
+
$ openssl pkcs12 -in cert.p12 -out apple_push_notification.pem -nodes -clcerts
|
96
110
|
|
97
111
|
## Contact
|
98
112
|
|
data/Rakefile
CHANGED
data/bin/apn
CHANGED
@@ -25,10 +25,13 @@ command :push do |c|
|
|
25
25
|
c.option '-m', '--alert ALERT', 'Body of the alert to send in the push notification'
|
26
26
|
c.option '-b', '--badge NUMBER', 'Badge number to set with the push notification'
|
27
27
|
c.option '-s', '--sound SOUND', 'Sound to play with the notification'
|
28
|
-
c.option '-
|
28
|
+
c.option '-n', '--[no]-newsstand', 'Indicates content available for Newsstand'
|
29
|
+
c.option '-d', '--data KEY=VALUE', Array, 'Passes custom data to payload (as comma-delimited "key=value" declarations)'
|
30
|
+
c.option '-P', '--payload PAYLOAD', 'JSON payload for notifications'
|
31
|
+
c.option '-e', '--environment ENV', [:production, :development], 'Environment to send push notification (production or development (default))'
|
29
32
|
c.option '-c', '--certificate CERTIFICATE', 'Path to certificate (.pem) file'
|
30
33
|
c.option '-p', '--[no]-passphrase', 'Prompt for a certificate passphrase'
|
31
|
-
|
34
|
+
|
32
35
|
c.action do |args, options|
|
33
36
|
say_error "One or more device tokens required" and abort if args.empty?
|
34
37
|
|
@@ -44,21 +47,38 @@ command :push do |c|
|
|
44
47
|
@alert = options.alert
|
45
48
|
@badge = options.badge.nil? ? nil : options.badge.to_i
|
46
49
|
@sound = options.sound
|
50
|
+
@content_available = options.newsstand
|
51
|
+
|
52
|
+
if options.payload
|
53
|
+
begin
|
54
|
+
@data = JSON.parse(options.payload)
|
55
|
+
rescue => message
|
56
|
+
say_error "Exception parsing JSON payload: #{message}" and abort
|
57
|
+
end
|
58
|
+
elsif options.data
|
59
|
+
begin
|
60
|
+
@data = Hash[options.data.collect{|data| data.split(/\=/)}]
|
61
|
+
rescue => message
|
62
|
+
say_error "Exception parsing JSON payload: #{message}" and abort
|
63
|
+
end
|
64
|
+
end
|
47
65
|
|
48
|
-
unless @alert or @badge
|
66
|
+
unless @alert or @badge or @newsstand or @data
|
49
67
|
placeholder = "Enter your alert message"
|
50
68
|
@alert = ask_editor placeholder
|
51
|
-
say_error "
|
69
|
+
say_error "Payload contents required" and abort if @alert.nil? or @alert == placeholder
|
52
70
|
end
|
53
71
|
|
54
|
-
notifications = []
|
72
|
+
@notifications = []
|
55
73
|
args.each do |token|
|
56
|
-
notification = Houston::Notification.new(
|
57
|
-
notification.
|
58
|
-
notification.
|
59
|
-
notification.
|
60
|
-
|
61
|
-
|
74
|
+
notification = Houston::Notification.new(@data || {})
|
75
|
+
notification.device = token
|
76
|
+
notification.alert = @alert if @alert
|
77
|
+
notification.badge = @badge if @badge
|
78
|
+
notification.sound = @sound if @sound
|
79
|
+
notification.content_available = @newsstand if @newsstand
|
80
|
+
|
81
|
+
@notifications << notification
|
62
82
|
end
|
63
83
|
|
64
84
|
client = @environment == :production ? Houston::Client.production : Houston::Client.development
|
@@ -66,9 +86,9 @@ command :push do |c|
|
|
66
86
|
client.passphrase = @passphrase
|
67
87
|
|
68
88
|
begin
|
69
|
-
client.push(
|
70
|
-
rescue =>
|
71
|
-
say_error "Exception sending notification: #{
|
89
|
+
client.push(*@notifications)
|
90
|
+
rescue => message
|
91
|
+
say_error "Exception sending notification: #{message}" and abort
|
72
92
|
end
|
73
93
|
|
74
94
|
say_ok "Push notifications successfully sent"
|
data/houston.gemspec
CHANGED
@@ -6,17 +6,18 @@ Gem::Specification.new do |s|
|
|
6
6
|
s.name = "houston"
|
7
7
|
s.authors = ["Mattt Thompson"]
|
8
8
|
s.email = "m@mattt.me"
|
9
|
+
s.license = "MIT"
|
9
10
|
s.homepage = "http://github.com/mattt/houston"
|
10
11
|
s.version = Houston::VERSION
|
11
12
|
s.platform = Gem::Platform::RUBY
|
12
13
|
s.summary = "Send Apple Push Notifications"
|
13
14
|
s.description = "Houston is a simple gem for sending Apple Push Notifications. Pass your credentials, construct your message, and send it."
|
14
15
|
|
15
|
-
s.add_dependency "commander", "~> 4.1
|
16
|
-
s.add_dependency "json"
|
16
|
+
s.add_dependency "commander", "~> 4.1"
|
17
|
+
s.add_dependency "json"
|
17
18
|
|
18
|
-
s.add_development_dependency "rspec", "~> 0.6
|
19
|
-
s.add_development_dependency "rake", "~> 0.9
|
19
|
+
s.add_development_dependency "rspec", "~> 0.6"
|
20
|
+
s.add_development_dependency "rake", "~> 0.9"
|
20
21
|
|
21
22
|
s.files = Dir["./**/*"].reject { |file| file =~ /\.\/(bin|log|pkg|script|spec|test|vendor)/ }
|
22
23
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
data/lib/houston.rb
CHANGED
data/lib/houston/client.rb
CHANGED
@@ -3,11 +3,27 @@ module Houston
|
|
3
3
|
APPLE_PRODUCTION_FEEDBACK_URI = "apn://feedback.push.apple.com:2196"
|
4
4
|
|
5
5
|
APPLE_DEVELOPMENT_GATEWAY_URI = "apn://gateway.sandbox.push.apple.com:2195"
|
6
|
-
APPLE_DEVELOPMENT_FEEDBACK_URI = "apn://feedback.push.apple.com:2196"
|
6
|
+
APPLE_DEVELOPMENT_FEEDBACK_URI = "apn://feedback.sandbox.push.apple.com:2196"
|
7
7
|
|
8
8
|
class Client
|
9
9
|
attr_accessor :gateway_uri, :feedback_uri, :certificate, :passphrase
|
10
10
|
|
11
|
+
class << self
|
12
|
+
def development
|
13
|
+
client = self.new
|
14
|
+
client.gateway_uri = APPLE_DEVELOPMENT_GATEWAY_URI
|
15
|
+
client.feedback_uri = APPLE_DEVELOPMENT_FEEDBACK_URI
|
16
|
+
client
|
17
|
+
end
|
18
|
+
|
19
|
+
def production
|
20
|
+
client = self.new
|
21
|
+
client.gateway_uri = APPLE_PRODUCTION_GATEWAY_URI
|
22
|
+
client.feedback_uri = APPLE_PRODUCTION_FEEDBACK_URI
|
23
|
+
client
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
11
27
|
def initialize
|
12
28
|
@gateway_uri = ENV['APN_GATEWAY_URI']
|
13
29
|
@feedback_uri = ENV['APN_FEEDBACK_URI']
|
@@ -15,24 +31,10 @@ module Houston
|
|
15
31
|
@passphrase = ENV['APN_CERTIFICATE_PASSPHRASE']
|
16
32
|
end
|
17
33
|
|
18
|
-
def self.development
|
19
|
-
client = self.new
|
20
|
-
client.gateway_uri = APPLE_DEVELOPMENT_GATEWAY_URI
|
21
|
-
client.feedback_uri = APPLE_DEVELOPMENT_FEEDBACK_URI
|
22
|
-
client
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.production
|
26
|
-
client = self.new
|
27
|
-
client.gateway_uri = APPLE_PRODUCTION_GATEWAY_URI
|
28
|
-
client.feedback_uri = APPLE_PRODUCTION_FEEDBACK_URI
|
29
|
-
client
|
30
|
-
end
|
31
|
-
|
32
34
|
def push(*notifications)
|
33
35
|
return if notifications.empty?
|
34
36
|
|
35
|
-
Connection.open(
|
37
|
+
Connection.open(@gateway_uri, @certificate, @passphrase) do |connection|
|
36
38
|
notifications.flatten.each do |notification|
|
37
39
|
next unless notification.kind_of?(Notification)
|
38
40
|
next if notification.sent?
|
@@ -46,9 +48,9 @@ module Houston
|
|
46
48
|
def devices
|
47
49
|
devices = []
|
48
50
|
|
49
|
-
Connection.open(
|
51
|
+
Connection.open(@feedback_uri, @certificate, @passphrase) do |connection|
|
50
52
|
while line = connection.read(38)
|
51
|
-
feedback = line.unpack('N1n1H140')
|
53
|
+
feedback = line.unpack('N1n1H140')
|
52
54
|
token = feedback[2].scan(/.{0,8}/).join(' ').strip
|
53
55
|
devices << token if token
|
54
56
|
end
|
@@ -56,23 +58,5 @@ module Houston
|
|
56
58
|
|
57
59
|
devices
|
58
60
|
end
|
59
|
-
|
60
|
-
private
|
61
|
-
|
62
|
-
def connection_options_for_endpoint(endpoint = :gateway)
|
63
|
-
uri = case endpoint
|
64
|
-
when :gateway then URI(@gateway_uri)
|
65
|
-
when :feedback then URI(@feedback_uri)
|
66
|
-
else
|
67
|
-
raise ArgumentError
|
68
|
-
end
|
69
|
-
|
70
|
-
{
|
71
|
-
certificate: @certificate,
|
72
|
-
passphrase: @passphrase,
|
73
|
-
host: uri.host,
|
74
|
-
port: uri.port
|
75
|
-
}
|
76
|
-
end
|
77
61
|
end
|
78
62
|
end
|
data/lib/houston/connection.rb
CHANGED
@@ -1,32 +1,65 @@
|
|
1
1
|
require 'uri'
|
2
2
|
require 'socket'
|
3
3
|
require 'openssl'
|
4
|
+
require 'forwardable'
|
4
5
|
|
5
6
|
module Houston
|
6
7
|
class Connection
|
8
|
+
extend Forwardable
|
9
|
+
def_delegators :@ssl, :read, :write
|
10
|
+
def_delegators :@uri, :scheme, :host, :port
|
11
|
+
|
12
|
+
attr_reader :ssl, :socket, :certificate, :passphrase
|
13
|
+
|
7
14
|
class << self
|
8
|
-
def open(
|
15
|
+
def open(uri, certificate, passphrase)
|
9
16
|
return unless block_given?
|
10
17
|
|
11
|
-
|
12
|
-
|
13
|
-
end
|
14
|
-
|
15
|
-
socket = TCPSocket.new(options[:host], options[:port])
|
18
|
+
connection = new(uri, certificate, passphrase)
|
19
|
+
connection.open
|
16
20
|
|
17
|
-
|
18
|
-
context.key = OpenSSL::PKey::RSA.new(options[:certificate], options[:passphrase])
|
19
|
-
context.cert = OpenSSL::X509::Certificate.new(options[:certificate])
|
21
|
+
yield connection
|
20
22
|
|
21
|
-
|
22
|
-
ssl.sync = true
|
23
|
-
ssl.connect
|
24
|
-
|
25
|
-
yield ssl, socket
|
26
|
-
|
27
|
-
ssl.close
|
28
|
-
socket.close
|
23
|
+
connection.close
|
29
24
|
end
|
30
25
|
end
|
26
|
+
|
27
|
+
def initialize(uri, certificate, passphrase)
|
28
|
+
@uri = URI(uri)
|
29
|
+
@certificate = certificate
|
30
|
+
@passphrase = passphrase
|
31
|
+
end
|
32
|
+
|
33
|
+
def open
|
34
|
+
return false if open?
|
35
|
+
|
36
|
+
@socket = TCPSocket.new(@uri.host, @uri.port)
|
37
|
+
|
38
|
+
context = OpenSSL::SSL::SSLContext.new
|
39
|
+
context.key = OpenSSL::PKey::RSA.new(@certificate, @passphrase)
|
40
|
+
context.cert = OpenSSL::X509::Certificate.new(@certificate)
|
41
|
+
|
42
|
+
@ssl = OpenSSL::SSL::SSLSocket.new(@socket, context)
|
43
|
+
@ssl.sync = true
|
44
|
+
@ssl.connect
|
45
|
+
end
|
46
|
+
|
47
|
+
def open?
|
48
|
+
not (@ssl and @socket).nil?
|
49
|
+
end
|
50
|
+
|
51
|
+
def close
|
52
|
+
return false if closed?
|
53
|
+
|
54
|
+
@ssl.close
|
55
|
+
@ssl = nil
|
56
|
+
|
57
|
+
@socket.close
|
58
|
+
@socket = nil
|
59
|
+
end
|
60
|
+
|
61
|
+
def closed?
|
62
|
+
not open?
|
63
|
+
end
|
31
64
|
end
|
32
65
|
end
|
data/lib/houston/notification.rb
CHANGED
@@ -2,7 +2,7 @@ require 'json'
|
|
2
2
|
|
3
3
|
module Houston
|
4
4
|
class Notification
|
5
|
-
attr_accessor :device, :alert, :badge, :sound, :custom_data
|
5
|
+
attr_accessor :device, :alert, :badge, :sound, :content_available, :custom_data
|
6
6
|
attr_reader :sent_at
|
7
7
|
|
8
8
|
def initialize(options = {})
|
@@ -10,6 +10,7 @@ module Houston
|
|
10
10
|
@alert = options.delete(:alert)
|
11
11
|
@badge = options.delete(:badge)
|
12
12
|
@sound = options.delete(:sound)
|
13
|
+
@content_available = options.delete(:content_available)
|
13
14
|
|
14
15
|
@custom_data = options
|
15
16
|
end
|
@@ -17,9 +18,10 @@ module Houston
|
|
17
18
|
def payload
|
18
19
|
json = {}.merge(@custom_data || {})
|
19
20
|
json['aps'] = {}
|
20
|
-
json['aps']['alert'] = @alert
|
21
|
-
json['aps']['badge'] = @badge.to_i rescue 0
|
22
|
-
json['aps']['sound'] = @sound
|
21
|
+
json['aps']['alert'] = @alert if @alert
|
22
|
+
json['aps']['badge'] = @badge.to_i rescue 0 if @badge
|
23
|
+
json['aps']['sound'] = @sound if @sound
|
24
|
+
json['aps']['content-available'] = 1 if @content_available
|
23
25
|
|
24
26
|
json
|
25
27
|
end
|
metadata
CHANGED
@@ -1,80 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: houston
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.2.1
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Mattt Thompson
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2013-04-24 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: commander
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - ~>
|
20
18
|
- !ruby/object:Gem::Version
|
21
|
-
version: 4.1
|
19
|
+
version: '4.1'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
24
|
- - ~>
|
28
25
|
- !ruby/object:Gem::Version
|
29
|
-
version: 4.1
|
26
|
+
version: '4.1'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: json
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - ! '>='
|
36
32
|
- !ruby/object:Gem::Version
|
37
|
-
version:
|
33
|
+
version: '0'
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - ! '>='
|
44
39
|
- !ruby/object:Gem::Version
|
45
|
-
version:
|
40
|
+
version: '0'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: rspec
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
45
|
- - ~>
|
52
46
|
- !ruby/object:Gem::Version
|
53
|
-
version: 0.6
|
47
|
+
version: '0.6'
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
52
|
- - ~>
|
60
53
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.6
|
54
|
+
version: '0.6'
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: rake
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
59
|
- - ~>
|
68
60
|
- !ruby/object:Gem::Version
|
69
|
-
version: 0.9
|
61
|
+
version: '0.9'
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
66
|
- - ~>
|
76
67
|
- !ruby/object:Gem::Version
|
77
|
-
version: 0.9
|
68
|
+
version: '0.9'
|
78
69
|
description: Houston is a simple gem for sending Apple Push Notifications. Pass your
|
79
70
|
credentials, construct your message, and send it.
|
80
71
|
email: m@mattt.me
|
@@ -86,7 +77,6 @@ files:
|
|
86
77
|
- ./apple_push_notification_production.pem
|
87
78
|
- ./Gemfile
|
88
79
|
- ./Gemfile.lock
|
89
|
-
- ./houston-0.1.0.gem
|
90
80
|
- ./houston.gemspec
|
91
81
|
- ./lib/houston/client.rb
|
92
82
|
- ./lib/houston/connection.rb
|
@@ -97,33 +87,27 @@ files:
|
|
97
87
|
- ./README.md
|
98
88
|
- bin/apn
|
99
89
|
homepage: http://github.com/mattt/houston
|
100
|
-
licenses:
|
90
|
+
licenses:
|
91
|
+
- MIT
|
92
|
+
metadata: {}
|
101
93
|
post_install_message:
|
102
94
|
rdoc_options: []
|
103
95
|
require_paths:
|
104
96
|
- lib
|
105
97
|
required_ruby_version: !ruby/object:Gem::Requirement
|
106
|
-
none: false
|
107
98
|
requirements:
|
108
99
|
- - ! '>='
|
109
100
|
- !ruby/object:Gem::Version
|
110
101
|
version: '0'
|
111
|
-
segments:
|
112
|
-
- 0
|
113
|
-
hash: -1059375513586504727
|
114
102
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
115
|
-
none: false
|
116
103
|
requirements:
|
117
104
|
- - ! '>='
|
118
105
|
- !ruby/object:Gem::Version
|
119
106
|
version: '0'
|
120
|
-
segments:
|
121
|
-
- 0
|
122
|
-
hash: -1059375513586504727
|
123
107
|
requirements: []
|
124
108
|
rubyforge_project:
|
125
|
-
rubygems_version:
|
109
|
+
rubygems_version: 2.0.3
|
126
110
|
signing_key:
|
127
|
-
specification_version:
|
111
|
+
specification_version: 4
|
128
112
|
summary: Send Apple Push Notifications
|
129
113
|
test_files: []
|
data/houston-0.1.0.gem
DELETED
Binary file
|