moov_ruby 26.7.0.pre.dev.6 → 26.7.1

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 (153) hide show
  1. checksums.yaml +4 -4
  2. data/lib/moov/avatars.rb +276 -1
  3. data/lib/moov/card_issuing.rb +116 -0
  4. data/lib/moov/client.rb +2 -2
  5. data/lib/moov/enriched_address.rb +1 -1
  6. data/lib/moov/enriched_profile.rb +1 -1
  7. data/lib/moov/institutions.rb +1 -1
  8. data/lib/moov/models/components/allowedscheduleerror.rb +36 -0
  9. data/lib/moov/models/components/allowedscheduleerror.rbi +15 -0
  10. data/lib/moov/models/components/avataruploadrequest.rb +32 -0
  11. data/lib/moov/models/components/avataruploadrequest.rbi +13 -0
  12. data/lib/moov/models/components/avataruploadrequest_file.rb +36 -0
  13. data/lib/moov/models/components/avataruploadrequest_file.rbi +15 -0
  14. data/lib/moov/models/components/capabilityid.rb +1 -0
  15. data/lib/moov/models/components/createdtransfer.rb +6 -2
  16. data/lib/moov/models/components/createdtransfer.rbi +2 -0
  17. data/lib/moov/models/components/createrefund.rb +2 -2
  18. data/lib/moov/models/components/createreversal.rb +1 -1
  19. data/lib/moov/models/components/createtransfer.rb +6 -2
  20. data/lib/moov/models/components/createtransfer.rbi +2 -0
  21. data/lib/moov/models/components/feepaidby.rb +19 -0
  22. data/lib/moov/models/components/feepaidby.rbi +11 -0
  23. data/lib/moov/models/components/fullissuedcard.rb +3 -3
  24. data/lib/moov/models/components/incurredfee.rb +6 -2
  25. data/lib/moov/models/components/incurredfee.rbi +2 -0
  26. data/lib/moov/models/components/issuedcard.rb +3 -3
  27. data/lib/moov/models/components/issuedcontrols.rb +52 -0
  28. data/lib/moov/models/components/issuedcontrols.rbi +23 -0
  29. data/lib/moov/models/components/issuedcontrols_allowedschedule.rb +36 -0
  30. data/lib/moov/models/components/issuedcontrols_allowedschedule.rbi +15 -0
  31. data/lib/moov/models/components/issuedvelocitylimit.rb +60 -0
  32. data/lib/moov/models/components/issuedvelocitylimit.rbi +27 -0
  33. data/lib/moov/models/components/issuingcontrols.rb +18 -2
  34. data/lib/moov/models/components/issuingcontrols.rbi +8 -0
  35. data/lib/moov/models/components/issuingcontrols_allowedschedule.rb +36 -0
  36. data/lib/moov/models/components/issuingcontrols_allowedschedule.rbi +15 -0
  37. data/lib/moov/models/components/issuingcontrolserror.rb +18 -2
  38. data/lib/moov/models/components/issuingcontrolserror.rbi +8 -0
  39. data/lib/moov/models/components/issuingcontrolsrestrictionmode.rb +19 -0
  40. data/lib/moov/models/components/issuingcontrolsrestrictionmode.rbi +11 -0
  41. data/lib/moov/models/components/issuingintervallimit.rb +4 -1
  42. data/lib/moov/models/components/issuingmerchantcategory.rb +43 -0
  43. data/lib/moov/models/components/issuingmerchantcategory.rbi +11 -0
  44. data/lib/moov/models/components/issuingscheduleday.rb +24 -0
  45. data/lib/moov/models/components/issuingscheduleday.rbi +11 -0
  46. data/lib/moov/models/components/issuingvelocitylimit.rb +11 -7
  47. data/lib/moov/models/components/issuingvelocitylimit.rbi +4 -2
  48. data/lib/moov/models/components/issuingvelocitylimiterror.rb +6 -2
  49. data/lib/moov/models/components/issuingvelocitylimiterror.rbi +2 -0
  50. data/lib/moov/models/components/merchantcategories.rb +32 -0
  51. data/lib/moov/models/components/merchantcategories.rbi +13 -0
  52. data/lib/moov/models/components/merchantcategory.rb +37 -0
  53. data/lib/moov/models/components/merchantcategory.rbi +15 -0
  54. data/lib/moov/models/components/merchantcategoryrestrictions.rb +44 -0
  55. data/lib/moov/models/components/merchantcategoryrestrictions.rbi +19 -0
  56. data/lib/moov/models/components/merchantcategoryrestrictionserror.rb +44 -0
  57. data/lib/moov/models/components/merchantcategoryrestrictionserror.rbi +19 -0
  58. data/lib/moov/models/components/merchantentry.rb +40 -0
  59. data/lib/moov/models/components/merchantentry.rbi +17 -0
  60. data/lib/moov/models/components/merchantentryerror.rb +36 -0
  61. data/lib/moov/models/components/merchantentryerror.rbi +15 -0
  62. data/lib/moov/models/components/merchantrestrictions.rb +36 -0
  63. data/lib/moov/models/components/merchantrestrictions.rbi +15 -0
  64. data/lib/moov/models/components/merchantrestrictionserror.rb +36 -0
  65. data/lib/moov/models/components/merchantrestrictionserror.rbi +15 -0
  66. data/lib/moov/models/components/paymentlinkpayoutdetails.rb +8 -2
  67. data/lib/moov/models/components/paymentlinkpayoutdetails.rbi +2 -0
  68. data/lib/moov/models/components/paymentlinkpayoutdetailsupdate.rb +8 -2
  69. data/lib/moov/models/components/paymentlinkpayoutdetailsupdate.rbi +2 -0
  70. data/lib/moov/models/components/paymentmethodswallet.rb +1 -0
  71. data/lib/moov/models/components/payoutdetailserror.rb +6 -2
  72. data/lib/moov/models/components/payoutdetailserror.rbi +2 -0
  73. data/lib/moov/models/components/product.rb +6 -2
  74. data/lib/moov/models/components/product.rbi +2 -0
  75. data/lib/moov/models/components/productcategories.rb +32 -0
  76. data/lib/moov/models/components/productcategories.rbi +13 -0
  77. data/lib/moov/models/components/productcategory.rb +48 -0
  78. data/lib/moov/models/components/productcategory.rbi +21 -0
  79. data/lib/moov/models/components/productrequest.rb +6 -2
  80. data/lib/moov/models/components/productrequest.rbi +2 -0
  81. data/lib/moov/models/components/schedulewindow.rb +40 -0
  82. data/lib/moov/models/components/schedulewindow.rbi +17 -0
  83. data/lib/moov/models/components/schedulewindowerror.rb +40 -0
  84. data/lib/moov/models/components/schedulewindowerror.rbi +17 -0
  85. data/lib/moov/models/components/schemebasicauth.rb +36 -0
  86. data/lib/moov/models/components/schemebasicauth.rbi +15 -0
  87. data/lib/moov/models/components/schemeoauth2auth.rb +40 -0
  88. data/lib/moov/models/components/schemeoauth2auth.rbi +17 -0
  89. data/lib/moov/models/components/sendfunds.rb +6 -2
  90. data/lib/moov/models/components/sendfunds.rbi +2 -0
  91. data/lib/moov/models/components/sendfundserror.rb +6 -2
  92. data/lib/moov/models/components/sendfundserror.rbi +2 -0
  93. data/lib/moov/models/components/sendfundswire.rb +32 -0
  94. data/lib/moov/models/components/sendfundswire.rbi +13 -0
  95. data/lib/moov/models/components/sendfundswireerror.rb +32 -0
  96. data/lib/moov/models/components/sendfundswireerror.rbi +13 -0
  97. data/lib/moov/models/components/transfer.rb +6 -2
  98. data/lib/moov/models/components/transfer.rbi +2 -0
  99. data/lib/moov/models/components/transfercapture.rb +36 -0
  100. data/lib/moov/models/components/transfercapture.rbi +15 -0
  101. data/lib/moov/models/components/transferfeepaidby.rb +32 -0
  102. data/lib/moov/models/components/transferfeepaidby.rbi +13 -0
  103. data/lib/moov/models/components/transferpaymentmethodswallet.rb +1 -0
  104. data/lib/moov/models/components/updateissuedcard.rb +6 -2
  105. data/lib/moov/models/components/updateissuedcard.rbi +2 -0
  106. data/lib/moov/models/components/updateissuingcontrols.rb +48 -0
  107. data/lib/moov/models/components/updateissuingcontrols.rbi +21 -0
  108. data/lib/moov/models/components/updateissuingcontrols_allowedschedule.rb +36 -0
  109. data/lib/moov/models/components/updateissuingcontrols_allowedschedule.rbi +15 -0
  110. data/lib/moov/models/components/updateissuingcontrols_merchantcategoryrestrictions.rb +44 -0
  111. data/lib/moov/models/components/updateissuingcontrols_merchantcategoryrestrictions.rbi +19 -0
  112. data/lib/moov/models/components/updateissuingcontrols_merchantrestrictions.rb +36 -0
  113. data/lib/moov/models/components/updateissuingcontrols_merchantrestrictions.rbi +15 -0
  114. data/lib/moov/models/components/updateissuingcontrolserror.rb +48 -0
  115. data/lib/moov/models/components/updateissuingcontrolserror.rbi +21 -0
  116. data/lib/moov/models/components/wallet.rb +1 -0
  117. data/lib/moov/models/components/wallettype.rb +2 -0
  118. data/lib/moov/models/components/webhookdatatransferstatus.rb +3 -0
  119. data/lib/moov/models/components.rb +34 -0
  120. data/lib/moov/models/errors/productrequestvalidationerror.rb +6 -2
  121. data/lib/moov/models/errors/productrequestvalidationerror.rbi +2 -0
  122. data/lib/moov/models/errors/transfer_error.rb +6 -2
  123. data/lib/moov/models/errors/transfer_error.rbi +2 -0
  124. data/lib/moov/models/errors/updateissuedcarderror.rb +6 -2
  125. data/lib/moov/models/errors/updateissuedcarderror.rbi +2 -0
  126. data/lib/moov/models/operations/deleteavatar_request.rb +32 -0
  127. data/lib/moov/models/operations/deleteavatar_request.rbi +13 -0
  128. data/lib/moov/models/operations/deleteavatar_response.rb +44 -0
  129. data/lib/moov/models/operations/deleteavatar_response.rbi +19 -0
  130. data/lib/moov/models/operations/deleteavatar_security.rb +36 -0
  131. data/lib/moov/models/operations/deleteavatar_security.rbi +15 -0
  132. data/lib/moov/models/operations/listissuingmerchantcategories_response.rb +48 -0
  133. data/lib/moov/models/operations/listissuingmerchantcategories_response.rbi +21 -0
  134. data/lib/moov/models/operations/listproductcategories_response.rb +48 -0
  135. data/lib/moov/models/operations/listproductcategories_response.rbi +21 -0
  136. data/lib/moov/models/operations/listproducts_request.rb +8 -2
  137. data/lib/moov/models/operations/listproducts_request.rbi +2 -0
  138. data/lib/moov/models/operations/listtransfers_request.rb +10 -2
  139. data/lib/moov/models/operations/listtransfers_request.rbi +4 -0
  140. data/lib/moov/models/operations/uploadavatar_request.rb +36 -0
  141. data/lib/moov/models/operations/uploadavatar_request.rbi +15 -0
  142. data/lib/moov/models/operations/uploadavatar_response.rb +44 -0
  143. data/lib/moov/models/operations/uploadavatar_response.rbi +19 -0
  144. data/lib/moov/models/operations/uploadavatar_security.rb +36 -0
  145. data/lib/moov/models/operations/uploadavatar_security.rbi +15 -0
  146. data/lib/moov/models/operations.rb +8 -0
  147. data/lib/moov/products.rb +113 -8
  148. data/lib/moov/sdk_hooks/clientcredentials.rb +386 -0
  149. data/lib/moov/sdk_hooks/hooks.rb +6 -0
  150. data/lib/moov/sdk_hooks/oauth2scopes.rb +18 -0
  151. data/lib/moov/sdkconfiguration.rb +3 -3
  152. data/lib/moov_ruby.rb +1 -1
  153. metadata +90 -4
