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