terminal-shop 0.1.0.pre.alpha.9 → 0.1.0.pre.alpha.11

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 (105) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/terminal-shop/base_client.rb +143 -124
  4. data/lib/terminal-shop/base_model.rb +2 -2
  5. data/lib/terminal-shop/base_page.rb +2 -6
  6. data/lib/terminal-shop/models/address.rb +0 -11
  7. data/lib/terminal-shop/models/address_create_response.rb +0 -6
  8. data/lib/terminal-shop/models/address_delete_response.rb +0 -6
  9. data/lib/terminal-shop/models/address_list_response.rb +0 -6
  10. data/lib/terminal-shop/models/app.rb +8 -9
  11. data/lib/terminal-shop/models/app_create_response.rb +0 -13
  12. data/lib/terminal-shop/models/app_delete_response.rb +0 -6
  13. data/lib/terminal-shop/models/app_get_response.rb +0 -6
  14. data/lib/terminal-shop/models/app_list_response.rb +0 -6
  15. data/lib/terminal-shop/models/card.rb +0 -16
  16. data/lib/terminal-shop/models/card_collect_response.rb +0 -12
  17. data/lib/terminal-shop/models/card_create_response.rb +0 -6
  18. data/lib/terminal-shop/models/card_delete_response.rb +0 -6
  19. data/lib/terminal-shop/models/card_list_response.rb +0 -6
  20. data/lib/terminal-shop/models/cart.rb +0 -33
  21. data/lib/terminal-shop/models/cart_convert_response.rb +0 -6
  22. data/lib/terminal-shop/models/cart_get_response.rb +0 -6
  23. data/lib/terminal-shop/models/cart_set_address_response.rb +0 -6
  24. data/lib/terminal-shop/models/cart_set_card_response.rb +0 -6
  25. data/lib/terminal-shop/models/cart_set_item_response.rb +0 -6
  26. data/lib/terminal-shop/models/email_create_response.rb +0 -6
  27. data/lib/terminal-shop/models/order.rb +0 -46
  28. data/lib/terminal-shop/models/order_get_response.rb +0 -6
  29. data/lib/terminal-shop/models/order_list_response.rb +0 -6
  30. data/lib/terminal-shop/models/product.rb +0 -11
  31. data/lib/terminal-shop/models/product_list_response.rb +0 -6
  32. data/lib/terminal-shop/models/product_variant.rb +0 -8
  33. data/lib/terminal-shop/models/profile.rb +0 -16
  34. data/lib/terminal-shop/models/profile_me_response.rb +0 -6
  35. data/lib/terminal-shop/models/profile_update_response.rb +0 -6
  36. data/lib/terminal-shop/models/subscription.rb +0 -24
  37. data/lib/terminal-shop/models/subscription_create_response.rb +0 -6
  38. data/lib/terminal-shop/models/subscription_delete_response.rb +0 -6
  39. data/lib/terminal-shop/models/subscription_list_response.rb +0 -6
  40. data/lib/terminal-shop/models/token.rb +0 -14
  41. data/lib/terminal-shop/models/token_create_response.rb +0 -13
  42. data/lib/terminal-shop/models/token_delete_response.rb +0 -6
  43. data/lib/terminal-shop/models/token_get_response.rb +0 -6
  44. data/lib/terminal-shop/models/token_list_response.rb +0 -6
  45. data/lib/terminal-shop/models/view_init_response.rb +0 -17
  46. data/lib/terminal-shop/pooled_net_requester.rb +130 -61
  47. data/lib/terminal-shop/resources/app.rb +2 -0
  48. data/lib/terminal-shop/util.rb +22 -7
  49. data/lib/terminal-shop/version.rb +1 -1
  50. data/lib/terminal-shop.rb +55 -55
  51. data/rbi/lib/terminal-shop/base_client.rbi +40 -27
  52. data/rbi/lib/terminal-shop/base_model.rbi +63 -99
  53. data/rbi/lib/terminal-shop/base_page.rbi +4 -3
  54. data/rbi/lib/terminal-shop/client.rbi +2 -1
  55. data/rbi/lib/terminal-shop/errors.rbi +10 -5
  56. data/rbi/lib/terminal-shop/models/address.rbi +16 -14
  57. data/rbi/lib/terminal-shop/models/address_create_params.rbi +16 -14
  58. data/rbi/lib/terminal-shop/models/address_list_response.rbi +1 -3
  59. data/rbi/lib/terminal-shop/models/app.rbi +11 -3
  60. data/rbi/lib/terminal-shop/models/app_create_response.rbi +2 -1
  61. data/rbi/lib/terminal-shop/models/app_list_response.rbi +1 -3
  62. data/rbi/lib/terminal-shop/models/card.rbi +5 -17
  63. data/rbi/lib/terminal-shop/models/card_collect_response.rbi +2 -1
  64. data/rbi/lib/terminal-shop/models/card_create_params.rbi +6 -2
  65. data/rbi/lib/terminal-shop/models/card_list_response.rbi +1 -3
  66. data/rbi/lib/terminal-shop/models/cart.rbi +16 -15
  67. data/rbi/lib/terminal-shop/models/cart_set_address_params.rbi +2 -1
  68. data/rbi/lib/terminal-shop/models/cart_set_card_params.rbi +6 -2
  69. data/rbi/lib/terminal-shop/models/cart_set_item_params.rbi +8 -8
  70. data/rbi/lib/terminal-shop/models/email_create_params.rbi +6 -2
  71. data/rbi/lib/terminal-shop/models/order.rbi +43 -44
  72. data/rbi/lib/terminal-shop/models/order_list_response.rbi +1 -3
  73. data/rbi/lib/terminal-shop/models/product.rbi +17 -14
  74. data/rbi/lib/terminal-shop/models/product_list_response.rbi +1 -3
  75. data/rbi/lib/terminal-shop/models/profile.rbi +13 -13
  76. data/rbi/lib/terminal-shop/models/profile_update_params.rbi +6 -8
  77. data/rbi/lib/terminal-shop/models/subscription.rbi +29 -26
  78. data/rbi/lib/terminal-shop/models/subscription_list_response.rbi +2 -1
  79. data/rbi/lib/terminal-shop/models/token_create_response.rbi +2 -1
  80. data/rbi/lib/terminal-shop/models/token_list_response.rbi +1 -3
  81. data/rbi/lib/terminal-shop/models/view_init_response.rbi +26 -34
  82. data/rbi/lib/terminal-shop/pooled_net_requester.rbi +59 -0
  83. data/rbi/lib/terminal-shop/request_options.rbi +6 -24
  84. data/rbi/lib/terminal-shop/resources/address.rbi +6 -11
  85. data/rbi/lib/terminal-shop/resources/app.rbi +10 -13
  86. data/rbi/lib/terminal-shop/resources/card.rbi +8 -20
  87. data/rbi/lib/terminal-shop/resources/cart.rbi +10 -21
  88. data/rbi/lib/terminal-shop/resources/email.rbi +2 -1
  89. data/rbi/lib/terminal-shop/resources/order.rbi +4 -10
  90. data/rbi/lib/terminal-shop/resources/product.rbi +2 -9
  91. data/rbi/lib/terminal-shop/resources/profile.rbi +4 -10
  92. data/rbi/lib/terminal-shop/resources/subscription.rbi +6 -11
  93. data/rbi/lib/terminal-shop/resources/token.rbi +8 -20
  94. data/rbi/lib/terminal-shop/resources/view.rbi +2 -9
  95. data/rbi/lib/terminal-shop/util.rbi +25 -23
  96. data/rbi/lib/terminal-shop/version.rbi +1 -1
  97. data/sig/terminal-shop/base_client.rbs +27 -27
  98. data/sig/terminal-shop/base_model.rbs +0 -2
  99. data/sig/terminal-shop/base_page.rbs +1 -1
  100. data/sig/terminal-shop/models/app.rbs +5 -2
  101. data/sig/terminal-shop/pooled_net_requester.rbs +42 -0
  102. data/sig/terminal-shop/resources/app.rbs +1 -0
  103. data/sig/terminal-shop/util.rbs +7 -1
  104. data/sig/terminal-shop/version.rbs +1 -1
  105. metadata +5 -3
