zeppelin 0.6.0 → 0.7.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.
data/Changelog.md CHANGED
@@ -1,3 +1,14 @@
1
+ # 0.7.0
2
+
3
+ ## Enhancements
4
+
5
+ * Can load APID collection
6
+ * Can load device token collection
7
+
8
+ ## Changes
9
+
10
+ * Removed usage of Bundler gem tasks. It's easier to do this by hand.
11
+
1
12
  # 0.6.0
2
13
 
3
14
  ## Enhancements
data/Guardfile CHANGED
@@ -1,6 +1,6 @@
1
1
  guard 'rspec', :version => 2 do
2
2
  watch(%r{^spec/.+_spec\.rb$})
3
- watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
3
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
4
4
  watch('spec/spec_helper.rb') { "spec" }
5
5
  end
6
6
 
data/README.md CHANGED
@@ -24,11 +24,6 @@ With bundler:
24
24
 
25
25
  Check out the docs for more ways of querying the API.
26
26
 
27
- ## TODO ##
28
-
29
- * Add support for the statistics API.
30
- * Add support for the device token list API.
31
-
32
27
  ## Note on Patches/Pull Requests ##
33
28
 
34
29
  * Fork the project.
@@ -41,7 +36,8 @@ Check out the docs for more ways of querying the API.
41
36
 
