urbanairship 6.0.0 → 7.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 169148502585341b7938add240f3595e2124e56228916a1ad73b72f4e457885e
4
- data.tar.gz: da1a1067c809c43bed0b0df1ebfc55d28443c2adcb1d5c0c8f3311dbd070b378
3
+ metadata.gz: fffdb1489ab1f833e816db52d94b9aea7dac527f07bde6507af1dee57f491140
4
+ data.tar.gz: 2255e7731044332f60b883568929e197905a690c45d905d0a75214806163434a
5
5
  SHA512:
6
- metadata.gz: 6f04b2d733ed47e8bf8779cf3844d67962b0b7815c9450b5112cb706b81e8c8f566660034f21a8762a6ddc9ac6c547e43fdbc11d083e881096bac53315d9f8d2
7
- data.tar.gz: fdd59798309c0dca97e596c35684ccab4f1cf04d9ffe7fb72eb6964a5466c126c6d47c236f9b50f784b4b1ba1e5a455b00950353aa9c77ffb62aa48ace89a2ee
6
+ metadata.gz: c39e8417e51bd08077a8658589cdee0db2639e5e5d60e6de2596aa361e9640f16cb25ff284cfa55da044dd814b1b01001b84bc7b1c1dbcbbdc441c1dab7b6405
7
+ data.tar.gz: 209ebf90c4d266092557e387d0479ccaf8fbd3d07d05f12f78e74186c4fd0c32a00a83b306994c64de9961554cd7eb39b115dc32b5130cc9c2f564553df72eb5
data/CHANGELOG CHANGED
@@ -1,3 +1,8 @@
1
+ --------------------
2
+ 7.0.0
3
+ --------------------
4
+ - Refactors base url naming
5
+
1
6
  --------------------
2
7
  6.0.0
3
8
  --------------------
data/README.rst CHANGED
@@ -38,17 +38,23 @@ Installation
38
38
 
39
39
  If you have the ``bundler`` gem (if not you can get it with
40
40
  ``$ gem install bundler``) add this line to your application's
41
- Gemfile::
41
+ Gemfile:
42
42
 
43
- >>> gem 'urbanairship'
43
+ .. code-block::
44
44
 
45
- And then execute::
45
+ >>> $ gem 'urbanairship'
46
46
 
47
- >>> $ bundle
47
+ And then execute:
48
48
 
49
- OR install it yourself as::
49
+ .. code-block::
50
50
 
51
- >>> gem install urbanairship
51
+ >>> $ bundle
52
+
53
+ OR install it yourself as:
54
+
55
+ .. code-block::
56
+
57
+ >>> $ gem install urbanairship
52
58
 
53
59
 
54
60
  Configuration
@@ -56,28 +62,35 @@ Configuration
56
62
 
57
63
  In your app initialization, you can do something like the following:
58
64
 
59
- >>> require 'urbanairship'
60
- >>> Urbanairship.configure do |config|
61
- >>> config.server = 'go.airship.eu'
62
- >>> config.log_path = '/path/to/your/logfile'
63
- >>> config.log_level = Logger::WARN
64
- >>> config.timeout = 60
65
- >>> end
65
+ .. code-block:: ruby
66
+
67
+ require 'urbanairship'
68
+
69
+ Urbanairship.configure do |config|
70
+ config.server = 'go.airship.eu'
71
+ config.log_path = '/path/to/your/logfile'
72
+ config.log_level = Logger::WARN
73
+ config.timeout = 60
74
+ end
75
+
66
76
 
67
77
  If you want to use a custom logger (e.g Rails.logger), you can do:
68
78
 
69
- >>> require 'urbanairship'
70
- >>> Urbanairship.configure do |config|
71
- >>> config.custom_logger = Rails.logger
72
- >>> config.log_level = Logger::WARN
73
- >>> config.timeout = 60
74
- >>> end
79
+ .. code-block:: ruby
80
+
81
+ require 'urbanairship'
82
+
83
+ Urbanairship.configure do |config|
84
+ config.custom_logger = Rails.logger
85
+ config.log_level = Logger::WARN
86
+ end
75
87
 
76
88
  Available Configurations
77
89
  ------------------------
78
90
 
79
91
  - **log_path**: Allows to define the folder where the log file will be created (the default is nil).
80
92
  - **log_level**: Allows to define the log level and only messages at that level or higher will be printed (the default is INFO).
