x 0.10.0 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +41 -28
  3. data/README.md +6 -2
  4. data/lib/x/authenticator.rb +8 -0
  5. data/lib/x/bearer_token_authenticator.rb +5 -3
  6. data/lib/x/cgi.rb +15 -0
  7. data/lib/x/client.rb +40 -40
  8. data/lib/x/connection.rb +39 -76
  9. data/lib/x/errors/bad_gateway.rb +5 -0
  10. data/lib/x/errors/{not_found_error.rb → bad_request.rb} +1 -1
  11. data/lib/x/errors/connection_exception.rb +5 -0
  12. data/lib/x/errors/error.rb +1 -6
  13. data/lib/x/errors/{forbidden_error.rb → forbidden.rb} +1 -1
  14. data/lib/x/errors/gateway_timeout.rb +5 -0
  15. data/lib/x/errors/{bad_request_error.rb → gone.rb} +1 -1
  16. data/lib/x/errors/network_error.rb +1 -1
  17. data/lib/x/errors/not_acceptable.rb +5 -0
  18. data/lib/x/errors/not_found.rb +5 -0
  19. data/lib/x/errors/payload_too_large.rb +5 -0
  20. data/lib/x/errors/service_unavailable.rb +5 -0
  21. data/lib/x/errors/too_many_redirects.rb +5 -0
  22. data/lib/x/errors/too_many_requests.rb +29 -0
  23. data/lib/x/errors/unauthorized.rb +5 -0
  24. data/lib/x/errors/unprocessable_entity.rb +5 -0
  25. data/lib/x/{media_upload.rb → media_uploader.rb} +12 -15
  26. data/lib/x/oauth_authenticator.rb +10 -15
  27. data/lib/x/redirect_handler.rb +26 -22
  28. data/lib/x/request_builder.rb +22 -35
  29. data/lib/x/response_parser.rb +92 -0
  30. data/lib/x/version.rb +1 -1
  31. data/sig/x.rbs +101 -87
  32. metadata +21 -13
  33. data/lib/x/errors/authentication_error.rb +0 -5
  34. data/lib/x/errors/payload_too_large_error.rb +0 -5
  35. data/lib/x/errors/service_unavailable_error.rb +0 -5
  36. data/lib/x/errors/too_many_redirects_error.rb +0 -5
  37. data/lib/x/errors/too_many_requests_error.rb +0 -29
  38. data/lib/x/response_handler.rb +0 -63
data/sig/x.rbs CHANGED
@@ -1,13 +1,17 @@
1
1
  module X
2
2
  VERSION: Gem::Version
3
3
 
4
+ class Authenticator
5
+ def header: (Net::HTTPRequest? request) -> Hash[String, String]
6
+ end
7
+
4
8
  class BearerTokenAuthenticator
5
9
  attr_accessor bearer_token: String
6
- def initialize: (String bearer_token) -> void
7
- def header: (Net::HTTPRequest _request) -> String
10
+ def initialize: (bearer_token: String) -> void
11
+ def header: (Net::HTTPRequest? request) -> Hash[String, String]
8
12
  end
9
13
 
10
- class OauthAuthenticator
14
+ class OAuthAuthenticator
11
15
  OAUTH_VERSION: String
12
16
  OAUTH_SIGNATURE_METHOD: String
13
17
  OAUTH_SIGNATURE_ALGORITHM: String
@@ -16,8 +20,8 @@ module X
16
20
  attr_accessor api_key_secret: String
17
21
  attr_accessor access_token: String
18
22
  attr_accessor access_token_secret: String
19
- def initialize: (String api_key, String api_key_secret, String access_token, String access_token_secret) -> void
20
- def header: (Net::HTTPRequest request) -> String
23
+ def initialize: (api_key: String, api_key_secret: String, access_token: String, access_token_secret: String) -> void
24
+ def header: (Net::HTTPRequest request) -> Hash[String, String]
21
25
 
22
26
  private
23
27
  def parse_request: (Net::HTTPRequest request) -> [String, String, Hash[String, String]]
@@ -33,189 +37,194 @@ module X
33
37
  def escape: (String value) -> String
34
38
  end
35
39
 
