terminal-shop 3.6.2 → 3.7.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 (124) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +21 -0
  3. data/README.md +1 -1
  4. data/lib/terminal_shop/errors.rb +1 -1
  5. data/lib/terminal_shop/internal/transport/base_client.rb +77 -5
  6. data/lib/terminal_shop/internal/transport/pooled_net_requester.rb +14 -0
  7. data/lib/terminal_shop/internal/type/array_of.rb +1 -1
  8. data/lib/terminal_shop/internal/type/base_model.rb +62 -30
  9. data/lib/terminal_shop/internal/type/converter.rb +18 -0
  10. data/lib/terminal_shop/internal/type/enum.rb +1 -0
  11. data/lib/terminal_shop/internal/type/hash_of.rb +1 -1
  12. data/lib/terminal_shop/internal/type/union.rb +1 -0
  13. data/lib/terminal_shop/internal/util.rb +56 -0
  14. data/lib/terminal_shop/internal.rb +6 -0
  15. data/lib/terminal_shop/models/subscription.rb +9 -0
  16. data/lib/terminal_shop/models/subscription_update_params.rb +9 -0
  17. data/lib/terminal_shop/models.rb +27 -0
  18. data/lib/terminal_shop/request_options.rb +4 -0
  19. data/lib/terminal_shop/version.rb +1 -1
  20. data/lib/terminal_shop.rb +2 -0
  21. data/rbi/terminal_shop/internal/transport/base_client.rbi +31 -8
  22. data/rbi/terminal_shop/internal/transport/pooled_net_requester.rbi +5 -3
  23. data/rbi/terminal_shop/internal/type/base_model.rbi +33 -15
  24. data/rbi/terminal_shop/internal/type/base_page.rbi +1 -1
  25. data/rbi/terminal_shop/internal/type/converter.rbi +2 -0
  26. data/rbi/terminal_shop/internal/type/enum.rbi +1 -0
  27. data/rbi/terminal_shop/internal/type/union.rbi +1 -0
  28. data/rbi/terminal_shop/internal/util.rbi +28 -5
  29. data/rbi/terminal_shop/internal.rbi +2 -0
  30. data/rbi/terminal_shop/models/address.rbi +3 -1
  31. data/rbi/terminal_shop/models/address_create_params.rbi +6 -1
  32. data/rbi/terminal_shop/models/address_create_response.rbi +6 -1
  33. data/rbi/terminal_shop/models/address_delete_params.rbi +6 -1
  34. data/rbi/terminal_shop/models/address_delete_response.rbi +6 -1
  35. data/rbi/terminal_shop/models/address_get_params.rbi +3 -1
  36. data/rbi/terminal_shop/models/address_get_response.rbi +6 -1
  37. data/rbi/terminal_shop/models/address_list_params.rbi +6 -1
  38. data/rbi/terminal_shop/models/address_list_response.rbi +6 -1
  39. data/rbi/terminal_shop/models/app.rbi +3 -1
  40. data/rbi/terminal_shop/models/app_create_params.rbi +3 -1
  41. data/rbi/terminal_shop/models/app_create_response.rbi +12 -2
  42. data/rbi/terminal_shop/models/app_delete_params.rbi +3 -1
  43. data/rbi/terminal_shop/models/app_delete_response.rbi +6 -1
  44. data/rbi/terminal_shop/models/app_get_params.rbi +3 -1
  45. data/rbi/terminal_shop/models/app_get_response.rbi +6 -1
  46. data/rbi/terminal_shop/models/app_list_params.rbi +3 -1
  47. data/rbi/terminal_shop/models/app_list_response.rbi +6 -1
  48. data/rbi/terminal_shop/models/card.rbi +9 -2
  49. data/rbi/terminal_shop/models/card_collect_params.rbi +6 -1
  50. data/rbi/terminal_shop/models/card_collect_response.rbi +12 -2
  51. data/rbi/terminal_shop/models/card_create_params.rbi +3 -1
  52. data/rbi/terminal_shop/models/card_create_response.rbi +6 -1
  53. data/rbi/terminal_shop/models/card_delete_params.rbi +3 -1
  54. data/rbi/terminal_shop/models/card_delete_response.rbi +6 -1
  55. data/rbi/terminal_shop/models/card_get_params.rbi +3 -1
  56. data/rbi/terminal_shop/models/card_get_response.rbi +6 -1
  57. data/rbi/terminal_shop/models/card_list_params.rbi +3 -1
  58. data/rbi/terminal_shop/models/card_list_response.rbi +6 -1
  59. data/rbi/terminal_shop/models/cart.rbi +18 -4
  60. data/rbi/terminal_shop/models/cart_clear_params.rbi +3 -1
  61. data/rbi/terminal_shop/models/cart_clear_response.rbi +6 -1
  62. data/rbi/terminal_shop/models/cart_convert_params.rbi +6 -1
  63. data/rbi/terminal_shop/models/cart_convert_response.rbi +6 -1
  64. data/rbi/terminal_shop/models/cart_get_params.rbi +3 -1
  65. data/rbi/terminal_shop/models/cart_get_response.rbi +6 -1
  66. data/rbi/terminal_shop/models/cart_set_address_params.rbi +6 -1
  67. data/rbi/terminal_shop/models/cart_set_address_response.rbi +6 -1
  68. data/rbi/terminal_shop/models/cart_set_card_params.rbi +6 -1
  69. data/rbi/terminal_shop/models/cart_set_card_response.rbi +6 -1
  70. data/rbi/terminal_shop/models/cart_set_item_params.rbi +6 -1
  71. data/rbi/terminal_shop/models/cart_set_item_response.rbi +6 -1
  72. data/rbi/terminal_shop/models/email_create_params.rbi +6 -1
  73. data/rbi/terminal_shop/models/email_create_response.rbi +6 -1
  74. data/rbi/terminal_shop/models/order.rbi +24 -5
  75. data/rbi/terminal_shop/models/order_create_params.rbi +6 -1
  76. data/rbi/terminal_shop/models/order_create_response.rbi +6 -1
  77. data/rbi/terminal_shop/models/order_get_params.rbi +3 -1
  78. data/rbi/terminal_shop/models/order_get_response.rbi +6 -1
  79. data/rbi/terminal_shop/models/order_list_params.rbi +3 -1
  80. data/rbi/terminal_shop/models/order_list_response.rbi +6 -1
  81. data/rbi/terminal_shop/models/product.rbi +9 -2
  82. data/rbi/terminal_shop/models/product_get_params.rbi +3 -1
  83. data/rbi/terminal_shop/models/product_get_response.rbi +6 -1
  84. data/rbi/terminal_shop/models/product_list_params.rbi +6 -1
  85. data/rbi/terminal_shop/models/product_list_response.rbi +6 -1
  86. data/rbi/terminal_shop/models/product_variant.rbi +9 -2
  87. data/rbi/terminal_shop/models/profile.rbi +9 -2
  88. data/rbi/terminal_shop/models/profile_me_params.rbi +3 -1
  89. data/rbi/terminal_shop/models/profile_me_response.rbi +6 -1
  90. data/rbi/terminal_shop/models/profile_update_params.rbi +6 -1
  91. data/rbi/terminal_shop/models/profile_update_response.rbi +6 -1
  92. data/rbi/terminal_shop/models/subscription.rbi +15 -3
  93. data/rbi/terminal_shop/models/subscription_create_params.rbi +6 -1
  94. data/rbi/terminal_shop/models/subscription_create_response.rbi +6 -1
  95. data/rbi/terminal_shop/models/subscription_delete_params.rbi +6 -1
  96. data/rbi/terminal_shop/models/subscription_delete_response.rbi +6 -1
  97. data/rbi/terminal_shop/models/subscription_get_params.rbi +6 -1
  98. data/rbi/terminal_shop/models/subscription_get_response.rbi +6 -1
  99. data/rbi/terminal_shop/models/subscription_list_params.rbi +6 -1
  100. data/rbi/terminal_shop/models/subscription_list_response.rbi +6 -1
  101. data/rbi/terminal_shop/models/subscription_update_params.rbi +18 -3
  102. data/rbi/terminal_shop/models/subscription_update_response.rbi +6 -1
  103. data/rbi/terminal_shop/models/token.rbi +3 -1
  104. data/rbi/terminal_shop/models/token_create_params.rbi +6 -1
  105. data/rbi/terminal_shop/models/token_create_response.rbi +12 -2
  106. data/rbi/terminal_shop/models/token_delete_params.rbi +6 -1
  107. data/rbi/terminal_shop/models/token_delete_response.rbi +6 -1
  108. data/rbi/terminal_shop/models/token_get_params.rbi +3 -1
  109. data/rbi/terminal_shop/models/token_get_response.rbi +6 -1
  110. data/rbi/terminal_shop/models/token_list_params.rbi +3 -1
  111. data/rbi/terminal_shop/models/token_list_response.rbi +6 -1
  112. data/rbi/terminal_shop/models/view_init_params.rbi +3 -1
  113. data/rbi/terminal_shop/models/view_init_response.rbi +12 -2
  114. data/rbi/terminal_shop/request_options.rbi +3 -1
  115. data/sig/terminal_shop/internal/transport/base_client.rbs +16 -1
  116. data/sig/terminal_shop/internal/transport/pooled_net_requester.rbs +2 -0
  117. data/sig/terminal_shop/internal/type/base_model.rbs +11 -5
  118. data/sig/terminal_shop/internal/type/base_page.rbs +1 -1
  119. data/sig/terminal_shop/internal/type/converter.rbs +2 -0
  120. data/sig/terminal_shop/internal/type/enum.rbs +1 -0
  121. data/sig/terminal_shop/internal/type/union.rbs +1 -0
  122. data/sig/terminal_shop/internal/util.rbs +13 -0
  123. data/sig/terminal_shop/internal.rbs +2 -0
  124. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: df81693d60a13914c0ca1d8f9b9b9f5691e846931716167132d2133c29471043