93
+ - **server**: Allow to define the Airship server you want to use ("go.airship.eu" or "go.urbanairship.com")
81
94
  - **timeout**: Allows to define the request timeout in seconds (the default is 5).
82
95
 
83
96
 
@@ -97,28 +110,71 @@ information.
97
110
  Broadcast to All Devices
98
111
  ------------------------
99
112
 
100
- >>> require 'urbanairship'
101
- >>> UA = Urbanairship
102
- >>> airship = UA::Client.new(key:'application_key', secret:'master_secret')
103
- >>> p = airship.create_push
104
- >>> p.audience = UA.all
105
- >>> p.notification = UA.notification(alert: 'Hello')
106
- >>> p.device_types = UA.all
107
- >>> p.send_push
113
+ .. code-block:: ruby
114
+
115
+ require 'urbanairship'
116
+
117
+ UA = Urbanairship
108
118
 
119
+ airship = UA::Client.new(key:'application_key', secret:'master_secret')
120
+ p = airship.create_push
121
+ p.audience = UA.all
122
+ p.notification = UA.notification(alert: 'Hello')
123
+ p.device_types = UA.all
124
+ p.send_push
109
125
 
110
126
  Simple Tag Push
111
127
  ---------------
112
128
 
113
- >>> require 'urbanairship'
114
- >>> UA = Urbanairship
115
- >>> airship = UA::Client.new(key:'application_key', secret:'master_secret')
116
- >>> p = airship.create_push
117
- >>> p.audience = UA.tag('some_tag')
118
- >>> p.notification = UA.notification(alert: 'Hello')
119
- >>> p.device_types = UA.all
120
- >>> p.send_push
129
+ .. code-block:: ruby
130
+
131
+ require 'urbanairship'
132
+
133
+ UA = Urbanairship
134
+
135
+ airship = UA::Client.new(key:'application_key', secret:'master_secret')
136
+ p = airship.create_push
137
+ p.audience = UA.tag('some_tag')
138
+ p.notification = UA.notification(alert: 'Hello')
139
+ p.device_types = UA.all
140
+ p.send_push
141
+
142
+ Specify the Airship server used to make your requests
143
+ -----------------------------------------------------
144
+ By default, the request will be sent to the 'go.airship.us' server:
145
+
146
+ .. code-block:: ruby
147
+
148
+ require 'urbanairship'
149
+
150
+ Urbanairship::Client.new(key:'application_key', secret:'master_secret')
151
+
152
+ You can change the server globally in the Urbanairship configuration:
153
+
154
+ .. code-block:: ruby
155
+
156
+ require 'urbanairship'
157
+
158
+ Urbanairship.configure do |config|
159
+ config.server = 'go.airship.eu'
160
+ end
161
+
162
+ Urbanairship::Client.new(key:'application_key', secret:'master_secret')
163
+ # request will be sent to the 'go.airship.eu' server
164
+
165
+ Finally, you can change the targeted server on a request basis:
166
+
167
+ .. code-block:: ruby
168
+
169
+ require 'urbanairship'
170
+
171
+ Urbanairship.configure do |config|
172
+ config.server = 'go.airship.eu'
173
+ end
121
174
 
175
+ Urbanairship::Client.new(key:'application_key', secret:'master_secret', server: 'go.airship.us')
176
+ # The Urbanairship configuration is overridden by the client and the
177
+ # request will be sent to the 'go.airship.us' server
122
178
 
123
179
  Contributing
124
180
  ============
@@ -19,7 +19,7 @@ module Urbanairship
19
19
  def list_ab_test
20
20
  response = @client.send_request(
21
21
  method: 'GET',
22
- url: experiments_url(format_url_with_params)
22
+ path: experiments_path(format_url_with_params)
23
23
  )
24
24
  logger.info("Looking up A/B Tests for project")
25
25
  response
@@ -29,7 +29,7 @@ module Urbanairship
29
29
  response = @client.send_request(
30
30
  method: 'POST',
31
31
  body: JSON.dump(experiment_object),
32
- url: experiments_url,
32
+ path: experiments_path,
33
33
  content_type: 'application/json'
34
34
  )
35
35
  logger.info("Created A/B Test")
@@ -39,7 +39,7 @@ module Urbanairship
39
39
  def list_scheduled_ab_test
40
40
  response = @client.send_request(
41
41
  method: 'GET',
42
- url: experiments_url('scheduled' + format_url_with_params)
42
+ path: experiments_path('scheduled' + format_url_with_params)
43
43
  )
