grocer 0.3.3 → 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +9 -1
- data/lib/grocer/mobile_device_management_notification.rb +25 -0
- data/lib/grocer/newsstand_notification.rb +3 -2
- data/lib/grocer/version.rb +1 -1
- data/spec/grocer/mobile_device_management_notification_spec.rb +38 -0
- data/spec/grocer/newsstand_notification_spec.rb +5 -7
- data/spec/grocer/notification_spec.rb +8 -9
- data/spec/grocer/passbook_notification_spec.rb +1 -3
- data/spec/spec_helper.rb +3 -0
- data/spec/support/notification_helpers.rb +9 -0
- metadata +9 -4
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,16 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## 0.3.4
|
4
|
+
|
5
|
+
* Add `Grocer::MobileDeviceManagementNotification` to send PushMagic tokens.
|
6
|
+
([Osis](https://github.com/Osis))
|
7
|
+
* Fix `Grocer::NewsstandNotification` payload
|
8
|
+
([khelll](https://github.com/khelll))
|
9
|
+
|
3
10
|
## 0.3.3
|
4
11
|
|
5
|
-
* Notifications that only include a custom payload are now valid.
|
12
|
+
* Notifications that only include a custom payload are now valid.
|
13
|
+
([overlycommonname](https://github.com/overlycommonname))
|
6
14
|
|
7
15
|
## 0.3.2
|
8
16
|
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'grocer/notification'
|
2
|
+
|
3
|
+
module Grocer
|
4
|
+
# Public: A specialized form of a Grocer::Notification which only requires a
|
5
|
+
# `push_magic` and `device_token` to be present in the payload.
|
6
|
+
#
|
7
|
+
# Examples
|
8
|
+
#
|
9
|
+
# Grocer::MobileDeviceManagementNotification.new(device_token: '...', push_magic: '...')
|
10
|
+
class MobileDeviceManagementNotification < Notification
|
11
|
+
attr_accessor :push_magic
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def payload_hash
|
16
|
+
{ mdm: push_magic }
|
17
|
+
end
|
18
|
+
|
19
|
+
def validate_payload
|
20
|
+
fail NoPayloadError unless push_magic
|
21
|
+
fail InvalidFormatError if alert || badge || custom
|
22
|
+
fail PayloadTooLargeError if payload_too_large?
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -8,6 +8,7 @@ module Grocer
|
|
8
8
|
# Examples
|
9
9
|
#
|
10
10
|
# Grocer::NewsstandNotification.new(device_token: '...')
|
11
|
+
# #=> { aps: { 'content-available' => 1 } }
|
11
12
|
class NewsstandNotification < Notification
|
12
13
|
|
13
14
|
private
|
@@ -15,9 +16,9 @@ module Grocer
|
|
15
16
|
def validate_payload
|
16
17
|
true
|
17
18
|
end
|
18
|
-
|
19
|
+
|
19
20
|
def payload_hash
|
20
|
-
{
|
21
|
+
{ aps: {'content-available' => 1} }
|
21
22
|
end
|
22
23
|
|
23
24
|
end
|
data/lib/grocer/version.rb
CHANGED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'grocer/mobile_device_management_notification'
|
3
|
+
require 'grocer/shared_examples_for_notifications'
|
4
|
+
|
5
|
+
describe Grocer::MobileDeviceManagementNotification do
|
6
|
+
let(:payload_from_bytes) { notification.to_bytes[45..-1] }
|
7
|
+
let(:payload_dictionary_from_bytes) { JSON.parse(payload_from_bytes, symbolize_names: true) }
|
8
|
+
|
9
|
+
describe 'binary format' do
|
10
|
+
let(:payload_options) { Hash[:push_magic, "00000000-1111-3333-4444-555555555555"] }
|
11
|
+
|
12
|
+
include_examples 'a notification'
|
13
|
+
|
14
|
+
it 'should have a single key in the payload' do
|
15
|
+
expect(payload_dictionary_from_bytes.length).to eq(1)
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'does require a mdm payload' do
|
19
|
+
expect(payload_dictionary_from_bytes[:'mdm']).to_not be_nil
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe 'no push magic specified' do
|
24
|
+
let(:notification) { Grocer::MobileDeviceManagementNotification.new(device_token: "token", alert: "Moo") }
|
25
|
+
|
26
|
+
it 'should raise a payload error' do
|
27
|
+
-> { notification.to_bytes }.should raise_error(Grocer::NoPayloadError)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe 'aps object is included in the payload' do
|
32
|
+
let(:notification) { Grocer::MobileDeviceManagementNotification.new(device_token: "token", push_magic: "00000000-1111-3333-4444-555555555555", alert: "test") }
|
33
|
+
|
34
|
+
it 'should raise a format error' do
|
35
|
+
-> { payload_dictionary_from_bytes }.should raise_error(Grocer::InvalidFormatError)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -5,18 +5,16 @@ require 'grocer/shared_examples_for_notifications'
|
|
5
5
|
describe Grocer::NewsstandNotification do
|
6
6
|
describe 'binary format' do
|
7
7
|
let(:payload_options) { Hash.new }
|
8
|
-
let(:
|
9
|
-
let(:payload_dictionary_from_bytes) { JSON.parse(payload_from_bytes, symbolize_names: true) }
|
8
|
+
let(:payload) { payload_hash(notification) }
|
10
9
|
|
11
10
|
include_examples 'a notification'
|
12
11
|
|
13
|
-
it '
|
14
|
-
expect(
|
12
|
+
it 'requires a payload' do
|
13
|
+
expect(payload[:aps]).to_not be_empty
|
15
14
|
end
|
16
15
|
|
17
|
-
it '
|
18
|
-
expect(
|
16
|
+
it 'encodes content-available as part of the payload' do
|
17
|
+
expect(payload[:aps][:'content-available']).to eq(1)
|
19
18
|
end
|
20
|
-
|
21
19
|
end
|
22
20
|
end
|
@@ -6,44 +6,43 @@ require 'grocer/shared_examples_for_notifications'
|
|
6
6
|
describe Grocer::Notification do
|
7
7
|
describe 'binary format' do
|
8
8
|
let(:payload_options) { { alert: 'hi', badge: 2, sound: 'siren.aiff' } }
|
9
|
-
let(:
|
10
|
-
let(:payload_from_bytes) { notification.to_bytes[45..-1] }
|
9
|
+
let(:payload) { payload_hash(notification) }
|
11
10
|
|
12
11
|
include_examples 'a notification'
|
13
12
|
|
14
13
|
it 'encodes alert as part of the payload' do
|
15
14
|
notification.alert = 'Hello World!'
|
16
|
-
expect(
|
15
|
+
expect(payload[:aps][:alert]).to eq('Hello World!')
|
17
16
|
end
|
18
17
|
|
19
18
|
it 'encodes badge as part of the payload' do
|
20
19
|
notification.badge = 42
|
21
|
-
expect(
|
20
|
+
expect(payload[:aps][:badge]).to eq(42)
|
22
21
|
end
|
23
22
|
|
24
23
|
it 'encodes sound as part of the payload' do
|
25
24
|
notification.sound = 'siren.aiff'
|
26
|
-
expect(
|
25
|
+
expect(payload[:aps][:sound]).to eq('siren.aiff')
|
27
26
|
end
|
28
27
|
|
29
28
|
it 'encodes custom payload attributes' do
|
30
29
|
notification.custom = { :foo => 'bar' }
|
31
|
-
expect(
|
30
|
+
expect(payload[:foo]).to eq('bar')
|
32
31
|
end
|
33
32
|
|
34
33
|
it 'encodes UTF-8 characters' do
|
35
34
|
notification.alert = '私'
|
36
|
-
expect(
|
35
|
+
expect(payload[:aps][:alert].force_encoding("UTF-8")).to eq('私')
|
37
36
|
end
|
38
37
|
|
39
38
|
it 'encodes the payload length' do
|
40
39
|
notification.alert = 'Hello World!'
|
41
|
-
expect(bytes[43...45]).to eq([
|
40
|
+
expect(bytes[43...45]).to eq([payload_bytes(notification).bytesize].pack('n'))
|
42
41
|
end
|
43
42
|
|
44
43
|
it 'encodes the payload length correctly for multibyte UTF-8 strings' do
|
45
44
|
notification.alert = '私'
|
46
|
-
expect(bytes[43...45]).to eq([
|
45
|
+
expect(bytes[43...45]).to eq([payload_bytes(notification).bytesize].pack('n'))
|
47
46
|
end
|
48
47
|
|
49
48
|
context 'missing payload' do
|
@@ -5,13 +5,11 @@ require 'grocer/shared_examples_for_notifications'
|
|
5
5
|
describe Grocer::PassbookNotification do
|
6
6
|
describe 'binary format' do
|
7
7
|
let(:payload_options) { Hash.new }
|
8
|
-
let(:payload_dictionary_from_bytes) { JSON.parse(payload_from_bytes, symbolize_names: true) }
|
9
|
-
let(:payload_from_bytes) { notification.to_bytes[45..-1] }
|
10
8
|
|
11
9
|
include_examples 'a notification'
|
12
10
|
|
13
11
|
it 'does not require a payload' do
|
14
|
-
expect(
|
12
|
+
expect(payload_hash(notification)[:aps]).to be_empty
|
15
13
|
end
|
16
14
|
|
17
15
|
it 'encodes the payload length' do
|
data/spec/spec_helper.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
ENV['RACK_ENV'] = 'test'
|
2
2
|
require 'mocha/api'
|
3
3
|
require 'bourne'
|
4
|
+
require 'support/notification_helpers'
|
4
5
|
|
5
6
|
RSpec.configure do |config|
|
6
7
|
config.treat_symbols_as_metadata_keys_with_true_values = true
|
@@ -8,4 +9,6 @@ RSpec.configure do |config|
|
|
8
9
|
config.filter_run :focus
|
9
10
|
|
10
11
|
config.mock_with :mocha
|
12
|
+
|
13
|
+
config.include NotificationHelpers
|
11
14
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: grocer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2013-03-
|
14
|
+
date: 2013-03-15 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: rspec
|
@@ -122,6 +122,7 @@ files:
|
|
122
122
|
- lib/grocer/failed_delivery_attempt.rb
|
123
123
|
- lib/grocer/feedback.rb
|
124
124
|
- lib/grocer/feedback_connection.rb
|
125
|
+
- lib/grocer/mobile_device_management_notification.rb
|
125
126
|
- lib/grocer/newsstand_notification.rb
|
126
127
|
- lib/grocer/notification.rb
|
127
128
|
- lib/grocer/notification_reader.rb
|
@@ -143,6 +144,7 @@ files:
|
|
143
144
|
- spec/grocer/failed_delivery_attempt_spec.rb
|
144
145
|
- spec/grocer/feedback_connection_spec.rb
|
145
146
|
- spec/grocer/feedback_spec.rb
|
147
|
+
- spec/grocer/mobile_device_management_notification_spec.rb
|
146
148
|
- spec/grocer/newsstand_notification_spec.rb
|
147
149
|
- spec/grocer/notification_reader_spec.rb
|
148
150
|
- spec/grocer/notification_spec.rb
|
@@ -155,6 +157,7 @@ files:
|
|
155
157
|
- spec/grocer/ssl_server_spec.rb
|
156
158
|
- spec/grocer_spec.rb
|
157
159
|
- spec/spec_helper.rb
|
160
|
+
- spec/support/notification_helpers.rb
|
158
161
|
homepage: https://github.com/grocer/grocer
|
159
162
|
licenses:
|
160
163
|
- MIT
|
@@ -170,7 +173,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
170
173
|
version: '0'
|
171
174
|
segments:
|
172
175
|
- 0
|
173
|
-
hash:
|
176
|
+
hash: -4490716643818473019
|
174
177
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
175
178
|
none: false
|
176
179
|
requirements:
|
@@ -179,7 +182,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
179
182
|
version: '0'
|
180
183
|
segments:
|
181
184
|
- 0
|
182
|
-
hash:
|
185
|
+
hash: -4490716643818473019
|
183
186
|
requirements: []
|
184
187
|
rubyforge_project:
|
185
188
|
rubygems_version: 1.8.23
|
@@ -195,6 +198,7 @@ test_files:
|
|
195
198
|
- spec/grocer/failed_delivery_attempt_spec.rb
|
196
199
|
- spec/grocer/feedback_connection_spec.rb
|
197
200
|
- spec/grocer/feedback_spec.rb
|
201
|
+
- spec/grocer/mobile_device_management_notification_spec.rb
|
198
202
|
- spec/grocer/newsstand_notification_spec.rb
|
199
203
|
- spec/grocer/notification_reader_spec.rb
|
200
204
|
- spec/grocer/notification_spec.rb
|
@@ -207,3 +211,4 @@ test_files:
|
|
207
211
|
- spec/grocer/ssl_server_spec.rb
|
208
212
|
- spec/grocer_spec.rb
|
209
213
|
- spec/spec_helper.rb
|
214
|
+
- spec/support/notification_helpers.rb
|