terminal-shop 0.1.0.pre.alpha.10 → 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 +116 -78
  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,122 +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]
67
+ # @param url [URI::Generic]
68
+ # @param streaming [Boolean]
15
69
  # @param blk [Proc]
16
70
  #
17
- # @return [ConnectionPool]
18
- #
19
- private def with_pool(url, &blk)
71
+ private def with_pool(url, streaming:, &blk)
20
72
  origin = TerminalShop::Util.uri_origin(url)
21
- key = :"#{self.class.name}-connection_in_use_for_#{origin}"
73
+ th = Thread.current
74
+ key = :"#{object_id}-#{self.class.name}-connection_in_use_for_#{origin}"
22
75
 
23
- return blk.call(make_conn(url)) if Thread.current[key]
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
24
82
 
25
83
  pool =
26
84
  @mutex.synchronize do
27
85
  @pools[origin] ||= ConnectionPool.new(size: Etc.nprocessors) do
28
- make_conn(url)
86
+ self.class.connect(url)
29
87
  end
30
88
  end
31
89
 
32
- pool.with do |conn|
33
- Thread.current[key] = true
34
-
35
- blk.call(conn)
36
- # rubocop:disable Lint/RescueException
37
- rescue Exception => e
38
- # rubocop:enable Lint/RescueException
39
- # should close connection on all errors to ensure no invalid state persists
40
- conn.finish if conn.started?
41
- raise e
42
- ensure
43
- Thread.current[key] = nil
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
103
+ end
44
104
  end
45
105
  end
46
106
 
47
107
  # @private
48
108
  #
49
- # @param url [URI::Generic]
109
+ # @param request [Hash{Symbol=>Object}] .
50
110
  #
51
- # @return [Net::HTTP]
111
+ # @option request [Symbol] :method
52
112
  #
53
- private def make_conn(url)
54
- port =
55
- case [url.port, url.scheme]
56
- in [Integer, _]
57
- url.port
58
- in [nil, "http" | "ws"]
59
- Net::HTTP.http_default_port
60
- in [nil, "https" | "wss"]
61
- Net::HTTP.https_default_port
62
- end
63
-
64
- Net::HTTP.new(url.host, port).tap do
65
- _1.use_ssl = %w[https wss].include?(url.scheme)
66
- _1.max_retries = 0
67
- end
68
- end
69
-
70
- # @private
113
+ # @option request [URI::Generic] :url
114
+ #
115
+ # @option request [Hash{String=>String}] :headers
71
116
  #
72
- # @param req [Hash{Symbol => Object}]
73
- # @option req [Symbol] :method
74
- # @option req [URI::Generic] :url
75
- # @option req [Hash{String => String}] :headers
76
- # @option req [String, Hash, IO, StringIO] :body
77
- # @option req [Float] :timeout
117
+ # @option request [Object] :body
78
118
  #
79
- # @return [Net::HTTPResponse]
119
+ # @option request [Boolean] :streaming
80
120
  #
81
- def execute(req)
82
- method, url, headers, body, timeout = req.fetch_values(:method, :url, :headers, :body, :timeout)
121
+ # @option request [Integer] :max_retries
122
+ #
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)
83
130
 
84
- request = Net::HTTPGenericRequest.new(
131
+ req = Net::HTTPGenericRequest.new(
85
132
  method.to_s.upcase,
86
133
  !body.nil?,
87
134
  method != :head,
88
135
  url.to_s
89
136
  )
90
137
 
91
- headers.each { |k, v| request[k] = v }
138
+ headers.each { req[_1] = _2 }
92
139
  case body
93
- in String | nil
94
- request.body = body
140
+ in nil
141
+ in String
142
+ req.body = body
95
143
  in IO | StringIO
96
- request.body_stream = body
97
- end
98
-
99
- with_pool(url) do |conn|
100
- make_request(conn, request, timeout)
144
+ body.rewind
145
+ req.body_stream = body
101
146
  end
102
- end
103
147
 
104
- # @private
105
- #
106
- # @param conn [Net::HTTP]
107
- # @param request [Net::HTTPGenericRequest]
108
- # @param timeout [Float]
109
- #
110
- # @return [Net::HTTPResponse]
111
- #
112
- private def make_request(conn, request, timeout)
113
- unless conn.started?
114
- conn.open_timeout = timeout
115
- conn.start
116
- end
148
+ enum =
149
+ with_pool(url, streaming: streaming) do |conn, y|
150
+ self.class.transport(conn, req, deadline, &y)
151
+ end
117
152
 
118
- conn.read_timeout = timeout
119
- conn.write_timeout = timeout
120
- conn.continue_timeout = timeout
153
+ enum = streaming ? enum.lazy : enum.to_a
154
+ response = enum.take(1).first
155
+ [response, (response.body = enum.drop(1))]
156
+ end
121
157
 
122
- conn.request(request)
158
+ def initialize
159
+ @mutex = Mutex.new
160
+ @pools = {}
123
161
  end
124
162
  end
125
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.10"
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,