urbanairship 2.4.1 → 3.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,192 @@
1
+ require 'json'
2
+
3
+ require 'ext/object'
4
+ require 'urbanairship/common'
5
+ require 'urbanairship/loggable'
6
+
7
+ module Urbanairship
8
+ module Push
9
+
10
+ # A Push Notification.
11
+ class Push
12
+ attr_writer :client, :audience, :notification, :options,
13
+ :device_types, :message
14
+ attr_reader :device_types
15
+ include Urbanairship::Common
16
+ include Urbanairship::Loggable
17
+
18
+ # Initialize a Push Object
19
+ #
20
+ # @param [Object] client
21
+ def initialize(client)
22
+ @client = client
23
+ end
24
+
25
+ def payload
26
+ {
27
+ audience: @audience,
28
+ notification: @notification,
29
+ options: @options,
30
+ device_types: @device_types,
31
+ message: @message
32
+ }.compact
33
+ end
34
+
35
+ # Send the Push Object
36
+ #
37
+ # @raise [AirshipFailure] if the request failed
38
+ # @raise [Unauthorized] if authentication failed
39
+ # @raise [Forbidden] if app does not have entitlement
40
+ # @return [PushResponse] with `push_ids` and other response data.
41
+ def send_push
42
+ response = @client.send_request(
43
+ method: 'POST',
44
+ body: JSON.dump(payload),
45
+ url: PUSH_URL,
46
+ content_type: 'application/json',
47
+ version: 3
48
+ )
49
+ pr = PushResponse.new(http_response_body: response['body'], http_response_code: response['code'].to_s)
50
+ logger.info { pr.format }
51
+ pr
52
+ end
53
+ end
54
+
55
+
56
+ class ScheduledPush
57
+ attr_writer :schedule, :name, :push, :url
58
+ attr_reader :url, :push
59
+ include Urbanairship::Common
60
+ include Urbanairship::Loggable
61
+
62
+ # Initialize a Scheduled Push Object
63
+ #
64
+ # @param [Object] client
65
+ def initialize(client)
66
+ @client = client
67
+ end
68
+
69
+ def payload
70
+ {
71
+ name: @name,
72
+ schedule: @schedule,
73
+ push: @push.payload
74
+ }.compact
75
+ end
76
+
77
+ # Schedule the Push Notification
78
+ #
79
+ # @raise [AirshipFailure] if the request failed
80
+ # @raise [Unauthorized] if authentication failed
81
+ # @raise [Forbidden] if app does not have entitlement
82
+ # @return [PushResponse] with `schedule_url` and other response data.
83
+ def send_push
84
+ response = @client.send_request(
85
+ method: 'POST',
86
+ body: JSON.dump(payload),
87
+ url: SCHEDULES_URL,
88
+ content_type: 'application/json',
89
+ version: 3
90
+ )
91
+ pr = PushResponse.new(http_response_body: response['body'], http_response_code: response['code'].to_s)
92
+ logger.info { pr.format }
93
+ @url = pr.schedule_url
94
+ pr
95
+ end
96
+
97
+ # Build a Scheduled Push Notification object its existing Scheduled Push URL
98
+ #
99
+ # @param [Object] client The Client
100
+ # @param [Object] url The existing Scheduled Push URL
101
+ # @return [Object] Scheduled Push Object
102
+ def self.from_url(client: required('client'), url: required('url'))
103
+ scheduled_push = ScheduledPush.new(client)
104
+ response_body = client.send_request(
105
+ method: 'GET',
106
+ body: nil,
107
+ url: url,
108
+ version: 3
109
+ )
110
+ payload = JSON.load(response_body)
111
+
112
+ p = Push.new(client)
113
+ p.audience = payload['push']['audience']
114
+ p.notification = payload['push']['notification']
115
+ p.device_types = payload['push']['device_types']
116
+ p.message = payload['push']['message']
117
+ p.options = payload['push']['options']
118
+
119
+ scheduled_push.name = payload['name']
120
+ scheduled_push.schedule = payload['schedule']
121
+ scheduled_push.push = p
122
+ scheduled_push.url = url
123
+ scheduled_push
124
+ end
125
+
126
+ # Cancel the Scheduled Push
127
+ #
128
+ # @return [Object] Push Response
129
+ def cancel
130
+ fail ArgumentError,
131
+ 'Cannot cancel ScheduledPush without a url.' if @url.nil?
132
+
133
+ response = @client.send_request(
134
+ method: 'DELETE',
135
+ body: nil,
136
+ url: @url,
137
+ content_type: 'application/json',
138
+ version: 3
139
+ )
140
+ pr = PushResponse.new(http_response_body: response['body'], http_response_code: response['code'].to_s)
141
+ logger.info { "Result of canceling scheduled push: #{@url} was a: [#{pr.status_code}]" }
142
+ pr
143
+ end
144
+
145
+ # Update the Scheduled Push
146
+ #
147
+ # @return [Object]
148
+ def update
149
+ fail ArgumentError,
150
+ 'Cannot update a ScheduledPush without a url.' if @url.nil?
151
+ response = @client.send_request(
152
+ method: 'PUT',
153
+ body: JSON.dump(self.payload),
154
+ url: @url,
155
+ content_type: 'application/json',
156
+ version: 3
157
+ )
158
+ pr = PushResponse.new(http_response_body: response['body'], http_response_code: response['code'].to_s)
159
+ logger.info { pr.format }
160
+ pr
161
+ end
162
+ end
163
+
164
+
165
+ # Response to a successful push notification send or schedule.
166
+ class PushResponse
167
+ attr_reader :ok, :push_ids, :schedule_url, :operation_id, :payload, :status_code
168
+
169
+ def initialize(http_response_body: nil, http_response_code: nil)
170
+ @payload = http_response_body || "No Content"
171
+ @ok = @payload['ok'] || "None"
172
+ @push_ids = @payload['push_ids'] || "None"
173
+ @schedule_url = @payload['schedule_urls'].try(:first) || "None"
174
+ @operation_id = @payload['operation_id'] || "None"
175
+ @status_code = http_response_code
176
+ end
177
+
178
+ # String Formatting of the PushResponse
179
+ #
180
+ # @return [Object] String Formatted PushResponse
181
+ def format
182
+ base = "Received [#{@status_code}] response code. \nHeaders: \tBody:\n"
183
+ payload.each do |key, value|
184
+ safe_value = value.to_s || "None"
185
+ base << "#{key}:\t#{safe_value}\n"
186
+ end
187
+ base
188
+ end
189
+
190
+ end
191
+ end
192
+ end
@@ -0,0 +1,23 @@
1
+ require 'urbanairship/util'
2
+
3
+ module Urbanairship
4
+ module Push
5
+ module Schedule
6
+ # Select a date and time for Scheduled Push
7
+ def scheduled_time(datetime)
8
+ payload(:scheduled_time, datetime)
9
+ end
10
+
11
+ # Select a local date and time for Scheduled Push
12
+ def local_scheduled_time(datetime)
13
+ payload(:local_scheduled_time, datetime)
14
+ end
15
+
16
+ private
17
+
18
+ def payload(name, time)
19
+ { name => Util.time_format(time) }
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,15 @@
1
+ module Urbanairship
2
+ module Util
3
+ module_function
4
+
5
+ # @raise [ArgumentError] unless obj matches the pattern.
6
+ def validate(obj, name, regex)
7
+ fail ArgumentError, "#{obj} isn't a valid #{name}" unless obj =~ regex
8
+ end
9
+
10
+ # @return [String] the datetime formatted as expected by the API
11
+ def time_format(datetime)
12
+ datetime.strftime('%Y-%m-%dT%H:%M:%S')
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,3 @@
1
+ module Urbanairship
2
+ VERSION = '3.0.1'
3
+ end
@@ -0,0 +1,38 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'urbanairship/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'urbanairship'
8
+ spec.version = Urbanairship::VERSION
9
+ spec.authors = ['Urban Airship']
10
+ spec.email = ['support@urbanairship.com']
11
+ spec.licenses = ['Apache-2.0']
12
+
13
+ spec.summary = 'Ruby Gem for using the Urban Airship API'
14
+ spec.description = 'A Ruby Library for using the Urban Airship web service API for push notifications and rich app pages.'
15
+ spec.homepage = "https://github.com/urbanairship/ruby-library"
16
+
17
+ spec.required_ruby_version = '>= 2.0.0'
18
+
19
+ if spec.respond_to?(:metadata)
20
+ spec.metadata['allowed_push_host'] = "https://rubygems.org"
21
+ else
22
+ fail 'RubyGems 2.0 or newer is required to protect against public gem pushes.'
23
+ end
24
+
25
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
26
+ spec.bindir = 'exe'
27
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
+ spec.require_paths = ['lib']
29
+
30
+ spec.add_runtime_dependency 'unirest', '~> 1.1', '>= 1.1.2'
31
+
32
+ spec.add_development_dependency 'bundler', '~> 1'
33
+ spec.add_development_dependency 'guard-rspec'
34
+ spec.add_development_dependency 'pry', '~> 0'
35
+ spec.add_development_dependency 'rake', '~> 10.0'
36
+ spec.add_development_dependency 'rspec', '~> 3'
37
+ spec.add_development_dependency 'terminal-notifier-guard', '~> 1'
38
+ end
metadata CHANGED
@@ -1,107 +1,174 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: urbanairship
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.1
5
- prerelease:
4
+ version: 3.0.1
6
5
  platform: ruby
