push_kit-apns 1.0.0.pre.beta1 → 1.0.0.pre.beta2

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: 81a37cc16b4ed2fa5d99091530b2352cfce87b8329b7573c2a57cd66c8f951c6
4
- data.tar.gz: d7d6b80348f17dec42e2ba44cc1c2b8e9348a4cd5979b63e4194d0aa728f7d5a
3
+ metadata.gz: c4f29c8b7460101c8ec4600ce6022417c69d3376d1aee4549ba71a58ac162559
4
+ data.tar.gz: ead2f9a335f5f4fc1466c94dbf6d8baf3963159c9827308dc67eee3ba8f3a7ab
5
5
  SHA512:
6
- metadata.gz: c3bf44f4cd9d0935ed1ed3ea76f5ae5d7407ec9723946f8086e262a5184f8e92f62ba69268585c706c66bf21e5a3fab6529858e9af2c57f03139a859a0772747
7
- data.tar.gz: 39b9bf33159a6a53669515700f169d9865c8442aa8d05d625c34032bfc9b46b9c14571cc2fd3bd190992c5eade594dbd029fc9c7f638aa75c0429c5fd039a37e
6
+ metadata.gz: 4df1526f02a8b544cd79d222c8aaf2719423d81b001db0f58a828d2c71cc57a32d3c6e39045ad4d76a51e2acdde0723aef8b09921d3fc2c7f1df83eff2a9a543
7
+ data.tar.gz: 1e50eaefee64b92302f2328eec3c9d146af40212c864209134f4db19650cc8ec142de1bca32984b83eaf62d5e9e946a626b99938a1ed4331b76ae6d3e088f8aa
data/README.md CHANGED
@@ -38,6 +38,26 @@ This allows us to maintain a connection to the Apple Push Notification service a
38
38
 