44
44
  logger.info("Looking up scheduled A/B Tests for project")
45
45
  response
@@ -49,7 +49,7 @@ module Urbanairship
49
49
  fail ArgumentError, 'experiment_id must be set to delete individual A/B test' if @experiment_id.nil?
50
50
  response = @client.send_request(
51
51
  method: 'DELETE',
52
- url: experiments_url('scheduled/' + experiment_id)
52
+ path: experiments_path('scheduled/' + experiment_id)
53
53
  )
54
54
  logger.info("Deleting A/B test with ID #{experiment_id}")
55
55
  response
@@ -59,7 +59,7 @@ module Urbanairship
59
59
  response = @client.send_request(
60
60
  method: 'POST',
61
61
  body: JSON.dump(experiment_object),
62
- url: experiments_url('validate'),
62
+ path: experiments_path('validate'),
63
63
  content_type: 'application/json'
64
64
  )
65
65
  logger.info("Validating A/B Test")
@@ -70,7 +70,7 @@ module Urbanairship
70
70
  fail ArgumentError, 'experiment_id must be set to lookup individual A/B Test' if @experiment_id.nil?
71
71
  response = @client.send_request(
72
72
  method: 'GET',
73
- url: experiments_url(experiment_id)
73
+ path: experiments_path(experiment_id)
74
74
  )
75
75
  logger.info("Looking up A/B test with ID #{experiment_id}")
76
76
  response
@@ -22,7 +22,7 @@ module Urbanairship
22
22
  response = @client.send_request(
23
23
  method: 'POST',
24
24
  body: JSON.dump(pipeline_object),
25
- url: pipelines_url,
25
+ path: pipelines_path,
26
26
  content_type: 'application/json'
27
27
  )
28
28
  logger.info("Created Automation")
@@ -32,7 +32,7 @@ module Urbanairship
32
32
  def list_automations
33
33
  response = @client.send_request(
34
34
  method: 'GET',
35
- url: pipelines_url(format_url_with_params)
35
+ path: pipelines_path(format_url_with_params)
36
36
  )
37
37
  logger.info("Looking up automations for project")
38
38
  response
@@ -41,7 +41,7 @@ module Urbanairship
41
41
  def list_deleted_automations
42
42
  response = @client.send_request(
43
43
  method: 'GET',
44
- url: pipelines_url('deleted' + format_url_with_params)
44
+ path: pipelines_path('deleted' + format_url_with_params)
45
45
  )
46
46
  logger.info("Looking up deleted automations for project")
47
47
  response
@@ -51,7 +51,7 @@ module Urbanairship
51
51
  response = @client.send_request(
52
52
  method: 'POST',
53
53
  body: JSON.dump(pipeline_object),
54
- url: pipelines_url('validate'),
54
+ path: pipelines_path('validate'),
55
55
  content_type: 'application/json'
56
56
  )
57
57
  logger.info("Validating Automation")
@@ -62,7 +62,7 @@ module Urbanairship
62
62
  fail ArgumentError, 'pipeline_id must be set to lookup individual automation' if @pipeline_id.nil?
63
63
  response = @client.send_request(
64
64
  method: 'GET',
65
- url: pipelines_url(pipeline_id)
65
+ path: pipelines_path(pipeline_id)
66
66
  )
67
67
  logger.info("Looking up automation with id #{pipeline_id}")
68
68
  response
@@ -74,7 +74,7 @@ module Urbanairship
74
74
  response = @client.send_request(
75
75
  method: 'PUT',
76
76
  body: JSON.dump(pipeline_object),
77
- url: pipelines_url(pipeline_id),
77
+ path: pipelines_path(pipeline_id),
78
78
  content_type: 'application/json'
79
79
  )
80
80
  logger.info("Validating Automation")
@@ -85,7 +85,7 @@ module Urbanairship
85
85
  fail ArgumentError, 'pipeline_id must be set to delete individual automation' if @pipeline_id.nil?
86
86
  response = @client.send_request(
87
87
  method: 'DELETE',
88
- url: pipelines_url(pipeline_id)
88
+ path: pipelines_path(pipeline_id)
89
89
  )
90
90
  logger.info("Deleting automation with id #{pipeline_id}")
91
91
  response
@@ -13,11 +13,15 @@ module Urbanairship
13
13
  #
14
14
  # @param [Object] key Application Key
15
15
  # @param [Object] secret Application Secret