36
- class Error < StandardError
37
- JSON_CONTENT_TYPE_REGEXP: Regexp
40
+ class ClientError < Error
41
+ end
38
42
 
39
- attr_reader object: untyped
40
- def initialize: (String msg, response: Net::HTTPResponse?) -> void
43
+ class BadGateway < ClientError
44
+ end
41
45
 
42
- private
43
- def json_response?: (Net::HTTPResponse response) -> bool
46
+ class BadRequest < ClientError
44
47
  end
45
48
 
46
- class ClientError < Error
49
+ class ConnectionException < ClientError
47
50
  end
48
51
 
49
- class BadRequestError < ClientError
52
+ class Error < StandardError
53
+ def initialize: (String msg, ?Net::HTTPResponse? response) -> void
54
+ end
55
+
56
+ class Forbidden < ClientError
50
57
  end
51
58
 
52
- class AuthenticationError < ClientError
59
+ class GatewayTimeout < ClientError
53
60
  end
54
61
 
55
- class ForbiddenError < ClientError
62
+ class Gone < ClientError
56
63
  end
57
64
 
58
65
  class InternalServerError < ServerError
59
66
  end
60
67
 
61
- class NotFoundError < ClientError
68
+ class NetworkError < Error
62
69
  end
63
70
 
64
- class PayloadTooLargeError < ClientError
71
+ class NotAcceptable < ClientError
65
72
  end
66
73
 
67
- class TooManyRedirectsError < ClientError
74
+ class NotFound < ClientError
75
+ end
76
+
77
+ class PayloadTooLarge < ClientError
78
+ end
79
+
80
+ class ServerError < Error
68
81
  end
69
82
 
70
- class TooManyRequestsError < ClientError
83
+ class ServiceUnavailable < ServerError
84
+ end
85
+
86
+ class TooManyRedirects < ClientError
87
+ end
88
+
89
+ class TooManyRequests < ClientError
71
90
  @response: Net::HTTPResponse
72
91
 
73
- def initialize: (String msg, response: Net::HTTPResponse) -> void
92
+ def initialize: (String msg, Net::HTTPResponse response) -> void
74
93
  def limit: -> Integer
75
94
  def remaining: -> Integer
76
95
  def reset_at: -> Time
77
96
  def reset_in: -> Integer?
78
97
  end
79
98
 
80
- class ServerError < Error
99
+ class Unauthorized < ClientError
81
100
  end
82
101
 
83
- class ServiceUnavailableError < ServerError
84
- end
85
-
86
- class NetworkError < Error
102
+ class UnprocessableEntity < ClientError
87
103
  end
88
104
 
89
105
  class Connection
90
- DEFAULT_BASE_URL: String
91
106
  DEFAULT_HOST: String
92
107
  DEFAULT_PORT: Integer
93
108
  DEFAULT_OPEN_TIMEOUT: Integer
94
109
  DEFAULT_READ_TIMEOUT: Integer
95
110
  DEFAULT_WRITE_TIMEOUT: Integer
111
+ DEFAULT_DEBUG_OUTPUT: IO
96
112
  NETWORK_ERRORS: Array[(singleton(Errno::ECONNREFUSED) | singleton(Errno::ECONNRESET) | singleton(Net::OpenTimeout) | singleton(Net::ReadTimeout) | singleton(OpenSSL::SSL::SSLError))]
97
113
 
98
114
  extend Forwardable
99
- @http_client: Net::HTTP
100
115
 
101
- attr_reader base_uri: URI::Generic
116
+ attr_accessor open_timeout : Float | Integer
117
+ attr_accessor read_timeout : Float | Integer
118
+ attr_accessor write_timeout : Float | Integer
119
+ attr_accessor debug_output : IO
120
+
102
121
  attr_reader proxy_uri: URI::Generic?
