terminal-shop 1.6.0 → 1.8.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 (103) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -1
  3. data/lib/terminal-shop/base_client.rb +36 -46
  4. data/lib/terminal-shop/base_model.rb +88 -128
  5. data/lib/terminal-shop/base_page.rb +18 -18
  6. data/lib/terminal-shop/client.rb +1 -3
  7. data/lib/terminal-shop/errors.rb +12 -17
  8. data/lib/terminal-shop/extern.rb +1 -4
  9. data/lib/terminal-shop/models/region.rb +15 -0
  10. data/lib/terminal-shop/models/subscription.rb +6 -0
  11. data/lib/terminal-shop/models/view_init_response.rb +3 -13
  12. data/lib/terminal-shop/pooled_net_requester.rb +19 -21
  13. data/lib/terminal-shop/request_options.rb +4 -11
  14. data/lib/terminal-shop/resources/address.rb +0 -5
  15. data/lib/terminal-shop/resources/app.rb +0 -5
  16. data/lib/terminal-shop/resources/card.rb +0 -6
  17. data/lib/terminal-shop/resources/cart.rb +0 -7
  18. data/lib/terminal-shop/resources/email.rb +0 -2
  19. data/lib/terminal-shop/resources/order.rb +0 -4
  20. data/lib/terminal-shop/resources/product.rb +0 -3
  21. data/lib/terminal-shop/resources/profile.rb +0 -3
  22. data/lib/terminal-shop/resources/subscription.rb +0 -5
  23. data/lib/terminal-shop/resources/token.rb +0 -5
  24. data/lib/terminal-shop/resources/view.rb +0 -2
  25. data/lib/terminal-shop/util.rb +44 -71
  26. data/lib/terminal-shop/version.rb +1 -1
  27. data/lib/terminal-shop.rb +2 -0
  28. data/manifest.yaml +1 -0
  29. data/rbi/lib/terminal-shop/base_client.rbi +23 -0
  30. data/rbi/lib/terminal-shop/base_model.rbi +178 -52
  31. data/rbi/lib/terminal-shop/base_page.rbi +1 -2
  32. data/rbi/lib/terminal-shop/client.rbi +11 -0
  33. data/rbi/lib/terminal-shop/errors.rbi +33 -0
  34. data/rbi/lib/terminal-shop/extern.rbi +1 -1
  35. data/rbi/lib/terminal-shop/models/address.rbi +10 -0
  36. data/rbi/lib/terminal-shop/models/address_create_params.rbi +8 -0
  37. data/rbi/lib/terminal-shop/models/address_create_response.rbi +1 -0
  38. data/rbi/lib/terminal-shop/models/address_get_response.rbi +1 -0
  39. data/rbi/lib/terminal-shop/models/address_list_response.rbi +1 -0
  40. data/rbi/lib/terminal-shop/models/app.rbi +5 -0
  41. data/rbi/lib/terminal-shop/models/app_create_response.rbi +2 -0
  42. data/rbi/lib/terminal-shop/models/app_get_response.rbi +1 -0
  43. data/rbi/lib/terminal-shop/models/app_list_response.rbi +1 -0
  44. data/rbi/lib/terminal-shop/models/card.rbi +8 -0
  45. data/rbi/lib/terminal-shop/models/card_collect_response.rbi +4 -0
  46. data/rbi/lib/terminal-shop/models/card_create_params.rbi +2 -0
  47. data/rbi/lib/terminal-shop/models/card_create_response.rbi +1 -0
  48. data/rbi/lib/terminal-shop/models/card_get_response.rbi +1 -0
  49. data/rbi/lib/terminal-shop/models/card_list_response.rbi +1 -0
  50. data/rbi/lib/terminal-shop/models/cart.rbi +19 -0
  51. data/rbi/lib/terminal-shop/models/cart_convert_response.rbi +1 -0
  52. data/rbi/lib/terminal-shop/models/cart_get_response.rbi +1 -0
  53. data/rbi/lib/terminal-shop/models/cart_set_address_params.rbi +1 -0
  54. data/rbi/lib/terminal-shop/models/cart_set_card_params.rbi +1 -0
  55. data/rbi/lib/terminal-shop/models/cart_set_item_params.rbi +2 -0
  56. data/rbi/lib/terminal-shop/models/cart_set_item_response.rbi +1 -0
  57. data/rbi/lib/terminal-shop/models/email_create_params.rbi +1 -0
  58. data/rbi/lib/terminal-shop/models/order.rbi +28 -0
  59. data/rbi/lib/terminal-shop/models/order_create_params.rbi +3 -0
  60. data/rbi/lib/terminal-shop/models/order_create_response.rbi +1 -0
  61. data/rbi/lib/terminal-shop/models/order_get_response.rbi +1 -0
  62. data/rbi/lib/terminal-shop/models/order_list_response.rbi +1 -0
  63. data/rbi/lib/terminal-shop/models/product.rbi +12 -6
  64. data/rbi/lib/terminal-shop/models/product_get_response.rbi +1 -0
  65. data/rbi/lib/terminal-shop/models/product_list_response.rbi +1 -0
  66. data/rbi/lib/terminal-shop/models/product_variant.rbi +4 -0
  67. data/rbi/lib/terminal-shop/models/profile.rbi +8 -0
  68. data/rbi/lib/terminal-shop/models/profile_me_response.rbi +1 -0
  69. data/rbi/lib/terminal-shop/models/profile_update_response.rbi +1 -0
  70. data/rbi/lib/terminal-shop/models/region.rbi +15 -0
  71. data/rbi/lib/terminal-shop/models/subscription.rbi +18 -11
  72. data/rbi/lib/terminal-shop/models/subscription_get_response.rbi +1 -0
  73. data/rbi/lib/terminal-shop/models/subscription_list_response.rbi +1 -0
  74. data/rbi/lib/terminal-shop/models/token.rbi +5 -0
  75. data/rbi/lib/terminal-shop/models/token_create_response.rbi +3 -0
  76. data/rbi/lib/terminal-shop/models/token_get_response.rbi +2 -0
  77. data/rbi/lib/terminal-shop/models/token_list_response.rbi +1 -0
  78. data/rbi/lib/terminal-shop/models/view_init_response.rbi +5 -13
  79. data/rbi/lib/terminal-shop/pooled_net_requester.rbi +10 -3
  80. data/rbi/lib/terminal-shop/request_options.rbi +21 -2
  81. data/rbi/lib/terminal-shop/resources/address.rbi +22 -2
  82. data/rbi/lib/terminal-shop/resources/app.rbi +14 -2
  83. data/rbi/lib/terminal-shop/resources/card.rbi +22 -3
  84. data/rbi/lib/terminal-shop/resources/cart.rbi +23 -3
  85. data/rbi/lib/terminal-shop/resources/email.rbi +6 -1
  86. data/rbi/lib/terminal-shop/resources/order.rbi +17 -2
  87. data/rbi/lib/terminal-shop/resources/product.rbi +7 -1
  88. data/rbi/lib/terminal-shop/resources/profile.rbi +2 -0
  89. data/rbi/lib/terminal-shop/resources/subscription.rbi +21 -2
  90. data/rbi/lib/terminal-shop/resources/token.rbi +14 -2
  91. data/rbi/lib/terminal-shop/resources/view.rbi +2 -0
  92. data/rbi/lib/terminal-shop/util.rbi +55 -8
  93. data/rbi/lib/terminal-shop/version.rbi +1 -1
  94. data/sig/terminal-shop/base_client.rbs +6 -1
  95. data/sig/terminal-shop/base_model.rbs +8 -6
  96. data/sig/terminal-shop/errors.rbs +4 -4
  97. data/sig/terminal-shop/models/region.rbs +12 -0
  98. data/sig/terminal-shop/models/subscription.rbs +1 -1
  99. data/sig/terminal-shop/models/view_init_response.rbs +3 -12
  100. data/sig/terminal-shop/pooled_net_requester.rbs +7 -2
  101. data/sig/terminal-shop/util.rbs +4 -4
  102. data/sig/terminal-shop/version.rbs +1 -1
  103. metadata +7 -4