@@ -0,0 +1,386 @@
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
@@ -5,6 +5,8 @@
5
5
 
6
6
  require_relative './types'
7
7
  require_relative './registration'
8
+ require_relative './oauth2scopes'
9
+ require_relative './clientcredentials'
8
10
 
9
11
  module Moov
10
12
  module SDKHooks
@@ -17,6 +19,10 @@ module Moov
17
19
  @before_request_hooks = T.let([], T::Array[AbstractSDKHook])
18
20
  @after_success_hooks = T.let([], T::Array[AbstractSDKHook])
19
21
  @after_error_hooks = T.let([], T::Array[AbstractSDKHook])
22
+ cc_hook = ClientCredentialsHook.new
23
+ register_sdk_init_hook cc_hook
24
+ register_before_request_hook cc_hook
25
+ register_after_error_hook cc_hook
20
26
  Registration.init_hooks self
21
27
  end
22
28
 
@@ -0,0 +1,18 @@
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
@@ -88,9 +88,9 @@ module Moov
88
88
  end
89
89
  @language = 'ruby'
90
90
  @openapi_doc_version = 'v2026.07.00'
91
- @sdk_version = '26.7.0-dev.6'
92
- @gen_version = '2.917.0'
93
- @user_agent = 'speakeasy-sdk/ruby 26.7.0-dev.6 2.917.0 v2026.07.00 moov_ruby'
91
+ @sdk_version = '26.7.1'
92
+ @gen_version = '2.924.0'
93
+ @user_agent = 'speakeasy-sdk/ruby 26.7.1 2.924.0 v2026.07.00 moov_ruby'
94
94
  end
