houston 2.0.2 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +12 -4
- data/README.md +2 -2
- data/bin/apn +18 -13
- data/coverage/assets/0.7.1/application.css +1110 -0
- data/coverage/assets/0.7.1/application.js +626 -0
- data/coverage/assets/0.7.1/fancybox/blank.gif +0 -0
- data/coverage/assets/0.7.1/fancybox/fancy_close.png +0 -0
- data/coverage/assets/0.7.1/fancybox/fancy_loading.png +0 -0
- data/coverage/assets/0.7.1/fancybox/fancy_nav_left.png +0 -0
- data/coverage/assets/0.7.1/fancybox/fancy_nav_right.png +0 -0
- data/coverage/assets/0.7.1/fancybox/fancy_shadow_e.png +0 -0
- data/coverage/assets/0.7.1/fancybox/fancy_shadow_n.png +0 -0
- data/coverage/assets/0.7.1/fancybox/fancy_shadow_ne.png +0 -0
- data/coverage/assets/0.7.1/fancybox/fancy_shadow_nw.png +0 -0
- data/coverage/assets/0.7.1/fancybox/fancy_shadow_s.png +0 -0
- data/coverage/assets/0.7.1/fancybox/fancy_shadow_se.png +0 -0
- data/coverage/assets/0.7.1/fancybox/fancy_shadow_sw.png +0 -0
- data/coverage/assets/0.7.1/fancybox/fancy_shadow_w.png +0 -0
- data/coverage/assets/0.7.1/fancybox/fancy_title_left.png +0 -0
- data/coverage/assets/0.7.1/fancybox/fancy_title_main.png +0 -0
- data/coverage/assets/0.7.1/fancybox/fancy_title_over.png +0 -0
- data/coverage/assets/0.7.1/fancybox/fancy_title_right.png +0 -0
- data/coverage/assets/0.7.1/fancybox/fancybox-x.png +0 -0
- data/coverage/assets/0.7.1/fancybox/fancybox-y.png +0 -0
- data/coverage/assets/0.7.1/fancybox/fancybox.png +0 -0
- data/coverage/assets/0.7.1/favicon_green.png +0 -0
- data/coverage/assets/0.7.1/favicon_red.png +0 -0
- data/coverage/assets/0.7.1/favicon_yellow.png +0 -0
- data/coverage/assets/0.7.1/loading.gif +0 -0
- data/coverage/assets/0.7.1/magnify.png +0 -0
- data/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/coverage/assets/0.7.1/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/coverage/assets/0.7.1/smoothness/images/ui-icons_222222_256x240.png +0 -0
- data/coverage/assets/0.7.1/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
- data/coverage/assets/0.7.1/smoothness/images/ui-icons_454545_256x240.png +0 -0
- data/coverage/assets/0.7.1/smoothness/images/ui-icons_888888_256x240.png +0 -0
- data/coverage/assets/0.7.1/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/coverage/index.html +1708 -0
- data/houston.gemspec +1 -1
- data/lib/houston/client.rb +8 -3
- data/lib/houston/version.rb +1 -1
- data/spec/client_spec.rb +101 -0
- data/spec/notification_spec.rb +79 -41
- data/spec/spec_helper.rb +21 -0
- metadata +49 -9
- data/houston-0.3.1.gem +0 -0
- data/houston-2.0.0.gem +0 -0
- data/houston-2.0.1.gem +0 -0
data/houston.gemspec
CHANGED
@@ -16,7 +16,7 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.add_dependency "commander", "~> 4.1"
|
17
17
|
s.add_dependency "json"
|
18
18
|
|
19
|
-
s.add_development_dependency "rspec"
|
19
|
+
s.add_development_dependency "rspec", "~> 2.0"
|
20
20
|
s.add_development_dependency "rake"
|
21
21
|
s.add_development_dependency "simplecov"
|
22
22
|
|
data/lib/houston/client.rb
CHANGED
@@ -29,7 +29,7 @@ module Houston
|
|
29
29
|
@feedback_uri = ENV['APN_FEEDBACK_URI']
|
30
30
|
@certificate = ENV['APN_CERTIFICATE']
|
31
31
|
@passphrase = ENV['APN_CERTIFICATE_PASSPHRASE']
|
32
|
-
@timeout = ENV['APN_TIMEOUT'] || 0.5
|
32
|
+
@timeout = Float(ENV['APN_TIMEOUT'] || 0.5)
|
33
33
|
end
|
34
34
|
|
35
35
|
def push(*notifications)
|
@@ -78,18 +78,23 @@ module Houston
|
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
81
|
-
def
|
81
|
+
def unregistered_devices
|
82
82
|
devices = []
|
83
83
|
|
84
84
|
Connection.open(@feedback_uri, @certificate, @passphrase) do |connection|
|
85
85
|
while line = connection.read(38)
|
86
86
|
feedback = line.unpack('N1n1H140')
|
87
|
+
timestamp = feedback[0]
|
87
88
|
token = feedback[2].scan(/.{0,8}/).join(' ').strip
|
88
|
-
devices << token if token
|
89
|
+
devices << {token: token, timestamp: timestamp} if token && timestamp
|
89
90
|
end
|
90
91
|
end
|
91
92
|
|
92
93
|
devices
|
93
94
|
end
|
95
|
+
|
96
|
+
def devices
|
97
|
+
unregistered_devices.collect{|device| device[:token]}
|
98
|
+
end
|
94
99
|
end
|
95
100
|
end
|
data/lib/houston/version.rb
CHANGED
data/spec/client_spec.rb
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Houston::Client do
|
4
|
+
subject { Houston::Client.development }
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
stub_const("Houston::Connection", MockConnection)
|
8
|
+
end
|
9
|
+
|
10
|
+
context '#development' do
|
11
|
+
subject { Houston::Client.development }
|
12
|
+
|
13
|
+
describe '#gateway_uri' do
|
14
|
+
subject { super().gateway_uri }
|
15
|
+
it { should == Houston::APPLE_DEVELOPMENT_GATEWAY_URI}
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#feedback_uri' do
|
19
|
+
subject { super().feedback_uri }
|
20
|
+
it { should == Houston::APPLE_DEVELOPMENT_FEEDBACK_URI}
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context '#production' do
|
25
|
+
subject { Houston::Client.production }
|
26
|
+
|
27
|
+
describe '#gateway_uri' do
|
28
|
+
subject { super().gateway_uri }
|
29
|
+
it { should == Houston::APPLE_PRODUCTION_GATEWAY_URI}
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '#feedback_uri' do
|
33
|
+
subject { super().feedback_uri }
|
34
|
+
it { should == Houston::APPLE_PRODUCTION_FEEDBACK_URI}
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context '#new' do
|
39
|
+
context 'passing options through ENV' do
|
40
|
+
ENV['APN_GATEWAY_URI'] = "apn://gateway.example.com"
|
41
|
+
ENV['APN_FEEDBACK_URI'] = "apn://feedback.example.com"
|
42
|
+
ENV['APN_CERTIFICATE'] = "path/to/certificate"
|
43
|
+
ENV['APN_CERTIFICATE_PASSPHRASE'] = "passphrase"
|
44
|
+
ENV['APN_TIMEOUT'] = "10.0"
|
45
|
+
|
46
|
+
subject do
|
47
|
+
Houston::Client.new
|
48
|
+
end
|
49
|
+
|
50
|
+
describe '#gateway_uri' do
|
51
|
+
subject { super().gateway_uri }
|
52
|
+
it { should == ENV['APN_GATEWAY_URI'] }
|
53
|
+
end
|
54
|
+
|
55
|
+
describe '#feedback_uri' do
|
56
|
+
subject { super().feedback_uri }
|
57
|
+
it { should == ENV['APN_FEEDBACK_URI'] }
|
58
|
+
end
|
59
|
+
|
60
|
+
describe '#certificate' do
|
61
|
+
subject { super().certificate }
|
62
|
+
it { should == ENV['APN_CERTIFICATE'] }
|
63
|
+
end
|
64
|
+
|
65
|
+
describe '#passphrase' do
|
66
|
+
subject { super().passphrase }
|
67
|
+
it { should == ENV['APN_CERTIFICATE_PASSPHRASE'] }
|
68
|
+
end
|
69
|
+
|
70
|
+
describe '#timeout' do
|
71
|
+
subject { super().timeout }
|
72
|
+
it { should be_a(Float) }
|
73
|
+
it { should == Float(ENV['APN_TIMEOUT']) }
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
describe '#push' do
|
78
|
+
it 'should accept zero arguments' do
|
79
|
+
expect(Houston::Client.development.push()).to be_nil()
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe '#unregistered_devices' do
|
85
|
+
it 'should correctly parse the feedback response and create a dictionary of unregistered devices with timestamps' do
|
86
|
+
subject.unregistered_devices.should == [
|
87
|
+
{:token=>"ce8be627 2e43e855 16033e24 b4c28922 0eeda487 9c477160 b2545e95 b68b5969", :timestamp=>443779200},
|
88
|
+
{:token=>"ce8be627 2e43e855 16033e24 b4c28922 0eeda487 9c477160 b2545e95 b68b5970", :timestamp=>1388678223}
|
89
|
+
]
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe '#devices' do
|
94
|
+
it 'should correctly parse the feedback response and create an array of unregistered devices' do
|
95
|
+
subject.devices.should == [
|
96
|
+
"ce8be627 2e43e855 16033e24 b4c28922 0eeda487 9c477160 b2545e95 b68b5969",
|
97
|
+
"ce8be627 2e43e855 16033e24 b4c28922 0eeda487 9c477160 b2545e95 b68b5970"
|
98
|
+
]
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
data/spec/notification_spec.rb
CHANGED
@@ -19,15 +19,50 @@ describe Houston::Notification do
|
|
19
19
|
|
20
20
|
subject { Houston::Notification.new(notification_options) }
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
22
|
+
describe '#token' do
|
23
|
+
subject { super().token }
|
24
|
+
it { should == '<ce8be627 2e43e855 16033e24 b4c28922 0eeda487 9c477160 b2545e95 b68b5969>' }
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#alert' do
|
28
|
+
subject { super().alert }
|
29
|
+
it { should == 'Houston, we have a problem.' }
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '#badge' do
|
33
|
+
subject { super().badge }
|
34
|
+
it { should == 2701 }
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '#sound' do
|
38
|
+
subject { super().sound }
|
39
|
+
it { should == 'sosumi.aiff' }
|
40
|
+
end
|
41
|
+
|
42
|
+
describe '#expiry' do
|
43
|
+
subject { super().expiry }
|
44
|
+
it { should == 1234567890 }
|
45
|
+
end
|
46
|
+
|
47
|
+
describe '#id' do
|
48
|
+
subject { super().id }
|
49
|
+
it { should == 42 }
|
50
|
+
end
|
51
|
+
|
52
|
+
describe '#priority' do
|
53
|
+
subject { super().priority }
|
54
|
+
it { should == 10 }
|
55
|
+
end
|
56
|
+
|
57
|
+
describe '#content_available' do
|
58
|
+
subject { super().content_available }
|
59
|
+
it { should be_true }
|
60
|
+
end
|
61
|
+
|
62
|
+
describe '#custom_data' do
|
63
|
+
subject { super().custom_data }
|
64
|
+
it { should == { key1: 1, key2: 'abc' } }
|
65
|
+
end
|
31
66
|
|
32
67
|
context 'using :device instead of :token' do
|
33
68
|
subject do
|
@@ -36,12 +71,15 @@ describe Houston::Notification do
|
|
36
71
|
Houston::Notification.new(notification_options)
|
37
72
|
end
|
38
73
|
|
39
|
-
|
74
|
+
describe '#device' do
|
75
|
+
subject { super().device }
|
76
|
+
it { should == '<ce8be627 2e43e855 16033e24 b4c28922 0eeda487 9c477160 b2545e95 b68b5969>' }
|
77
|
+
end
|
40
78
|
end
|
41
79
|
|
42
80
|
describe '#payload' do
|
43
81
|
it 'should create a compliant dictionary' do
|
44
|
-
subject.payload.
|
82
|
+
expect(subject.payload).to eq({
|
45
83
|
'aps' => {
|
46
84
|
'alert' => 'Houston, we have a problem.',
|
47
85
|
'badge' => 2701,
|
@@ -50,75 +88,75 @@ describe Houston::Notification do
|
|
50
88
|
},
|
51
89
|
:key1 => 1,
|
52
90
|
:key2 => 'abc'
|
53
|
-
}
|
91
|
+
})
|
54
92
|
end
|
55
93
|
|
56
94
|
it 'should create a dictionary of only custom data and empty aps' do
|
57
|
-
Houston::Notification.new(key1: 123, key2: 'xyz').payload.
|
95
|
+
expect(Houston::Notification.new(key1: 123, key2: 'xyz').payload).to eq({
|
58
96
|
'aps' => {},
|
59
97
|
:key1 => 123,
|
60
98
|
:key2 => 'xyz'
|
61
|
-
}
|
99
|
+
})
|
62
100
|
end
|
63
101
|
|
64
102
|
it 'should create a dictionary only with alerts' do
|
65
|
-
Houston::Notification.new(alert: 'Hello, World!').payload.
|
103
|
+
expect(Houston::Notification.new(alert: 'Hello, World!').payload).to eq({
|
66
104
|
'aps' => { 'alert' => 'Hello, World!' }
|
67
|
-
}
|
105
|
+
})
|
68
106
|
end
|
69
107
|
|
70
108
|
it 'should create a dictionary only with badges' do
|
71
|
-
Houston::Notification.new(badge: '123').payload.
|
109
|
+
expect(Houston::Notification.new(badge: '123').payload).to eq({
|
72
110
|
'aps' => { 'badge' => 123 }
|
73
|
-
}
|
111
|
+
})
|
74
112
|
end
|
75
113
|
|
76
114
|
it 'should create a dictionary only with sound' do
|
77
|
-
Houston::Notification.new(sound: 'ring.aiff').payload.
|
115
|
+
expect(Houston::Notification.new(sound: 'ring.aiff').payload).to eq({
|
78
116
|
'aps' => { 'sound' => 'ring.aiff' }
|
79
|
-
}
|
117
|
+
})
|
80
118
|
end
|
81
119
|
|
82
120
|
it 'should create a dictionary only with content-available' do
|
83
|
-
Houston::Notification.new(content_available: true).payload.
|
121
|
+
expect(Houston::Notification.new(content_available: true).payload).to eq({
|
84
122
|
'aps' => { 'content-available' => 1 }
|
85
|
-
}
|
123
|
+
})
|
86
124
|
end
|
87
125
|
|
88
126
|
it 'should allow custom data inside aps key' do
|
89
127
|
notification_options = { :badge => 567, 'aps' => { 'loc-key' => 'my-key' } }
|
90
|
-
Houston::Notification.new(notification_options).payload.
|
128
|
+
expect(Houston::Notification.new(notification_options).payload).to eq({
|
91
129
|
'aps' => { 'loc-key' => 'my-key', 'badge' => 567 }
|
92
|
-
}
|
130
|
+
})
|
93
131
|
end
|
94
132
|
end
|
95
133
|
|
96
134
|
describe '#sent?' do
|
97
135
|
it 'should be false initially' do
|
98
|
-
subject.sent
|
136
|
+
expect(subject.sent?).to be_false
|
99
137
|
end
|
100
138
|
|
101
139
|
it 'should be true after marking as sent' do
|
102
140
|
subject.mark_as_sent!
|
103
|
-
subject.sent
|
141
|
+
expect(subject.sent?).to be_true
|
104
142
|
end
|
105
143
|
|
106
144
|
it 'should be false after marking as unsent' do
|
107
145
|
subject.mark_as_sent!
|
108
146
|
subject.mark_as_unsent!
|
109
|
-
subject.sent
|
147
|
+
expect(subject.sent?).to be_false
|
110
148
|
end
|
111
149
|
end
|
112
150
|
|
113
151
|
describe '#message' do
|
114
152
|
it 'should create a message with command 2' do
|
115
153
|
command, _1, _2 = subject.message.unpack('cNa*')
|
116
|
-
command.
|
154
|
+
expect(command).to eq(2)
|
117
155
|
end
|
118
156
|
|
119
157
|
it 'should create a message with correct frame length' do
|
120
158
|
_1, length, _2 = subject.message.unpack('cNa*')
|
121
|
-
length.
|
159
|
+
expect(length).to eq(182)
|
122
160
|
end
|
123
161
|
|
124
162
|
def parse_items(items_stream)
|
@@ -133,37 +171,37 @@ describe Houston::Notification do
|
|
133
171
|
|
134
172
|
it 'should include five items' do
|
135
173
|
_1, _2, items_stream = subject.message.unpack('cNa*')
|
136
|
-
parse_items(items_stream).
|
174
|
+
expect(parse_items(items_stream).size).to eq(5)
|
137
175
|
end
|
138
176
|
|
139
177
|
it 'should include an item #1 with the token as hexadecimal' do
|
140
178
|
_1, _2, items_stream = subject.message.unpack('cNa*')
|
141
179
|
items = parse_items(items_stream)
|
142
|
-
items.
|
180
|
+
expect(items).to include([1, 32, ['ce8be6272e43e85516033e24b4c289220eeda4879c477160b2545e95b68b5969'].pack('H*')])
|
143
181
|
end
|
144
182
|
|
145
183
|
it 'should include an item #2 with the payload as JSON' do
|
146
184
|
_1, _2, items_stream = subject.message.unpack('cNa*')
|
147
185
|
items = parse_items(items_stream)
|
148
|
-
items.
|
186
|
+
expect(items).to include([2, 126, '{"key1":1,"key2":"abc","aps":{"alert":"Houston, we have a problem.","badge":2701,"sound":"sosumi.aiff","content-available":1}}'])
|
149
187
|
end
|
150
188
|
|
151
189
|
it 'should include an item #3 with the identifier' do
|
152
190
|
_1, _2, items_stream = subject.message.unpack('cNa*')
|
153
191
|
items = parse_items(items_stream)
|
154
|
-
items.
|
192
|
+
expect(items).to include([3, 4, [42].pack('N')])
|
155
193
|
end
|
156
194
|
|
157
195
|
it 'should include an item #4 with the expiry' do
|
158
196
|
_1, _2, items_stream = subject.message.unpack('cNa*')
|
159
197
|
items = parse_items(items_stream)
|
160
|
-
items.
|
198
|
+
expect(items).to include([4, 4, [1234567890].pack('N')])
|
161
199
|
end
|
162
200
|
|
163
201
|
it 'should include an item #4 with the priority' do
|
164
202
|
_1, _2, items_stream = subject.message.unpack('cNa*')
|
165
203
|
items = parse_items(items_stream)
|
166
|
-
items.
|
204
|
+
expect(items).to include([5, 1, [10].pack('c')])
|
167
205
|
end
|
168
206
|
|
169
207
|
it 'might be missing the identifier item' do
|
@@ -172,8 +210,8 @@ describe Houston::Notification do
|
|
172
210
|
msg = notification.message
|
173
211
|
_1, _2, items_stream = notification.message.unpack('cNa*')
|
174
212
|
items = parse_items(items_stream)
|
175
|
-
items.
|
176
|
-
items.find { |item| item[0] == 3 }.
|
213
|
+
expect(items.size).to eq(4)
|
214
|
+
expect(items.find { |item| item[0] == 3 }).to be_nil
|
177
215
|
end
|
178
216
|
|
179
217
|
it 'might be missing the expiry item' do
|
@@ -182,8 +220,8 @@ describe Houston::Notification do
|
|
182
220
|
msg = notification.message
|
183
221
|
_1, _2, items_stream = notification.message.unpack('cNa*')
|
184
222
|
items = parse_items(items_stream)
|
185
|
-
items.
|
186
|
-
items.find { |item| item[0] == 4 }.
|
223
|
+
expect(items.size).to eq(4)
|
224
|
+
expect(items.find { |item| item[0] == 4 }).to be_nil
|
187
225
|
end
|
188
226
|
|
189
227
|
it 'might be missing the priority item' do
|
@@ -192,8 +230,8 @@ describe Houston::Notification do
|
|
192
230
|
msg = notification.message
|
193
231
|
_1, _2, items_stream = notification.message.unpack('cNa*')
|
194
232
|
items = parse_items(items_stream)
|
195
|
-
items.
|
196
|
-
items.find { |item| item[0] == 5 }.
|
233
|
+
expect(items.size).to eq(4)
|
234
|
+
expect(items.find { |item| item[0] == 5 }).to be_nil
|
197
235
|
end
|
198
236
|
end
|
199
237
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -8,3 +8,24 @@ end
|
|
8
8
|
|
9
9
|
require 'houston'
|
10
10
|
require 'rspec'
|
11
|
+
|
12
|
+
class MockConnection
|
13
|
+
class << self
|
14
|
+
def open(uri, certificate, passphrase)
|
15
|
+
yield self.new
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize
|
20
|
+
@unregistered_devices = [
|
21
|
+
[443779200, 32, "ce8be6272e43e85516033e24b4c289220eeda4879c477160b2545e95b68b5969"],
|
22
|
+
[1388678223, 32, "ce8be6272e43e85516033e24b4c289220eeda4879c477160b2545e95b68b5970"]
|
23
|
+
]
|
24
|
+
end
|
25
|
+
|
26
|
+
def read(bytes)
|
27
|
+
return nil if @unregistered_devices.empty?
|
28
|
+
|
29
|
+
@unregistered_devices.shift.pack('N1n1H*')
|
30
|
+
end
|
31
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: houston
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mattt Thompson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-06-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: commander
|
@@ -42,16 +42,16 @@ dependencies:
|
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ~>
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
47
|
+
version: '2.0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ~>
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
54
|
+
version: '2.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -88,11 +88,49 @@ executables:
|
|
88
88
|
extensions: []
|
89
89
|
extra_rdoc_files: []
|
90
90
|
files:
|
91
|
+
- ./coverage/assets/0.7.1/application.css
|
92
|
+
- ./coverage/assets/0.7.1/application.js
|
93
|
+
- ./coverage/assets/0.7.1/fancybox/blank.gif
|
94
|
+
- ./coverage/assets/0.7.1/fancybox/fancy_close.png
|
95
|
+
- ./coverage/assets/0.7.1/fancybox/fancy_loading.png
|
96
|
+
- ./coverage/assets/0.7.1/fancybox/fancy_nav_left.png
|
97
|
+
- ./coverage/assets/0.7.1/fancybox/fancy_nav_right.png
|
98
|
+
- ./coverage/assets/0.7.1/fancybox/fancy_shadow_e.png
|
99
|
+
- ./coverage/assets/0.7.1/fancybox/fancy_shadow_n.png
|
100
|
+
- ./coverage/assets/0.7.1/fancybox/fancy_shadow_ne.png
|
101
|
+
- ./coverage/assets/0.7.1/fancybox/fancy_shadow_nw.png
|
102
|
+
- ./coverage/assets/0.7.1/fancybox/fancy_shadow_s.png
|
103
|
+
- ./coverage/assets/0.7.1/fancybox/fancy_shadow_se.png
|
104
|
+
- ./coverage/assets/0.7.1/fancybox/fancy_shadow_sw.png
|
105
|
+
- ./coverage/assets/0.7.1/fancybox/fancy_shadow_w.png
|
106
|
+
- ./coverage/assets/0.7.1/fancybox/fancy_title_left.png
|
107
|
+
- ./coverage/assets/0.7.1/fancybox/fancy_title_main.png
|
108
|
+
- ./coverage/assets/0.7.1/fancybox/fancy_title_over.png
|
109
|
+
- ./coverage/assets/0.7.1/fancybox/fancy_title_right.png
|
110
|
+
- ./coverage/assets/0.7.1/fancybox/fancybox-x.png
|
111
|
+
- ./coverage/assets/0.7.1/fancybox/fancybox-y.png
|
112
|
+
- ./coverage/assets/0.7.1/fancybox/fancybox.png
|
113
|
+
- ./coverage/assets/0.7.1/favicon_green.png
|
114
|
+
- ./coverage/assets/0.7.1/favicon_red.png
|
115
|
+
- ./coverage/assets/0.7.1/favicon_yellow.png
|
116
|
+
- ./coverage/assets/0.7.1/loading.gif
|
117
|
+
- ./coverage/assets/0.7.1/magnify.png
|
118
|
+
- ./coverage/assets/0.7.1/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
|
119
|
+
- ./coverage/assets/0.7.1/smoothness/images/ui-bg_flat_75_ffffff_40x100.png
|
120
|
+
- ./coverage/assets/0.7.1/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
|
121
|
+
- ./coverage/assets/0.7.1/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
|
122
|
+
- ./coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_dadada_1x400.png
|
123
|
+
- ./coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
|
124
|
+
- ./coverage/assets/0.7.1/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
|
125
|
+
- ./coverage/assets/0.7.1/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png
|
126
|
+
- ./coverage/assets/0.7.1/smoothness/images/ui-icons_222222_256x240.png
|
127
|
+
- ./coverage/assets/0.7.1/smoothness/images/ui-icons_2e83ff_256x240.png
|
128
|
+
- ./coverage/assets/0.7.1/smoothness/images/ui-icons_454545_256x240.png
|
129
|
+
- ./coverage/assets/0.7.1/smoothness/images/ui-icons_888888_256x240.png
|
130
|
+
- ./coverage/assets/0.7.1/smoothness/images/ui-icons_cd0a0a_256x240.png
|
131
|
+
- ./coverage/index.html
|
91
132
|
- ./Gemfile
|
92
133
|
- ./Gemfile.lock
|
93
|
-
- ./houston-0.3.1.gem
|
94
|
-
- ./houston-2.0.0.gem
|
95
|
-
- ./houston-2.0.1.gem
|
96
134
|
- ./houston.gemspec
|
97
135
|
- ./lib/houston/client.rb
|
98
136
|
- ./lib/houston/connection.rb
|
@@ -102,6 +140,7 @@ files:
|
|
102
140
|
- ./LICENSE
|
103
141
|
- ./Rakefile
|
104
142
|
- ./README.md
|
143
|
+
- spec/client_spec.rb
|
105
144
|
- spec/notification_spec.rb
|
106
145
|
- spec/spec_helper.rb
|
107
146
|
- bin/apn
|
@@ -130,5 +169,6 @@ signing_key:
|
|
130
169
|
specification_version: 4
|
131
170
|
summary: Send Apple Push Notifications
|
132
171
|
test_files:
|
172
|
+
- spec/client_spec.rb
|
133
173
|
- spec/notification_spec.rb
|
134
174
|
- spec/spec_helper.rb
|