103
- attr_reader open_timeout : Float | Integer
104
- attr_reader read_timeout : Float | Integer
105
- attr_reader write_timeout : Float | Integer
106
- def initialize: (?base_url: URI::Generic | String, ?open_timeout: Float | Integer, ?read_timeout: Float | Integer, ?write_timeout: Float | Integer, ?proxy_url: URI::Generic? | String?, ?debug_output: IO?) -> void
107
- def send_request: (Net::HTTPRequest request) -> Net::HTTPResponse
108
- def base_uri=: (URI::Generic | String base_url) -> void
109
- def debug_output: -> IO?
110
- def configuration: -> Hash[Symbol, untyped]
122
+ attr_reader proxy_host : String?
123
+ attr_reader proxy_port : Integer?
124
+ attr_reader proxy_user : String?
125
+ attr_reader proxy_pass : String?
126
+
127
+ def initialize: (?open_timeout: Float | Integer, ?read_timeout: Float | Integer, ?write_timeout: Float | Integer, ?proxy_url: URI::Generic? | String?, ?debug_output: IO) -> void
128
+ def proxy_url=: (URI::Generic | String proxy_url) -> void
129
+ def perform: (request: Net::HTTPRequest) -> Net::HTTPResponse
111
130
 
112
131
  private
113
- def apply_http_client_settings: (open_timeout: Float | Integer, read_timeout: Float | Integer, write_timeout: Float | Integer, debug_output: IO?) -> untyped
114
- def current_http_client_settings: -> {open_timeout: Float | Integer, read_timeout: Float | Integer, write_timeout: Float | Integer, debug_output: IO?}
115
- def update_http_client_settings: -> untyped
116
- def build_http_client: (host: String, port: Integer) -> (Net::HTTP)
117
- def conditionally_apply_http_client_settings: { -> untyped } -> untyped
132
+ def build_http_client: (?String host, ?Integer port) -> Net::HTTP
133
+ def configure_http_client: (Net::HTTP http_client) -> Net::HTTP
118
134
  end
119
135
 
120
136
  class RequestBuilder
121
- HTTP_METHODS: Hash[::Symbol, (singleton(::Net::HTTP::Get) | singleton(::Net::HTTP::Post) | singleton(::Net::HTTP::Put) | singleton(::Net::HTTP::Delete))]
122
- DEFAULT_CONTENT_TYPE: String
123
- DEFAULT_USER_AGENT: String
124
- AUTHORIZATION_HEADER: String
125
- CONTENT_TYPE_HEADER: String
126
- USER_AGENT_HEADER: String
127
-
128
- attr_accessor content_type: String
129
- attr_accessor user_agent: String
137
+ HTTP_METHODS: Hash[Symbol, (singleton(Net::HTTP::Get) | singleton(Net::HTTP::Post) | singleton(Net::HTTP::Put) | singleton(Net::HTTP::Delete))]
138
+ DEFAULT_HEADERS: Hash[String, String]
139
+
130
140
  def initialize: (?content_type: String, ?user_agent: String) -> void
131
- def build: (BearerTokenAuthenticator | OauthAuthenticator authenticator, Symbol http_method, URI::Generic uri, ?body: String?) -> (Net::HTTPRequest)
132
- def configuration: -> Hash[Symbol, untyped]
141
+ def build: (authenticator: Authenticator, http_method: Symbol, uri: URI::Generic, ?body: String?, ?headers: Hash[String, String]) -> (Net::HTTPRequest)
133
142
 
134
143
  private
135
- def create_request: (Symbol http_method, URI::Generic uri, String? body) -> (Net::HTTPRequest)
136
- def add_authorization: (Net::HTTPRequest request, BearerTokenAuthenticator | OauthAuthenticator authenticator) -> void
137
- def add_content_type: (Net::HTTPRequest request) -> void
138
- def add_user_agent: (Net::HTTPRequest request) -> void
144
+ def create_request: (http_method: Symbol, uri: URI::Generic, body: String?) -> (Net::HTTPRequest)
145
+ def add_authentication: (request: Net::HTTPRequest, authenticator: Authenticator) -> void
146
+ def add_headers: (request: Net::HTTPRequest, headers: Hash[String, String]) -> void
139
147
  def escape_query_params: (URI::Generic uri) -> URI::Generic
140
148
  end
141
149
 
142
150
  class RedirectHandler
143
151
  DEFAULT_MAX_REDIRECTS: Integer
144
152
 
145
- attr_reader authenticator: BearerTokenAuthenticator | OauthAuthenticator
153
+ attr_reader authenticator: Authenticator
146
154
  attr_reader connection: Connection
