houston 2.0.2 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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