7
6
  authors:
8
- - Groupon, Inc.
7
+ - Urban Airship
9
8
  autorequire:
10
- bindir: bin
9
+ bindir: exe
11
10
  cert_chain: []
12
- date: 2014-10-14 00:00:00.000000000 Z
11
+ date: 2015-07-10 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
- name: json
14
+ name: unirest
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
- version: '0'
19
+ version: '1.1'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.1.2
22
23
  type: :runtime
23
24
  prerelease: false
24
25
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
26
  requirements:
27
- - - ! '>='
27
+ - - "~>"
28
28
  - !ruby/object:Gem::Version
29
- version: '0'
29
+ version: '1.1'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.1.2
30
33
  - !ruby/object:Gem::Dependency
31
- name: rspec
34
+ name: bundler
32
35
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
36
  requirements:
35
- - - ! '>='
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1'
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1'
47
+ - !ruby/object:Gem::Dependency
48
+ name: guard-rspec
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
36
52
  - !ruby/object:Gem::Version
37
53
  version: '0'
38
54
  type: :development
39
55
  prerelease: false
40
56
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
57
  requirements:
43
- - - ! '>='
58
+ - - ">="
44
59
  - !ruby/object:Gem::Version
45
60
  version: '0'
46
61
  - !ruby/object:Gem::Dependency