147
155
  attr_reader request_builder: RequestBuilder
148
156
  attr_reader max_redirects: Integer
149
- def initialize: (BearerTokenAuthenticator | OauthAuthenticator authenticator, Connection connection, RequestBuilder request_builder, ?max_redirects: Integer) -> void
150
- def handle_redirects: (Net::HTTPResponse response, Net::HTTPRequest original_request, URI::Generic | String original_base_url, ?Integer redirect_count) -> Net::HTTPResponse
157
+ def initialize: (authenticator: Authenticator, connection: Connection, request_builder: RequestBuilder, ?max_redirects: Integer) -> void
158
+ def handle: (response: Net::HTTPResponse, request: Net::HTTPRequest, base_url: String, ?redirect_count: Integer) -> Net::HTTPResponse
151
159
 
152
160
  private
153
- def build_new_uri: (Net::HTTPResponse response, URI::Generic | String original_base_url) -> URI::Generic
154
- def build_request: (Net::HTTPRequest original_request, URI::Generic new_uri) -> Net::HTTPRequest
161
+ def build_new_uri: (Net::HTTPResponse response, String base_url) -> URI::Generic
162
+ def build_request: (Net::HTTPRequest request, URI::Generic new_uri, Integer response_code) -> Net::HTTPRequest
155
163
  def send_new_request: (URI::Generic new_uri, Net::HTTPRequest new_request) -> Net::HTTPResponse
156
164
  end
157
165
 
158
- class ResponseHandler
166
+ class ResponseParser
159
167
  DEFAULT_ARRAY_CLASS: Class
160
168
  DEFAULT_OBJECT_CLASS: Class
161
- ERROR_CLASSES: Hash[Integer, singleton(AuthenticationError) | singleton(BadRequestError) | singleton(ForbiddenError) | singleton(InternalServerError) | singleton(NotFoundError) | singleton(PayloadTooLargeError) | singleton(ServiceUnavailableError) | singleton(TooManyRequestsError)]
169
+ ERROR_CLASSES: Hash[Integer, singleton(Unauthorized) | singleton(BadRequest) | singleton(Forbidden) | singleton(InternalServerError) | singleton(NotFound) | singleton(PayloadTooLarge) | singleton(ServiceUnavailable) | singleton(TooManyRequests)]
162
170
  JSON_CONTENT_TYPE_REGEXP: Regexp
163
171
 
164
172
  attr_accessor array_class: Class
165
173
  attr_accessor object_class: Class
166
174
  def initialize: (?array_class: Class, ?object_class: Class) -> void
167
- def handle: (Net::HTTPResponse response) -> untyped
168
- def configuration: -> Hash[Symbol, Class]
175
+ def parse: (response: Net::HTTPResponse) -> untyped
169
176
 
170
177
  private
171
178
  def success?: (Net::HTTPResponse response) -> bool
179
+ def error: (Net::HTTPResponse response) -> (Unauthorized | BadRequest | Forbidden | InternalServerError | NotFound | PayloadTooLarge | ServiceUnavailable | TooManyRequests)
180
+ def error_class: (Net::HTTPResponse response) -> (singleton(Unauthorized) | singleton(BadRequest) | singleton(Forbidden) | singleton(InternalServerError) | singleton(NotFound) | singleton(PayloadTooLarge) | singleton(ServiceUnavailable) | singleton(TooManyRequests))
181
+ def error_message: (Net::HTTPResponse response) -> String
182
+ def message_from_json_response: (Net::HTTPResponse response) -> String
172
183
  def json?: (Net::HTTPResponse response) -> bool
173
184
  end
174
185
 
175
186
  class Client
187
+ DEFAULT_BASE_URL: String
188
+
176
189
  extend Forwardable
177
- @authenticator: BearerTokenAuthenticator | OauthAuthenticator
190
+ @authenticator: Authenticator
178
191
  @connection: Connection
179
192
  @request_builder: RequestBuilder
180
193
  @redirect_handler: RedirectHandler
181
- @response_handler: ResponseHandler
194
+ @response_parser: ResponseParser
182
195
 
