method-ruby 0.1.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 (125) hide show
  1. checksums.yaml +7 -0
  2. data/.ignore +2 -0
  3. data/CHANGELOG.md +11 -0
  4. data/README.md +244 -0
  5. data/SECURITY.md +27 -0
  6. data/lib/method_ruby/client.rb +114 -0
  7. data/lib/method_ruby/errors.rb +228 -0
  8. data/lib/method_ruby/file_part.rb +58 -0
  9. data/lib/method_ruby/internal/transport/base_client.rb +595 -0
  10. data/lib/method_ruby/internal/transport/pooled_net_requester.rb +210 -0
  11. data/lib/method_ruby/internal/type/array_of.rb +168 -0
  12. data/lib/method_ruby/internal/type/base_model.rb +531 -0
  13. data/lib/method_ruby/internal/type/base_page.rb +55 -0
  14. data/lib/method_ruby/internal/type/boolean.rb +77 -0
  15. data/lib/method_ruby/internal/type/converter.rb +327 -0
  16. data/lib/method_ruby/internal/type/enum.rb +131 -0
  17. data/lib/method_ruby/internal/type/file_input.rb +111 -0
  18. data/lib/method_ruby/internal/type/hash_of.rb +188 -0
  19. data/lib/method_ruby/internal/type/request_parameters.rb +42 -0
  20. data/lib/method_ruby/internal/type/union.rb +237 -0
  21. data/lib/method_ruby/internal/type/unknown.rb +81 -0
  22. data/lib/method_ruby/internal/util.rb +951 -0
  23. data/lib/method_ruby/internal.rb +20 -0
  24. data/lib/method_ruby/models/address.rb +45 -0
  25. data/lib/method_ruby/models/entity.rb +102 -0
  26. data/lib/method_ruby/models/entity_corporation.rb +33 -0
  27. data/lib/method_ruby/models/entity_corporation_owner.rb +45 -0
  28. data/lib/method_ruby/models/entity_create_params.rb +188 -0
  29. data/lib/method_ruby/models/entity_create_response.rb +32 -0
  30. data/lib/method_ruby/models/entity_individual.rb +39 -0
  31. data/lib/method_ruby/models/entity_list_params.rb +61 -0
  32. data/lib/method_ruby/models/entity_list_response.rb +32 -0
  33. data/lib/method_ruby/models/entity_retrieve_params.rb +37 -0
  34. data/lib/method_ruby/models/entity_retrieve_response.rb +32 -0
  35. data/lib/method_ruby/models/entity_update_params.rb +75 -0
  36. data/lib/method_ruby/models/entity_update_response.rb +32 -0
  37. data/lib/method_ruby/models/ping_check_params.rb +14 -0
  38. data/lib/method_ruby/models/ping_check_response.rb +49 -0
  39. data/lib/method_ruby/models/resource_error.rb +33 -0
  40. data/lib/method_ruby/models.rb +63 -0
  41. data/lib/method_ruby/request_options.rb +77 -0
  42. data/lib/method_ruby/resources/entities.rb +141 -0
  43. data/lib/method_ruby/resources/ping.rb +34 -0
  44. data/lib/method_ruby/version.rb +5 -0
  45. data/lib/method_ruby.rb +73 -0
  46. data/manifest.yaml +17 -0
  47. data/rbi/method_ruby/client.rbi +85 -0
  48. data/rbi/method_ruby/errors.rbi +205 -0
  49. data/rbi/method_ruby/file_part.rbi +37 -0
  50. data/rbi/method_ruby/internal/transport/base_client.rbi +303 -0
  51. data/rbi/method_ruby/internal/transport/pooled_net_requester.rbi +84 -0
  52. data/rbi/method_ruby/internal/type/array_of.rbi +104 -0
  53. data/rbi/method_ruby/internal/type/base_model.rbi +308 -0
  54. data/rbi/method_ruby/internal/type/base_page.rbi +42 -0
  55. data/rbi/method_ruby/internal/type/boolean.rbi +58 -0
  56. data/rbi/method_ruby/internal/type/converter.rbi +216 -0
  57. data/rbi/method_ruby/internal/type/enum.rbi +82 -0
  58. data/rbi/method_ruby/internal/type/file_input.rbi +59 -0
  59. data/rbi/method_ruby/internal/type/hash_of.rbi +104 -0
  60. data/rbi/method_ruby/internal/type/request_parameters.rbi +29 -0
  61. data/rbi/method_ruby/internal/type/union.rbi +128 -0
  62. data/rbi/method_ruby/internal/type/unknown.rbi +58 -0
  63. data/rbi/method_ruby/internal/util.rbi +507 -0
  64. data/rbi/method_ruby/internal.rbi +18 -0
  65. data/rbi/method_ruby/models/address.rbi +63 -0
  66. data/rbi/method_ruby/models/entity.rbi +151 -0
  67. data/rbi/method_ruby/models/entity_corporation.rbi +61 -0
  68. data/rbi/method_ruby/models/entity_corporation_owner.rbi +86 -0
  69. data/rbi/method_ruby/models/entity_create_params.rbi +408 -0
  70. data/rbi/method_ruby/models/entity_create_response.rbi +84 -0
  71. data/rbi/method_ruby/models/entity_individual.rbi +65 -0
  72. data/rbi/method_ruby/models/entity_list_params.rbi +132 -0
  73. data/rbi/method_ruby/models/entity_list_response.rbi +84 -0
  74. data/rbi/method_ruby/models/entity_retrieve_params.rbi +93 -0
  75. data/rbi/method_ruby/models/entity_retrieve_response.rbi +89 -0
  76. data/rbi/method_ruby/models/entity_update_params.rbi +141 -0
  77. data/rbi/method_ruby/models/entity_update_response.rbi +84 -0
  78. data/rbi/method_ruby/models/ping_check_params.rbi +27 -0
  79. data/rbi/method_ruby/models/ping_check_response.rbi +118 -0
  80. data/rbi/method_ruby/models/resource_error.rbi +55 -0
  81. data/rbi/method_ruby/models.rbi +25 -0
  82. data/rbi/method_ruby/request_options.rbi +59 -0
  83. data/rbi/method_ruby/resources/entities.rbi +119 -0
  84. data/rbi/method_ruby/resources/ping.rbi +22 -0
  85. data/rbi/method_ruby/version.rbi +5 -0
  86. data/sig/method_ruby/client.rbs +39 -0
  87. data/sig/method_ruby/errors.rbs +117 -0
  88. data/sig/method_ruby/file_part.rbs +21 -0
  89. data/sig/method_ruby/internal/transport/base_client.rbs +135 -0
  90. data/sig/method_ruby/internal/transport/pooled_net_requester.rbs +48 -0
  91. data/sig/method_ruby/internal/type/array_of.rbs +48 -0
  92. data/sig/method_ruby/internal/type/base_model.rbs +102 -0
  93. data/sig/method_ruby/internal/type/base_page.rbs +24 -0
  94. data/sig/method_ruby/internal/type/boolean.rbs +26 -0
  95. data/sig/method_ruby/internal/type/converter.rbs +79 -0
  96. data/sig/method_ruby/internal/type/enum.rbs +32 -0
  97. data/sig/method_ruby/internal/type/file_input.rbs +25 -0
  98. data/sig/method_ruby/internal/type/hash_of.rbs +48 -0
  99. data/sig/method_ruby/internal/type/request_parameters.rbs +19 -0
  100. data/sig/method_ruby/internal/type/union.rbs +52 -0
  101. data/sig/method_ruby/internal/type/unknown.rbs +26 -0
  102. data/sig/method_ruby/internal/util.rbs +195 -0
  103. data/sig/method_ruby/internal.rbs +9 -0
  104. data/sig/method_ruby/models/address.rbs +40 -0
  105. data/sig/method_ruby/models/entity.rbs +94 -0
  106. data/sig/method_ruby/models/entity_corporation.rbs +43 -0
  107. data/sig/method_ruby/models/entity_corporation_owner.rbs +57 -0
  108. data/sig/method_ruby/models/entity_create_params.rbs +215 -0
  109. data/sig/method_ruby/models/entity_create_response.rbs +41 -0
  110. data/sig/method_ruby/models/entity_individual.rbs +44 -0
  111. data/sig/method_ruby/models/entity_list_params.rbs +77 -0
  112. data/sig/method_ruby/models/entity_list_response.rbs +41 -0
  113. data/sig/method_ruby/models/entity_retrieve_params.rbs +47 -0
  114. data/sig/method_ruby/models/entity_retrieve_response.rbs +41 -0
  115. data/sig/method_ruby/models/entity_update_params.rbs +84 -0
  116. data/sig/method_ruby/models/entity_update_response.rbs +41 -0
  117. data/sig/method_ruby/models/ping_check_params.rbs +15 -0
  118. data/sig/method_ruby/models/ping_check_response.rbs +59 -0
  119. data/sig/method_ruby/models/resource_error.rbs +38 -0
  120. data/sig/method_ruby/models.rbs +23 -0
  121. data/sig/method_ruby/request_options.rbs +36 -0
  122. data/sig/method_ruby/resources/entities.rbs +41 -0
  123. data/sig/method_ruby/resources/ping.rbs +11 -0
  124. data/sig/method_ruby/version.rbs +3 -0
  125. metadata +196 -0
