moov_ruby 26.7.0 → 26.10.0.pre.dev.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 (67) hide show
  1. checksums.yaml +4 -4
  2. data/lib/moov/avatars.rb +0 -275
  3. data/lib/moov/models/components/capabilityid.rb +0 -1
  4. data/lib/moov/models/components/{avataruploadrequest.rb → contributingrule.rb} +8 -8
  5. data/lib/moov/models/components/contributingrule.rbi +13 -0
  6. data/lib/moov/models/components/createtransfer.rb +2 -6
  7. data/lib/moov/models/components/createtransfer.rbi +0 -2
  8. data/lib/moov/models/components/incurredfee.rb +2 -6
  9. data/lib/moov/models/components/incurredfee.rbi +0 -2
  10. data/lib/moov/models/components/issuingintervallimit.rb +1 -1
  11. data/lib/moov/models/components/issuingvelocitylimit.rb +1 -1
  12. data/lib/moov/models/components/partnerriskoutcomesresponse.rb +38 -0
  13. data/lib/moov/models/components/partnerriskoutcomesresponse.rbi +15 -0
  14. data/lib/moov/models/components/paymentlinkpayoutdetails.rb +2 -8
  15. data/lib/moov/models/components/paymentlinkpayoutdetails.rbi +0 -2
  16. data/lib/moov/models/components/paymentlinkpayoutdetailsupdate.rb +2 -8
  17. data/lib/moov/models/components/paymentlinkpayoutdetailsupdate.rbi +0 -2
  18. data/lib/moov/models/components/payoutdetailserror.rb +2 -6
  19. data/lib/moov/models/components/payoutdetailserror.rbi +0 -2
  20. data/lib/moov/models/components/product.rb +2 -6
  21. data/lib/moov/models/components/product.rbi +0 -2
  22. data/lib/moov/models/components/productrequest.rb +2 -6
  23. data/lib/moov/models/components/productrequest.rbi +0 -2
  24. data/lib/moov/models/components.rb +2 -8
  25. data/lib/moov/models/errors/productrequestvalidationerror.rb +2 -6
  26. data/lib/moov/models/errors/productrequestvalidationerror.rbi +0 -2
  27. data/lib/moov/models/operations/gettransferriskoutcomes_request.rb +37 -0
  28. data/lib/moov/models/operations/gettransferriskoutcomes_request.rbi +15 -0
  29. data/lib/moov/models/operations/{listproductcategories_response.rb → gettransferriskoutcomes_response.rb} +6 -6
  30. data/lib/moov/models/operations/{deleteavatar_response.rbi → gettransferriskoutcomes_response.rbi} +4 -2
  31. data/lib/moov/models/operations/listproducts_request.rb +2 -8
  32. data/lib/moov/models/operations/listproducts_request.rbi +0 -2
  33. data/lib/moov/models/operations.rb +2 -7
  34. data/lib/moov/products.rb +8 -113
  35. data/lib/moov/sdk_hooks/hooks.rb +0 -6
  36. data/lib/moov/sdkconfiguration.rb +4 -4
  37. data/lib/moov/transfers.rb +125 -0
  38. metadata +12 -36
  39. data/lib/moov/models/components/avataruploadrequest.rbi +0 -13
  40. data/lib/moov/models/components/avataruploadrequest_file.rb +0 -36
  41. data/lib/moov/models/components/avataruploadrequest_file.rbi +0 -15
  42. data/lib/moov/models/components/feepaidby.rb +0 -19
  43. data/lib/moov/models/components/feepaidby.rbi +0 -11
  44. data/lib/moov/models/components/productcategories.rb +0 -32
  45. data/lib/moov/models/components/productcategories.rbi +0 -13
  46. data/lib/moov/models/components/productcategory.rb +0 -48
  47. data/lib/moov/models/components/productcategory.rbi +0 -21
  48. data/lib/moov/models/components/schemebasicauth.rb +0 -36
  49. data/lib/moov/models/components/schemebasicauth.rbi +0 -15
  50. data/lib/moov/models/components/schemeoauth2auth.rb +0 -40
  51. data/lib/moov/models/components/schemeoauth2auth.rbi +0 -17
  52. data/lib/moov/models/components/transferfeepaidby.rb +0 -32
  53. data/lib/moov/models/components/transferfeepaidby.rbi +0 -13
  54. data/lib/moov/models/operations/deleteavatar_request.rb +0 -32
  55. data/lib/moov/models/operations/deleteavatar_request.rbi +0 -13
  56. data/lib/moov/models/operations/deleteavatar_response.rb +0 -44
  57. data/lib/moov/models/operations/deleteavatar_security.rb +0 -36
  58. data/lib/moov/models/operations/deleteavatar_security.rbi +0 -15
  59. data/lib/moov/models/operations/listproductcategories_response.rbi +0 -21
  60. data/lib/moov/models/operations/uploadavatar_request.rb +0 -36
  61. data/lib/moov/models/operations/uploadavatar_request.rbi +0 -15
  62. data/lib/moov/models/operations/uploadavatar_response.rb +0 -44
  63. data/lib/moov/models/operations/uploadavatar_response.rbi +0 -19
  64. data/lib/moov/models/operations/uploadavatar_security.rb +0 -36
  65. data/lib/moov/models/operations/uploadavatar_security.rbi +0 -15
  66. data/lib/moov/sdk_hooks/clientcredentials.rb +0 -386
  67. data/lib/moov/sdk_hooks/oauth2scopes.rb +0 -18