@@ -4,91 +4,160 @@ module TerminalShop
4
4
  # @private
5
5
  #
6
6
  class PooledNetRequester
7
- def initialize
8
- @mutex = Mutex.new
9
- @pools = {}
7
+ class << self
8
+ # @private
9
+ #
10
+ # @param url [URI::Generic]
11
+ #
12
+ # @return [Net::HTTP]
13
+ #
14
+ def connect(url)
15
+ port =
16
+ case [url.port, url.scheme]
17
+ in [Integer, _]
18
+ url.port
19
+ in [nil, "http" | "ws"]
20
+ Net::HTTP.http_default_port
21
+ in [nil, "https" | "wss"]
22
+ Net::HTTP.https_default_port
23
+ end
24
+
25
+ Net::HTTP.new(url.host, port).tap do
26
+ _1.use_ssl = %w[https wss].include?(url.scheme)
27
+ _1.max_retries = 0
28
+ end
29
+ end
30
+
31
+ # @private
32
+ #
33
+ # @param conn [Net::HTTP]
34
+ # @param deadline [Float]
35
+ #
36
+ private def calibrate_socket_timeout(conn, deadline)
37
+ timeout = deadline - TerminalShop::Util.monotonic_secs
38
+ conn.read_timeout = conn.write_timeout = conn.continue_timeout = timeout
39
+ end
40
+
41
+ # @private
42
+ #
43
+ # @param conn [Net::HTTP]
44
+ # @param req [Net::HTTPGenericRequest]
45
+ # @param deadline [Float]
46
+ # @param blk [Proc]
47
+ #
48
+ def transport(conn, req, deadline, &blk)
49
+ unless conn.started?
50
+ conn.open_timeout = deadline - TerminalShop::Util.monotonic_secs
51
+ conn.start
52
+ end
53
+
54
+ calibrate_socket_timeout(conn, deadline)
55
+ conn.request(req) do |rsp|
56
+ blk.call(rsp)
57
+ rsp.read_body do |bytes|
58
+ blk.call(bytes)
59
+ calibrate_socket_timeout(conn, deadline)
60
+ end
61
+ end
62
+ end
10
63
  end
