fcm 0.0.6 → 1.0.3

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 (8) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -1
  3. data/.travis.yml +3 -4
  4. data/README.md +33 -21
  5. data/fcm.gemspec +3 -5
  6. data/lib/fcm.rb +81 -112
  7. data/spec/fcm_spec.rb +22 -3
  8. metadata +10 -17
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 0d92dc29d8a781ef45a9e3cd113fe834a3a41b63
4
- data.tar.gz: e3413daa3b418bfbc0631ffdf79f653950599f25
2
+ SHA256:
3
+ metadata.gz: 7d8fdd71d844f8b1d91cb5766d8eed454a169cc2656bdd23e3f322f668f7bdb5
4
+ data.tar.gz: 3b5993317f23cf026391b3dfe894bcc91343489dbf623bfbce884d8bb6d401d1
5
5
  SHA512:
6
- metadata.gz: 994687542f81b3d11b403d71dde8097a1990445c66249922215da103cff7737d44ee30d99537676cf2695f5606d2837cbb45cfdf59aed2b8c7649290450bf9a1
7
- data.tar.gz: 1516e659f3c1d7180a77ac177e0f79e4f45d9d471d0f22434533657de07d9de4c29855baf66dcbee003cf9c3b1ac6976ac8a543ca9e75a07b1d9fd04297dfb59
6
+ metadata.gz: 39012e9f9197305330a3fddc2af38315be9a42ab7233043efa26ae7e6892cd5f7d197cc9eba5fbbeeae0d24fe93958a55a47f9cada23b345e14781d4fd746467
7
+ data.tar.gz: fa8d086deaec08496a9d8ca6f31328ec8ececb44d99b55c6512cfc8a58410f5c4add7e65efae1c9820ca4bb1575998a22d41148b0747fdb2f2aa08b9a76bcdff
data/.gitignore CHANGED
@@ -48,4 +48,4 @@ specifications
48
48
  Gemfile.lock
49
49
  .rvmrc
50
50
  spec/reports
51
- *.gem
51
+ *.gem
data/.travis.yml CHANGED
@@ -1,8 +1,7 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.0.0
4
- - 2.1.10
5
- - 2.2.10
6
- - 2.3.8
3
+ - 2.4.0
7
4
  - 2.4.5
8
5
  - 2.5.3
6
+ - 2.6.1
7
+ - 2.7.0
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Firebase Cloud Messaging (FCM) for Android and iOS
2
2
 