39
39
  See [Communicating with APNs - Best Practices for Managing Connections](https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html#//apple_ref/doc/uid/TP40008194-CH11-SW8) for more info on this.
40
40
 
41
+ ---
42
+
43
+ PushKit also provides a couple of convenience helper methods to create and store clients for use anywhere the PushKit::APNS model is accessible.
44
+
45
+ For example, in a Rails app you could create an initializer and add the following:
46
+
47
+ ```ruby
48
+ PushKit::APNS.prepare(
49
+ :default,
50
+ key: PushKit::APNS.load_key('/path/to/APNsAuthKey_XXXXXXXXXX.p8'),
51
+ key_id: 'XXXXXXXXXX',
52
+ team_id: 'XXXXXXXXXX',
53
+ topic: 'com.example.app'
54
+ )
55
+ ```
56
+
57
+ Later, when you're ready to send a notification you can use ```PushKit::APNS.clients[:default]``` to retrieve the client instance.
58
+
59
+ You can specify any arbitrary value as the key instead of *:default* which allows you to create multiple instance if required.
60
+
41
61
  ### Additional Options
42
62
 
43
63
  There are a few additional options you can specify when creating a client.
@@ -77,11 +97,11 @@ notification.device_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
77
97
  Then using our `PushKit::APNS` instance we created earlier, deliver the notification:
78
98
 
79
99
  ```ruby
80
- apns.deliver(notification)
100
+ client.deliver(notification) do |notification, success, response|
101
+ # ...
102
+ end
81
103
  ```
82
104
 
83
- EXPLAIN_ASYNC_NEEDS_WAIT
84
-
85
105
  ---
86
106
 
87
107
  The `PushKit::APNS::Notification` instance has a *:device_token* attribute which needs to be set to the token of the device you're sending the notification to.
@@ -106,7 +126,7 @@ notifications = notification.for_tokens(*tokens)
106
126
  When you're ready, you can just deliver the array of notifications:
107
127
 
108
128
  ```ruby
109
- client.deliver(notifications) do |notification, result|
129
+ client.deliver(*notifications) do |notification, success, response|
110
130
  # ...
111
131
  end
112
132
  ```
@@ -33,14 +33,15 @@ module PushKit
33
33
 
34
34
  # Create a new PushClient instance.
35
35
  #
36
- # @param options [Hash] The APNS options:
37
- # host [String|Symbol] The host (can also be :production or :development).
38
- # port [Integer|Symbol] The port number (can also be :default or :alternative).
39
- # topic [String] The APNS topic (matches the app's bundle identifier).
40
- # key [OpenSSL::PKey::EC] The elliptic curve key to use for authentication.
41
- # key_id [String] The identifier for the elliptic curve key.
42
- # team_id [String] The identifier for the Apple Developer team.
43
- # topic [String] The topic for your application (usually the bundle identifier).
36
+ # @param options [Hash]
37
+ # host [String|Symbol] The host (can also be :production or :development).
38
+ # port [Integer|Symbol] The port number (can also be :default or :alternative).
39
+ # topic [String] The APNS topic (matches the app's bundle identifier).
40
+ # key [OpenSSL::PKey::EC] The elliptic curve key to use for authentication.
41
+ # key_id [String] The identifier for the elliptic curve key.
42
+ # team_id [String] The identifier for the Apple Developer team.
43
+ # topic [String] The topic for your application (usually the bundle identifier).
44
+ # @return [PushKit::APNS::PushClient] A client.
44
45
  #
45
46
  def self.client(options = {})
46
47
  options = {
@@ -61,5 +62,24 @@ module PushKit
61
62
  token_generator: token_generator
62
63
  )
63
64
  end
65
+
66
+ # @return [Hash] A collection of `PushKit::APNS::PushClient` instances.
67
+ #
68
+ def self.clients
69
+ @clients ||= {}
70
+ end
71
+
72
+ # Prepare a client.
73
+ #
74
+ # This method creates a `PushKit::APNS::PushClient` instance using the #client method, then stores it in the
75
+ # #clients Hash using an identifier you specify.
76
+ # Storing the clients in this way provides on-demand access without requiring the use of global variables.
77
+ #
78
+ # @param identifier [Symbol] The key to use within the #clients Hash.
79
+ # @param options [Hash] The options to pass to the #client method.
80
+ #
81
+ def self.prepare(identifier, options = {})
82
+ clients[identifier] = client(options)
83
+ end
64
84
  end
65
85
  end
@@ -4,6 +4,6 @@ module PushKit
4
4
  module APNS
5
5
  # @return [String] The gem's semantic version number.
6
6
  #
7
- VERSION = '1.0.0-beta1'
7
+ VERSION = '1.0.0-beta2'
8
8
  end
9
9
  end
@@ -3,7 +3,7 @@
3
3
  require 'push_kit/apns/notification/localization'
4
4
 
5
5
  RSpec.describe PushKit::APNS::Notification::Localization, :unit do
6
- def localization(params = {})
6
+ def build(params = {})
7
7
  default_params = {
8
8
  key: 'HELLO_WORLD',
9
9
  arguments: nil
@@ -12,16 +12,16 @@ RSpec.describe PushKit::APNS::Notification::Localization, :unit do
12
12
  described_class.new(**default_params.merge(params))
13
13
  end
14
14
 
15
- subject { localization }
15
+ subject(:localization) { build }
16
16
 
17
17
  it { is_expected.to have_accessor(:key) }
18
18
  it { is_expected.to have_accessor(:arguments) }
19
19
 
20
20
  describe '#initialize' do
21
21
  let(:key) { 'A_KEY' }
22
- let(:arguments) { ['An Argument'] }
22
+ let(:arguments) { ['An argument'] }
23
23
 
24
- subject { localization(key: key, arguments: arguments) }
24
+ subject { build(key: key, arguments: arguments) }
25
25
 
26
26
  it 'sets #key' do
27
27
  expect(subject.key).to eq(key)
@@ -34,56 +34,67 @@ RSpec.describe PushKit::APNS::Notification::Localization, :unit do
34
34
 
35
35
  describe '#payload' do
36
36
  context 'when localizing a supported attribute' do
37
- let(:payload) { subject.payload(:title) }
37
+ subject { localization.payload(:title) }
38
38
 
39
- it 'includes #key as the prefixed loc-key attribute' do
40
- subject.key = 'TITLE_KEY'
41
- expect(payload).to include('title-loc-key' => 'TITLE_KEY')
39
+ context 'when #key is set' do
40
+ before { localization.key = 'TITLE_KEY' }
41
+
42
+ it 'includes the correct loc-key attribute and value' do
43
+ expect(subject).to include('title-loc-key' => 'TITLE_KEY')
44
+ end
42
45
  end
43
46
 
44
- it 'includes #arguments as the prefixed loc-args attribute' do
45
- subject.arguments = ['An Argument']
46
- expect(payload).to include('title-loc-args' => ['An Argument'])
47
+ context 'when #arguments is set' do
48
+ before { localization.arguments = ['An argument'] }
49
+
50
+ it 'includes the correct loc-args attribute and value' do
51
+ expect(subject).to include('title-loc-args' => ['An argument'])
52
+ end
47
53
  end
48
54
 
49
- context 'without #arguments' do
50
- before { subject.arguments = nil }
55
+ context 'when #arguments is nil' do
56
+ before { localization.arguments = nil }
51
57
 
52
- it 'excludes the prefixed loc-args attribute' do
53
- expect(payload).not_to have_key('title-loc-args')
58
+ it 'excludes the correct loc-args attribute' do
59
+ expect(subject).not_to have_key('title-loc-args')
54
60
  end
55
61
  end
56
62
  end
57
63
 
58
64
  context 'when localizing an unsupported attribute' do
59
- let(:attribute) { :some_unknown_attribute }
60
- let(:payload) { subject.payload(attribute) }
65
+ subject { localization.payload(:some_unknown_attribute) }
61
66
 
62
67
  it 'returns nil' do
63
- expect(payload).to be_nil
68
+ expect(subject).to be nil
64
69
  end
65
70
  end
66
71
  end
67
72
 
68
73
  describe '#prefix' do
69
- def prefix(*args)
70
- subject.instance_eval { prefix(*args) }
71
- end
74
+ def self.it_returns(prefix, with: nil)
75
+ context "with :#{with}" do
76
+ subject { prefix(with) }
72
77
 
73
- it "returns 'title-' for :title" do
74
- expect(prefix(:title)).to eq('title-')
78
+ it "returns '#{prefix}'" do
79
+ expect(subject).to eq(prefix)
80
+ end
81
+ end
75
82
  end
76
83
 
77
- it "returns 'subtitle-' for :subtitle" do
78
- expect(prefix(:subtitle)).to eq('subtitle-')
84
+ def prefix(*args)
85
+ localization.instance_eval { prefix(*args) }
79
86
  end
80
87
 
81
- it "returns '' for :body" do
82
- expect(prefix(:body)).to eq('')
83
- end
88
+ it_returns 'title-', with: :title
89
+ it_returns 'subtitle-', with: :subtitle
90
+ it_returns '', with: :body
84
91
 
85
- it 'returns nil for an unknown attribute' do
86
- expect(prefix(:some_unknown_attribute)).to be_nil
92
+ context 'with an unknown attribute' do
93
+ subject { prefix(:some_unknown_attribute) }
94
+
95
+ it 'returns nil' do
96
+ expect(subject).to be nil
97
+ end
87
98
  end
88
99
  end
89
100
  end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'push_kit/apns'
4
+
5
+ RSpec.describe PushKit::APNS do
6
+ subject { described_class }
7
+
8
+ describe '.load_key' do
9
+ context 'when the file does not exist' do
10
+ let(:path) { '/path/to/key' }
11
+
12
+ before do
13
+ expect(File).to receive(:file?).with(path).and_return(false)
14
+ end
15
+
16
+ it 'raises an ArgumentError' do
17
+ expect { subject.load_key(path) }.to raise_exception(ArgumentError)
18
+ end
19
+ end
20
+ end
21
+
22
+ describe '.clients' do
23
+ it 'returns a Hash' do
24
+ expect(subject.clients).to be_a(Hash)
25
+ end
26
+ end
27
+
28
+ describe '.prepare' do
29
+ it 'stores the client in #clients' do
30
+ expect(subject).to receive(:client).and_return(:a_client_object)
31
+ subject.prepare(:default)
32
+ expect(subject.clients).to include(default: :a_client_object)
33
+ end
34
+ end
35
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: push_kit-apns
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.pre.beta1
4
+ version: 1.0.0.pre.beta2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nialto Services
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-21 00:00:00.000000000 Z
11
+ date: 2019-08-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -155,6 +155,7 @@ files:
155
155
  - spec/push_kit/apns/constants_spec.rb
156
156
  - spec/push_kit/apns/notification/localization_spec.rb
157
157
  - spec/push_kit/apns/notification_spec.rb
158
+ - spec/push_kit/apns_spec.rb
158
159
  - spec/spec_helper.rb
159
160
  - spec/support/have_accessor.rb
160
161
  homepage: https://github.com/nialtoservices/push_kit-apns
@@ -185,5 +186,6 @@ test_files:
185
186
  - spec/push_kit/apns/constants_spec.rb
186
187
  - spec/push_kit/apns/notification/localization_spec.rb
187
188
  - spec/push_kit/apns/notification_spec.rb
189
+ - spec/push_kit/apns_spec.rb
188
190
  - spec/spec_helper.rb
189
191
  - spec/support/have_accessor.rb