47
- name: fakeweb
62
+ name: pry
48
63
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
64
  requirements:
51
- - - ! '>='
65
+ - - "~>"
52
66
  - !ruby/object:Gem::Version
53
67
  version: '0'
54
68
  type: :development
55
69
  prerelease: false
56
70
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
71
  requirements:
59
- - - ! '>='
72
+ - - "~>"
60
73
  - !ruby/object:Gem::Version
61
74
  version: '0'
62
- description: Urbanairship is a Ruby library for interacting with the Urban Airship
63
- (http://urbanairship.com) API.
75
+ - !ruby/object:Gem::Dependency
76
+ name: rake
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '10.0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '10.0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: rspec
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '3'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '3'
103
+ - !ruby/object:Gem::Dependency
104
+ name: terminal-notifier-guard
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '1'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '1'
117
+ description: A Ruby Library for using the Urban Airship web service API for push notifications
118
+ and rich app pages.
64
119
  email:
65
- - rubygems@groupon.com
120
+ - support@urbanairship.com
66
121
  executables: []
67
122
  extensions: []
68
123
  extra_rdoc_files: []
69
124
  files:
70
- - README.markdown
125
+ - ".gitignore"
126
+ - ".rspec"
127
+ - ".travis.yml"
128
+ - CHANGELOG
129
+ - Gemfile
130
+ - Guardfile
71
131
  - LICENSE
132
+ - README.md
72
133
  - Rakefile
73
- - lib/urbanairship/response.rb
134
+ - bin/console
135
+ - bin/setup
136
+ - lib/ext/hash.rb
137
+ - lib/ext/object.rb
74
138
  - lib/urbanairship.rb
75
- - spec/response_spec.rb
76
- - spec/spec_helper.rb
77
- - spec/urbanairship_spec.rb
78
- homepage: http://github.com/groupon/urbanairship
139
+ - lib/urbanairship/client.rb
140
+ - lib/urbanairship/common.rb
141
+ - lib/urbanairship/loggable.rb
142
+ - lib/urbanairship/push/audience.rb
143
+ - lib/urbanairship/push/payload.rb
144
+ - lib/urbanairship/push/push.rb
145
+ - lib/urbanairship/push/schedule.rb
146
+ - lib/urbanairship/util.rb
147
+ - lib/urbanairship/version.rb
148
+ - urbanairship.gemspec
149
+ homepage: https://github.com/urbanairship/ruby-library
79
150
  licenses:
80
- - BSD
151
+ - Apache-2.0
152
+ metadata:
153
+ allowed_push_host: https://rubygems.org
81
154
  post_install_message:
82
155
  rdoc_options: []
83
156
  require_paths:
84
157
  - lib
85
158
  required_ruby_version: !ruby/object:Gem::Requirement
86
- none: false
87
159
  requirements:
88
- - - ! '>='
160
+ - - ">="
89
161
  - !ruby/object:Gem::Version
90
- version: 1.8.6
162
+ version: 2.0.0
91
163
  required_rubygems_version: !ruby/object:Gem::Requirement
92
- none: false
93
164
  requirements:
94
- - - ! '>='
165
+ - - ">="
95
166
  - !ruby/object:Gem::Version
96
167
  version: '0'
97
168
  requirements: []
98
169
  rubyforge_project:
99
- rubygems_version: 1.8.23
170
+ rubygems_version: 2.2.2
100
171
  signing_key:
101
- specification_version: 3
102
- summary: A Ruby wrapper for the Urban Airship API
103
- test_files:
104
- - spec/response_spec.rb
105
- - spec/spec_helper.rb
106
- - spec/urbanairship_spec.rb
107
- has_rdoc:
172
+ specification_version: 4
173
+ summary: Ruby Gem for using the Urban Airship API
174
+ test_files: []