11
64
 
12
65
  # @private
13
66
  #
14
- # @param url [URL::Generic]
15
- # @param timeout [Float]
67
+ # @param url [URI::Generic]
68
+ # @param streaming [Boolean]
69
+ # @param blk [Proc]
16
70
  #
17
- # @return [ConnectionPool]
18
- #
19
- private def get_pool(url)
71
+ private def with_pool(url, streaming:, &blk)
20
72
  origin = TerminalShop::Util.uri_origin(url)
21
- @mutex.synchronize do
22
- @pools[origin] ||= ConnectionPool.new(size: Etc.nprocessors) do
23
- port =
24
- case [url.port, url.scheme]
25
- in [Integer, _]
26
- url.port
27
- in [nil, "http" | "ws"]
28
- Net::HTTP.http_default_port
29
- in [nil, "https" | "wss"]
30
- Net::HTTP.https_default_port
31
- end
32
-
33
- session = Net::HTTP.new(url.host, port)
34
- session.use_ssl = %w[https wss].include?(url.scheme)
35
- session.max_retries = 0
36
- session
73
+ th = Thread.current
74
+ key = :"#{object_id}-#{self.class.name}-connection_in_use_for_#{origin}"
75
+
76
+ if th[key] || streaming
77
+ return Enumerator.new do |y|
78
+ conn = self.class.connect(url)
79
+ blk.call(conn, y)
80
+ end
81
+ end
82
+
83
+ pool =
84
+ @mutex.synchronize do
85
+ @pools[origin] ||= ConnectionPool.new(size: Etc.nprocessors) do
86
+ self.class.connect(url)
87
+ end
88
+ end
89
+
90
+ Enumerator.new do |y|
91
+ pool.with do |conn|
92
+ th[key] = true
93
+
94
+ blk.call(conn, y)
95
+ # rubocop:disable Lint/RescueException
96
+ rescue Exception => e
97
+ # rubocop:enable Lint/RescueException
98
+ # should close connection on all errors to ensure no invalid state persists
99
+ conn.finish if conn.started?
100
+ raise e
101
+ ensure
102
+ th[key] = nil
37
103
  end