95
95
 
96
96
  sig { returns([String, T::Hash[Symbol, String]]) }
data/lib/moov_ruby.rb CHANGED
@@ -40,8 +40,8 @@ module Moov
40
40
  autoload :Webhooks, 'moov/webhooks'
41
41
  autoload :Industries, 'moov/industries'
42
42
  autoload :Institutions, 'moov/institutions'
43
- autoload :IssuingTransactions, 'moov/issuing_transactions'
44
43
  autoload :CardIssuing, 'moov/card_issuing'
44
+ autoload :IssuingTransactions, 'moov/issuing_transactions'
45
45
  autoload :Authentication, 'moov/authentication'
46
46
  autoload :Onboarding, 'moov/onboarding'
47
47
  autoload :Ping, 'moov/ping'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: moov_ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 26.7.0.pre.dev.6
4
+ version: 26.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Speakeasy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-07-13 00:00:00.000000000 Z
11
+ date: 2026-07-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: base64
@@ -353,6 +353,8 @@ files:
353
353
  - lib/moov/models/components/adjustment.rbi
354
354
  - lib/moov/models/components/adjustmentfees.rb
355
355
  - lib/moov/models/components/adjustmentfees.rbi
356
+ - lib/moov/models/components/allowedscheduleerror.rb
357
+ - lib/moov/models/components/allowedscheduleerror.rbi
356
358
  - lib/moov/models/components/amount.rb