@@ -1,41 +1,35 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TerminalShop
4
- # @private
5
- #
6
- # @abstract
7
- #
4
+ # @api private
8
5
  module Converter
9
6
  # rubocop:disable Lint/UnusedMethodArgument
10
7
 
11
- # @private
8
+ # @api private
12
9
  #
13
10
  # @param value [Object]
14
11
  #
15
12
  # @return [Object]
16
- #
17
13
  def coerce(value) = value
18
14
 
19
- # @private
15
+ # @api private
20
16
  #
21
17
  # @param value [Object]
22
18
  #
23
19
  # @return [Object]
24
- #
25
20
  def dump(value) = value
26
21
 
27
- # @private
22
+ # @api private
28
23
  #
29
24
  # @param value [Object]
30
25
  #
31
26
  # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
32
- #
33
27
  def try_strict_coerce(value) = (raise NotImplementedError)
34
28
 
35
29
  # rubocop:enable Lint/UnusedMethodArgument
36
30
 
37
31
  class << self
38
- # @private
32
+ # @api private
39
33
  #
40
34
  # @param spec [Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class] .
41
35
  #
@@ -48,7 +42,6 @@ module TerminalShop
48
42
  # @option spec [Boolean] :"nil?"
49
43
  #
50
44
  # @return [Proc]
