urbanairship 2.2.0 → 2.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.markdown CHANGED
@@ -24,6 +24,13 @@ Registering a device token
24
24
  ```ruby
25
25
  Urbanairship.register_device('DEVICE-TOKEN')
26
26
  ```
27
+ You can also pass an alias, and a set of tags to device registration.
28
+ ```ruby
29
+ Urbanairship.register_device('DEVICE-TOKEN',
30
+ :alias => 'user-123',
31
+ :tags => ['san-francisco-users']
32
+ )
33
+ ```
27
34
 
28
35
  Unregistering a device token
29
36
  ----------------------------
@@ -65,6 +72,26 @@ notifications = [
65
72
  Urbanairship.batch_push(notifications)
66
73
  ```
67
74
 
75
+ Sending notifications to a segment
76
+ ---------------------------
77
+ Urban Airship segments let you send a push notification to a subset of relevant users based on location, time, preferences, and behavior. You can read more about segments in the [Urban Airship docs](https://docs.urbanairship.com/display/DOCS/Server%3A+Segments+API).
78
+
79
+ ```ruby
80
+ notification = {
81
+ :schedule_for => [1.hour.from_now],
82
+ :segments => ['SEGMENT-ID'],
83
+ :ios => {
84
+ :aps => {
85
+ :alert => 'You have a new message!', :badge => 1
86
+ }
87
+ },
88
+ :android => {
89
+ :alert => 'You have a new message!', :badge => 1
90
+ }
91
+ }
92
+
93
+ Urbanairship.push_to_segment(notification)
94
+ ```
68
95
 
69
96
  Sending broadcast notifications
70
97
  -------------------------------
@@ -111,6 +138,68 @@ Urbanairship.delete_scheduled_push(123456789)
111
138
  Urbanairship.delete_scheduled_push(:alias => "deadbeef")
112
139
  ```
113
140
 
141
+ Tags
142
+ ----
143
+
144
+ Urban Airship allows you to create tags and associate them with devices. Then you can easily send a notification to every device matching a certain tag with a single call to the push API.
145
+
146
+ ### Creating a tag ###
147
+
148
+ Tags must be registered before you can use them.
149
+
150
+ ```ruby
151
+ Urbanairship.add_tag('TAG')
152
+ ```
153
+
154
+ ### Listing your tags ###
155
+
156
+ ```ruby
157
+ Urbanairship.tags
158
+ ```
159
+
160
+ ### Removing a tag ##
161
+
162
+ This will remove a tag from your set of registered tags, as well as removing that tag from any devices that are currently using it.
163
+
164
+ ```ruby
165
+ Urbanairship.remove_tag('TAG')
166
+ ```
167
+
168
+ ### View tags associated with device ###
169
+
170
+ ```ruby
171
+ Urbanairship.tags_for_device('DEVICE-TOKEN')
172
+ ```
173
+
174
+ ### Tag a device ###
175
+
176
+ ```ruby
177
+ Urbanairship.tag_device(:device_token => 'DEVICE-TOKEN', :tag => 'TAG')
178
+ ```
179
+
180
+ You can also tag a device during device registration.
181
+
182
+ ```ruby
183
+ Urbanairship.register_device('DEVICE-TOKEN', :tags => ['san-francisco-users'])
184
+ ```
185
+
186
+ ### Untag a device ###
187
+
188
+ ```ruby
189
+ Urbanairship.untag_device(:device_token => 'DEVICE-TOKEN', :tag => 'TAG')
190
+ ```
191
+
192
+ ### Sending a notification to all devices with a given tag ###
193
+
194
+ ```ruby
195
+ notification = {
196
+ :tags => ['san-francisco-users'],
197
+ :aps => {:alert => 'Good morning San Francisco!', :badge => 1}
198
+ }
199
+
200
+ Urbanairship.push(notification)
201
+ ```
202
+
114
203
  Using Urbanairship with Android
115
204
  -------------------------------
116
205
 
data/lib/urbanairship.rb CHANGED
@@ -44,6 +44,11 @@ module Urbanairship
44
44
  do_request(:post, "/api/push/", :body => body, :authenticate_with => :master_secret)
45
45
  end
46
46
 
47
+ def push_to_segment(options = {})
48
+ body = parse_push_options(options).to_json
49
+ do_request(:post, "/api/push/segments", :body => body, :authenticate_with => :master_secret)
50
+ end
51
+
47
52
  def batch_push(notifications = [])
48
53
  body = notifications.map{|notification| parse_push_options(notification)}.to_json
49
54
  do_request(:post, "/api/push/batch/", :body => body, :authenticate_with => :master_secret)
@@ -58,6 +63,30 @@ module Urbanairship
58
63
  do_request(:get, "/api/device_tokens/feedback/?since=#{format_time(time)}", :authenticate_with => :master_secret)
59
64
  end
60
65
 
66
+ def tags
67
+ do_request(:get, "/api/tags/", :authenticate_with => :master_secret)
68
+ end
69
+
70
+ def add_tag(tag)
71
+ do_request(:put, "/api/tags/#{tag}", :authenticate_with => :master_secret)
72
+ end
73
+
74
+ def remove_tag(tag)
75
+ do_request(:delete, "/api/tags/#{tag}", :authenticate_with => :master_secret)
76
+ end
77
+
78
+ def tags_for_device(device_token)
79
+ do_request(:get, "/api/device_tokens/#{device_token}/tags", :authenticate_with => :master_secret)
80
+ end
81
+
82
+ def tag_device(params)
83
+ do_request(:put, "/api/device_tokens/#{params[:device_token]}/tags/#{params[:tag]}", :authenticate_with => :master_secret)
84
+ end
85
+
86
+ def untag_device(params)
87
+ do_request(:delete, "/api/device_tokens/#{params[:device_token]}/tags/#{params[:tag]}", :authenticate_with => :master_secret)
88
+ end
89
+
61
90
  private
62
91
 
63
92
  def do_request(http_method, path, options = {})
@@ -35,6 +35,41 @@ shared_examples_for "an Urbanairship client" do
35
35
  # feedback
36
36
  FakeWeb.register_uri(:get, /my_app_key\:my_master_secret\@go\.urbanairship.com\/api\/device_tokens\/feedback/, :status => ["200", "OK"], :body => "[{\"device_token\":\"token\",\"marked_inactive_on\":\"2010-10-14T19:15:13Z\",\"alias\":\"my_alias\"}]")
37
37
  FakeWeb.register_uri(:get, /my_app_key2\:my_master_secret2\@go\.urbanairship.com\/api\/device_tokens\/feedback/, :status => ["500", "Internal Server Error"])
38
+
39
+ #tags
40
+ FakeWeb.register_uri(:get, /my_app_key\:my_master_secret\@go\.urbanairship.com\/api\/tags/, :status => ["200", "OK"], :body => "[{\"tags\":[\"tag1\",\"tag2\"]}]")
41
+ FakeWeb.register_uri(:get, /my_app_key2\:my_master_secret2\@go\.urbanairship.com\/api\/tags/, :status => ["500", "Internal Server Error"])
42
+
43
+ #add_tag
44
+ FakeWeb.register_uri(:put, /my_app_key\:my_master_secret\@go\.urbanairship.com\/api\/tags\/new_tag/, :status => ["200", "OK"])
45
+ FakeWeb.register_uri(:put, /my_app_key\:my_master_secret\@go\.urbanairship.com\/api\/tags\/existing_tag/, :status => ["201", "OK"])
46
+ FakeWeb.register_uri(:put, /my_app_key2\:my_master_secret2\@go\.urbanairship.com\/api\/tags\/a_tag/, :status => ["500", "Internal Server Error"])
47
+
48
+ #remove_tag
49
+ FakeWeb.register_uri(:delete, /my_app_key\:my_master_secret\@go\.urbanairship.com\/api\/tags\/non_deleted_tag/, :status => ["204", "OK"])
50
+ FakeWeb.register_uri(:delete, /my_app_key\:my_master_secret\@go\.urbanairship.com\/api\/tags\/deleted_tag/, :status => ["404", "OK"])
51
+ FakeWeb.register_uri(:delete, /my_app_key2\:my_master_secret2\@go\.urbanairship.com\/api\/tags\/a_tag/, :status => ["500", "Internal Server Error"])
52
+
53
+ #tags_for_device_tokens
54
+ FakeWeb.register_uri(:get, /my_app_key\:my_master_secret\@go\.urbanairship.com\/api\/device_tokens\/valid_device_token\/tags/, :status => ["200", "OK"], :body => "[{\"tags\":[\"tag1\",\"tag2\"]}]")
55
+ FakeWeb.register_uri(:get, /my_app_key\:my_master_secret\@go\.urbanairship.com\/api\/device_tokens\/invalid_device_token\/tags/, :status => ["404", "OK"])
56
+ FakeWeb.register_uri(:get, /my_app_key2\:my_master_secret2\@go\.urbanairship.com\/api\/device_tokens\/a_device_token\/tags/, :status => ["500", "Internal Server Error"])
57
+
58
+ ##tag_device
59
+ FakeWeb.register_uri(:put, /my_app_key\:my_master_secret\@go\.urbanairship.com\/api\/device_tokens\/valid_device_token\/tags\/new_tag/, :status => ["201", "OK"])
60
+ FakeWeb.register_uri(:put, /my_app_key\:my_master_secret\@go\.urbanairship.com\/api\/device_tokens\/valid_device_token\/tags\/existing_tag/, :status => ["200", "OK"])
61
+ FakeWeb.register_uri(:put, /my_app_key2\:my_master_secret2\@go\.urbanairship.com\/api\/device_tokens\/a_device_token\/tags\/a_tag/, :status => ["500", "Internal Server Error"])
62
+
63
+ #untag_device
64
+ FakeWeb.register_uri(:delete, /my_app_key\:my_master_secret\@go\.urbanairship.com\/api\/device_tokens\/valid_device_token\/tags\/existing_tag/, :status => ["204", "OK"])
65
+ FakeWeb.register_uri(:delete, /my_app_key\:my_master_secret\@go\.urbanairship.com\/api\/device_tokens\/valid_device_token\/tags\/non_existant_tag/, :status => ["404", "OK"])
66
+ FakeWeb.register_uri(:delete, /my_app_key2\:my_master_secret2\@go\.urbanairship.com\/api\/device_tokens\/a_device_token\/tags\/a_tag/, :status => ["500", "Internal Server Error"])
67
+
68
+ # push to segment
69
+ FakeWeb.register_uri(:post, "https://my_app_key:my_master_secret@go.urbanairship.com/api/push/segments", :status => ["200", "OK"])
70
+ FakeWeb.register_uri(:post, "https://my_app_key2:my_master_secret2@go.urbanairship.com/api/push/segments", :status => ["400", "Bad Request"])
71
+ FakeWeb.register_uri(:post, /bad_key\:my_master_secret\@go\.urbanairship\.com/, :status => ["401", "Unauthorized"])
72
+
38
73
  end
39
74
 
40
75
  describe "configuration" do
@@ -56,6 +91,223 @@ shared_examples_for "an Urbanairship client" do
56
91
  subject.master_secret.should == "asdf1234"
57
92
  end
58
93
  end
94
+
95
+ describe "::tags" do
96
+ before(:each) do
97
+ subject.application_key = "my_app_key"
98
+ subject.master_secret = "my_master_secret"
99
+ end
100
+
101
+ it "raises an error if call is made without an app key and master secret configured" do
102
+ subject.application_key = nil
103
+ subject.master_secret = nil
104
+
105
+ lambda {
106
+ subject.tags
107
+ }.should raise_error(RuntimeError, "Must configure application_key, master_secret before making this request.")
108
+ end
109
+
110
+ it "uses app key and secret to sign the request" do
111
+ subject.tags
112
+ FakeWeb.last_request['authorization'].should == "Basic #{Base64::encode64('my_app_key:my_master_secret').chomp}"
113
+ end
114
+
115
+ it "returns valid tags" do
116
+ response = subject.tags
117
+ response.first.should include("tags")
118
+ response.first["tags"].should include("tag1")
119
+ response.first["tags"].should include("tag2")
120
+ end
121
+
122
+ it "success? is false when the call doesn't return 200" do
123
+ subject.application_key = "my_app_key2"
124
+ subject.master_secret = "my_master_secret2"
125
+ subject.tags.success?.should == false
126
+ end
127
+
128
+ end
129
+
130
+ describe "::add_tag" do
131
+ before(:each) do
132
+ subject.application_key = "my_app_key"
133
+ subject.master_secret = "my_master_secret"
134
+ end
135
+
136
+ it "raises an error if call is made without an app key and master secret configured" do
137
+ subject.application_key = nil
138
+ subject.master_secret = nil
139
+
140
+ lambda {
141
+ subject.add_tag('a_tag')
142
+ }.should raise_error(RuntimeError, "Must configure application_key, master_secret before making this request.")
143
+ end
144
+
145
+ it "uses app key and secret to sign the request" do
146
+ subject.add_tag('new_tag')
147
+ FakeWeb.last_request['authorization'].should == "Basic #{Base64::encode64('my_app_key:my_master_secret').chomp}"
148
+ end
149
+
150
+ it "adds a new tag" do
151
+ subject.add_tag('new_tag').success?.should == true
152
+ subject.add_tag('new_tag').code.should == "200"
153
+ end
154
+
155
+ it "adds an exisiting tag" do
156
+ subject.add_tag('existing_tag').success?.should == true
157
+ subject.add_tag('existing_tag').code.should == "201"
158
+ end
159
+
160
+ it "success? is false when the call doesn't return 200 or 201" do
161
+ subject.application_key = "my_app_key2"
162
+ subject.master_secret = "my_master_secret2"
163
+ subject.add_tag('a_tag').success?.should == false
164
+ end
165
+
166
+ end
167
+
168
+ describe "::remove_tag" do
169
+ before(:each) do
170
+ subject.application_key = "my_app_key"
171
+ subject.master_secret = "my_master_secret"
172
+ end
173
+
174
+ it "raises an error if call is made without an app key and master secret configured" do
175
+ subject.application_key = nil
176
+ subject.master_secret = nil
177
+
178
+ lambda {
179
+ subject.remove_tag('a_tag')
180
+ }.should raise_error(RuntimeError, "Must configure application_key, master_secret before making this request.")
181
+ end
182
+
183
+ it "uses app key and secret to sign the request" do
184
+ subject.remove_tag('non_deleted_tag')
185
+ FakeWeb.last_request['authorization'].should == "Basic #{Base64::encode64('my_app_key:my_master_secret').chomp}"
186
+ end
187
+
188
+ it "removes a tag that has not been removed yet" do
189
+ subject.remove_tag('non_deleted_tag').success?.should == true
190
+ subject.remove_tag('non_deleted_tag').code.should == "204"
191
+ end
192
+
193
+ it "attempts to remove an already deleted tag" do
194
+ subject.remove_tag('deleted_tag').success?.should == false
195
+ subject.remove_tag('deleted_tag').code.should == "404"
196
+ end
197
+
198
+ it "success? is false when the call doesn't return 204" do
199
+ subject.application_key = "my_app_key2"
200
+ subject.master_secret = "my_master_secret2"
201
+ subject.add_tag('a_tag').success?.should == false
202
+ end
203
+ end
204
+
205
+ describe "::tags_for_device" do
206
+ before(:each) do
207
+ subject.application_key = "my_app_key"
208
+ subject.master_secret = "my_master_secret"
209
+ end
210
+
211
+ it "raises an error if call is made without an app key and master secret configured" do
212
+ subject.application_key = nil
213
+ subject.master_secret = nil
214
+
215
+ lambda {
216
+ subject.tags_for_device('a_device_token')
217
+ }.should raise_error(RuntimeError, "Must configure application_key, master_secret before making this request.")
218
+ end
219
+
220
+ it "uses app key and secret to sign the request" do
221
+ subject.tags_for_device('valid_device_token')
222
+ FakeWeb.last_request['authorization'].should == "Basic #{Base64::encode64('my_app_key:my_master_secret').chomp}"
223
+ end
224
+
225
+ it "returns valid tags for a device" do
226
+ response = subject.tags_for_device('valid_device_token')
227
+ response.first.should include("tags")
228
+ response.first["tags"].should include("tag1")
229
+ response.first["tags"].should include("tag2")
230
+ response.code.should == "200"
231
+ end
232
+
233
+ it "returns invalid response for device token that is not found or registered" do
234
+ response = subject.tags_for_device('invalid_device_token')
235
+ response.code.should == "404"
236
+ end
237
+
238
+ it "success? is false when the call doesn't return 200" do
239
+ subject.application_key = "my_app_key2"
240
+ subject.master_secret = "my_master_secret2"
241
+ subject.tags_for_device('a_device_token').success?.should == false
242
+ end
243
+ end
244
+
245
+ describe "::tag_device" do
246
+ before(:each) do
247
+ subject.application_key = "my_app_key"
248
+ subject.master_secret = "my_master_secret"
249
+ end
250
+
251
+ it "raises an error if call is made without an app key and master secret configured" do
252
+ subject.application_key = nil
253
+ subject.master_secret = nil
254
+
255
+ lambda {
256
+ subject.tag_device({:device_token => 'a_device_token', :tag => 'a_tag'})
257
+ }.should raise_error(RuntimeError, "Must configure application_key, master_secret before making this request.")
258
+ end
259
+
260
+ it "uses app key and secret to sign the request" do
261
+ subject.tag_device({:device_token => 'valid_device_token', :tag => 'new_tag'})
262
+ FakeWeb.last_request['authorization'].should == "Basic #{Base64::encode64('my_app_key:my_master_secret').chomp}"
263
+ end
264
+
265
+ it "adds a valid device token to tag" do
266
+ response = subject.tag_device({:device_token => 'valid_device_token', :tag => 'new_tag'})
267
+ response.code.should == "201"
268
+ response.success?.should == true
269
+ end
270
+
271
+ it "adds a valid device token to an existing tag" do
272
+ response = subject.tag_device({:device_token => 'valid_device_token', :tag => 'existing_tag'})
273
+ response.code.should == "200"
274
+ response.success?.should == true
275
+ end
276
+ end
277
+
278
+ describe "::untag_device" do
279
+ before(:each) do
280
+ subject.application_key = "my_app_key"
281
+ subject.master_secret = "my_master_secret"
282
+ end
283
+
284
+ it "raises an error if call is made without an app key and master secret configured" do
285
+ subject.application_key = nil
286
+ subject.master_secret = nil
287
+
288
+ lambda {
289
+ subject.untag_device({:device_token => 'a_device_token', :tag => 'a_tag'})
290
+ }.should raise_error(RuntimeError, "Must configure application_key, master_secret before making this request.")
291
+ end
292
+
293
+ it "uses app key and secret to sign the request" do
294
+ subject.untag_device({:device_token => 'valid_device_token', :tag => 'existing_tag'})
295
+ FakeWeb.last_request['authorization'].should == "Basic #{Base64::encode64('my_app_key:my_master_secret').chomp}"
296
+ end
297
+
298
+ it "removes a valid device token from a tag" do
299
+ response = subject.untag_device({:device_token => 'valid_device_token', :tag => 'existing_tag'})
300
+ response.code.should == "204"
301
+ response.success?.should == true
302
+ end
303
+
304
+ it "removes a device token from a tag that it is not associated with" do
305
+ response = subject.untag_device({:device_token => 'valid_device_token', :tag => 'non_existant_tag'})
306
+ response.code.should == "404"
307
+ response.success?.should == false
308
+ end
309
+ end
310
+
59
311
 
60
312
  describe "::register_device" do
61
313
  before(:each) do
@@ -270,6 +522,54 @@ shared_examples_for "an Urbanairship client" do
270
522
  subject.push.success?.should == false
271
523
  end
272
524
  end
525
+
526
+ describe "::push_to_segment" do
527
+ before(:each) do
528
+ @valid_params = {:segments => ['segment-id'], :aps => {:alert => 'foo'}}
529
+ subject.application_key = "my_app_key"
530
+ subject.master_secret = "my_master_secret"
531
+ end
532
+
533
+ it "raises an error if call is made without an app key and master secret configured" do
534
+ subject.application_key = nil
535
+ subject.master_secret = nil
536
+
537
+ lambda {
538
+ subject.push(@valid_params)
539
+ }.should raise_error(RuntimeError, "Must configure application_key, master_secret before making this request.")
540
+ end
541
+
542
+ it "uses app key and secret to sign the request" do
543
+ subject.push_to_segment(@valid_params)
544
+ FakeWeb.last_request['authorization'].should == "Basic #{Base64::encode64('my_app_key:my_master_secret').chomp}"
545
+ end
546
+
547
+ it "returns true when it successfully pushes a notification" do
548
+ subject.push_to_segment(@valid_params).success?.should == true
549
+ end
550
+
551
+ it "returns false when the authorization is invalid" do
552
+ subject.application_key = "bad_key"
553
+ subject.push_to_segment(@valid_params).success?.should == false
554
+ end
555
+
556
+ it "adds schedule_for to the JSON payload" do
557
+ time = Time.parse("Oct 17th, 2010, 8:00 PM UTC")
558
+ subject.push_to_segment(@valid_params.merge(:schedule_for => [time]))
559
+ request_json['schedule_for'].should == ['2010-10-17T20:00:00Z']
560
+ end
561
+
562
+ it "only attempts to format schedule_for if it is a time object" do
563
+ subject.push_to_segment(@valid_params.merge(:schedule_for => ["2010-10-10 09:09:09 UTC"]))
564
+ request_json['schedule_for'].should == ['2010-10-10T09:09:09Z']
565
+ end
566
+
567
+ it "returns false if urbanairship responds with a non-200 response" do
568
+ subject.application_key = "my_app_key2"
569
+ subject.master_secret = "my_master_secret2"
570
+ subject.push_to_segment.success?.should == false
571
+ end
572
+ end
273
573
 
274
574
  describe "::batch_push" do
275
575
  before(:each) do
metadata CHANGED
@@ -1,75 +1,72 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: urbanairship
3
- version: !ruby/object:Gem::Version
4
- hash: 7
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.2.1
5
5
  prerelease:
6
- segments:
7
- - 2
8
- - 2
9
- - 0
10
- version: 2.2.0
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Groupon, Inc.
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2012-11-08 00:00:00 -06:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
12
+ date: 2013-01-11 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
22
15
  name: json
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
25
17
  none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 3
30
- segments:
31
- - 0
32
- version: "0"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
33
22
  type: :runtime
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: rspec
37
23
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
39
25
  none: false
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- hash: 3
44
- segments:
45
- - 0
46
- version: "0"
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
47
38
  type: :development
48
- version_requirements: *id002
49
- - !ruby/object:Gem::Dependency
50
- name: fakeweb
51
39
  prerelease: false
52
- requirement: &id003 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
53
41
  none: false
54
- requirements:
55
- - - ">="
56
- - !ruby/object:Gem::Version
57
- hash: 3
58
- segments:
59
- - 0
60
- version: "0"
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: fakeweb
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
61
54
  type: :development
62
- version_requirements: *id003
63
- description: Urbanairship is a Ruby library for interacting with the Urban Airship (http://urbanairship.com) API.
64
- email:
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ description: Urbanairship is a Ruby library for interacting with the Urban Airship
63
+ (http://urbanairship.com) API.
64
+ email:
65
65
  - rubygems@groupon.com
66
66
  executables: []
67
-
68
67
  extensions: []
69
-
70
68
  extra_rdoc_files: []
71
-
72
- files:
69
+ files:
73
70
  - README.markdown
74
71
  - LICENSE
75
72
  - Rakefile
@@ -78,43 +75,31 @@ files:
78
75
  - spec/response_spec.rb
79
76
  - spec/spec_helper.rb
80
77
  - spec/urbanairship_spec.rb
81
- has_rdoc: true
82
78
  homepage: http://github.com/groupon/urbanairship
83
79
  licenses: []
84
-
85
80
  post_install_message:
86
81
  rdoc_options: []
87
-
88
- require_paths:
82
+ require_paths:
89
83
  - lib
90
- required_ruby_version: !ruby/object:Gem::Requirement
84
+ required_ruby_version: !ruby/object:Gem::Requirement
91
85
  none: false
92
- requirements:
93
- - - ">="
94
- - !ruby/object:Gem::Version
95
- hash: 59
96
- segments:
97
- - 1
98
- - 8
99
- - 6
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
100
89
  version: 1.8.6
101
- required_rubygems_version: !ruby/object:Gem::Requirement
90
+ required_rubygems_version: !ruby/object:Gem::Requirement
102
91
  none: false
103
- requirements:
104
- - - ">="
105
- - !ruby/object:Gem::Version
106
- hash: 3
107
- segments:
108
- - 0
109
- version: "0"
92
+ requirements:
93
+ - - ! '>='
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
110
96
  requirements: []
111
-
112
97
  rubyforge_project:
113
- rubygems_version: 1.6.2
98
+ rubygems_version: 1.8.24
114
99
  signing_key:
115
100
  specification_version: 3
116
101
  summary: A Ruby wrapper for the Urban Airship API
117
- test_files:
102
+ test_files:
118
103
  - spec/response_spec.rb
119
104
  - spec/spec_helper.rb
120
105
  - spec/urbanairship_spec.rb