42
37
  * [GitHub Repository](https://github.com/CapnKernul/zeppelin)
43
38
  * [Documentation](http://rubydoc.info/github/CapnKernul/zeppelin)
39
+ * [Issues](https://github.com/CapnKernul/zeppelin/issues)
44
40
 
45
41
  ## License ##
46
42
 
47
- Zeppelin is licensed under the MIT License. See `LICENSE` for details.
43
+ Zeppelin is licensed under the MIT License. See `LICENSE` for details.
data/Rakefile CHANGED
@@ -1,5 +1,4 @@
1
1
  require 'bundler'
2
- Bundler::GemHelper.install_tasks
3
2
 
4
3
  require 'rspec/core/rake_task'
5
4
 
@@ -8,4 +7,4 @@ RSpec::Core::RakeTask.new(:spec) do |t|
8
7
  t.pattern = 'spec/**/*_spec.rb'
9
8
  end
10
9
 
11
- task :default => :spec
10
+ task :default => :spec
data/lib/zeppelin.rb CHANGED
@@ -67,6 +67,21 @@ class Zeppelin
67
67
  delete_request(uri)
68
68
  end
69
69
 
70
+ # Retrieve a page of device tokens
71
+ #
72
+ # @param [Integer] page (nil) Page of device tokens to retrieve
73
+ #
74
+ # @return [Hash] result set. See documentation for details
75
+ #
76
+ # @Note that the next page number is included in the result set instead of the
77
+ # raw URI to request for the next page
78
+ #
79
+ # @raise [Zeppelin::ClientError] invalid request
80
+ def device_tokens(page=nil)
81
+ uri = device_token_uri(nil, :page => page)
82
+ get_paged_request(uri)
83
+ end
84
+
70
85
  # Registers an APID.
71
86
  #
72
87
  # @param [String] apid
@@ -105,6 +120,21 @@ class Zeppelin
105
120
  delete_request(uri)
106
121
  end
107
122
 
123
+ # Retrieve a page of APIDs
124
+ #
125
+ # @param [Integer] page (nil) Page of APIDs to retrieve
126
+ #
127
+ # @return [Hash] result set. See documentation for details
128
+ #
129
+ # @Note that the next page number is included in the result set instead of the
130
+ # raw URI to request for the next page
131
+ #
132
+ # @raise [Zeppelin::ClientError] invalid request
133
+ def apids(page=nil)
134
+ uri = apid_uri(nil, :page => page)
135
+ get_paged_request(uri)
136
+ end
137
+
108
138
  # Pushes a message.
109
139
  #
110
140
  # @param [Hash] payload the payload of the message
@@ -252,7 +282,7 @@ class Zeppelin
252
282
 
253
283
  def put_request(uri, payload={})
254
284
  if !(payload.nil? || payload.empty?)
255
- response =connection.put(uri, payload, JSON_HEADERS)
285
+ response = connection.put(uri, payload, JSON_HEADERS)
256
286
  else
257
287
  response = connection.put(uri)
258
288
  end
@@ -269,16 +299,33 @@ class Zeppelin
269
299
  response.body if response.success?
270
300
  end
271
301
 
302
+ def get_paged_request(uri)
303
+ results = get_request(uri)
304
+ md = results['next_page'] && results['next_page'].match(/(start|page)=(\d+)/)
305
+
306
+ results['next_page'] = md[2].to_i unless md.nil?
307
+
308
+ results
309
+ end
310
+
272
311
  def post_request(uri, payload)
273
312
  connection.post(uri, payload, JSON_HEADERS).success?
274
313
  end
275
314
 
276
- def device_token_uri(device_token)
277
- "/api/device_tokens/#{device_token}"
315
+ def query_string(query)
316
+ '?' + query.map { |k, v| "#{k}=#{v}" }.join('&')
317
+ end
318
+
319
+ def device_token_uri(device_token, query={})
320
+ uri = "/api/device_tokens/#{device_token}"
321
+ uri << query_string(query) unless query.empty?
322
+ uri
278
323
  end
279
324
 
280
- def apid_uri(apid)
281
- "/api/apids/#{apid}"
325
+ def apid_uri(apid, query={})
326
+ uri = "/api/apids/#{apid}"
327
+ uri << query_string(query) unless query.empty?
328
+ uri
282
329
  end
283
330
 
284
331
  def feedback_uri(since)
@@ -26,7 +26,7 @@ class Zeppelin
26
26
  end
27
27
 
28
28
  def process_content_type?(env)
29
- env[:response_headers][CONTENT_TYPE].to_s =~ /\bjson$/
29
+ env[:response_headers][CONTENT_TYPE].to_s =~ /application\/(.*)json/
30
30
  end
31
31
 
32
32
  def parse_response?(env)
@@ -1,3 +1,3 @@
1
1
  class Zeppelin
2
- VERSION = '0.6.0'
2
+ VERSION = '0.7.0'
3
3
  end
@@ -38,13 +38,13 @@ describe Zeppelin do
38
38
  end
39
39
 
40
40
  describe '#register_device_token' do
41
+ let(:uri) { "/api/device_tokens/#{device_token}" }
42
+
41
43
  let(:payload) { { :alias => 'CapnKernul' } }
42
44
 
43
45
  it 'registers a device with the service' do
44
46
  stub_requests do |stub|
45
- stub.put("/api/device_tokens/#{device_token}") do |stub|
46
- [201, {}, '']
47
- end
47
+ stub.put(uri) { [201, {}, ''] }
48
48
  end
49
49
 
50
50
  subject.register_device_token(device_token).should be_true
@@ -52,19 +52,15 @@ describe Zeppelin do
52
52
 
53
53
  it 'accepts a payload' do
54
54
  stub_requests do |stub|
55
- stub.put("/api/device_tokens/#{device_token}", MultiJson.encode(payload)) do
56
- [200, {}, '']
57
- end
55
+ stub.put(uri) { [201, {}, ''] }
58
56
  end
59
57
 
60
- subject.register_device_token(device_token, payload).should be_true
58
+ subject.register_device_token(device_token, payload)
61
59
  end
62
60
 
63
61
  it 'responds with false when an error occurs' do
64
62
  stub_requests do |stub|
65
- stub.put("/api/device_tokens/#{device_token}", nil) do
66
- [500, {}, '']
67
- end
63
+ stub.put(uri) { [500, {}, ''] }
68
64
  end
69
65
 
70
66
  expect {
@@ -74,23 +70,21 @@ describe Zeppelin do
74
70
  end
75
71
 
76
72
  describe '#device_token' do
73
+ let(:uri) { "/api/device_tokens/#{device_token}" }
74
+
77
75
  let(:response_body) { { 'foo' => 'bar' } }
78
76
 
79
77
  it 'gets information about a device' do
80
78
  stub_requests do |stub|
81
- stub.get("/api/device_tokens/#{device_token}") do
82
- [200, { 'Content-Type' => 'application/json' }, MultiJson.encode(response_body)]
83
- end
79
+ stub.get(uri) { [200, { 'Content-Type' => 'application/json' }, MultiJson.encode(response_body)] }
84
80
  end
85
81
 
86
82
  subject.device_token(device_token).should eq(response_body)
87
83
  end
88
84
 
89
- it 'is nil when the request fails' do
85
+ it 'raises an error when the request fails' do
90
86
  stub_requests do |stub|
91
- stub.get("/api/device_tokens/#{device_token}") do
92
- [404, {}, '']
93
- end
87
+ stub.get(uri) { [404, {}, ''] }
94
88
  end
95
89
 
96
90
  expect {
@@ -100,21 +94,19 @@ describe Zeppelin do
100
94
  end
101
95
 
102
96
  describe '#delete_device_token' do
97
+ let(:uri) { "/api/device_tokens/#{device_token}" }
98
+
103
99
  it 'is true when successful' do
104
100
  stub_requests do |stub|
105
- stub.delete("/api/device_tokens/#{device_token}") do
106
- [204, {}, '']
107
- end
101
+ stub.delete(uri) { [204, {}, ''] }
108
102
  end
109
103
 
110
104
  subject.delete_device_token(device_token).should be_true
111
105
  end
112
106
 
113
- it 'is false when the request fails' do
107
+ it 'raises an error when the request fails' do
114
108
  stub_requests do |stub|
115
- stub.delete("/api/device_tokens/#{device_token}") do
116
- [404, {}, '']
117
- end
109
+ stub.delete(uri) { [404, {}, ''] }
118
110
  end
119
111
 
120
112
  expect {
@@ -123,14 +115,79 @@ describe Zeppelin do
123
115
  end
124
116
  end
125
117
 
118
+ describe '#device_tokens' do
119
+ let(:results_without_next_page) {
120
+ {
121
+ 'device_tokens_count' => 1,
122
+ 'device_tokens' => [
123
+ {
124
+ 'device_token' => 'example device token',
125
+ 'active' => true,
126
+ 'alias' => nil,
127
+ 'last_registration' => Time.mktime(2009, 6, 26, 19, 4, 43).to_s
128
+ }
129
+ ],
130
+ 'current_page' => 1,
131
+ 'num_pages' => 1,
132
+ 'active_device_tokens' => 1
133
+ }
134
+ }
135
+
136
+ let(:results_with_next_page) {
137
+ results_without_next_page.merge('next_page' => 'https://go.urbanairship.com/api/device_tokens/?page=2&limit=5000')
138
+ }
139
+
140
+ it 'requests a page of device tokens' do
141
+ stub_requests do |stub|
142
+ stub.get('/api/device_tokens/?page=') { [200, { 'Content-Type' => 'application/json' }, MultiJson.encode(results_without_next_page)] }
143
+ end
144
+
145
+ subject.device_tokens.should eq(results_without_next_page)
146
+ end
147
+
148
+ it 'includes the page number of the next page' do
149
+ stub_requests do |stub|
150
+ stub.get('/api/device_tokens/?page=') { [200, { 'Content-Type' => 'application/json' }, MultiJson.encode(results_with_next_page)] }
151
+ end
152
+
153
+ subject.device_tokens['next_page'].should eq(2)
154
+ end
155
+
156
+ it 'does not include the page number if there are no additional pages' do
157
+ stub_requests do |stub|
158
+ stub.get('/api/device_tokens/?page=') { [200, { 'Content-Type' => 'application/json' }, MultiJson.encode(results_without_next_page)] }
159
+ end
160
+
161
+ subject.device_tokens.should_not have_key('next_page')
162
+ end
163
+
164
+ it 'requests a specified page of device_tokens' do
165
+ stub_requests do |stub|
166
+ stub.get('/api/device_tokens/?page=4') { [200, { 'Content-Type' => 'application/json' }, MultiJson.encode(results_without_next_page)] }
167
+ end
168
+
169
+ subject.device_tokens(4)
170
+ end
171
+
172
+ it 'raises an error when the request fails' do
173
+ stub_requests do |stub|
174
+ stub.get('/api/device_tokens/?page=') { [500, {}, ''] }
175
+ end
176
+
177
+ expect {
178
+ subject.device_tokens
179
+ }.to raise_error(Zeppelin::ClientError)
180
+ end
181
+ end
182
+
126
183
  describe '#register_apid' do
184
+ let(:uri) { "/api/apids/#{device_token}" }
185
+
127
186
  let(:payload) { { :alias => 'CapnKernul' } }
128
187
 
129
188
  it 'registers a device with the service' do
130
189
  stub_requests do |stub|
131
- stub.put("/api/apids/#{device_token}") do |stub|
132
- [201, {}, '']
133
- end
190
+ stub.put(uri) { [201, {}, ''] }
134
191
  end
135
192
 
136
193
  subject.register_apid(device_token).should be_true
@@ -138,19 +195,15 @@ describe Zeppelin do
138
195
 
139
196
  it 'accepts a payload' do
140
197
  stub_requests do |stub|
141
- stub.put("/api/apids/#{device_token}", MultiJson.encode(payload)) do
142
- [200, {}, '']
143
- end
198
+ stub.put(uri, MultiJson.encode(payload)) { [200, {}, ''] }
144
199
  end
145
200
 
146
201
  subject.register_apid(device_token, payload).should be_true
147
202
  end
148
203
 
149
- it 'responds with false when an error occurs' do
204
+ it 'raises an error when the request fails' do
150
205
  stub_requests do |stub|
151
- stub.put("/api/apids/#{device_token}", nil) do
152
- [500, {}, '']
153
- end
206
+ stub.put(uri) { [500, {}, ''] }
154
207
  end
155
208
 
156
209
  expect {
@@ -160,23 +213,21 @@ describe Zeppelin do
160
213
  end
161
214
 
162
215
  describe '#apid' do
216
+ let(:uri) { "/api/apids/#{device_token}" }
217
+
163
218
  let(:response_body) { { 'foo' => 'bar' } }
164
219
 
165
220
  it 'responds with information about a device when request is successful' do
166
221
  stub_requests do |stub|
167
- stub.get("/api/apids/#{device_token}") do
168
- [200, { 'Content-Type' => 'application/json' }, MultiJson.encode(response_body)]
169
- end
222
+ stub.get(uri) { [200, { 'Content-Type' => 'application/json' }, MultiJson.encode(response_body)] }
170
223
  end
171
224
 
172
225
  subject.apid(device_token).should eq(response_body)
173
226
  end
174
227
 
175
- it 'is nil when the request fails' do
228
+ it 'raises an error when the request fails' do
176
229
  stub_requests do |stub|
177
- stub.get("/api/apids/#{device_token}") do
178
- [404, {}, '']
179
- end
230
+ stub.get("/api/apids/#{device_token}") { [404, {}, ''] }
180
231
  end
181
232
 
182
233
  expect {
@@ -186,21 +237,19 @@ describe Zeppelin do
186
237
  end
187
238
 
188
239
  describe '#delete_apid' do
240
+ let(:uri) { "/api/apids/#{device_token}" }
241
+
189
242
  it 'responds with true when request successful' do
190
243
  stub_requests do |stub|
191
- stub.delete("/api/apids/#{device_token}") do
192
- [204, {}, '']
193
- end
244
+ stub.delete(uri) { [204, {}, ''] }
194
245
  end
195
246
 
196
247
  subject.delete_apid(device_token).should be_true
197
248
  end
198
249
 
199
- it 'responds with false when request fails' do
250
+ it 'raises an error when the request fails' do
200
251
  stub_requests do |stub|
201
- stub.delete("/api/apids/#{device_token}") do
202
- [404, {}, '']
203
- end
252
+ stub.delete(uri) { [404, {}, ''] }
204
253
  end
205
254
 
206
255
  expect {
@@ -209,24 +258,83 @@ describe Zeppelin do
209
258
  end
210
259
  end
211
260
 
261
+ describe '#apids' do
262
+ let(:results_without_next_page) {
263
+ {
264
+ 'apids' => [
265
+ {
266
+ 'apid' => 'example apid',
267
+ 'active' => true,
268
+ 'alias' => '',
269
+ 'tags' => []
270
+ }
271
+ ]
272
+ }
273
+ }
274
+
275
+ let(:results_with_next_page) {
276
+ results_without_next_page.merge('next_page' => 'https://go.urbanairship.com/api/apids/?start=2&limit=5000')
277
+ }
278
+
279
+ it 'requests a page of APIDs' do
280
+ stub_requests do |stub|
281
+ stub.get('/api/apids/?page=') { [200, { 'Content-Type' => 'application/json' }, MultiJson.encode(results_without_next_page)] }
282
+ end
283
+
284
+ subject.apids.should eq(results_without_next_page)
285
+ end
286
+
287
+ it 'includes the page number of the next page' do
288
+ stub_requests do |stub|
289
+ stub.get('/api/apids/?page=') { [200, { 'Content-Type' => 'application/json' }, MultiJson.encode(results_with_next_page)] }
290
+ end
291
+
292
+ subject.apids['next_page'].should eq(2)
293
+ end
294
+
295
+ it 'does not include the page number if there are no additional pages' do
296
+ stub_requests do |stub|
297
+ stub.get('/api/apids/?page=') { [200, { 'Content-Type' => 'application/json' }, MultiJson.encode(results_without_next_page)] }
298
+ end
299
+
300
+ subject.apids.should_not have_key('next_page')
301
+ end
302
+
303
+ it 'requests a specified page of APIDs' do
304
+ stub_requests do |stub|
305
+ stub.get('/api/apids/?page=4') { [200, { 'Content-Type' => 'application/json' }, MultiJson.encode(results_without_next_page)] }
306
+ end
307
+
308
+ subject.apids(4)
309
+ end
310
+
311
+ it 'raises an error when the request fails' do
312
+ stub_requests do |stub|
313
+ stub.get('/api/apids/?page=') { [500, {}, ''] }
314
+ end
315
+
316
+ expect {
317
+ subject.apids
318
+ }.to raise_error(Zeppelin::ClientError)
319
+ end
320
+ end
321
+
212
322
  describe '#push' do
323
+ let(:uri) { '/api/push/' }
324
+
213
325
  let(:payload) { { :device_tokens => [device_token], :aps => { :alert => 'Hello from Urban Airship!' } } }
214
326
 
215
327
  it 'is true when the request is successful' do
216
328
  stub_requests do |stub|
217
- stub.post('/api/push/', MultiJson.encode(payload)) do
218
- [200, {}, '']
219
- end
329
+ stub.post(uri, MultiJson.encode(payload)) { [200, {}, ''] }
220
330
  end
221
331
 
222
332
  subject.push(payload).should be_true
223
333
  end
224
334
 
225
- it 'is false when the request fails' do
335
+ it 'raises an error when the request fails' do
226
336
  stub_requests do |stub|
227
- stub.post('/api/push/', '{}') do
228
- [400, {}, '']
229
- end
337
+ stub.post(uri, '{}') { [400, {}, ''] }
230
338
  end
231
339
 
232
340
  expect {
@@ -252,21 +360,19 @@ describe Zeppelin do
252
360
 
253
361
  let(:payload) { [message1, message2] }
254
362
 
363
+ let(:uri) { '/api/push/batch/' }
364
+
255
365
  it 'is true when the request was successful' do
256
366
  stub_requests do |stub|
257
- stub.post('/api/push/batch/', MultiJson.encode(payload)) do
258
- [200, {}, '']
259
- end
367
+ stub.post(uri, MultiJson.encode(payload)) { [200, {}, ''] }
260
368
  end
261
369
 
262
370
  subject.batch_push(message1, message2).should be_true
263
371
  end
264
372
 
265
- it 'is false when the request fails' do
373
+ it 'raises an error when the request fails' do
266
374
  stub_requests do |stub|
267
- stub.post('/api/push/batch/', '[{},{}]') do
268
- [400, {}, '']
269
- end
375
+ stub.post('/api/push/batch/', '[{},{}]') { [400, {}, ''] }
270
376
  end
271
377
 
272
378
  expect {
@@ -278,21 +384,19 @@ describe Zeppelin do
278
384
  describe '#broadcast' do
279
385
  let(:payload) { { :aps => { :alert => 'Hello from Urban Airship!' } } }
280
386
 
387
+ let(:uri) { '/api/push/broadcast/' }
388
+
281
389
  it 'is true when the request is successful' do
282
390
  stub_requests do |stub|
283
- stub.post('/api/push/broadcast/', MultiJson.encode(payload)) do
284
- [200, {}, '']
285
- end
391
+ stub.post(uri, MultiJson.encode(payload)) { [200, {}, ''] }
286
392
  end
287
393
 
288
394
  subject.broadcast(payload).should be_true
289
395
  end
290
396
 
291
- it 'is false when the request fails' do
397
+ it 'raises an error when the request fails' do
292
398
  stub_requests do |stub|
293
- stub.post('/api/push/broadcast/', '{}') do
294
- [400, {}, '']
295
- end
399
+ stub.post(uri, '{}') { [400, {}, ''] }
296
400
  end
297
401
 
298
402
  expect {
@@ -306,21 +410,19 @@ describe Zeppelin do
306
410
 
307
411
  let(:since) { Time.at(0) }
308
412
 
413
+ let(:uri) { '/api/device_tokens/feedback/?since=1970-01-01T00%3A00%3A00Z' }
414
+
309
415
  it 'is the response body for a successful request' do
310
416
  stub_requests do |stub|
311
- stub.get('/api/device_tokens/feedback/?since=1970-01-01T00%3A00%3A00Z') do
312
- [200, { 'Content-Type' => 'application/json' }, MultiJson.encode(response_body)]
313
- end
417
+ stub.get(uri) { [200, { 'Content-Type' => 'application/json' }, MultiJson.encode(response_body)] }
314
418
  end
315
419
 
316
420
  subject.feedback(since)
317
421
  end
318
422
 
319
- it 'is nil when the request fails' do
423
+ it 'raises an error when the request fails' do
320
424
  stub_requests do |stub|
321
- stub.get('/api/device_tokens/feedback/?since=1970-01-01T00%3A00%3A00Z') do
322
- [400, {}, '']
323
- end
425
+ stub.get(uri) { [400, {}, ''] }
324
426
  end
325
427
 
326
428
  expect {
@@ -336,9 +438,7 @@ describe Zeppelin do
336
438
 
337
439
  it 'requets to modify device tokens on a tag' do
338
440
  stub_requests do |stub|
339
- stub.post("/api/tags/#{tag_name}") do
340
- [200, {}, 'OK']
341
- end
441
+ stub.post("/api/tags/#{tag_name}") { [200, {}, 'OK'] }
342
442
  end
343
443
 
344
444
  subject.modify_device_tokens_on_tag(tag_name, { 'device_tokens' => { 'add' => [device_token] } }).should be
@@ -350,9 +450,7 @@ describe Zeppelin do
350
450
 
351
451
  it 'is true when the request is successful' do
352
452
  stub_requests do |stub|
353
- stub.put("/api/tags/#{tag_name}") do
354
- [201, {}, '']
355
- end
453
+ stub.put("/api/tags/#{tag_name}") { [201, {}, ''] }
356
454
  end
357
455
 
358
456
  subject.add_tag(tag_name).should be_true
@@ -364,9 +462,7 @@ describe Zeppelin do
364
462
 
365
463
  it 'is true when the request is successful' do
366
464
  stub_requests do |stub|
367
- stub.delete("/api/tags/#{tag_name}") do
368
- [204, {}, '']
369
- end
465
+ stub.delete("/api/tags/#{tag_name}") { [204, {}, ''] }
370
466
  end
371
467
 
372
468
  subject.remove_tag(tag_name).should be_true
@@ -374,9 +470,7 @@ describe Zeppelin do
374
470
 
375
471
  it 'is false when the request fails' do
376
472
  stub_requests do |stub|
377
- stub.delete("/api/tags/#{tag_name}") do
378
- [404, {}, '']
379
- end
473
+ stub.delete("/api/tags/#{tag_name}") { [404, {}, ''] }
380
474
  end
381
475
 
382
476
  expect {
@@ -388,21 +482,19 @@ describe Zeppelin do
388
482
  describe '#device_tags' do
389
483
  let(:response_body) { { 'tags' => ['tag1', 'some_tag'] } }
390
484
 
485
+ let(:uri) { "/api/device_tokens/#{device_token}/tags/" }
486
+
391
487
  it 'is the collection of tags on a device when request is successful' do
392
488
  stub_requests do |stub|
393
- stub.get("/api/device_tokens/#{device_token}/tags/") do
394
- [200, { 'Content-Type' => 'application/json' }, MultiJson.encode(response_body)]
395
- end
489
+ stub.get(uri) { [200, { 'Content-Type' => 'application/json' }, MultiJson.encode(response_body)] }
396
490
  end
397
491
 
398
492
  subject.device_tags(device_token).should eq(response_body)
399
493
  end
400
494
 
401
- it 'is nil when the request fails' do
495
+ it 'raises an error when the request fails' do
402
496
  stub_requests do |stub|
403
- stub.get("/api/device_tokens/#{device_token}/tags/") do
404
- [404, {}, 'Not Found']
405
- end
497
+ stub.get(uri) { [404, {}, 'Not Found'] }
406
498
  end
407
499
 
408
500
  expect {
@@ -414,21 +506,19 @@ describe Zeppelin do
414
506
  describe '#add_tag_to_device' do
415
507
  let(:tag_name) { 'radio.head' }
416
508
 
509
+ let(:uri) { "/api/device_tokens/#{device_token}/tags/#{tag_name}" }
510
+
417
511
  it 'is true when the request is successful' do
418
512
  stub_requests do |stub|
419
- stub.put("/api/device_tokens/#{device_token}/tags/#{tag_name}") do
420
- [201, {}, 'Created']
421
- end
513
+ stub.put(uri) { [201, {}, 'Created'] }
422
514
  end
423
515
 
424
516
  subject.add_tag_to_device(device_token, tag_name).should be_true
425
517
  end
426
518
 
427
- it 'is false when the request fails' do
519
+ it 'raises an error when the request fails' do
428
520
  stub_requests do |stub|
429
- stub.put("/api/device_tokens/#{device_token}/tags/#{tag_name}") do
430
- [404, {}, '']
431
- end
521
+ stub.put(uri) { [404, {}, ''] }
432
522
  end
433
523
 
434
524
  expect {
@@ -440,21 +530,19 @@ describe Zeppelin do
440
530
  describe '#remove_tag_from_device' do
441
531
  let(:tag_name) { 'martin.fowler' }
442
532
 
533
+ let(:uri) { "/api/device_tokens/#{device_token}/tags/#{tag_name}" }
534
+
443
535
  it 'is true when the request is successful' do
444
536
  stub_requests do |stub|
445
- stub.delete("/api/device_tokens/#{device_token}/tags/#{tag_name}") do
446
- [204, {}, 'No Content']
447
- end
537
+ stub.delete(uri) { [204, {}, 'No Content'] }
448
538
  end
449
539
 
450
540
  subject.remove_tag_from_device(device_token, tag_name).should be_true
451
541
  end
452
542
 
453
- it 'is false when the request fails' do
543
+ it 'raises an error when the request fails' do
454
544
  stub_requests do |stub|
455
- stub.delete("/api/device_tokens/#{device_token}/tags/#{tag_name}") do
456
- [404, {}, '']
457
- end
545
+ stub.delete(uri) { [404, {}, ''] }
458
546
  end
459
547
 
460
548
  expect {
@@ -463,8 +551,10 @@ describe Zeppelin do
463
551
  end
464
552
  end
465
553
 
466
- def stub_requests(&block)
554
+ def stub_requests
467
555
  subject.connection.builder.handlers.delete(Faraday::Adapter::NetHttp)
468
- subject.connection.adapter(:test, &block)
556
+ subject.connection.adapter :test do |stubs|
557
+ yield(stubs)
558
+ end
469
559
  end
470
560
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zeppelin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-02-23 00:00:00.000000000 Z
13
+ date: 2012-02-28 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: faraday
17
- requirement: &70356824338980 !ruby/object:Gem::Requirement
17
+ requirement: &70196652109980 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: '0'
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *70356824338980
25
+ version_requirements: *70196652109980
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: multi_json
28
- requirement: &70356824337960 !ruby/object:Gem::Requirement
28
+ requirement: &70196652109320 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ~>
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: '1.1'
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *70356824337960
36
+ version_requirements: *70196652109320
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: rspec
39
- requirement: &70356824337460 !ruby/object:Gem::Requirement
39
+ requirement: &70196652108780 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: '0'
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *70356824337460
47
+ version_requirements: *70196652108780
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: rake
50
- requirement: &70356824336900 !ruby/object:Gem::Requirement
50
+ requirement: &70196652108000 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ! '>='
@@ -55,7 +55,7 @@ dependencies:
55
55
  version: '0'
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *70356824336900
58
+ version_requirements: *70196652108000
59
59
  description: Ruby client for the Urban Airship Push Notification API
60
60
  email:
61
61
  - alex@kernul.com
@@ -103,7 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
103
103
  version: '0'
104
104
  requirements: []
105
105
  rubyforge_project: zeppelin
106
- rubygems_version: 1.8.17
106
+ rubygems_version: 1.8.15
107
107
  signing_key:
108
108
  specification_version: 3
109
109
  summary: Urban Airship library for Ruby