51
- #
52
45
  def type_info(spec)
53
46
  case spec
54
47
  in Hash
@@ -64,7 +57,7 @@ module TerminalShop
64
57
  end
65
58
  end
66
59
 
67
- # @private
60
+ # @api private
68
61
  #
69
62
  # Based on `target`, transform `value` into `target`, to the extent possible:
70
63
  #
@@ -77,7 +70,6 @@ module TerminalShop
77
70
  # @param value [Object]
78
71
  #
79
72
  # @return [Object]
80
- #
81
73
  def coerce(target, value)
82
74
  case target
83
75
  in TerminalShop::Converter
@@ -111,13 +103,12 @@ module TerminalShop
111
103
  end
112
104
  end
113
105
 
114
- # @private
106
+ # @api private
115
107
  #
116
108
  # @param target [TerminalShop::Converter, Class]
117
109
  # @param value [Object]
118
110
  #
119
111
  # @return [Object]
120
- #
121
112
  def dump(target, value)
122
113
  case target
123
114
  in TerminalShop::Converter
@@ -127,7 +118,7 @@ module TerminalShop
127
118
  end
128
119
  end
129
120
 
130
- # @private
121
+ # @api private
131
122
  #
132
123
  # The underlying algorithm for computing maximal compatibility is subject to
133
124
  # future improvements.
@@ -142,7 +133,6 @@ module TerminalShop
142
133
  # @param value [Object]
143
134
  #
144
135
  # @return [Object]
145
- #
146
136
  def try_strict_coerce(target, value)
147
137
  case target
148
138
  in TerminalShop::Converter
@@ -182,7 +172,7 @@ module TerminalShop
182
172
  end
183
173
  end
184
174
 
185
- # @private
175
+ # @api private
186
176
  #
187
177
  # @abstract
188
178
  #
@@ -197,40 +187,35 @@ module TerminalShop
197
187
  # @param other [Object]
198
188
  #
199
189
  # @return [Boolean]
200
- #
201
190
  def self.===(other) = true
202
191
 
203
192
  # @param other [Object]
204
193
  #
205
194
  # @return [Boolean]
206
- #
207
195
  def self.==(other) = other.is_a?(Class) && other <= TerminalShop::Unknown
208
196
 
209
197
  class << self
210
198
  # @!parse
211
- # # @private
199
+ # # @api private
212
200
  # #
213
201
  # # @param value [Object]
214
202
  # #
215
203
  # # @return [Object]
216
- # #
217
204
  # def coerce(value) = super
218
205
 
219
206
  # @!parse
220
- # # @private
207
+ # # @api private
221
208
  # #
222
209
  # # @param value [Object]
223
210
  # #
224
211
  # # @return [Object]
225
- # #
226
212
  # def dump(value) = super
227
213
 
228
- # @private
214
+ # @api private
229
215
  #
230
216
  # @param value [Object]
231
217
  #
232
218
  # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
233
- #
234
219
  def try_strict_coerce(value)
235
220
  # prevent unknown variant from being chosen during the first coercion pass
236
221
  [false, true, 0]
@@ -240,7 +225,7 @@ module TerminalShop
240
225
  # rubocop:enable Lint/UnusedMethodArgument
241
226
  end
242
227
 
243
- # @private
228
+ # @api private
244
229
  #
245
230
  # @abstract
246
231
  #