@@ -1,21 +0,0 @@
1
- # typed: true
2
- # frozen_string_literal: true
3
-
4
-
5
- class Moov::Models::Operations::ListProductCategoriesResponse
6
- extend ::Crystalline::MetadataFields::ClassMethods
7
- end
8
-
9
-
10
- class Moov::Models::Operations::ListProductCategoriesResponse
11
- def content_type(); end
12
- def content_type=(str_); end
13
- def status_code(); end
14
- def status_code=(str_); end
15
- def raw_response(); end
16
- def raw_response=(str_); end
17
- def headers(); end
18
- def headers=(str_); end
19
- def product_categories(); end
20
- def product_categories=(str_); end
21
- end
@@ -1,36 +0,0 @@
1
- # Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
2
-
3
- # typed: true
4
- # frozen_string_literal: true
5
-
6
-
7
- module Moov
8
- module Models
9
- module Operations
10
-
11
- class UploadAvatarRequest
12
- extend T::Sig
13
- include Crystalline::MetadataFields
14
-
15
- # The accountID to upload the avatar for. Only accountID values are accepted for writes.
16
- field :unique_id, ::String, { 'path_param': { 'field_name': 'uniqueID', 'style': 'simple', 'explode': false } }
17
-
18
- field :avatar_upload_request, Models::Components::AvatarUploadRequest, { 'request': { 'media_type': 'multipart/form-data' } }
19
-
20
- sig { params(unique_id: ::String, avatar_upload_request: Models::Components::AvatarUploadRequest).void }
21
- def initialize(unique_id:, avatar_upload_request:)
22
- @unique_id = unique_id
23
- @avatar_upload_request = avatar_upload_request
24
- end
25
-
26
- sig { params(other: T.untyped).returns(T::Boolean) }
27
- def ==(other)
28
- return false unless other.is_a? self.class
29
- return false unless @unique_id == other.unique_id
30
- return false unless @avatar_upload_request == other.avatar_upload_request
31
- true
32
- end
33
- end
34
- end
35
- end
36
- end
@@ -1,15 +0,0 @@
1
- # typed: true
2
- # frozen_string_literal: true
3
-
4
-
5
- class Moov::Models::Operations::UploadAvatarRequest
6
- extend ::Crystalline::MetadataFields::ClassMethods
7
- end
8
-
9
-
10
- class Moov::Models::Operations::UploadAvatarRequest
11
- def unique_id(); end
12
- def unique_id=(str_); end
13
- def avatar_upload_request(); end
14
- def avatar_upload_request=(str_); end
15
- end
@@ -1,44 +0,0 @@
1
- # Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
2
-
3
- # typed: true
4
- # frozen_string_literal: true
5
-
6
-
7
- module Moov
8
- module Models
9
- module Operations
10
-
11
- class UploadAvatarResponse
12
- extend T::Sig
13
- include Crystalline::MetadataFields
14
-
15
- # HTTP response content type for this operation
16
- field :content_type, ::String
17
- # HTTP response status code for this operation
18
- field :status_code, ::Integer
19
- # Raw HTTP response; suitable for custom response parsing
20
- field :raw_response, ::Faraday::Response
21
-
22
- field :headers, Crystalline::Hash.new(Symbol, Crystalline::Array.new(::String))
23
-
24
- sig { params(content_type: ::String, status_code: ::Integer, raw_response: ::Faraday::Response, headers: T::Hash[Symbol, T::Array[::String]]).void }
25
- def initialize(content_type:, status_code:, raw_response:, headers:)
26
- @content_type = content_type
27
- @status_code = status_code
28
- @raw_response = raw_response
29
- @headers = headers
30
- end
31
-
32
- sig { params(other: T.untyped).returns(T::Boolean) }
33
- def ==(other)
34
- return false unless other.is_a? self.class
35
- return false unless @content_type == other.content_type
36
- return false unless @status_code == other.status_code
37
- return false unless @raw_response == other.raw_response
38
- return false unless @headers == other.headers
39
- true
40
- end
41
- end
42
- end
43
- end
44
- end
@@ -1,19 +0,0 @@
1
- # typed: true
2
- # frozen_string_literal: true
3
-
4
-
5
- class Moov::Models::Operations::UploadAvatarResponse
6
- extend ::Crystalline::MetadataFields::ClassMethods
7
- end
8
-
9
-
10
- class Moov::Models::Operations::UploadAvatarResponse
11
- def content_type(); end
12
- def content_type=(str_); end
13
- def status_code(); end
14
- def status_code=(str_); end
15
- def raw_response(); end
16
- def raw_response=(str_); end
17
- def headers(); end
18
- def headers=(str_); end
19
- end
@@ -1,36 +0,0 @@
1
- # Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
2
-
3
- # typed: true
4
- # frozen_string_literal: true
5
-
6
-
7
- module Moov
8
- module Models
9
- module Operations
10
-
11
- class UploadAvatarSecurity
12
- extend T::Sig
13
- include Crystalline::MetadataFields
14
-
15
-
16
- field :basic_auth, Crystalline::Nilable.new(Models::Components::SchemeBasicAuth), { 'security': { 'scheme': true, 'type': 'http', 'sub_type': 'basic' } }
17
-
18
- field :o_auth2_auth, Crystalline::Nilable.new(Models::Components::SchemeOAuth2Auth), { 'security': { 'scheme': true, 'type': 'oauth2', 'sub_type': 'client_credentials' } }
19
-
20
- sig { params(basic_auth: T.nilable(Models::Components::SchemeBasicAuth), o_auth2_auth: T.nilable(Models::Components::SchemeOAuth2Auth)).void }
21
- def initialize(basic_auth: nil, o_auth2_auth: nil)
22
- @basic_auth = basic_auth
23
- @o_auth2_auth = o_auth2_auth
24
- end
25
-
26
- sig { params(other: T.untyped).returns(T::Boolean) }
27
- def ==(other)
28
- return false unless other.is_a? self.class
29
- return false unless @basic_auth == other.basic_auth
30
- return false unless @o_auth2_auth == other.o_auth2_auth
31
- true
32
- end
33
- end
34
- end
35
- end
36
- end
@@ -1,15 +0,0 @@
1
- # typed: true
2
- # frozen_string_literal: true
3
-
4
-
5
- class Moov::Models::Operations::UploadAvatarSecurity
6
- extend ::Crystalline::MetadataFields::ClassMethods
7
- end
8
-
9
-
10
- class Moov::Models::Operations::UploadAvatarSecurity
11
- def basic_auth(); end
12
- def basic_auth=(str_); end
13
- def o_auth2_auth(); end
14
- def o_auth2_auth=(str_); end
15
- end
@@ -1,386 +0,0 @@
1
- # Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
2
-
3
- # typed: true
4
- # frozen_string_literal: true
5
-
6
- require 'digest'
7
- require 'json'
8
- require 'net/http'
9
- require 'uri'
10
-
11
- require_relative './types'
12
-
13
- module Moov
14
- module SDKHooks
15
- class Credentials
16
- extend T::Sig
17
-
18
- sig { returns(String) }
19
- attr_reader :client_id
20
-
21
- sig { returns(String) }
22
- attr_reader :client_secret
23
-
24
- sig { returns(String) }
25
- attr_reader :token_url
26
-
27
- sig { returns(T.nilable(T::Array[String])) }
28
- attr_reader :scopes
29
-
30
- sig { returns(T::Hash[String, String]) }
31
- attr_reader :additional_properties
32
-
33
- sig do
34
- params(
35
- client_id: String,
36
- client_secret: String,
37
- token_url: String,
38
- scopes: T.nilable(T::Array[String]),
39
- additional_properties: T::Hash[String, String]
40
- ).void
41
- end
42
- def initialize(client_id:, client_secret:, token_url:, scopes: nil, additional_properties: {})
43
- @client_id = client_id
44
- @client_secret = client_secret
45
- @token_url = token_url
46
- @scopes = scopes
47
- @additional_properties = additional_properties
48
- end
49
- end
50
-
51
- class Session
52
- extend T::Sig
53
-
54
- sig { returns(Credentials) }
55
- attr_reader :credentials
56
-
57
- sig { returns(String) }
58
- attr_reader :token
59
-
60
- sig { returns(T::Array[String]) }
61
- attr_reader :scopes
62
-
63
- sig { returns(T.nilable(Integer)) }
64
- attr_reader :expires_at
65
-
66
- sig do
67
- params(
68
- credentials: Credentials,
69
- token: String,
70
- scopes: T::Array[String],
71
- expires_at: T.nilable(Integer)
72
- ).void
73
- end
74
- def initialize(credentials:, token:, scopes:, expires_at: nil)
75
- @credentials = credentials
76
- @token = token
77
- @scopes = scopes
78
- @expires_at = expires_at
79
- end
80
- end
81
-
82
- class ClientCredentialsHook < AbstractSDKHook
83
-
84
- extend T::Sig
85
-
86
- @global_lock = Mutex.new
87
- @client_locks = {}
88
- @sessions = {}
89
-
90
- class << self
91
- attr_reader :global_lock
92
- attr_accessor :client_locks, :sessions
93
- end
94
-
95
- sig { override.params(config: SDKConfiguration).returns(SDKConfiguration) }
96
- def sdk_init(config:)
97
- raise 'Client is required' if config.client.nil?
98
-
99
- @client = config.client
100
- config
101
- end
102
-
103
- sig do
104
- override.params(
105
- hook_ctx: BeforeRequestHookContext,
106
- request: Faraday::Request
107
- ).returns(Faraday::Request)
108
- end
109
- def before_request(hook_ctx:, request:)
110
- return request if hook_disabled?(hook_ctx)
111
-
112
- credentials = get_credentials(hook_ctx)
113
- return request if credentials.nil?
114
-
115
- session_key = get_session_key(credentials.client_id, credentials.client_secret)
116
- scopes = get_required_scopes(credentials, hook_ctx)
117
- session = get_existing_session(session_key, scopes)
118
-
119
- if session.nil?
120
- token_url = resolve_token_endpoint(hook_ctx.base_url, credentials.token_url)
121
- session = do_token_request(token_url, credentials, scopes)
122
- store_session(session_key, scopes, session)
123
- end
124
-
125
- request.headers['Authorization'] = "Bearer #{session.token}"
126
- request
127
- end
128
-
129
- sig do
130
- override.params(
131
- error: T.nilable(StandardError),
132
- hook_ctx: AfterErrorHookContext,
133
- response: T.nilable(Faraday::Response)
134
- ).returns(T.nilable(Faraday::Response))
135
- end
136
- def after_error(error:, hook_ctx:, response:)
137
- return response if hook_disabled?(hook_ctx)
138
-
139
- # We don't want to refresh the token if the error is not related to the token
140
- return response unless error.nil?
141
-
142
- credentials = get_credentials(hook_ctx)
143
- return response if credentials.nil?
144
-
145
- if !response.nil? && response.status == 401
146
- session_key = get_session_key(credentials.client_id, credentials.client_secret)
147
- scopes = get_required_scopes(credentials, hook_ctx)
148
- scope_key = get_scope_key(scopes)
149
- remove_session(session_key, scope_key)
150
- end
151
-
152
- response
153
- end
154
-
155
- private
156
-
157
- sig { params(hook_ctx: HookContext).returns(T::Boolean) }
158
- def hook_disabled?(hook_ctx)
159
- hook_ctx.oauth2_scopes.nil?
160
- end
161
-
162
-
163
- sig { params(hook_ctx: HookContext).returns(T.nilable(Credentials)) }
164
- def get_credentials(hook_ctx)
165
- source = hook_ctx.security_source
166
- return nil if source.nil?
167
-
168
- security = source.call
169
-
170
- case hook_ctx.operation_id
171
- when 'uploadAvatar'
172
- return get_credentials_upload_avatar(security)
173
- when 'deleteAvatar'
174
- return get_credentials_delete_avatar(security)
175
- end
176
-
177
- nil
178
- end
179
-
180
-
181
- sig { params(security: T.untyped).returns(T.nilable(Credentials)) }
182
- def get_credentials_upload_avatar(security)
183
- return nil if security.nil? || security.o_auth2_auth.nil?
184
-
185
- # Extract additional properties from security object
186
- additional_properties = {}
187
- security.o_auth2_auth.class.fields.each do |f|
188
- name = f.name.to_s
189
- next if %w[client_id client_secret token_url scopes].include?(name)
190
-
191
- metadata = f.metadata&.dig(:security)
192
- next if metadata.nil?
193
-
194
- field_name = metadata[:field_name] || name
195
- value = security.o_auth2_auth.send(f.name)
196
- additional_properties[field_name] = value.to_s unless value.nil?
197
- end
198
-
199
- Credentials.new(
200
- client_id: security.o_auth2_auth.client_id,
201
- client_secret: security.o_auth2_auth.client_secret,
202
- token_url: security.o_auth2_auth.token_url,
203
- scopes: nil,
204
- additional_properties: additional_properties
205
- )
206
- end
207
-
208
- sig { params(security: T.untyped).returns(T.nilable(Credentials)) }
209
- def get_credentials_delete_avatar(security)
210
- return nil if security.nil? || security.o_auth2_auth.nil?
211
-
212
- # Extract additional properties from security object
213
- additional_properties = {}
214
- security.o_auth2_auth.class.fields.each do |f|
215
- name = f.name.to_s
216
- next if %w[client_id client_secret token_url scopes].include?(name)
217
-
218
- metadata = f.metadata&.dig(:security)
219
- next if metadata.nil?
220
-
221
- field_name = metadata[:field_name] || name
222
- value = security.o_auth2_auth.send(f.name)
223
- additional_properties[field_name] = value.to_s unless value.nil?
224
- end
225
-
226
- Credentials.new(
227
- client_id: security.o_auth2_auth.client_id,
228
- client_secret: security.o_auth2_auth.client_secret,
229
- token_url: security.o_auth2_auth.token_url,
230
- scopes: nil,
231
- additional_properties: additional_properties
232
- )
233
- end
234
-
235
-
236
- sig { params(base_url: String, token_url: String).returns(String) }
237
- def resolve_token_endpoint(base_url, token_url)
238
- parsed = URI.parse(token_url)
239
- return token_url if parsed.host
240
-
241
- base = base_url.chomp('/')
242
- URI.join("#{base}/", token_url).to_s
243
- end
244
-
245
- sig { params(token_url: String, credentials: Credentials, scopes: T::Array[String]).returns(Session) }
246
- def do_token_request(token_url, credentials, scopes)
247
- payload = {
248
- 'grant_type' => 'client_credentials',
249
- 'client_id' => credentials.client_id,
250
- 'client_secret' => credentials.client_secret
251
- }
252
-
253
- payload['scope'] = scopes.join(' ') unless scopes.empty?
254
-
255
- # Add additional properties to payload
256
- credentials.additional_properties.each do |key, value|
257
- payload[key] = value
258
- end
259
- response = @client.post(token_url) do |req|
260
- req.headers['Content-Type'] = 'application/x-www-form-urlencoded'
261
- req.body = URI.encode_www_form(payload)
262
- end
263
-
264
- raise "Unexpected status code #{response.status} from token endpoint" unless response.status >= 200 && response.status < 300
265
-
266
- response_data = JSON.parse(response.body)
267
-
268
- raise 'Unexpected token type from token endpoint' unless response_data.fetch('token_type', '').downcase == 'bearer'
269
-
270
- expires_at = nil
271
- if response_data.key?('expires_in')
272
- expires_at = Time.now.to_i + response_data['expires_in'].to_i
273
- end
274
-
275
- Session.new(
276
- credentials: credentials,
277
- token: response_data['access_token'],
278
- scopes: scopes,
279
- expires_at: expires_at
280
- )
281
- end
282
-
283
- sig { params(client_id: String, client_secret: String).returns(String) }
284
- def get_session_key(client_id, client_secret)
285
- Digest::MD5.hexdigest("#{client_id}:#{client_secret}")
286
- end
287
-
288
- sig { params(credentials: Credentials, hook_ctx: HookContext).returns(T::Array[String]) }
289
- def get_required_scopes(credentials, hook_ctx)
290
- return T.must(credentials.scopes) unless credentials.scopes.nil?
291
-
292
- hook_ctx.oauth2_scopes || []
293
- end
294
-
295
- sig { params(scopes: T::Array[String]).returns(String) }
296
- def get_scope_key(scopes)
297
- return '' if scopes.empty?
298
-
299
- scopes.sort.join('&')
300
- end
301
-
302
- sig { params(client_key: String, scopes: T::Array[String], session: Session).void }
303
- def store_session(client_key, scopes, session)
304
- scope_key = get_scope_key(scopes)
305
- lock = get_client_lock(client_key)
306
- lock.synchronize do
307
- self.class.sessions[client_key] ||= {}
308
- self.class.sessions[client_key][scope_key] = session
309
- end
310
- end
311
-
312
- sig { params(client_key: String, scope_key: String).void }
313
- def remove_session(client_key, scope_key)
314
- lock = get_client_lock(client_key)
315
- lock.synchronize do
316
- if self.class.sessions.key?(client_key) && self.class.sessions[client_key].key?(scope_key)
317
- self.class.sessions[client_key].delete(scope_key)
318
- self.class.sessions.delete(client_key) if self.class.sessions[client_key].empty?
319
- end
320
- end
321
- end
322
-
323
- sig { params(client_key: String, required_scopes: T::Array[String]).returns(T.nilable(Session)) }
324
- def get_existing_session(client_key, required_scopes)
325
- scope_key = get_scope_key(required_scopes)
326
- expired_keys = []
327
- result = T.let(nil, T.untyped)
328
-
329
- lock = get_client_lock(client_key)
330
- lock.synchronize do
331
- return nil unless self.class.sessions.key?(client_key)
332
-
333
- client_sessions = self.class.sessions[client_key]
334
-
335
- # Check for exact scope match first
336
- if client_sessions.key?(scope_key)
337
- exact_match = client_sessions[scope_key]
338
- if token_expired?(exact_match.expires_at)
339
- expired_keys << scope_key
340
- else
341
- result = exact_match
342
- end
343
- end
344
-
345
- # If no exact match, look for a superset match
346
- if result.nil?
347
- found = T.let(false, T::Boolean)
348
- client_sessions.each do |key, session|
349
- if token_expired?(session.expires_at)
350
- expired_keys << key
351
- elsif !found && required_scopes?(session.scopes, required_scopes)
352
- result = session
353
- found = true
354
- end
355
- end
356
- end
357
-
358
- # Clean up expired sessions
359
- expired_keys.each { |key| client_sessions.delete(key) }
360
-
361
- # Clean up empty client sessions
362
- self.class.sessions.delete(client_key) if self.class.sessions.key?(client_key) && self.class.sessions[client_key].empty?
363
- end
364
-
365
- result
366
- end
367
-
368
- sig { params(scopes: T::Array[String], required_scopes: T::Array[String]).returns(T::Boolean) }
369
- def required_scopes?(scopes, required_scopes)
370
- required_scopes.all? { |scope| scopes.include?(scope) }
371
- end
372
-
373
- sig { params(expires_at: T.nilable(Integer)).returns(T::Boolean) }
374
- def token_expired?(expires_at)
375
- !expires_at.nil? && Time.now.to_i + 60 >= expires_at
376
- end
377
-
378
- sig { params(client_key: String).returns(Mutex) }
379
- def get_client_lock(client_key)
380
- self.class.global_lock.synchronize do
381
- self.class.client_locks[client_key] ||= Mutex.new
382
- end
383
- end
384
- end
385
- end
386
- end
@@ -1,18 +0,0 @@
1
- # Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
2
-
3
- # typed: true
4
- # frozen_string_literal: true
5
-
6
- module Moov
7
- module SDKHooks
8
-
9
- # OAuth2AuthOAuth2Scope - Available scopes for the OAuth2Auth OAuth 2.0 scheme (clientCredentials flow).
10
- class OAuth2AuthOAuth2Scope < T::Enum
11
-
12
- enums do
13
- # ROOT_ACCOUNTS_WRITE
14
- ROOT_ACCOUNTS_WRITE = new('/accounts.write')
15
- end
16
- end
17
- end
18
- end