rpush 7.0.1 → 8.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.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +28 -4
  3. data/README.md +38 -1
  4. data/lib/generators/rpush_migration_generator.rb +1 -0
  5. data/lib/generators/templates/rpush.rb +17 -0
  6. data/lib/generators/templates/rpush_7_1_0_updates.rb +12 -0
  7. data/lib/rpush/client/active_model/apns/notification.rb +0 -4
  8. data/lib/rpush/client/active_model/fcm/app.rb +20 -0
  9. data/lib/rpush/client/active_model/fcm/expiry_collapse_key_mutual_inclusion_validator.rb +14 -0
  10. data/lib/rpush/client/active_model/fcm/notification.rb +129 -0
  11. data/lib/rpush/client/active_model/fcm/notification_keys_in_allowed_list_validator.rb +20 -0
  12. data/lib/rpush/client/active_model.rb +5 -0
  13. data/lib/rpush/client/active_record/fcm/app.rb +11 -0
  14. data/lib/rpush/client/active_record/fcm/notification.rb +11 -0
  15. data/lib/rpush/client/active_record.rb +3 -0
  16. data/lib/rpush/client/redis/app.rb +2 -0
  17. data/lib/rpush/client/redis/fcm/app.rb +11 -0
  18. data/lib/rpush/client/redis/fcm/notification.rb +11 -0
  19. data/lib/rpush/client/redis.rb +3 -0
  20. data/lib/rpush/configuration.rb +1 -1
  21. data/lib/rpush/daemon/apns2/delivery.rb +0 -1
  22. data/lib/rpush/daemon/apnsp8/delivery.rb +0 -1
  23. data/lib/rpush/daemon/fcm/delivery.rb +162 -0
  24. data/lib/rpush/daemon/fcm.rb +9 -0
  25. data/lib/rpush/daemon/gcm/delivery.rb +1 -1
  26. data/lib/rpush/daemon/google_credential_cache.rb +41 -0
  27. data/lib/rpush/daemon/store/active_record.rb +15 -0
  28. data/lib/rpush/daemon/store/interface.rb +2 -2
  29. data/lib/rpush/daemon/store/redis.rb +13 -0
  30. data/lib/rpush/daemon/webpush/delivery.rb +2 -2
  31. data/lib/rpush/daemon.rb +4 -0
  32. data/lib/rpush/reflection_collection.rb +3 -2
  33. data/lib/rpush/version.rb +2 -2
  34. data/lib/rpush.rb +1 -0
  35. data/spec/functional/apns2_spec.rb +2 -6
  36. data/spec/functional/fcm_priority_spec.rb +46 -0
  37. data/spec/functional/fcm_spec.rb +77 -0
  38. data/spec/functional_spec_helper.rb +1 -1
  39. data/spec/spec_helper.rb +2 -1
  40. data/spec/support/active_record_setup.rb +3 -1
  41. data/spec/unit/client/active_record/fcm/app_spec.rb +6 -0
  42. data/spec/unit/client/active_record/fcm/notification_spec.rb +10 -0
  43. data/spec/unit/client/redis/fcm/app_spec.rb +5 -0
  44. data/spec/unit/client/redis/fcm/notification_spec.rb +5 -0
  45. data/spec/unit/client/shared/apns/notification.rb +0 -15
  46. data/spec/unit/client/shared/fcm/app.rb +4 -0
  47. data/spec/unit/client/shared/fcm/notification.rb +92 -0
  48. data/spec/unit/configuration_spec.rb +1 -1
  49. data/spec/unit/daemon/apnsp8/delivery_spec.rb +1 -1
  50. data/spec/unit/daemon/fcm/delivery_spec.rb +127 -0
  51. data/spec/unit/daemon/service_config_methods_spec.rb +1 -1
  52. data/spec/unit/daemon/tcp_connection_spec.rb +8 -7
  53. data/spec/unit/daemon/wns/delivery_spec.rb +1 -1
  54. data/spec/unit/logger_spec.rb +1 -1
  55. data/spec/unit_spec_helper.rb +1 -1
  56. metadata +81 -17