357
359
  - lib/moov/models/components/amount.rbi
358
360
  - lib/moov/models/components/amountdecimal.rb
@@ -407,6 +409,10 @@ files:
407
409
  - lib/moov/models/components/authtoken.rbi
408
410
  - lib/moov/models/components/authtokenrequest.rb
409
411
  - lib/moov/models/components/authtokenrequest.rbi
412
+ - lib/moov/models/components/avataruploadrequest.rb
413
+ - lib/moov/models/components/avataruploadrequest.rbi
414
+ - lib/moov/models/components/avataruploadrequest_file.rb
415
+ - lib/moov/models/components/avataruploadrequest_file.rbi
410
416
  - lib/moov/models/components/bankaccount.rb
411
417
  - lib/moov/models/components/bankaccount.rbi
412
418
  - lib/moov/models/components/bankaccountexception.rb
@@ -825,6 +831,8 @@ files:
825
831
  - lib/moov/models/components/feecategory.rbi
826
832
  - lib/moov/models/components/feemodel.rb
827
833
  - lib/moov/models/components/feemodel.rbi
834
+ - lib/moov/models/components/feepaidby.rb
835
+ - lib/moov/models/components/feepaidby.rbi
828
836
  - lib/moov/models/components/feeplan.rb
829
837
  - lib/moov/models/components/feeplan.rbi
830
838
  - lib/moov/models/components/feeplanagreement.rb
@@ -993,16 +1001,30 @@ files:
993
1001
  - lib/moov/models/components/issuedcardstate.rbi
994
1002
  - lib/moov/models/components/issuedcardtransaction.rb
995
1003
  - lib/moov/models/components/issuedcardtransaction.rbi
1004
+ - lib/moov/models/components/issuedcontrols.rb
1005
+ - lib/moov/models/components/issuedcontrols.rbi
1006
+ - lib/moov/models/components/issuedcontrols_allowedschedule.rb
1007
+ - lib/moov/models/components/issuedcontrols_allowedschedule.rbi
1008
+ - lib/moov/models/components/issuedvelocitylimit.rb
1009
+ - lib/moov/models/components/issuedvelocitylimit.rbi
996
1010
  - lib/moov/models/components/issuingauthorizationstatus.rb
