nylas 6.0.0.beta.3 → 6.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/nylas/client.rb +1 -1
- data/lib/nylas/handler/http_client.rb +28 -19
- data/lib/nylas/resources/applications.rb +3 -3
- data/lib/nylas/resources/auth.rb +44 -33
- data/lib/nylas/resources/connectors.rb +2 -2
- data/lib/nylas/resources/contacts.rb +1 -1
- data/lib/nylas/resources/credentials.rb +2 -2
- data/lib/nylas/resources/events.rb +1 -1
- data/lib/nylas/resources/grants.rb +4 -4
- data/lib/nylas/resources/messages.rb +5 -5
- data/lib/nylas/resources/webhooks.rb +33 -0
- data/lib/nylas/utils/file_utils.rb +6 -2
- data/lib/nylas/version.rb +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a84dfeb084c667f7b3e8f41e03ae5ef51be7c04fefd1e36ac357fd701a5a7a82
|
4
|
+
data.tar.gz: 14bd5db7be83cac30aadc723089dac7502198de4b7ed7a23cb58b6dc6984c870
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ef1dd4c3a6351f885a6f7f22af3848f2e0bfdc68ac62c2d933aa0a1336e08eca0975daf9b304543ac493ea87b32636bb4d8b9139f00ca865e44486dc5cdcbb11
|
7
|
+
data.tar.gz: bb3e97a16d619377c62b9c28fbaf3b4f9e93b3d2ee80d50ad9d6687cec0821c5a5a57f36b090838a500e82a0a2705649adb50fdad5a9be821a302fb0ab800c8e
|
data/lib/nylas/client.rb
CHANGED
@@ -18,7 +18,7 @@ module Nylas
|
|
18
18
|
#
|
19
19
|
# @param api_key [String, nil] API key to use for the client session.
|
20
20
|
# @param api_uri [String] Client session's host.
|
21
|
-
# @param timeout [
|
21
|
+
# @param timeout [Integer, nil] Timeout value to use for the client session.
|
22
22
|
def initialize(api_key:,
|
23
23
|
api_uri: Config::DEFAULT_REGION_URL,
|
24
24
|
timeout: nil)
|
@@ -42,8 +42,8 @@ module Nylas
|
|
42
42
|
|
43
43
|
parse_json_evaluate_error(result.code.to_i, response, path, content_type)
|
44
44
|
end
|
45
|
-
rescue
|
46
|
-
raise Nylas::NylasSdkTimeoutError.new(request
|
45
|
+
rescue RestClient::Exceptions::OpenTimeout, RestClient::Exceptions::ReadTimeout
|
46
|
+
raise Nylas::NylasSdkTimeoutError.new(request[:path], timeout)
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
@@ -92,8 +92,7 @@ module Nylas
|
|
92
92
|
def build_request(
|
93
93
|
method:, path: nil, headers: {}, query: {}, payload: nil, timeout: nil, api_key: nil
|
94
94
|
)
|
95
|
-
url = path
|
96
|
-
url = add_query_params_to_url(url, query)
|
95
|
+
url = build_url(path, query)
|
97
96
|
resulting_headers = default_headers.merge(headers).merge(auth_header(api_key))
|
98
97
|
if !payload.nil? && !payload["multipart"]
|
99
98
|
payload = payload&.to_json
|
@@ -206,33 +205,43 @@ module Nylas
|
|
206
205
|
end
|
207
206
|
|
208
207
|
# Adds query parameters to a URL.
|
209
|
-
#
|
208
|
+
# @param url [String] The base URL.
|
209
|
+
# @param query [Hash] The query parameters to add to the URL.
|
210
210
|
# @return [String] Processed URL, including query params.
|
211
|
-
def
|
211
|
+
def build_url(url, query = nil)
|
212
212
|
unless query.nil? || query.empty?
|
213
213
|
uri = URI.parse(url)
|
214
|
-
|
215
|
-
params = URI.decode_www_form(uri.query || "") + query.to_a
|
216
|
-
uri.query = URI.encode_www_form(params)
|
214
|
+
uri = build_query(uri, query)
|
217
215
|
url = uri.to_s
|
218
216
|
end
|
219
217
|
|
220
218
|
url
|
221
219
|
end
|
222
220
|
|
223
|
-
#
|
224
|
-
#
|
225
|
-
# @
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
221
|
+
# Build the query string for a URI.
|
222
|
+
# @param uri [URI] URL to add the query to.
|
223
|
+
# @param query [Hash] The query params to include in the query.
|
224
|
+
# @return [URI] The URI object with the query parameters included.
|
225
|
+
def build_query(uri, query)
|
226
|
+
query.each do |key, value|
|
227
|
+
case value
|
228
|
+
when Array
|
229
|
+
value.each do |item|
|
230
|
+
qs = "#{URI.encode_www_form_component(key)}=#{URI.encode_www_form_component(item)}"
|
231
|
+
uri.query = [uri.query, qs].compact.join("&")
|
232
|
+
end
|
233
|
+
when Hash
|
234
|
+
value.each do |k, v|
|
235
|
+
qs = "#{URI.encode_www_form_component(key)}=#{URI.encode_www_form_component("#{k}:#{v}")}"
|
236
|
+
uri.query = [uri.query, qs].compact.join("&")
|
237
|
+
end
|
238
|
+
else
|
239
|
+
qs = "#{URI.encode_www_form_component(key)}=#{URI.encode_www_form_component(value)}"
|
240
|
+
uri.query = [uri.query, qs].compact.join("&")
|
231
241
|
end
|
232
|
-
query[:metadata_pair] = pairs
|
233
242
|
end
|
234
243
|
|
235
|
-
|
244
|
+
uri
|
236
245
|
end
|
237
246
|
|
238
247
|
# Set the authorization header for an API query.
|
@@ -17,10 +17,10 @@ module Nylas
|
|
17
17
|
@redirect_uris = RedirectUris.new(sdk_instance)
|
18
18
|
end
|
19
19
|
|
20
|
-
#
|
20
|
+
# Get application details.
|
21
21
|
#
|
22
|
-
# @return [Array(Hash, String)] Application
|
23
|
-
def
|
22
|
+
# @return [Array(Hash, String)] Application details and API Request ID.
|
23
|
+
def get_details
|
24
24
|
get(path: "#{api_uri}/v3/applications")
|
25
25
|
end
|
26
26
|
end
|
data/lib/nylas/resources/auth.rb
CHANGED
@@ -59,7 +59,7 @@ module Nylas
|
|
59
59
|
# IMPORTANT: You must store the 'secret' returned to use it inside the CodeExchange flow.
|
60
60
|
#
|
61
61
|
# @param config [Hash] Configuration for building the URL.
|
62
|
-
# @return [
|
62
|
+
# @return [Hash] URL for hosted authentication with the secret and the hashed secret.
|
63
63
|
def url_for_oauth2_pkce(config)
|
64
64
|
url = url_auth_builder(config)
|
65
65
|
|
@@ -71,7 +71,7 @@ module Nylas
|
|
71
71
|
url.query = build_query_with_pkce(config, secret_hash)
|
72
72
|
|
73
73
|
# Returns the URL with secret and hashed secret.
|
74
|
-
|
74
|
+
{ secret: secret, secret_hash: secret_hash, url: url.to_s }
|
75
75
|
end
|
76
76
|
|
77
77
|
# Builds the URL for admin consent authentication for Microsoft.
|
@@ -81,9 +81,7 @@ module Nylas
|
|
81
81
|
def url_for_admin_consent(config)
|
82
82
|
config_with_provider = config.merge("provider" => "microsoft")
|
83
83
|
url = url_auth_builder(config_with_provider)
|
84
|
-
|
85
|
-
query_params = build_query_with_admin_consent(config)
|
86
|
-
url.query = URI.encode_www_form(query_params)
|
84
|
+
url.query = build_query_with_admin_consent(config)
|
87
85
|
|
88
86
|
url.to_s
|
89
87
|
end
|
@@ -102,47 +100,58 @@ module Nylas
|
|
102
100
|
true
|
103
101
|
end
|
104
102
|
|
103
|
+
# Detects the provider of an email address.
|
104
|
+
# @param params [Hash] Parameters to detect the provider.
|
105
|
+
# @return [Array(Hash, String)] Detected provider, if found and API Request ID.
|
106
|
+
def detect_provider(params)
|
107
|
+
post(
|
108
|
+
path: "#{api_uri}/v3/providers/detect",
|
109
|
+
query_params: params
|
110
|
+
)
|
111
|
+
end
|
112
|
+
|
105
113
|
private
|
106
114
|
|
107
115
|
# Builds the query with admin consent authentication for Microsoft.
|
108
116
|
#
|
109
117
|
# @param config [Hash] Configuration for the query.
|
110
|
-
# @return [
|
118
|
+
# @return [String] Updated list of parameters, including those specific to admin
|
111
119
|
# consent.
|
112
120
|
def build_query_with_admin_consent(config)
|
113
121
|
params = build_query(config)
|
114
122
|
|
115
123
|
# Appends new params specific for admin consent.
|
116
|
-
params[
|
117
|
-
params[
|
124
|
+
params[:provider] = "microsoft"
|
125
|
+
params[:response_type] = "adminconsent"
|
126
|
+
params[:credential_id] = config[:credential_id] if config[:credential_id]
|
118
127
|
|
119
|
-
params
|
128
|
+
URI.encode_www_form(params).gsub("+", "%20")
|
120
129
|
end
|
121
130
|
|
122
131
|
# Builds the query with PKCE.
|
123
132
|
#
|
124
133
|
# @param config [Hash] Configuration for the query.
|
125
134
|
# @param secret_hash [Hash] Hashed secret.
|
126
|
-
# @return [
|
135
|
+
# @return [String] Updated list of encoded parameters, including those specific
|
127
136
|
# to PKCE.
|
128
137
|
def build_query_with_pkce(config, secret_hash)
|
129
138
|
params = build_query(config)
|
130
139
|
|
131
140
|
# Appends new PKCE specific params.
|
132
|
-
params[
|
133
|
-
params[
|
141
|
+
params[:code_challenge_method] = "s256"
|
142
|
+
params[:code_challenge] = secret_hash
|
134
143
|
|
135
|
-
URI.encode_www_form(params)
|
144
|
+
URI.encode_www_form(params).gsub("+", "%20")
|
136
145
|
end
|
137
146
|
|
138
147
|
# Builds the authentication URL.
|
139
148
|
#
|
140
149
|
# @param config [Hash] Configuration for the query.
|
141
|
-
# @return [
|
150
|
+
# @return [URI] List of components for the authentication URL.
|
142
151
|
def url_auth_builder(config)
|
143
152
|
builder = URI.parse(api_uri)
|
144
153
|
builder.path = "/v3/connect/auth"
|
145
|
-
builder.query = build_query(config)
|
154
|
+
builder.query = URI.encode_www_form(build_query(config)).gsub!("+", "%20")
|
146
155
|
|
147
156
|
builder
|
148
157
|
end
|
@@ -150,40 +159,42 @@ module Nylas
|
|
150
159
|
# Builds the query.
|
151
160
|
#
|
152
161
|
# @param config [Hash] Configuration for the query.
|
153
|
-
# @return [
|
162
|
+
# @return [Hash] List of parameters to encode in the query.
|
154
163
|
def build_query(config)
|
155
164
|
params = {
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
165
|
+
client_id: config[:client_id],
|
166
|
+
redirect_uri: config[:redirect_uri],
|
167
|
+
access_type: config[:access_type] || "online",
|
168
|
+
response_type: "code"
|
160
169
|
}
|
161
|
-
params[
|
162
|
-
params[
|
163
|
-
params[
|
164
|
-
params[
|
165
|
-
params[
|
170
|
+
params[:provider] = config[:provider] if config[:provider]
|
171
|
+
params[:prompt] = config[:prompt] if config[:prompt]
|
172
|
+
params[:metadata] = config[:metadata] if config[:metadata]
|
173
|
+
params[:state] = config[:state] if config[:state]
|
174
|
+
params[:scope] = config[:scope].join(" ") if config[:scope]
|
166
175
|
if config[:login_hint]
|
167
|
-
params[
|
168
|
-
params[
|
176
|
+
params[:login_hint] = config[:login_hint]
|
177
|
+
params[:include_grant_scopes] = config[:include_grant_scopes].to_s if config[:include_grant_scopes]
|
169
178
|
end
|
170
179
|
|
171
|
-
|
180
|
+
params
|
172
181
|
end
|
173
182
|
|
174
|
-
#
|
183
|
+
# Hash a plain text secret for use in PKCE.
|
175
184
|
#
|
176
|
-
# @param secret [String]
|
177
|
-
# @return [
|
185
|
+
# @param secret [String] The plain text secret to hash.
|
186
|
+
# @return [String] The hashed secret with base64 encoding (without padding).
|
178
187
|
def hash_pkce_secret(secret)
|
179
|
-
Digest::SHA256.
|
180
|
-
Base64.
|
188
|
+
sha256_hash = Digest::SHA256.hexdigest(secret)
|
189
|
+
Base64.urlsafe_encode64(sha256_hash, padding: false)
|
181
190
|
end
|
182
191
|
|
183
192
|
# Sends the token request to the Nylas API.
|
184
193
|
#
|
185
194
|
# @param request [Hash] Code exchange request.
|
186
195
|
def execute_token_request(request)
|
196
|
+
request[:client_secret] = api_key if request[:client_secret].nil?
|
197
|
+
|
187
198
|
execute(
|
188
199
|
method: :post,
|
189
200
|
path: "#{api_uri}/v3/connect/token",
|
@@ -8,7 +8,7 @@ module Nylas
|
|
8
8
|
class Connectors < Resource
|
9
9
|
include ApiOperations::Get
|
10
10
|
include ApiOperations::Post
|
11
|
-
include ApiOperations::
|
11
|
+
include ApiOperations::Patch
|
12
12
|
include ApiOperations::Delete
|
13
13
|
|
14
14
|
# Access the Credentials API
|
@@ -59,7 +59,7 @@ module Nylas
|
|
59
59
|
# @param request_body [Hash] The values to update the connector with
|
60
60
|
# @return [Array(Hash, String)] The updated connector and API Request ID.
|
61
61
|
def update(provider:, request_body:)
|
62
|
-
|
62
|
+
patch(
|
63
63
|
path: "#{api_uri}/v3/connectors/#{provider}",
|
64
64
|
request_body: request_body
|
65
65
|
)
|
@@ -79,7 +79,7 @@ module Nylas
|
|
79
79
|
# @param identifier [String] Grant ID or email account to query.
|
80
80
|
# @param query_params [Hash, nil] Query params to pass to the request.
|
81
81
|
# @return [Array(Array(Hash), String)] The list of contact groups and API Request ID.
|
82
|
-
def
|
82
|
+
def list_groups(identifier:, query_params: nil)
|
83
83
|
get(
|
84
84
|
path: "#{api_uri}/v3/grants/#{identifier}/contacts/groups",
|
85
85
|
query_params: query_params
|
@@ -8,7 +8,7 @@ module Nylas
|
|
8
8
|
class Credentials < Resource
|
9
9
|
include ApiOperations::Get
|
10
10
|
include ApiOperations::Post
|
11
|
-
include ApiOperations::
|
11
|
+
include ApiOperations::Patch
|
12
12
|
include ApiOperations::Delete
|
13
13
|
|
14
14
|
# Return all credentials.
|
@@ -53,7 +53,7 @@ module Nylas
|
|
53
53
|
# @param request_body [Hash] The values to update the connector with
|
54
54
|
# @return [Array(Hash, String)] The updated connector and API Request ID.
|
55
55
|
def update(provider:, credential_id:, request_body:)
|
56
|
-
|
56
|
+
patch(
|
57
57
|
path: "#{api_uri}/v3/connectors/#{provider}/creds/#{credential_id}",
|
58
58
|
request_body: request_body
|
59
59
|
)
|
@@ -86,7 +86,7 @@ module Nylas
|
|
86
86
|
# @param event_id [String] The id of the event to respond to.
|
87
87
|
# @param request_body [Hash] The status values to send the RSVP with.
|
88
88
|
# @param query_params [Hash] The query parameters to include in the request
|
89
|
-
# @return [Hash] Response object with the API Request ID.
|
89
|
+
# @return [(Hash, String)] Response object with the API Request ID.
|
90
90
|
def send_rsvp(identifier:, event_id:, request_body:, query_params:)
|
91
91
|
post(
|
92
92
|
path: "#{api_uri}/v3/grants/#{identifier}/events/#{event_id}/send-rsvp",
|
@@ -16,7 +16,7 @@ module Nylas
|
|
16
16
|
# @return [Array(Array(Hash), String)] The list of grants and API Request ID.
|
17
17
|
def list(query_params: nil)
|
18
18
|
get(
|
19
|
-
path: "#{api_uri}/v3/
|
19
|
+
path: "#{api_uri}/v3/grants",
|
20
20
|
query_params: query_params
|
21
21
|
)
|
22
22
|
end
|
@@ -27,7 +27,7 @@ module Nylas
|
|
27
27
|
# @return [Array(Hash, String)] The grant and API request ID.
|
28
28
|
def find(grant_id:)
|
29
29
|
get(
|
30
|
-
path: "#{api_uri}/v3/
|
30
|
+
path: "#{api_uri}/v3/grants/#{grant_id}"
|
31
31
|
)
|
32
32
|
end
|
33
33
|
|
@@ -38,7 +38,7 @@ module Nylas
|
|
38
38
|
# @return [Array(Hash, String)] The updated grant and API Request ID.
|
39
39
|
def update(grant_id:, request_body:)
|
40
40
|
put(
|
41
|
-
path: "#{api_uri}/v3/
|
41
|
+
path: "#{api_uri}/v3/grants/#{grant_id}",
|
42
42
|
request_body: request_body
|
43
43
|
)
|
44
44
|
end
|
@@ -49,7 +49,7 @@ module Nylas
|
|
49
49
|
# @return [Array(TrueClass, String)] True and the API Request ID for the delete operation.
|
50
50
|
def destroy(grant_id:)
|
51
51
|
_, request_id = delete(
|
52
|
-
path: "#{api_uri}/v3/
|
52
|
+
path: "#{api_uri}/v3/grants/#{grant_id}"
|
53
53
|
)
|
54
54
|
|
55
55
|
[true, request_id]
|
@@ -94,21 +94,21 @@ module Nylas
|
|
94
94
|
# Retrieve your scheduled messages.
|
95
95
|
#
|
96
96
|
# @param identifier [String] Grant ID or email account from which to find the scheduled message from.
|
97
|
-
# @param schedule_id [String] The id of the scheduled message to stop.
|
98
97
|
# @return [Array(Hash, String)] The list of scheduled messages and the API Request ID.
|
99
|
-
def list_scheduled_messages(identifier
|
98
|
+
def list_scheduled_messages(identifier:)
|
100
99
|
get(
|
101
|
-
path: "#{api_uri}/v3/grants/#{identifier}/messages/schedules
|
100
|
+
path: "#{api_uri}/v3/grants/#{identifier}/messages/schedules"
|
102
101
|
)
|
103
102
|
end
|
104
103
|
|
105
104
|
# Retrieve your scheduled messages.
|
106
105
|
#
|
107
106
|
# @param identifier [String] Grant ID or email account from which to list the scheduled messages from.
|
107
|
+
# @param schedule_id [String] The id of the scheduled message to stop.
|
108
108
|
# @return [Array(Hash, String)] The scheduled message and the API Request ID.
|
109
|
-
def find_scheduled_messages(identifier:)
|
109
|
+
def find_scheduled_messages(identifier:, schedule_id:)
|
110
110
|
get(
|
111
|
-
path: "#{api_uri}/v3/grants/#{identifier}/messages/schedules"
|
111
|
+
path: "#{api_uri}/v3/grants/#{identifier}/messages/schedules/#{schedule_id}"
|
112
112
|
)
|
113
113
|
end
|
114
114
|
|
@@ -84,5 +84,38 @@ module Nylas
|
|
84
84
|
|
85
85
|
[true, request_id]
|
86
86
|
end
|
87
|
+
|
88
|
+
# Update the webhook secret value for a destination.
|
89
|
+
# @param webhook_id [String] The ID of the webhook destination to update.
|
90
|
+
# @return [Array(Hash, String)] The updated webhook destination and API Request ID.
|
91
|
+
def rotate_secret(webhook_id:)
|
92
|
+
put(
|
93
|
+
path: "#{api_uri}/v3/webhooks/#{webhook_id}/rotate-secret",
|
94
|
+
request_body: {}
|
95
|
+
)
|
96
|
+
end
|
97
|
+
|
98
|
+
# Get the current list of IP addresses that Nylas sends webhooks from
|
99
|
+
# @return [Array(Hash, String)] List of IP addresses that Nylas sends webhooks from and API Request ID.
|
100
|
+
def ip_addresses
|
101
|
+
get(
|
102
|
+
path: "#{api_uri}/v3/webhooks/ip-addresses"
|
103
|
+
)
|
104
|
+
end
|
105
|
+
|
106
|
+
# Extract the challenge parameter from a URL
|
107
|
+
# @param url [String] The URL sent by Nylas containing the challenge parameter
|
108
|
+
# @return [String] The challenge parameter
|
109
|
+
def self.extract_challenge_parameter(url)
|
110
|
+
url_object = URI.parse(url)
|
111
|
+
query = CGI.parse(url_object.query || "")
|
112
|
+
|
113
|
+
challenge_parameter = query["challenge"]
|
114
|
+
if challenge_parameter.nil? || challenge_parameter.empty? || challenge_parameter.first.nil?
|
115
|
+
raise "Invalid URL or no challenge parameter found."
|
116
|
+
end
|
117
|
+
|
118
|
+
challenge_parameter.first
|
119
|
+
end
|
87
120
|
end
|
88
121
|
end
|
@@ -38,8 +38,12 @@ module Nylas
|
|
38
38
|
# @return [Hash] The request that will attach the file to the message/draft
|
39
39
|
def self.attach_file_request_builder(file_path)
|
40
40
|
filename = File.basename(file_path)
|
41
|
-
content_type = MIME::Types.type_for(file_path)
|
42
|
-
content_type =
|
41
|
+
content_type = MIME::Types.type_for(file_path)
|
42
|
+
content_type = if !content_type.nil? && !content_type.empty?
|
43
|
+
content_type.first.to_s
|
44
|
+
else
|
45
|
+
"application/octet-stream"
|
46
|
+
end
|
43
47
|
size = File.size(file_path)
|
44
48
|
content = File.new(file_path, "rb")
|
45
49
|
|
data/lib/nylas/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nylas
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.0.0
|
4
|
+
version: 6.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nylas, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-02-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mime-types
|
@@ -180,14 +180,14 @@ dependencies:
|
|
180
180
|
requirements:
|
181
181
|
- - "~>"
|
182
182
|
- !ruby/object:Gem::Version
|
183
|
-
version: 0.
|
183
|
+
version: 0.22.0
|
184
184
|
type: :development
|
185
185
|
prerelease: false
|
186
186
|
version_requirements: !ruby/object:Gem::Requirement
|
187
187
|
requirements:
|
188
188
|
- - "~>"
|
189
189
|
- !ruby/object:Gem::Version
|
190
|
-
version: 0.
|
190
|
+
version: 0.22.0
|
191
191
|
- !ruby/object:Gem::Dependency
|
192
192
|
name: simplecov-cobertura
|
193
193
|
requirement: !ruby/object:Gem::Requirement
|
@@ -274,9 +274,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
274
274
|
version: '3.0'
|
275
275
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
276
276
|
requirements:
|
277
|
-
- - "
|
277
|
+
- - ">="
|
278
278
|
- !ruby/object:Gem::Version
|
279
|
-
version:
|
279
|
+
version: '0'
|
280
280
|
requirements: []
|
281
281
|
rubygems_version: 3.4.10
|
282
282
|
signing_key:
|