@@ -0,0 +1,127 @@
1
+ require 'unit_spec_helper'
2
+
3
+ describe Rpush::Daemon::Fcm::Delivery do
4
+ let(:app) { Rpush::Fcm::App.create!(name: 'MyApp', firebase_project_id: 'abc123', json_key:'{}') }
5
+ let(:notification) { Rpush::Fcm::Notification.create!(app: app, device_token: 'xyz', deliver_after: Time.now) }
6
+ let(:logger) { double(error: nil, info: nil, warn: nil) }
7
+ let(:response) { double(code: 200, header: {}) }
8
+ let(:http) { double(shutdown: nil, request: response) }
9
+ let(:now) { Time.parse('2012-10-14 00:00:00') }
10
+ let(:batch) { double(mark_failed: nil, mark_delivered: nil, mark_retryable: nil, notification_processed: nil) }
11
+ let(:delivery) { Rpush::Daemon::Fcm::Delivery.new(app, http, notification, batch) }
12
+ let(:store) { double(create_fcm_notification: double(id: 2)) }
13
+
14
+ def perform
15
+ delivery.perform
16
+ end
17
+
18
+ def perform_with_rescue
19
+ expect { perform }.to raise_error(StandardError)
20
+ end
21
+
22
+ before do
23
+ allow(delivery).to receive_messages(reflect: nil)
24
+ allow(Rpush::Daemon).to receive_messages(store: store)
25
+ allow(Time).to receive_messages(now: now)
26
+ allow(Rpush).to receive_messages(logger: logger)
27
+ allow_any_instance_of(Rpush::Daemon::Fcm::Delivery).to receive_messages(obtain_access_token: "access_token")
28
+ end
29
+
30
+ describe 'a 200 response' do
31
+ before do
32
+ allow(response).to receive_messages(code: 200)
33
+ allow(response).to receive_messages(body: nil)
34
+ allow(notification).to receive_messages(device_token: '1')
35
+ end
36
+
37
+ it 'reflects on ID which successfully received the notification' do
38
+ expect(delivery).to receive(:reflect).with(:fcm_delivered_to_recipient, notification)
39
+ perform
40
+ end
41
+
42
+ it 'marks the notification as delivered' do
43
+ expect(delivery).to receive(:mark_delivered)
44
+ perform
45
+ end
46
+
47
+ it 'logs that the notification was delivered' do
48
+ expect(logger).to receive(:info).with("[MyApp] #{notification.id} sent to 1")
49
+ perform
50
+ end
51
+ end
52
+
53
+ describe 'all deliveries failed with Unavailable or InternalServerError 503' do
54
+ before do
55
+ allow(notification).to receive_messages(device_token: '1')
56
+ allow(response).to receive_messages(code: 503, body: nil)
57
+ end
58
+
59
+ it 'reflects on any IDs which failed to receive the notification' do
60
+ pending("Determine the correct cases where FCM should send fcm_failed_to_recipient")
61
+ expect(delivery).to receive(:reflect).with(:fcm_failed_to_recipient, notification)
62
+ perform
63
+ end
64
+
65
+ it 'retries the notification respecting the Retry-After header' do
66
+ allow(response).to receive_messages(header: { 'retry-after' => 10 })
67
+ expect(delivery).to receive(:mark_retryable).with(notification, now + 10.seconds)
68
+ perform
69
+ end
70
+
71
+ it 'retries the notification using exponential back-off if the Retry-After header is not present' do
72
+ expect(delivery).to receive(:mark_retryable).with(notification, now + 2)
73
+ perform
74
+ end
75
+
76
+ it 'does not mark the notification as failed' do
77
+ expect(delivery).not_to receive(:mark_failed)
78
+ perform
79
+ end
80
+
81
+ it 'logs that the notification will be retried' do
82
+ notification.retries = 1
83
+ notification.deliver_after = now + 2
84
+ expect(Rpush.logger).to receive(:warn).with("[MyApp] FCM responded with an Service Unavailable Error. Notification #{notification.id} will be retried after 2012-10-14 00:00:02 (retry 1).")
85
+ perform
86
+ end
87
+ end
88
+
89
+ describe 'all deliveries failed with Unavailable or InternalServerError 500' do
90
+ before do
91
+ allow(notification).to receive_messages(device_token: '1')
92
+ allow(response).to receive_messages(code: 500, body: nil)
93
+ end
94
+
95
+ it 'logs a warning that the notification has been re-queued.' do
96
+ notification.retries = 3
97
+ notification.deliver_after = now + 2**3
98
+ expect(Rpush.logger).to receive(:warn).with("[MyApp] FCM responded with an Internal Error. Notification #{notification.id} will be retried after #{(now + 2**3).strftime('%Y-%m-%d %H:%M:%S')} (retry 3).")
99
+ perform
100
+ end
101
+
102
+ it 'retries the notification in accordance with the exponential back-off strategy.' do
103
+ notification.update_attribute(:retries, 2)
104
+ expect(delivery).to receive(:mark_retryable).with(notification, now + 2**3)
105
+ perform
106
+ end
107
+ end
108
+
109
+ describe 'all deliveries failed with invalid token' do
110
+ before do
111
+ allow(notification).to receive_messages(device_token: '1')
112
+ allow(response).to receive_messages(code: 404, body: { error: { status: 'NOT_FOUND', message: 'Requested entity was not found.' } }.to_json)
113
+ end
114
+
115
+ it 'reflects on invalid IDs' do
116
+ expect(delivery).to receive(:reflect).with(:fcm_invalid_device_token, app, "NOT_FOUND: Requested entity was not found.", '1')
117
+ perform_with_rescue
118
+ end
119
+
120
+ it 'marks a notification as failed if any ids are invalid' do
121
+ expect(delivery).to receive(:mark_failed)
122
+ expect(delivery).not_to receive(:mark_retryable)
123
+ expect(store).not_to receive(:create_fcm_notification)
124
+ perform_with_rescue
125
+ end
126
+ end
127
+ end
@@ -23,7 +23,7 @@ describe Rpush::Daemon::ServiceConfigMethods do
23
23
  ServiceConfigMethodsSpec.dispatcher :http, an: :option
