terminal-shop 1.7.0 → 2.0.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.
- checksums.yaml +4 -4
- data/README.md +17 -1
- data/lib/terminal-shop/base_client.rb +47 -56
- data/lib/terminal-shop/base_model.rb +300 -352
- data/lib/terminal-shop/base_page.rb +30 -31
- data/lib/terminal-shop/client.rb +2 -3
- data/lib/terminal-shop/errors.rb +12 -17
- data/lib/terminal-shop/extern.rb +1 -4
- data/lib/terminal-shop/models/product.rb +7 -3
- data/lib/terminal-shop/models/region.rb +7 -3
- data/lib/terminal-shop/models/subscription.rb +7 -3
- data/lib/terminal-shop/pooled_net_requester.rb +30 -21
- data/lib/terminal-shop/request_options.rb +5 -12
- data/lib/terminal-shop/resources/address.rb +0 -5
- data/lib/terminal-shop/resources/app.rb +0 -5
- data/lib/terminal-shop/resources/card.rb +0 -6
- data/lib/terminal-shop/resources/cart.rb +0 -7
- data/lib/terminal-shop/resources/email.rb +0 -2
- data/lib/terminal-shop/resources/order.rb +0 -4
- data/lib/terminal-shop/resources/product.rb +0 -3
- data/lib/terminal-shop/resources/profile.rb +0 -3
- data/lib/terminal-shop/resources/subscription.rb +0 -5
- data/lib/terminal-shop/resources/token.rb +0 -5
- data/lib/terminal-shop/resources/view.rb +0 -2
- data/lib/terminal-shop/util.rb +59 -77
- data/lib/terminal-shop/version.rb +1 -1
- data/lib/terminal-shop.rb +16 -0
- data/manifest.yaml +1 -0
- data/rbi/lib/terminal-shop/base_client.rbi +63 -41
- data/rbi/lib/terminal-shop/base_model.rbi +278 -129
- data/rbi/lib/terminal-shop/base_page.rbi +1 -4
- data/rbi/lib/terminal-shop/client.rbi +29 -30
- data/rbi/lib/terminal-shop/errors.rbi +12 -14
- data/rbi/lib/terminal-shop/extern.rbi +1 -1
- data/rbi/lib/terminal-shop/models/address.rbi +25 -51
- data/rbi/lib/terminal-shop/models/address_create_params.rbi +23 -46
- data/rbi/lib/terminal-shop/models/address_create_response.rbi +2 -6
- data/rbi/lib/terminal-shop/models/address_delete_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/address_delete_response.rbi +1 -6
- data/rbi/lib/terminal-shop/models/address_get_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/address_get_response.rbi +8 -6
- data/rbi/lib/terminal-shop/models/address_list_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/address_list_response.rbi +5 -6
- data/rbi/lib/terminal-shop/models/app.rbi +9 -24
- data/rbi/lib/terminal-shop/models/app_create_params.rbi +3 -13
- data/rbi/lib/terminal-shop/models/app_create_response.rbi +10 -20
- data/rbi/lib/terminal-shop/models/app_delete_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/app_delete_response.rbi +1 -6
- data/rbi/lib/terminal-shop/models/app_get_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/app_get_response.rbi +5 -6
- data/rbi/lib/terminal-shop/models/app_list_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/app_list_response.rbi +5 -6
- data/rbi/lib/terminal-shop/models/card.rbi +22 -36
- data/rbi/lib/terminal-shop/models/card_collect_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/card_collect_response.rbi +11 -14
- data/rbi/lib/terminal-shop/models/card_create_params.rbi +4 -7
- data/rbi/lib/terminal-shop/models/card_create_response.rbi +2 -6
- data/rbi/lib/terminal-shop/models/card_delete_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/card_delete_response.rbi +1 -6
- data/rbi/lib/terminal-shop/models/card_get_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/card_get_response.rbi +5 -6
- data/rbi/lib/terminal-shop/models/card_list_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/card_list_response.rbi +5 -6
- data/rbi/lib/terminal-shop/models/cart.rbi +53 -88
- data/rbi/lib/terminal-shop/models/cart_clear_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/cart_clear_response.rbi +1 -6
- data/rbi/lib/terminal-shop/models/cart_convert_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/cart_convert_response.rbi +5 -6
- data/rbi/lib/terminal-shop/models/cart_get_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/cart_get_response.rbi +5 -6
- data/rbi/lib/terminal-shop/models/cart_set_address_params.rbi +3 -7
- data/rbi/lib/terminal-shop/models/cart_set_address_response.rbi +1 -6
- data/rbi/lib/terminal-shop/models/cart_set_card_params.rbi +3 -7
- data/rbi/lib/terminal-shop/models/cart_set_card_response.rbi +1 -6
- data/rbi/lib/terminal-shop/models/cart_set_item_params.rbi +5 -13
- data/rbi/lib/terminal-shop/models/cart_set_item_response.rbi +5 -6
- data/rbi/lib/terminal-shop/models/email_create_params.rbi +3 -7
- data/rbi/lib/terminal-shop/models/email_create_response.rbi +1 -6
- data/rbi/lib/terminal-shop/models/order.rbi +80 -139
- data/rbi/lib/terminal-shop/models/order_create_params.rbi +7 -19
- data/rbi/lib/terminal-shop/models/order_create_response.rbi +2 -6
- data/rbi/lib/terminal-shop/models/order_get_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/order_get_response.rbi +5 -6
- data/rbi/lib/terminal-shop/models/order_list_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/order_list_response.rbi +5 -6
- data/rbi/lib/terminal-shop/models/product.rbi +52 -80
- data/rbi/lib/terminal-shop/models/product_get_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/product_get_response.rbi +8 -6
- data/rbi/lib/terminal-shop/models/product_list_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/product_list_response.rbi +5 -6
- data/rbi/lib/terminal-shop/models/product_variant.rbi +7 -18
- data/rbi/lib/terminal-shop/models/profile.rbi +20 -36
- data/rbi/lib/terminal-shop/models/profile_me_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/profile_me_response.rbi +8 -6
- data/rbi/lib/terminal-shop/models/profile_update_params.rbi +3 -13
- data/rbi/lib/terminal-shop/models/profile_update_response.rbi +8 -6
- data/rbi/lib/terminal-shop/models/region.rbi +10 -8
- data/rbi/lib/terminal-shop/models/subscription.rbi +35 -75
- data/rbi/lib/terminal-shop/models/subscription_create_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/subscription_create_response.rbi +1 -6
- data/rbi/lib/terminal-shop/models/subscription_delete_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/subscription_delete_response.rbi +1 -6
- data/rbi/lib/terminal-shop/models/subscription_get_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/subscription_get_response.rbi +8 -6
- data/rbi/lib/terminal-shop/models/subscription_list_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/subscription_list_response.rbi +4 -8
- data/rbi/lib/terminal-shop/models/token.rbi +8 -18
- data/rbi/lib/terminal-shop/models/token_create_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/token_create_response.rbi +11 -20
- data/rbi/lib/terminal-shop/models/token_delete_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/token_delete_response.rbi +1 -6
- data/rbi/lib/terminal-shop/models/token_get_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/token_get_response.rbi +6 -6
- data/rbi/lib/terminal-shop/models/token_list_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/token_list_response.rbi +5 -6
- data/rbi/lib/terminal-shop/models/view_init_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/view_init_response.rbi +37 -81
- data/rbi/lib/terminal-shop/pooled_net_requester.rbi +24 -6
- data/rbi/lib/terminal-shop/request_options.rbi +32 -57
- data/rbi/lib/terminal-shop/resources/address.rbi +26 -6
- data/rbi/lib/terminal-shop/resources/app.rbi +18 -6
- data/rbi/lib/terminal-shop/resources/card.rbi +27 -8
- data/rbi/lib/terminal-shop/resources/cart.rbi +29 -9
- data/rbi/lib/terminal-shop/resources/email.rbi +7 -2
- data/rbi/lib/terminal-shop/resources/order.rbi +20 -5
- data/rbi/lib/terminal-shop/resources/product.rbi +9 -3
- data/rbi/lib/terminal-shop/resources/profile.rbi +4 -2
- data/rbi/lib/terminal-shop/resources/subscription.rbi +26 -6
- data/rbi/lib/terminal-shop/resources/token.rbi +18 -6
- data/rbi/lib/terminal-shop/resources/view.rbi +3 -1
- data/rbi/lib/terminal-shop/util.rbi +78 -20
- data/rbi/lib/terminal-shop/version.rbi +1 -1
- data/sig/terminal-shop/base_client.rbs +20 -15
- data/sig/terminal-shop/base_model.rbs +36 -18
- data/sig/terminal-shop/client.rbs +8 -8
- data/sig/terminal-shop/errors.rbs +21 -21
- data/sig/terminal-shop/models/address.rbs +11 -15
- data/sig/terminal-shop/models/address_create_params.rbs +11 -16
- data/sig/terminal-shop/models/address_create_response.rbs +1 -6
- data/sig/terminal-shop/models/address_delete_params.rbs +1 -6
- data/sig/terminal-shop/models/address_delete_response.rbs +1 -6
- data/sig/terminal-shop/models/address_get_params.rbs +1 -6
- data/sig/terminal-shop/models/address_get_response.rbs +1 -6
- data/sig/terminal-shop/models/address_list_params.rbs +1 -6
- data/sig/terminal-shop/models/address_list_response.rbs +1 -6
- data/sig/terminal-shop/models/app.rbs +6 -5
- data/sig/terminal-shop/models/app_create_params.rbs +5 -10
- data/sig/terminal-shop/models/app_create_response.rbs +4 -12
- data/sig/terminal-shop/models/app_delete_params.rbs +1 -6
- data/sig/terminal-shop/models/app_delete_response.rbs +1 -6
- data/sig/terminal-shop/models/app_get_params.rbs +1 -5
- data/sig/terminal-shop/models/app_get_response.rbs +1 -5
- data/sig/terminal-shop/models/app_list_params.rbs +1 -5
- data/sig/terminal-shop/models/app_list_response.rbs +1 -6
- data/sig/terminal-shop/models/card.rbs +7 -16
- data/sig/terminal-shop/models/card_collect_params.rbs +1 -6
- data/sig/terminal-shop/models/card_collect_response.rbs +4 -12
- data/sig/terminal-shop/models/card_create_params.rbs +4 -6
- data/sig/terminal-shop/models/card_create_response.rbs +1 -6
- data/sig/terminal-shop/models/card_delete_params.rbs +1 -6
- data/sig/terminal-shop/models/card_delete_response.rbs +1 -6
- data/sig/terminal-shop/models/card_get_params.rbs +1 -5
- data/sig/terminal-shop/models/card_get_response.rbs +1 -6
- data/sig/terminal-shop/models/card_list_params.rbs +1 -5
- data/sig/terminal-shop/models/card_list_response.rbs +1 -6
- data/sig/terminal-shop/models/cart.rbs +20 -34
- data/sig/terminal-shop/models/cart_clear_params.rbs +1 -6
- data/sig/terminal-shop/models/cart_clear_response.rbs +1 -6
- data/sig/terminal-shop/models/cart_convert_params.rbs +1 -6
- data/sig/terminal-shop/models/cart_convert_response.rbs +1 -6
- data/sig/terminal-shop/models/cart_get_params.rbs +1 -5
- data/sig/terminal-shop/models/cart_get_response.rbs +1 -6
- data/sig/terminal-shop/models/cart_set_address_params.rbs +4 -9
- data/sig/terminal-shop/models/cart_set_address_response.rbs +1 -6
- data/sig/terminal-shop/models/cart_set_card_params.rbs +4 -6
- data/sig/terminal-shop/models/cart_set_card_response.rbs +1 -6
- data/sig/terminal-shop/models/cart_set_item_params.rbs +5 -10
- data/sig/terminal-shop/models/cart_set_item_response.rbs +1 -6
- data/sig/terminal-shop/models/email_create_params.rbs +4 -6
- data/sig/terminal-shop/models/email_create_response.rbs +1 -6
- data/sig/terminal-shop/models/order.rbs +31 -50
- data/sig/terminal-shop/models/order_create_params.rbs +6 -11
- data/sig/terminal-shop/models/order_create_response.rbs +1 -6
- data/sig/terminal-shop/models/order_get_params.rbs +1 -5
- data/sig/terminal-shop/models/order_get_response.rbs +1 -6
- data/sig/terminal-shop/models/order_list_params.rbs +1 -6
- data/sig/terminal-shop/models/order_list_response.rbs +1 -6
- data/sig/terminal-shop/models/product.rbs +20 -27
- data/sig/terminal-shop/models/product_get_params.rbs +1 -6
- data/sig/terminal-shop/models/product_get_response.rbs +1 -6
- data/sig/terminal-shop/models/product_list_params.rbs +1 -6
- data/sig/terminal-shop/models/product_list_response.rbs +1 -6
- data/sig/terminal-shop/models/product_variant.rbs +1 -5
- data/sig/terminal-shop/models/profile.rbs +8 -17
- data/sig/terminal-shop/models/profile_me_params.rbs +1 -6
- data/sig/terminal-shop/models/profile_me_response.rbs +1 -6
- data/sig/terminal-shop/models/profile_update_params.rbs +5 -10
- data/sig/terminal-shop/models/profile_update_response.rbs +1 -6
- data/sig/terminal-shop/models/region.rbs +4 -2
- data/sig/terminal-shop/models/subscription.rbs +15 -27
- data/sig/terminal-shop/models/subscription_create_params.rbs +1 -6
- data/sig/terminal-shop/models/subscription_create_response.rbs +1 -6
- data/sig/terminal-shop/models/subscription_delete_params.rbs +1 -6
- data/sig/terminal-shop/models/subscription_delete_response.rbs +1 -6
- data/sig/terminal-shop/models/subscription_get_params.rbs +1 -6
- data/sig/terminal-shop/models/subscription_get_response.rbs +1 -6
- data/sig/terminal-shop/models/subscription_list_params.rbs +1 -6
- data/sig/terminal-shop/models/subscription_list_response.rbs +3 -6
- data/sig/terminal-shop/models/token.rbs +1 -5
- data/sig/terminal-shop/models/token_create_params.rbs +1 -6
- data/sig/terminal-shop/models/token_create_response.rbs +4 -12
- data/sig/terminal-shop/models/token_delete_params.rbs +1 -6
- data/sig/terminal-shop/models/token_delete_response.rbs +1 -6
- data/sig/terminal-shop/models/token_get_params.rbs +1 -5
- data/sig/terminal-shop/models/token_get_response.rbs +1 -6
- data/sig/terminal-shop/models/token_list_params.rbs +1 -6
- data/sig/terminal-shop/models/token_list_response.rbs +1 -6
- data/sig/terminal-shop/models/view_init_params.rbs +1 -5
- data/sig/terminal-shop/models/view_init_response.rbs +15 -23
- data/sig/terminal-shop/pooled_net_requester.rbs +10 -3
- data/sig/terminal-shop/request_options.rbs +2 -2
- data/sig/terminal-shop/resources/address.rbs +22 -41
- data/sig/terminal-shop/resources/app.rbs +16 -34
- data/sig/terminal-shop/resources/card.rbs +18 -40
- data/sig/terminal-shop/resources/cart.rbs +22 -47
- data/sig/terminal-shop/resources/email.rbs +4 -8
- data/sig/terminal-shop/resources/order.rbs +13 -26
- data/sig/terminal-shop/resources/product.rbs +7 -16
- data/sig/terminal-shop/resources/profile.rbs +8 -16
- data/sig/terminal-shop/resources/subscription.rbs +21 -43
- data/sig/terminal-shop/resources/token.rbs +14 -32
- data/sig/terminal-shop/resources/view.rbs +3 -7
- data/sig/terminal-shop/util.rbs +9 -9
- data/sig/terminal-shop/version.rbs +1 -1
- 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,14 +42,13 @@ 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
|
55
48
|
type_info(spec.slice(:const, :enum, :union).first&.last)
|
56
49
|
in Proc
|
57
50
|
spec
|
58
|
-
in TerminalShop::Converter |
|
51
|
+
in TerminalShop::Converter | Module | Symbol
|
59
52
|
-> { spec }
|
60
53
|
in true | false
|
61
54
|
-> { TerminalShop::BooleanModel }
|
@@ -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
|
@@ -89,7 +81,7 @@ module TerminalShop
|
|
89
81
|
else
|
90
82
|
value
|
91
83
|
end
|
92
|
-
in
|
84
|
+
in Module
|
93
85
|
case target
|
94
86
|
in -> { _1 <= NilClass }
|
95
87
|
nil
|
@@ -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
|
@@ -154,7 +144,7 @@ module TerminalShop
|
|
154
144
|
else
|
155
145
|
[false, false, 0]
|
156
146
|
end
|
157
|
-
in
|
147
|
+
in Module
|
158
148
|
case [target, value]
|
159
149
|
in [-> { _1 <= NilClass }, _]
|
160
150
|
[true, nil, value.nil? ? 1 : 0]
|
@@ -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
|
#
|
@@ -192,45 +182,38 @@ module TerminalShop
|
|
192
182
|
|
193
183
|
# rubocop:disable Lint/UnusedMethodArgument
|
194
184
|
|
195
|
-
private_class_method :new
|
196
|
-
|
197
185
|
# @param other [Object]
|
198
186
|
#
|
199
187
|
# @return [Boolean]
|
200
|
-
#
|
201
188
|
def self.===(other) = true
|
202
189
|
|
203
190
|
# @param other [Object]
|
204
191
|
#
|
205
192
|
# @return [Boolean]
|
206
|
-
#
|
207
193
|
def self.==(other) = other.is_a?(Class) && other <= TerminalShop::Unknown
|
208
194
|
|
209
195
|
class << self
|
210
196
|
# @!parse
|
211
|
-
# # @private
|
197
|
+
# # @api private
|
212
198
|
# #
|
213
199
|
# # @param value [Object]
|
214
200
|
# #
|
215
201
|
# # @return [Object]
|
216
|
-
# #
|
217
202
|
# def coerce(value) = super
|
218
203
|
|
219
204
|
# @!parse
|
220
|
-
# # @private
|
205
|
+
# # @api private
|
221
206
|
# #
|
222
207
|
# # @param value [Object]
|
223
208
|
# #
|
224
209
|
# # @return [Object]
|
225
|
-
# #
|
226
210
|
# def dump(value) = super
|
227
211
|
|
228
|
-
# @private
|
212
|
+
# @api private
|
229
213
|
#
|
230
214
|
# @param value [Object]
|
231
215
|
#
|
232
216
|
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
233
|
-
#
|
234
217
|
def try_strict_coerce(value)
|
235
218
|
# prevent unknown variant from being chosen during the first coercion pass
|
236
219
|
[false, true, 0]
|
@@ -240,7 +223,7 @@ module TerminalShop
|
|
240
223
|
# rubocop:enable Lint/UnusedMethodArgument
|
241
224
|
end
|
242
225
|
|
243
|
-
# @private
|
226
|
+
# @api private
|
244
227
|
#
|
245
228
|
# @abstract
|
246
229
|
#
|
@@ -248,45 +231,38 @@ module TerminalShop
|
|
248
231
|
class BooleanModel
|
249
232
|
extend TerminalShop::Converter
|
250
233
|
|
251
|
-
private_class_method :new
|
252
|
-
|
253
234
|
# @param other [Object]
|
254
235
|
#
|
255
236
|
# @return [Boolean]
|
256
|
-
#
|
257
237
|
def self.===(other) = other == true || other == false
|
258
238
|
|
259
239
|
# @param other [Object]
|
260
240
|
#
|
261
241
|
# @return [Boolean]
|
262
|
-
#
|
263
242
|
def self.==(other) = other.is_a?(Class) && other <= TerminalShop::BooleanModel
|
264
243
|
|
265
244
|
class << self
|
266
245
|
# @!parse
|
267
|
-
# # @private
|
246
|
+
# # @api private
|
268
247
|
# #
|
269
248
|
# # @param value [Boolean, Object]
|
270
249
|
# #
|
271
250
|
# # @return [Boolean, Object]
|
272
|
-
# #
|
273
251
|
# def coerce(value) = super
|
274
252
|
|
275
253
|
# @!parse
|
276
|
-
# # @private
|
254
|
+
# # @api private
|
277
255
|
# #
|
278
256
|
# # @param value [Boolean, Object]
|
279
257
|
# #
|
280
258
|
# # @return [Boolean, Object]
|
281
|
-
# #
|
282
259
|
# def dump(value) = super
|
283
260
|
|
284
|
-
# @private
|
261
|
+
# @api private
|
285
262
|
#
|
286
263
|
# @param value [Object]
|
287
264
|
#
|
288
265
|
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
289
|
-
#
|
290
266
|
def try_strict_coerce(value)
|
291
267
|
case value
|
292
268
|
in true | false
|
@@ -298,9 +274,7 @@ module TerminalShop
|
|
298
274
|
end
|
299
275
|
end
|
300
276
|
|
301
|
-
# @private
|
302
|
-
#
|
303
|
-
# @abstract
|
277
|
+
# @api private
|
304
278
|
#
|
305
279
|
# A value from among a specified list of options. OpenAPI enum values map to Ruby
|
306
280
|
# values in the SDK as follows:
|
@@ -314,211 +288,186 @@ module TerminalShop
|
|
314
288
|
# values safely.
|
315
289
|
#
|
316
290
|
# @example
|
317
|
-
#
|
318
|
-
#
|
319
|
-
#
|
320
|
-
#
|
321
|
-
#
|
322
|
-
#
|
323
|
-
#
|
324
|
-
#
|
325
|
-
#
|
326
|
-
# end
|
327
|
-
# ```
|
291
|
+
# # `region` is a `TerminalShop::Models::Region`
|
292
|
+
# case region
|
293
|
+
# when TerminalShop::Models::Region::EU
|
294
|
+
# # ...
|
295
|
+
# when TerminalShop::Models::Region::NA
|
296
|
+
# # ...
|
297
|
+
# else
|
298
|
+
# puts(region)
|
299
|
+
# end
|
328
300
|
#
|
329
301
|
# @example
|
330
|
-
#
|
331
|
-
#
|
332
|
-
#
|
333
|
-
#
|
334
|
-
#
|
335
|
-
#
|
336
|
-
#
|
337
|
-
#
|
338
|
-
|
339
|
-
|
340
|
-
class Enum
|
341
|
-
extend TerminalShop::Converter
|
342
|
-
|
343
|
-
class << self
|
344
|
-
# All of the valid Symbol values for this enum.
|
345
|
-
#
|
346
|
-
# @return [Array<NilClass, Boolean, Integer, Float, Symbol>]
|
347
|
-
#
|
348
|
-
def values = (@values ||= constants.map { const_get(_1) })
|
302
|
+
# case region
|
303
|
+
# in :eu
|
304
|
+
# # ...
|
305
|
+
# in :na
|
306
|
+
# # ...
|
307
|
+
# else
|
308
|
+
# puts(region)
|
309
|
+
# end
|
310
|
+
module Enum
|
311
|
+
include TerminalShop::Converter
|
349
312
|
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
private def finalize! = values
|
355
|
-
end
|
313
|
+
# All of the valid Symbol values for this enum.
|
314
|
+
#
|
315
|
+
# @return [Array<NilClass, Boolean, Integer, Float, Symbol>]
|
316
|
+
def values = (@values ||= constants.map { const_get(_1) })
|
356
317
|
|
357
|
-
|
318
|
+
# @api private
|
319
|
+
#
|
320
|
+
# Guard against thread safety issues by instantiating `@values`.
|
321
|
+
private def finalize! = values
|
358
322
|
|
359
323
|
# @param other [Object]
|
360
324
|
#
|
361
325
|
# @return [Boolean]
|
362
|
-
|
363
|
-
def self.===(other) = values.include?(other)
|
326
|
+
def ===(other) = values.include?(other)
|
364
327
|
|
365
328
|
# @param other [Object]
|
366
329
|
#
|
367
330
|
# @return [Boolean]
|
368
|
-
|
369
|
-
|
370
|
-
other.is_a?(Class) && other <= TerminalShop::Enum && other.values.to_set == values.to_set
|
331
|
+
def ==(other)
|
332
|
+
other.is_a?(Module) && other.singleton_class.ancestors.include?(TerminalShop::Enum) && other.values.to_set == values.to_set
|
371
333
|
end
|
372
334
|
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
else
|
385
|
-
value
|
386
|
-
end
|
335
|
+
# @api private
|
336
|
+
#
|
337
|
+
# @param value [String, Symbol, Object]
|
338
|
+
#
|
339
|
+
# @return [Symbol, Object]
|
340
|
+
def coerce(value)
|
341
|
+
case value
|
342
|
+
in Symbol | String if values.include?(val = value.to_sym)
|
343
|
+
val
|
344
|
+
else
|
345
|
+
value
|
387
346
|
end
|
347
|
+
end
|
388
348
|
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
# def dump(value) = super
|
349
|
+
# @!parse
|
350
|
+
# # @api private
|
351
|
+
# #
|
352
|
+
# # @param value [Symbol, Object]
|
353
|
+
# #
|
354
|
+
# # @return [Symbol, Object]
|
355
|
+
# def dump(value) = super
|
397
356
|
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
return [true, value, 1] if values.include?(value)
|
357
|
+
# @api private
|
358
|
+
#
|
359
|
+
# @param value [Object]
|
360
|
+
#
|
361
|
+
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
362
|
+
def try_strict_coerce(value)
|
363
|
+
return [true, value, 1] if values.include?(value)
|
406
364
|
|
407
|
-
|
408
|
-
|
409
|
-
|
365
|
+
case value
|
366
|
+
in Symbol | String if values.include?(val = value.to_sym)
|
367
|
+
[true, val, 1]
|
368
|
+
else
|
369
|
+
case [value, values.first]
|
370
|
+
in [true | false, true | false] | [Integer, Integer] | [Symbol | String, Symbol]
|
371
|
+
[false, true, 0]
|
410
372
|
else
|
411
|
-
|
412
|
-
in [true | false, true | false] | [Integer, Integer] | [Symbol | String, Symbol]
|
413
|
-
[false, true, 0]
|
414
|
-
else
|
415
|
-
[false, false, 0]
|
416
|
-
end
|
373
|
+
[false, false, 0]
|
417
374
|
end
|
418
375
|
end
|
419
376
|
end
|
420
377
|
end
|
421
378
|
|
422
|
-
# @private
|
423
|
-
|
424
|
-
|
425
|
-
#
|
426
|
-
class Union
|
427
|
-
extend TerminalShop::Converter
|
379
|
+
# @api private
|
380
|
+
module Union
|
381
|
+
include TerminalShop::Converter
|
428
382
|
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
#
|
436
|
-
private def known_variants = (@known_variants ||= [])
|
383
|
+
# @api private
|
384
|
+
#
|
385
|
+
# All of the specified variant info for this union.
|
386
|
+
#
|
387
|
+
# @return [Array<Array(Symbol, Proc)>]
|
388
|
+
private def known_variants = (@known_variants ||= [])
|
437
389
|
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
390
|
+
# @api private
|
391
|
+
#
|
392
|
+
# @return [Array<Array(Symbol, Object)>]
|
393
|
+
protected def derefed_variants
|
394
|
+
@known_variants.map { |key, variant_fn| [key, variant_fn.call] }
|
395
|
+
end
|
396
|
+
|
397
|
+
# All of the specified variants for this union.
|
398
|
+
#
|
399
|
+
# @return [Array<Object>]
|
400
|
+
def variants
|
401
|
+
derefed_variants.map(&:last)
|
402
|
+
end
|
403
|
+
|
404
|
+
# @api private
|
405
|
+
#
|
406
|
+
# @param property [Symbol]
|
407
|
+
private def discriminator(property)
|
408
|
+
case property
|
409
|
+
in Symbol
|
410
|
+
@discriminator = property
|
446
411
|
end
|
412
|
+
end
|
447
413
|
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
414
|
+
# @api private
|
415
|
+
#
|
416
|
+
# @param key [Symbol, Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class]
|
417
|
+
#
|
418
|
+
# @param spec [Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class] .
|
419
|
+
#
|
420
|
+
# @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
|
421
|
+
#
|
422
|
+
# @option spec [Proc] :enum
|
423
|
+
#
|
424
|
+
# @option spec [Proc] :union
|
425
|
+
#
|
426
|
+
# @option spec [Boolean] :"nil?"
|
427
|
+
private def variant(key, spec = nil)
|
428
|
+
variant_info =
|
429
|
+
case key
|
454
430
|
in Symbol
|
455
|
-
|
431
|
+
[key, TerminalShop::Converter.type_info(spec)]
|
432
|
+
in Proc | TerminalShop::Converter | Module | Hash
|
433
|
+
[nil, TerminalShop::Converter.type_info(key)]
|
456
434
|
end
|
457
|
-
end
|
458
435
|
|
459
|
-
|
460
|
-
|
461
|
-
# @param key [Symbol, Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class]
|
462
|
-
#
|
463
|
-
# @param spec [Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class] .
|
464
|
-
#
|
465
|
-
# @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
|
466
|
-
#
|
467
|
-
# @option spec [Proc] :enum
|
468
|
-
#
|
469
|
-
# @option spec [Proc] :union
|
470
|
-
#
|
471
|
-
# @option spec [Boolean] :"nil?"
|
472
|
-
#
|
473
|
-
private def variant(key, spec = nil)
|
474
|
-
variant_info =
|
475
|
-
case key
|
476
|
-
in Symbol
|
477
|
-
[key, TerminalShop::Converter.type_info(spec)]
|
478
|
-
in Proc | TerminalShop::Converter | Class | Hash
|
479
|
-
[nil, TerminalShop::Converter.type_info(key)]
|
480
|
-
end
|
481
|
-
|
482
|
-
known_variants << variant_info
|
483
|
-
end
|
436
|
+
known_variants << variant_info
|
437
|
+
end
|
484
438
|
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
key
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
end
|
439
|
+
# @api private
|
440
|
+
#
|
441
|
+
# @param value [Object]
|
442
|
+
#
|
443
|
+
# @return [TerminalShop::Converter, Class, nil]
|
444
|
+
private def resolve_variant(value)
|
445
|
+
case [@discriminator, value]
|
446
|
+
in [_, TerminalShop::BaseModel]
|
447
|
+
value.class
|
448
|
+
in [Symbol, Hash]
|
449
|
+
key =
|
450
|
+
if value.key?(@discriminator)
|
451
|
+
value.fetch(@discriminator)
|
452
|
+
elsif value.key?((discriminator = @discriminator.to_s))
|
453
|
+
value.fetch(discriminator)
|
454
|
+
end
|
502
455
|
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
end
|
456
|
+
key = key.to_sym if key.is_a?(String)
|
457
|
+
_, resolved = known_variants.find { |k,| k == key }
|
458
|
+
resolved.nil? ? TerminalShop::Unknown : resolved.call
|
459
|
+
else
|
460
|
+
nil
|
509
461
|
end
|
510
462
|
end
|
511
463
|
|
512
464
|
# rubocop:disable Style/HashEachMethods
|
513
465
|
# rubocop:disable Style/CaseEquality
|
514
466
|
|
515
|
-
private_class_method :new
|
516
|
-
|
517
467
|
# @param other [Object]
|
518
468
|
#
|
519
469
|
# @return [Boolean]
|
520
|
-
|
521
|
-
def self.===(other)
|
470
|
+
def ===(other)
|
522
471
|
known_variants.any? do |_, variant_fn|
|
523
472
|
variant_fn.call === other
|
524
473
|
end
|
@@ -527,101 +476,95 @@ module TerminalShop
|
|
527
476
|
# @param other [Object]
|
528
477
|
#
|
529
478
|
# @return [Boolean]
|
530
|
-
|
531
|
-
|
532
|
-
other.is_a?(Class) && other <= TerminalShop::Union && other.variants == variants
|
479
|
+
def ==(other)
|
480
|
+
other.is_a?(Module) && other.singleton_class.ancestors.include?(TerminalShop::Union) && other.derefed_variants == derefed_variants
|
533
481
|
end
|
534
482
|
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
return TerminalShop::Converter.coerce(variant, value)
|
545
|
-
end
|
483
|
+
# @api private
|
484
|
+
#
|
485
|
+
# @param value [Object]
|
486
|
+
#
|
487
|
+
# @return [Object]
|
488
|
+
def coerce(value)
|
489
|
+
if (variant = resolve_variant(value))
|
490
|
+
return TerminalShop::Converter.coerce(variant, value)
|
491
|
+
end
|
546
492
|
|
547
|
-
|
493
|
+
matches = []
|
548
494
|
|
549
|
-
|
550
|
-
|
495
|
+
known_variants.each do |_, variant_fn|
|
496
|
+
variant = variant_fn.call
|
551
497
|
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
end
|
498
|
+
case TerminalShop::Converter.try_strict_coerce(variant, value)
|
499
|
+
in [true, coerced, _]
|
500
|
+
return coerced
|
501
|
+
in [false, true, score]
|
502
|
+
matches << [score, variant]
|
503
|
+
in [false, false, _]
|
504
|
+
nil
|
560
505
|
end
|
506
|
+
end
|
507
|
+
|
508
|
+
_, variant = matches.sort! { _2.first <=> _1.first }.find { |score,| !score.zero? }
|
509
|
+
variant.nil? ? value : TerminalShop::Converter.coerce(variant, value)
|
510
|
+
end
|
561
511
|
|
562
|
-
|
563
|
-
|
512
|
+
# @api private
|
513
|
+
#
|
514
|
+
# @param value [Object]
|
515
|
+
#
|
516
|
+
# @return [Object]
|
517
|
+
def dump(value)
|
518
|
+
if (variant = resolve_variant(value))
|
519
|
+
return TerminalShop::Converter.dump(variant, value)
|
564
520
|
end
|
565
521
|
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
#
|
570
|
-
# @return [Object]
|
571
|
-
#
|
572
|
-
def dump(value)
|
573
|
-
if (variant = resolve_variant(value))
|
522
|
+
known_variants.each do |_, variant_fn|
|
523
|
+
variant = variant_fn.call
|
524
|
+
if variant === value
|
574
525
|
return TerminalShop::Converter.dump(variant, value)
|
575
526
|
end
|
576
|
-
|
577
|
-
known_variants.each do |_, variant_fn|
|
578
|
-
variant = variant_fn.call
|
579
|
-
if variant === value
|
580
|
-
return TerminalShop::Converter.dump(variant, value)
|
581
|
-
end
|
582
|
-
end
|
583
|
-
value
|
584
527
|
end
|
528
|
+
value
|
529
|
+
end
|
585
530
|
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
|
591
|
-
|
592
|
-
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
end
|
531
|
+
# @api private
|
532
|
+
#
|
533
|
+
# @param value [Object]
|
534
|
+
#
|
535
|
+
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
536
|
+
def try_strict_coerce(value)
|
537
|
+
# TODO(ruby) this will result in super linear decoding behaviour for nested unions
|
538
|
+
# follow up with a decoding context that captures current strictness levels
|
539
|
+
if (variant = resolve_variant(value))
|
540
|
+
return Converter.try_strict_coerce(variant, value)
|
541
|
+
end
|
598
542
|
|
599
|
-
|
600
|
-
|
543
|
+
coercible = false
|
544
|
+
max_score = 0
|
601
545
|
|
602
|
-
|
603
|
-
|
546
|
+
known_variants.each do |_, variant_fn|
|
547
|
+
variant = variant_fn.call
|
604
548
|
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
|
609
|
-
|
610
|
-
|
611
|
-
|
612
|
-
|
613
|
-
end
|
549
|
+
case TerminalShop::Converter.try_strict_coerce(variant, value)
|
550
|
+
in [true, coerced, score]
|
551
|
+
return [true, coerced, score]
|
552
|
+
in [false, true, score]
|
553
|
+
coercible = true
|
554
|
+
max_score = [max_score, score].max
|
555
|
+
in [false, false, _]
|
556
|
+
nil
|
614
557
|
end
|
615
|
-
|
616
|
-
[false, coercible, max_score]
|
617
558
|
end
|
559
|
+
|
560
|
+
[false, coercible, max_score]
|
618
561
|
end
|
619
562
|
|
620
563
|
# rubocop:enable Style/CaseEquality
|
621
564
|
# rubocop:enable Style/HashEachMethods
|
622
565
|
end
|
623
566
|
|
624
|
-
# @private
|
567
|
+
# @api private
|
625
568
|
#
|
626
569
|
# @abstract
|
627
570
|
#
|
@@ -629,14 +572,22 @@ module TerminalShop
|
|
629
572
|
class ArrayOf
|
630
573
|
include TerminalShop::Converter
|
631
574
|
|
632
|
-
|
633
|
-
|
634
|
-
|
575
|
+
# @param type_info [Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class]
|
576
|
+
#
|
577
|
+
# @param spec [Hash{Symbol=>Object}] .
|
578
|
+
#
|
579
|
+
# @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
|
580
|
+
#
|
581
|
+
# @option spec [Proc] :enum
|
582
|
+
#
|
583
|
+
# @option spec [Proc] :union
|
584
|
+
#
|
585
|
+
# @option spec [Boolean] :"nil?"
|
586
|
+
def self.[](type_info, spec = {}) = new(type_info, spec)
|
635
587
|
|
636
588
|
# @param other [Object]
|
637
589
|
#
|
638
590
|
# @return [Boolean]
|
639
|
-
#
|
640
591
|
def ===(other)
|
641
592
|
type = item_type
|
642
593
|
case other
|
@@ -652,15 +603,13 @@ module TerminalShop
|
|
652
603
|
# @param other [Object]
|
653
604
|
#
|
654
605
|
# @return [Boolean]
|
655
|
-
#
|
656
606
|
def ==(other) = other.is_a?(TerminalShop::ArrayOf) && other.item_type == item_type
|
657
607
|
|
658
|
-
# @private
|
608
|
+
# @api private
|
659
609
|
#
|
660
610
|
# @param value [Enumerable, Object]
|
661
611
|
#
|
662
612
|
# @return [Array<Object>, Object]
|
663
|
-
#
|
664
613
|
def coerce(value)
|
665
614
|
type = item_type
|
666
615
|
case value
|
@@ -671,12 +620,11 @@ module TerminalShop
|
|
671
620
|
end
|
672
621
|
end
|
673
622
|
|
674
|
-
# @private
|
623
|
+
# @api private
|
675
624
|
#
|
676
625
|
# @param value [Enumerable, Object]
|
677
626
|
#
|
678
627
|
# @return [Array<Object>, Object]
|
679
|
-
#
|
680
628
|
def dump(value)
|
681
629
|
type = item_type
|
682
630
|
case value
|
@@ -687,12 +635,11 @@ module TerminalShop
|
|
687
635
|
end
|
688
636
|
end
|
689
637
|
|
690
|
-
# @private
|
638
|
+
# @api private
|
691
639
|
#
|
692
640
|
# @param value [Object]
|
693
641
|
#
|
694
642
|
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
695
|
-
#
|
696
643
|
def try_strict_coerce(value)
|
697
644
|
case value
|
698
645
|
in Array
|
@@ -726,13 +673,12 @@ module TerminalShop
|
|
726
673
|
end
|
727
674
|
end
|
728
675
|
|
729
|
-
# @private
|
676
|
+
# @api private
|
730
677
|
#
|
731
678
|
# @return [TerminalShop::Converter, Class]
|
732
|
-
#
|
733
679
|
protected def item_type = @item_type_fn.call
|
734
680
|
|
735
|
-
# @private
|
681
|
+
# @api private
|
736
682
|
#
|
737
683
|
# @param type_info [Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class]
|
738
684
|
#
|
@@ -745,13 +691,12 @@ module TerminalShop
|
|
745
691
|
# @option spec [Proc] :union
|
746
692
|
#
|
747
693
|
# @option spec [Boolean] :"nil?"
|
748
|
-
#
|
749
694
|
def initialize(type_info, spec = {})
|
750
695
|
@item_type_fn = TerminalShop::Converter.type_info(type_info || spec)
|
751
696
|
end
|
752
697
|
end
|
753
698
|
|
754
|
-
# @private
|
699
|
+
# @api private
|
755
700
|
#
|
756
701
|
# @abstract
|
757
702
|
#
|
@@ -759,14 +704,22 @@ module TerminalShop
|
|
759
704
|
class HashOf
|
760
705
|
include TerminalShop::Converter
|
761
706
|
|
762
|
-
|
763
|
-
|
764
|
-
|
707
|
+
# @param type_info [Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class]
|
708
|
+
#
|
709
|
+
# @param spec [Hash{Symbol=>Object}] .
|
710
|
+
#
|
711
|
+
# @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
|
712
|
+
#
|
713
|
+
# @option spec [Proc] :enum
|
714
|
+
#
|
715
|
+
# @option spec [Proc] :union
|
716
|
+
#
|
717
|
+
# @option spec [Boolean] :"nil?"
|
718
|
+
def self.[](type_info, spec = {}) = new(type_info, spec)
|
765
719
|
|
766
720
|
# @param other [Object]
|
767
721
|
#
|
768
722
|
# @return [Boolean]
|
769
|
-
#
|
770
723
|
def ===(other)
|
771
724
|
type = item_type
|
772
725
|
case other
|
@@ -787,15 +740,13 @@ module TerminalShop
|
|
787
740
|
# @param other [Object]
|
788
741
|
#
|
789
742
|
# @return [Boolean]
|
790
|
-
#
|
791
743
|
def ==(other) = other.is_a?(TerminalShop::HashOf) && other.item_type == item_type
|
792
744
|
|
793
|
-
# @private
|
745
|
+
# @api private
|
794
746
|
#
|
795
747
|
# @param value [Hash{Object=>Object}, Object]
|
796
748
|
#
|
797
749
|
# @return [Hash{Symbol=>Object}, Object]
|
798
|
-
#
|
799
750
|
def coerce(value)
|
800
751
|
type = item_type
|
801
752
|
case value
|
@@ -809,12 +760,11 @@ module TerminalShop
|
|
809
760
|
end
|
810
761
|
end
|
811
762
|
|
812
|
-
# @private
|
763
|
+
# @api private
|
813
764
|
#
|
814
765
|
# @param value [Hash{Object=>Object}, Object]
|
815
766
|
#
|
816
767
|
# @return [Hash{Symbol=>Object}, Object]
|
817
|
-
#
|
818
768
|
def dump(value)
|
819
769
|
type = item_type
|
820
770
|
case value
|
@@ -827,12 +777,11 @@ module TerminalShop
|
|
827
777
|
end
|
828
778
|
end
|
829
779
|
|
830
|
-
# @private
|
780
|
+
# @api private
|
831
781
|
#
|
832
782
|
# @param value [Object]
|
833
783
|
#
|
834
784
|
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
835
|
-
#
|
836
785
|
def try_strict_coerce(value)
|
837
786
|
case value
|
838
787
|
in Hash
|
@@ -866,13 +815,12 @@ module TerminalShop
|
|
866
815
|
end
|
867
816
|
end
|
868
817
|
|
869
|
-
# @private
|
818
|
+
# @api private
|
870
819
|
#
|
871
820
|
# @return [TerminalShop::Converter, Class]
|
872
|
-
#
|
873
821
|
protected def item_type = @item_type_fn.call
|
874
822
|
|
875
|
-
# @private
|
823
|
+
# @api private
|
876
824
|
#
|
877
825
|
# @param type_info [Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class]
|
878
826
|
#
|
@@ -885,55 +833,56 @@ module TerminalShop
|
|
885
833
|
# @option spec [Proc] :union
|
886
834
|
#
|
887
835
|
# @option spec [Boolean] :"nil?"
|
888
|
-
#
|
889
836
|
def initialize(type_info, spec = {})
|
890
837
|
@item_type_fn = TerminalShop::Converter.type_info(type_info || spec)
|
891
838
|
end
|
892
839
|
end
|
893
840
|
|
894
|
-
# @private
|
895
|
-
#
|
896
841
|
# @abstract
|
897
842
|
#
|
898
843
|
# @example
|
899
|
-
#
|
900
|
-
#
|
901
|
-
#
|
902
|
-
#
|
903
|
-
#
|
904
|
-
#
|
905
|
-
# }
|
906
|
-
# ```
|
844
|
+
# # `product_api` is a `TerminalShop::Models::ProductAPI`
|
845
|
+
# product_api => {
|
846
|
+
# id: id,
|
847
|
+
# description: description,
|
848
|
+
# name: name
|
849
|
+
# }
|
907
850
|
class BaseModel
|
908
851
|
extend TerminalShop::Converter
|
909
852
|
|
910
853
|
class << self
|
911
|
-
# @private
|
854
|
+
# @api private
|
912
855
|
#
|
913
856
|
# Assumes superclass fields are totally defined before fields are accessed /
|
914
857
|
# defined on subclasses.
|
915
858
|
#
|
916
859
|
# @return [Hash{Symbol=>Hash{Symbol=>Object}}]
|
917
|
-
#
|
918
860
|
def known_fields
|
919
861
|
@known_fields ||= (self < TerminalShop::BaseModel ? superclass.known_fields.dup : {})
|
920
862
|
end
|
921
863
|
|
922
|
-
# @
|
864
|
+
# @api private
|
923
865
|
#
|
866
|
+
# @return [Hash{Symbol=>Symbol}]
|
867
|
+
def reverse_map
|
868
|
+
@reverse_map ||= (self < TerminalShop::BaseModel ? superclass.reverse_map.dup : {})
|
869
|
+
end
|
870
|
+
|
871
|
+
# @api private
|
872
|
+
#
|
873
|
+
# @return [Hash{Symbol=>Hash{Symbol=>Object}}]
|
924
874
|
def fields
|
925
875
|
known_fields.transform_values do |field|
|
926
876
|
{**field.except(:type_fn), type: field.fetch(:type_fn).call}
|
927
877
|
end
|
928
878
|
end
|
929
879
|
|
930
|
-
# @private
|
880
|
+
# @api private
|
931
881
|
#
|
932
882
|
# @return [Hash{Symbol=>Proc}]
|
933
|
-
#
|
934
883
|
def defaults = (@defaults ||= {})
|
935
884
|
|
936
|
-
# @private
|
885
|
+
# @api private
|
937
886
|
#
|
938
887
|
# @param name_sym [Symbol]
|
939
888
|
#
|
@@ -950,11 +899,10 @@ module TerminalShop
|
|
950
899
|
# @option spec [Proc] :union
|
951
900
|
#
|
952
901
|
# @option spec [Boolean] :"nil?"
|
953
|
-
#
|
954
902
|
private def add_field(name_sym, required:, type_info:, spec:)
|
955
903
|
type_fn, info =
|
956
904
|
case type_info
|
957
|
-
in Proc |
|
905
|
+
in Proc | Module | TerminalShop::Converter
|
958
906
|
[TerminalShop::Converter.type_info({**spec, union: type_info}), spec]
|
959
907
|
in Hash
|
960
908
|
[TerminalShop::Converter.type_info(type_info), type_info]
|
@@ -963,7 +911,7 @@ module TerminalShop
|
|
963
911
|
fallback = info[:const]
|
964
912
|
defaults[name_sym] = fallback if required && !info[:nil?] && info.key?(:const)
|
965
913
|
|
966
|
-
key = info
|
914
|
+
key = info[:api_name]&.tap { reverse_map[_1] = name_sym } || name_sym
|
967
915
|
setter = "#{name_sym}="
|
968
916
|
|
969
917
|
if known_fields.key?(name_sym)
|
@@ -989,7 +937,7 @@ module TerminalShop
|
|
989
937
|
end
|
990
938
|
end
|
991
939
|
|
992
|
-
# @private
|
940
|
+
# @api private
|
993
941
|
#
|
994
942
|
# @param name_sym [Symbol]
|
995
943
|
#
|
@@ -1004,12 +952,11 @@ module TerminalShop
|
|
1004
952
|
# @option spec [Proc] :union
|
1005
953
|
#
|
1006
954
|
# @option spec [Boolean] :"nil?"
|
1007
|
-
#
|
1008
955
|
def required(name_sym, type_info, spec = {})
|
1009
956
|
add_field(name_sym, required: true, type_info: type_info, spec: spec)
|
1010
957
|
end
|
1011
958
|
|
1012
|
-
# @private
|
959
|
+
# @api private
|
1013
960
|
#
|
1014
961
|
# @param name_sym [Symbol]
|
1015
962
|
#
|
@@ -1024,18 +971,16 @@ module TerminalShop
|
|
1024
971
|
# @option spec [Proc] :union
|
1025
972
|
#
|
1026
973
|
# @option spec [Boolean] :"nil?"
|
1027
|
-
#
|
1028
974
|
def optional(name_sym, type_info, spec = {})
|
1029
975
|
add_field(name_sym, required: false, type_info: type_info, spec: spec)
|
1030
976
|
end
|
1031
977
|
|
1032
|
-
# @private
|
978
|
+
# @api private
|
1033
979
|
#
|
1034
980
|
# `request_only` attributes not excluded from `.#coerce` when receiving responses
|
1035
981
|
# even if well behaved servers should not send them
|
1036
982
|
#
|
1037
983
|
# @param blk [Proc]
|
1038
|
-
#
|
1039
984
|
private def request_only(&blk)
|
1040
985
|
@mode = :dump
|
1041
986
|
blk.call
|
@@ -1043,12 +988,11 @@ module TerminalShop
|
|
1043
988
|
@mode = nil
|
1044
989
|
end
|
1045
990
|
|
1046
|
-
# @private
|
991
|
+
# @api private
|
1047
992
|
#
|
1048
993
|
# `response_only` attributes are omitted from `.#dump` when making requests
|
1049
994
|
#
|
1050
995
|
# @param blk [Proc]
|
1051
|
-
#
|
1052
996
|
private def response_only(&blk)
|
1053
997
|
@mode = :coerce
|
1054
998
|
blk.call
|
@@ -1060,7 +1004,6 @@ module TerminalShop
|
|
1060
1004
|
# @param other [Object]
|
1061
1005
|
#
|
1062
1006
|
# @return [Boolean]
|
1063
|
-
#
|
1064
1007
|
def ==(other)
|
1065
1008
|
case other
|
1066
1009
|
in TerminalShop::BaseModel
|
@@ -1071,12 +1014,11 @@ module TerminalShop
|
|
1071
1014
|
end
|
1072
1015
|
|
1073
1016
|
class << self
|
1074
|
-
# @private
|
1017
|
+
# @api private
|
1075
1018
|
#
|
1076
1019
|
# @param value [TerminalShop::BaseModel, Hash{Object=>Object}, Object]
|
1077
1020
|
#
|
1078
1021
|
# @return [TerminalShop::BaseModel, Object]
|
1079
|
-
#
|
1080
1022
|
def coerce(value)
|
1081
1023
|
case TerminalShop::Util.coerce_hash(value)
|
1082
1024
|
in Hash => coerced
|
@@ -1086,12 +1028,11 @@ module TerminalShop
|
|
1086
1028
|
end
|
1087
1029
|
end
|
1088
1030
|
|
1089
|
-
# @private
|
1031
|
+
# @api private
|
1090
1032
|
#
|
1091
1033
|
# @param value [TerminalShop::BaseModel, Object]
|
1092
1034
|
#
|
1093
1035
|
# @return [Hash{Object=>Object}, Object]
|
1094
|
-
#
|
1095
1036
|
def dump(value)
|
1096
1037
|
unless (coerced = TerminalShop::Util.coerce_hash(value)).is_a?(Hash)
|
1097
1038
|
return value
|
@@ -1123,12 +1064,11 @@ module TerminalShop
|
|
1123
1064
|
values
|
1124
1065
|
end
|
1125
1066
|
|
1126
|
-
# @private
|
1067
|
+
# @api private
|
1127
1068
|
#
|
1128
1069
|
# @param value [Object]
|
1129
1070
|
#
|
1130
1071
|
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
1131
|
-
#
|
1132
1072
|
def try_strict_coerce(value)
|
1133
1073
|
case value
|
1134
1074
|
in Hash | TerminalShop::BaseModel
|
@@ -1186,7 +1126,6 @@ module TerminalShop
|
|
1186
1126
|
# @param key [Symbol]
|
1187
1127
|
#
|
1188
1128
|
# @return [Object, nil]
|
1189
|
-
#
|
1190
1129
|
def [](key)
|
1191
1130
|
unless key.instance_of?(Symbol)
|
1192
1131
|
raise ArgumentError.new("Expected symbol key for lookup, got #{key.inspect}")
|
@@ -1205,7 +1144,6 @@ module TerminalShop
|
|
1205
1144
|
# should not be mutated.
|
1206
1145
|
#
|
1207
1146
|
# @return [Hash{Symbol=>Object}]
|
1208
|
-
#
|
1209
1147
|
def to_h = @data
|
1210
1148
|
|
1211
1149
|
alias_method :to_hash, :to_h
|
@@ -1213,7 +1151,6 @@ module TerminalShop
|
|
1213
1151
|
# @param keys [Array<Symbol>, nil]
|
1214
1152
|
#
|
1215
1153
|
# @return [Hash{Symbol=>Object}]
|
1216
|
-
#
|
1217
1154
|
def deconstruct_keys(keys)
|
1218
1155
|
(keys || self.class.known_fields.keys).filter_map do |k|
|
1219
1156
|
unless self.class.known_fields.key?(k)
|
@@ -1228,22 +1165,33 @@ module TerminalShop
|
|
1228
1165
|
# Create a new instance of a model.
|
1229
1166
|
#
|
1230
1167
|
# @param data [Hash{Symbol=>Object}, TerminalShop::BaseModel]
|
1231
|
-
#
|
1232
1168
|
def initialize(data = {})
|
1233
1169
|
case TerminalShop::Util.coerce_hash(data)
|
1234
1170
|
in Hash => coerced
|
1235
|
-
@data = coerced.
|
1171
|
+
@data = coerced.to_h do |key, value|
|
1172
|
+
name = key.to_sym
|
1173
|
+
mapped = self.class.reverse_map.fetch(name, name)
|
1174
|
+
type = self.class.fields[mapped]&.fetch(:type)
|
1175
|
+
stored =
|
1176
|
+
case [type, value]
|
1177
|
+
in [Module, Hash] if type <= TerminalShop::BaseModel
|
1178
|
+
type.new(value)
|
1179
|
+
in [TerminalShop::ArrayOf, Array] | [TerminalShop::HashOf, Hash]
|
1180
|
+
type.coerce(value)
|
1181
|
+
else
|
1182
|
+
value
|
1183
|
+
end
|
1184
|
+
[name, stored]
|
1185
|
+
end
|
1236
1186
|
else
|
1237
1187
|
raise ArgumentError.new("Expected a #{Hash} or #{TerminalShop::BaseModel}, got #{data.inspect}")
|
1238
1188
|
end
|
1239
1189
|
end
|
1240
1190
|
|
1241
1191
|
# @return [String]
|
1242
|
-
#
|
1243
1192
|
def to_s = @data.to_s
|
1244
1193
|
|
1245
1194
|
# @return [String]
|
1246
|
-
#
|
1247
1195
|
def inspect
|
1248
1196
|
"#<#{self.class.name}:0x#{object_id.to_s(16)} #{deconstruct_keys(nil).map do |k, v|
|
1249
1197
|
"#{k}=#{v.inspect}"
|