38
104
  end
39
105
  end
40
106
 
41
107
  # @private
42
108
  #
43
- # @param req [Hash{Symbol => Object}]
44
- # @option req [Symbol] :method
45
- # @option req [URI::Generic] :url
46
- # @option req [Hash{String => String}] :headers
47
- # @option req [String, Hash] :body
48
- # @option req [Float] :timeout
109
+ # @param request [Hash{Symbol=>Object}] .
110
+ #
111
+ # @option request [Symbol] :method
112
+ #
113
+ # @option request [URI::Generic] :url
114
+ #
115
+ # @option request [Hash{String=>String}] :headers
116
+ #
117
+ # @option request [Object] :body
118
+ #
119
+ # @option request [Boolean] :streaming
49
120
  #
50
- # @return [Net::HTTPResponse]
121
+ # @option request [Integer] :max_retries
51
122
  #
52
- def execute(req)
53
- method, url, headers, body, timeout = req.fetch_values(:method, :url, :headers, :body, :timeout)
123
+ # @option request [Float] :deadline
124
+ #
125
+ # @return [Array(Net::HTTPResponse, Enumerable)]
126
+ #
127
+ def execute(request)
128
+ method, url, headers, body, deadline = request.fetch_values(:method, :url, :headers, :body, :deadline)
129
+ streaming = request.fetch(:streaming)
54
130
 
55
- request = Net::HTTPGenericRequest.new(
131
+ req = Net::HTTPGenericRequest.new(
56
132
  method.to_s.upcase,
57
133
  !body.nil?,
58
- ![:head, :options].include?(method),
134
+ method != :head,
59
135
  url.to_s
60
136
  )
61
137
 
62
- headers.each { |k, v| request[k] = v }
138
+ headers.each { req[_1] = _2 }
63
139
  case body
64
- in String | nil
65
- request.body = body
140
+ in nil
141
+ in String
142
+ req.body = body
66
143
  in IO | StringIO
67
- request.body_stream = body
144
+ body.rewind
145
+ req.body_stream = body
68
146
  end
69
147
 
70
- # This timeout is for acquiring a connection from the pool
71
- # The default 5 seconds seems too short, lets just have a nearly unbounded queue for now
72
- #
73
- # TODO: revisit this around granular timeout / concurrency control
74
- get_pool(url).with(timeout: 600) do |conn|
75
- conn.open_timeout = timeout
76
- conn.read_timeout = timeout
77
- conn.write_timeout = timeout
78
- conn.continue_timeout = timeout
79
-
80
- conn.start unless conn.started?
81
-
82
- conn.request(request)
83
- # rubocop:disable Lint/RescueException
84
- rescue Exception => e
85
- # rubocop:enable Lint/RescueException
86
- # should close connection on all errors to ensure no invalid state persists
87
- conn.finish if conn.started?
88
- raise e
89
- end
90
- rescue ConnectionPool::TimeoutError
91
- raise TerminalShop::APITimeoutError.new(url: url)
148
+ enum =
149
+ with_pool(url, streaming: streaming) do |conn, y|
150
+ self.class.transport(conn, req, deadline, &y)
151
+ end
152
+
153
+ enum = streaming ? enum.lazy : enum.to_a
154
+ response = enum.take(1).first
155
+ [response, (response.body = enum.drop(1))]
156
+ end
157
+
158
+ def initialize
159
+ @mutex = Mutex.new
160
+ @pools = {}
92
161
  end
93
162
  end
94
163
  end
@@ -13,6 +13,8 @@ module TerminalShop
13
13
  #
14
14
  # @option params [String] :redirect_uri Redirect URI of the app.
15
15
  #
16
+ # @option params [String] :secret OAuth 2.0 client secret of the app (obfuscated).
17
+ #
16
18
  # @option params [TerminalShop::RequestOptions, Hash{Symbol=>Object}, nil] :request_options
17
19
  #
18
20
  # @return [TerminalShop::Models::AppCreateResponse]
@@ -105,6 +105,12 @@ module TerminalShop
105
105
  end
106
106
  end
107
107
 
108
+ # @private
109
+ #
110
+ # @return [Float]
111
+ #
112
+ def self.monotonic_secs = Process.clock_gettime(Process::CLOCK_MONOTONIC)
113
+
108
114
  # @private
109
115
  #
110
116
  # @param exceptions [Array<Exception>]
@@ -384,6 +390,11 @@ module TerminalShop
384
390
  "transfer-encoding" => "chunked"
385
391
  }
