prelude-sdk 0.1.0.pre.alpha.2 → 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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +74 -0
- data/README.md +29 -1
- data/lib/prelude_sdk/client.rb +4 -0
- data/lib/prelude_sdk/errors.rb +25 -11
- data/lib/prelude_sdk/file_part.rb +10 -7
- data/lib/prelude_sdk/internal/transport/base_client.rb +29 -11
- data/lib/prelude_sdk/internal/transport/pooled_net_requester.rb +41 -42
- data/lib/prelude_sdk/internal/type/array_of.rb +1 -0
- data/lib/prelude_sdk/internal/type/base_model.rb +4 -9
- data/lib/prelude_sdk/internal/type/base_page.rb +1 -1
- data/lib/prelude_sdk/internal/type/converter.rb +27 -0
- data/lib/prelude_sdk/internal/type/file_input.rb +7 -4
- data/lib/prelude_sdk/internal/type/hash_of.rb +1 -0
- data/lib/prelude_sdk/internal/type/union.rb +9 -7
- data/lib/prelude_sdk/internal/util.rb +9 -8
- data/lib/prelude_sdk/models/transactional_send_params.rb +41 -3
- data/lib/prelude_sdk/models/transactional_send_response.rb +7 -2
- data/lib/prelude_sdk/models/verification_check_response.rb +6 -1
- data/lib/prelude_sdk/models/verification_create_params.rb +57 -20
- data/lib/prelude_sdk/models/verification_create_response.rb +65 -12
- data/lib/prelude_sdk/models/verification_management_delete_phone_number_params.rb +32 -0
- data/lib/prelude_sdk/models/verification_management_delete_phone_number_response.rb +17 -0
- data/lib/prelude_sdk/models/verification_management_list_phone_numbers_params.rb +24 -0
- data/lib/prelude_sdk/models/verification_management_list_phone_numbers_response.rb +37 -0
- data/lib/prelude_sdk/models/verification_management_list_sender_ids_params.rb +14 -0
- data/lib/prelude_sdk/models/verification_management_list_sender_ids_response.rb +65 -0
- data/lib/prelude_sdk/models/verification_management_set_phone_number_params.rb +32 -0
- data/lib/prelude_sdk/models/verification_management_set_phone_number_response.rb +17 -0
- data/lib/prelude_sdk/models/verification_management_submit_sender_id_params.rb +22 -0
- data/lib/prelude_sdk/models/verification_management_submit_sender_id_response.rb +59 -0
- data/lib/prelude_sdk/models/watch_predict_params.rb +17 -3
- data/lib/prelude_sdk/models/watch_send_feedbacks_params.rb +18 -3
- data/lib/prelude_sdk/models.rb +14 -0
- data/lib/prelude_sdk/resources/transactional.rb +8 -3
- data/lib/prelude_sdk/resources/verification_management.rb +140 -0
- data/lib/prelude_sdk/version.rb +1 -1
- data/lib/prelude_sdk.rb +12 -0
- data/manifest.yaml +1 -0
- data/rbi/prelude_sdk/client.rbi +3 -0
- data/rbi/prelude_sdk/errors.rbi +31 -4
- data/rbi/prelude_sdk/file_part.rbi +1 -1
- data/rbi/prelude_sdk/internal/transport/base_client.rbi +10 -6
- data/rbi/prelude_sdk/internal/transport/pooled_net_requester.rbi +6 -2
- data/rbi/prelude_sdk/internal/type/base_model.rbi +8 -4
- data/rbi/prelude_sdk/internal/type/base_page.rbi +1 -1
- data/rbi/prelude_sdk/internal/type/converter.rbi +54 -0
- data/rbi/prelude_sdk/internal/type/union.rbi +9 -2
- data/rbi/prelude_sdk/internal/util.rbi +1 -1
- data/rbi/prelude_sdk/models/transactional_send_params.rbi +91 -2
- data/rbi/prelude_sdk/models/transactional_send_response.rbi +6 -2
- data/rbi/prelude_sdk/models/verification_check_response.rbi +7 -1
- data/rbi/prelude_sdk/models/verification_create_params.rbi +107 -23
- data/rbi/prelude_sdk/models/verification_create_response.rbi +160 -15
- data/rbi/prelude_sdk/models/verification_management_delete_phone_number_params.rbi +77 -0
- data/rbi/prelude_sdk/models/verification_management_delete_phone_number_response.rbi +30 -0
- data/rbi/prelude_sdk/models/verification_management_list_phone_numbers_params.rbi +64 -0
- data/rbi/prelude_sdk/models/verification_management_list_phone_numbers_response.rbi +87 -0
- data/rbi/prelude_sdk/models/verification_management_list_sender_ids_params.rbi +30 -0
- data/rbi/prelude_sdk/models/verification_management_list_sender_ids_response.rbi +175 -0
- data/rbi/prelude_sdk/models/verification_management_set_phone_number_params.rbi +77 -0
- data/rbi/prelude_sdk/models/verification_management_set_phone_number_response.rbi +30 -0
- data/rbi/prelude_sdk/models/verification_management_submit_sender_id_params.rbi +43 -0
- data/rbi/prelude_sdk/models/verification_management_submit_sender_id_response.rbi +117 -0
- data/rbi/prelude_sdk/models/watch_predict_params.rbi +19 -2
- data/rbi/prelude_sdk/models/watch_send_feedbacks_params.rbi +19 -2
- data/rbi/prelude_sdk/models.rbi +15 -0
- data/rbi/prelude_sdk/resources/transactional.rbi +17 -2
- data/rbi/prelude_sdk/resources/verification_management.rbi +112 -0
- data/sig/prelude_sdk/client.rbs +2 -0
- data/sig/prelude_sdk/errors.rbs +7 -0
- data/sig/prelude_sdk/file_part.rbs +1 -1
- data/sig/prelude_sdk/internal/transport/base_client.rbs +3 -1
- data/sig/prelude_sdk/internal/transport/pooled_net_requester.rbs +4 -1
- data/sig/prelude_sdk/internal/type/converter.rbs +17 -0
- data/sig/prelude_sdk/internal/type/union.rbs +2 -2
- data/sig/prelude_sdk/models/transactional_send_params.rbs +21 -0
- data/sig/prelude_sdk/models/verification_create_params.rbs +35 -16
- data/sig/prelude_sdk/models/verification_create_response.rbs +41 -16
- data/sig/prelude_sdk/models/verification_management_delete_phone_number_params.rbs +34 -0
- data/sig/prelude_sdk/models/verification_management_delete_phone_number_response.rbs +14 -0
- data/sig/prelude_sdk/models/verification_management_list_phone_numbers_params.rbs +26 -0
- data/sig/prelude_sdk/models/verification_management_list_phone_numbers_response.rbs +32 -0
- data/sig/prelude_sdk/models/verification_management_list_sender_ids_params.rbs +15 -0
- data/sig/prelude_sdk/models/verification_management_list_sender_ids_response.rbs +64 -0
- data/sig/prelude_sdk/models/verification_management_set_phone_number_params.rbs +34 -0
- data/sig/prelude_sdk/models/verification_management_set_phone_number_response.rbs +14 -0
- data/sig/prelude_sdk/models/verification_management_submit_sender_id_params.rbs +23 -0
- data/sig/prelude_sdk/models/verification_management_submit_sender_id_response.rbs +44 -0
- data/sig/prelude_sdk/models/watch_predict_params.rbs +7 -0
- data/sig/prelude_sdk/models/watch_send_feedbacks_params.rbs +7 -0
- data/sig/prelude_sdk/models.rbs +10 -0
- data/sig/prelude_sdk/resources/transactional.rbs +1 -0
- data/sig/prelude_sdk/resources/verification_management.rbs +33 -0
- metadata +37 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: bdd2764aef5a2905ae9ff686383745a878831c2402b1858f60025c4185f9fce1
|
|
4
|
+
data.tar.gz: be34c995e5c189bd7bfc38a03f30d0e399376ffdbb70f42c3776f64df56de7e4
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 953de3f45bdc0854d720388783118e6daff94fcfda5fa3de09bace85598b61e7165f87ac2439f1c275822e80f6811d711c055d2d8b5399824aec74f2dd715208
|
|
7
|
+
data.tar.gz: c7b590b961d3bcdb03aafbcc97fa3d4c80e0ac59a70a2dd79451000fe300b702c90a1cb30f7a6fa8c0604c73365f4e5fbb0da7a05e0df2aa77a1ee672ce5e008
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,79 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.0 (2025-11-17)
|
|
4
|
+
|
|
5
|
+
Full Changelog: [v0.1.0-alpha.3...v0.1.0](https://github.com/prelude-so/ruby-sdk/compare/v0.1.0-alpha.3...v0.1.0)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
* **api:** api update ([c9e65c1](https://github.com/prelude-so/ruby-sdk/commit/c9e65c116529da3a8e5aa86a562b7fed5cf4a97a))
|
|
10
|
+
* **api:** api update ([bf8dee6](https://github.com/prelude-so/ruby-sdk/commit/bf8dee60be19b83b817ece1f9004cfaec2e85e4f))
|
|
11
|
+
* **api:** api update ([9d565ad](https://github.com/prelude-so/ruby-sdk/commit/9d565ad99b6b46c7d17934bd68273f3d82fe9d85))
|
|
12
|
+
* **api:** api update ([4fd18f8](https://github.com/prelude-so/ruby-sdk/commit/4fd18f8a058510eb8d930d819d31cb6f6173f83a))
|
|
13
|
+
* **api:** api update ([69a221a](https://github.com/prelude-so/ruby-sdk/commit/69a221a42fcaec93f98d63caf9d17766be47fbc6))
|
|
14
|
+
* **api:** api update ([4af700e](https://github.com/prelude-so/ruby-sdk/commit/4af700e93bc5cf28d97ff79885834e81b57da1a4))
|
|
15
|
+
* **api:** api update ([0c33db9](https://github.com/prelude-so/ruby-sdk/commit/0c33db9825b569f3a89e225b154340c4c310479f))
|
|
16
|
+
* **api:** api update ([445cbad](https://github.com/prelude-so/ruby-sdk/commit/445cbadbafa387f8650e669062177e7224105de7))
|
|
17
|
+
* **api:** api update ([595d9ef](https://github.com/prelude-so/ruby-sdk/commit/595d9ef60705cb032562fd76150bb9aacf9626d6))
|
|
18
|
+
* **api:** expose phone numbers management methods ([f941fe5](https://github.com/prelude-so/ruby-sdk/commit/f941fe55ce85520986895f042146e59f192ed48d))
|
|
19
|
+
* **api:** expose verification management methods ([b9b9495](https://github.com/prelude-so/ruby-sdk/commit/b9b94955da54d2d44b0a1592abe73337e4087ec3))
|
|
20
|
+
* expose response headers for both streams and errors ([fc2ae79](https://github.com/prelude-so/ruby-sdk/commit/fc2ae79a34a537cda6aa82b63a0c26b83a393cd2))
|
|
21
|
+
* handle thread interrupts in the core HTTP client ([866b344](https://github.com/prelude-so/ruby-sdk/commit/866b344df136a37851b378b07f228c815ca79636))
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
### Bug Fixes
|
|
25
|
+
|
|
26
|
+
* absolutely qualified uris should always override the default ([68aaf0e](https://github.com/prelude-so/ruby-sdk/commit/68aaf0eb2327e02d5b031ec0a89e7b732ad420f7))
|
|
27
|
+
* always send `filename=...` for multipart requests where a file is expected ([da05b08](https://github.com/prelude-so/ruby-sdk/commit/da05b084037001a449e416128ccd45467e3c364b))
|
|
28
|
+
* better thread safety via early initializing SSL store during HTTP client creation ([5e8ee30](https://github.com/prelude-so/ruby-sdk/commit/5e8ee30cb5783924438c63e8235ae2b4c58eafcc))
|
|
29
|
+
* coroutine leaks from connection pool ([ed37e6b](https://github.com/prelude-so/ruby-sdk/commit/ed37e6b16456986d82b11232f097721ef8a40638))
|
|
30
|
+
* **internal:** use null byte as file separator in the fast formatting script ([d665d3a](https://github.com/prelude-so/ruby-sdk/commit/d665d3a0675b0b96be78135d06e683f1ec170321))
|
|
31
|
+
* shorten multipart boundary sep to less than RFC specificed max length ([bd7c735](https://github.com/prelude-so/ruby-sdk/commit/bd7c7352f57c8f18669454fe537e0e6a747333c4))
|
|
32
|
+
* should not reuse buffers for `IO.copy_stream` interop ([a81068b](https://github.com/prelude-so/ruby-sdk/commit/a81068b77b064aec1a6dcffa475259b664f6beb9))
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
### Performance Improvements
|
|
36
|
+
|
|
37
|
+
* faster code formatting ([0b96741](https://github.com/prelude-so/ruby-sdk/commit/0b9674139c6ec176f9778f4fd6ef0c21b260fd10))
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
### Chores
|
|
41
|
+
|
|
42
|
+
* allow fast-format to use bsd sed as well ([5e8c0c0](https://github.com/prelude-so/ruby-sdk/commit/5e8c0c0a63e8e20622e79102d7e17a59591a9b87))
|
|
43
|
+
* **client:** send user-agent header ([0da478a](https://github.com/prelude-so/ruby-sdk/commit/0da478a2be5493927b58d9f162626ca900d400d8))
|
|
44
|
+
* do not install brew dependencies in ./scripts/bootstrap by default ([4604e34](https://github.com/prelude-so/ruby-sdk/commit/4604e34fa43c84c180974e36ce957ff5e4afe515))
|
|
45
|
+
* ignore linter error for tests having large collections ([b76b678](https://github.com/prelude-so/ruby-sdk/commit/b76b678af0a7bf7de20974c5d6e87ab1cc5ca816))
|
|
46
|
+
* **internal:** codegen related update ([b5d6135](https://github.com/prelude-so/ruby-sdk/commit/b5d61356ba2806cb9d24ee7aeb982dd20485da3a))
|
|
47
|
+
|
|
48
|
+
## 0.1.0-alpha.3 (2025-09-02)
|
|
49
|
+
|
|
50
|
+
Full Changelog: [v0.1.0-alpha.2...v0.1.0-alpha.3](https://github.com/prelude-so/ruby-sdk/compare/v0.1.0-alpha.2...v0.1.0-alpha.3)
|
|
51
|
+
|
|
52
|
+
### Features
|
|
53
|
+
|
|
54
|
+
* **api:** add Ruby-specific rename transformation ([42dadd3](https://github.com/prelude-so/ruby-sdk/commit/42dadd3bddbb321fc9cf76542b26651807050fc4))
|
|
55
|
+
* **api:** api update ([036b7b2](https://github.com/prelude-so/ruby-sdk/commit/036b7b298dc4de946eeff885f8f2a0e9566e1de0))
|
|
56
|
+
* **api:** update via SDK Studio ([791c53f](https://github.com/prelude-so/ruby-sdk/commit/791c53fdbb730ded753d2eb227f87ff6e86ee1bd))
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
### Bug Fixes
|
|
60
|
+
|
|
61
|
+
* bump sorbet version and fix new type errors from the breaking change ([18e0dd1](https://github.com/prelude-so/ruby-sdk/commit/18e0dd1e8f90e1e77c74b491490931309a9cdd4b))
|
|
62
|
+
* **internal:** ensure sorbet test always runs serially ([73f6bb9](https://github.com/prelude-so/ruby-sdk/commit/73f6bb9d30db4eb38e746d74da4ff2eb81881080))
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
### Chores
|
|
66
|
+
|
|
67
|
+
* add json schema comment for rubocop.yml ([c6b0b40](https://github.com/prelude-so/ruby-sdk/commit/c6b0b40955adff0da669b9d6177ef37a4cbdbbcf))
|
|
68
|
+
* collect metadata from type DSL ([7bf4d61](https://github.com/prelude-so/ruby-sdk/commit/7bf4d61d21cbd50bb83986e147a5c29793400ca5))
|
|
69
|
+
* **internal:** allow streams to also be unwrapped on a per-row basis ([8572174](https://github.com/prelude-so/ruby-sdk/commit/8572174e262d9c6b7cc66a0894fd6d09184569f1))
|
|
70
|
+
* **internal:** increase visibility of internal helper method ([f04772f](https://github.com/prelude-so/ruby-sdk/commit/f04772fd6d66ba49a3d2f73d21f4538c7957bd28))
|
|
71
|
+
* **internal:** update comment in script ([a5fe28e](https://github.com/prelude-so/ruby-sdk/commit/a5fe28eacf22acdad6f621a1e6ee4e4dfb077d16))
|
|
72
|
+
* **internal:** update test skipping reason ([55f2205](https://github.com/prelude-so/ruby-sdk/commit/55f220596e6310b2d89fe3b460c02fdfe57b9e78))
|
|
73
|
+
* **internal:** version bump ([eb3405c](https://github.com/prelude-so/ruby-sdk/commit/eb3405ca5ae74eb673b5e0cbafde6943e83314fa))
|
|
74
|
+
* update @stainless-api/prism-cli to v5.15.0 ([58f1de5](https://github.com/prelude-so/ruby-sdk/commit/58f1de5007b309c40d197031aeea1e5574213bbe))
|
|
75
|
+
* update contribute.md ([65b7754](https://github.com/prelude-so/ruby-sdk/commit/65b7754e9bfac05f99efcc9a48200fada3940535))
|
|
76
|
+
|
|
3
77
|
## 0.1.0-alpha.2 (2025-06-27)
|
|
4
78
|
|
|
5
79
|
Full Changelog: [v0.1.0-alpha.1...v0.1.0-alpha.2](https://github.com/prelude-so/ruby-sdk/compare/v0.1.0-alpha.1...v0.1.0-alpha.2)
|
data/README.md
CHANGED
|
@@ -17,7 +17,7 @@ To use this gem, install via Bundler by adding the following to your application
|
|
|
17
17
|
<!-- x-release-please-start-version -->
|
|
18
18
|
|
|
19
19
|
```ruby
|
|
20
|
-
gem "prelude-sdk", "~> 0.1.0
|
|
20
|
+
gem "prelude-sdk", "~> 0.1.0"
|
|
21
21
|
```
|
|
22
22
|
|
|
23
23
|
<!-- x-release-please-end -->
|
|
@@ -202,6 +202,34 @@ params = PreludeSDK::VerificationCreateParams.new(
|
|
|
202
202
|
prelude.verification.create(**params)
|
|
203
203
|
```
|
|
204
204
|
|
|
205
|
+
### Enums
|
|
206
|
+
|
|
207
|
+
Since this library does not depend on `sorbet-runtime`, it cannot provide [`T::Enum`](https://sorbet.org/docs/tenum) instances. Instead, we provide "tagged symbols" instead, which is always a primitive at runtime:
|
|
208
|
+
|
|
209
|
+
```ruby
|
|
210
|
+
# :allow
|
|
211
|
+
puts(PreludeSDK::VerificationManagementDeletePhoneNumberParams::Action::ALLOW)
|
|
212
|
+
|
|
213
|
+
# Revealed type: `T.all(PreludeSDK::VerificationManagementDeletePhoneNumberParams::Action, Symbol)`
|
|
214
|
+
T.reveal_type(PreludeSDK::VerificationManagementDeletePhoneNumberParams::Action::ALLOW)
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
Enum parameters have a "relaxed" type, so you can either pass in enum constants or their literal value:
|
|
218
|
+
|
|
219
|
+
```ruby
|
|
220
|
+
# Using the enum constants preserves the tagged type information:
|
|
221
|
+
prelude.verification_management.delete_phone_number(
|
|
222
|
+
action: PreludeSDK::VerificationManagementDeletePhoneNumberParams::Action::ALLOW,
|
|
223
|
+
# …
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
# Literal values are also permissible:
|
|
227
|
+
prelude.verification_management.delete_phone_number(
|
|
228
|
+
action: :allow,
|
|
229
|
+
# …
|
|
230
|
+
)
|
|
231
|
+
```
|
|
232
|
+
|
|
205
233
|
## Versioning
|
|
206
234
|
|
|
207
235
|
This package follows [SemVer](https://semver.org/spec/v2.0.0.html) conventions. As the library is in initial development and has a major version of `0`, APIs may change at any time.
|
data/lib/prelude_sdk/client.rb
CHANGED
|
@@ -28,6 +28,9 @@ module PreludeSDK
|
|
|
28
28
|
# @return [PreludeSDK::Resources::Verification]
|
|
29
29
|
attr_reader :verification
|
|
30
30
|
|
|
31
|
+
# @return [PreludeSDK::Resources::VerificationManagement]
|
|
32
|
+
attr_reader :verification_management
|
|
33
|
+
|
|
31
34
|
# @return [PreludeSDK::Resources::Watch]
|
|
32
35
|
attr_reader :watch
|
|
33
36
|
|
|
@@ -81,6 +84,7 @@ module PreludeSDK
|
|
|
81
84
|
@lookup = PreludeSDK::Resources::Lookup.new(client: self)
|
|
82
85
|
@transactional = PreludeSDK::Resources::Transactional.new(client: self)
|
|
83
86
|
@verification = PreludeSDK::Resources::Verification.new(client: self)
|
|
87
|
+
@verification_management = PreludeSDK::Resources::VerificationManagement.new(client: self)
|
|
84
88
|
@watch = PreludeSDK::Resources::Watch.new(client: self)
|
|
85
89
|
end
|
|
86
90
|
end
|
data/lib/prelude_sdk/errors.rb
CHANGED
|
@@ -40,6 +40,9 @@ module PreludeSDK
|
|
|
40
40
|
# @return [Integer, nil]
|
|
41
41
|
attr_accessor :status
|
|
42
42
|
|
|
43
|
+
# @return [Hash{String=>String}, nil]
|
|
44
|
+
attr_accessor :headers
|
|
45
|
+
|
|
43
46
|
# @return [Object, nil]
|
|
44
47
|
attr_accessor :body
|
|
45
48
|
|
|
@@ -47,13 +50,15 @@ module PreludeSDK
|
|
|
47
50
|
#
|
|
48
51
|
# @param url [URI::Generic]
|
|
49
52
|
# @param status [Integer, nil]
|
|
53
|
+
# @param headers [Hash{String=>String}, nil]
|
|
50
54
|
# @param body [Object, nil]
|
|
51
55
|
# @param request [nil]
|
|
52
56
|
# @param response [nil]
|
|
53
57
|
# @param message [String, nil]
|
|
54
|
-
def initialize(url:, status: nil, body: nil, request: nil, response: nil, message: nil)
|
|
58
|
+
def initialize(url:, status: nil, headers: nil, body: nil, request: nil, response: nil, message: nil)
|
|
55
59
|
@url = url
|
|
56
60
|
@status = status
|
|
61
|
+
@headers = headers
|
|
57
62
|
@body = body
|
|
58
63
|
@request = request
|
|
59
64
|
@response = response
|
|
@@ -74,6 +79,7 @@ module PreludeSDK
|
|
|
74
79
|
#
|
|
75
80
|
# @param url [URI::Generic]
|
|
76
81
|
# @param status [nil]
|
|
82
|
+
# @param headers [Hash{String=>String}, nil]
|
|
77
83
|
# @param body [nil]
|
|
78
84
|
# @param request [nil]
|
|
79
85
|
# @param response [nil]
|
|
@@ -81,6 +87,7 @@ module PreludeSDK
|
|
|
81
87
|
def initialize(
|
|
82
88
|
url:,
|
|
83
89
|
status: nil,
|
|
90
|
+
headers: nil,
|
|
84
91
|
body: nil,
|
|
85
92
|
request: nil,
|
|
86
93
|
response: nil,
|
|
@@ -95,6 +102,7 @@ module PreludeSDK
|
|
|
95
102
|
#
|
|
96
103
|
# @param url [URI::Generic]
|
|
97
104
|
# @param status [nil]
|
|
105
|
+
# @param headers [Hash{String=>String}, nil]
|
|
98
106
|
# @param body [nil]
|
|
99
107
|
# @param request [nil]
|
|
100
108
|
# @param response [nil]
|
|
@@ -102,6 +110,7 @@ module PreludeSDK
|
|
|
102
110
|
def initialize(
|
|
103
111
|
url:,
|
|
104
112
|
status: nil,
|
|
113
|
+
headers: nil,
|
|
105
114
|
body: nil,
|
|
106
115
|
request: nil,
|
|
107
116
|
response: nil,
|
|
@@ -116,21 +125,24 @@ module PreludeSDK
|
|
|
116
125
|
#
|
|
117
126
|
# @param url [URI::Generic]
|
|
118
127
|
# @param status [Integer]
|
|
128
|
+
# @param headers [Hash{String=>String}, nil]
|
|
119
129
|
# @param body [Object, nil]
|
|
120
130
|
# @param request [nil]
|
|
121
131
|
# @param response [nil]
|
|
122
132
|
# @param message [String, nil]
|
|
123
133
|
#
|
|
124
134
|
# @return [self]
|
|
125
|
-
def self.for(url:, status:, body:, request:, response:, message: nil)
|
|
126
|
-
kwargs =
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
135
|
+
def self.for(url:, status:, headers:, body:, request:, response:, message: nil)
|
|
136
|
+
kwargs =
|
|
137
|
+
{
|
|
138
|
+
url: url,
|
|
139
|
+
status: status,
|
|
140
|
+
headers: headers,
|
|
141
|
+
body: body,
|
|
142
|
+
request: request,
|
|
143
|
+
response: response,
|
|
144
|
+
message: message
|
|
145
|
+
}
|
|
134
146
|
|
|
135
147
|
case status
|
|
136
148
|
in 400
|
|
@@ -162,15 +174,17 @@ module PreludeSDK
|
|
|
162
174
|
#
|
|
163
175
|
# @param url [URI::Generic]
|
|
164
176
|
# @param status [Integer]
|
|
177
|
+
# @param headers [Hash{String=>String}, nil]
|
|
165
178
|
# @param body [Object, nil]
|
|
166
179
|
# @param request [nil]
|
|
167
180
|
# @param response [nil]
|
|
168
181
|
# @param message [String, nil]
|
|
169
|
-
def initialize(url:, status:, body:, request:, response:, message: nil)
|
|
182
|
+
def initialize(url:, status:, headers:, body:, request:, response:, message: nil)
|
|
170
183
|
message ||= {url: url.to_s, status: status, body: body}
|
|
171
184
|
super(
|
|
172
185
|
url: url,
|
|
173
186
|
status: status,
|
|
187
|
+
headers: headers,
|
|
174
188
|
body: body,
|
|
175
189
|
request: request,
|
|
176
190
|
response: response,
|
|
@@ -38,18 +38,21 @@ module PreludeSDK
|
|
|
38
38
|
def to_yaml(*a) = read.to_yaml(*a)
|
|
39
39
|
|
|
40
40
|
# @param content [Pathname, StringIO, IO, String]
|
|
41
|
-
# @param filename [String, nil]
|
|
41
|
+
# @param filename [Pathname, String, nil]
|
|
42
42
|
# @param content_type [String, nil]
|
|
43
43
|
def initialize(content, filename: nil, content_type: nil)
|
|
44
|
-
@
|
|
44
|
+
@content_type = content_type
|
|
45
45
|
@filename =
|
|
46
|
-
case content
|
|
47
|
-
in Pathname
|
|
48
|
-
|
|
46
|
+
case [filename, (@content = content)]
|
|
47
|
+
in [String | Pathname, _]
|
|
48
|
+
::File.basename(filename)
|
|
49
|
+
in [nil, Pathname]
|
|
50
|
+
content.basename.to_path
|
|
51
|
+
in [nil, IO]
|
|
52
|
+
content.to_path
|
|
49
53
|
else
|
|
50
|
-
filename
|
|
54
|
+
filename
|
|
51
55
|
end
|
|
52
|
-
@content_type = content_type
|
|
53
56
|
end
|
|
54
57
|
end
|
|
55
58
|
end
|
|
@@ -47,7 +47,7 @@ module PreludeSDK
|
|
|
47
47
|
# @api private
|
|
48
48
|
#
|
|
49
49
|
# @param status [Integer]
|
|
50
|
-
# @param headers [Hash{String=>String}
|
|
50
|
+
# @param headers [Hash{String=>String}]
|
|
51
51
|
#
|
|
52
52
|
# @return [Boolean]
|
|
53
53
|
def should_retry?(status, headers:)
|
|
@@ -85,7 +85,7 @@ module PreludeSDK
|
|
|
85
85
|
#
|
|
86
86
|
# @param status [Integer]
|
|
87
87
|
#
|
|
88
|
-
# @param response_headers [Hash{String=>String}
|
|
88
|
+
# @param response_headers [Hash{String=>String}]
|
|
89
89
|
#
|
|
90
90
|
# @return [Hash{Symbol=>Object}]
|
|
91
91
|
def follow_redirect(request, status:, response_headers:)
|
|
@@ -201,7 +201,8 @@ module PreludeSDK
|
|
|
201
201
|
self.class::PLATFORM_HEADERS,
|
|
202
202
|
{
|
|
203
203
|
"accept" => "application/json",
|
|
204
|
-
"content-type" => "application/json"
|
|
204
|
+
"content-type" => "application/json",
|
|
205
|
+
"user-agent" => user_agent
|
|
205
206
|
},
|
|
206
207
|
headers
|
|
207
208
|
)
|
|
@@ -219,6 +220,11 @@ module PreludeSDK
|
|
|
219
220
|
# @return [Hash{String=>String}]
|
|
220
221
|
private def auth_headers = {}
|
|
221
222
|
|
|
223
|
+
# @api private
|
|
224
|
+
#
|
|
225
|
+
# @return [String]
|
|
226
|
+
private def user_agent = "#{self.class.name}/Ruby #{PreludeSDK::VERSION}"
|
|
227
|
+
|
|
222
228
|
# @api private
|
|
223
229
|
#
|
|
224
230
|
# @return [String]
|
|
@@ -365,7 +371,7 @@ module PreludeSDK
|
|
|
365
371
|
#
|
|
366
372
|
# @raise [PreludeSDK::Errors::APIError]
|
|
367
373
|
# @return [Array(Integer, Net::HTTPResponse, Enumerable<String>)]
|
|
368
|
-
|
|
374
|
+
def send_request(request, redirect_count:, retry_count:, send_retry_header:)
|
|
369
375
|
url, headers, max_retries, timeout = request.fetch_values(:url, :headers, :max_retries, :timeout)
|
|
370
376
|
input = {**request.except(:timeout), deadline: PreludeSDK::Internal::Util.monotonic_secs + timeout}
|
|
371
377
|
|
|
@@ -378,6 +384,7 @@ module PreludeSDK
|
|
|
378
384
|
rescue PreludeSDK::Errors::APIConnectionError => e
|
|
379
385
|
status = e
|
|
380
386
|
end
|
|
387
|
+
headers = PreludeSDK::Internal::Util.normalized_headers(response&.each_header&.to_h)
|
|
381
388
|
|
|
382
389
|
case status
|
|
383
390
|
in ..299
|
|
@@ -390,7 +397,7 @@ module PreludeSDK
|
|
|
390
397
|
in 300..399
|
|
391
398
|
self.class.reap_connection!(status, stream: stream)
|
|
392
399
|
|
|
393
|
-
request = self.class.follow_redirect(request, status: status, response_headers:
|
|
400
|
+
request = self.class.follow_redirect(request, status: status, response_headers: headers)
|
|
394
401
|
send_request(
|
|
395
402
|
request,
|
|
396
403
|
redirect_count: redirect_count + 1,
|
|
@@ -399,9 +406,9 @@ module PreludeSDK
|
|
|
399
406
|
)
|
|
400
407
|
in PreludeSDK::Errors::APIConnectionError if retry_count >= max_retries
|
|
401
408
|
raise status
|
|
402
|
-
in (400..) if retry_count >= max_retries || !self.class.should_retry?(status, headers:
|
|
409
|
+
in (400..) if retry_count >= max_retries || !self.class.should_retry?(status, headers: headers)
|
|
403
410
|
decoded = Kernel.then do
|
|
404
|
-
PreludeSDK::Internal::Util.decode_content(
|
|
411
|
+
PreludeSDK::Internal::Util.decode_content(headers, stream: stream, suppress_error: true)
|
|
405
412
|
ensure
|
|
406
413
|
self.class.reap_connection!(status, stream: stream)
|
|
407
414
|
end
|
|
@@ -409,6 +416,7 @@ module PreludeSDK
|
|
|
409
416
|
raise PreludeSDK::Errors::APIStatusError.for(
|
|
410
417
|
url: url,
|
|
411
418
|
status: status,
|
|
419
|
+
headers: headers,
|
|
412
420
|
body: decoded,
|
|
413
421
|
request: nil,
|
|
414
422
|
response: response
|
|
@@ -471,6 +479,7 @@ module PreludeSDK
|
|
|
471
479
|
self.class.validate!(req)
|
|
472
480
|
model = req.fetch(:model) { PreludeSDK::Internal::Type::Unknown }
|
|
473
481
|
opts = req[:options].to_h
|
|
482
|
+
unwrap = req[:unwrap]
|
|
474
483
|
PreludeSDK::RequestOptions.validate!(opts)
|
|
475
484
|
request = build_request(req.except(:options), opts)
|
|
476
485
|
url = request.fetch(:url)
|
|
@@ -484,14 +493,23 @@ module PreludeSDK
|
|
|
484
493
|
send_retry_header: send_retry_header
|
|
485
494
|
)
|
|
486
495
|
|
|
487
|
-
|
|
496
|
+
headers = PreludeSDK::Internal::Util.normalized_headers(response.each_header.to_h)
|
|
497
|
+
decoded = PreludeSDK::Internal::Util.decode_content(headers, stream: stream)
|
|
488
498
|
case req
|
|
489
499
|
in {stream: Class => st}
|
|
490
|
-
st.new(
|
|
500
|
+
st.new(
|
|
501
|
+
model: model,
|
|
502
|
+
url: url,
|
|
503
|
+
status: status,
|
|
504
|
+
headers: headers,
|
|
505
|
+
response: response,
|
|
506
|
+
unwrap: unwrap,
|
|
507
|
+
stream: decoded
|
|
508
|
+
)
|
|
491
509
|
in {page: Class => page}
|
|
492
|
-
page.new(client: self, req: req, headers:
|
|
510
|
+
page.new(client: self, req: req, headers: headers, page_data: decoded)
|
|
493
511
|
else
|
|
494
|
-
unwrapped = PreludeSDK::Internal::Util.dig(decoded,
|
|
512
|
+
unwrapped = PreludeSDK::Internal::Util.dig(decoded, unwrap)
|
|
495
513
|
PreludeSDK::Internal::Type::Converter.coerce(model, unwrapped)
|
|
496
514
|
end
|
|
497
515
|
end
|
|
@@ -16,10 +16,11 @@ module PreludeSDK
|
|
|
16
16
|
class << self
|
|
17
17
|
# @api private
|
|
18
18
|
#
|
|
19
|
+
# @param cert_store [OpenSSL::X509::Store]
|
|
19
20
|
# @param url [URI::Generic]
|
|
20
21
|
#
|
|
21
22
|
# @return [Net::HTTP]
|
|
22
|
-
def connect(url)
|
|
23
|
+
def connect(cert_store:, url:)
|
|
23
24
|
port =
|
|
24
25
|
case [url.port, url.scheme]
|
|
25
26
|
in [Integer, _]
|
|
@@ -33,6 +34,8 @@ module PreludeSDK
|
|
|
33
34
|
Net::HTTP.new(url.host, port).tap do
|
|
34
35
|
_1.use_ssl = %w[https wss].include?(url.scheme)
|
|
35
36
|
_1.max_retries = 0
|
|
37
|
+
|
|
38
|
+
(_1.cert_store = cert_store) if _1.use_ssl?
|
|
36
39
|
end
|
|
37
40
|
end
|
|
38
41
|
|
|
@@ -102,7 +105,7 @@ module PreludeSDK
|
|
|
102
105
|
pool =
|
|
103
106
|
@mutex.synchronize do
|
|
104
107
|
@pools[origin] ||= ConnectionPool.new(size: @size) do
|
|
105
|
-
self.class.connect(url)
|
|
108
|
+
self.class.connect(cert_store: @cert_store, url: url)
|
|
106
109
|
end
|
|
107
110
|
end
|
|
108
111
|
|
|
@@ -128,37 +131,47 @@ module PreludeSDK
|
|
|
128
131
|
url, deadline = request.fetch_values(:url, :deadline)
|
|
129
132
|
|
|
130
133
|
req = nil
|
|
131
|
-
eof = false
|
|
132
134
|
finished = false
|
|
133
|
-
closing = nil
|
|
134
135
|
|
|
135
136
|
# rubocop:disable Metrics/BlockLength
|
|
136
137
|
enum = Enumerator.new do |y|
|
|
137
|
-
|
|
138
|
-
next if finished
|
|
139
|
-
|
|
140
|
-
req, closing = self.class.build_request(request) do
|
|
141
|
-
self.class.calibrate_socket_timeout(conn, deadline)
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
self.class.calibrate_socket_timeout(conn, deadline)
|
|
145
|
-
unless conn.started?
|
|
146
|
-
conn.keep_alive_timeout = self.class::KEEP_ALIVE_TIMEOUT
|
|
147
|
-
conn.start
|
|
148
|
-
end
|
|
138
|
+
next if finished
|
|
149
139
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
140
|
+
with_pool(url, deadline: deadline) do |conn|
|
|
141
|
+
eof = false
|
|
142
|
+
closing = nil
|
|
143
|
+
::Thread.handle_interrupt(Object => :never) do
|
|
144
|
+
::Thread.handle_interrupt(Object => :immediate) do
|
|
145
|
+
req, closing = self.class.build_request(request) do
|
|
146
|
+
self.class.calibrate_socket_timeout(conn, deadline)
|
|
147
|
+
end
|
|
154
148
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
149
|
+
self.class.calibrate_socket_timeout(conn, deadline)
|
|
150
|
+
unless conn.started?
|
|
151
|
+
conn.keep_alive_timeout = self.class::KEEP_ALIVE_TIMEOUT
|
|
152
|
+
conn.start
|
|
153
|
+
end
|
|
158
154
|
|
|
159
155
|
self.class.calibrate_socket_timeout(conn, deadline)
|
|
156
|
+
conn.request(req) do |rsp|
|
|
157
|
+
y << [req, rsp]
|
|
158
|
+
break if finished
|
|
159
|
+
|
|
160
|
+
rsp.read_body do |bytes|
|
|
161
|
+
y << bytes.force_encoding(Encoding::BINARY)
|
|
162
|
+
break if finished
|
|
163
|
+
|
|
164
|
+
self.class.calibrate_socket_timeout(conn, deadline)
|
|
165
|
+
end
|
|
166
|
+
eof = true
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
ensure
|
|
170
|
+
begin
|
|
171
|
+
conn.finish if !eof && conn&.started?
|
|
172
|
+
ensure
|
|
173
|
+
closing&.call
|
|
160
174
|
end
|
|
161
|
-
eof = true
|
|
162
175
|
end
|
|
163
176
|
end
|
|
164
177
|
rescue Timeout::Error
|
|
@@ -168,17 +181,10 @@ module PreludeSDK
|
|
|
168
181
|
end
|
|
169
182
|
# rubocop:enable Metrics/BlockLength
|
|
170
183
|
|
|
171
|
-
|
|
184
|
+
_, response = enum.next
|
|
172
185
|
body = PreludeSDK::Internal::Util.fused_enum(enum, external: true) do
|
|
173
186
|
finished = true
|
|
174
|
-
|
|
175
|
-
enum.next
|
|
176
|
-
rescue StopIteration
|
|
177
|
-
nil
|
|
178
|
-
end
|
|
179
|
-
ensure
|
|
180
|
-
conn.finish if !eof && conn&.started?
|
|
181
|
-
closing&.call
|
|
187
|
+
loop { enum.next }
|
|
182
188
|
end
|
|
183
189
|
[Integer(response.code), response, body]
|
|
184
190
|
end
|
|
@@ -189,19 +195,12 @@ module PreludeSDK
|
|
|
189
195
|
def initialize(size: self.class::DEFAULT_MAX_CONNECTIONS)
|
|
190
196
|
@mutex = Mutex.new
|
|
191
197
|
@size = size
|
|
198
|
+
@cert_store = OpenSSL::X509::Store.new.tap(&:set_default_paths)
|
|
192
199
|
@pools = {}
|
|
193
200
|
end
|
|
194
201
|
|
|
195
202
|
define_sorbet_constant!(:Request) do
|
|
196
|
-
T.type_alias
|
|
197
|
-
{
|
|
198
|
-
method: Symbol,
|
|
199
|
-
url: URI::Generic,
|
|
200
|
-
headers: T::Hash[String, String],
|
|
201
|
-
body: T.anything,
|
|
202
|
-
deadline: Float
|
|
203
|
-
}
|
|
204
|
-
end
|
|
203
|
+
T.type_alias { {method: Symbol, url: URI::Generic, headers: T::Hash[String, String], body: T.anything, deadline: Float} }
|
|
205
204
|
end
|
|
206
205
|
end
|
|
207
206
|
end
|
|
@@ -148,6 +148,7 @@ module PreludeSDK
|
|
|
148
148
|
# @option spec [Boolean] :"nil?"
|
|
149
149
|
def initialize(type_info, spec = {})
|
|
150
150
|
@item_type_fn = PreludeSDK::Internal::Type::Converter.type_info(type_info || spec)
|
|
151
|
+
@meta = PreludeSDK::Internal::Type::Converter.meta_info(type_info, spec)
|
|
151
152
|
@nilable = spec.fetch(:nil?, false)
|
|
152
153
|
end
|
|
153
154
|
|
|
@@ -52,6 +52,7 @@ module PreludeSDK
|
|
|
52
52
|
#
|
|
53
53
|
# @option spec [Boolean] :"nil?"
|
|
54
54
|
private def add_field(name_sym, required:, type_info:, spec:)
|
|
55
|
+
meta = PreludeSDK::Internal::Type::Converter.meta_info(type_info, spec)
|
|
55
56
|
type_fn, info =
|
|
56
57
|
case type_info
|
|
57
58
|
in Proc | PreludeSDK::Internal::Type::Converter | Class
|
|
@@ -63,14 +64,7 @@ module PreludeSDK
|
|
|
63
64
|
setter = :"#{name_sym}="
|
|
64
65
|
api_name = info.fetch(:api_name, name_sym)
|
|
65
66
|
nilable = info.fetch(:nil?, false)
|
|
66
|
-
const =
|
|
67
|
-
info.fetch(
|
|
68
|
-
:const,
|
|
69
|
-
PreludeSDK::Internal::OMIT
|
|
70
|
-
)
|
|
71
|
-
else
|
|
72
|
-
PreludeSDK::Internal::OMIT
|
|
73
|
-
end
|
|
67
|
+
const = required && !nilable ? info.fetch(:const, PreludeSDK::Internal::OMIT) : PreludeSDK::Internal::OMIT
|
|
74
68
|
|
|
75
69
|
[name_sym, setter].each { undef_method(_1) } if known_fields.key?(name_sym)
|
|
76
70
|
|
|
@@ -81,7 +75,8 @@ module PreludeSDK
|
|
|
81
75
|
required: required,
|
|
82
76
|
nilable: nilable,
|
|
83
77
|
const: const,
|
|
84
|
-
type_fn: type_fn
|
|
78
|
+
type_fn: type_fn,
|
|
79
|
+
meta: meta
|
|
85
80
|
}
|
|
86
81
|
|
|
87
82
|
define_method(setter) do |value|
|
|
@@ -39,7 +39,7 @@ module PreludeSDK
|
|
|
39
39
|
#
|
|
40
40
|
# @param client [PreludeSDK::Internal::Transport::BaseClient]
|
|
41
41
|
# @param req [Hash{Symbol=>Object}]
|
|
42
|
-
# @param headers [Hash{String=>String}
|
|
42
|
+
# @param headers [Hash{String=>String}]
|
|
43
43
|
# @param page_data [Object]
|
|
44
44
|
def initialize(client:, req:, headers:, page_data:)
|
|
45
45
|
@client = client
|
|
@@ -98,6 +98,33 @@ module PreludeSDK
|
|
|
98
98
|
end
|
|
99
99
|
end
|
|
100
100
|
|
|
101
|
+
# @api private
|
|
102
|
+
#
|
|
103
|
+
# @param type_info [Hash{Symbol=>Object}, Proc, PreludeSDK::Internal::Type::Converter, Class] .
|
|
104
|
+
#
|
|
105
|
+
# @option type_info [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
|
|
106
|
+
#
|
|
107
|
+
# @option type_info [Proc] :enum
|
|
108
|
+
#
|
|
109
|
+
# @option type_info [Proc] :union
|
|
110
|
+
#
|
|
111
|
+
# @option type_info [Boolean] :"nil?"
|
|
112
|
+
#
|
|
113
|
+
# @param spec [Hash{Symbol=>Object}, Proc, PreludeSDK::Internal::Type::Converter, Class] .
|
|
114
|
+
#
|
|
115
|
+
# @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
|
|
116
|
+
#
|
|
117
|
+
# @option spec [Proc] :enum
|
|
118
|
+
#
|
|
119
|
+
# @option spec [Proc] :union
|
|
120
|
+
#
|
|
121
|
+
# @option spec [Boolean] :"nil?"
|
|
122
|
+
#
|
|
123
|
+
# @return [Hash{Symbol=>Object}]
|
|
124
|
+
def meta_info(type_info, spec)
|
|
125
|
+
[spec, type_info].grep(Hash).first.to_h.except(:const, :enum, :union, :nil?)
|
|
126
|
+
end
|
|
127
|
+
|
|
101
128
|
# @api private
|
|
102
129
|
#
|
|
103
130
|
# @param translate_names [Boolean]
|
|
@@ -82,17 +82,20 @@ module PreludeSDK
|
|
|
82
82
|
#
|
|
83
83
|
# @return [Pathname, StringIO, IO, String, Object]
|
|
84
84
|
def dump(value, state:)
|
|
85
|
-
# rubocop:disable Lint/DuplicateBranch
|
|
86
85
|
case value
|
|
86
|
+
in StringIO | String
|
|
87
|
+
# https://datatracker.ietf.org/doc/html/rfc7578#section-4.2
|
|
88
|
+
# while not required, a filename is recommended, and in practice many servers do expect this
|
|
89
|
+
PreludeSDK::FilePart.new(value, filename: "upload")
|
|
87
90
|
in IO
|
|
88
91
|
state[:can_retry] = false
|
|
92
|
+
value.to_path.nil? ? PreludeSDK::FilePart.new(value, filename: "upload") : value
|
|
89
93
|
in PreludeSDK::FilePart if value.content.is_a?(IO)
|
|
90
94
|
state[:can_retry] = false
|
|
95
|
+
value
|
|
91
96
|
else
|
|
97
|
+
value
|
|
92
98
|
end
|
|
93
|
-
# rubocop:enable Lint/DuplicateBranch
|
|
94
|
-
|
|
95
|
-
value
|
|
96
99
|
end
|
|
97
100
|
|
|
98
101
|
# @api private
|