183
196
  attr_accessor access_token: String
184
197
  attr_accessor access_token_secret: String
185
198
  attr_accessor api_key: String
186
199
  attr_accessor api_key_secret: String
187
200
  attr_accessor bearer_token: String
188
- attr_accessor base_uri: URI::Generic | String
201
+ attr_accessor base_url: String
189
202
  attr_accessor open_timeout: Float | Integer
190
203
  attr_accessor read_timeout: Float | Integer
191
204
  attr_accessor write_timeout: Float | Integer
192
205
  attr_accessor proxy_url: String
193
- attr_accessor content_type: String
194
- attr_accessor user_agent: String
195
- attr_accessor debug_output: IO?
206
+ attr_accessor debug_output: IO
196
207
  attr_accessor array_class: Class
197
208
  attr_accessor object_class: Class
198
209
  attr_accessor max_redirects: Integer
199
- attr_accessor authenticator: BearerTokenAuthenticator | OauthAuthenticator
210
+ attr_accessor authenticator: Authenticator
200
211
  attr_accessor connection: Connection
201
212
  attr_accessor request_builder: RequestBuilder
202
213
  attr_accessor redirect_handler: RedirectHandler
203
- attr_accessor response_handler: ResponseHandler
204
- alias base_url base_uri
205
-
214
+ attr_accessor response_parser: ResponseParser
206
215
 
207
- def initialize: (?bearer_token: String?, ?api_key: String?, ?api_key_secret: String?, ?access_token: String?, ?access_token_secret: String?, ?base_url: URI::Generic | String, ?content_type: String, ?user_agent: String, ?open_timeout: Float | Integer, ?read_timeout: Float | Integer, ?write_timeout: Float | Integer, ?proxy_url: URI::Generic? | String?, ?debug_output: IO?, ?array_class: Class, ?object_class: Class, ?max_redirects: Integer) -> void
208
- def get: (String endpoint) -> untyped
209
- def post: (String endpoint, ?String? body) -> untyped
210
- def put: (String endpoint, ?String? body) -> untyped
211
- def delete: (String endpoint) -> untyped
216
+ def initialize: (?bearer_token: String?, ?api_key: String?, ?api_key_secret: String?, ?access_token: String?, ?access_token_secret: String?, ?base_url: String, ?open_timeout: Float | Integer, ?read_timeout: Float | Integer, ?write_timeout: Float | Integer, ?proxy_url: URI::Generic? | String?, ?debug_output: IO, ?array_class: Class, ?object_class: Class, ?max_redirects: Integer) -> void
217
+ def get: (String endpoint, ?headers: Hash[String, String]) -> untyped
218
+ def post: (String endpoint, ?String? body, ?headers: Hash[String, String]) -> untyped
219
+ def put: (String endpoint, ?String? body, ?headers: Hash[String, String]) -> untyped
220
+ def delete: (String endpoint, ?headers: Hash[String, String]) -> untyped
212
221
 
213
222
  private
214
- def initialize_authenticator: (String? bearer_token, String? api_key, String? api_key_secret, String? access_token, String? access_token_secret) -> (BearerTokenAuthenticator | OauthAuthenticator)
215
- def send_request: (Symbol http_method, String endpoint, ?String? body) -> untyped
223
+ def initialize_authenticator: (String? bearer_token, String? api_key, String? api_key_secret, String? access_token, String? access_token_secret) -> (BearerTokenAuthenticator | OAuthAuthenticator | Authenticator)
224
+ def execute_request: (Symbol http_method, String endpoint, headers: Hash[String, String], ?body: String?) -> untyped
216
225
  end
217
226
 
218
- module MediaUpload
227
+ module MediaUploader
219
228
  MAX_RETRIES: Integer
220
229
  BYTES_PER_MB: Integer
221
230
  MEDIA_CATEGORIES: Array[String]
@@ -235,10 +244,10 @@ module X
235
244
  SUBRIP_MIME_TYPE: String
236
245
  WEBP_MIME_TYPE: String
237
246
  MIME_TYPE_MAP: Hash[String, String]
238
- extend MediaUpload
247
+ extend MediaUploader
239
248
 