386
392
  [headers, strio]
393
+ in [_, StringIO]
394
+ [headers, body.string]
395
+ in [_, IO]
396
+ headers = {**headers, "transfer-encoding" => "chunked"}
397
+ [headers, body]
387
398
  else
388
399
  [headers, body]
389
400
  end
@@ -391,24 +402,28 @@ module TerminalShop
391
402
 
392
403
  # @private
393
404
  #
394
- # @param response [Net::HTTPResponse]
405
+ # @param headers [Hash{String=>String}, Net::HTTPHeader]
406
+ # @param stream [Enumerable]
395
407
  # @param suppress_error [Boolean]
396
408
  #
397
409
  # @raise [JSON::ParserError]
398
410
  # @return [Object]
399
411
  #
400
- def self.decode_content(response, suppress_error: false)
401
- case response.content_type
402
- in "application/json"
412
+ def self.decode_content(headers, stream:, suppress_error: false)
413
+ case headers["content-type"]
414
+ in %r{^application/json}
415
+ json = stream.to_a.join("")
403
416
  begin
404
- JSON.parse(response.body, symbolize_names: true)
417
+ JSON.parse(json, symbolize_names: true)
405
418
  rescue JSON::ParserError => e
406
419
  raise e unless suppress_error
407
- response.body
420
+ json
408
421
  end
422
+ in %r{^text/}
423
+ stream.to_a.join("")
409
424
  else
410
425
  # TODO: parsing other response types
411
- response.body
426
+ StringIO.new(stream.to_a.join(""))
412
427
  end
413
428
  end
414
429
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TerminalShop
4
- VERSION = "0.1.0-alpha.9"
4
+ VERSION = "0.1.0-alpha.11"
5
5
  end
data/lib/terminal-shop.rb CHANGED
@@ -17,94 +17,94 @@ require "uri"
17
17
  require "connection_pool"
18
18
 
19
19
  # Package files.
20
- require_relative "terminal-shop/pooled_net_requester"
21
20
  require_relative "terminal-shop/version"
22
21
  require_relative "terminal-shop/util"
23
22
  require_relative "terminal-shop/extern"
24
23
  require_relative "terminal-shop/base_model"
25
24
  require_relative "terminal-shop/base_page"
26
25
  require_relative "terminal-shop/request_options"
27
- require_relative "terminal-shop/base_client"
28
26
  require_relative "terminal-shop/errors"
29
- require_relative "terminal-shop/models/product"
30
- require_relative "terminal-shop/models/product_variant"
31
- require_relative "terminal-shop/models/product_list_response"
32
- require_relative "terminal-shop/models/profile"
33
- require_relative "terminal-shop/models/profile_update_response"
34
- require_relative "terminal-shop/models/profile_me_response"
27
+ require_relative "terminal-shop/base_client"
28
+ require_relative "terminal-shop/pooled_net_requester"
29
+ require_relative "terminal-shop/client"
30
+ require_relative "terminal-shop/models/app"
31
+ require_relative "terminal-shop/models/subscription"
35
32
  require_relative "terminal-shop/models/address"
33
+ require_relative "terminal-shop/models/address_create_params"
36
34
  require_relative "terminal-shop/models/address_create_response"
37
- require_relative "terminal-shop/models/address_list_response"
35
+ require_relative "terminal-shop/models/address_delete_params"
38
36
  require_relative "terminal-shop/models/address_delete_response"