@@ -253,40 +238,35 @@ module TerminalShop
253
238
  # @param other [Object]
254
239
  #
255
240
  # @return [Boolean]
256
- #
257
241
  def self.===(other) = other == true || other == false
258
242
 
259
243
  # @param other [Object]
260
244
  #
261
245
  # @return [Boolean]
262
- #
263
246
  def self.==(other) = other.is_a?(Class) && other <= TerminalShop::BooleanModel
264
247
 
265
248
  class << self
266
249
  # @!parse
267
- # # @private
250
+ # # @api private
268
251
  # #
269
252
  # # @param value [Boolean, Object]
270
253
  # #
271
254
  # # @return [Boolean, Object]
272
- # #
273
255
  # def coerce(value) = super
274
256
 
275
257
  # @!parse
276
- # # @private
258
+ # # @api private
277
259
  # #
278
260
  # # @param value [Boolean, Object]
279
261
  # #
280
262
  # # @return [Boolean, Object]
281
- # #
282
263
  # def dump(value) = super
283
264
 
284
- # @private
265
+ # @api private
285
266
  #
286
267
  # @param value [Object]
287
268
  #
288
269
  # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
289
- #
290
270
  def try_strict_coerce(value)
291
271
  case value
292
272
  in true | false
@@ -298,7 +278,7 @@ module TerminalShop
298
278
  end
299
279
  end
300
280
 
301
- # @private
281
+ # @api private
302
282
  #
303
283
  # @abstract
304
284
  #
@@ -312,6 +292,31 @@ module TerminalShop
312
292
  #
313
293
  # We can therefore convert string values to Symbols, but can't convert other
314
294
  # values safely.
295
+ #
296
+ # @example
297
+ # ```ruby
298
+ # # `region` is a `TerminalShop::Models::Region`
299
+ # case region
300
+ # when TerminalShop::Models::Region::EU
301
+ # # ...
302
+ # when TerminalShop::Models::Region::NA
303
+ # # ...
304
+ # else
305
+ # puts(region)
306
+ # end
307
+ # ```
308
+ #
309
+ # @example
310
+ # ```ruby
311
+ # case region
312
+ # in :eu
313
+ # # ...
314
+ # in :na
315
+ # # ...
316
+ # else
317
+ # puts(region)
318
+ # end
319
+ # ```
315
320
  class Enum
316
321
  extend TerminalShop::Converter
317
322
 
@@ -319,13 +324,11 @@ module TerminalShop
319
324
  # All of the valid Symbol values for this enum.
320
325
  #
321
326
  # @return [Array<NilClass, Boolean, Integer, Float, Symbol>]
322
- #
323
327
  def values = (@values ||= constants.map { const_get(_1) })
324
328
 
325
- # @private
329
+ # @api private
326
330
  #
327
331
  # Guard against thread safety issues by instantiating `@values`.
328
- #
329
332
  private def finalize! = values
330
333
  end
331
334
 
@@ -334,24 +337,21 @@ module TerminalShop
334
337
  # @param other [Object]
335
338
  #
336
339
  # @return [Boolean]
337
- #
338
340
  def self.===(other) = values.include?(other)
339
341
 
340
342
  # @param other [Object]
341
343
  #
342
344
  # @return [Boolean]
343
- #
344
345
  def self.==(other)
345
346
  other.is_a?(Class) && other <= TerminalShop::Enum && other.values.to_set == values.to_set
346
347
  end
347
348
 
348
349
  class << self
349
- # @private
350
+ # @api private
350
351
  #
351
352
  # @param value [String, Symbol, Object]
352
353
  #
353
354
  # @return [Symbol, Object]
354
- #
355
355
  def coerce(value)
356
356
  case value
357
357
  in Symbol | String if values.include?(val = value.to_sym)
@@ -362,20 +362,18 @@ module TerminalShop
362
362
  end
363
363
 
364
364
  # @!parse
365
- # # @private
365
+ # # @api private
366
366
  # #
367
367
  # # @param value [Symbol, Object]
368
368
  # #
369
369
  # # @return [Symbol, Object]
370
- # #
371
370
  # def dump(value) = super
372
371
 
373
- # @private
372
+ # @api private
374
373
  #
375
374
  # @param value [Object]
376
375
  #
377
376
  # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
378
- #
379
377
  def try_strict_coerce(value)
