houston 0.2.4 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/Gemfile.lock +28 -8
  4. data/LICENSE +1 -1
  5. data/README.md +123 -24
  6. data/Rakefile +4 -8
  7. data/bin/apn +70 -5
  8. data/coverage/assets/0.7.1/application.css +1110 -0
  9. data/coverage/assets/0.7.1/application.js +626 -0
  10. data/coverage/assets/0.7.1/fancybox/blank.gif +0 -0
  11. data/coverage/assets/0.7.1/fancybox/fancy_close.png +0 -0
  12. data/coverage/assets/0.7.1/fancybox/fancy_loading.png +0 -0
  13. data/coverage/assets/0.7.1/fancybox/fancy_nav_left.png +0 -0
  14. data/coverage/assets/0.7.1/fancybox/fancy_nav_right.png +0 -0
  15. data/coverage/assets/0.7.1/fancybox/fancy_shadow_e.png +0 -0
  16. data/coverage/assets/0.7.1/fancybox/fancy_shadow_n.png +0 -0
  17. data/coverage/assets/0.7.1/fancybox/fancy_shadow_ne.png +0 -0
  18. data/coverage/assets/0.7.1/fancybox/fancy_shadow_nw.png +0 -0
  19. data/coverage/assets/0.7.1/fancybox/fancy_shadow_s.png +0 -0
  20. data/coverage/assets/0.7.1/fancybox/fancy_shadow_se.png +0 -0
  21. data/coverage/assets/0.7.1/fancybox/fancy_shadow_sw.png +0 -0
  22. data/coverage/assets/0.7.1/fancybox/fancy_shadow_w.png +0 -0
  23. data/coverage/assets/0.7.1/fancybox/fancy_title_left.png +0 -0
  24. data/coverage/assets/0.7.1/fancybox/fancy_title_main.png +0 -0
  25. data/coverage/assets/0.7.1/fancybox/fancy_title_over.png +0 -0
  26. data/coverage/assets/0.7.1/fancybox/fancy_title_right.png +0 -0
  27. data/coverage/assets/0.7.1/fancybox/fancybox-x.png +0 -0
  28. data/coverage/assets/0.7.1/fancybox/fancybox-y.png +0 -0
  29. data/coverage/assets/0.7.1/fancybox/fancybox.png +0 -0
  30. data/coverage/assets/0.7.1/favicon_green.png +0 -0
  31. data/coverage/assets/0.7.1/favicon_red.png +0 -0
  32. data/coverage/assets/0.7.1/favicon_yellow.png +0 -0
  33. data/coverage/assets/0.7.1/loading.gif +0 -0
  34. data/coverage/assets/0.7.1/magnify.png +0 -0
  35. data/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  36. data/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  37. data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  38. data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  39. data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  40. data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  41. data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  42. data/coverage/assets/0.7.1/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  43. data/coverage/assets/0.7.1/smoothness/images/ui-icons_222222_256x240.png +0 -0
  44. data/coverage/assets/0.7.1/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  45. data/coverage/assets/0.7.1/smoothness/images/ui-icons_454545_256x240.png +0 -0
  46. data/coverage/assets/0.7.1/smoothness/images/ui-icons_888888_256x240.png +0 -0
  47. data/coverage/assets/0.7.1/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  48. data/coverage/assets/0.8.0/application.css +799 -0
  49. data/coverage/assets/0.8.0/application.js +1559 -0
  50. data/coverage/assets/0.8.0/colorbox/border.png +0 -0
  51. data/coverage/assets/0.8.0/colorbox/controls.png +0 -0
  52. data/coverage/assets/0.8.0/colorbox/loading.gif +0 -0
  53. data/coverage/assets/0.8.0/colorbox/loading_background.png +0 -0
  54. data/coverage/assets/0.8.0/favicon_green.png +0 -0
  55. data/coverage/assets/0.8.0/favicon_red.png +0 -0
  56. data/coverage/assets/0.8.0/favicon_yellow.png +0 -0
  57. data/coverage/assets/0.8.0/loading.gif +0 -0
  58. data/coverage/assets/0.8.0/magnify.png +0 -0
  59. data/coverage/assets/0.8.0/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  60. data/coverage/assets/0.8.0/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  61. data/coverage/assets/0.8.0/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  62. data/coverage/assets/0.8.0/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  63. data/coverage/assets/0.8.0/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  64. data/coverage/assets/0.8.0/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  65. data/coverage/assets/0.8.0/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  66. data/coverage/assets/0.8.0/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  67. data/coverage/assets/0.8.0/smoothness/images/ui-icons_222222_256x240.png +0 -0
  68. data/coverage/assets/0.8.0/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  69. data/coverage/assets/0.8.0/smoothness/images/ui-icons_454545_256x240.png +0 -0
  70. data/coverage/assets/0.8.0/smoothness/images/ui-icons_888888_256x240.png +0 -0
  71. data/coverage/assets/0.8.0/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  72. data/coverage/index.html +1810 -0
  73. data/houston-2.2.2.gem +0 -0
  74. data/houston-2.2.3.gem +0 -0
  75. data/houston.gemspec +17 -16
  76. data/lib/houston/client.rb +39 -9
  77. data/lib/houston/connection.rb +3 -3
  78. data/lib/houston/notification.rb +87 -6
  79. data/lib/houston/version.rb +3 -0
  80. data/lib/houston.rb +1 -4
  81. data/spec/client_spec.rb +100 -0
  82. data/spec/notification_spec.rb +315 -0
  83. data/spec/spec_helper.rb +31 -0
  84. metadata +119 -32
  85. 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
@@ -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: 0.2.4
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: 2013-05-30 00:00:00.000000000 Z
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.1'
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.1'
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: '0.6'
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: '0.6'
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.9'
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.9'
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
- - ./apple_push_notification_production.pem
78
- - ./Gemfile
79
- - ./Gemfile.lock
80
- - ./houston.gemspec
81
- - ./lib/houston/client.rb
82
- - ./lib/houston/connection.rb
83
- - ./lib/houston/notification.rb
84
- - ./lib/houston.rb
85
- - ./LICENSE
86
- - ./Rakefile
87
- - ./README.md
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
- homepage: http://github.com/mattt/houston
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.0.3
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