37
+ require_relative "terminal-shop/models/address_list_params"
38
+ require_relative "terminal-shop/models/address_list_response"
39
+ require_relative "terminal-shop/models/app_create_params"
40
+ require_relative "terminal-shop/models/app_create_response"
41
+ require_relative "terminal-shop/models/app_delete_params"
42
+ require_relative "terminal-shop/models/app_delete_response"
43
+ require_relative "terminal-shop/models/app_get_params"
44
+ require_relative "terminal-shop/models/app_get_response"
45
+ require_relative "terminal-shop/models/app_list_params"
46
+ require_relative "terminal-shop/models/app_list_response"
39
47
  require_relative "terminal-shop/models/card"
48
+ require_relative "terminal-shop/models/card_collect_params"
49
+ require_relative "terminal-shop/models/card_collect_response"
50
+ require_relative "terminal-shop/models/card_create_params"
40
51
  require_relative "terminal-shop/models/card_create_response"
41
- require_relative "terminal-shop/models/card_list_response"
52
+ require_relative "terminal-shop/models/card_delete_params"
42
53
  require_relative "terminal-shop/models/card_delete_response"
43
- require_relative "terminal-shop/models/card_collect_response"
54
+ require_relative "terminal-shop/models/card_list_params"
55
+ require_relative "terminal-shop/models/card_list_response"
44
56
  require_relative "terminal-shop/models/cart"
57
+ require_relative "terminal-shop/models/cart_convert_params"
45
58
  require_relative "terminal-shop/models/cart_convert_response"
59
+ require_relative "terminal-shop/models/cart_get_params"
46
60
  require_relative "terminal-shop/models/cart_get_response"
61
+ require_relative "terminal-shop/models/cart_set_address_params"
47
62
  require_relative "terminal-shop/models/cart_set_address_response"
63
+ require_relative "terminal-shop/models/cart_set_card_params"
48
64
  require_relative "terminal-shop/models/cart_set_card_response"
65
+ require_relative "terminal-shop/models/cart_set_item_params"
49
66
  require_relative "terminal-shop/models/cart_set_item_response"
67
+ require_relative "terminal-shop/models/email_create_params"
68
+ require_relative "terminal-shop/models/email_create_response"
50
69
  require_relative "terminal-shop/models/order"
51
- require_relative "terminal-shop/models/order_list_response"
70
+ require_relative "terminal-shop/models/order_get_params"
52
71
  require_relative "terminal-shop/models/order_get_response"
53
- require_relative "terminal-shop/models/subscription"
54
- require_relative "terminal-shop/models/subscription_create_response"
55
- require_relative "terminal-shop/models/subscription_list_response"
56
- require_relative "terminal-shop/models/subscription_delete_response"
57
- require_relative "terminal-shop/models/token"
58
- require_relative "terminal-shop/models/token_create_response"
59
- require_relative "terminal-shop/models/token_list_response"
60
- require_relative "terminal-shop/models/token_delete_response"
61
- require_relative "terminal-shop/models/token_get_response"
62
- require_relative "terminal-shop/models/app"
63
- require_relative "terminal-shop/models/app_create_response"
64
- require_relative "terminal-shop/models/app_list_response"
65
- require_relative "terminal-shop/models/app_delete_response"
66
- require_relative "terminal-shop/models/app_get_response"
67
- require_relative "terminal-shop/models/email_create_response"
68
- require_relative "terminal-shop/models/view_init_response"
72
+ require_relative "terminal-shop/models/order_list_params"
73
+ require_relative "terminal-shop/models/order_list_response"
74
+ require_relative "terminal-shop/models/product"
69
75
  require_relative "terminal-shop/models/product_list_params"
70
- require_relative "terminal-shop/models/profile_update_params"
76
+ require_relative "terminal-shop/models/product_list_response"
77
+ require_relative "terminal-shop/models/product_variant"
78
+ require_relative "terminal-shop/models/profile"
71
79
  require_relative "terminal-shop/models/profile_me_params"