24
24
  app = double
25
25
  dispatcher = double
26
- expect(Rpush::Daemon::Dispatcher::Http).to receive(:new).with(app, ServiceConfigMethodsSpec::Delivery, an: :option).and_return(dispatcher)
26
+ expect(Rpush::Daemon::Dispatcher::Http).to receive(:new).with(app, ServiceConfigMethodsSpec::Delivery, {an: :option}).and_return(dispatcher)
27
27
  expect(ServiceConfigMethodsSpec.new_dispatcher(app)).to eq dispatcher
28
28
  end
29
29
 
@@ -15,6 +15,7 @@ describe Rpush::Daemon::TcpConnection do
15
15
  let(:connection) { Rpush::Daemon::TcpConnection.new(app, host, port) }
16
16
 
17
17
  before do
18
+ allow(x509_certificate).to receive(:not_after).and_return(Time.now + 1.year)
18
19
  allow(OpenSSL::SSL::SSLContext).to receive_messages(new: ssl_context)
19
20
  allow(OpenSSL::PKey::RSA).to receive_messages(new: rsa_key)
20
21
  allow(OpenSSL::X509::Certificate).to receive_messages(new: x509_certificate)
@@ -83,31 +84,31 @@ describe Rpush::Daemon::TcpConnection do
83
84
 
84
85
  describe 'certificate expiry' do
85
86
  it 'reflects if the certificate will expire soon' do
86
- cert = OpenSSL::X509::Certificate.new(app.certificate)
87
+ cert = x509_certificate
87
88
  expect(connection).to receive(:reflect).with(:ssl_certificate_will_expire, app, cert.not_after)
88
89
  Timecop.freeze(cert.not_after - 3.days) { connection.connect }
89
90
  end
90
91
 
91
92
  it 'logs that the certificate will expire soon' do
92
- cert = OpenSSL::X509::Certificate.new(app.certificate)
93
- expect(logger).to receive(:warn).with("[#{app.name}] Certificate will expire at 2022-09-07 03:18:32 UTC.")
93
+ cert = x509_certificate
94
+ expect(logger).to receive(:warn).with("[#{app.name}] Certificate will expire at #{cert.not_after.utc}.")
94
95
  Timecop.freeze(cert.not_after - 3.days) { connection.connect }
95
96
  end
96
97
 
97
98
  it 'does not reflect if the certificate will not expire soon' do
