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.
Files changed (125) hide show
  1. checksums.yaml +7 -0
  2. data/.ignore +2 -0
  3. data/CHANGELOG.md +352 -0
  4. data/README.md +217 -0
  5. data/SECURITY.md +27 -0
  6. data/lib/prelude_sdk/client.rb +87 -0
  7. data/lib/prelude_sdk/errors.rb +214 -0
  8. data/lib/prelude_sdk/file_part.rb +55 -0
  9. data/lib/prelude_sdk/internal/transport/base_client.rb +555 -0
  10. data/lib/prelude_sdk/internal/transport/pooled_net_requester.rb +209 -0
  11. data/lib/prelude_sdk/internal/type/array_of.rb +167 -0
  12. data/lib/prelude_sdk/internal/type/base_model.rb +536 -0
  13. data/lib/prelude_sdk/internal/type/base_page.rb +55 -0
  14. data/lib/prelude_sdk/internal/type/boolean.rb +77 -0
  15. data/lib/prelude_sdk/internal/type/converter.rb +300 -0
  16. data/lib/prelude_sdk/internal/type/enum.rb +131 -0
  17. data/lib/prelude_sdk/internal/type/file_input.rb +108 -0
  18. data/lib/prelude_sdk/internal/type/hash_of.rb +187 -0
  19. data/lib/prelude_sdk/internal/type/request_parameters.rb +42 -0
  20. data/lib/prelude_sdk/internal/type/union.rb +235 -0
  21. data/lib/prelude_sdk/internal/type/unknown.rb +81 -0
  22. data/lib/prelude_sdk/internal/util.rb +914 -0
  23. data/lib/prelude_sdk/internal.rb +20 -0
  24. data/lib/prelude_sdk/models/lookup_lookup_params.rb +37 -0
  25. data/lib/prelude_sdk/models/lookup_lookup_response.rb +236 -0
  26. data/lib/prelude_sdk/models/transactional_send_params.rb +84 -0
  27. data/lib/prelude_sdk/models/transactional_send_response.rb +81 -0
  28. data/lib/prelude_sdk/models/verification_check_params.rb +69 -0
  29. data/lib/prelude_sdk/models/verification_check_response.rb +67 -0
  30. data/lib/prelude_sdk/models/verification_create_params.rb +388 -0
  31. data/lib/prelude_sdk/models/verification_create_response.rb +148 -0
  32. data/lib/prelude_sdk/models/watch_predict_params.rb +191 -0
  33. data/lib/prelude_sdk/models/watch_predict_response.rb +50 -0
  34. data/lib/prelude_sdk/models/watch_send_events_params.rb +100 -0
  35. data/lib/prelude_sdk/models/watch_send_events_response.rb +41 -0
  36. data/lib/prelude_sdk/models/watch_send_feedbacks_params.rb +229 -0
  37. data/lib/prelude_sdk/models/watch_send_feedbacks_response.rb +41 -0
  38. data/lib/prelude_sdk/models.rb +55 -0
  39. data/lib/prelude_sdk/request_options.rb +77 -0
  40. data/lib/prelude_sdk/resources/lookup.rb +42 -0
  41. data/lib/prelude_sdk/resources/transactional.rb +53 -0
  42. data/lib/prelude_sdk/resources/verification.rb +76 -0
  43. data/lib/prelude_sdk/resources/watch.rb +91 -0
  44. data/lib/prelude_sdk/version.rb +5 -0
  45. data/lib/prelude_sdk.rb +71 -0
  46. data/manifest.yaml +15 -0
  47. data/rbi/prelude_sdk/client.rbi +59 -0
  48. data/rbi/prelude_sdk/errors.rbi +178 -0
  49. data/rbi/prelude_sdk/file_part.rbi +37 -0
  50. data/rbi/prelude_sdk/internal/transport/base_client.rbi +296 -0
  51. data/rbi/prelude_sdk/internal/transport/pooled_net_requester.rbi +80 -0
  52. data/rbi/prelude_sdk/internal/type/array_of.rbi +104 -0
  53. data/rbi/prelude_sdk/internal/type/base_model.rbi +304 -0
  54. data/rbi/prelude_sdk/internal/type/base_page.rbi +42 -0
  55. data/rbi/prelude_sdk/internal/type/boolean.rbi +58 -0
  56. data/rbi/prelude_sdk/internal/type/converter.rbi +162 -0
  57. data/rbi/prelude_sdk/internal/type/enum.rbi +82 -0
  58. data/rbi/prelude_sdk/internal/type/file_input.rbi +59 -0
  59. data/rbi/prelude_sdk/internal/type/hash_of.rbi +104 -0
  60. data/rbi/prelude_sdk/internal/type/request_parameters.rbi +29 -0
  61. data/rbi/prelude_sdk/internal/type/union.rbi +121 -0
  62. data/rbi/prelude_sdk/internal/type/unknown.rbi +58 -0
  63. data/rbi/prelude_sdk/internal/util.rbi +487 -0
  64. data/rbi/prelude_sdk/internal.rbi +18 -0
  65. data/rbi/prelude_sdk/models/lookup_lookup_params.rbi +78 -0
  66. data/rbi/prelude_sdk/models/lookup_lookup_response.rbi +520 -0
  67. data/rbi/prelude_sdk/models/transactional_send_params.rbi +126 -0
  68. data/rbi/prelude_sdk/models/transactional_send_response.rbi +113 -0
  69. data/rbi/prelude_sdk/models/verification_check_params.rbi +140 -0
  70. data/rbi/prelude_sdk/models/verification_check_response.rbi +149 -0
  71. data/rbi/prelude_sdk/models/verification_create_params.rbi +805 -0
  72. data/rbi/prelude_sdk/models/verification_create_response.rbi +336 -0
  73. data/rbi/prelude_sdk/models/watch_predict_params.rbi +382 -0
  74. data/rbi/prelude_sdk/models/watch_predict_response.rbi +96 -0
  75. data/rbi/prelude_sdk/models/watch_send_events_params.rbi +245 -0
  76. data/rbi/prelude_sdk/models/watch_send_events_response.rbi +82 -0
  77. data/rbi/prelude_sdk/models/watch_send_feedbacks_params.rbi +500 -0
  78. data/rbi/prelude_sdk/models/watch_send_feedbacks_response.rbi +86 -0
  79. data/rbi/prelude_sdk/models.rbi +17 -0
  80. data/rbi/prelude_sdk/request_options.rbi +59 -0
  81. data/rbi/prelude_sdk/resources/lookup.rbi +33 -0
  82. data/rbi/prelude_sdk/resources/transactional.rbi +50 -0
  83. data/rbi/prelude_sdk/resources/verification.rbi +61 -0
  84. data/rbi/prelude_sdk/resources/watch.rbi +67 -0
  85. data/rbi/prelude_sdk/version.rbi +5 -0
  86. data/sig/prelude_sdk/client.rbs +32 -0
  87. data/sig/prelude_sdk/errors.rbs +110 -0
  88. data/sig/prelude_sdk/file_part.rbs +21 -0
  89. data/sig/prelude_sdk/internal/transport/base_client.rbs +131 -0
  90. data/sig/prelude_sdk/internal/transport/pooled_net_requester.rbs +45 -0
  91. data/sig/prelude_sdk/internal/type/array_of.rbs +48 -0
  92. data/sig/prelude_sdk/internal/type/base_model.rbs +102 -0
  93. data/sig/prelude_sdk/internal/type/base_page.rbs +24 -0
  94. data/sig/prelude_sdk/internal/type/boolean.rbs +26 -0
  95. data/sig/prelude_sdk/internal/type/converter.rbs +62 -0
  96. data/sig/prelude_sdk/internal/type/enum.rbs +32 -0
  97. data/sig/prelude_sdk/internal/type/file_input.rbs +25 -0
  98. data/sig/prelude_sdk/internal/type/hash_of.rbs +48 -0
  99. data/sig/prelude_sdk/internal/type/request_parameters.rbs +19 -0
  100. data/sig/prelude_sdk/internal/type/union.rbs +52 -0
  101. data/sig/prelude_sdk/internal/type/unknown.rbs +26 -0
  102. data/sig/prelude_sdk/internal/util.rbs +185 -0
  103. data/sig/prelude_sdk/internal.rbs +9 -0
  104. data/sig/prelude_sdk/models/lookup_lookup_params.rbs +38 -0
  105. data/sig/prelude_sdk/models/lookup_lookup_response.rbs +179 -0
  106. data/sig/prelude_sdk/models/transactional_send_params.rbs +73 -0
  107. data/sig/prelude_sdk/models/transactional_send_response.rbs +66 -0
  108. data/sig/prelude_sdk/models/verification_check_params.rbs +61 -0
  109. data/sig/prelude_sdk/models/verification_check_response.rbs +67 -0
  110. data/sig/prelude_sdk/models/verification_create_params.rbs +345 -0
  111. data/sig/prelude_sdk/models/verification_create_response.rbs +136 -0
  112. data/sig/prelude_sdk/models/watch_predict_params.rbs +180 -0
  113. data/sig/prelude_sdk/models/watch_predict_response.rbs +41 -0
  114. data/sig/prelude_sdk/models/watch_send_events_params.rbs +98 -0
  115. data/sig/prelude_sdk/models/watch_send_events_response.rbs +35 -0
  116. data/sig/prelude_sdk/models/watch_send_feedbacks_params.rbs +211 -0
  117. data/sig/prelude_sdk/models/watch_send_feedbacks_response.rbs +35 -0
  118. data/sig/prelude_sdk/models.rbs +15 -0
  119. data/sig/prelude_sdk/request_options.rbs +36 -0
  120. data/sig/prelude_sdk/resources/lookup.rbs +13 -0
  121. data/sig/prelude_sdk/resources/transactional.rbs +19 -0
  122. data/sig/prelude_sdk/resources/verification.rbs +22 -0
  123. data/sig/prelude_sdk/resources/watch.rbs +25 -0
  124. data/sig/prelude_sdk/version.rbs +3 -0
  125. metadata +182 -0