240
- def media_upload: (client: Client, file_path: String, media_category: String, ?media_type: String, ?boundary: String) -> untyped
241
- def chunked_media_upload: (client: Client, file_path: String, media_category: String, ?media_type: String, ?boundary: String, ?chunk_size_mb: Integer) -> untyped
249
+ def upload: (client: Client, file_path: String, media_category: String, ?media_type: String, ?boundary: String) -> untyped
250
+ def chunked_upload: (client: Client, file_path: String, media_category: String, ?media_type: String, ?boundary: String, ?chunk_size_mb: Integer) -> untyped
242
251
  def await_processing: (client: Client, media: untyped) -> untyped
243
252
 
244
253
  private
@@ -247,11 +256,16 @@ module X
247
256
  def init: (Client upload_client, String file_path, String media_type, String media_category) -> untyped
248
257
  def split: (String file_path, Integer chunk_size) -> Array[String]
249
258
  def append: (Client upload_client, Array[String] chunk_paths, untyped media, String media_type, ?String boundary) -> Array[String]
250
- def upload_chunk: (Client upload_client, String query, String chunk_path, String media_type, String boundary) -> Integer?
259
+ def upload_chunk: (Client upload_client, String query, String chunk_path, String media_type, ?Hash[String, String] headers) -> Integer?
251
260
  def cleanup_chunk: (String chunk_path) -> Integer?
252
261
  def finalize: (Client upload_client, untyped media) -> untyped
253
262
  def construct_upload_body: (String file_path, String media_type, ?String boundary) -> String
254
263
  end
264
+
265
+ class CGI
266
+ def self.escape: (String value) -> String
267
+ def self.escape_params: (Hash[String, String] | Array[[String, String]] params) -> String
268
+ end
255
269
  end
256
270
 
257
271
  class Dir
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: x
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.0
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Erik Berlin
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-10-08 00:00:00.000000000 Z
11
+ date: 2023-10-24 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
@@ -23,27 +23,35 @@ files:
23
23
  - bin/console
24
24
  - bin/setup
25
25
  - lib/x.rb
26
+ - lib/x/authenticator.rb
26
27
  - lib/x/bearer_token_authenticator.rb
28
+ - lib/x/cgi.rb
27
29
  - lib/x/client.rb
28
30
  - lib/x/connection.rb
29
- - lib/x/errors/authentication_error.rb
30
- - lib/x/errors/bad_request_error.rb
31
+ - lib/x/errors/bad_gateway.rb
32
+ - lib/x/errors/bad_request.rb
31
33
  - lib/x/errors/client_error.rb
34
+ - lib/x/errors/connection_exception.rb
32
35
  - lib/x/errors/error.rb
33
- - lib/x/errors/forbidden_error.rb
36
+ - lib/x/errors/forbidden.rb
37
+ - lib/x/errors/gateway_timeout.rb
38
+ - lib/x/errors/gone.rb
34
39
  - lib/x/errors/internal_server_error.rb
35
40
  - lib/x/errors/network_error.rb
36
- - lib/x/errors/not_found_error.rb
37
- - lib/x/errors/payload_too_large_error.rb
41
+ - lib/x/errors/not_acceptable.rb
42
+ - lib/x/errors/not_found.rb
43
+ - lib/x/errors/payload_too_large.rb
38
44
  - lib/x/errors/server_error.rb
39
- - lib/x/errors/service_unavailable_error.rb
40
- - lib/x/errors/too_many_redirects_error.rb
41
- - lib/x/errors/too_many_requests_error.rb
42
- - lib/x/media_upload.rb
45
+ - lib/x/errors/service_unavailable.rb
46
+ - lib/x/errors/too_many_redirects.rb
47
+ - lib/x/errors/too_many_requests.rb
48
+ - lib/x/errors/unauthorized.rb
49
+ - lib/x/errors/unprocessable_entity.rb
50
+ - lib/x/media_uploader.rb
43
51
  - lib/x/oauth_authenticator.rb
44
52
  - lib/x/redirect_handler.rb
45
53
  - lib/x/request_builder.rb
46
- - lib/x/response_handler.rb
54
+ - lib/x/response_parser.rb
47
55
  - lib/x/version.rb