380
378
  return [true, value, 1] if values.include?(value)
381
379
 
@@ -394,36 +392,37 @@ module TerminalShop
394
392
  end
395
393
  end
396
394
 
397
- # @private
395
+ # @api private
398
396
  #
399
397
  # @abstract
400
- #
401
398
  class Union
402
399
  extend TerminalShop::Converter
403
400
 
404
401
  class << self
405
- # @private
402
+ # @api private
406
403
  #
407
404
  # All of the specified variant info for this union.
408
405
  #
409
406
  # @return [Array<Array(Symbol, Proc)>]
410
- #
411
407
  private def known_variants = (@known_variants ||= [])
412
408
 
413
- # @private
414
- #
415
- # All of the specified variants for this union.
409
+ # @api private
416
410
  #
417
411
  # @return [Array<Array(Symbol, Object)>]
418
- #
419
- protected def variants
412
+ protected def derefed_variants
420
413
  @known_variants.map { |key, variant_fn| [key, variant_fn.call] }
421
414
  end
422
415
 
423
- # @private
416
+ # All of the specified variants for this union.
424
417
  #
425
- # @param property [Symbol]
418
+ # @return [Array<Object>]
419
+ def variants
420
+ derefed_variants.map(&:last)
421
+ end
422
+
423
+ # @api private
426
424
  #
425
+ # @param property [Symbol]
427
426
  private def discriminator(property)
428
427
  case property
429
428
  in Symbol
@@ -431,7 +430,7 @@ module TerminalShop
431
430
  end
432
431
  end
433
432
 
434
- # @private
433
+ # @api private
435
434
  #
436
435
  # @param key [Symbol, Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class]
437
436
  #
@@ -444,7 +443,6 @@ module TerminalShop
444
443
  # @option spec [Proc] :union
445
444
  #
446
445
  # @option spec [Boolean] :"nil?"
447
- #
448
446
  private def variant(key, spec = nil)
449
447
  variant_info =
450
448
  case key
@@ -457,12 +455,11 @@ module TerminalShop
457
455
  known_variants << variant_info
458
456
  end
459
457
 
460
- # @private
458
+ # @api private
461
459
  #
462
460
  # @param value [Object]
463
461
  #
464
462
  # @return [TerminalShop::Converter, Class, nil]
465
- #
466
463
  private def resolve_variant(value)
467
464
  case [@discriminator, value]
468
465
  in [_, TerminalShop::BaseModel]
@@ -492,7 +489,6 @@ module TerminalShop
492
489
  # @param other [Object]
493
490
  #
494
491
  # @return [Boolean]
495
- #
496
492
  def self.===(other)
497
493
  known_variants.any? do |_, variant_fn|
498
494
  variant_fn.call === other
@@ -502,18 +498,16 @@ module TerminalShop
502
498
  # @param other [Object]
503
499
  #
504
500
  # @return [Boolean]
505
- #
506
501
  def self.==(other)
507
- other.is_a?(Class) && other <= TerminalShop::Union && other.variants == variants
502
+ other.is_a?(Class) && other <= TerminalShop::Union && other.derefed_variants == derefed_variants
508
503
  end
509
504
 
510
505
  class << self
511
- # @private
506
+ # @api private
512
507
  #
513
508
  # @param value [Object]
514
509
  #
515
510
  # @return [Object]
516
- #
517
511
  def coerce(value)
518
512
  if (variant = resolve_variant(value))
519
513
  return TerminalShop::Converter.coerce(variant, value)
@@ -538,12 +532,11 @@ module TerminalShop
538
532
  variant.nil? ? value : TerminalShop::Converter.coerce(variant, value)
539
533
  end
540
534
 
541
- # @private
535
+ # @api private
542
536
  #
543
537
  # @param value [Object]
544
538
  #
545
539
  # @return [Object]
546
- #
547
540
  def dump(value)
548
541
  if (variant = resolve_variant(value))
549
542
  return TerminalShop::Converter.dump(variant, value)
@@ -558,12 +551,11 @@ module TerminalShop
558
551
  value
559
552
  end
560
553
 
561
- # @private
554
+ # @api private
562
555
  #
563
556
  # @param value [Object]
564
557
  #
565
558
  # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
566
- #
567
559
  def try_strict_coerce(value)
568
560
  # TODO(ruby) this will result in super linear decoding behaviour for nested unions
569
561
  # follow up with a decoding context that captures current strictness levels
@@ -596,7 +588,7 @@ module TerminalShop
596
588
  # rubocop:enable Style/HashEachMethods
597
589
  end
598
590
 
599
- # @private
591
+ # @api private
600
592
  #
601
593
  # @abstract
602
594
  #
@@ -611,7 +603,6 @@ module TerminalShop
611
603
  # @param other [Object]
612
604
  #
613
605
  # @return [Boolean]
614
- #
615
606
  def ===(other)
616
607
  type = item_type
617
608
  case other
@@ -627,15 +618,13 @@ module TerminalShop
627
618
  # @param other [Object]
628
619
  #
629
620
  # @return [Boolean]
630
- #
631
621
  def ==(other) = other.is_a?(TerminalShop::ArrayOf) && other.item_type == item_type
632
622
 
633
- # @private
623
+ # @api private
634
624
  #
635
625
  # @param value [Enumerable, Object]
636
626
  #
637
627
  # @return [Array<Object>, Object]
638
- #
639
628
  def coerce(value)
640
629
  type = item_type
641
630
  case value
@@ -646,12 +635,11 @@ module TerminalShop
646
635
  end
647
636
  end
648
637
 
649
- # @private
638
+ # @api private
650
639
  #
651
640
  # @param value [Enumerable, Object]
652
641
  #
653
642
  # @return [Array<Object>, Object]
654
- #
655
643
  def dump(value)
656
644
  type = item_type
657
645
  case value
@@ -662,12 +650,11 @@ module TerminalShop
662
650
  end
663
651
  end
664
652
 
665
- # @private
653
+ # @api private
666
654
  #
667
655
  # @param value [Object]
668
656
  #
669
657
  # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
670
- #
671
658
  def try_strict_coerce(value)
672
659
  case value
673
660
  in Array
@@ -701,13 +688,12 @@ module TerminalShop
701
688
  end
702
689
  end
703
690
 
704
- # @private
691
+ # @api private
705
692
  #
706
693
  # @return [TerminalShop::Converter, Class]
707
- #
708
694
  protected def item_type = @item_type_fn.call
709
695
 
710
- # @private
696
+ # @api private
711
697
  #
712
698
  # @param type_info [Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class]
713
699
  #
@@ -720,13 +706,12 @@ module TerminalShop
720
706
  # @option spec [Proc] :union
721
707
  #
722
708
  # @option spec [Boolean] :"nil?"
723
- #
724
709
  def initialize(type_info, spec = {})
725
710
  @item_type_fn = TerminalShop::Converter.type_info(type_info || spec)
726
711
  end
727
712
  end
728
713
 
729
- # @private
714
+ # @api private
730
715
  #
731
716
  # @abstract
732
717
  #
@@ -741,7 +726,6 @@ module TerminalShop
741
726
  # @param other [Object]
742
727
  #
743
728
  # @return [Boolean]
744
- #
745
729
  def ===(other)
746
730
  type = item_type
747
731
  case other
@@ -762,15 +746,13 @@ module TerminalShop
762
746
  # @param other [Object]
763
747
  #
764
748
  # @return [Boolean]
765
- #
766
749
  def ==(other) = other.is_a?(TerminalShop::HashOf) && other.item_type == item_type
767
750
 
768
- # @private
751
+ # @api private
769
752
  #
770
753
  # @param value [Hash{Object=>Object}, Object]
771
754
  #
772
755
  # @return [Hash{Symbol=>Object}, Object]
773
- #
774
756
  def coerce(value)
775
757
  type = item_type
776
758
  case value
@@ -784,12 +766,11 @@ module TerminalShop
784
766
  end
785
767
  end
786
768
 
787
- # @private
769
+ # @api private
788
770
  #
789
771
  # @param value [Hash{Object=>Object}, Object]
790
772
  #
791
773
  # @return [Hash{Symbol=>Object}, Object]
792
- #
793
774
  def dump(value)
794
775
  type = item_type
795
776
  case value
@@ -802,12 +783,11 @@ module TerminalShop
802
783
  end
803
784
  end
804
785
 
805
- # @private
786
+ # @api private
806
787
  #
807
788
  # @param value [Object]
808
789
  #
809
790
  # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
810
- #
811
791
  def try_strict_coerce(value)
812
792
  case value
813
793
  in Hash
@@ -841,13 +821,12 @@ module TerminalShop
841
821
  end
842
822
  end
843
823
 
844
- # @private
824
+ # @api private
845
825
  #
846
826
  # @return [TerminalShop::Converter, Class]
847
- #
848
827
  protected def item_type = @item_type_fn.call
849
828
 
850
- # @private
829
+ # @api private
851
830
  #
852
831
  # @param type_info [Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class]
853
832
  #
@@ -860,14 +839,11 @@ module TerminalShop
860
839
  # @option spec [Proc] :union
861
840
  #
862
841
  # @option spec [Boolean] :"nil?"
863
- #
864
842
  def initialize(type_info, spec = {})
865
843
  @item_type_fn = TerminalShop::Converter.type_info(type_info || spec)
866
844
  end
867
845
  end
868
846
 
869
- # @private
870
- #
871
847
  # @abstract
872
848
  #
873
849
  # @example
@@ -883,32 +859,31 @@ module TerminalShop
883
859
  extend TerminalShop::Converter
884
860
 
885
861
  class << self
886
- # @private
862
+ # @api private
887
863
  #
888
864
  # Assumes superclass fields are totally defined before fields are accessed /
889
865
  # defined on subclasses.
890
866
  #
891
867
  # @return [Hash{Symbol=>Hash{Symbol=>Object}}]
892
- #
893
868
  def known_fields
894
869
  @known_fields ||= (self < TerminalShop::BaseModel ? superclass.known_fields.dup : {})
895
870
  end
896
871
 
897
- # @return [Hash{Symbol=>Hash{Symbol=>Object}}]
872
+ # @api private
898
873
  #
874
+ # @return [Hash{Symbol=>Hash{Symbol=>Object}}]
899
875
  def fields
900
876
  known_fields.transform_values do |field|
901
877
  {**field.except(:type_fn), type: field.fetch(:type_fn).call}
902
878
  end
903
879
  end
904
880
 
905
- # @private
881
+ # @api private
906
882
  #
907
883
  # @return [Hash{Symbol=>Proc}]
908
- #
909
884
  def defaults = (@defaults ||= {})
910
885
 
911
- # @private
886
+ # @api private
912
887
  #
913
888
  # @param name_sym [Symbol]
914
889
  #
@@ -925,7 +900,6 @@ module TerminalShop
925
900
  # @option spec [Proc] :union
926
901
  #
927
902
  # @option spec [Boolean] :"nil?"
928
- #
929
903
  private def add_field(name_sym, required:, type_info:, spec:)
930
904
  type_fn, info =
931
905
  case type_info
@@ -964,7 +938,7 @@ module TerminalShop
964
938
  end
965
939
  end
966
940
 
967
- # @private
941
+ # @api private
968
942
  #
969
943
  # @param name_sym [Symbol]
970
944
  #
@@ -979,12 +953,11 @@ module TerminalShop
979
953
  # @option spec [Proc] :union
980
954
  #
981
955
  # @option spec [Boolean] :"nil?"
982
- #
983
956
  def required(name_sym, type_info, spec = {})
984
957
  add_field(name_sym, required: true, type_info: type_info, spec: spec)
985
958
  end
986
959
 
987
- # @private
960
+ # @api private
988
961
  #
989
962
  # @param name_sym [Symbol]
990
963
  #
@@ -999,18 +972,16 @@ module TerminalShop
999
972
  # @option spec [Proc] :union
1000
973
  #
1001
974
  # @option spec [Boolean] :"nil?"
1002
- #
1003
975
  def optional(name_sym, type_info, spec = {})
1004
976
  add_field(name_sym, required: false, type_info: type_info, spec: spec)
1005
977
  end
1006
978
 
1007
- # @private
979
+ # @api private
1008
980
  #
1009
981
  # `request_only` attributes not excluded from `.#coerce` when receiving responses
1010
982
  # even if well behaved servers should not send them
1011
983
  #
1012
984
  # @param blk [Proc]
1013
- #
1014
985
  private def request_only(&blk)
1015
986
  @mode = :dump
1016
987
  blk.call
@@ -1018,12 +989,11 @@ module TerminalShop
1018
989
  @mode = nil
1019
990
  end
1020
991
 
1021
- # @private
992
+ # @api private
1022
993
  #
1023
994
  # `response_only` attributes are omitted from `.#dump` when making requests
1024
995
  #
1025
996
  # @param blk [Proc]
1026
- #
1027
997
  private def response_only(&blk)
1028
998
  @mode = :coerce
1029
999
  blk.call
@@ -1035,7 +1005,6 @@ module TerminalShop
1035
1005
  # @param other [Object]
1036
1006
  #
1037
1007
  # @return [Boolean]
1038
- #
1039
1008
  def ==(other)
1040
1009
  case other
1041
1010
  in TerminalShop::BaseModel
@@ -1046,12 +1015,11 @@ module TerminalShop
1046
1015
  end
1047
1016
 
1048
1017
  class << self
1049
- # @private
1018
+ # @api private
1050
1019
  #
1051
1020
  # @param value [TerminalShop::BaseModel, Hash{Object=>Object}, Object]
1052
1021
  #
1053
1022
  # @return [TerminalShop::BaseModel, Object]
1054
- #
1055
1023
  def coerce(value)
1056
1024
  case TerminalShop::Util.coerce_hash(value)
1057
1025
  in Hash => coerced
@@ -1061,12 +1029,11 @@ module TerminalShop
1061
1029
  end
1062
1030
  end
1063
1031
 
1064
- # @private
1032
+ # @api private
1065
1033
  #
1066
1034
  # @param value [TerminalShop::BaseModel, Object]
1067
1035
  #
1068
1036
  # @return [Hash{Object=>Object}, Object]
1069
- #
1070
1037
  def dump(value)
1071
1038
  unless (coerced = TerminalShop::Util.coerce_hash(value)).is_a?(Hash)
1072
1039
  return value
@@ -1098,12 +1065,11 @@ module TerminalShop
1098
1065
  values
1099
1066
  end
1100
1067
 
1101
- # @private
1068
+ # @api private
1102
1069
  #
1103
1070
  # @param value [Object]
1104
1071
  #
1105
1072
  # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
1106
- #
1107
1073
  def try_strict_coerce(value)
1108
1074
  case value
1109
1075
  in Hash | TerminalShop::BaseModel
@@ -1161,7 +1127,6 @@ module TerminalShop
1161
1127
  # @param key [Symbol]
1162
1128
  #
1163
1129
  # @return [Object, nil]
1164
- #
1165
1130
  def [](key)
1166
1131
  unless key.instance_of?(Symbol)
1167
1132
  raise ArgumentError.new("Expected symbol key for lookup, got #{key.inspect}")
@@ -1180,7 +1145,6 @@ module TerminalShop
1180
1145
  # should not be mutated.
1181
1146
  #
1182
1147
  # @return [Hash{Symbol=>Object}]
1183
- #
1184
1148
  def to_h = @data
1185
1149
 
1186
1150
  alias_method :to_hash, :to_h
@@ -1188,7 +1152,6 @@ module TerminalShop
1188
1152
  # @param keys [Array<Symbol>, nil]
1189
1153
  #
1190
1154
  # @return [Hash{Symbol=>Object}]
1191
- #
1192
1155
  def deconstruct_keys(keys)
1193
1156
  (keys || self.class.known_fields.keys).filter_map do |k|
1194
1157
  unless self.class.known_fields.key?(k)
@@ -1203,7 +1166,6 @@ module TerminalShop
1203
1166
  # Create a new instance of a model.
1204
1167
  #
1205
1168
  # @param data [Hash{Symbol=>Object}, TerminalShop::BaseModel]
1206
- #
1207
1169
  def initialize(data = {})
1208
1170
  case TerminalShop::Util.coerce_hash(data)
1209
1171
  in Hash => coerced
@@ -1214,11 +1176,9 @@ module TerminalShop
1214
1176
  end
1215
1177
 
1216
1178
  # @return [String]
1217
- #
1218
1179
  def to_s = @data.to_s
1219
1180
 
1220
1181
  # @return [String]
1221
- #
1222
1182
  def inspect
1223
1183
  "#<#{self.class.name}:0x#{object_id.to_s(16)} #{deconstruct_keys(nil).map do |k, v|
1224
1184
  "#{k}=#{v.inspect}"