@@ -0,0 +1,536 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PreludeSDK
4
+ module Internal
5
+ module Type
6
+ # @abstract
7
+ class BaseModel
8
+ extend PreludeSDK::Internal::Type::Converter
9
+ extend PreludeSDK::Internal::Util::SorbetRuntimeSupport
10
+
11
+ class << self
12
+ # @api private
13
+ #
14
+ # Assumes superclass fields are totally defined before fields are accessed /
15
+ # defined on subclasses.
16
+ #
17
+ # @param child [Class<PreludeSDK::Internal::Type::BaseModel>]
18
+ def inherited(child)
19
+ super
20
+ child.known_fields.replace(known_fields.dup)
21
+ end
22
+
23
+ # @api private
24
+ #
25
+ # @return [Hash{Symbol=>Hash{Symbol=>Object}}]
26
+ def known_fields = @known_fields ||= {}
27
+
28
+ # @api private
29
+ #
30
+ # @return [Hash{Symbol=>Hash{Symbol=>Object}}]
31
+ def fields
32
+ known_fields.transform_values do |field|
33
+ {**field.except(:type_fn), type: field.fetch(:type_fn).call}
34
+ end
35
+ end
36
+
37
+ # @api private
38
+ #
39
+ # @param name_sym [Symbol]
40
+ #
41
+ # @param required [Boolean]
42
+ #
43
+ # @param type_info [Hash{Symbol=>Object}, Proc, PreludeSDK::Internal::Type::Converter, Class]
44
+ #
45
+ # @param spec [Hash{Symbol=>Object}] .
46
+ #
47
+ # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
48
+ #
49
+ # @option spec [Proc] :enum
50
+ #
51
+ # @option spec [Proc] :union
52
+ #
53
+ # @option spec [Boolean] :"nil?"
54
+ private def add_field(name_sym, required:, type_info:, spec:)
55
+ type_fn, info =
56
+ case type_info
57
+ in Proc | PreludeSDK::Internal::Type::Converter | Class
58
+ [PreludeSDK::Internal::Type::Converter.type_info({**spec, union: type_info}), spec]
59
+ in Hash
60
+ [PreludeSDK::Internal::Type::Converter.type_info(type_info), type_info]
61
+ end
62
+
63
+ setter = :"#{name_sym}="
64
+ api_name = info.fetch(:api_name, name_sym)
65
+ nilable = info.fetch(:nil?, false)
66
+ const = if required && !nilable
67
+ info.fetch(
68
+ :const,
69
+ PreludeSDK::Internal::OMIT
70
+ )
71
+ else
72
+ PreludeSDK::Internal::OMIT
73
+ end
74
+
75
+ [name_sym, setter].each { undef_method(_1) } if known_fields.key?(name_sym)
76
+
77
+ known_fields[name_sym] =
78
+ {
79
+ mode: @mode,
80
+ api_name: api_name,
81
+ required: required,
82
+ nilable: nilable,
83
+ const: const,
84
+ type_fn: type_fn
85
+ }
86
+
87
+ define_method(setter) do |value|
88
+ target = type_fn.call
89
+ state = PreludeSDK::Internal::Type::Converter.new_coerce_state(translate_names: false)
90
+ coerced = PreludeSDK::Internal::Type::Converter.coerce(target, value, state: state)
91
+ status = @coerced.store(name_sym, state.fetch(:error) || true)
92
+ stored =
93
+ case [target, status]
94
+ in [PreludeSDK::Internal::Type::Converter | Symbol, true]
95
+ coerced
96
+ else
97
+ value
98
+ end
99
+ @data.store(name_sym, stored)
100
+ end
101
+
102
+ # rubocop:disable Style/CaseEquality
103
+ # rubocop:disable Metrics/BlockLength
104
+ define_method(name_sym) do
105
+ target = type_fn.call
106
+
107
+ case @coerced[name_sym]
108
+ in true | false if PreludeSDK::Internal::Type::Converter === target
109
+ @data.fetch(name_sym)
110
+ in ::StandardError => e
111
+ raise PreludeSDK::Errors::ConversionError.new(
112
+ on: self.class,
113
+ method: __method__,
114
+ target: target,
115
+ value: @data.fetch(name_sym),
116
+ cause: e
117
+ )
118
+ else
119
+ Kernel.then do
120
+ value = @data.fetch(name_sym) { const == PreludeSDK::Internal::OMIT ? nil : const }
121
+ state = PreludeSDK::Internal::Type::Converter.new_coerce_state(translate_names: false)
122
+ if (nilable || !required) && value.nil?
123
+ nil
124
+ else
125
+ PreludeSDK::Internal::Type::Converter.coerce(
126
+ target, value, state: state
127
+ )
128
+ end
129
+ rescue StandardError => e
130
+ raise PreludeSDK::Errors::ConversionError.new(
131
+ on: self.class,
132
+ method: __method__,
133
+ target: target,
134
+ value: value,
135
+ cause: e
136
+ )
137
+ end
138
+ end
139
+ end
140
+ # rubocop:enable Metrics/BlockLength
141
+ # rubocop:enable Style/CaseEquality
142
+ end
143
+
144
+ # @api private
145
+ #
146
+ # @param name_sym [Symbol]
147
+ #
148
+ # @param type_info [Hash{Symbol=>Object}, Proc, PreludeSDK::Internal::Type::Converter, Class]
149
+ #
150
+ # @param spec [Hash{Symbol=>Object}] .
151
+ #
152
+ # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
153
+ #
154
+ # @option spec [Proc] :enum
155
+ #
156
+ # @option spec [Proc] :union
157
+ #
158
+ # @option spec [Boolean] :"nil?"
159
+ def required(name_sym, type_info, spec = {})
160
+ add_field(name_sym, required: true, type_info: type_info, spec: spec)
161
+ end
162
+
163
+ # @api private
164
+ #
165
+ # @param name_sym [Symbol]
166
+ #
167
+ # @param type_info [Hash{Symbol=>Object}, Proc, PreludeSDK::Internal::Type::Converter, Class]
168
+ #
169
+ # @param spec [Hash{Symbol=>Object}] .
170
+ #
171
+ # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
172
+ #
173
+ # @option spec [Proc] :enum
174
+ #
175
+ # @option spec [Proc] :union
176
+ #
177
+ # @option spec [Boolean] :"nil?"
178
+ def optional(name_sym, type_info, spec = {})
179
+ add_field(name_sym, required: false, type_info: type_info, spec: spec)
180
+ end
181
+
182
+ # @api private
183
+ #
184
+ # `request_only` attributes not excluded from `.#coerce` when receiving responses
185
+ # even if well behaved servers should not send them
186
+ #
187
+ # @param blk [Proc]
188
+ private def request_only(&blk)
189
+ @mode = :dump
190
+ blk.call
191
+ ensure
192
+ @mode = nil
193
+ end
194
+
195
+ # @api private
196
+ #
197
+ # `response_only` attributes are omitted from `.#dump` when making requests
198
+ #
199
+ # @param blk [Proc]
200
+ private def response_only(&blk)
201
+ @mode = :coerce
202
+ blk.call
203
+ ensure
204
+ @mode = nil
205
+ end
206
+
207
+ # @api public
208
+ #
209
+ # @param other [Object]
210
+ #
211
+ # @return [Boolean]
212
+ def ==(other)
213
+ other.is_a?(Class) && other <= PreludeSDK::Internal::Type::BaseModel && other.fields == fields
214
+ end
215
+
216
+ # @api public
217
+ #
218
+ # @return [Integer]
219
+ def hash = fields.hash
220
+ end
221
+
222
+ # @api public
223
+ #
224
+ # @param other [Object]
225
+ #
226
+ # @return [Boolean]
227
+ def ==(other) = self.class == other.class && @data == other.to_h
228
+
229
+ # @api public
230
+ #
231
+ # @return [Integer]
232
+ def hash = [self.class, @data].hash
233
+
234
+ class << self
235
+ # @api private
236
+ #
237
+ # @param value [PreludeSDK::Internal::Type::BaseModel, Hash{Object=>Object}, Object]
238
+ #
239
+ # @param state [Hash{Symbol=>Object}] .
240
+ #
241
+ # @option state [Boolean] :translate_names
242
+ #
243
+ # @option state [Boolean] :strictness
244
+ #
245
+ # @option state [Hash{Symbol=>Object}] :exactness
246
+ #
247
+ # @option state [Class<StandardError>] :error
248
+ #
249
+ # @option state [Integer] :branched
250
+ #
251
+ # @return [self, Object]
252
+ def coerce(value, state:)
253
+ exactness = state.fetch(:exactness)
254
+
255
+ if value.is_a?(self)
256
+ exactness[:yes] += 1
257
+ return value
258
+ end
259
+
260
+ unless (val = PreludeSDK::Internal::Util.coerce_hash(value)).is_a?(Hash)
261
+ exactness[:no] += 1
262
+ state[:error] = TypeError.new("#{value.class} can't be coerced into #{Hash}")
263
+ return value
264
+ end
265
+ exactness[:yes] += 1
266
+
267
+ keys = val.keys.to_set
268
+ instance = new
269
+ data = instance.to_h
270
+ status = instance.instance_variable_get(:@coerced)
271
+
272
+ # rubocop:disable Metrics/BlockLength
273
+ fields.each do |name, field|
274
+ mode, required, target = field.fetch_values(:mode, :required, :type)
275
+ api_name, nilable, const = field.fetch_values(:api_name, :nilable, :const)
276
+ src_name = state.fetch(:translate_names) ? api_name : name
277
+
278
+ unless val.key?(src_name)
279
+ if required && mode != :dump && const == PreludeSDK::Internal::OMIT
280
+ exactness[nilable ? :maybe : :no] += 1
281
+ else
282
+ exactness[:yes] += 1
283
+ end
284
+ next
285
+ end
286
+
287
+ item = val.fetch(src_name)
288
+ keys.delete(src_name)
289
+
290
+ state[:error] = nil
291
+ converted =
292
+ if item.nil? && (nilable || !required)
293
+ exactness[nilable ? :yes : :maybe] += 1
294
+ nil
295
+ else
296
+ coerced = PreludeSDK::Internal::Type::Converter.coerce(target, item, state: state)
297
+ case target
298
+ in PreludeSDK::Internal::Type::Converter | Symbol
299
+ coerced
300
+ else
301
+ item
302
+ end
303
+ end
304
+
305
+ status.store(name, state.fetch(:error) || true)
306
+ data.store(name, converted)
307
+ end
308
+ # rubocop:enable Metrics/BlockLength
309
+
310
+ keys.each { data.store(_1, val.fetch(_1)) }
311
+ instance
312
+ end
313
+
314
+ # @api private
315
+ #
316
+ # @param value [self, Object]
317
+ #
318
+ # @param state [Hash{Symbol=>Object}] .
319
+ #
320
+ # @option state [Boolean] :can_retry
321
+ #
322
+ # @return [Hash{Object=>Object}, Object]
323
+ def dump(value, state:)
324
+ unless (coerced = PreludeSDK::Internal::Util.coerce_hash(value)).is_a?(Hash)
325
+ return super
326
+ end
327
+
328
+ acc = {}
329
+
330
+ coerced.each do |key, val|
331
+ name = key.is_a?(String) ? key.to_sym : key
332
+ case (field = known_fields[name])
333
+ in nil
334
+ acc.store(name, super(val, state: state))
335
+ else
336
+ api_name, mode, type_fn = field.fetch_values(:api_name, :mode, :type_fn)
337
+ case mode
338
+ in :coerce
339
+ next
340
+ else
341
+ target = type_fn.call
342
+ acc.store(api_name, PreludeSDK::Internal::Type::Converter.dump(target, val, state: state))
343
+ end
344
+ end
345
+ end
346
+
347
+ known_fields.each_value do |field|
348
+ api_name, mode, const = field.fetch_values(:api_name, :mode, :const)
349
+ next if mode == :coerce || acc.key?(api_name) || const == PreludeSDK::Internal::OMIT
350
+ acc.store(api_name, const)
351
+ end
352
+
353
+ acc
354
+ end
355
+
356
+ # @api private
357
+ #
358
+ # @return [Object]
359
+ def to_sorbet_type
360
+ self
361
+ end
362
+ end
363
+
364
+ class << self
365
+ # @api private
366
+ #
367
+ # @param model [PreludeSDK::Internal::Type::BaseModel]
368
+ # @param convert [Boolean]
369
+ #
370
+ # @return [Hash{Symbol=>Object}]
371
+ def recursively_to_h(model, convert:)
372
+ rec = ->(x) do
373
+ case x
374
+ in PreludeSDK::Internal::Type::BaseModel
375
+ if convert
376
+ fields = x.class.known_fields
377
+ x.to_h.to_h do |key, val|
378
+ [key, rec.call(fields.key?(key) ? x.public_send(key) : val)]
379
+ rescue PreludeSDK::Errors::ConversionError
380
+ [key, rec.call(val)]
381
+ end
382
+ else
383
+ rec.call(x.to_h)
384
+ end
385
+ in Hash
386
+ x.transform_values(&rec)
387
+ in Array
388
+ x.map(&rec)
389
+ else
390
+ x
391
+ end
392
+ end
393
+ rec.call(model)
394
+ end
395
+ end
396
+
397
+ # @api public
398
+ #
399
+ # Returns the raw value associated with the given key, if found. Otherwise, nil is
400
+ # returned.
401
+ #
402
+ # It is valid to lookup keys that are not in the API spec, for example to access
403
+ # undocumented features. This method does not parse response data into
404
+ # higher-level types. Lookup by anything other than a Symbol is an ArgumentError.
405
+ #
406
+ # @param key [Symbol]
407
+ #
408
+ # @return [Object, nil]
409
+ def [](key)
410
+ unless key.instance_of?(Symbol)
411
+ raise ArgumentError.new("Expected symbol key for lookup, got #{key.inspect}")
412
+ end
413
+
414
+ @data[key]
415
+ end
416
+
417
+ # @api public
418
+ #
419
+ # Returns a Hash of the data underlying this object. O(1)
420
+ #
421
+ # Keys are Symbols and values are the raw values from the response. The return
422
+ # value indicates which values were ever set on the object. i.e. there will be a
423
+ # key in this hash if they ever were, even if the set value was nil.
424
+ #
425
+ # This method is not recursive. The returned value is shared by the object, so it
426
+ # should not be mutated.
427
+ #
428
+ # @return [Hash{Symbol=>Object}]
429
+ def to_h = @data
430
+
431
+ alias_method :to_hash, :to_h
432
+
433
+ # @api public
434
+ #
435
+ # In addition to the behaviour of `#to_h`, this method will recursively call
436
+ # `#to_h` on nested models.
437
+ #
438
+ # @return [Hash{Symbol=>Object}]
439
+ def deep_to_h = self.class.recursively_to_h(@data, convert: false)
440
+
441
+ # @param keys [Array<Symbol>, nil]
442
+ #
443
+ # @return [Hash{Symbol=>Object}]
444
+ #
445
+ # @example
446
+ # # `lookup_lookup_response` is a `PreludeSDK::Models::LookupLookupResponse`
447
+ # lookup_lookup_response => {
448
+ # caller_name: caller_name,
449
+ # country_code: country_code,
450
+ # flags: flags
451
+ # }
452
+ def deconstruct_keys(keys)
453
+ (keys || self.class.known_fields.keys)
454
+ .filter_map do |k|
455
+ unless self.class.known_fields.key?(k)
456
+ next
457
+ end
458
+
459
+ [k, public_send(k)]
460
+ end
461
+ .to_h
462
+ end
463
+
464
+ # @api public
465
+ #
466
+ # @param a [Object]
467
+ #
468
+ # @return [String]
469
+ def to_json(*a) = PreludeSDK::Internal::Type::Converter.dump(self.class, self).to_json(*a)
470
+
471
+ # @api public
472
+ #
473
+ # @param a [Object]
474
+ #
475
+ # @return [String]
476
+ def to_yaml(*a) = PreludeSDK::Internal::Type::Converter.dump(self.class, self).to_yaml(*a)
477
+
478
+ # Create a new instance of a model.
479
+ #
480
+ # @param data [Hash{Symbol=>Object}, self]
481
+ def initialize(data = {})
482
+ @data = {}
483
+ @coerced = {}
484
+ PreludeSDK::Internal::Util.coerce_hash!(data).each do
485
+ if self.class.known_fields.key?(_1)
486
+ public_send(:"#{_1}=", _2)
487
+ else
488
+ @data.store(_1, _2)
489
+ @coerced.store(_1, false)
490
+ end
491
+ end
492
+ end
493
+
494
+ class << self
495
+ # @api private
496
+ #
497
+ # @param depth [Integer]
498
+ #
499
+ # @return [String]
500
+ def inspect(depth: 0)
501
+ return super() if depth.positive?
502
+
503
+ depth = depth.succ
504
+ deferred = fields.transform_values do |field|
505
+ type, required, nilable = field.fetch_values(:type, :required, :nilable)
506
+ inspected = [
507
+ PreludeSDK::Internal::Type::Converter.inspect(type, depth: depth),
508
+ !required || nilable ? "nil" : nil
509
+ ].compact.join(" | ")
510
+ -> { inspected }.tap { _1.define_singleton_method(:inspect) { call } }
511
+ end
512
+
513
+ "#{name}[#{deferred.inspect}]"
514
+ end
515
+ end
516
+
517
+ # @api public
518
+ #
519
+ # @return [String]
520
+ def to_s = deep_to_h.to_s
521
+
522
+ # @api private
523
+ #
524
+ # @return [String]
525
+ def inspect
526
+ converted = self.class.recursively_to_h(self, convert: true)
527
+ "#<#{self.class}:0x#{object_id.to_s(16)} #{converted}>"
528
+ end
529
+
530
+ define_sorbet_constant!(:KnownField) do
531
+ T.type_alias { {mode: T.nilable(Symbol), required: T::Boolean, nilable: T::Boolean} }
532
+ end
533
+ end
534
+ end
535
+ end
536
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PreludeSDK
4
+ module Internal
5
+ module Type
6
+ # @api private
7
+ #
8
+ # @generic Elem
9
+ #
10
+ # This module provides a base implementation for paginated responses in the SDK.
11
+ module BasePage
12
+ # rubocop:disable Lint/UnusedMethodArgument
13
+
14
+ # @api public
15
+ #
16
+ # @return [Boolean]
17
+ def next_page? = (raise NotImplementedError)
18
+
19
+ # @api public
20
+ #
21
+ # @raise [PreludeSDK::Errors::APIError]
22
+ # @return [self]
23
+ def next_page = (raise NotImplementedError)
24
+
25
+ # @api public
26
+ #
27
+ # @param blk [Proc]
28
+ #
29
+ # @yieldparam [generic<Elem>]
30
+ # @return [void]
31
+ def auto_paging_each(&blk) = (raise NotImplementedError)
32
+
33
+ # @return [Enumerable<generic<Elem>>]
34
+ def to_enum = super(:auto_paging_each)
35
+
36
+ alias_method :enum_for, :to_enum
37
+
38
+ # @api private
39
+ #
40
+ # @param client [PreludeSDK::Internal::Transport::BaseClient]
41
+ # @param req [Hash{Symbol=>Object}]
42
+ # @param headers [Hash{String=>String}, Net::HTTPHeader]
43
+ # @param page_data [Object]
44
+ def initialize(client:, req:, headers:, page_data:)
45
+ @client = client
46
+ @req = req
47
+ @model = req.fetch(:model)
48
+ super()
49
+ end
50
+
51
+ # rubocop:enable Lint/UnusedMethodArgument
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PreludeSDK
4
+ module Internal
5
+ module Type
6
+ # @api private
7
+ #
8
+ # @abstract
9
+ #
10
+ # Ruby has no Boolean class; this is something for models to refer to.
11
+ class Boolean
12
+ extend PreludeSDK::Internal::Type::Converter
13
+ extend PreludeSDK::Internal::Util::SorbetRuntimeSupport
14
+
15
+ private_class_method :new
16
+
17
+ # @api public
18
+ #
19
+ # @param other [Object]
20
+ #
21
+ # @return [Boolean]
22
+ def self.===(other) = other == true || other == false
23
+
24
+ # @api public
25
+ #
26
+ # @param other [Object]
27
+ #
28
+ # @return [Boolean]
29
+ def self.==(other) = other.is_a?(Class) && other <= PreludeSDK::Internal::Type::Boolean
30
+
31
+ class << self
32
+ # @api private
33
+ #
34
+ # Coerce value to Boolean if possible, otherwise return the original value.
35
+ #
36
+ # @param value [Boolean, Object]
37
+ #
38
+ # @param state [Hash{Symbol=>Object}] .
39
+ #
40
+ # @option state [Boolean] :translate_names
41
+ #
42
+ # @option state [Boolean] :strictness
43
+ #
44
+ # @option state [Hash{Symbol=>Object}] :exactness
45
+ #
46
+ # @option state [Class<StandardError>] :error
47
+ #
48
+ # @option state [Integer] :branched
49
+ #
50
+ # @return [Boolean, Object]
51
+ def coerce(value, state:)
52
+ state.fetch(:exactness)[value == true || value == false ? :yes : :no] += 1
53
+ value
54
+ end
55
+
56
+ # @!method dump(value, state:)
57
+ # @api private
58
+ #
59
+ # @param value [Boolean, Object]
60
+ #
61
+ # @param state [Hash{Symbol=>Object}] .
62
+ #
63
+ # @option state [Boolean] :can_retry
64
+ #
65
+ # @return [Boolean, Object]
66
+
67
+ # @api private
68
+ #
69
+ # @return [Object]
70
+ def to_sorbet_type
71
+ T::Boolean
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end