997
1011
  - lib/moov/models/components/issuingauthorizationstatus.rbi
998
1012
  - lib/moov/models/components/issuingcontrols.rb
999
1013
  - lib/moov/models/components/issuingcontrols.rbi
1014
+ - lib/moov/models/components/issuingcontrols_allowedschedule.rb
1015
+ - lib/moov/models/components/issuingcontrols_allowedschedule.rbi
1000
1016
  - lib/moov/models/components/issuingcontrolserror.rb
1001
1017
  - lib/moov/models/components/issuingcontrolserror.rbi
1018
+ - lib/moov/models/components/issuingcontrolsrestrictionmode.rb
1019
+ - lib/moov/models/components/issuingcontrolsrestrictionmode.rbi
1002
1020
  - lib/moov/models/components/issuingintervallimit.rb
1003
1021
  - lib/moov/models/components/issuingintervallimit.rbi
1022
+ - lib/moov/models/components/issuingmerchantcategory.rb
1023
+ - lib/moov/models/components/issuingmerchantcategory.rbi
1004
1024
  - lib/moov/models/components/issuingmerchantdata.rb
1005
1025
  - lib/moov/models/components/issuingmerchantdata.rbi
1026
+ - lib/moov/models/components/issuingscheduleday.rb
1027
+ - lib/moov/models/components/issuingscheduleday.rbi
1006
1028
  - lib/moov/models/components/issuingvelocitylimit.rb
1007
1029
  - lib/moov/models/components/issuingvelocitylimit.rbi
1008
1030
  - lib/moov/models/components/issuingvelocitylimiterror.rb
@@ -1045,6 +1067,22 @@ files:
1045
1067
  - lib/moov/models/components/manualtermsofservice.rbi
1046
1068
  - lib/moov/models/components/manualtermsofserviceupdate.rb
1047
1069
  - lib/moov/models/components/manualtermsofserviceupdate.rbi
1070
+ - lib/moov/models/components/merchantcategories.rb
1071
+ - lib/moov/models/components/merchantcategories.rbi
1072
+ - lib/moov/models/components/merchantcategory.rb
1073
+ - lib/moov/models/components/merchantcategory.rbi
1074
+ - lib/moov/models/components/merchantcategoryrestrictions.rb
1075
+ - lib/moov/models/components/merchantcategoryrestrictions.rbi
1076
+ - lib/moov/models/components/merchantcategoryrestrictionserror.rb
1077
+ - lib/moov/models/components/merchantcategoryrestrictionserror.rbi
1078
+ - lib/moov/models/components/merchantentry.rb
1079
+ - lib/moov/models/components/merchantentry.rbi
1080
+ - lib/moov/models/components/merchantentryerror.rb
1081
+ - lib/moov/models/components/merchantentryerror.rbi
1082
+ - lib/moov/models/components/merchantrestrictions.rb
1083
+ - lib/moov/models/components/merchantrestrictions.rbi
1084
+ - lib/moov/models/components/merchantrestrictionserror.rb
1085
+ - lib/moov/models/components/merchantrestrictionserror.rbi
1048
1086
  - lib/moov/models/components/microdepositstatus.rb
1049
1087
  - lib/moov/models/components/microdepositstatus.rbi
1050
1088
  - lib/moov/models/components/minimumcommitment.rb
@@ -1199,6 +1237,10 @@ files:
1199
1237
  - lib/moov/models/components/primaryregulator.rbi
1200
1238
  - lib/moov/models/components/product.rb
1201
1239
  - lib/moov/models/components/product.rbi
1240
+ - lib/moov/models/components/productcategories.rb
1241
+ - lib/moov/models/components/productcategories.rbi
1242
+ - lib/moov/models/components/productcategory.rb
1243
+ - lib/moov/models/components/productcategory.rbi
1202
1244
  - lib/moov/models/components/productimagemetadata.rb
1203
1245
  - lib/moov/models/components/productimagemetadata.rbi
1204
1246
  - lib/moov/models/components/productoption.rb
@@ -1369,6 +1411,14 @@ files:
1369
1411
  - lib/moov/models/components/schedulepaymentmethod.rbi
1370
1412
  - lib/moov/models/components/scheduleresponse.rb
1371
1413
  - lib/moov/models/components/scheduleresponse.rbi