48
56
  - sig/x.rbs
49
57
  homepage: https://sferik.github.io/x-ruby
@@ -72,7 +80,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
72
80
  - !ruby/object:Gem::Version
73
81
  version: '0'
74
82
  requirements: []
75
- rubygems_version: 3.4.20
83
+ rubygems_version: 3.4.21
76
84
  signing_key:
77
85
  specification_version: 4
78
86
  summary: A Ruby interface to the X API.
@@ -1,5 +0,0 @@
1
- require_relative "client_error"
2
-
3
- module X
4
- class AuthenticationError < ClientError; end
5
- end
@@ -1,5 +0,0 @@
1
- require_relative "client_error"
2
-
3
- module X
4
- class PayloadTooLargeError < ClientError; end
5
- end
@@ -1,5 +0,0 @@
1
- require_relative "server_error"
2
-
3
- module X
4
- class ServiceUnavailableError < ServerError; end
5
- end
@@ -1,5 +0,0 @@
1
- require_relative "client_error"
2
-
3
- module X
4
- class TooManyRedirectsError < ClientError; end
5
- end
@@ -1,29 +0,0 @@
1
- require_relative "client_error"
2
-
3
- module X
4
- # Rate limit error
5
- class TooManyRequestsError < ClientError
6
- def initialize(msg, response:)
7
- @response = response
8
- super
9
- end
10
-
11
- def limit
12
- @response.fetch("x-rate-limit-limit", 0).to_i
13
- end
14
-
15
- def remaining
16
- @response.fetch("x-rate-limit-remaining", 0).to_i
17
- end
18
-
19
- def reset_at
20
- Time.at(@response.fetch("x-rate-limit-reset", 0).to_i).utc
21
- end
22
-
23
- def reset_in
24
- [(reset_at - Time.now).ceil, 0].max if reset_at
25
- end
26
-
27
- alias_method :retry_after, :reset_in
28
- end
29
- end
@@ -1,63 +0,0 @@
1
- require "json"
2
- require "net/http"
3
- require_relative "errors/authentication_error"
4
- require_relative "errors/bad_request_error"
5
- require_relative "errors/forbidden_error"
6
- require_relative "errors/not_found_error"
7
- require_relative "errors/payload_too_large_error"
8
- require_relative "errors/internal_server_error"
9
- require_relative "errors/service_unavailable_error"
10
- require_relative "errors/too_many_requests_error"
11
-
12
- module X
13
- # Process HTTP responses
14
- class ResponseHandler
15
- DEFAULT_ARRAY_CLASS = Array
16
- DEFAULT_OBJECT_CLASS = Hash
17
- ERROR_CLASSES = {
18
- 400 => BadRequestError,
19
- 401 => AuthenticationError,
20
- 403 => ForbiddenError,
21
- 404 => NotFoundError,
22
- 413 => PayloadTooLargeError,
23
- 429 => TooManyRequestsError,
24
- 500 => InternalServerError,
25
- 503 => ServiceUnavailableError
26
- }.freeze
27
- JSON_CONTENT_TYPE_REGEXP = %r{application/(problem\+|)json}
28
-
29
- attr_accessor :array_class, :object_class
30
-
31
- def initialize(array_class: DEFAULT_ARRAY_CLASS, object_class: DEFAULT_OBJECT_CLASS)
32
- @array_class = array_class
33
- @object_class = object_class
34
- end
35
-
36
- def handle(response)
37
- if success?(response)
38
- JSON.parse(response.body, array_class: array_class, object_class: object_class) if json?(response)
39
- else
40
- error_class = ERROR_CLASSES[response.code.to_i] || Error
41
- error_message = "#{response.code} #{response.message}"
42
- raise error_class.new(error_message, response: response)
43
- end
44
- end
45
-
46
- def configuration
47
- {
48
- array_class: array_class,
49
- object_class: object_class
50
- }
51
- end
52
-
53
- private
54
-
55
- def success?(response)
56
- response.is_a?(Net::HTTPSuccess)
57
- end
58
-
59
- def json?(response)
60
- response.body && JSON_CONTENT_TYPE_REGEXP.match?(response["content-type"])
61
- end
62
- end
63
- end