4
- data.tar.gz: c8c644764b8b414bec54167ab89a1d3cc7b87b19611c9092fff4cc0209463194
3
+ metadata.gz: ec0b2f09a8009870055d5b2a868a6078adb11504f48eba5eea34b84ff89ba60f
4
+ data.tar.gz: f2e9a51a8c54a1eb7f07f40485b89b93218ba1055a8b0498a11f97caa15d5c71
5
5
  SHA512:
6
- metadata.gz: 532a6a6630d948cbd312576bcfa4e1f173b8b8229bc9974e05bed17bb5740b6b944342c0cdcd590fdb1932323278a7189f9e9a047791ced7fbdd8cd557404b8e
7
- data.tar.gz: f5741d50ec9f61d5e14a13161d9d13f89b4641b1aa88264681425545e281f1a2a4ef09459ef141971345cbf82560ae87ac71e751ad4dd7f98f458914a79933ed
6
+ metadata.gz: 1144da9caada255b1fd2a9856dd8a2d5e6375c0322e369d761289b41c8aa2fe1ba318add613dc0f1cbcd1031badc4576d27084c635921cd063848dbcae5a9ea9
7
+ data.tar.gz: e5271523d7d53bcd460ea32453cab3b764009685b290344dcbc07def5ebe9133dd0e8cf55cb3ea72b2491cfb47488c21cdab21c67c0ca4e9b5add53c266ee185
data/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.7.0 (2025-05-14)
4
+
5
+ Full Changelog: [v3.6.2...v3.7.0](https://github.com/terminaldotshop/terminal-sdk-ruby/compare/v3.6.2...v3.7.0)
6
+
7
+ ### Features
8
+
9
+ * expose base client options as read only attributes ([5ed1891](https://github.com/terminaldotshop/terminal-sdk-ruby/commit/5ed18915050ee0f2db755deaa6655e93e0e3b766))
10
+ * expose recursive `#to_h` conversion ([ca0cc5f](https://github.com/terminaldotshop/terminal-sdk-ruby/commit/ca0cc5f0001bbb2f5b9c5edd7e4e7a017f268956))
11
+ * support sorbet aliases at the runtime ([9e210bb](https://github.com/terminaldotshop/terminal-sdk-ruby/commit/9e210bb7cb568a0c4b7a10e87e69772d56a0306b))
12
+
13
+
14
+ ### Bug Fixes
15
+
16
+ * **internal:** update gemspec name ([47cc74b](https://github.com/terminaldotshop/terminal-sdk-ruby/commit/47cc74b18b522e6caa46b014977c035b144e8faf))
17
+
18
+
19
+ ### Chores
20
+
21
+ * fix misc linting / minor issues ([536f483](https://github.com/terminaldotshop/terminal-sdk-ruby/commit/536f483f7916651ae0ae11f663315c8b379dc619))
22
+ * **internal:** version bump ([cbba1d7](https://github.com/terminaldotshop/terminal-sdk-ruby/commit/cbba1d7501215bf6a55a54d1fcbdaea01da212d6))
23
+
3
24
  ## 3.6.2 (2025-05-08)
4
25
 
5
26
  Full Changelog: [v3.6.1...v3.6.2](https://github.com/terminaldotshop/terminal-sdk-ruby/compare/v3.6.1...v3.6.2)
data/README.md CHANGED
@@ -17,7 +17,7 @@ To use this gem, install via Bundler by adding the following to your application
17
17
  <!-- x-release-please-start-version -->
18
18
 
19
19
  ```ruby
20
- gem "terminal-shop", "~> 3.6.2"
20
+ gem "terminal-shop", "~> 3.7.0"
21
21
  ```
22
22
 
23
23
  <!-- x-release-please-end -->
@@ -99,7 +99,7 @@ module TerminalShop
99
99
  # @param response [nil]
100
100
  # @param message [String, nil]
101
101
  #
102
- # @return [TerminalShop::Errors::APIStatusError]
102
+ # @return [self]
103
103
  def self.for(url:, status:, body:, request:, response:, message: nil)
104
104
  kwargs = {
105
105
  url: url,
@@ -7,6 +7,8 @@ module TerminalShop
7
7
  #
8
8
  # @abstract
9
9
  class BaseClient
10
+ extend TerminalShop::Internal::Util::SorbetRuntimeSupport
11
+
10
12
  # from whatwg fetch spec
11
13
  MAX_REDIRECTS = 20
12
14
 
@@ -151,6 +153,27 @@ module TerminalShop
151
153
  end
152
154
  end
153
155
 
156
+ # @return [URI::Generic]
157
+ attr_reader :base_url
158
+
159
+ # @return [Float]
160
+ attr_reader :timeout
161
+
162
+ # @return [Integer]
163
+ attr_reader :max_retries
164
+
165
+ # @return [Float]
166
+ attr_reader :initial_retry_delay
167
+
168
+ # @return [Float]
169
+ attr_reader :max_retry_delay
170
+
171
+ # @return [Hash{String=>String}]
172
+ attr_reader :headers
173
+
174
+ # @return [String, nil]
175
+ attr_reader :idempotency_header
176
+
154
177
  # @api private
155
178
  # @return [TerminalShop::Internal::Transport::PooledNetRequester]
156
179
  attr_reader :requester
@@ -182,10 +205,11 @@ module TerminalShop
182
205
  },
183
206
  headers
184
207
  )
185
- @base_url = TerminalShop::Internal::Util.parse_uri(base_url)
208
+ @base_url_components = TerminalShop::Internal::Util.parse_uri(base_url)
209
+ @base_url = TerminalShop::Internal::Util.unparse_uri(@base_url_components)
186
210
  @idempotency_header = idempotency_header&.to_s&.downcase
187
- @max_retries = max_retries
188
211
  @timeout = timeout
212
+ @max_retries = max_retries
189
213
  @initial_retry_delay = initial_retry_delay
190
214
  @max_retry_delay = max_retry_delay
191
215
  end
@@ -276,10 +300,14 @@ module TerminalShop
276
300
  TerminalShop::Internal::Util.deep_merge(*[req[:body], opts[:extra_body]].compact)
277
301
  end
278
302
 
303
+ url = TerminalShop::Internal::Util.join_parsed_uri(
304
+ @base_url_components,
305
+ {**req, path: path, query: query}
306
+ )
279
307
  headers, encoded = TerminalShop::Internal::Util.encode_content(headers, body)
280
308
  {
281
309
  method: method,
282
- url: TerminalShop::Internal::Util.join_parsed_uri(@base_url, {**req, path: path, query: query}),
310
+ url: url,
283
311
  headers: headers,
284
312
  body: encoded,
285
313
  max_retries: opts.fetch(:max_retries, @max_retries),
@@ -476,10 +504,54 @@ module TerminalShop
476
504
  # @return [String]
477
505
  def inspect
478
506
  # rubocop:disable Layout/LineLength
479
- base_url = TerminalShop::Internal::Util.unparse_uri(@base_url)
480
- "#<#{self.class.name}:0x#{object_id.to_s(16)} base_url=#{base_url} max_retries=#{@max_retries} timeout=#{@timeout}>"
507
+ "#<#{self.class.name}:0x#{object_id.to_s(16)} base_url=#{@base_url} max_retries=#{@max_retries} timeout=#{@timeout}>"
481
508
  # rubocop:enable Layout/LineLength
482
509
  end
510
+
511
+ define_sorbet_constant!(:RequestComponents) do
512
+ T.type_alias do
513
+ {
514
+ method: Symbol,
515
+ path: T.any(String, T::Array[String]),
516
+ query: T.nilable(T::Hash[String, T.nilable(T.any(T::Array[String], String))]),
517
+ headers: T.nilable(
518
+ T::Hash[String,
519
+ T.nilable(
520
+ T.any(
521
+ String,
522
+ Integer,
523
+ T::Array[T.nilable(T.any(String, Integer))]
524
+ )
525
+ )]
526
+ ),
527
+ body: T.nilable(T.anything),
528
+ unwrap: T.nilable(
529
+ T.any(
530
+ Symbol,
531
+ Integer,
532
+ T::Array[T.any(Symbol, Integer)],
533
+ T.proc.params(arg0: T.anything).returns(T.anything)
534
+ )
535
+ ),
536
+ page: T.nilable(T::Class[TerminalShop::Internal::Type::BasePage[TerminalShop::Internal::Type::BaseModel]]),
537
+ stream: T.nilable(T::Class[T.anything]),
538
+ model: T.nilable(TerminalShop::Internal::Type::Converter::Input),
539
+ options: T.nilable(TerminalShop::RequestOptions::OrHash)
540
+ }
541
+ end
542
+ end
543
+ define_sorbet_constant!(:RequestInput) do
544
+ T.type_alias do
545
+ {
546
+ method: Symbol,
547
+ url: URI::Generic,
548
+ headers: T::Hash[String, String],
549
+ body: T.anything,
550
+ max_retries: Integer,
551
+ timeout: Float
552
+ }
553
+ end
554
+ end
483
555
  end
484
556
  end
485
557
  end
@@ -5,6 +5,8 @@ module TerminalShop
5
5
  module Transport
6
6
  # @api private
7
7
  class PooledNetRequester
8
+ extend TerminalShop::Internal::Util::SorbetRuntimeSupport
9
+
8
10
  # from the golang stdlib
9
11
  # https://github.com/golang/go/blob/c8eced8580028328fde7c03cbfcb720ce15b2358/src/net/http/transport.go#L49
10
12
  KEEP_ALIVE_TIMEOUT = 30
@@ -187,6 +189,18 @@ module TerminalShop
187
189
  @size = size
188
190
  @pools = {}
189
191
  end
192
+
193
+ define_sorbet_constant!(:Request) do
194
+ T.type_alias do
195
+ {
196
+ method: Symbol,
197
+ url: URI::Generic,
198
+ headers: T::Hash[String, String],
199
+ body: T.anything,
200
+ deadline: Float
201
+ }
202
+ end
203
+ end
190
204
  end
191
205
  end
192
206
  end
@@ -29,7 +29,7 @@ module TerminalShop
29
29
  #
30
30
  # @option spec [Boolean] :"nil?"
31
31
  #
32
- # @return [TerminalShop::Internal::Type::ArrayOf]
32
+ # @return [self]
33
33
  def self.[](...) = new(...)
34
34
 
35
35
  # @api public
@@ -6,6 +6,7 @@ module TerminalShop
6
6
  # @abstract
7
7
  class BaseModel
8
8
  extend TerminalShop::Internal::Type::Converter
9
+ extend TerminalShop::Internal::Util::SorbetRuntimeSupport
9
10
 
10
11
  class << self
11
12
  # @api private
@@ -13,11 +14,17 @@ module TerminalShop
13
14
  # Assumes superclass fields are totally defined before fields are accessed /
14
15
  # defined on subclasses.
15
16
  #
16
- # @return [Hash{Symbol=>Hash{Symbol=>Object}}]
17
- def known_fields
18
- @known_fields ||= (self < TerminalShop::Internal::Type::BaseModel ? superclass.known_fields.dup : {})
17
+ # @param child [Class<TerminalShop::Internal::Type::BaseModel>]
18
+ def inherited(child)
19
+ super
20
+ child.known_fields.replace(known_fields.dup)
19
21
  end
20
22
 
23
+ # @api private
24
+ #
25
+ # @return [Hash{Symbol=>Hash{Symbol=>Object}}]
26
+ def known_fields = @known_fields ||= {}
27
+
21
28
  # @api private
22
29
  #
23
30
  # @return [Hash{Symbol=>Hash{Symbol=>Object}}]
@@ -204,7 +211,7 @@ module TerminalShop
204
211
  #
205
212
  # @option state [Integer] :branched
206
213
  #
207
- # @return [TerminalShop::Internal::Type::BaseModel, Object]
214
+ # @return [self, Object]
208
215
  def coerce(value, state:)
209
216
  exactness = state.fetch(:exactness)
210
217
 
@@ -263,7 +270,7 @@ module TerminalShop
263
270
 
264
271
  # @api private
265
272
  #
266
- # @param value [TerminalShop::Internal::Type::BaseModel, Object]
273
+ # @param value [self, Object]
267
274
  #
268
275
  # @param state [Hash{Symbol=>Object}] .
269
276
  #
@@ -304,6 +311,39 @@ module TerminalShop
304
311
  end
305
312
  end
306
313
 
314
+ class << self
315
+ # @api private
316
+ #
317
+ # @param model [TerminalShop::Internal::Type::BaseModel]
318
+ # @param convert [Boolean]
319
+ #
320
+ # @return [Hash{Symbol=>Object}]
321
+ def recursively_to_h(model, convert:)
322
+ rec = ->(x) do
323
+ case x
324
+ in TerminalShop::Internal::Type::BaseModel
325
+ if convert
326
+ fields = x.class.known_fields
327
+ x.to_h.to_h do |key, val|
328
+ [key, rec.call(fields.key?(key) ? x.public_send(key) : val)]
329
+ rescue TerminalShop::Errors::ConversionError
330
+ [key, rec.call(val)]
331
+ end
332
+ else
333
+ rec.call(x.to_h)
334
+ end
335
+ in Hash
336
+ x.transform_values(&rec)
337
+ in Array
338
+ x.map(&rec)
339
+ else
340
+ x
341
+ end
342
+ end
343
+ rec.call(model)
344
+ end
345
+ end
346
+
307
347
  # @api public
308
348
  #
309
349
  # Returns the raw value associated with the given key, if found. Otherwise, nil is
@@ -340,6 +380,14 @@ module TerminalShop
340
380
 
341
381
  alias_method :to_hash, :to_h
342
382
 
383
+ # @api public
384
+ #
385
+ # In addition to the behaviour of `#to_h`, this method will recursively call
386
+ # `#to_h` on nested models.
387
+ #
388
+ # @return [Hash{Symbol=>Object}]
389
+ def deep_to_h = self.class.recursively_to_h(@data, convert: false)
390
+
343
391
  # @param keys [Array<Symbol>, nil]
344
392
  #
345
393
  # @return [Hash{Symbol=>Object}]
@@ -355,29 +403,6 @@ module TerminalShop
355
403
  .to_h
356
404
  end
357
405
 
358
- class << self
359
- # @api private
360
- #
361
- # @param model [TerminalShop::Internal::Type::BaseModel]
362
- #
363
- # @return [Hash{Symbol=>Object}]
364
- def walk(model)
365
- walk = ->(x) do
366
- case x
367
- in TerminalShop::Internal::Type::BaseModel
368
- walk.call(x.to_h)
369
- in Hash
370
- x.transform_values(&walk)
371
- in Array
372
- x.map(&walk)
373
- else
374
- x
375
- end
376
- end
377
- walk.call(model)
378
- end
379
- end
380
-
381
406
  # @api public
382
407
  #
383
408
  # @param a [Object]
@@ -423,12 +448,19 @@ module TerminalShop
423
448
  # @api public
424
449
  #
425
450
  # @return [String]
426
- def to_s = self.class.walk(@data).to_s
451
+ def to_s = deep_to_h.to_s
427
452
 
428
453
  # @api private
429
454
  #
430
455
  # @return [String]
431
- def inspect = "#<#{self.class}:0x#{object_id.to_s(16)} #{self}>"
456
+ def inspect
457
+ converted = self.class.recursively_to_h(self, convert: true)
458
+ "#<#{self.class}:0x#{object_id.to_s(16)} #{converted}>"
459
+ end
460
+
461
+ define_sorbet_constant!(:KnownField) do
462
+ T.type_alias { {mode: T.nilable(Symbol), required: T::Boolean, nilable: T::Boolean} }
463
+ end
432
464
  end
433
465
  end
434
466
  end
@@ -5,6 +5,8 @@ module TerminalShop
5
5
  module Type
6
6
  # @api private
7
7
  module Converter
8
+ extend TerminalShop::Internal::Util::SorbetRuntimeSupport
9
+
8
10
  # rubocop:disable Lint/UnusedMethodArgument
9
11
 
10
12
  # @api private
@@ -268,6 +270,22 @@ module TerminalShop
268
270
  end
269
271
  end
270
272
  end
273
+
274
+ define_sorbet_constant!(:Input) do
275
+ T.type_alias { T.any(TerminalShop::Internal::Type::Converter, T::Class[T.anything]) }
276
+ end
277
+ define_sorbet_constant!(:CoerceState) do
278
+ T.type_alias do
279
+ {
280
+ strictness: T.any(T::Boolean, Symbol),
281
+ exactness: {yes: Integer, no: Integer, maybe: Integer},
282
+ branched: Integer
283
+ }
284
+ end
285
+ end
286
+ define_sorbet_constant!(:DumpState) do
287
+ T.type_alias { {can_retry: T::Boolean} }
288
+ end
271
289
  end
272
290
  end
273
291
  end
@@ -42,6 +42,7 @@ module TerminalShop
42
42
  # end
43
43
  module Enum
44
44
  include TerminalShop::Internal::Type::Converter
45
+ include TerminalShop::Internal::Util::SorbetRuntimeSupport
45
46
 
46
47
  # All of the valid Symbol values for this enum.
47
48
  #
@@ -29,7 +29,7 @@ module TerminalShop
29
29
  #
30
30
  # @option spec [Boolean] :"nil?"
31
31
  #
32
- # @return [TerminalShop::Internal::Type::HashOf]
32
+ # @return [self]
33
33
  def self.[](...) = new(...)
34
34
 
35
35
  # @api public
@@ -6,6 +6,7 @@ module TerminalShop
6
6
  # @api private
7
7
  module Union
8
8
  include TerminalShop::Internal::Type::Converter
9
+ include TerminalShop::Internal::Util::SorbetRuntimeSupport
9
10
 
10
11
  # @api private
11
12
  #
@@ -801,6 +801,62 @@ module TerminalShop
801
801
  end
802
802
  end
803
803
  end
804
+
805
+ # @api private
806
+ module SorbetRuntimeSupport
807
+ class MissingSorbetRuntimeError < ::RuntimeError
808
+ end
809
+
810
+ # @api private
811
+ #
812
+ # @return [Hash{Symbol=>Object}]
813
+ private def sorbet_runtime_constants = @sorbet_runtime_constants ||= {}
814
+
815
+ # @api private
816
+ #
817
+ # @param name [Symbol]
818
+ def const_missing(name)
819
+ super unless sorbet_runtime_constants.key?(name)
820
+
821
+ unless Object.const_defined?(:T)
822
+ message = "Trying to access a Sorbet constant #{name.inspect} without `sorbet-runtime`."
823
+ raise MissingSorbetRuntimeError.new(message)
824
+ end
825
+
826
+ sorbet_runtime_constants.fetch(name).call
827
+ end
828
+
829
+ # @api private
830
+ #
831
+ # @param name [Symbol]
832
+ # @param blk [Proc]
833
+ def define_sorbet_constant!(name, &blk) = sorbet_runtime_constants.store(name, blk)
834
+ end
835
+
836
+ extend TerminalShop::Internal::Util::SorbetRuntimeSupport
837
+
838
+ define_sorbet_constant!(:ParsedUri) do
839
+ T.type_alias do
840
+ {
841
+ scheme: T.nilable(String),
842
+ host: T.nilable(String),
843
+ port: T.nilable(Integer),
844
+ path: T.nilable(String),
845
+ query: T::Hash[String, T::Array[String]]
846
+ }
847
+ end
848
+ end
849
+
850
+ define_sorbet_constant!(:ServerSentEvent) do
851
+ T.type_alias do
852
+ {
853
+ event: T.nilable(String),
854
+ data: T.nilable(String),
855
+ id: T.nilable(String),
856
+ retry: T.nilable(Integer)
857
+ }
858
+ end
859
+ end
804
860
  end
805
861
  end
806
862
  end
@@ -2,10 +2,16 @@
2
2
 
3
3
  module TerminalShop
4
4
  module Internal
5
+ extend TerminalShop::Internal::Util::SorbetRuntimeSupport
6
+
5
7
  OMIT =
6
8
  Object.new.tap do
7
9
  _1.define_singleton_method(:inspect) { "#<#{TerminalShop::Internal}::OMIT>" }
8
10
  end
9
11
  .freeze
12
+
13
+ define_sorbet_constant!(:AnyHash) do
14
+ T.type_alias { T::Hash[Symbol, T.anything] }
15
+ end
10
16
  end
11
17
  end
@@ -119,6 +119,15 @@ module TerminalShop
119
119
 
120
120
  # @!method self.variants
121
121
  # @return [Array(TerminalShop::SubscriptionAPI::Schedule::Fixed, TerminalShop::SubscriptionAPI::Schedule::Weekly)]
122
+
123
+ define_sorbet_constant!(:Variants) do
124
+ T.type_alias do
125
+ T.any(
126
+ TerminalShop::SubscriptionAPI::Schedule::Fixed,
127
+ TerminalShop::SubscriptionAPI::Schedule::Weekly
128
+ )
129
+ end
130
+ end
122
131
  end
123
132
  end
124
133
  end
@@ -70,6 +70,15 @@ module TerminalShop
70
70
 
71
71
  # @!method self.variants
72
72
  # @return [Array(TerminalShop::SubscriptionUpdateParams::Schedule::Fixed, TerminalShop::SubscriptionUpdateParams::Schedule::Weekly)]
73
+
74
+ define_sorbet_constant!(:Variants) do
75
+ T.type_alias do
76
+ T.any(
77
+ TerminalShop::SubscriptionUpdateParams::Schedule::Fixed,
78
+ TerminalShop::SubscriptionUpdateParams::Schedule::Weekly
79
+ )
80
+ end
81
+ end
73
82
  end
74
83
  end
75
84
  end
@@ -1,6 +1,33 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TerminalShop
4
+ [TerminalShop::Internal::Type::BaseModel, *TerminalShop::Internal::Type::BaseModel.subclasses].each do |cls|
5
+ cls.define_sorbet_constant!(:OrHash) { T.type_alias { T.any(cls, TerminalShop::Internal::AnyHash) } }
6
+ end
7
+
8
+ [
9
+ *TerminalShop::Internal::Type::Enum.included_modules,
10
+ *TerminalShop::Internal::Type::Union.included_modules
11
+ ].each do |cls|
12
+ cls.constants.each do |name|
13
+ case cls.const_get(name)
14
+ in true | false
15
+ cls.define_sorbet_constant!(:TaggedBoolean) { T.type_alias { T.all(T::Boolean, cls) } }
16
+ cls.define_sorbet_constant!(:OrBoolean) { T.type_alias { T::Boolean } }
17
+ in Integer
18
+ cls.define_sorbet_constant!(:TaggedInteger) { T.type_alias { T.all(Integer, cls) } }
19
+ cls.define_sorbet_constant!(:OrInteger) { T.type_alias { Integer } }
20
+ in Float
21
+ cls.define_sorbet_constant!(:TaggedFloat) { T.type_alias { T.all(Float, cls) } }
22
+ cls.define_sorbet_constant!(:OrFloat) { T.type_alias { Float } }
23
+ in Symbol
24
+ cls.define_sorbet_constant!(:TaggedSymbol) { T.type_alias { T.all(Symbol, cls) } }
25
+ cls.define_sorbet_constant!(:OrSymbol) { T.type_alias { T.any(Symbol, String) } }
26
+ else
27
+ end
28
+ end
29
+ end
30
+
4
31
  AddressAPI = TerminalShop::Models::AddressAPI
5
32
 
6
33
  AddressCreateParams = TerminalShop::Models::AddressCreateParams
@@ -69,5 +69,9 @@ module TerminalShop
69
69
  # Returns a new instance of RequestOptions.
70
70
  #
71
71
  # @param values [Hash{Symbol=>Object}]
72
+
73
+ define_sorbet_constant!(:OrHash) do
74
+ T.type_alias { T.any(TerminalShop::RequestOptions, TerminalShop::Internal::AnyHash) }
75
+ end
72
76
  end
73
77
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TerminalShop
4
- VERSION = "3.6.2"
4
+ VERSION = "3.7.0"
5
5
  end
data/lib/terminal_shop.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Standard libraries.
4
+ # rubocop:disable Lint/RedundantRequireStatement
4
5
  require "English"
5
6
  require "cgi"
6
7
  require "date"
@@ -15,6 +16,7 @@ require "set"
15
16
  require "stringio"
16
17
  require "time"
17
18
  require "uri"
19
+ # rubocop:enable Lint/RedundantRequireStatement
18
20
 
19
21
  # We already ship the preferred sorbet manifests in the package itself.
20
22
  # `tapioca` currently does not offer us a way to opt out of unnecessary compilation.