72
- require_relative "terminal-shop/models/address_create_params"
73
- require_relative "terminal-shop/models/address_list_params"
74
- require_relative "terminal-shop/models/address_delete_params"
75
- require_relative "terminal-shop/models/card_create_params"
76
- require_relative "terminal-shop/models/card_list_params"
77
- require_relative "terminal-shop/models/card_delete_params"
78
- require_relative "terminal-shop/models/card_collect_params"
79
- require_relative "terminal-shop/models/cart_convert_params"
80
- require_relative "terminal-shop/models/cart_get_params"
81
- require_relative "terminal-shop/models/cart_set_address_params"
82
- require_relative "terminal-shop/models/cart_set_card_params"
83
- require_relative "terminal-shop/models/cart_set_item_params"
84
- require_relative "terminal-shop/models/order_list_params"
85
- require_relative "terminal-shop/models/order_get_params"
80
+ require_relative "terminal-shop/models/profile_me_response"
81
+ require_relative "terminal-shop/models/profile_update_params"
82
+ require_relative "terminal-shop/models/profile_update_response"
86
83
  require_relative "terminal-shop/models/subscription_create_params"
87
- require_relative "terminal-shop/models/subscription_list_params"
84
+ require_relative "terminal-shop/models/subscription_create_response"
88
85
  require_relative "terminal-shop/models/subscription_delete_params"
86
+ require_relative "terminal-shop/models/subscription_delete_response"
87
+ require_relative "terminal-shop/models/subscription_list_params"
88
+ require_relative "terminal-shop/models/subscription_list_response"
89
+ require_relative "terminal-shop/models/token"
89
90
  require_relative "terminal-shop/models/token_create_params"
90
- require_relative "terminal-shop/models/token_list_params"
91
+ require_relative "terminal-shop/models/token_create_response"
91
92
  require_relative "terminal-shop/models/token_delete_params"
93
+ require_relative "terminal-shop/models/token_delete_response"
92
94
  require_relative "terminal-shop/models/token_get_params"
93
- require_relative "terminal-shop/models/app_create_params"
94
- require_relative "terminal-shop/models/app_list_params"
95
- require_relative "terminal-shop/models/app_delete_params"
96
- require_relative "terminal-shop/models/app_get_params"
97
- require_relative "terminal-shop/models/email_create_params"
95
+ require_relative "terminal-shop/models/token_get_response"
96
+ require_relative "terminal-shop/models/token_list_params"
97
+ require_relative "terminal-shop/models/token_list_response"
98
98
  require_relative "terminal-shop/models/view_init_params"
99
- require_relative "terminal-shop/client"
100
- require_relative "terminal-shop/resources/product"
101
- require_relative "terminal-shop/resources/profile"
99
+ require_relative "terminal-shop/models/view_init_response"
102
100
  require_relative "terminal-shop/resources/address"
101
+ require_relative "terminal-shop/resources/app"
103
102
  require_relative "terminal-shop/resources/card"
104
103
  require_relative "terminal-shop/resources/cart"
104
+ require_relative "terminal-shop/resources/email"
105
105
  require_relative "terminal-shop/resources/order"
106
+ require_relative "terminal-shop/resources/product"
107
+ require_relative "terminal-shop/resources/profile"
106
108
  require_relative "terminal-shop/resources/subscription"
107
109
  require_relative "terminal-shop/resources/token"
108
- require_relative "terminal-shop/resources/app"
109
- require_relative "terminal-shop/resources/email"
110
110
  require_relative "terminal-shop/resources/view"
@@ -4,7 +4,7 @@ module TerminalShop
4
4
  class BaseClient
5
5
  abstract!
6
6
 
7
- RequestShape = T.type_alias do
7
+ RequestComponentsShape = T.type_alias do
8
8
  {
9
9
  method: Symbol,
10
10
  path: T.any(String, T::Array[String]),
@@ -18,12 +18,13 @@ module TerminalShop
18
18
  }
19
19
  end
20
20
 
21
- NormalizedRequestShape = T.type_alias do
21
+ RequestInputShape = T.type_alias do
22
22
  {
23
23
  method: Symbol,
24
24
  url: URI::Generic,
25
25
  headers: T::Hash[String, String],
26
26
  body: T.anything,
27
+ streaming: T::Boolean,
27
28
  max_retries: Integer,
28
29
  timeout: Float
29
30
  }
@@ -31,10 +32,27 @@ module TerminalShop
31
32
 
32
33
  MAX_REDIRECTS = 20
33
34
 
34
- sig { params(req: TerminalShop::BaseClient::RequestShape).void }
35
+ sig { params(req: TerminalShop::BaseClient::RequestComponentsShape).void }
35
36
  def self.validate!(req)
