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