1414
+ - lib/moov/models/components/schedulewindow.rb
1415
+ - lib/moov/models/components/schedulewindow.rbi
1416
+ - lib/moov/models/components/schedulewindowerror.rb
1417
+ - lib/moov/models/components/schedulewindowerror.rbi
1418
+ - lib/moov/models/components/schemebasicauth.rb
1419
+ - lib/moov/models/components/schemebasicauth.rbi
1420
+ - lib/moov/models/components/schemeoauth2auth.rb
1421
+ - lib/moov/models/components/schemeoauth2auth.rbi
1372
1422
  - lib/moov/models/components/seccode.rb
1373
1423
  - lib/moov/models/components/seccode.rbi
1374
1424
  - lib/moov/models/components/security.rb
@@ -1393,6 +1443,10 @@ files:
1393
1443
  - lib/moov/models/components/sendfundsrtp.rbi
1394
1444
  - lib/moov/models/components/sendfundsrtperror.rb
1395
1445
  - lib/moov/models/components/sendfundsrtperror.rbi
1446
+ - lib/moov/models/components/sendfundswire.rb
1447
+ - lib/moov/models/components/sendfundswire.rbi
1448
+ - lib/moov/models/components/sendfundswireerror.rb
1449
+ - lib/moov/models/components/sendfundswireerror.rbi
1396
1450
  - lib/moov/models/components/sentreceipt.rb
1397
1451
  - lib/moov/models/components/sentreceipt.rbi
1398
1452
  - lib/moov/models/components/settings.rb
@@ -1481,6 +1535,8 @@ files:
1481
1535
  - lib/moov/models/components/transferachaddendarecord.rbi
1482
1536
  - lib/moov/models/components/transferamountdetails.rb
1483
1537
  - lib/moov/models/components/transferamountdetails.rbi
1538
+ - lib/moov/models/components/transfercapture.rb
1539
+ - lib/moov/models/components/transfercapture.rbi
1484
1540
  - lib/moov/models/components/transferconfig.rb
1485
1541
  - lib/moov/models/components/transferconfig.rbi
1486
1542
  - lib/moov/models/components/transfercontrols.rb
@@ -1491,6 +1547,8 @@ files:
1491
1547
  - lib/moov/models/components/transferentrymode.rbi
1492
1548
  - lib/moov/models/components/transferfailurereason.rb
1493
1549
  - lib/moov/models/components/transferfailurereason.rbi
1550
+ - lib/moov/models/components/transferfeepaidby.rb
1551
+ - lib/moov/models/components/transferfeepaidby.rbi
1494
1552
  - lib/moov/models/components/transferlineitem.rb
1495
1553
  - lib/moov/models/components/transferlineitem.rbi
1496
1554
  - lib/moov/models/components/transferlineitemimagemetadata.rb
@@ -1541,6 +1599,16 @@ files:
1541
1599
  - lib/moov/models/components/updateissuedcard.rbi
1542
1600
  - lib/moov/models/components/updateissuedcardstate.rb
1543
1601
  - lib/moov/models/components/updateissuedcardstate.rbi
1602
+ - lib/moov/models/components/updateissuingcontrols.rb
1603
+ - lib/moov/models/components/updateissuingcontrols.rbi
1604
+ - lib/moov/models/components/updateissuingcontrols_allowedschedule.rb
1605
+ - lib/moov/models/components/updateissuingcontrols_allowedschedule.rbi
1606
+ - lib/moov/models/components/updateissuingcontrols_merchantcategoryrestrictions.rb
1607
+ - lib/moov/models/components/updateissuingcontrols_merchantcategoryrestrictions.rbi
1608
+ - lib/moov/models/components/updateissuingcontrols_merchantrestrictions.rb
1609
+ - lib/moov/models/components/updateissuingcontrols_merchantrestrictions.rbi
1610
+ - lib/moov/models/components/updateissuingcontrolserror.rb
1611
+ - lib/moov/models/components/updateissuingcontrolserror.rbi
1544
1612
  - lib/moov/models/components/updatepaymentlink.rb
1545
1613
  - lib/moov/models/components/updatepaymentlink.rbi
1546
1614
  - lib/moov/models/components/updatepaymentlinkamountdetails.rb
@@ -1945,6 +2013,12 @@ files:
1945
2013
  - lib/moov/models/operations/createwallet_response.rbi
1946
2014
  - lib/moov/models/operations/createwebhook_response.rb