16
+ # @param [String] server Airship server to use ("go.airship.eu" or "go.urbanairship.com").
17
+ # Used only when the request is sent with a "path", not an "url".
16
18
  # @param [String] token Application Auth Token (for custom events endpoint)
17
19
  # @return [Object] Client
18
- def initialize(key: required('key'), secret: required('secret'), token: nil)
20
+ def initialize(key: required('key'), secret: required('secret'),
21
+ server: Urbanairship.configuration.server, token: nil)
19
22
  @key = key
20
23
  @secret = secret
24
+ @server = server
21
25
  @token = token
22
26
  end
23
27
 
@@ -25,12 +29,13 @@ module Urbanairship
25
29
  #
26
30
  # @param [Object] method HTTP Method
27
31
  # @param [Object] body Request Body
32
+ # @param [Object] path Request path
28
33
  # @param [Object] url Request URL
29
34
  # @param [Object] content_type Content-Type
30
35
  # @param [Object] encoding Encoding
31
36
  # @param [Symbol] auth_type (:basic|:bearer)
32
37
  # @return [Object] Push Response
33
- def send_request(method: required('method'), url: required('url'), body: nil,
38
+ def send_request(method: required('method'), path: nil, url: nil, body: nil,
34
39
  content_type: nil, encoding: nil, auth_type: :basic)
35
40
  req_type = case method
36
41
  when 'GET'
@@ -45,17 +50,21 @@ module Urbanairship
45
50
  fail 'Method was not "GET" "POST" "PUT" or "DELETE"'
46
51
  end
47
52
 
53
+ raise ArgumentError.new("path and url can't be both nil") if path.nil? && url.nil?
54
+
48
55
  headers = {'User-agent' => 'UARubyLib/' + Urbanairship::VERSION}
49
56
  headers['Accept'] = 'application/vnd.urbanairship+json; version=3'
50
57
  headers['Content-type'] = content_type unless content_type.nil?
51
58
  headers['Content-Encoding'] = encoding unless encoding.nil?
52
-
59
+
53
60
  if auth_type == :bearer
54
61
  raise ArgumentError.new('token must be provided as argument if auth_type=bearer') if @token.nil?
55
62
  headers['X-UA-Appkey'] = @key
56
63
  headers['Authorization'] = "Bearer #{@token}"
57
64
  end
58
65
 
66
+ url = "https://#{@server}/api#{path}" unless path.nil?
67
+
59
68
  debug = "Making #{method} request to #{url}.\n"+ "\tHeaders:\n"
60
69
  debug += "\t\tcontent-type: #{content_type}\n" unless content_type.nil?
61
70
  debug += "\t\tcontent-encoding: gzip\n" unless encoding.nil?
@@ -4,68 +4,64 @@ require 'urbanairship/loggable'
4
4
  module Urbanairship
5
5
  # Features mixed in to all classes
6
6
  module Common
7
- def url_for(path)
8
- "https://#{Urbanairship.configuration.server}/api#{path}"
7
+ def apid_path(path='')
8
+ "/apids/#{path}"
9
9
  end
10
10
 
11
- def apid_url(path='')
12
- url_for("/apids/#{path}")
11
+ def channel_path(path='')
12
+ "/channels/#{path}"
13
13
  end
14
14
 
15
- def channel_url(path='')
16
- url_for("/channels/#{path}")
15
+ def create_and_send_path(path='')
16
+ "/create-and-send/#{path}"
17
17
  end
18
18
 
19
- def create_and_send_url(path='')
20
- url_for("/create-and-send/#{path}")
19
+ def custom_events_path(path='')
20
+ "/custom-events/#{path}"
21
21
  end
22
22
 
23
- def custom_events_url(path='')
24
- url_for("/custom-events/#{path}")
23
+ def device_token_path(path='')
24
+ "/device_tokens/#{path}"
25
25
  end
26
26
 
27
- def device_token_url(path='')
28
- url_for("/device_tokens/#{path}")
27
+ def experiments_path(path='')
28
+ "/experiments/#{path}"
29
29
  end
30
30
 
31
- def experiments_url(path='')
32
- url_for("/experiments/#{path}")
31
+ def lists_path(path='')
32
+ "/lists/#{path}"
33
33
  end
34
34
 
35
- def lists_url(path='')
36
- url_for("/lists/#{path}")
35
+ def location_path(path='')
36
+ "/location/#{path}"
37
37
  end
38
38
 
39
- def location_url(path='')
40
- url_for("/location/#{path}")
39
+ def named_users_path(path='')
40
+ "/named_users/#{path}"
41
41
  end
42
42
 
43
- def named_users_url(path='')
44
- url_for("/named_users/#{path}")
43
+ def open_channel_path(path='')
44
+ "/open/#{path}"
45
45
  end
46
46
 
47
- def open_channel_url(path='')
48
- channel_url("/open/#{path}")
47
+ def pipelines_path(path='')
48
+ "/pipelines/#{path}"
49
49
  end
50
50
 
51
- def pipelines_url(path='')
52
- url_for("/pipelines/#{path}")
51
+ def push_path(path='')
52
+ "/push/#{path}"
53
53
  end
54
54
 
55
- def push_url(path='')
56
- url_for("/push/#{path}")
55
+ def reports_path(path='')
56
+ "/reports/#{path}"
57
57
  end
58
58
 
59
- def reports_url(path='')
60
- url_for("/reports/#{path}")
59
+ def schedules_path(path='')
60
+ "/schedules/#{path}"
61
61
  end
62
62
 
63
- def schedules_url(path='')
64
- url_for("/schedules/#{path}")
65
- end
66
-
67
- def segments_url(path='')
68
- url_for("/segments/#{path}")
63
+ def segments_path(path='')
64
+ "/segments/#{path}"
69
65
  end
70
66
 
71
67
  # Helper method for required keyword args in Ruby 2.0 that is compatible with 2.1+
@@ -161,36 +157,18 @@ module Urbanairship
161
157
 
162
158
  def initialize(client: required('client'))
163
159
  @client = client
164
- @next_page = nil
165
- @data_list = nil
166
- @data_attribute = nil
167
160
  @count = 0
168
- end
169
-
170
- def load_page
171
- return false unless @next_page
172
- response = @client.send_request(
173
- method: 'GET',
174
- url: @next_page
175
- )
176
- logger.info("Retrieving data from: #{@next_page}")
177
- check_next_page = response['body']['next_page']
178
- if check_next_page != @next_page
179
- @next_page = check_next_page
180
- elsif check_next_page
181
- # if check_page = next_page, we have repeats in the response.
182
- # and we don't want to load them
183
- return false
184
- else
185
- @next_page = nil
186
- end
187
- @data_list = response['body'][@data_attribute]
188
- true
161
+ @data_attribute = nil
162
+ @data_list = nil
163
+ @next_page_path = nil
164
+ @next_page_url = nil
189
165
  end
190
166
 
191
167
  def each
192
- while load_page
193
- @data_list.each do | value |
168
+ while @next_page_path || @next_page_url
169
+ load_page
170
+
171
+ @data_list.each do |value|
194
172
  @count += 1
195
173
  yield value
196
174
  end
@@ -200,6 +178,47 @@ module Urbanairship
200
178
  def count
201
179
  @count
202
180
  end
181
+
182
+ private
183
+
184
+ def load_page
185
+ logger.info("Retrieving data from: #{@next_page_url || @next_page_path}")
186
+ params = {
187
+ method: 'GET',
188
+ path: @next_page_path,
189
+ url: @next_page_url
190
+ }.select { |k, v| !v.nil? }
191
+ response = @client.send_request(params)
192
+
193
+ @data_list = get_new_data(response)
194
+ @next_page_url = get_next_page_url(response)
195
+ @next_page_path = nil
196
+ end
197
+
198
+ def extract_next_page_url(response)
199
+ response['body']['next_page']
200
+ end
201
+
202
+ def get_new_data(response)
203
+ potential_next_page_url = extract_next_page_url(response)
204
+
205
+ # if potential_next_page_url is the same as the current page, we have
206
+ # repeats in the response and we don't want to load them
207
+ return [] if potential_next_page_url && get_next_page_url(response).nil?
208
+
209
+ response['body'][@data_attribute]
210
+ end
211
+
212
+ def get_next_page_url(response)
213
+ potential_next_page_url = extract_next_page_url(response)
214
+ return nil if potential_next_page_url.nil?
215
+
216
+ # if potential_next_page_url is the same as the current page, we have
217
+ # repeats in the response and we don't want to check the next pages
218
+ return potential_next_page_url if @next_page_url && potential_next_page_url != @next_page_url
219
+ return potential_next_page_url if @next_page_path && !potential_next_page_url.end_with?(@next_page_path)
220
+ nil
221
+ end
203
222
  end
204
223
  end
205
224
  end