98
- cert = OpenSSL::X509::Certificate.new(app.certificate)
99
+ cert = x509_certificate
99
100
  expect(connection).not_to receive(:reflect).with(:ssl_certificate_will_expire, app, kind_of(Time))
100
101
  Timecop.freeze(cert.not_after - 2.months) { connection.connect }
101
102
  end
102
103
 
103
104
  it 'logs that the certificate has expired' do
104
- cert = OpenSSL::X509::Certificate.new(app.certificate)
105
- expect(logger).to receive(:error).with("[#{app.name}] Certificate expired at 2022-09-07 03:18:32 UTC.")
105
+ cert = x509_certificate
106
+ expect(logger).to receive(:error).with("[#{app.name}] Certificate expired at #{cert.not_after.utc}.")
106
107
  Timecop.freeze(cert.not_after + 1.day) { connection.connect rescue Rpush::CertificateExpiredError }
107
108
  end
108
109
 
109
110
  it 'raises an error if the certificate has expired' do
110
- cert = OpenSSL::X509::Certificate.new(app.certificate)
111
+ cert = x509_certificate
111
112
  Timecop.freeze(cert.not_after + 1.day) do
112
113
  expect { connection.connect }.to raise_error(Rpush::CertificateExpiredError)
113
114
  end
@@ -50,7 +50,7 @@ describe Rpush::Daemon::Wns::Delivery do
50
50
  end
51
51
 
52
52
  it 'set the access token for the app' do
53
- expect(delivery).to receive(:update_access_token).with("access_token" => "dummy_access_token", "expires_in" => 60)
53
+ expect(delivery).to receive(:update_access_token).with({"access_token" => "dummy_access_token", "expires_in" => 60})
54
54
  expect(store).to receive(:update_app).with app
55
55
  perform
56
56
  end
@@ -92,7 +92,7 @@ describe Rpush::Logger do
92
92
  now = Time.now
93
93
  allow(Time).to receive(:now).and_return(now)
94
94
  logger = Rpush::Logger.new
