prelude-sdk 0.1.0.pre.alpha.2
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 +7 -0
- data/.ignore +2 -0
- data/CHANGELOG.md +352 -0
- data/README.md +217 -0
- data/SECURITY.md +27 -0
- data/lib/prelude_sdk/client.rb +87 -0
- data/lib/prelude_sdk/errors.rb +214 -0
- data/lib/prelude_sdk/file_part.rb +55 -0
- data/lib/prelude_sdk/internal/transport/base_client.rb +555 -0
- data/lib/prelude_sdk/internal/transport/pooled_net_requester.rb +209 -0
- data/lib/prelude_sdk/internal/type/array_of.rb +167 -0
- data/lib/prelude_sdk/internal/type/base_model.rb +536 -0
- data/lib/prelude_sdk/internal/type/base_page.rb +55 -0
- data/lib/prelude_sdk/internal/type/boolean.rb +77 -0
- data/lib/prelude_sdk/internal/type/converter.rb +300 -0
- data/lib/prelude_sdk/internal/type/enum.rb +131 -0
- data/lib/prelude_sdk/internal/type/file_input.rb +108 -0
- data/lib/prelude_sdk/internal/type/hash_of.rb +187 -0
- data/lib/prelude_sdk/internal/type/request_parameters.rb +42 -0
- data/lib/prelude_sdk/internal/type/union.rb +235 -0
- data/lib/prelude_sdk/internal/type/unknown.rb +81 -0
- data/lib/prelude_sdk/internal/util.rb +914 -0
- data/lib/prelude_sdk/internal.rb +20 -0
- data/lib/prelude_sdk/models/lookup_lookup_params.rb +37 -0
- data/lib/prelude_sdk/models/lookup_lookup_response.rb +236 -0
- data/lib/prelude_sdk/models/transactional_send_params.rb +84 -0
- data/lib/prelude_sdk/models/transactional_send_response.rb +81 -0
- data/lib/prelude_sdk/models/verification_check_params.rb +69 -0
- data/lib/prelude_sdk/models/verification_check_response.rb +67 -0
- data/lib/prelude_sdk/models/verification_create_params.rb +388 -0
- data/lib/prelude_sdk/models/verification_create_response.rb +148 -0
- data/lib/prelude_sdk/models/watch_predict_params.rb +191 -0
- data/lib/prelude_sdk/models/watch_predict_response.rb +50 -0
- data/lib/prelude_sdk/models/watch_send_events_params.rb +100 -0
- data/lib/prelude_sdk/models/watch_send_events_response.rb +41 -0
- data/lib/prelude_sdk/models/watch_send_feedbacks_params.rb +229 -0
- data/lib/prelude_sdk/models/watch_send_feedbacks_response.rb +41 -0
- data/lib/prelude_sdk/models.rb +55 -0
- data/lib/prelude_sdk/request_options.rb +77 -0
- data/lib/prelude_sdk/resources/lookup.rb +42 -0
- data/lib/prelude_sdk/resources/transactional.rb +53 -0
- data/lib/prelude_sdk/resources/verification.rb +76 -0
- data/lib/prelude_sdk/resources/watch.rb +91 -0
- data/lib/prelude_sdk/version.rb +5 -0
- data/lib/prelude_sdk.rb +71 -0
- data/manifest.yaml +15 -0
- data/rbi/prelude_sdk/client.rbi +59 -0
- data/rbi/prelude_sdk/errors.rbi +178 -0
- data/rbi/prelude_sdk/file_part.rbi +37 -0
- data/rbi/prelude_sdk/internal/transport/base_client.rbi +296 -0
- data/rbi/prelude_sdk/internal/transport/pooled_net_requester.rbi +80 -0
- data/rbi/prelude_sdk/internal/type/array_of.rbi +104 -0
- data/rbi/prelude_sdk/internal/type/base_model.rbi +304 -0
- data/rbi/prelude_sdk/internal/type/base_page.rbi +42 -0
- data/rbi/prelude_sdk/internal/type/boolean.rbi +58 -0
- data/rbi/prelude_sdk/internal/type/converter.rbi +162 -0
- data/rbi/prelude_sdk/internal/type/enum.rbi +82 -0
- data/rbi/prelude_sdk/internal/type/file_input.rbi +59 -0
- data/rbi/prelude_sdk/internal/type/hash_of.rbi +104 -0
- data/rbi/prelude_sdk/internal/type/request_parameters.rbi +29 -0
- data/rbi/prelude_sdk/internal/type/union.rbi +121 -0
- data/rbi/prelude_sdk/internal/type/unknown.rbi +58 -0
- data/rbi/prelude_sdk/internal/util.rbi +487 -0
- data/rbi/prelude_sdk/internal.rbi +18 -0
- data/rbi/prelude_sdk/models/lookup_lookup_params.rbi +78 -0
- data/rbi/prelude_sdk/models/lookup_lookup_response.rbi +520 -0
- data/rbi/prelude_sdk/models/transactional_send_params.rbi +126 -0
- data/rbi/prelude_sdk/models/transactional_send_response.rbi +113 -0
- data/rbi/prelude_sdk/models/verification_check_params.rbi +140 -0
- data/rbi/prelude_sdk/models/verification_check_response.rbi +149 -0
- data/rbi/prelude_sdk/models/verification_create_params.rbi +805 -0
- data/rbi/prelude_sdk/models/verification_create_response.rbi +336 -0
- data/rbi/prelude_sdk/models/watch_predict_params.rbi +382 -0
- data/rbi/prelude_sdk/models/watch_predict_response.rbi +96 -0
- data/rbi/prelude_sdk/models/watch_send_events_params.rbi +245 -0
- data/rbi/prelude_sdk/models/watch_send_events_response.rbi +82 -0
- data/rbi/prelude_sdk/models/watch_send_feedbacks_params.rbi +500 -0
- data/rbi/prelude_sdk/models/watch_send_feedbacks_response.rbi +86 -0
- data/rbi/prelude_sdk/models.rbi +17 -0
- data/rbi/prelude_sdk/request_options.rbi +59 -0
- data/rbi/prelude_sdk/resources/lookup.rbi +33 -0
- data/rbi/prelude_sdk/resources/transactional.rbi +50 -0
- data/rbi/prelude_sdk/resources/verification.rbi +61 -0
- data/rbi/prelude_sdk/resources/watch.rbi +67 -0
- data/rbi/prelude_sdk/version.rbi +5 -0
- data/sig/prelude_sdk/client.rbs +32 -0
- data/sig/prelude_sdk/errors.rbs +110 -0
- data/sig/prelude_sdk/file_part.rbs +21 -0
- data/sig/prelude_sdk/internal/transport/base_client.rbs +131 -0
- data/sig/prelude_sdk/internal/transport/pooled_net_requester.rbs +45 -0
- data/sig/prelude_sdk/internal/type/array_of.rbs +48 -0
- data/sig/prelude_sdk/internal/type/base_model.rbs +102 -0
- data/sig/prelude_sdk/internal/type/base_page.rbs +24 -0
- data/sig/prelude_sdk/internal/type/boolean.rbs +26 -0
- data/sig/prelude_sdk/internal/type/converter.rbs +62 -0
- data/sig/prelude_sdk/internal/type/enum.rbs +32 -0
- data/sig/prelude_sdk/internal/type/file_input.rbs +25 -0
- data/sig/prelude_sdk/internal/type/hash_of.rbs +48 -0
- data/sig/prelude_sdk/internal/type/request_parameters.rbs +19 -0
- data/sig/prelude_sdk/internal/type/union.rbs +52 -0
- data/sig/prelude_sdk/internal/type/unknown.rbs +26 -0
- data/sig/prelude_sdk/internal/util.rbs +185 -0
- data/sig/prelude_sdk/internal.rbs +9 -0
- data/sig/prelude_sdk/models/lookup_lookup_params.rbs +38 -0
- data/sig/prelude_sdk/models/lookup_lookup_response.rbs +179 -0
- data/sig/prelude_sdk/models/transactional_send_params.rbs +73 -0
- data/sig/prelude_sdk/models/transactional_send_response.rbs +66 -0
- data/sig/prelude_sdk/models/verification_check_params.rbs +61 -0
- data/sig/prelude_sdk/models/verification_check_response.rbs +67 -0
- data/sig/prelude_sdk/models/verification_create_params.rbs +345 -0
- data/sig/prelude_sdk/models/verification_create_response.rbs +136 -0
- data/sig/prelude_sdk/models/watch_predict_params.rbs +180 -0
- data/sig/prelude_sdk/models/watch_predict_response.rbs +41 -0
- data/sig/prelude_sdk/models/watch_send_events_params.rbs +98 -0
- data/sig/prelude_sdk/models/watch_send_events_response.rbs +35 -0
- data/sig/prelude_sdk/models/watch_send_feedbacks_params.rbs +211 -0
- data/sig/prelude_sdk/models/watch_send_feedbacks_response.rbs +35 -0
- data/sig/prelude_sdk/models.rbs +15 -0
- data/sig/prelude_sdk/request_options.rbs +36 -0
- data/sig/prelude_sdk/resources/lookup.rbs +13 -0
- data/sig/prelude_sdk/resources/transactional.rbs +19 -0
- data/sig/prelude_sdk/resources/verification.rbs +22 -0
- data/sig/prelude_sdk/resources/watch.rbs +25 -0
- data/sig/prelude_sdk/version.rbs +3 -0
- metadata +182 -0
@@ -0,0 +1,300 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PreludeSDK
|
4
|
+
module Internal
|
5
|
+
module Type
|
6
|
+
# @api private
|
7
|
+
module Converter
|
8
|
+
extend PreludeSDK::Internal::Util::SorbetRuntimeSupport
|
9
|
+
|
10
|
+
# rubocop:disable Lint/UnusedMethodArgument
|
11
|
+
|
12
|
+
# @api private
|
13
|
+
#
|
14
|
+
# @param value [Object]
|
15
|
+
#
|
16
|
+
# @param state [Hash{Symbol=>Object}] .
|
17
|
+
#
|
18
|
+
# @option state [Boolean] :translate_names
|
19
|
+
#
|
20
|
+
# @option state [Boolean] :strictness
|
21
|
+
#
|
22
|
+
# @option state [Hash{Symbol=>Object}] :exactness
|
23
|
+
#
|
24
|
+
# @option state [Class<StandardError>] :error
|
25
|
+
#
|
26
|
+
# @option state [Integer] :branched
|
27
|
+
#
|
28
|
+
# @return [Object]
|
29
|
+
def coerce(value, state:) = (raise NotImplementedError)
|
30
|
+
|
31
|
+
# @api private
|
32
|
+
#
|
33
|
+
# @param value [Object]
|
34
|
+
#
|
35
|
+
# @param state [Hash{Symbol=>Object}] .
|
36
|
+
#
|
37
|
+
# @option state [Boolean] :can_retry
|
38
|
+
#
|
39
|
+
# @return [Object]
|
40
|
+
def dump(value, state:)
|
41
|
+
case value
|
42
|
+
in Array
|
43
|
+
value.map { PreludeSDK::Internal::Type::Unknown.dump(_1, state: state) }
|
44
|
+
in Hash
|
45
|
+
value.transform_values { PreludeSDK::Internal::Type::Unknown.dump(_1, state: state) }
|
46
|
+
in PreludeSDK::Internal::Type::BaseModel
|
47
|
+
value.class.dump(value, state: state)
|
48
|
+
in StringIO
|
49
|
+
value.string
|
50
|
+
in Pathname | IO
|
51
|
+
state[:can_retry] = false if value.is_a?(IO)
|
52
|
+
PreludeSDK::FilePart.new(value)
|
53
|
+
in PreludeSDK::FilePart
|
54
|
+
state[:can_retry] = false if value.content.is_a?(IO)
|
55
|
+
value
|
56
|
+
else
|
57
|
+
value
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# @api private
|
62
|
+
#
|
63
|
+
# @param depth [Integer]
|
64
|
+
#
|
65
|
+
# @return [String]
|
66
|
+
def inspect(depth: 0)
|
67
|
+
super()
|
68
|
+
end
|
69
|
+
|
70
|
+
# rubocop:enable Lint/UnusedMethodArgument
|
71
|
+
|
72
|
+
class << self
|
73
|
+
# @api private
|
74
|
+
#
|
75
|
+
# @param spec [Hash{Symbol=>Object}, Proc, PreludeSDK::Internal::Type::Converter, Class] .
|
76
|
+
#
|
77
|
+
# @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
|
78
|
+
#
|
79
|
+
# @option spec [Proc] :enum
|
80
|
+
#
|
81
|
+
# @option spec [Proc] :union
|
82
|
+
#
|
83
|
+
# @option spec [Boolean] :"nil?"
|
84
|
+
#
|
85
|
+
# @return [Proc]
|
86
|
+
def type_info(spec)
|
87
|
+
case spec
|
88
|
+
in Proc
|
89
|
+
spec
|
90
|
+
in Hash
|
91
|
+
type_info(spec.slice(:const, :enum, :union).first&.last)
|
92
|
+
in true | false
|
93
|
+
-> { PreludeSDK::Internal::Type::Boolean }
|
94
|
+
in PreludeSDK::Internal::Type::Converter | Class | Symbol
|
95
|
+
-> { spec }
|
96
|
+
in NilClass | Integer | Float
|
97
|
+
-> { spec.class }
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# @api private
|
102
|
+
#
|
103
|
+
# @param translate_names [Boolean]
|
104
|
+
#
|
105
|
+
# @return [Hash{Symbol=>Object}]
|
106
|
+
def new_coerce_state(translate_names: true)
|
107
|
+
{
|
108
|
+
translate_names: translate_names,
|
109
|
+
strictness: true,
|
110
|
+
exactness: {yes: 0, no: 0, maybe: 0},
|
111
|
+
error: nil,
|
112
|
+
branched: 0
|
113
|
+
}
|
114
|
+
end
|
115
|
+
|
116
|
+
# @api private
|
117
|
+
#
|
118
|
+
# Based on `target`, transform `value` into `target`, to the extent possible:
|
119
|
+
#
|
120
|
+
# 1. if the given `value` conforms to `target` already, return the given `value`
|
121
|
+
# 2. if it's possible and safe to convert the given `value` to `target`, then the
|
122
|
+
# converted value
|
123
|
+
# 3. otherwise, the given `value` unaltered
|
124
|
+
#
|
125
|
+
# The coercion process is subject to improvement between minor release versions.
|
126
|
+
# See https://docs.pydantic.dev/latest/concepts/unions/#smart-mode
|
127
|
+
#
|
128
|
+
# @param target [PreludeSDK::Internal::Type::Converter, Class]
|
129
|
+
#
|
130
|
+
# @param value [Object]
|
131
|
+
#
|
132
|
+
# @param state [Hash{Symbol=>Object}] The `strictness` is one of `true`, `false`. This informs the coercion strategy
|
133
|
+
# when we have to decide between multiple possible conversion targets:
|
134
|
+
#
|
135
|
+
# - `true`: the conversion must be exact, with minimum coercion.
|
136
|
+
# - `false`: the conversion can be approximate, with some coercion.
|
137
|
+
#
|
138
|
+
# The `exactness` is `Hash` with keys being one of `yes`, `no`, or `maybe`. For
|
139
|
+
# any given conversion attempt, the exactness will be updated based on how closely
|
140
|
+
# the value recursively matches the target type:
|
141
|
+
#
|
142
|
+
# - `yes`: the value can be converted to the target type with minimum coercion.
|
143
|
+
# - `maybe`: the value can be converted to the target type with some reasonable
|
144
|
+
# coercion.
|
145
|
+
# - `no`: the value cannot be converted to the target type.
|
146
|
+
#
|
147
|
+
# See implementation below for more details.
|
148
|
+
#
|
149
|
+
# @option state [Boolean] :translate_names
|
150
|
+
#
|
151
|
+
# @option state [Boolean] :strictness
|
152
|
+
#
|
153
|
+
# @option state [Hash{Symbol=>Object}] :exactness
|
154
|
+
#
|
155
|
+
# @option state [Class<StandardError>] :error
|
156
|
+
#
|
157
|
+
# @option state [Integer] :branched
|
158
|
+
#
|
159
|
+
# @return [Object]
|
160
|
+
def coerce(target, value, state: PreludeSDK::Internal::Type::Converter.new_coerce_state)
|
161
|
+
# rubocop:disable Metrics/BlockNesting
|
162
|
+
exactness = state.fetch(:exactness)
|
163
|
+
|
164
|
+
case target
|
165
|
+
in PreludeSDK::Internal::Type::Converter
|
166
|
+
return target.coerce(value, state: state)
|
167
|
+
in Class
|
168
|
+
if value.is_a?(target)
|
169
|
+
exactness[:yes] += 1
|
170
|
+
return value
|
171
|
+
end
|
172
|
+
|
173
|
+
case target
|
174
|
+
in -> { _1 <= NilClass }
|
175
|
+
exactness[value.nil? ? :yes : :maybe] += 1
|
176
|
+
return nil
|
177
|
+
in -> { _1 <= Integer }
|
178
|
+
case value
|
179
|
+
in Integer
|
180
|
+
exactness[:yes] += 1
|
181
|
+
return value
|
182
|
+
else
|
183
|
+
Kernel.then do
|
184
|
+
return Integer(value).tap { exactness[:maybe] += 1 }
|
185
|
+
rescue ArgumentError, TypeError => e
|
186
|
+
state[:error] = e
|
187
|
+
end
|
188
|
+
end
|
189
|
+
in -> { _1 <= Float }
|
190
|
+
if value.is_a?(Numeric)
|
191
|
+
exactness[:yes] += 1
|
192
|
+
return Float(value)
|
193
|
+
else
|
194
|
+
Kernel.then do
|
195
|
+
return Float(value).tap { exactness[:maybe] += 1 }
|
196
|
+
rescue ArgumentError, TypeError => e
|
197
|
+
state[:error] = e
|
198
|
+
end
|
199
|
+
end
|
200
|
+
in -> { _1 <= String }
|
201
|
+
case value
|
202
|
+
in String | Symbol | Numeric
|
203
|
+
exactness[value.is_a?(Numeric) ? :maybe : :yes] += 1
|
204
|
+
return value.to_s
|
205
|
+
in StringIO
|
206
|
+
exactness[:yes] += 1
|
207
|
+
return value.string
|
208
|
+
else
|
209
|
+
state[:error] = TypeError.new("#{value.class} can't be coerced into #{String}")
|
210
|
+
end
|
211
|
+
in -> { _1 <= Date || _1 <= Time }
|
212
|
+
Kernel.then do
|
213
|
+
return target.parse(value).tap { exactness[:yes] += 1 }
|
214
|
+
rescue ArgumentError, TypeError => e
|
215
|
+
state[:error] = e
|
216
|
+
end
|
217
|
+
in -> { _1 <= StringIO } if value.is_a?(String)
|
218
|
+
exactness[:yes] += 1
|
219
|
+
return StringIO.new(value.b)
|
220
|
+
else
|
221
|
+
end
|
222
|
+
in Symbol
|
223
|
+
case value
|
224
|
+
in Symbol | String
|
225
|
+
if value.to_sym == target
|
226
|
+
exactness[:yes] += 1
|
227
|
+
return target
|
228
|
+
else
|
229
|
+
exactness[:maybe] += 1
|
230
|
+
return value
|
231
|
+
end
|
232
|
+
else
|
233
|
+
message = "cannot convert non-matching #{value.class} into #{target.inspect}"
|
234
|
+
state[:error] = ArgumentError.new(message)
|
235
|
+
end
|
236
|
+
else
|
237
|
+
end
|
238
|
+
|
239
|
+
exactness[:no] += 1
|
240
|
+
value
|
241
|
+
# rubocop:enable Metrics/BlockNesting
|
242
|
+
end
|
243
|
+
|
244
|
+
# @api private
|
245
|
+
#
|
246
|
+
# @param target [PreludeSDK::Internal::Type::Converter, Class]
|
247
|
+
#
|
248
|
+
# @param value [Object]
|
249
|
+
#
|
250
|
+
# @param state [Hash{Symbol=>Object}] .
|
251
|
+
#
|
252
|
+
# @option state [Boolean] :can_retry
|
253
|
+
#
|
254
|
+
# @return [Object]
|
255
|
+
def dump(target, value, state: {can_retry: true})
|
256
|
+
case target
|
257
|
+
in PreludeSDK::Internal::Type::Converter
|
258
|
+
target.dump(value, state: state)
|
259
|
+
else
|
260
|
+
PreludeSDK::Internal::Type::Unknown.dump(value, state: state)
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
# @api private
|
265
|
+
#
|
266
|
+
# @param target [Object]
|
267
|
+
# @param depth [Integer]
|
268
|
+
#
|
269
|
+
# @return [String]
|
270
|
+
def inspect(target, depth:)
|
271
|
+
case target
|
272
|
+
in PreludeSDK::Internal::Type::Converter
|
273
|
+
target.inspect(depth: depth.succ)
|
274
|
+
else
|
275
|
+
target.inspect
|
276
|
+
end
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
define_sorbet_constant!(:Input) do
|
281
|
+
T.type_alias { T.any(PreludeSDK::Internal::Type::Converter, T::Class[T.anything]) }
|
282
|
+
end
|
283
|
+
define_sorbet_constant!(:CoerceState) do
|
284
|
+
T.type_alias do
|
285
|
+
{
|
286
|
+
translate_names: T::Boolean,
|
287
|
+
strictness: T::Boolean,
|
288
|
+
exactness: {yes: Integer, no: Integer, maybe: Integer},
|
289
|
+
error: T::Class[StandardError],
|
290
|
+
branched: Integer
|
291
|
+
}
|
292
|
+
end
|
293
|
+
end
|
294
|
+
define_sorbet_constant!(:DumpState) do
|
295
|
+
T.type_alias { {can_retry: T::Boolean} }
|
296
|
+
end
|
297
|
+
end
|
298
|
+
end
|
299
|
+
end
|
300
|
+
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PreludeSDK
|
4
|
+
module Internal
|
5
|
+
module Type
|
6
|
+
# @api private
|
7
|
+
#
|
8
|
+
# A value from among a specified list of options. OpenAPI enum values map to Ruby
|
9
|
+
# values in the SDK as follows:
|
10
|
+
#
|
11
|
+
# 1. boolean => true | false
|
12
|
+
# 2. integer => Integer
|
13
|
+
# 3. float => Float
|
14
|
+
# 4. string => Symbol
|
15
|
+
#
|
16
|
+
# We can therefore convert string values to Symbols, but can't convert other
|
17
|
+
# values safely.
|
18
|
+
module Enum
|
19
|
+
include PreludeSDK::Internal::Type::Converter
|
20
|
+
include PreludeSDK::Internal::Util::SorbetRuntimeSupport
|
21
|
+
|
22
|
+
# All of the valid Symbol values for this enum.
|
23
|
+
#
|
24
|
+
# @return [Array<NilClass, Boolean, Integer, Float, Symbol>]
|
25
|
+
def values = constants.map { const_get(_1) }
|
26
|
+
|
27
|
+
# @api public
|
28
|
+
#
|
29
|
+
# @param other [Object]
|
30
|
+
#
|
31
|
+
# @return [Boolean]
|
32
|
+
def ===(other) = values.include?(other)
|
33
|
+
|
34
|
+
# @api public
|
35
|
+
#
|
36
|
+
# @param other [Object]
|
37
|
+
#
|
38
|
+
# @return [Boolean]
|
39
|
+
def ==(other)
|
40
|
+
# rubocop:disable Style/CaseEquality
|
41
|
+
PreludeSDK::Internal::Type::Enum === other && other.values.to_set == values.to_set
|
42
|
+
# rubocop:enable Style/CaseEquality
|
43
|
+
end
|
44
|
+
|
45
|
+
# @api public
|
46
|
+
#
|
47
|
+
# @return [Integer]
|
48
|
+
def hash = values.to_set.hash
|
49
|
+
|
50
|
+
# @api private
|
51
|
+
#
|
52
|
+
# Unlike with primitives, `Enum` additionally validates that the value is a member
|
53
|
+
# of the enum.
|
54
|
+
#
|
55
|
+
# @param value [String, Symbol, Object]
|
56
|
+
#
|
57
|
+
# @param state [Hash{Symbol=>Object}] .
|
58
|
+
#
|
59
|
+
# @option state [Boolean] :translate_names
|
60
|
+
#
|
61
|
+
# @option state [Boolean] :strictness
|
62
|
+
#
|
63
|
+
# @option state [Hash{Symbol=>Object}] :exactness
|
64
|
+
#
|
65
|
+
# @option state [Class<StandardError>] :error
|
66
|
+
#
|
67
|
+
# @option state [Integer] :branched
|
68
|
+
#
|
69
|
+
# @return [Symbol, Object]
|
70
|
+
def coerce(value, state:)
|
71
|
+
exactness = state.fetch(:exactness)
|
72
|
+
val = value.is_a?(String) ? value.to_sym : value
|
73
|
+
|
74
|
+
if values.include?(val)
|
75
|
+
exactness[:yes] += 1
|
76
|
+
val
|
77
|
+
elsif values.first&.class == val.class
|
78
|
+
exactness[:maybe] += 1
|
79
|
+
value
|
80
|
+
else
|
81
|
+
exactness[:no] += 1
|
82
|
+
state[:error] = TypeError.new("#{value.class} can't be coerced into #{self}")
|
83
|
+
value
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
# @!method dump(value, state:)
|
88
|
+
# @api private
|
89
|
+
#
|
90
|
+
# @param value [Symbol, Object]
|
91
|
+
#
|
92
|
+
# @param state [Hash{Symbol=>Object}] .
|
93
|
+
#
|
94
|
+
# @option state [Boolean] :can_retry
|
95
|
+
#
|
96
|
+
# @return [Symbol, Object]
|
97
|
+
|
98
|
+
# @api private
|
99
|
+
#
|
100
|
+
# @return [Object]
|
101
|
+
def to_sorbet_type
|
102
|
+
types = values.map { PreludeSDK::Internal::Util::SorbetRuntimeSupport.to_sorbet_type(_1) }.uniq
|
103
|
+
case types
|
104
|
+
in []
|
105
|
+
T.noreturn
|
106
|
+
in [type]
|
107
|
+
type
|
108
|
+
else
|
109
|
+
T.any(*types)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
# @api private
|
114
|
+
#
|
115
|
+
# @param depth [Integer]
|
116
|
+
#
|
117
|
+
# @return [String]
|
118
|
+
def inspect(depth: 0)
|
119
|
+
if depth.positive?
|
120
|
+
return is_a?(Module) ? super() : self.class.name
|
121
|
+
end
|
122
|
+
|
123
|
+
members = values.map { PreludeSDK::Internal::Type::Converter.inspect(_1, depth: depth.succ) }
|
124
|
+
prefix = is_a?(Module) ? name : self.class.name
|
125
|
+
|
126
|
+
"#{prefix}[#{members.join(' | ')}]"
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PreludeSDK
|
4
|
+
module Internal
|
5
|
+
module Type
|
6
|
+
# @api private
|
7
|
+
#
|
8
|
+
# @abstract
|
9
|
+
#
|
10
|
+
# Either `Pathname` or `StringIO`, or `IO`, or
|
11
|
+
# `PreludeSDK::Internal::Type::FileInput`.
|
12
|
+
#
|
13
|
+
# Note: when `IO` is used, all retries are disabled, since many IO` streams are
|
14
|
+
# not rewindable.
|
15
|
+
class FileInput
|
16
|
+
extend PreludeSDK::Internal::Type::Converter
|
17
|
+
|
18
|
+
private_class_method :new
|
19
|
+
|
20
|
+
# @api public
|
21
|
+
#
|
22
|
+
# @param other [Object]
|
23
|
+
#
|
24
|
+
# @return [Boolean]
|
25
|
+
def self.===(other)
|
26
|
+
case other
|
27
|
+
in Pathname | StringIO | IO | String | PreludeSDK::FilePart
|
28
|
+
true
|
29
|
+
else
|
30
|
+
false
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# @api public
|
35
|
+
#
|
36
|
+
# @param other [Object]
|
37
|
+
#
|
38
|
+
# @return [Boolean]
|
39
|
+
def self.==(other) = other.is_a?(Class) && other <= PreludeSDK::Internal::Type::FileInput
|
40
|
+
|
41
|
+
class << self
|
42
|
+
# @api private
|
43
|
+
#
|
44
|
+
# @param value [StringIO, String, Object]
|
45
|
+
#
|
46
|
+
# @param state [Hash{Symbol=>Object}] .
|
47
|
+
#
|
48
|
+
# @option state [Boolean] :translate_names
|
49
|
+
#
|
50
|
+
# @option state [Boolean] :strictness
|
51
|
+
#
|
52
|
+
# @option state [Hash{Symbol=>Object}] :exactness
|
53
|
+
#
|
54
|
+
# @option state [Class<StandardError>] :error
|
55
|
+
#
|
56
|
+
# @option state [Integer] :branched
|
57
|
+
#
|
58
|
+
# @return [StringIO, Object]
|
59
|
+
def coerce(value, state:)
|
60
|
+
exactness = state.fetch(:exactness)
|
61
|
+
case value
|
62
|
+
in String
|
63
|
+
exactness[:yes] += 1
|
64
|
+
StringIO.new(value)
|
65
|
+
in StringIO
|
66
|
+
exactness[:yes] += 1
|
67
|
+
value
|
68
|
+
else
|
69
|
+
state[:error] = TypeError.new("#{value.class} can't be coerced into #{StringIO}")
|
70
|
+
exactness[:no] += 1
|
71
|
+
value
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# @api private
|
76
|
+
#
|
77
|
+
# @param value [Pathname, StringIO, IO, String, Object]
|
78
|
+
#
|
79
|
+
# @param state [Hash{Symbol=>Object}] .
|
80
|
+
#
|
81
|
+
# @option state [Boolean] :can_retry
|
82
|
+
#
|
83
|
+
# @return [Pathname, StringIO, IO, String, Object]
|
84
|
+
def dump(value, state:)
|
85
|
+
# rubocop:disable Lint/DuplicateBranch
|
86
|
+
case value
|
87
|
+
in IO
|
88
|
+
state[:can_retry] = false
|
89
|
+
in PreludeSDK::FilePart if value.content.is_a?(IO)
|
90
|
+
state[:can_retry] = false
|
91
|
+
else
|
92
|
+
end
|
93
|
+
# rubocop:enable Lint/DuplicateBranch
|
94
|
+
|
95
|
+
value
|
96
|
+
end
|
97
|
+
|
98
|
+
# @api private
|
99
|
+
#
|
100
|
+
# @return [Object]
|
101
|
+
def to_sorbet_type
|
102
|
+
T.any(Pathname, StringIO, IO, String, PreludeSDK::FilePart)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|