houston 0.2.4 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/Gemfile.lock +28 -8
- data/LICENSE +1 -1
- data/README.md +123 -24
- data/Rakefile +4 -8
- data/bin/apn +70 -5
- 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/assets/0.8.0/application.css +799 -0
- data/coverage/assets/0.8.0/application.js +1559 -0
- data/coverage/assets/0.8.0/colorbox/border.png +0 -0
- data/coverage/assets/0.8.0/colorbox/controls.png +0 -0
- data/coverage/assets/0.8.0/colorbox/loading.gif +0 -0
- data/coverage/assets/0.8.0/colorbox/loading_background.png +0 -0
- data/coverage/assets/0.8.0/favicon_green.png +0 -0
- data/coverage/assets/0.8.0/favicon_red.png +0 -0
- data/coverage/assets/0.8.0/favicon_yellow.png +0 -0
- data/coverage/assets/0.8.0/loading.gif +0 -0
- data/coverage/assets/0.8.0/magnify.png +0 -0
- data/coverage/assets/0.8.0/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/coverage/assets/0.8.0/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/coverage/assets/0.8.0/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/coverage/assets/0.8.0/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/coverage/assets/0.8.0/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/coverage/assets/0.8.0/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/coverage/assets/0.8.0/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/coverage/assets/0.8.0/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/coverage/assets/0.8.0/smoothness/images/ui-icons_222222_256x240.png +0 -0
- data/coverage/assets/0.8.0/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
- data/coverage/assets/0.8.0/smoothness/images/ui-icons_454545_256x240.png +0 -0
- data/coverage/assets/0.8.0/smoothness/images/ui-icons_888888_256x240.png +0 -0
- data/coverage/assets/0.8.0/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/coverage/index.html +1810 -0
- data/houston-2.2.2.gem +0 -0
- data/houston-2.2.3.gem +0 -0
- data/houston.gemspec +17 -16
- data/lib/houston/client.rb +39 -9
- data/lib/houston/connection.rb +3 -3
- data/lib/houston/notification.rb +87 -6
- data/lib/houston/version.rb +3 -0
- data/lib/houston.rb +1 -4
- data/spec/client_spec.rb +100 -0
- data/spec/notification_spec.rb +315 -0
- data/spec/spec_helper.rb +31 -0
- metadata +119 -32
- data/apple_push_notification_production.pem +0 -136
@@ -0,0 +1,315 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Houston::Notification do
|
4
|
+
let(:notification_options) {
|
5
|
+
{
|
6
|
+
token: '<ce8be627 2e43e855 16033e24 b4c28922 0eeda487 9c477160 b2545e95 b68b5969>',
|
7
|
+
alert: 'Houston, we have a problem.',
|
8
|
+
badge: 2701,
|
9
|
+
sound: 'sosumi.aiff',
|
10
|
+
category: 'INVITE_CATEGORY',
|
11
|
+
expiry: 1234567890,
|
12
|
+
id: 42,
|
13
|
+
priority: 10,
|
14
|
+
content_available: true,
|
15
|
+
key1: 1,
|
16
|
+
key2: 'abc',
|
17
|
+
url_args: %w[boarding A998],
|
18
|
+
thread_id: 'notify-team-ios'
|
19
|
+
}
|
20
|
+
}
|
21
|
+
|
22
|
+
subject { Houston::Notification.new(notification_options) }
|
23
|
+
|
24
|
+
describe '#token' do
|
25
|
+
subject { super().token }
|
26
|
+
it { should == '<ce8be627 2e43e855 16033e24 b4c28922 0eeda487 9c477160 b2545e95 b68b5969>' }
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '#alert' do
|
30
|
+
subject { super().alert }
|
31
|
+
it { should == 'Houston, we have a problem.' }
|
32
|
+
end
|
33
|
+
|
34
|
+
describe '#badge' do
|
35
|
+
subject { super().badge }
|
36
|
+
it { should == 2701 }
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '#sound' do
|
40
|
+
subject { super().sound }
|
41
|
+
it { should == 'sosumi.aiff' }
|
42
|
+
end
|
43
|
+
|
44
|
+
describe '#category' do
|
45
|
+
subject { super().category }
|
46
|
+
it { should == 'INVITE_CATEGORY' }
|
47
|
+
end
|
48
|
+
|
49
|
+
describe '#expiry' do
|
50
|
+
subject { super().expiry }
|
51
|
+
it { should == 1234567890 }
|
52
|
+
end
|
53
|
+
|
54
|
+
describe '#id' do
|
55
|
+
subject { super().id }
|
56
|
+
it { should == 42 }
|
57
|
+
end
|
58
|
+
|
59
|
+
describe '#priority' do
|
60
|
+
subject { super().priority }
|
61
|
+
it { should == 10 }
|
62
|
+
end
|
63
|
+
|
64
|
+
describe '#content_available' do
|
65
|
+
subject { super().content_available }
|
66
|
+
it { should be_truthy }
|
67
|
+
end
|
68
|
+
|
69
|
+
describe '#custom_data' do
|
70
|
+
subject { super().custom_data }
|
71
|
+
it { should == { key1: 1, key2: 'abc' } }
|
72
|
+
end
|
73
|
+
|
74
|
+
describe '#url_args' do
|
75
|
+
subject { super().url_args }
|
76
|
+
it { should == %w[boarding A998] }
|
77
|
+
end
|
78
|
+
|
79
|
+
describe '#thread_id' do
|
80
|
+
subject { super().thread_id }
|
81
|
+
it { should == 'notify-team-ios' }
|
82
|
+
end
|
83
|
+
|
84
|
+
context 'using :device instead of :token' do
|
85
|
+
subject do
|
86
|
+
notification_options[:device] = notification_options[:token]
|
87
|
+
notification_options.delete(:token)
|
88
|
+
Houston::Notification.new(notification_options)
|
89
|
+
end
|
90
|
+
|
91
|
+
describe '#device' do
|
92
|
+
subject { super().device }
|
93
|
+
it { should == '<ce8be627 2e43e855 16033e24 b4c28922 0eeda487 9c477160 b2545e95 b68b5969>' }
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe '#payload' do
|
98
|
+
it 'should create a compliant dictionary' do
|
99
|
+
expect(subject.payload).to eq(
|
100
|
+
'aps' => {
|
101
|
+
'alert' => 'Houston, we have a problem.',
|
102
|
+
'badge' => 2701,
|
103
|
+
'sound' => 'sosumi.aiff',
|
104
|
+
'category' => 'INVITE_CATEGORY',
|
105
|
+
'content-available' => 1,
|
106
|
+
'url-args' => %w[boarding A998],
|
107
|
+
'thread-id' => 'notify-team-ios'
|
108
|
+
},
|
109
|
+
'key1' => 1,
|
110
|
+
'key2' => 'abc')
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'should create a dictionary of only custom data and empty aps' do
|
114
|
+
expect(Houston::Notification.new(key1: 123, key2: 'xyz').payload).to eq(
|
115
|
+
'aps' => {},
|
116
|
+
'key1' => 123,
|
117
|
+
'key2' => 'xyz'
|
118
|
+
)
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'should create a dictionary only with alerts' do
|
122
|
+
expect(Houston::Notification.new(alert: 'Hello, World!').payload).to eq(
|
123
|
+
'aps' => { 'alert' => 'Hello, World!' }
|
124
|
+
)
|
125
|
+
end
|
126
|
+
|
127
|
+
it 'should create a dictionary only with badges' do
|
128
|
+
expect(Houston::Notification.new(badge: '123').payload).to eq(
|
129
|
+
'aps' => { 'badge' => 123 }
|
130
|
+
)
|
131
|
+
end
|
132
|
+
|
133
|
+
it 'should create a dictionary only with sound' do
|
134
|
+
expect(Houston::Notification.new(sound: 'ring.aiff').payload).to eq(
|
135
|
+
'aps' => { 'sound' => 'ring.aiff' }
|
136
|
+
)
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'should create a dictionary only with category' do
|
140
|
+
expect(Houston::Notification.new(category: 'INVITE_CATEGORY').payload).to eq(
|
141
|
+
'aps' => { 'category' => 'INVITE_CATEGORY' }
|
142
|
+
)
|
143
|
+
end
|
144
|
+
|
145
|
+
it 'should create a dictionary only with content-available' do
|
146
|
+
expect(Houston::Notification.new(content_available: true).payload).to eq(
|
147
|
+
'aps' => { 'content-available' => 1 }
|
148
|
+
)
|
149
|
+
end
|
150
|
+
|
151
|
+
it 'should create a dictionary only with mutable-content' do
|
152
|
+
expect(Houston::Notification.new(mutable_content: true).payload).to eq(
|
153
|
+
'aps' => { 'mutable-content' => 1 }
|
154
|
+
)
|
155
|
+
end
|
156
|
+
|
157
|
+
it 'should create a dictionary only with thread-id' do
|
158
|
+
expect(Houston::Notification.new(thread_id: 'notify-ios-team').payload).to eq(
|
159
|
+
'aps' => { 'thread-id' => 'notify-ios-team' }
|
160
|
+
)
|
161
|
+
end
|
162
|
+
|
163
|
+
it 'should allow custom data inside aps key' do
|
164
|
+
notification_options = { :badge => 567, 'aps' => { 'loc-key' => 'my-key' } }
|
165
|
+
expect(Houston::Notification.new(notification_options).payload).to eq(
|
166
|
+
'aps' => { 'loc-key' => 'my-key', 'badge' => 567 }
|
167
|
+
)
|
168
|
+
end
|
169
|
+
|
170
|
+
it 'should create notification from hash with string and symbol keys' do
|
171
|
+
notification_options = { badge: 567, aps: { 'loc-key' => 'my-key' } }
|
172
|
+
expect(Houston::Notification.new(notification_options).payload['aps']).to eq(
|
173
|
+
'loc-key' => 'my-key', 'badge' => 567
|
174
|
+
)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
describe '#sent?' do
|
179
|
+
it 'should be false initially' do
|
180
|
+
expect(subject.sent?).to be_falsey
|
181
|
+
end
|
182
|
+
|
183
|
+
it 'should be true after marking as sent' do
|
184
|
+
subject.mark_as_sent!
|
185
|
+
expect(subject.sent?).to be_truthy
|
186
|
+
end
|
187
|
+
|
188
|
+
it 'should be false after marking as unsent' do
|
189
|
+
subject.mark_as_sent!
|
190
|
+
subject.mark_as_unsent!
|
191
|
+
expect(subject.sent?).to be_falsey
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
describe '#message' do
|
196
|
+
it 'should create a message with command 2' do
|
197
|
+
command, _1, _2 = subject.message.unpack('cNa*')
|
198
|
+
expect(command).to eq(2)
|
199
|
+
end
|
200
|
+
|
201
|
+
it 'should create a message with correct frame length' do
|
202
|
+
_1, length, _2 = subject.message.unpack('cNa*')
|
203
|
+
expect(length).to eq(272)
|
204
|
+
end
|
205
|
+
|
206
|
+
def parse_items(items_stream)
|
207
|
+
items = []
|
208
|
+
until items_stream.empty?
|
209
|
+
item_id, item_length, items_stream = items_stream.unpack('cna*')
|
210
|
+
item_data, items_stream = items_stream.unpack("a#{item_length}a*")
|
211
|
+
items << [item_id, item_length, item_data]
|
212
|
+
end
|
213
|
+
items
|
214
|
+
end
|
215
|
+
|
216
|
+
it 'should include five items' do
|
217
|
+
_1, _2, items_stream = subject.message.unpack('cNa*')
|
218
|
+
expect(parse_items(items_stream).size).to eq(5)
|
219
|
+
end
|
220
|
+
|
221
|
+
it 'should include an item #1 with the token as hexadecimal' do
|
222
|
+
_1, _2, items_stream = subject.message.unpack('cNa*')
|
223
|
+
items = parse_items(items_stream)
|
224
|
+
expect(items).to include([1, 32, ['ce8be6272e43e85516033e24b4c289220eeda4879c477160b2545e95b68b5969'].pack('H*')])
|
225
|
+
end
|
226
|
+
|
227
|
+
it 'should include an item #2 with the payload as JSON' do
|
228
|
+
_1, _2, items_stream = subject.message.unpack('cNa*')
|
229
|
+
items = parse_items(items_stream)
|
230
|
+
expect(items).to include([2, 216, '{"key1":1,"key2":"abc","aps":{"alert":"Houston, we have a problem.","badge":2701,"sound":"sosumi.aiff","category":"INVITE_CATEGORY","content-available":1,"url-args":["boarding","A998"],"thread-id":"notify-team-ios"}}'])
|
231
|
+
end
|
232
|
+
|
233
|
+
it 'should include an item #3 with the identifier' do
|
234
|
+
_1, _2, items_stream = subject.message.unpack('cNa*')
|
235
|
+
items = parse_items(items_stream)
|
236
|
+
expect(items).to include([3, 4, [42].pack('N')])
|
237
|
+
end
|
238
|
+
|
239
|
+
it 'should include an item #4 with the expiry' do
|
240
|
+
_1, _2, items_stream = subject.message.unpack('cNa*')
|
241
|
+
items = parse_items(items_stream)
|
242
|
+
expect(items).to include([4, 4, [1234567890].pack('N')])
|
243
|
+
end
|
244
|
+
|
245
|
+
it 'should include an item #5 with the priority' do
|
246
|
+
_1, _2, items_stream = subject.message.unpack('cNa*')
|
247
|
+
items = parse_items(items_stream)
|
248
|
+
expect(items).to include([5, 1, [10].pack('c')])
|
249
|
+
end
|
250
|
+
|
251
|
+
it 'should pad or truncate token so it is 32 bytes long' do
|
252
|
+
notification_options[:token] = '<ce8be627 2e43e855 16033e24 b4c28922>'
|
253
|
+
_1, _2, items_stream = subject.message.unpack('cNa*')
|
254
|
+
items = parse_items(items_stream)
|
255
|
+
expect(items).to include([1, 32, ['ce8be6272e43e85516033e24b4c2892200000000000000000000000000000000'].pack('H*')])
|
256
|
+
end
|
257
|
+
|
258
|
+
it 'might be missing the identifier item' do
|
259
|
+
notification_options.delete(:id)
|
260
|
+
notification = Houston::Notification.new(notification_options)
|
261
|
+
msg = notification.message
|
262
|
+
_1, _2, items_stream = notification.message.unpack('cNa*')
|
263
|
+
items = parse_items(items_stream)
|
264
|
+
expect(items.size).to eq(4)
|
265
|
+
expect(items.find { |item| item[0] == 3 }).to be_nil
|
266
|
+
end
|
267
|
+
|
268
|
+
it 'might be missing the expiry item' do
|
269
|
+
notification_options.delete(:expiry)
|
270
|
+
notification = Houston::Notification.new(notification_options)
|
271
|
+
msg = notification.message
|
272
|
+
_1, _2, items_stream = notification.message.unpack('cNa*')
|
273
|
+
items = parse_items(items_stream)
|
274
|
+
expect(items.size).to eq(4)
|
275
|
+
expect(items.find { |item| item[0] == 4 }).to be_nil
|
276
|
+
end
|
277
|
+
|
278
|
+
it 'might be missing the priority item' do
|
279
|
+
notification_options.delete(:priority)
|
280
|
+
notification = Houston::Notification.new(notification_options)
|
281
|
+
msg = notification.message
|
282
|
+
_1, _2, items_stream = notification.message.unpack('cNa*')
|
283
|
+
items = parse_items(items_stream)
|
284
|
+
expect(items.size).to eq(4)
|
285
|
+
expect(items.find { |item| item[0] == 5 }).to be_nil
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
describe '#error' do
|
290
|
+
context 'a status code has been set' do
|
291
|
+
it 'returns an error object mapped to that status code' do
|
292
|
+
status_code = 1
|
293
|
+
notification = Houston::Notification.new(notification_options)
|
294
|
+
notification.apns_error_code = status_code
|
295
|
+
expect(notification.error.message).to eq(Houston::Notification::APNSError::CODES[status_code])
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
299
|
+
context 'a status code has been set to 0' do
|
300
|
+
it 'returns nil' do
|
301
|
+
status_code = 0
|
302
|
+
notification = Houston::Notification.new(notification_options)
|
303
|
+
notification.apns_error_code = status_code
|
304
|
+
expect(notification.error).to be_nil
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
context 'a status code has not been set' do
|
309
|
+
it 'returns nil' do
|
310
|
+
notification = Houston::Notification.new(notification_options)
|
311
|
+
expect(notification.error).to be_nil
|
312
|
+
end
|
313
|
+
end
|
314
|
+
end
|
315
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
unless ENV['CI']
|
2
|
+
require 'simplecov'
|
3
|
+
|
4
|
+
SimpleCov.start do
|
5
|
+
add_filter '/spec/'
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
require 'houston'
|
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,71 +1,85 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: houston
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.4.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:
|
11
|
+
date: 2018-11-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: commander
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '4.
|
19
|
+
version: '4.4'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '4.
|
26
|
+
version: '4.4'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: json
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - ~>
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '3.5'
|
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: '
|
54
|
+
version: '3.5'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0
|
61
|
+
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '0
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: simplecov
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
description: Houston is a simple gem for sending Apple Push Notifications. Pass your
|
70
84
|
credentials, construct your message, and send it.
|
71
85
|
email: m@mattt.me
|
@@ -74,19 +88,89 @@ executables:
|
|
74
88
|
extensions: []
|
75
89
|
extra_rdoc_files: []
|
76
90
|
files:
|
77
|
-
- ./
|
78
|
-
- ./Gemfile
|
79
|
-
- ./
|
80
|
-
- ./
|
81
|
-
- ./
|
82
|
-
- ./
|
83
|
-
- ./
|
84
|
-
- ./
|
85
|
-
- ./
|
86
|
-
- ./
|
87
|
-
- ./
|
91
|
+
- "./Gemfile"
|
92
|
+
- "./Gemfile.lock"
|
93
|
+
- "./LICENSE"
|
94
|
+
- "./README.md"
|
95
|
+
- "./Rakefile"
|
96
|
+
- "./coverage/assets/0.7.1/application.css"
|
97
|
+
- "./coverage/assets/0.7.1/application.js"
|
98
|
+
- "./coverage/assets/0.7.1/fancybox/blank.gif"
|
99
|
+
- "./coverage/assets/0.7.1/fancybox/fancy_close.png"
|
100
|
+
- "./coverage/assets/0.7.1/fancybox/fancy_loading.png"
|
101
|
+
- "./coverage/assets/0.7.1/fancybox/fancy_nav_left.png"
|
102
|
+
- "./coverage/assets/0.7.1/fancybox/fancy_nav_right.png"
|
103
|
+
- "./coverage/assets/0.7.1/fancybox/fancy_shadow_e.png"
|
104
|
+
- "./coverage/assets/0.7.1/fancybox/fancy_shadow_n.png"
|
105
|
+
- "./coverage/assets/0.7.1/fancybox/fancy_shadow_ne.png"
|
106
|
+
- "./coverage/assets/0.7.1/fancybox/fancy_shadow_nw.png"
|
107
|
+
- "./coverage/assets/0.7.1/fancybox/fancy_shadow_s.png"
|
108
|
+
- "./coverage/assets/0.7.1/fancybox/fancy_shadow_se.png"
|
109
|
+
- "./coverage/assets/0.7.1/fancybox/fancy_shadow_sw.png"
|
110
|
+
- "./coverage/assets/0.7.1/fancybox/fancy_shadow_w.png"
|
111
|
+
- "./coverage/assets/0.7.1/fancybox/fancy_title_left.png"
|
112
|
+
- "./coverage/assets/0.7.1/fancybox/fancy_title_main.png"
|
113
|
+
- "./coverage/assets/0.7.1/fancybox/fancy_title_over.png"
|
114
|
+
- "./coverage/assets/0.7.1/fancybox/fancy_title_right.png"
|
115
|
+
- "./coverage/assets/0.7.1/fancybox/fancybox-x.png"
|
116
|
+
- "./coverage/assets/0.7.1/fancybox/fancybox-y.png"
|
117
|
+
- "./coverage/assets/0.7.1/fancybox/fancybox.png"
|
118
|
+
- "./coverage/assets/0.7.1/favicon_green.png"
|
119
|
+
- "./coverage/assets/0.7.1/favicon_red.png"
|
120
|
+
- "./coverage/assets/0.7.1/favicon_yellow.png"
|
121
|
+
- "./coverage/assets/0.7.1/loading.gif"
|
122
|
+
- "./coverage/assets/0.7.1/magnify.png"
|
123
|
+
- "./coverage/assets/0.7.1/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png"
|
124
|
+
- "./coverage/assets/0.7.1/smoothness/images/ui-bg_flat_75_ffffff_40x100.png"
|
125
|
+
- "./coverage/assets/0.7.1/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png"
|
126
|
+
- "./coverage/assets/0.7.1/smoothness/images/ui-bg_glass_65_ffffff_1x400.png"
|
127
|
+
- "./coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_dadada_1x400.png"
|
128
|
+
- "./coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png"
|
129
|
+
- "./coverage/assets/0.7.1/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png"
|
130
|
+
- "./coverage/assets/0.7.1/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png"
|
131
|
+
- "./coverage/assets/0.7.1/smoothness/images/ui-icons_222222_256x240.png"
|
132
|
+
- "./coverage/assets/0.7.1/smoothness/images/ui-icons_2e83ff_256x240.png"
|
133
|
+
- "./coverage/assets/0.7.1/smoothness/images/ui-icons_454545_256x240.png"
|
134
|
+
- "./coverage/assets/0.7.1/smoothness/images/ui-icons_888888_256x240.png"
|
135
|
+
- "./coverage/assets/0.7.1/smoothness/images/ui-icons_cd0a0a_256x240.png"
|
136
|
+
- "./coverage/assets/0.8.0/application.css"
|
137
|
+
- "./coverage/assets/0.8.0/application.js"
|
138
|
+
- "./coverage/assets/0.8.0/colorbox/border.png"
|
139
|
+
- "./coverage/assets/0.8.0/colorbox/controls.png"
|
140
|
+
- "./coverage/assets/0.8.0/colorbox/loading.gif"
|
141
|
+
- "./coverage/assets/0.8.0/colorbox/loading_background.png"
|
142
|
+
- "./coverage/assets/0.8.0/favicon_green.png"
|
143
|
+
- "./coverage/assets/0.8.0/favicon_red.png"
|
144
|
+
- "./coverage/assets/0.8.0/favicon_yellow.png"
|
145
|
+
- "./coverage/assets/0.8.0/loading.gif"
|
146
|
+
- "./coverage/assets/0.8.0/magnify.png"
|
147
|
+
- "./coverage/assets/0.8.0/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png"
|
148
|
+
- "./coverage/assets/0.8.0/smoothness/images/ui-bg_flat_75_ffffff_40x100.png"
|
149
|
+
- "./coverage/assets/0.8.0/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png"
|
150
|
+
- "./coverage/assets/0.8.0/smoothness/images/ui-bg_glass_65_ffffff_1x400.png"
|
151
|
+
- "./coverage/assets/0.8.0/smoothness/images/ui-bg_glass_75_dadada_1x400.png"
|
152
|
+
- "./coverage/assets/0.8.0/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png"
|
153
|
+
- "./coverage/assets/0.8.0/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png"
|
154
|
+
- "./coverage/assets/0.8.0/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png"
|
155
|
+
- "./coverage/assets/0.8.0/smoothness/images/ui-icons_222222_256x240.png"
|
156
|
+
- "./coverage/assets/0.8.0/smoothness/images/ui-icons_2e83ff_256x240.png"
|
157
|
+
- "./coverage/assets/0.8.0/smoothness/images/ui-icons_454545_256x240.png"
|
158
|
+
- "./coverage/assets/0.8.0/smoothness/images/ui-icons_888888_256x240.png"
|
159
|
+
- "./coverage/assets/0.8.0/smoothness/images/ui-icons_cd0a0a_256x240.png"
|
160
|
+
- "./coverage/index.html"
|
161
|
+
- "./houston-2.2.2.gem"
|
162
|
+
- "./houston-2.2.3.gem"
|
163
|
+
- "./houston.gemspec"
|
164
|
+
- "./lib/houston.rb"
|
165
|
+
- "./lib/houston/client.rb"
|
166
|
+
- "./lib/houston/connection.rb"
|
167
|
+
- "./lib/houston/notification.rb"
|
168
|
+
- "./lib/houston/version.rb"
|
88
169
|
- bin/apn
|
89
|
-
|
170
|
+
- spec/client_spec.rb
|
171
|
+
- spec/notification_spec.rb
|
172
|
+
- spec/spec_helper.rb
|
173
|
+
homepage: http://nomad-cli.com
|
90
174
|
licenses:
|
91
175
|
- MIT
|
92
176
|
metadata: {}
|
@@ -96,18 +180,21 @@ require_paths:
|
|
96
180
|
- lib
|
97
181
|
required_ruby_version: !ruby/object:Gem::Requirement
|
98
182
|
requirements:
|
99
|
-
- -
|
183
|
+
- - ">="
|
100
184
|
- !ruby/object:Gem::Version
|
101
185
|
version: '0'
|
102
186
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
103
187
|
requirements:
|
104
|
-
- -
|
188
|
+
- - ">="
|
105
189
|
- !ruby/object:Gem::Version
|
106
190
|
version: '0'
|
107
191
|
requirements: []
|
108
192
|
rubyforge_project:
|
109
|
-
rubygems_version: 2.
|
193
|
+
rubygems_version: 2.6.14
|
110
194
|
signing_key:
|
111
195
|
specification_version: 4
|
112
196
|
summary: Send Apple Push Notifications
|
113
|
-
test_files:
|
197
|
+
test_files:
|
198
|
+
- spec/client_spec.rb
|
199
|
+
- spec/notification_spec.rb
|
200
|
+
- spec/spec_helper.rb
|