95
- expect(@logger).to receive(:info).with(/#{Regexp.escape("[#{now.to_s(:db)}]")}/)
95
+ expect(@logger).to receive(:info).with(/#{Regexp.escape("[#{now.to_formatted_s(:db)}]")}/)
96
96
  logger.info("blah")
97
97
  end
98
98
 
@@ -12,7 +12,7 @@ RSpec.configure do |config|
12
12
  config.before(:each) do
13
13
  Modis.with_connection do |redis|
14
14
  redis.keys('rpush:*').each { |key| redis.del(key) }
15
- end if redis?
15
+ end if redis? && unit_example?(self.class.metadata)
16
16
 
17
17
  if active_record? && unit_example?(self.class.metadata)
18
18
  connection = ActiveRecord::Base.connection
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rpush
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.0.1
4
+ version: 8.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ian Leitch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-02 00:00:00.000000000 Z
11
+ date: 2024-09-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: multi_json
@@ -79,6 +79,9 @@ dependencies:
79
79
  - - ">="
80
80
  - !ruby/object:Gem::Version
81
81
  version: '5.2'
82
+ - - "<"
83
+ - !ruby/object:Gem::Version
84
+ version: 7.1.0
82
85
  type: :runtime
83
86
  prerelease: false
84
87
  version_requirements: !ruby/object:Gem::Requirement
@@ -86,6 +89,9 @@ dependencies:
86
89
  - - ">="
87
90
  - !ruby/object:Gem::Version
88
91
  version: '5.2'
92
+ - - "<"
93
+ - !ruby/object:Gem::Version
94
+ version: 7.1.0
89
95
  - !ruby/object:Gem::Dependency
90
96
  name: thor
91
97
  requirement: !ruby/object:Gem::Requirement
@@ -135,19 +141,47 @@ dependencies:
135
141
  - !ruby/object:Gem::Version
136
142
  version: '0'
137
143
  - !ruby/object:Gem::Dependency
138
- name: webpush
144
+ name: web-push
139
145
  requirement: !ruby/object:Gem::Requirement
140
146
  requirements:
141
- - - "~>"
147
+ - - ">="
142
148
  - !ruby/object:Gem::Version
143
- version: '1.0'
149
+ version: '0'
144
150
  type: :runtime
145
151
  prerelease: false
146
152
  version_requirements: !ruby/object:Gem::Requirement
147
153
  requirements:
148
- - - "~>"
154
+ - - ">="
149
155
  - !ruby/object:Gem::Version
150
- version: '1.0'
156
+ version: '0'
157
+ - !ruby/object:Gem::Dependency
158
+ name: googleauth
159
+ requirement: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - ">="
162
+ - !ruby/object:Gem::Version
163
+ version: '0'
164
+ type: :runtime
165
+ prerelease: false
166
+ version_requirements: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - ">="
169
+ - !ruby/object:Gem::Version
170
+ version: '0'
171
+ - !ruby/object:Gem::Dependency
172
+ name: debug
173
+ requirement: !ruby/object:Gem::Requirement
174
+ requirements:
175
+ - - ">="
176
+ - !ruby/object:Gem::Version
177
+ version: '0'
178
+ type: :development
179
+ prerelease: false
180
+ version_requirements: !ruby/object:Gem::Requirement
181
+ requirements:
182
+ - - ">="
183
+ - !ruby/object:Gem::Version
184
+ version: '0'
151
185
  - !ruby/object:Gem::Dependency
152
186
  name: rake
153
187
  requirement: !ruby/object:Gem::Requirement
@@ -166,16 +200,16 @@ dependencies:
166
200
  name: rspec
167
201
  requirement: !ruby/object:Gem::Requirement
168
202
  requirements:
169
- - - "~>"
203
+ - - ">="
170
204
  - !ruby/object:Gem::Version
171
- version: 3.4.0
205
+ version: '0'
172
206
  type: :development
173
207
  prerelease: false
174
208
  version_requirements: !ruby/object:Gem::Requirement
175
209
  requirements:
176
- - - "~>"
210
+ - - ">="
177
211
  - !ruby/object:Gem::Version
178
- version: 3.4.0
212
+ version: '0'
179
213
  - !ruby/object:Gem::Dependency
180
214
  name: database_cleaner
181
215
  requirement: !ruby/object:Gem::Requirement
@@ -264,16 +298,16 @@ dependencies:
264
298
  name: codeclimate-test-reporter
265
299
  requirement: !ruby/object:Gem::Requirement
266
300
  requirements:
267
- - - ">="
301
+ - - '='
268
302
  - !ruby/object:Gem::Version
269
- version: '0'
303
+ version: 1.0.7
270
304
  type: :development
271
305
  prerelease: false
272
306
  version_requirements: !ruby/object:Gem::Requirement
273
307
  requirements:
274
- - - ">="
308
+ - - '='
275
309
  - !ruby/object:Gem::Version
276
- version: '0'
310
+ version: 1.0.7
277
311
  - !ruby/object:Gem::Dependency
278
312
  name: simplecov
279
313
  requirement: !ruby/object:Gem::Requirement
@@ -413,6 +447,7 @@ files:
413
447
  - lib/generators/templates/rpush_4_1_0_updates.rb
414
448
  - lib/generators/templates/rpush_4_1_1_updates.rb
415
449
  - lib/generators/templates/rpush_4_2_0_updates.rb
450
+ - lib/generators/templates/rpush_7_1_0_updates.rb
416
451
  - lib/rpush.rb
417
452
  - lib/rpush/apns_feedback.rb
418
453
  - lib/rpush/cli.rb
@@ -429,6 +464,10 @@ files:
429
464
  - lib/rpush/client/active_model/apnsp8/app.rb
430
465
  - lib/rpush/client/active_model/apnsp8/notification.rb
431
466
  - lib/rpush/client/active_model/certificate_private_key_validator.rb
467
+ - lib/rpush/client/active_model/fcm/app.rb
468
+ - lib/rpush/client/active_model/fcm/expiry_collapse_key_mutual_inclusion_validator.rb
469
+ - lib/rpush/client/active_model/fcm/notification.rb
470
+ - lib/rpush/client/active_model/fcm/notification_keys_in_allowed_list_validator.rb
432
471
  - lib/rpush/client/active_model/gcm/app.rb
433
472
  - lib/rpush/client/active_model/gcm/expiry_collapse_key_mutual_inclusion_validator.rb
434
473
  - lib/rpush/client/active_model/gcm/notification.rb
@@ -456,6 +495,8 @@ files:
456
495
  - lib/rpush/client/active_record/apnsp8/app.rb
457
496
  - lib/rpush/client/active_record/apnsp8/notification.rb
458
497
  - lib/rpush/client/active_record/app.rb
498
+ - lib/rpush/client/active_record/fcm/app.rb
499
+ - lib/rpush/client/active_record/fcm/notification.rb
459
500
  - lib/rpush/client/active_record/gcm/app.rb
460
501
  - lib/rpush/client/active_record/gcm/notification.rb
461
502
  - lib/rpush/client/active_record/notification.rb
@@ -480,6 +521,8 @@ files:
480
521
  - lib/rpush/client/redis/apnsp8/app.rb
481
522
  - lib/rpush/client/redis/apnsp8/notification.rb
482
523
  - lib/rpush/client/redis/app.rb
524
+ - lib/rpush/client/redis/fcm/app.rb
525
+ - lib/rpush/client/redis/fcm/notification.rb
483
526
  - lib/rpush/client/redis/gcm/app.rb
484
527
  - lib/rpush/client/redis/gcm/notification.rb
485
528
  - lib/rpush/client/redis/notification.rb
@@ -517,9 +560,12 @@ files:
517
560
  - lib/rpush/daemon/dispatcher/tcp.rb
518
561
  - lib/rpush/daemon/dispatcher_loop.rb
519
562
  - lib/rpush/daemon/errors.rb
563
+ - lib/rpush/daemon/fcm.rb
564
+ - lib/rpush/daemon/fcm/delivery.rb
520
565
  - lib/rpush/daemon/feeder.rb
521
566
  - lib/rpush/daemon/gcm.rb
522
567
  - lib/rpush/daemon/gcm/delivery.rb
568
+ - lib/rpush/daemon/google_credential_cache.rb
523
569
  - lib/rpush/daemon/interruptible_sleep.rb
524
570
  - lib/rpush/daemon/loggable.rb
525
571
  - lib/rpush/daemon/proc_title.rb
@@ -569,6 +615,8 @@ files:
569
615
  - spec/functional/apns_spec.rb
570
616
  - spec/functional/cli_spec.rb
571
617
  - spec/functional/embed_spec.rb
618
+ - spec/functional/fcm_priority_spec.rb
619
+ - spec/functional/fcm_spec.rb
572
620
  - spec/functional/gcm_priority_spec.rb
573
621
  - spec/functional/gcm_spec.rb
574
622
  - spec/functional/new_app_spec.rb
@@ -596,6 +644,8 @@ files:
596
644
  - spec/unit/client/active_record/apns2/notification_spec.rb
597
645
  - spec/unit/client/active_record/apnsp8/notification_spec.rb
598
646
  - spec/unit/client/active_record/app_spec.rb
647
+ - spec/unit/client/active_record/fcm/app_spec.rb
648
+ - spec/unit/client/active_record/fcm/notification_spec.rb
599
649
  - spec/unit/client/active_record/gcm/app_spec.rb
600
650
  - spec/unit/client/active_record/gcm/notification_spec.rb
601
651
  - spec/unit/client/active_record/notification_spec.rb
@@ -618,6 +668,8 @@ files:
618
668
  - spec/unit/client/redis/apns2/notification_spec.rb
619
669
  - spec/unit/client/redis/apnsp8/notification_spec.rb
620
670
  - spec/unit/client/redis/app_spec.rb
671
+ - spec/unit/client/redis/fcm/app_spec.rb
672
+ - spec/unit/client/redis/fcm/notification_spec.rb
621
673
  - spec/unit/client/redis/gcm/app_spec.rb
622
674
  - spec/unit/client/redis/gcm/notification_spec.rb
623
675
  - spec/unit/client/redis/notification_spec.rb
@@ -635,6 +687,8 @@ files:
635
687
  - spec/unit/client/shared/apns/feedback.rb
636
688
  - spec/unit/client/shared/apns/notification.rb
637
689
  - spec/unit/client/shared/app.rb
690
+ - spec/unit/client/shared/fcm/app.rb
691
+ - spec/unit/client/shared/fcm/notification.rb
638
692
  - spec/unit/client/shared/gcm/app.rb
639
693
  - spec/unit/client/shared/gcm/notification.rb
640
694
  - spec/unit/client/shared/notification.rb
@@ -659,6 +713,7 @@ files:
659
713
  - spec/unit/daemon/dispatcher/http_spec.rb
660
714
  - spec/unit/daemon/dispatcher/tcp_spec.rb
661
715
  - spec/unit/daemon/dispatcher_loop_spec.rb
716
+ - spec/unit/daemon/fcm/delivery_spec.rb
662
717
  - spec/unit/daemon/feeder_spec.rb
663
718
  - spec/unit/daemon/gcm/delivery_spec.rb
664
719
  - spec/unit/daemon/proc_title_spec.rb
@@ -706,14 +761,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
706
761
  requirements:
707
762
  - - ">="
708
763
  - !ruby/object:Gem::Version
709
- version: 2.4.0
764
+ version: 2.7.0
710
765
  required_rubygems_version: !ruby/object:Gem::Requirement
711
766
  requirements:
712
767
  - - ">="
713
768
  - !ruby/object:Gem::Version
714
769
  version: '0'
715
770
  requirements: []
716
- rubygems_version: 3.3.5
771
+ rubygems_version: 3.3.3
717
772
  signing_key:
718
773
  specification_version: 4
719
774
  summary: The push notification service for Ruby.
@@ -724,6 +779,8 @@ test_files:
724
779
  - spec/functional/apns_spec.rb
725
780
  - spec/functional/cli_spec.rb
726
781
  - spec/functional/embed_spec.rb
782
+ - spec/functional/fcm_priority_spec.rb
783
+ - spec/functional/fcm_spec.rb
727
784
  - spec/functional/gcm_priority_spec.rb
728
785
  - spec/functional/gcm_spec.rb
729
786
  - spec/functional/new_app_spec.rb
@@ -751,6 +808,8 @@ test_files:
751
808
  - spec/unit/client/active_record/apns2/notification_spec.rb
752
809
  - spec/unit/client/active_record/apnsp8/notification_spec.rb
753
810
  - spec/unit/client/active_record/app_spec.rb
811
+ - spec/unit/client/active_record/fcm/app_spec.rb
812
+ - spec/unit/client/active_record/fcm/notification_spec.rb
754
813
  - spec/unit/client/active_record/gcm/app_spec.rb
755
814
  - spec/unit/client/active_record/gcm/notification_spec.rb
756
815
  - spec/unit/client/active_record/notification_spec.rb
@@ -773,6 +832,8 @@ test_files:
773
832
  - spec/unit/client/redis/apns2/notification_spec.rb
774
833
  - spec/unit/client/redis/apnsp8/notification_spec.rb
775
834
  - spec/unit/client/redis/app_spec.rb
835
+ - spec/unit/client/redis/fcm/app_spec.rb
836
+ - spec/unit/client/redis/fcm/notification_spec.rb
776
837
  - spec/unit/client/redis/gcm/app_spec.rb
777
838
  - spec/unit/client/redis/gcm/notification_spec.rb
778
839
  - spec/unit/client/redis/notification_spec.rb
@@ -790,6 +851,8 @@ test_files:
790
851
  - spec/unit/client/shared/apns/feedback.rb
791
852
  - spec/unit/client/shared/apns/notification.rb
792
853
  - spec/unit/client/shared/app.rb
854
+ - spec/unit/client/shared/fcm/app.rb
855
+ - spec/unit/client/shared/fcm/notification.rb
793
856
  - spec/unit/client/shared/gcm/app.rb
794
857
  - spec/unit/client/shared/gcm/notification.rb
795
858
  - spec/unit/client/shared/notification.rb
@@ -814,6 +877,7 @@ test_files:
814
877
  - spec/unit/daemon/dispatcher/http_spec.rb
815
878
  - spec/unit/daemon/dispatcher/tcp_spec.rb
816
879
  - spec/unit/daemon/dispatcher_loop_spec.rb
880
+ - spec/unit/daemon/fcm/delivery_spec.rb
817
881
  - spec/unit/daemon/feeder_spec.rb
818
882
  - spec/unit/daemon/gcm/delivery_spec.rb
819
883
  - spec/unit/daemon/proc_title_spec.rb