36
37
  end
37
38
 
39
+ sig do
40
+ params(status: Integer, headers: T.any(T::Hash[String, String], Net::HTTPHeader)).returns(T::Boolean)
41
+ end
42
+ def self.should_retry?(status, headers:)
43
+ end
44
+
45
+ sig do
46
+ params(
47
+ request: TerminalShop::BaseClient::RequestInputShape,
48
+ status: Integer,
49
+ response_headers: T.any(T::Hash[String, String], Net::HTTPHeader)
50
+ )
51
+ .returns(TerminalShop::BaseClient::RequestInputShape)
52
+ end
53
+ def self.follow_redirect(request, status:, response_headers:)
54
+ end
55
+
38
56
  sig { returns(T.anything) }
39
57
  def requester
40
58
  end
@@ -52,7 +70,8 @@ module TerminalShop
52
70
  max_retry_delay: Float,
53
71
  headers: T::Hash[String, T.nilable(String)],
54
72
  idempotency_header: T.nilable(String)
55
- ).void
73
+ )
74
+ .void
56
75
  end
57
76
  def initialize(
58
77
  base_url:,
@@ -74,45 +93,38 @@ module TerminalShop
74
93
  end
75
94
 
76
95
  sig do
77
- params(
78
- req: TerminalShop::BaseClient::RequestShape,
79
- opts: T::Hash[Symbol, T.anything]
80
- ).returns(TerminalShop::BaseClient::NormalizedRequestShape)
96
+ overridable
97
+ .params(req: TerminalShop::BaseClient::RequestComponentsShape, opts: T::Hash[Symbol, T.anything])
98
+ .returns(TerminalShop::BaseClient::RequestInputShape)
81
99
  end
82
100
  private def build_request(req, opts)
83
101
  end
84
102
 
85
- sig { params(status: Integer, headers: T::Hash[String, String]).returns(T::Boolean) }
86
- private def should_retry?(status, headers:)
87
- end
88
-
89
103
  sig { params(headers: T::Hash[String, String], retry_count: Integer).returns(Float) }
90
104
  private def retry_delay(headers, retry_count:)
91
105
  end
92
106
 
93
107
  sig do
94
108
  params(
95
- request: TerminalShop::BaseClient::NormalizedRequestShape,
96
- status: Integer,
97
- location_header: String
98
- ).returns(TerminalShop::BaseClient::NormalizedRequestShape)
99
- end
100
- private def follow_redirect(request, status:, location_header:)
101
- end
102
-
103
- sig do
104
- params(
105
- request: TerminalShop::BaseClient::NormalizedRequestShape,
109
+ request: TerminalShop::BaseClient::RequestInputShape,
106
110
  redirect_count: Integer,
107
111
  retry_count: Integer,
108
112
  send_retry_header: T::Boolean
109
- ).returns(Net::HTTPResponse)
113
+ )
114
+ .returns([Net::HTTPResponse, T::Enumerable[String]])
110
115
  end
111
116
  private def send_request(request, redirect_count:, retry_count:, send_retry_header:)
112
117
  end
113
118
 
114
- sig { params(req: TerminalShop::BaseClient::RequestShape, response: NilClass).returns(T.anything) }
115
- private def parse_response(req, response)
119
+ sig do
120
+ params(
121
+ req: TerminalShop::BaseClient::RequestComponentsShape,
122
+ headers: T.any(T::Hash[String, String], Net::HTTPHeader),
123
+ stream: T::Enumerable[String]
124
+ )
125
+ .returns(T.anything)
126
+ end
127
+ private def parse_response(req, headers:, stream:)
116
128
  end
117
129
 
118
130
  sig do
@@ -126,7 +138,8 @@ module TerminalShop
126
138
  page: T.nilable(T::Class[TerminalShop::BaseModel]),
127
139
  model: T.nilable(TerminalShop::Converter::Input),
128
140
  options: T.nilable(T.any(TerminalShop::RequestOptions, T::Hash[Symbol, T.anything]))
129
- ).returns(T.anything)
141
+ )
142
+ .returns(T.anything)
130
143
  end
131
144
  def request(
132
145
  method,