3
- [![Gem Version](https://badge.fury.io/rb/fcm.svg)](http://badge.fury.io/rb/fcm) [![Build Status](https://secure.travis-ci.org/spacialdb/fcm.png?branch=master)](http://travis-ci.org/spacialdb/fcm)
3
+ [![Gem Version](https://badge.fury.io/rb/fcm.svg)](http://badge.fury.io/rb/fcm) [![Build Status](https://secure.travis-ci.org/decision-labs/fcm.svg?branch=master)](http://travis-ci.org/decision-labs/fcm)
4
4
 
5
5
  The FCM gem lets your ruby backend send notifications to Android and iOS devices via [
6
6
  Firebase Cloud Messaging](https://firebase.google.com/docs/cloud-messaging/).
@@ -19,12 +19,10 @@ gem 'fcm'
19
19
 
20
20
  For Android you will need a device running 2.3 (or newer) that also have the Google Play Store app installed, or an emulator running Android 2.3 with Google APIs. iOS devices are also supported.
21
21
 
22
- One of the following, tested Ruby versions:
23
22
 
24
- - `2.0.0`
25
- - `2.1.9`
26
- - `2.2.5`
27
- - `2.3.1`
23
+ A version of supported Ruby, currently:
24
+ `ruby >= 2.4`
25
+
28
26
 
29
27
  ## Usage
30
28
 
@@ -36,19 +34,14 @@ Example sending notifications:
36
34
  require 'fcm'
37
35
 
38
36
  fcm = FCM.new("my_server_key")
39
- # you can set option parameters in here
40
- # - all options are pass to HTTParty method arguments
41
- # - ref: https://github.com/jnunemaker/httparty/blob/master/lib/httparty.rb#L29-L60
42
- # fcm = FCM.new("my_server_key", timeout: 3)
43
37
 
44
38
  registration_ids= ["12", "13"] # an array of one or more client registration tokens
45
39
 
46
- # See https://developers.google.com/cloud-messaging/http for all available options.
40
+ # See https://firebase.google.com/docs/cloud-messaging/http-server-ref for all available options.
47
41
  options = { "notification": {
48
42
  "title": "Portugal vs. Denmark",
49
- "text": "5 to 1"
50
- },
51
- "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
43
+ "body": "5 to 1"
44
+ }
52
45
  }
53
46
  response = fcm.send(registration_ids, options)
54
47
  ```
@@ -104,14 +97,14 @@ FCM [topic messaging](https://firebase.google.com/docs/cloud-messaging/topic-mes
104
97
 
105
98
  ```ruby
106
99
  response = fcm.send_with_notification_key("/topics/yourTopic",
107
- data: {message: "This is a FCM Topic Message!"})
100
+ notification: {body: "This is a FCM Topic Message!"})
108
101
  ```
109
102
 
110
103
  Or you can use the helper:
111
104
 
112
105
  ```ruby
113
106
  response = fcm.send_to_topic("yourTopic",
114
- data: {message: "This is a FCM Topic Message!"})
107
+ notification: {body: "This is a FCM Topic Message!"})
115
108
  ```
116
109
 
117
110
  ### Sending to Multiple Topics
@@ -140,8 +133,8 @@ The `send_to_topic_condition` method within this library allows you to specicy a
140
133
  ```ruby
141
134
  response = fcm.send_to_topic_condition(
142
135
  "'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)",
143
- data: {
144
- message: "This is an FCM Topic Message sent to a condition!"
136
+ notification: {
137
+ body: "This is an FCM Topic Message sent to a condition!"
145
138
  }
146
139
  )
147
140
  ```
@@ -173,6 +166,18 @@ You can find a guide to implement an Android Client app to receive notifications
173
166
  The guide to set up an iOS app to get notifications is here: [Setting up a FCM Client App on iOS](https://firebase.google.com/docs/cloud-messaging/ios/client).
174
167
 
175
168
  ## ChangeLog
169
+ ### 1.0.2
170
+
171
+ - Bug fix: retrieve notification key" params: https://github.com/spacialdb/fcm/commit/b328a75c11d779a06d0ceda83527e26aa0495774
172
+
173
+ ### 1.0.0
174
+
175
+ - Bumped supported ruby to `>= 2.4`
176
+ - Fix deprecation warnings from `faraday` by changing dependency version to `faraday 1.0.0`
177
+
178
+ ### 0.0.7
179
+
180
+ - replace `httparty` with `faraday`
176
181
 
177
182
  ### 0.0.2
178
183
 
@@ -191,8 +196,15 @@ The guide to set up an iOS app to get notifications is here: [Setting up a FCM C
191
196
 
192
197
  - [Contributors](https://github.com/spacialdb/fcm/contributors)
193
198
 
194
- ## Donations
199
+ ## Cutting a release
195
200
 
196
- We accept tips through [Gratipay](https://gratipay.com/spacialdb/).
201
+ Update version in `fcm.gemspec` with `VERSION` and update `README.md` `## ChangeLog` section.
197
202
 
198
- [![Gratipay](https://img.shields.io/gratipay/spacialdb.svg)](https://www.gittip.com/spacialdb/)
203
+ ```bash
204
+ # set the version
205
+ # VERSION="1.0.3"
206
+ gem build fcm.gemspec
207
+ git tag -a v${VERSION} -m "Releasing version v${VERSION}"
208
+ git push origin --tags
209
+ gem push fcm-${VERSION}.gem
210
+ ```
data/fcm.gemspec CHANGED
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "fcm"
6
- s.version = "0.0.6"
6
+ s.version = "1.0.3"
7
7
  s.platform = Gem::Platform::RUBY
8
8
  s.authors = ["Kashif Rasul", "Shoaib Burq"]
9
9
  s.email = ["kashif@spacialdb.com", "shoaib@spacialdb.com"]
@@ -12,14 +12,12 @@ Gem::Specification.new do |s|
12
12
  s.description = %q{fcm provides ruby bindings to Firebase Cloud Messaging (FCM) a cross-platform messaging solution that lets you reliably deliver messages and notifications at no cost to Android, iOS or Web browsers.}
13
13
  s.license = "MIT"
14
14
 
15
- s.required_ruby_version = '>= 2.0.0'
16
-
17
- s.rubyforge_project = "fcm"
15
+ s.required_ruby_version = '>= 2.4.0'
18
16
 
19
17
  s.files = `git ls-files`.split("\n")
20
18
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
21
19
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
22
20
  s.require_paths = ["lib"]
23
21
 
24
- s.add_runtime_dependency('httparty', '~> 0.10', '>= 0.10.0')
22
+ s.add_runtime_dependency('faraday', '~> 1')
25
23
  end
data/lib/fcm.rb CHANGED
@@ -1,16 +1,15 @@
1
- require 'httparty'
1
+ require 'faraday'
2
2
  require 'cgi'
3
3
  require 'json'
4
4
 
5
5
  class FCM
6
- include HTTParty
7
- base_uri 'https://fcm.googleapis.com/fcm'
8
- default_timeout 30
9
- format :json
6
+ BASE_URI = 'https://fcm.googleapis.com'
7
+ DEFAULT_TIMEOUT = 30
8
+ FORMAT = :json
10
9
 
11
10
  # constants
12
- GROUP_NOTIFICATION_BASE_URI = 'https://android.googleapis.com/gcm'
13
- INSTANCE_ID_API = 'https://iid.googleapis.com/iid/v1'
11
+ GROUP_NOTIFICATION_BASE_URI = 'https://android.googleapis.com'
12
+ INSTANCE_ID_API = 'https://iid.googleapis.com'
14
13
  TOPIC_REGEX = /[a-zA-Z0-9\-_.~%]+/
15
14
 
16
15
  attr_accessor :timeout, :api_key
@@ -35,15 +34,10 @@ class FCM
35
34
  def send_notification(registration_ids, options = {})
36
35
  post_body = build_post_body(registration_ids, options)
37
36
 
38
- params = {
39
- body: post_body.to_json,
40
- headers: {
41
- 'Authorization' => "key=#{@api_key}",
42
- 'Content-Type' => 'application/json'
43
- }
44
- }
45
- response = self.class.post('/send', params.merge(@client_options))
46
- build_response(response, registration_ids)
37
+ for_uri(BASE_URI) do |connection|
38
+ response = connection.post('/fcm/send', post_body.to_json)
39
+ build_response(response, registration_ids)
40
+ end
47
41
  end
48
42
  alias send send_notification
49
43
 
@@ -51,22 +45,14 @@ class FCM
51
45
  post_body = build_post_body(registration_ids, operation: 'create',
52
46
  notification_key_name: key_name)
53
47
 
54
- params = {
55
- body: post_body.to_json,
56
- headers: {
57
- 'Content-Type' => 'application/json',
58
- 'project_id' => project_id,
59
- 'Authorization' => "key=#{@api_key}"
60
- }
48
+ extra_headers = {
49
+ 'project_id' => project_id
61
50
  }
62
51
 
63
- response = nil
64
-
65
- for_uri(GROUP_NOTIFICATION_BASE_URI) do
66
- response = self.class.post('/notification', params.merge(@client_options))
52
+ for_uri(GROUP_NOTIFICATION_BASE_URI, extra_headers) do |connection|
53
+ response = connection.post('/gcm/notification', post_body.to_json)
54
+ build_response(response)
67
55
  end
68
-
69
- build_response(response)
70
56
  end
71
57
  alias create create_notification_key
72
58
 
@@ -75,21 +61,14 @@ class FCM
75
61
  notification_key_name: key_name,
76
62
  notification_key: notification_key)
77
63
 
78
- params = {
79
- body: post_body.to_json,
80
- headers: {
81
- 'Content-Type' => 'application/json',
82
- 'project_id' => project_id,
83
- 'Authorization' => "key=#{@api_key}"
84
- }
64
+ extra_headers = {
65
+ 'project_id' => project_id
85
66
  }
86
67
 
87
- response = nil
88
-
89
- for_uri(GROUP_NOTIFICATION_BASE_URI) do
90
- response = self.class.post('/notification', params.merge(@client_options))
68
+ for_uri(GROUP_NOTIFICATION_BASE_URI, extra_headers) do |connection|
69
+ response = connection.post('/gcm/notification', post_body.to_json)
70
+ build_response(response)
91
71
  end
92
- build_response(response)
93
72
  end
94
73
  alias add add_registration_ids
95
74
 
@@ -98,42 +77,28 @@ class FCM
98
77
  notification_key_name: key_name,
99
78
  notification_key: notification_key)
100
79
 
101
- params = {
102
- body: post_body.to_json,
103
- headers: {
104
- 'Content-Type' => 'application/json',
105
- 'project_id' => project_id,
106
- 'Authorization' => "key=#{@api_key}"
107
- }
80
+ extra_headers = {
81
+ 'project_id' => project_id
108
82
  }
109
83
 
110
- response = nil
111
-
112
- for_uri(GROUP_NOTIFICATION_BASE_URI) do
113
- response = self.class.post('/notification', params.merge(@client_options))
84
+ for_uri(GROUP_NOTIFICATION_BASE_URI, extra_headers) do |connection|
85
+ response = connection.post('/gcm/notification', post_body.to_json)
86
+ build_response(response)
114
87
  end
115
- build_response(response)
116
88
  end
117
89
  alias remove remove_registration_ids
118
90
 
119
91
  def recover_notification_key(key_name, project_id)
120
- params = {
121
- query: {
122
- notification_key_name: key_name
123
- },
124
- headers: {
125
- 'Content-Type' => 'application/json',
126
- 'project_id' => project_id,
127
- 'Authorization' => "key=#{@api_key}"
128
- }
92
+ params = {notification_key_name: key_name}
93
+
94
+ extra_headers = {
95
+ 'project_id' => project_id
129
96
  }
130
97
 
131
- response = nil
132
-
133
- for_uri(GROUP_NOTIFICATION_BASE_URI) do
134
- response = self.class.get('/notification', params.merge(@client_options))
98
+ for_uri(GROUP_NOTIFICATION_BASE_URI, extra_headers) do |connection|
99
+ response = connection.get('/gcm/notification', params)
100
+ build_response(response)
135
101
  end
136
- build_response(response)
137
102
  end
138
103
 
139
104
  def send_with_notification_key(notification_key, options = {})
@@ -142,20 +107,10 @@ class FCM
142
107
  end
143
108
 
144
109
  def topic_subscription(topic, registration_id)
145
- params = {
146
- headers: {
147
- 'Authorization' => "key=#{@api_key}",
148
- 'Content-Type' => 'application/json'
149
- }
150
- }
151
-
152
- response = nil
153
-
154
- for_uri(INSTANCE_ID_API) do
155
- response = self.class.post("/#{registration_id}/rel/topics/#{topic}", params)
110
+ for_uri(INSTANCE_ID_API) do |connection|
111
+ response = connection.post("/iid/v1/#{registration_id}/rel/topics/#{topic}")
112
+ build_response(response)
156
113
  end
157
-
158
- build_response(response)
159
114
  end
160
115
 
161
116
  def batch_topic_subscription(topic, registration_ids)
@@ -168,31 +123,46 @@ class FCM
168
123
 
169
124
  def manage_topics_relationship(topic, registration_ids, action)
170
125
  body = { to: "/topics/#{topic}", registration_tokens: registration_ids }
171
- params = {
172
- body: body.to_json,
173
- headers: {
174
- 'Authorization' => "key=#{@api_key}",
175
- 'Content-Type' => 'application/json'
176
- }
177
- }
178
126
 
179
- response = nil
180
-
181
- for_uri(INSTANCE_ID_API) do
182
- response = self.class.post("/:batch#{action}", params)
127
+ for_uri(INSTANCE_ID_API) do |connection|
128
+ response = connection.post("/iid/v1:batch#{action}", body.to_json)
129
+ build_response(response)
183
130
  end
184
-
185
- build_response(response)
186
131
  end
187
132
 
188
-
189
-
190
133
  def send_to_topic(topic, options = {})
191
134
  if topic.gsub(TOPIC_REGEX, "").length == 0
192
135
  send_with_notification_key('/topics/' + topic, options)
193
136
  end
194
137
  end
195
138
 
139
+ def get_instance_id_info iid_token, options={}
140
+ params = {
141
+ query: options
142
+ }
143
+
144
+ for_uri(INSTANCE_ID_API) do |connection|
145
+ response = connection.get('/iid/info/'+iid_token, params)
146
+ build_response(response)
147
+ end
148
+ end
149
+
150
+ def subscribe_instance_id_to_topic iid_token, topic_name
151
+ batch_subscribe_instance_ids_to_topic([iid_token], topic_name)
152
+ end
153
+
154
+ def unsubscribe_instance_id_from_topic iid_token, topic_name
155
+ batch_unsubscribe_instance_ids_from_topic([iid_token], topic_name)
156
+ end
157
+
158
+ def batch_subscribe_instance_ids_to_topic instance_ids, topic_name
159
+ manage_topics_relationship(topic_name, instance_ids, 'Add')
160
+ end
161
+
162
+ def batch_unsubscribe_instance_ids_from_topic instance_ids, topic_name
163
+ manage_topics_relationship(topic_name, instance_ids, 'Remove')
164
+ end
165
+
196
166
  def send_to_topic_condition(condition, options = {})
197
167
  if validate_condition?(condition)
198
168
  body = { condition: condition }.merge(options)
@@ -202,11 +172,16 @@ class FCM
202
172
 
203
173
  private
204
174
 
205
- def for_uri(uri)
206
- current_uri = self.class.base_uri
207
- self.class.base_uri uri
208
- yield
209
- self.class.base_uri current_uri
175
+ def for_uri(uri, extra_headers = {})
176
+ connection = ::Faraday.new(:url => uri) do |faraday|
177
+ faraday.adapter Faraday.default_adapter
178
+ faraday.headers["Content-Type"] = "application/json"
179
+ faraday.headers["Authorization"] = "key=#{api_key}"
180
+ extra_headers.each do |key, value|
181
+ faraday.headers[key] = value
182
+ end
183
+ end
184
+ yield connection
210
185
  end
211
186
 
212
187
  def build_post_body(registration_ids, options = {})
@@ -216,8 +191,8 @@ class FCM
216
191
 
217
192
  def build_response(response, registration_ids = [])
218
193
  body = response.body || {}
219
- response_hash = { body: body, headers: response.headers, status_code: response.code }
220
- case response.code
194
+ response_hash = { body: body, headers: response.headers, status_code: response.status }
195
+ case response.status
221
196
  when 200
222
197
  response_hash[:response] = 'success'
223
198
  body = JSON.parse(body) unless body.empty?
@@ -260,16 +235,10 @@ class FCM
260
235
  end
261
236
 
262
237
  def execute_notification(body)
263
- params = {
264
- body: body.to_json,
265
- headers: {
266
- 'Authorization' => "key=#{@api_key}",
267
- 'Content-Type' => 'application/json'
268
- }
269
- }
270
-
271
- response = self.class.post('/send', params.merge(@client_options))
272
- build_response(response)
238
+ for_uri(BASE_URI) do |connection|
239
+ response = connection.post('/fcm/send', body.to_json)
240
+ build_response(response)
241
+ end
273
242
  end
274
243
 
275
244
  def has_canonical_id?(result)
data/spec/fcm_spec.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe FCM do
4
- let(:send_url) { "#{FCM.base_uri}/send" }
5
- let(:group_notification_base_uri) { "https://android.googleapis.com/gcm/notification" }
4
+ let(:send_url) { "#{FCM::BASE_URI}/fcm/send" }
5
+ let(:group_notification_base_uri) { "#{FCM::GROUP_NOTIFICATION_BASE_URI}/gcm/notification" }
6
6
  let(:api_key) { 'AIzaSyB-1uEai2WiUapxCs2Q0GZYzPu7Udno5aA' }
7
7
  let(:registration_id) { '42' }
8
8
  let(:registration_ids) { ['42'] }
@@ -254,7 +254,7 @@ describe FCM do
254
254
 
255
255
  it 'should not send notification due to 599' do
256
256
  subject.send(registration_ids).should eq(body: '{"body-key" => "Body value"}',
257
- headers: { 'header-key' => ['Header value'] },
257
+ headers: { 'header-key' => 'Header value' },
258
258
  response: 'There was an internal error in the FCM server while trying to process the request.',
259
259
  status_code: 599)
260
260
  end
@@ -472,6 +472,25 @@ describe FCM do
472
472
  end # remove context
473
473
  end
474
474
 
475
+ describe "#recover_notification_key" do
476
+ it "sends a 'retrieve notification key' request" do
477
+ uri = "#{FCM::GROUP_NOTIFICATION_BASE_URI}/gcm/notification"
478
+ endpoint = stub_request(:get, uri).with(
479
+ headers: {
480
+ 'Content-Type' => 'application/json',
481
+ 'Authorization' => "key=TEST_SERVER_KEY",
482
+ 'project_id' => "TEST_PROJECT_ID"
483
+ },
484
+ query: {notification_key_name: "TEST_KEY_NAME"}
485
+ )
486
+ client = FCM.new("TEST_SERVER_KEY")
487
+
488
+ client.recover_notification_key("TEST_KEY_NAME", "TEST_PROJECT_ID")
489
+
490
+ expect(endpoint).to have_been_requested
491
+ end
492
+ end
493
+
475
494
  describe 'subscribing to a topic' do
476
495
  # TODO
477
496
  end
metadata CHANGED
@@ -1,36 +1,30 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fcm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 1.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kashif Rasul
8
8
  - Shoaib Burq
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-11-05 00:00:00.000000000 Z
12
+ date: 2021-06-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: httparty
15
+ name: faraday
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
18
  - - "~>"
19
19
  - !ruby/object:Gem::Version
20
- version: '0.10'
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: 0.10.0
20
+ version: '1'
24
21
  type: :runtime
25
22
  prerelease: false
26
23
  version_requirements: !ruby/object:Gem::Requirement
27
24
  requirements:
28
25
  - - "~>"
29
26
  - !ruby/object:Gem::Version
30
- version: '0.10'
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: 0.10.0
27
+ version: '1'
34
28
  description: fcm provides ruby bindings to Firebase Cloud Messaging (FCM) a cross-platform
35
29
  messaging solution that lets you reliably deliver messages and notifications at
36
30
  no cost to Android, iOS or Web browsers.
@@ -56,7 +50,7 @@ homepage: https://github.com/spacialdb/fcm
56
50
  licenses:
57
51
  - MIT
58
52
  metadata: {}
59
- post_install_message:
53
+ post_install_message:
60
54
  rdoc_options: []
61
55
  require_paths:
62
56
  - lib
@@ -64,16 +58,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
64
58
  requirements:
65
59
  - - ">="
66
60
  - !ruby/object:Gem::Version
67
- version: 2.0.0
61
+ version: 2.4.0
68
62
  required_rubygems_version: !ruby/object:Gem::Requirement
69
63
  requirements:
70
64
  - - ">="
71
65
  - !ruby/object:Gem::Version
72
66
  version: '0'
73
67
  requirements: []
74
- rubyforge_project: fcm
75
- rubygems_version: 2.6.13
76
- signing_key:
68
+ rubygems_version: 3.0.3
69
+ signing_key:
77
70
  specification_version: 4
78
71
  summary: Reliably deliver messages and notifications via FCM
79
72
  test_files: