terminal-shop 1.7.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 (99) 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 +65 -130
  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/subscription.rb +6 -0
  10. data/lib/terminal-shop/pooled_net_requester.rb +19 -21
  11. data/lib/terminal-shop/request_options.rb +4 -11
  12. data/lib/terminal-shop/resources/address.rb +0 -5
  13. data/lib/terminal-shop/resources/app.rb +0 -5
  14. data/lib/terminal-shop/resources/card.rb +0 -6
  15. data/lib/terminal-shop/resources/cart.rb +0 -7
  16. data/lib/terminal-shop/resources/email.rb +0 -2
  17. data/lib/terminal-shop/resources/order.rb +0 -4
  18. data/lib/terminal-shop/resources/product.rb +0 -3
  19. data/lib/terminal-shop/resources/profile.rb +0 -3
  20. data/lib/terminal-shop/resources/subscription.rb +0 -5
  21. data/lib/terminal-shop/resources/token.rb +0 -5
  22. data/lib/terminal-shop/resources/view.rb +0 -2
  23. data/lib/terminal-shop/util.rb +44 -71
  24. data/lib/terminal-shop/version.rb +1 -1
  25. data/lib/terminal-shop.rb +1 -0
  26. data/manifest.yaml +1 -0
  27. data/rbi/lib/terminal-shop/base_client.rbi +23 -0
  28. data/rbi/lib/terminal-shop/base_model.rbi +178 -52
  29. data/rbi/lib/terminal-shop/base_page.rbi +1 -2
  30. data/rbi/lib/terminal-shop/client.rbi +11 -0
  31. data/rbi/lib/terminal-shop/errors.rbi +33 -0
  32. data/rbi/lib/terminal-shop/extern.rbi +1 -1
  33. data/rbi/lib/terminal-shop/models/address.rbi +10 -0
  34. data/rbi/lib/terminal-shop/models/address_create_params.rbi +8 -0
  35. data/rbi/lib/terminal-shop/models/address_create_response.rbi +1 -0
  36. data/rbi/lib/terminal-shop/models/address_get_response.rbi +1 -0
  37. data/rbi/lib/terminal-shop/models/address_list_response.rbi +1 -0
  38. data/rbi/lib/terminal-shop/models/app.rbi +5 -0
  39. data/rbi/lib/terminal-shop/models/app_create_response.rbi +2 -0
  40. data/rbi/lib/terminal-shop/models/app_get_response.rbi +1 -0
  41. data/rbi/lib/terminal-shop/models/app_list_response.rbi +1 -0
  42. data/rbi/lib/terminal-shop/models/card.rbi +8 -0
  43. data/rbi/lib/terminal-shop/models/card_collect_response.rbi +4 -0
  44. data/rbi/lib/terminal-shop/models/card_create_params.rbi +2 -0
  45. data/rbi/lib/terminal-shop/models/card_create_response.rbi +1 -0
  46. data/rbi/lib/terminal-shop/models/card_get_response.rbi +1 -0
  47. data/rbi/lib/terminal-shop/models/card_list_response.rbi +1 -0
  48. data/rbi/lib/terminal-shop/models/cart.rbi +19 -0
  49. data/rbi/lib/terminal-shop/models/cart_convert_response.rbi +1 -0
  50. data/rbi/lib/terminal-shop/models/cart_get_response.rbi +1 -0
  51. data/rbi/lib/terminal-shop/models/cart_set_address_params.rbi +1 -0
  52. data/rbi/lib/terminal-shop/models/cart_set_card_params.rbi +1 -0
  53. data/rbi/lib/terminal-shop/models/cart_set_item_params.rbi +2 -0
  54. data/rbi/lib/terminal-shop/models/cart_set_item_response.rbi +1 -0
  55. data/rbi/lib/terminal-shop/models/email_create_params.rbi +1 -0
  56. data/rbi/lib/terminal-shop/models/order.rbi +28 -0
  57. data/rbi/lib/terminal-shop/models/order_create_params.rbi +3 -0
  58. data/rbi/lib/terminal-shop/models/order_create_response.rbi +1 -0
  59. data/rbi/lib/terminal-shop/models/order_get_response.rbi +1 -0
  60. data/rbi/lib/terminal-shop/models/order_list_response.rbi +1 -0
  61. data/rbi/lib/terminal-shop/models/product.rbi +12 -6
  62. data/rbi/lib/terminal-shop/models/product_get_response.rbi +1 -0
  63. data/rbi/lib/terminal-shop/models/product_list_response.rbi +1 -0
  64. data/rbi/lib/terminal-shop/models/product_variant.rbi +4 -0
  65. data/rbi/lib/terminal-shop/models/profile.rbi +8 -0
  66. data/rbi/lib/terminal-shop/models/profile_me_response.rbi +1 -0
  67. data/rbi/lib/terminal-shop/models/profile_update_response.rbi +1 -0
  68. data/rbi/lib/terminal-shop/models/region.rbi +3 -6
  69. data/rbi/lib/terminal-shop/models/subscription.rbi +18 -11
  70. data/rbi/lib/terminal-shop/models/subscription_get_response.rbi +1 -0
  71. data/rbi/lib/terminal-shop/models/subscription_list_response.rbi +1 -0
  72. data/rbi/lib/terminal-shop/models/token.rbi +5 -0
  73. data/rbi/lib/terminal-shop/models/token_create_response.rbi +3 -0
  74. data/rbi/lib/terminal-shop/models/token_get_response.rbi +2 -0
  75. data/rbi/lib/terminal-shop/models/token_list_response.rbi +1 -0
  76. data/rbi/lib/terminal-shop/models/view_init_response.rbi +5 -0
  77. data/rbi/lib/terminal-shop/pooled_net_requester.rbi +10 -3
  78. data/rbi/lib/terminal-shop/request_options.rbi +21 -2
  79. data/rbi/lib/terminal-shop/resources/address.rbi +22 -2
  80. data/rbi/lib/terminal-shop/resources/app.rbi +14 -2
  81. data/rbi/lib/terminal-shop/resources/card.rbi +22 -3
  82. data/rbi/lib/terminal-shop/resources/cart.rbi +23 -3
  83. data/rbi/lib/terminal-shop/resources/email.rbi +6 -1
  84. data/rbi/lib/terminal-shop/resources/order.rbi +17 -2
  85. data/rbi/lib/terminal-shop/resources/product.rbi +7 -1
  86. data/rbi/lib/terminal-shop/resources/profile.rbi +2 -0
  87. data/rbi/lib/terminal-shop/resources/subscription.rbi +21 -2
  88. data/rbi/lib/terminal-shop/resources/token.rbi +14 -2
  89. data/rbi/lib/terminal-shop/resources/view.rbi +2 -0
  90. data/rbi/lib/terminal-shop/util.rbi +55 -8
  91. data/rbi/lib/terminal-shop/version.rbi +1 -1
  92. data/sig/terminal-shop/base_client.rbs +6 -1
  93. data/sig/terminal-shop/base_model.rbs +8 -6
  94. data/sig/terminal-shop/errors.rbs +4 -4
  95. data/sig/terminal-shop/models/subscription.rbs +1 -1
  96. data/sig/terminal-shop/pooled_net_requester.rbs +7 -2
  97. data/sig/terminal-shop/util.rbs +4 -4
  98. data/sig/terminal-shop/version.rbs +1 -1
  99. metadata +4 -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
  #
@@ -322,7 +302,7 @@ module TerminalShop
322
302
  # when TerminalShop::Models::Region::NA
323
303
  # # ...
324
304
  # else
325
- # # ...
305
+ # puts(region)
326
306
  # end
327
307
  # ```
328
308
  #
@@ -334,7 +314,7 @@ module TerminalShop
334
314
  # in :na
335
315
  # # ...
336
316
  # else
337
- # # ...
317
+ # puts(region)
338
318
  # end
339
319
  # ```
340
320
  class Enum
@@ -344,13 +324,11 @@ module TerminalShop
344
324
  # All of the valid Symbol values for this enum.
345
325
  #
346
326
  # @return [Array<NilClass, Boolean, Integer, Float, Symbol>]
347
- #
348
327
  def values = (@values ||= constants.map { const_get(_1) })
349
328
 
350
- # @private
329
+ # @api private
351
330
  #
352
331
  # Guard against thread safety issues by instantiating `@values`.
353
- #
354
332
  private def finalize! = values
355
333
  end
356
334
 
@@ -359,24 +337,21 @@ module TerminalShop
359
337
  # @param other [Object]
360
338
  #
361
339
  # @return [Boolean]
362
- #
363
340
  def self.===(other) = values.include?(other)
364
341
 
365
342
  # @param other [Object]
366
343
  #
367
344
  # @return [Boolean]
368
- #
369
345
  def self.==(other)
370
346
  other.is_a?(Class) && other <= TerminalShop::Enum && other.values.to_set == values.to_set
371
347
  end
372
348
 
373
349
  class << self
374
- # @private
350
+ # @api private
375
351
  #
376
352
  # @param value [String, Symbol, Object]
377
353
  #
378
354
  # @return [Symbol, Object]
379
- #
380
355
  def coerce(value)
381
356
  case value
382
357
  in Symbol | String if values.include?(val = value.to_sym)
@@ -387,20 +362,18 @@ module TerminalShop
387
362
  end
388
363
 
389
364
  # @!parse
390
- # # @private
365
+ # # @api private
391
366
  # #
392
367
  # # @param value [Symbol, Object]
393
368
  # #
394
369
  # # @return [Symbol, Object]
395
- # #
396
370
  # def dump(value) = super
397
371
 
398
- # @private
372
+ # @api private
399
373
  #
400
374
  # @param value [Object]
401
375
  #
402
376
  # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
403
- #
404
377
  def try_strict_coerce(value)
405
378
  return [true, value, 1] if values.include?(value)
406
379
 
@@ -419,36 +392,37 @@ module TerminalShop
419
392
  end
420
393
  end
421
394
 
422
- # @private
395
+ # @api private
423
396
  #
424
397
  # @abstract
425
- #
426
398
  class Union
427
399
  extend TerminalShop::Converter
428
400
 
429
401
  class << self
430
- # @private
402
+ # @api private
431
403
  #
432
404
  # All of the specified variant info for this union.
433
405
  #
434
406
  # @return [Array<Array(Symbol, Proc)>]
435
- #
436
407
  private def known_variants = (@known_variants ||= [])
437
408
 
438
- # @private
439
- #
440
- # All of the specified variants for this union.
409
+ # @api private
441
410
  #
442
411
  # @return [Array<Array(Symbol, Object)>]
443
- #
444
- protected def variants
412
+ protected def derefed_variants
445
413
  @known_variants.map { |key, variant_fn| [key, variant_fn.call] }
446
414
  end
447
415
 
448
- # @private
416
+ # All of the specified variants for this union.
417
+ #
418
+ # @return [Array<Object>]
419
+ def variants
420
+ derefed_variants.map(&:last)
421
+ end
422
+
423
+ # @api private
449
424
  #
450
425
  # @param property [Symbol]
451
- #
452
426
  private def discriminator(property)
453
427
  case property
454
428
  in Symbol
@@ -456,7 +430,7 @@ module TerminalShop
456
430
  end
457
431
  end
458
432
 
459
- # @private
433
+ # @api private
460
434
  #
461
435
  # @param key [Symbol, Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class]
462
436
  #
@@ -469,7 +443,6 @@ module TerminalShop
469
443
  # @option spec [Proc] :union
470
444
  #
471
445
  # @option spec [Boolean] :"nil?"
472
- #
473
446
  private def variant(key, spec = nil)
474
447
  variant_info =
475
448
  case key
@@ -482,12 +455,11 @@ module TerminalShop
482
455
  known_variants << variant_info
483
456
  end
484
457
 
485
- # @private
458
+ # @api private
486
459
  #
487
460
  # @param value [Object]
488
461
  #
489
462
  # @return [TerminalShop::Converter, Class, nil]
490
- #
491
463
  private def resolve_variant(value)
492
464
  case [@discriminator, value]
493
465
  in [_, TerminalShop::BaseModel]
@@ -517,7 +489,6 @@ module TerminalShop
517
489
  # @param other [Object]
518
490
  #
519
491
  # @return [Boolean]
520
- #
521
492
  def self.===(other)
522
493
  known_variants.any? do |_, variant_fn|
523
494
  variant_fn.call === other
@@ -527,18 +498,16 @@ module TerminalShop
527
498
  # @param other [Object]
528
499
  #
529
500
  # @return [Boolean]
530
- #
531
501
  def self.==(other)
532
- other.is_a?(Class) && other <= TerminalShop::Union && other.variants == variants
502
+ other.is_a?(Class) && other <= TerminalShop::Union && other.derefed_variants == derefed_variants
533
503
  end
534
504
 
535
505
  class << self
536
- # @private
506
+ # @api private
537
507
  #
538
508
  # @param value [Object]
539
509
  #
540
510
  # @return [Object]
541
- #
542
511
  def coerce(value)
543
512
  if (variant = resolve_variant(value))
544
513
  return TerminalShop::Converter.coerce(variant, value)
@@ -563,12 +532,11 @@ module TerminalShop
563
532
  variant.nil? ? value : TerminalShop::Converter.coerce(variant, value)
564
533
  end
565
534
 
566
- # @private
535
+ # @api private
567
536
  #
568
537
  # @param value [Object]
569
538
  #
570
539
  # @return [Object]
571
- #
572
540
  def dump(value)
573
541
  if (variant = resolve_variant(value))
574
542
  return TerminalShop::Converter.dump(variant, value)
@@ -583,12 +551,11 @@ module TerminalShop
583
551
  value
584
552
  end
585
553
 
586
- # @private
554
+ # @api private
587
555
  #
588
556
  # @param value [Object]
589
557
  #
590
558
  # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
591
- #
592
559
  def try_strict_coerce(value)
593
560
  # TODO(ruby) this will result in super linear decoding behaviour for nested unions
594
561
  # follow up with a decoding context that captures current strictness levels
@@ -621,7 +588,7 @@ module TerminalShop
621
588
  # rubocop:enable Style/HashEachMethods
622
589
  end
623
590
 
624
- # @private
591
+ # @api private
625
592
  #
626
593
  # @abstract
627
594
  #
@@ -636,7 +603,6 @@ module TerminalShop
636
603
  # @param other [Object]
637
604
  #
638
605
  # @return [Boolean]
639
- #
640
606
  def ===(other)
641
607
  type = item_type
642
608
  case other
@@ -652,15 +618,13 @@ module TerminalShop
652
618
  # @param other [Object]
653
619
  #
654
620
  # @return [Boolean]
655
- #
656
621
  def ==(other) = other.is_a?(TerminalShop::ArrayOf) && other.item_type == item_type
657
622
 
658
- # @private
623
+ # @api private
659
624
  #
660
625
  # @param value [Enumerable, Object]
661
626
  #
662
627
  # @return [Array<Object>, Object]
663
- #
664
628
  def coerce(value)
665
629
  type = item_type
666
630
  case value
@@ -671,12 +635,11 @@ module TerminalShop
671
635
  end
672
636
  end
673
637
 
674
- # @private
638
+ # @api private
675
639
  #
676
640
  # @param value [Enumerable, Object]
677
641
  #
678
642
  # @return [Array<Object>, Object]
679
- #
680
643
  def dump(value)
681
644
  type = item_type
682
645
  case value
@@ -687,12 +650,11 @@ module TerminalShop
687
650
  end
688
651
  end
689
652
 
690
- # @private
653
+ # @api private
691
654
  #
692
655
  # @param value [Object]
693
656
  #
694
657
  # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
695
- #
696
658
  def try_strict_coerce(value)
697
659
  case value
698
660
  in Array
@@ -726,13 +688,12 @@ module TerminalShop
726
688
  end
727
689
  end
728
690
 
729
- # @private
691
+ # @api private
730
692
  #
731
693
  # @return [TerminalShop::Converter, Class]
732
- #
733
694
  protected def item_type = @item_type_fn.call
734
695
 
735
- # @private
696
+ # @api private
736
697
  #
737
698
  # @param type_info [Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class]
738
699
  #
@@ -745,13 +706,12 @@ module TerminalShop
745
706
  # @option spec [Proc] :union
746
707
  #
747
708
  # @option spec [Boolean] :"nil?"
748
- #
749
709
  def initialize(type_info, spec = {})
750
710
  @item_type_fn = TerminalShop::Converter.type_info(type_info || spec)
751
711
  end
752
712
  end
753
713
 
754
- # @private
714
+ # @api private
755
715
  #
756
716
  # @abstract
757
717
  #
@@ -766,7 +726,6 @@ module TerminalShop
766
726
  # @param other [Object]
767
727
  #
768
728
  # @return [Boolean]
769
- #
770
729
  def ===(other)
771
730
  type = item_type
772
731
  case other
@@ -787,15 +746,13 @@ module TerminalShop
787
746
  # @param other [Object]
788
747
  #
789
748
  # @return [Boolean]
790
- #
791
749
  def ==(other) = other.is_a?(TerminalShop::HashOf) && other.item_type == item_type
792
750
 
793
- # @private
751
+ # @api private
794
752
  #
795
753
  # @param value [Hash{Object=>Object}, Object]
796
754
  #
797
755
  # @return [Hash{Symbol=>Object}, Object]
798
- #
799
756
  def coerce(value)
800
757
  type = item_type
801
758
  case value
@@ -809,12 +766,11 @@ module TerminalShop
809
766
  end
810
767
  end
811
768
 
812
- # @private
769
+ # @api private
813
770
  #
814
771
  # @param value [Hash{Object=>Object}, Object]
815
772
  #
816
773
  # @return [Hash{Symbol=>Object}, Object]
817
- #
818
774
  def dump(value)
819
775
  type = item_type
820
776
  case value
@@ -827,12 +783,11 @@ module TerminalShop
827
783
  end
828
784
  end
829
785
 
830
- # @private
786
+ # @api private
831
787
  #
832
788
  # @param value [Object]
833
789
  #
834
790
  # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
835
- #
836
791
  def try_strict_coerce(value)
837
792
  case value
838
793
  in Hash
@@ -866,13 +821,12 @@ module TerminalShop
866
821
  end
867
822
  end
868
823
 
869
- # @private
824
+ # @api private
870
825
  #
871
826
  # @return [TerminalShop::Converter, Class]
872
- #
873
827
  protected def item_type = @item_type_fn.call
874
828
 
875
- # @private
829
+ # @api private
876
830
  #
877
831
  # @param type_info [Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class]
878
832
  #
@@ -885,14 +839,11 @@ module TerminalShop
885
839
  # @option spec [Proc] :union
886
840
  #
887
841
  # @option spec [Boolean] :"nil?"
888
- #
889
842
  def initialize(type_info, spec = {})
890
843
  @item_type_fn = TerminalShop::Converter.type_info(type_info || spec)
891
844
  end
892
845
  end
893
846
 
894
- # @private
895
- #
896
847
  # @abstract
897
848
  #
898
849
  # @example
@@ -908,32 +859,31 @@ module TerminalShop
908
859
  extend TerminalShop::Converter
909
860
 
910
861
  class << self
911
- # @private
862
+ # @api private
912
863
  #
913
864
  # Assumes superclass fields are totally defined before fields are accessed /
914
865
  # defined on subclasses.
915
866
  #
916
867
  # @return [Hash{Symbol=>Hash{Symbol=>Object}}]
917
- #
918
868
  def known_fields
919
869
  @known_fields ||= (self < TerminalShop::BaseModel ? superclass.known_fields.dup : {})
920
870
  end
921
871
 
922
- # @return [Hash{Symbol=>Hash{Symbol=>Object}}]
872
+ # @api private
923
873
  #
874
+ # @return [Hash{Symbol=>Hash{Symbol=>Object}}]
924
875
  def fields
925
876
  known_fields.transform_values do |field|
926
877
  {**field.except(:type_fn), type: field.fetch(:type_fn).call}
927
878
  end
928
879
  end
929
880
 
930
- # @private
881
+ # @api private
931
882
  #
932
883
  # @return [Hash{Symbol=>Proc}]
933
- #
934
884
  def defaults = (@defaults ||= {})
935
885
 
936
- # @private
886
+ # @api private
937
887
  #
938
888
  # @param name_sym [Symbol]
939
889
  #
@@ -950,7 +900,6 @@ module TerminalShop
950
900
  # @option spec [Proc] :union
951
901
  #
952
902
  # @option spec [Boolean] :"nil?"
953
- #
954
903
  private def add_field(name_sym, required:, type_info:, spec:)
955
904
  type_fn, info =
956
905
  case type_info
@@ -989,7 +938,7 @@ module TerminalShop
989
938
  end
990
939
  end
991
940
 
992
- # @private
941
+ # @api private
993
942
  #
994
943
  # @param name_sym [Symbol]
995
944
  #
@@ -1004,12 +953,11 @@ module TerminalShop
1004
953
  # @option spec [Proc] :union
1005
954
  #
1006
955
  # @option spec [Boolean] :"nil?"
1007
- #
1008
956
  def required(name_sym, type_info, spec = {})
1009
957
  add_field(name_sym, required: true, type_info: type_info, spec: spec)
1010
958
  end
1011
959
 
1012
- # @private
960
+ # @api private
1013
961
  #
1014
962
  # @param name_sym [Symbol]
1015
963
  #
@@ -1024,18 +972,16 @@ module TerminalShop
1024
972
  # @option spec [Proc] :union
1025
973
  #
1026
974
  # @option spec [Boolean] :"nil?"
1027
- #
1028
975
  def optional(name_sym, type_info, spec = {})
1029
976
  add_field(name_sym, required: false, type_info: type_info, spec: spec)
1030
977
  end
1031
978
 
1032
- # @private
979
+ # @api private
1033
980
  #
1034
981
  # `request_only` attributes not excluded from `.#coerce` when receiving responses
1035
982
  # even if well behaved servers should not send them
1036
983
  #
1037
984
  # @param blk [Proc]
1038
- #
1039
985
  private def request_only(&blk)
1040
986
  @mode = :dump
1041
987
  blk.call
@@ -1043,12 +989,11 @@ module TerminalShop
1043
989
  @mode = nil
1044
990
  end
1045
991
 
1046
- # @private
992
+ # @api private
1047
993
  #
1048
994
  # `response_only` attributes are omitted from `.#dump` when making requests
1049
995
  #
1050
996
  # @param blk [Proc]
1051
- #
1052
997
  private def response_only(&blk)
1053
998
  @mode = :coerce
1054
999
  blk.call
@@ -1060,7 +1005,6 @@ module TerminalShop
1060
1005
  # @param other [Object]
1061
1006
  #
1062
1007
  # @return [Boolean]
1063
- #
1064
1008
  def ==(other)
1065
1009
  case other
1066
1010
  in TerminalShop::BaseModel
@@ -1071,12 +1015,11 @@ module TerminalShop
1071
1015
  end
1072
1016
 
1073
1017
  class << self
1074
- # @private
1018
+ # @api private
1075
1019
  #
1076
1020
  # @param value [TerminalShop::BaseModel, Hash{Object=>Object}, Object]
1077
1021
  #
1078
1022
  # @return [TerminalShop::BaseModel, Object]
1079
- #
1080
1023
  def coerce(value)
1081
1024
  case TerminalShop::Util.coerce_hash(value)
1082
1025
  in Hash => coerced
@@ -1086,12 +1029,11 @@ module TerminalShop
1086
1029
  end
1087
1030
  end
1088
1031
 
1089
- # @private
1032
+ # @api private
1090
1033
  #
1091
1034
  # @param value [TerminalShop::BaseModel, Object]
1092
1035
  #
1093
1036
  # @return [Hash{Object=>Object}, Object]
1094
- #
1095
1037
  def dump(value)
1096
1038
  unless (coerced = TerminalShop::Util.coerce_hash(value)).is_a?(Hash)
1097
1039
  return value
@@ -1123,12 +1065,11 @@ module TerminalShop
1123
1065
  values
1124
1066
  end
1125
1067
 
1126
- # @private
1068
+ # @api private
1127
1069
  #
1128
1070
  # @param value [Object]
1129
1071
  #
1130
1072
  # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
1131
- #
1132
1073
  def try_strict_coerce(value)
1133
1074
  case value
1134
1075
  in Hash | TerminalShop::BaseModel
@@ -1186,7 +1127,6 @@ module TerminalShop
1186
1127
  # @param key [Symbol]
1187
1128
  #
1188
1129
  # @return [Object, nil]
1189
- #
1190
1130
  def [](key)
1191
1131
  unless key.instance_of?(Symbol)
1192
1132
  raise ArgumentError.new("Expected symbol key for lookup, got #{key.inspect}")
@@ -1205,7 +1145,6 @@ module TerminalShop
1205
1145
  # should not be mutated.
1206
1146
  #
1207
1147
  # @return [Hash{Symbol=>Object}]
1208
- #
1209
1148
  def to_h = @data
1210
1149
 
1211
1150
  alias_method :to_hash, :to_h
@@ -1213,7 +1152,6 @@ module TerminalShop
1213
1152
  # @param keys [Array<Symbol>, nil]
1214
1153
  #
1215
1154
  # @return [Hash{Symbol=>Object}]
1216
- #
1217
1155
  def deconstruct_keys(keys)
1218
1156
  (keys || self.class.known_fields.keys).filter_map do |k|
1219
1157
  unless self.class.known_fields.key?(k)
@@ -1228,7 +1166,6 @@ module TerminalShop
1228
1166
  # Create a new instance of a model.
1229
1167
  #
1230
1168
  # @param data [Hash{Symbol=>Object}, TerminalShop::BaseModel]
1231
- #
1232
1169
  def initialize(data = {})
1233
1170
  case TerminalShop::Util.coerce_hash(data)
1234
1171
  in Hash => coerced
@@ -1239,11 +1176,9 @@ module TerminalShop
1239
1176
  end
1240
1177
 
1241
1178
  # @return [String]
1242
- #
1243
1179
  def to_s = @data.to_s
1244
1180
 
1245
1181
  # @return [String]
1246
- #
1247
1182
  def inspect
1248
1183
  "#<#{self.class.name}:0x#{object_id.to_s(16)} #{deconstruct_keys(nil).map do |k, v|
1249
1184
  "#{k}=#{v.inspect}"