houston 2.0.2 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +12 -4
  3. data/README.md +2 -2
  4. data/bin/apn +18 -13
  5. data/coverage/assets/0.7.1/application.css +1110 -0
  6. data/coverage/assets/0.7.1/application.js +626 -0
  7. data/coverage/assets/0.7.1/fancybox/blank.gif +0 -0
  8. data/coverage/assets/0.7.1/fancybox/fancy_close.png +0 -0
  9. data/coverage/assets/0.7.1/fancybox/fancy_loading.png +0 -0
  10. data/coverage/assets/0.7.1/fancybox/fancy_nav_left.png +0 -0
  11. data/coverage/assets/0.7.1/fancybox/fancy_nav_right.png +0 -0
  12. data/coverage/assets/0.7.1/fancybox/fancy_shadow_e.png +0 -0
  13. data/coverage/assets/0.7.1/fancybox/fancy_shadow_n.png +0 -0
  14. data/coverage/assets/0.7.1/fancybox/fancy_shadow_ne.png +0 -0
  15. data/coverage/assets/0.7.1/fancybox/fancy_shadow_nw.png +0 -0
  16. data/coverage/assets/0.7.1/fancybox/fancy_shadow_s.png +0 -0
  17. data/coverage/assets/0.7.1/fancybox/fancy_shadow_se.png +0 -0
  18. data/coverage/assets/0.7.1/fancybox/fancy_shadow_sw.png +0 -0
  19. data/coverage/assets/0.7.1/fancybox/fancy_shadow_w.png +0 -0
  20. data/coverage/assets/0.7.1/fancybox/fancy_title_left.png +0 -0
  21. data/coverage/assets/0.7.1/fancybox/fancy_title_main.png +0 -0
  22. data/coverage/assets/0.7.1/fancybox/fancy_title_over.png +0 -0
  23. data/coverage/assets/0.7.1/fancybox/fancy_title_right.png +0 -0
  24. data/coverage/assets/0.7.1/fancybox/fancybox-x.png +0 -0
  25. data/coverage/assets/0.7.1/fancybox/fancybox-y.png +0 -0
  26. data/coverage/assets/0.7.1/fancybox/fancybox.png +0 -0
  27. data/coverage/assets/0.7.1/favicon_green.png +0 -0
  28. data/coverage/assets/0.7.1/favicon_red.png +0 -0
  29. data/coverage/assets/0.7.1/favicon_yellow.png +0 -0
  30. data/coverage/assets/0.7.1/loading.gif +0 -0
  31. data/coverage/assets/0.7.1/magnify.png +0 -0
  32. data/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  33. data/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  34. data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  35. data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  36. data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  37. data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  38. data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  39. data/coverage/assets/0.7.1/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  40. data/coverage/assets/0.7.1/smoothness/images/ui-icons_222222_256x240.png +0 -0
  41. data/coverage/assets/0.7.1/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  42. data/coverage/assets/0.7.1/smoothness/images/ui-icons_454545_256x240.png +0 -0
  43. data/coverage/assets/0.7.1/smoothness/images/ui-icons_888888_256x240.png +0 -0
  44. data/coverage/assets/0.7.1/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  45. data/coverage/index.html +1708 -0
  46. data/houston.gemspec +1 -1
  47. data/lib/houston/client.rb +8 -3
  48. data/lib/houston/version.rb +1 -1
  49. data/spec/client_spec.rb +101 -0
  50. data/spec/notification_spec.rb +79 -41
  51. data/spec/spec_helper.rb +21 -0
  52. metadata +49 -9
  53. data/houston-0.3.1.gem +0 -0
  54. data/houston-2.0.0.gem +0 -0
  55. 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
 
@@ -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 devices
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
@@ -1,3 +1,3 @@
1
1
  module Houston
2
- VERSION = "2.0.2"
2
+ VERSION = "2.1.0"
3
3
  end
@@ -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
@@ -19,15 +19,50 @@ describe Houston::Notification do
19
19
 
20
20
  subject { Houston::Notification.new(notification_options) }
21
21
 
22
- its(:token) { should == '<ce8be627 2e43e855 16033e24 b4c28922 0eeda487 9c477160 b2545e95 b68b5969>' }
23
- its(:alert) { should == 'Houston, we have a problem.' }
24
- its(:badge) { should == 2701 }
25
- its(:sound) { should == 'sosumi.aiff' }
26
- its(:expiry) { should == 1234567890 }
27
- its(:id) { should == 42 }
28
- its(:priority) { should == 10 }
29
- its(:content_available) { should be_true }
30
- its(:custom_data) { should == { key1: 1, key2: 'abc' } }
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
- its(:device) { '<ce8be627 2e43e855 16033e24 b4c28922 0eeda487 9c477160 b2545e95 b68b5969>' }
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.should == {
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.should == {
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.should == {
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.should == {
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.should == {
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.should == {
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.should == {
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?.should be_false
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?.should be_true
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?.should be_false
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.should == 2
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.should == 182
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).should have(5).items
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.should include([1, 32, ['ce8be6272e43e85516033e24b4c289220eeda4879c477160b2545e95b68b5969'].pack('H*')])
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.should include([2, 126, '{"key1":1,"key2":"abc","aps":{"alert":"Houston, we have a problem.","badge":2701,"sound":"sosumi.aiff","content-available":1}}'])
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.should include([3, 4, [42].pack('N')])
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.should include([4, 4, [1234567890].pack('N')])
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.should include([5, 1, [10].pack('c')])
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.should have(4).items
176
- items.find { |item| item[0] == 3 }.should be_nil
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.should have(4).items
186
- items.find { |item| item[0] == 4 }.should be_nil
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.should have(4).items
196
- items.find { |item| item[0] == 5 }.should be_nil
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.2
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-04-16 00:00:00.000000000 Z
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