@@ -0,0 +1,85 @@
1
+ # typed: strong
2
+
3
+ module MethodRuby
4
+ class Client < MethodRuby::Internal::Transport::BaseClient
5
+ DEFAULT_MAX_RETRIES = 2
6
+
7
+ DEFAULT_TIMEOUT_IN_SECONDS = T.let(60.0, Float)
8
+
9
+ DEFAULT_INITIAL_RETRY_DELAY = T.let(0.5, Float)
10
+
11
+ DEFAULT_MAX_RETRY_DELAY = T.let(8.0, Float)
12
+
13
+ ENVIRONMENTS =
14
+ T.let(
15
+ {
16
+ production: "https://production.methodfi.com",
17
+ sandbox: "https://sandbox.methodfi.com",
18
+ dev: "https://dev.methodfi.com"
19
+ },
20
+ T::Hash[Symbol, String]
21
+ )
22
+
23
+ # API key-based authentication. Include your API key as a Bearer token.
24
+ sig { returns(String) }
25
+ attr_reader :api_key
26
+
27
+ # Entities represent your application's end-users. An Entity is the legal holder
28
+ # of an Account and can be either an individual or a corporation.
29
+ sig { returns(MethodRuby::Resources::Entities) }
30
+ attr_reader :entities
31
+
32
+ # API health check endpoint.
33
+ sig { returns(MethodRuby::Resources::Ping) }
34
+ attr_reader :ping
35
+
36
+ # @api private
37
+ sig do
38
+ override
39
+ .params(security: { bearer_auth: T::Boolean })
40
+ .returns(T::Hash[String, String])
41
+ end
42
+ private def auth_headers(security:)
43
+ end
44
+
45
+ # @api private
46
+ sig { returns(T::Hash[String, String]) }
47
+ private def bearer_auth
48
+ end
49
+
50
+ # Creates and returns a new client for interacting with the API.
51
+ sig do
52
+ params(
53
+ api_key: T.nilable(String),
54
+ environment: T.nilable(T.any(Symbol, String)),
55
+ base_url: T.nilable(String),
56
+ max_retries: Integer,
57
+ timeout: Float,
58
+ initial_retry_delay: Float,
59
+ max_retry_delay: Float
60
+ ).returns(T.attached_class)
61
+ end
62
+ def self.new(
63
+ # API key-based authentication. Include your API key as a Bearer token. Defaults
64
+ # to `ENV["METHOD_API_KEY"]`
65
+ api_key: ENV["METHOD_API_KEY"],
66
+ # Specifies the environment to use for the API.
67
+ #
68
+ # Each environment maps to a different base URL:
69
+ #
70
+ # - `production` corresponds to `https://production.methodfi.com`
71
+ # - `sandbox` corresponds to `https://sandbox.methodfi.com`
72
+ # - `dev` corresponds to `https://dev.methodfi.com`
73
+ environment: nil,
74
+ # Override the default base URL for the API, e.g.,
75
+ # `"https://api.example.com/v2/"`. Defaults to `ENV["METHOD_BASE_URL"]`
76
+ base_url: ENV["METHOD_BASE_URL"],
77
+ # Max number of retries to attempt after a failed retryable request.
78
+ max_retries: MethodRuby::Client::DEFAULT_MAX_RETRIES,
79
+ timeout: MethodRuby::Client::DEFAULT_TIMEOUT_IN_SECONDS,
80
+ initial_retry_delay: MethodRuby::Client::DEFAULT_INITIAL_RETRY_DELAY,
81
+ max_retry_delay: MethodRuby::Client::DEFAULT_MAX_RETRY_DELAY
82
+ )
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,205 @@
1
+ # typed: strong
2
+
3
+ module MethodRuby
4
+ module Errors
5
+ class Error < StandardError
6
+ sig { returns(T.nilable(StandardError)) }
7
+ attr_accessor :cause
8
+ end
9
+
10
+ class ConversionError < MethodRuby::Errors::Error
11
+ sig { returns(T.nilable(StandardError)) }
12
+ def cause
13
+ end
14
+
15
+ # @api private
16
+ sig do
17
+ params(
18
+ on: T::Class[StandardError],
19
+ method: Symbol,
20
+ target: T.anything,
21
+ value: T.anything,
22
+ cause: T.nilable(StandardError)
23
+ ).returns(T.attached_class)
24
+ end
25
+ def self.new(on:, method:, target:, value:, cause: nil)
26
+ end
27
+ end
28
+
29
+ class APIError < MethodRuby::Errors::Error
30
+ sig { returns(URI::Generic) }
31
+ attr_accessor :url
32
+
33
+ sig { returns(T.nilable(Integer)) }
34
+ attr_accessor :status
35
+
36
+ sig { returns(T.nilable(T::Hash[String, String])) }
37
+ attr_accessor :headers
38
+
39
+ sig { returns(T.nilable(T.anything)) }
40
+ attr_accessor :body
41
+
42
+ # @api private
43
+ sig do
44
+ params(
45
+ url: URI::Generic,
46
+ status: T.nilable(Integer),
47
+ headers: T.nilable(T::Hash[String, String]),
48
+ body: T.nilable(Object),
49
+ request: NilClass,
50
+ response: NilClass,
51
+ message: T.nilable(String)
52
+ ).returns(T.attached_class)
53
+ end
54
+ def self.new(
55
+ url:,
56
+ status: nil,
57
+ headers: nil,
58
+ body: nil,
59
+ request: nil,
60
+ response: nil,
61
+ message: nil
62
+ )
63
+ end
64
+ end
65
+
66
+ class APIConnectionError < MethodRuby::Errors::APIError
67
+ sig { returns(NilClass) }
68
+ attr_accessor :status
69
+
70
+ sig { returns(NilClass) }
71
+ attr_accessor :body
72
+
73
+ # @api private
74
+ sig do
75
+ params(
76
+ url: URI::Generic,
77
+ status: NilClass,
78
+ headers: T.nilable(T::Hash[String, String]),
79
+ body: NilClass,
80
+ request: NilClass,
81
+ response: NilClass,
82
+ message: T.nilable(String)
83
+ ).returns(T.attached_class)
84
+ end
85
+ def self.new(
86
+ url:,
87
+ status: nil,
88
+ headers: nil,
89
+ body: nil,
90
+ request: nil,
91
+ response: nil,
92
+ message: "Connection error."
93
+ )
94
+ end
95
+ end
96
+
97
+ class APITimeoutError < MethodRuby::Errors::APIConnectionError
98
+ # @api private
99
+ sig do
100
+ params(
101
+ url: URI::Generic,
102
+ status: NilClass,
103
+ headers: T.nilable(T::Hash[String, String]),
104
+ body: NilClass,
105
+ request: NilClass,
106
+ response: NilClass,
107
+ message: T.nilable(String)
108
+ ).returns(T.attached_class)
109
+ end
110
+ def self.new(
111
+ url:,
112
+ status: nil,
113
+ headers: nil,
114
+ body: nil,
115
+ request: nil,
116
+ response: nil,
117
+ message: "Request timed out."
118
+ )
119
+ end
120
+ end
121
+
122
+ class APIStatusError < MethodRuby::Errors::APIError
123
+ # @api private
124
+ sig do
125
+ params(
126
+ url: URI::Generic,
127
+ status: Integer,
128
+ headers: T.nilable(T::Hash[String, String]),
129
+ body: T.nilable(Object),
130
+ request: NilClass,
131
+ response: NilClass,
132
+ message: T.nilable(String)
133
+ ).returns(T.attached_class)
134
+ end
135
+ def self.for(
136
+ url:,
137
+ status:,
138
+ headers:,
139
+ body:,
140
+ request:,
141
+ response:,
142
+ message: nil
143
+ )
144
+ end
145
+
146
+ sig { returns(Integer) }
147
+ attr_accessor :status
148
+
149
+ # @api private
150
+ sig do
151
+ params(
152
+ url: URI::Generic,
153
+ status: Integer,
154
+ headers: T.nilable(T::Hash[String, String]),
155
+ body: T.nilable(Object),
156
+ request: NilClass,
157
+ response: NilClass,
158
+ message: T.nilable(String)
159
+ ).returns(T.attached_class)
160
+ end
161
+ def self.new(
162
+ url:,
163
+ status:,
164
+ headers:,
165
+ body:,
166
+ request:,
167
+ response:,
168
+ message: nil
169
+ )
170
+ end
171
+ end
172
+
173
+ class BadRequestError < MethodRuby::Errors::APIStatusError
174
+ HTTP_STATUS = 400
175
+ end
176
+
177
+ class AuthenticationError < MethodRuby::Errors::APIStatusError
178
+ HTTP_STATUS = 401
179
+ end
180
+
181
+ class PermissionDeniedError < MethodRuby::Errors::APIStatusError
182
+ HTTP_STATUS = 403
183
+ end
184
+
185
+ class NotFoundError < MethodRuby::Errors::APIStatusError
186
+ HTTP_STATUS = 404
187
+ end
188
+
189
+ class ConflictError < MethodRuby::Errors::APIStatusError
190
+ HTTP_STATUS = 409
191
+ end
192
+
193
+ class UnprocessableEntityError < MethodRuby::Errors::APIStatusError
194
+ HTTP_STATUS = 422
195
+ end
196
+
197
+ class RateLimitError < MethodRuby::Errors::APIStatusError
198
+ HTTP_STATUS = 429
199
+ end
200
+
201
+ class InternalServerError < MethodRuby::Errors::APIStatusError
202
+ HTTP_STATUS = T.let((500..), T::Range[Integer])
203
+ end
204
+ end
205
+ end
@@ -0,0 +1,37 @@
1
+ # typed: strong
2
+
3
+ module MethodRuby
4
+ class FilePart
5
+ sig { returns(T.any(Pathname, StringIO, IO, String)) }
6
+ attr_reader :content
7
+
8
+ sig { returns(T.nilable(String)) }
9
+ attr_reader :content_type
10
+
11
+ sig { returns(T.nilable(String)) }
12
+ attr_reader :filename
13
+
14
+ # @api private
15
+ sig { returns(String) }
16
+ private def read
17
+ end
18
+
19
+ sig { params(a: T.anything).returns(String) }
20
+ def to_json(*a)
21
+ end
22
+
23
+ sig { params(a: T.anything).returns(String) }
24
+ def to_yaml(*a)
25
+ end
26
+
27
+ sig do
28
+ params(
29
+ content: T.any(Pathname, StringIO, IO, String),
30
+ filename: T.nilable(T.any(Pathname, String)),
31
+ content_type: T.nilable(String)
32
+ ).returns(T.attached_class)
33
+ end
34
+ def self.new(content, filename: nil, content_type: nil)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,303 @@
1
+ # typed: strong
2
+
3
+ module MethodRuby
4
+ module Internal
5
+ module Transport
6
+ # @api private
7
+ class BaseClient
8
+ extend MethodRuby::Internal::Util::SorbetRuntimeSupport
9
+
10
+ abstract!
11
+
12
+ RequestComponents =
13
+ T.type_alias do
14
+ {
15
+ method: Symbol,
16
+ path: T.any(String, T::Array[String]),
17
+ query:
18
+ T.nilable(
19
+ T::Hash[String, T.nilable(T.any(T::Array[String], String))]
20
+ ),
21
+ headers:
22
+ T.nilable(
23
+ T::Hash[
24
+ String,
25
+ T.nilable(
26
+ T.any(
27
+ String,
28
+ Integer,
29
+ T::Array[T.nilable(T.any(String, Integer))]
30
+ )
31
+ )
32
+ ]
33
+ ),
34
+ body: T.nilable(T.anything),
35
+ unwrap:
36
+ T.nilable(
37
+ T.any(
38
+ Symbol,
39
+ Integer,
40
+ T::Array[T.any(Symbol, Integer)],
41
+ T.proc.params(arg0: T.anything).returns(T.anything)
42
+ )
43
+ ),
44
+ page:
45
+ T.nilable(
46
+ T::Class[
47
+ MethodRuby::Internal::Type::BasePage[
48
+ MethodRuby::Internal::Type::BaseModel
49
+ ]
50
+ ]
51
+ ),
52
+ stream: T.nilable(T::Class[T.anything]),
53
+ model: T.nilable(MethodRuby::Internal::Type::Converter::Input),
54
+ security: T.nilable({ bearer_auth: T::Boolean }),
55
+ options: T.nilable(MethodRuby::RequestOptions::OrHash)
56
+ }
57
+ end
58
+
59
+ RequestInput =
60
+ T.type_alias do
61
+ {
62
+ method: Symbol,
63
+ url: URI::Generic,
64
+ headers: T::Hash[String, String],
65
+ body: T.anything,
66
+ max_retries: Integer,
67
+ timeout: Float
68
+ }
69
+ end
70
+
71
+ # from whatwg fetch spec
72
+ MAX_REDIRECTS = 20
73
+
74
+ PLATFORM_HEADERS = T::Hash[String, String]
75
+
76
+ class << self
77
+ # @api private
78
+ sig do
79
+ params(
80
+ req:
81
+ MethodRuby::Internal::Transport::BaseClient::RequestComponents
82
+ ).void
83
+ end
84
+ def validate!(req)
85
+ end
86
+
87
+ # @api private
88
+ sig do
89
+ params(status: Integer, headers: T::Hash[String, String]).returns(
90
+ T::Boolean
91
+ )
92
+ end
93
+ def should_retry?(status, headers:)
94
+ end
95
+
96
+ # @api private
97
+ sig do
98
+ params(
99
+ request:
100
+ MethodRuby::Internal::Transport::BaseClient::RequestInput,
101
+ status: Integer,
102
+ response_headers: T::Hash[String, String]
103
+ ).returns(MethodRuby::Internal::Transport::BaseClient::RequestInput)
104
+ end
105
+ def follow_redirect(request, status:, response_headers:)
106
+ end
107
+
108
+ # @api private
109
+ sig do
110
+ params(
111
+ status: T.any(Integer, MethodRuby::Errors::APIConnectionError),
112
+ stream: T.nilable(T::Enumerable[String])
113
+ ).void
114
+ end
115
+ def reap_connection!(status, stream:)
116
+ end
117
+ end
118
+
119
+ sig { returns(URI::Generic) }
120
+ attr_reader :base_url
121
+
122
+ sig { returns(Float) }
123
+ attr_reader :timeout
124
+
125
+ sig { returns(Integer) }
126
+ attr_reader :max_retries
127
+
128
+ sig { returns(Float) }
129
+ attr_reader :initial_retry_delay
130
+
131
+ sig { returns(Float) }
132
+ attr_reader :max_retry_delay
133
+
134
+ sig { returns(T::Hash[String, String]) }
135
+ attr_reader :headers
136
+
137
+ sig { returns(T.nilable(String)) }
138
+ attr_reader :idempotency_header
139
+
140
+ # @api private
141
+ sig { returns(MethodRuby::Internal::Transport::PooledNetRequester) }
142
+ attr_reader :requester
143
+
144
+ # @api private
145
+ sig do
146
+ params(
147
+ base_url: String,
148
+ timeout: Float,
149
+ max_retries: Integer,
150
+ initial_retry_delay: Float,
151
+ max_retry_delay: Float,
152
+ headers:
153
+ T::Hash[
154
+ String,
155
+ T.nilable(
156
+ T.any(
157
+ String,
158
+ Integer,
159
+ T::Array[T.nilable(T.any(String, Integer))]
160
+ )
161
+ )
162
+ ],
163
+ idempotency_header: T.nilable(String)
164
+ ).returns(T.attached_class)
165
+ end
166
+ def self.new(
167
+ base_url:,
168
+ timeout: 0.0,
169
+ max_retries: 0,
170
+ initial_retry_delay: 0.0,
171
+ max_retry_delay: 0.0,
172
+ headers: {},
173
+ idempotency_header: nil
174
+ )
175
+ end
176
+
177
+ # @api private
178
+ sig { overridable.returns(T::Hash[String, String]) }
179
+ private def auth_headers
180
+ end
181
+
182
+ # @api private
183
+ sig { returns(String) }
184
+ private def user_agent
185
+ end
186
+
187
+ # @api private
188
+ sig { returns(String) }
189
+ private def generate_idempotency_key
190
+ end
191
+
192
+ # @api private
193
+ sig do
194
+ overridable
195
+ .params(
196
+ req:
197
+ MethodRuby::Internal::Transport::BaseClient::RequestComponents,
198
+ opts: MethodRuby::Internal::AnyHash
199
+ )
200
+ .returns(MethodRuby::Internal::Transport::BaseClient::RequestInput)
201
+ end
202
+ private def build_request(req, opts)
203
+ end
204
+
205
+ # @api private
206
+ sig do
207
+ params(
208
+ headers: T::Hash[String, String],
209
+ retry_count: Integer
210
+ ).returns(Float)
211
+ end
212
+ private def retry_delay(headers, retry_count:)
213
+ end
214
+
215
+ # @api private
216
+ sig do
217
+ params(
218
+ request: MethodRuby::Internal::Transport::BaseClient::RequestInput,
219
+ redirect_count: Integer,
220
+ retry_count: Integer,
221
+ send_retry_header: T::Boolean
222
+ ).returns([Integer, Net::HTTPResponse, T::Enumerable[String]])
223
+ end
224
+ def send_request(
225
+ request,
226
+ redirect_count:,
227
+ retry_count:,
228
+ send_retry_header:
229
+ )
230
+ end
231
+
232
+ # Execute the request specified by `req`. This is the method that all resource
233
+ # methods call into.
234
+ #
235
+ # @overload request(method, path, query: {}, headers: {}, body: nil, unwrap: nil, page: nil, stream: nil, model: MethodRuby::Internal::Type::Unknown, security: {bearer_auth: true}, options: {})
236
+ sig do
237
+ params(
238
+ method: Symbol,
239
+ path: T.any(String, T::Array[String]),
240
+ query:
241
+ T.nilable(
242
+ T::Hash[String, T.nilable(T.any(T::Array[String], String))]
243
+ ),
244
+ headers:
245
+ T.nilable(
246
+ T::Hash[
247
+ String,
248
+ T.nilable(
249
+ T.any(
250
+ String,
251
+ Integer,
252
+ T::Array[T.nilable(T.any(String, Integer))]
253
+ )
254
+ )
255
+ ]
256
+ ),
257
+ body: T.nilable(T.anything),
258
+ unwrap:
259
+ T.nilable(
260
+ T.any(
261
+ Symbol,
262
+ Integer,
263
+ T::Array[T.any(Symbol, Integer)],
264
+ T.proc.params(arg0: T.anything).returns(T.anything)
265
+ )
266
+ ),
267
+ page:
268
+ T.nilable(
269
+ T::Class[
270
+ MethodRuby::Internal::Type::BasePage[
271
+ MethodRuby::Internal::Type::BaseModel
272
+ ]
273
+ ]
274
+ ),
275
+ stream: T.nilable(T::Class[T.anything]),
276
+ model: T.nilable(MethodRuby::Internal::Type::Converter::Input),
277
+ security: T.nilable({ bearer_auth: T::Boolean }),
278
+ options: T.nilable(MethodRuby::RequestOptions::OrHash)
279
+ ).returns(T.anything)
280
+ end
281
+ def request(
282
+ method,
283
+ path,
284
+ query: {},
285
+ headers: {},
286
+ body: nil,
287
+ unwrap: nil,
288
+ page: nil,
289
+ stream: nil,
290
+ model: MethodRuby::Internal::Type::Unknown,
291
+ security: { bearer_auth: true },
292
+ options: {}
293
+ )
294
+ end
295
+
296
+ # @api private
297
+ sig { returns(String) }
298
+ def inspect
299
+ end
300
+ end
301
+ end
302
+ end
303
+ end
@@ -0,0 +1,84 @@
1
+ # typed: strong
2
+
3
+ module MethodRuby
4
+ module Internal
5
+ module Transport
6
+ # @api private
7
+ class PooledNetRequester
8
+ extend MethodRuby::Internal::Util::SorbetRuntimeSupport
9
+
10
+ Request =
11
+ T.type_alias do
12
+ {
13
+ method: Symbol,
14
+ url: URI::Generic,
15
+ headers: T::Hash[String, String],
16
+ body: T.anything,
17
+ deadline: Float
18
+ }
19
+ end
20
+
21
+ # from the golang stdlib
22
+ # https://github.com/golang/go/blob/c8eced8580028328fde7c03cbfcb720ce15b2358/src/net/http/transport.go#L49
23
+ KEEP_ALIVE_TIMEOUT = 30
24
+
25
+ DEFAULT_MAX_CONNECTIONS = T.let(T.unsafe(nil), Integer)
26
+
27
+ class << self
28
+ # @api private
29
+ sig do
30
+ params(cert_store: OpenSSL::X509::Store, url: URI::Generic).returns(
31
+ Net::HTTP
32
+ )
33
+ end
34
+ def connect(cert_store:, url:)
35
+ end
36
+
37
+ # @api private
38
+ sig { params(conn: Net::HTTP, deadline: Float).void }
39
+ def calibrate_socket_timeout(conn, deadline)
40
+ end
41
+
42
+ # @api private
43
+ sig do
44
+ params(
45
+ request:
46
+ MethodRuby::Internal::Transport::PooledNetRequester::Request,
47
+ blk: T.proc.params(arg0: String).void
48
+ ).returns([Net::HTTPGenericRequest, T.proc.void])
49
+ end
50
+ def build_request(request, &blk)
51
+ end
52
+ end
53
+
54
+ # @api private
55
+ sig do
56
+ params(
57
+ url: URI::Generic,
58
+ deadline: Float,
59
+ blk: T.proc.params(arg0: Net::HTTP).void
60
+ ).void
61
+ end
62
+ private def with_pool(url, deadline:, &blk)
63
+ end
64
+
65
+ # @api private
66
+ sig do
67
+ params(
68
+ request:
69
+ MethodRuby::Internal::Transport::PooledNetRequester::Request
70
+ ).returns([Integer, Net::HTTPResponse, T::Enumerable[String]])
71
+ end
72
+ def execute(request)
73
+ end
74
+
75
+ # @api private
76
+ sig { params(size: Integer).returns(T.attached_class) }
77
+ def self.new(
78
+ size: MethodRuby::Internal::Transport::PooledNetRequester::DEFAULT_MAX_CONNECTIONS
79
+ )
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end