1947
2015
  - lib/moov/models/operations/createwebhook_response.rbi
2016
+ - lib/moov/models/operations/deleteavatar_request.rb
2017
+ - lib/moov/models/operations/deleteavatar_request.rbi
2018
+ - lib/moov/models/operations/deleteavatar_response.rb
2019
+ - lib/moov/models/operations/deleteavatar_response.rbi
2020
+ - lib/moov/models/operations/deleteavatar_security.rb
2021
+ - lib/moov/models/operations/deleteavatar_security.rbi
1948
2022
  - lib/moov/models/operations/deletedisputeevidencefile_request.rb
1949
2023
  - lib/moov/models/operations/deletedisputeevidencefile_request.rbi
1950
2024
  - lib/moov/models/operations/deletedisputeevidencefile_response.rb
@@ -2335,6 +2409,8 @@ files:
2335
2409
  - lib/moov/models/operations/listissuedcardtransactions_request.rbi
2336
2410
  - lib/moov/models/operations/listissuedcardtransactions_response.rb
2337
2411
  - lib/moov/models/operations/listissuedcardtransactions_response.rbi
2412
+ - lib/moov/models/operations/listissuingmerchantcategories_response.rb
2413
+ - lib/moov/models/operations/listissuingmerchantcategories_response.rbi
2338
2414
  - lib/moov/models/operations/listonboardinginvites_response.rb
2339
2415
  - lib/moov/models/operations/listonboardinginvites_response.rbi
2340
2416
  - lib/moov/models/operations/listpartnerpricingagreements_request.rb
@@ -2349,6 +2425,8 @@ files:
2349
2425
  - lib/moov/models/operations/listpaymentmethods_request.rbi
2350
2426
  - lib/moov/models/operations/listpaymentmethods_response.rb
2351
2427
  - lib/moov/models/operations/listpaymentmethods_response.rbi
2428
+ - lib/moov/models/operations/listproductcategories_response.rb
2429
+ - lib/moov/models/operations/listproductcategories_response.rbi
2352
2430
  - lib/moov/models/operations/listproducts_request.rb
2353
2431
  - lib/moov/models/operations/listproducts_request.rbi
2354
2432
  - lib/moov/models/operations/listproducts_response.rb
@@ -2533,6 +2611,12 @@ files:
2533
2611
  - lib/moov/models/operations/updatewebhook_request.rbi
2534
2612
  - lib/moov/models/operations/updatewebhook_response.rb
2535
2613
  - lib/moov/models/operations/updatewebhook_response.rbi
2614
+ - lib/moov/models/operations/uploadavatar_request.rb
2615
+ - lib/moov/models/operations/uploadavatar_request.rbi
2616
+ - lib/moov/models/operations/uploadavatar_response.rb
2617
+ - lib/moov/models/operations/uploadavatar_response.rbi
2618
+ - lib/moov/models/operations/uploadavatar_security.rb
2619
+ - lib/moov/models/operations/uploadavatar_security.rbi
2536
2620
  - lib/moov/models/operations/uploaddisputeevidencefile_request.rb
2537
2621
  - lib/moov/models/operations/uploaddisputeevidencefile_request.rbi
2538
2622
  - lib/moov/models/operations/uploaddisputeevidencefile_response.rb
@@ -2566,8 +2650,10 @@ files:
2566
2650
  - lib/moov/representatives.rb
2567
2651
  - lib/moov/resolution_links.rb
2568
2652
  - lib/moov/scheduling.rb
2653
+ - lib/moov/sdk_hooks/clientcredentials.rb
2569
2654
  - lib/moov/sdk_hooks/hooks.rb
2570
2655
  - lib/moov/sdk_hooks/moov_version.rb
2656
+ - lib/moov/sdk_hooks/oauth2scopes.rb
2571
2657
  - lib/moov/sdk_hooks/registration.rb
2572
2658
  - lib/moov/sdk_hooks/types.rb
2573
2659
  - lib/moov/sdkconfiguration.rb
@@ -2609,9 +2695,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
2609
2695
  version: '3.2'
2610
2696
  required_rubygems_version: !ruby/object:Gem::Requirement
2611
2697
  requirements:
2612
- - - ">"
2698
+ - - ">="
2613
2699
  - !ruby/object:Gem::Version
2614
- version: 1.3.1
2700
+ version: '0'
2615
2701
  requirements: []
2616
2702
  rubygems_version: 3.4.19
2617
2703
  signing_key: