x 0.13.0 → 0.14.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -0
- data/README.md +19 -9
- data/lib/x/client.rb +27 -19
- data/lib/x/response_parser.rb +1 -8
- data/lib/x/version.rb +1 -1
- data/sig/x.rbs +13 -15
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e7f8185b86c61142faad23edbd1563f5a10263d7f47114d5f31a83e93af805dd
|
4
|
+
data.tar.gz: 8df083a42c16683e27d4face3445e3a835663f11600751024a519c3a658ed0ed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 17dda35c335587d569dc1d41c8fe3ca2221e8e1d3b1742a443559c7d558b149e92229d7d767e64bf4a12982f4a3b4d2afb002d9d34db819216e1934eaf48391f
|
7
|
+
data.tar.gz: 990d9afb8e30cb0c998765525b47c4bf44779f96f4fbd006903fc9b3fe655d0f50df8aa197c77d9ad05250ded0fc086bb768d4662d539490ab81804d2e86b5f0
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
[![Tests](https://github.com/sferik/x-ruby/actions/workflows/test.yml/badge.svg)](https://github.com/sferik/x-ruby/actions/workflows/test.yml)
|
2
|
-
[![
|
2
|
+
[![Linter](https://github.com/sferik/x-ruby/actions/workflows/lint.yml/badge.svg)](https://github.com/sferik/x-ruby/actions/workflows/lint.yml)
|
3
3
|
[![Mutant](https://github.com/sferik/x-ruby/actions/workflows/mutant.yml/badge.svg)](https://github.com/sferik/x-ruby/actions/workflows/mutant.yml)
|
4
4
|
[![Typer Checker](https://github.com/sferik/x-ruby/actions/workflows/steep.yml/badge.svg)](https://github.com/sferik/x-ruby/actions/workflows/steep.yml)
|
5
5
|
[![Gem Version](https://badge.fury.io/rb/x.svg)](https://rubygems.org/gems/x)
|
@@ -52,8 +52,15 @@ x_client.delete("tweets/#{post["data"]["id"]}")
|
|
52
52
|
# Initialize an API v1.1 client
|
53
53
|
v1_client = X::Client.new(base_url: "https://api.twitter.com/1.1/", **x_credentials)
|
54
54
|
|
55
|
-
#
|
56
|
-
|
55
|
+
# Define a custom response object
|
56
|
+
Language = Struct.new(:code, :name, :local_name, :status, :debug)
|
57
|
+
|
58
|
+
# Parse a response with custom array and object classes
|
59
|
+
languages = v1_client.get("help/languages.json", object_class: Language, array_class: Set)
|
60
|
+
# #<Set: {#<struct Language code="ur", name="Urdu", local_name="اردو", status="beta", debug=false>, …
|
61
|
+
|
62
|
+
# Access data with dots instead of brackets
|
63
|
+
languages.first.local_name
|
57
64
|
|
58
65
|
# Initialize an Ads API client
|
59
66
|
ads_client = X::Client.new(base_url: "https://ads-api.twitter.com/12/", **x_credentials)
|
@@ -149,20 +156,23 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/sferik
|
|
149
156
|
|
150
157
|
Pull requests will only be accepted if they meet all the following criteria:
|
151
158
|
|
152
|
-
1. Code must conform to [
|
159
|
+
1. Code must conform to [Standard Ruby](https://github.com/standardrb/standard#readme). This can be verified with:
|
160
|
+
|
161
|
+
bundle exec rake standard
|
162
|
+
|
163
|
+
2. Code must conform to the [RuboCop rules](https://github.com/rubocop/rubocop#readme). This can be verified with:
|
153
164
|
|
154
|
-
bundle exec rubocop
|
165
|
+
bundle exec rake rubocop
|
155
166
|
|
156
|
-
|
167
|
+
3. 100% C0 code coverage. This can be verified with:
|
157
168
|
|
158
169
|
bundle exec rake test
|
159
170
|
|
160
|
-
|
171
|
+
4. 100% mutation coverage. This can be verified with:
|
161
172
|
|
162
|
-
git remote add upstream https://github.com/sferik/x-ruby
|
163
173
|
bundle exec rake mutant
|
164
174
|
|
165
|
-
|
175
|
+
5. RBS type signatures (in `sig/x.rbs`). This can be verified with:
|
166
176
|
|
167
177
|
bundle exec rake steep
|
168
178
|
|
data/lib/x/client.rb
CHANGED
@@ -11,16 +11,16 @@ module X
|
|
11
11
|
extend Forwardable
|
12
12
|
|
13
13
|
DEFAULT_BASE_URL = "https://api.twitter.com/2/".freeze
|
14
|
+
DEFAULT_ARRAY_CLASS = Array
|
15
|
+
DEFAULT_OBJECT_CLASS = Hash
|
14
16
|
|
15
|
-
attr_accessor :base_url
|
17
|
+
attr_accessor :base_url, :default_array_class, :default_object_class
|
16
18
|
attr_reader :api_key, :api_key_secret, :access_token, :access_token_secret, :bearer_token
|
17
19
|
|
18
20
|
def_delegators :@connection, :open_timeout, :read_timeout, :write_timeout, :proxy_url, :debug_output
|
19
21
|
def_delegators :@connection, :open_timeout=, :read_timeout=, :write_timeout=, :proxy_url=, :debug_output=
|
20
22
|
def_delegators :@redirect_handler, :max_redirects
|
21
23
|
def_delegators :@redirect_handler, :max_redirects=
|
22
|
-
def_delegators :@response_parser, :array_class, :object_class
|
23
|
-
def_delegators :@response_parser, :array_class=, :object_class=
|
24
24
|
|
25
25
|
def initialize(api_key: nil, api_key_secret: nil, access_token: nil, access_token_secret: nil,
|
26
26
|
bearer_token: nil,
|
@@ -30,36 +30,38 @@ module X
|
|
30
30
|
write_timeout: Connection::DEFAULT_WRITE_TIMEOUT,
|
31
31
|
debug_output: Connection::DEFAULT_DEBUG_OUTPUT,
|
32
32
|
proxy_url: nil,
|
33
|
-
|
34
|
-
|
33
|
+
default_array_class: DEFAULT_ARRAY_CLASS,
|
34
|
+
default_object_class: DEFAULT_OBJECT_CLASS,
|
35
35
|
max_redirects: RedirectHandler::DEFAULT_MAX_REDIRECTS)
|
36
36
|
|
37
|
-
initialize_oauth(api_key, api_key_secret, access_token, access_token_secret)
|
38
|
-
@bearer_token = bearer_token
|
37
|
+
initialize_oauth(api_key, api_key_secret, access_token, access_token_secret, bearer_token)
|
39
38
|
initialize_authenticator
|
40
39
|
@base_url = base_url
|
40
|
+
initialize_default_classes(default_array_class, default_object_class)
|
41
41
|
@connection = Connection.new(open_timeout: open_timeout, read_timeout: read_timeout,
|
42
42
|
write_timeout: write_timeout, debug_output: debug_output, proxy_url: proxy_url)
|
43
43
|
@request_builder = RequestBuilder.new
|
44
44
|
@redirect_handler = RedirectHandler.new(connection: @connection, request_builder: @request_builder,
|
45
45
|
max_redirects: max_redirects)
|
46
|
-
@response_parser = ResponseParser.new
|
46
|
+
@response_parser = ResponseParser.new
|
47
47
|
end
|
48
48
|
|
49
|
-
def get(endpoint, headers: {})
|
50
|
-
execute_request(:get, endpoint, headers: headers)
|
49
|
+
def get(endpoint, headers: {}, array_class: default_array_class, object_class: default_object_class)
|
50
|
+
execute_request(:get, endpoint, headers: headers, array_class: array_class, object_class: object_class)
|
51
51
|
end
|
52
52
|
|
53
|
-
def post(endpoint, body = nil, headers: {})
|
54
|
-
execute_request(:post, endpoint, body: body, headers: headers
|
53
|
+
def post(endpoint, body = nil, headers: {}, array_class: default_array_class, object_class: default_object_class)
|
54
|
+
execute_request(:post, endpoint, body: body, headers: headers, array_class: array_class,
|
55
|
+
object_class: object_class)
|
55
56
|
end
|
56
57
|
|
57
|
-
def put(endpoint, body = nil, headers: {})
|
58
|
-
execute_request(:put, endpoint, body: body, headers: headers
|
58
|
+
def put(endpoint, body = nil, headers: {}, array_class: default_array_class, object_class: default_object_class)
|
59
|
+
execute_request(:put, endpoint, body: body, headers: headers, array_class: array_class,
|
60
|
+
object_class: object_class)
|
59
61
|
end
|
60
62
|
|
61
|
-
def delete(endpoint, headers: {})
|
62
|
-
execute_request(:delete, endpoint, headers: headers)
|
63
|
+
def delete(endpoint, headers: {}, array_class: default_array_class, object_class: default_object_class)
|
64
|
+
execute_request(:delete, endpoint, headers: headers, array_class: array_class, object_class: object_class)
|
63
65
|
end
|
64
66
|
|
65
67
|
def api_key=(api_key)
|
@@ -89,11 +91,17 @@ module X
|
|
89
91
|
|
90
92
|
private
|
91
93
|
|
92
|
-
def initialize_oauth(api_key, api_key_secret, access_token, access_token_secret)
|
94
|
+
def initialize_oauth(api_key, api_key_secret, access_token, access_token_secret, bearer_token)
|
93
95
|
@api_key = api_key
|
94
96
|
@api_key_secret = api_key_secret
|
95
97
|
@access_token = access_token
|
96
98
|
@access_token_secret = access_token_secret
|
99
|
+
@bearer_token = bearer_token
|
100
|
+
end
|
101
|
+
|
102
|
+
def initialize_default_classes(default_array_class, default_object_class)
|
103
|
+
@default_array_class = default_array_class
|
104
|
+
@default_object_class = default_object_class
|
97
105
|
end
|
98
106
|
|
99
107
|
def initialize_authenticator
|
@@ -109,14 +117,14 @@ module X
|
|
109
117
|
end
|
110
118
|
end
|
111
119
|
|
112
|
-
def execute_request(http_method, endpoint, headers
|
120
|
+
def execute_request(http_method, endpoint, body: nil, headers: {}, array_class: default_array_class, object_class: default_object_class)
|
113
121
|
uri = URI.join(base_url, endpoint)
|
114
122
|
request = @request_builder.build(http_method: http_method, uri: uri, body: body, headers: headers,
|
115
123
|
authenticator: @authenticator)
|
116
124
|
response = @connection.perform(request: request)
|
117
125
|
response = @redirect_handler.handle(response: response, request: request, base_url: base_url,
|
118
126
|
authenticator: @authenticator)
|
119
|
-
@response_parser.parse(response: response)
|
127
|
+
@response_parser.parse(response: response, array_class: array_class, object_class: object_class)
|
120
128
|
end
|
121
129
|
end
|
122
130
|
end
|
data/lib/x/response_parser.rb
CHANGED
@@ -36,14 +36,7 @@ module X
|
|
36
36
|
}.freeze
|
37
37
|
JSON_CONTENT_TYPE_REGEXP = %r{application/json}
|
38
38
|
|
39
|
-
|
40
|
-
|
41
|
-
def initialize(array_class: nil, object_class: nil)
|
42
|
-
@array_class = array_class
|
43
|
-
@object_class = object_class
|
44
|
-
end
|
45
|
-
|
46
|
-
def parse(response:)
|
39
|
+
def parse(response:, array_class: nil, object_class: nil)
|
47
40
|
raise error(response) unless response.is_a?(Net::HTTPSuccess)
|
48
41
|
|
49
42
|
return unless json?(response)
|
data/lib/x/version.rb
CHANGED
data/sig/x.rbs
CHANGED
@@ -193,15 +193,10 @@ module X
|
|
193
193
|
end
|
194
194
|
|
195
195
|
class ResponseParser
|
196
|
-
DEFAULT_ARRAY_CLASS: Class
|
197
|
-
DEFAULT_OBJECT_CLASS: Class
|
198
196
|
ERROR_MAP: Hash[Integer, singleton(Unauthorized) | singleton(BadRequest) | singleton(Forbidden) | singleton(InternalServerError) | singleton(NotFound) | singleton(PayloadTooLarge) | singleton(ServiceUnavailable) | singleton(TooManyRequests)]
|
199
197
|
JSON_CONTENT_TYPE_REGEXP: Regexp
|
200
198
|
|
201
|
-
|
202
|
-
attr_accessor object_class: Class
|
203
|
-
def initialize: (?array_class: Class, ?object_class: Class) -> void
|
204
|
-
def parse: (response: Net::HTTPResponse) -> untyped
|
199
|
+
def parse: (response: Net::HTTPResponse, ?array_class: Class?, ?object_class: Class?) -> untyped
|
205
200
|
|
206
201
|
private
|
207
202
|
def error: (Net::HTTPResponse response) -> (Unauthorized | BadRequest | Forbidden | InternalServerError | NotFound | PayloadTooLarge | ServiceUnavailable | TooManyRequests)
|
@@ -211,6 +206,8 @@ module X
|
|
211
206
|
|
212
207
|
class Client
|
213
208
|
DEFAULT_BASE_URL: String
|
209
|
+
DEFAULT_ARRAY_CLASS: Class
|
210
|
+
DEFAULT_OBJECT_CLASS: Class
|
214
211
|
|
215
212
|
extend Forwardable
|
216
213
|
@authenticator: Authenticator
|
@@ -230,8 +227,8 @@ module X
|
|
230
227
|
attr_accessor write_timeout: Float | Integer
|
231
228
|
attr_accessor proxy_url: String
|
232
229
|
attr_accessor debug_output: IO
|
233
|
-
attr_accessor
|
234
|
-
attr_accessor
|
230
|
+
attr_accessor default_array_class: Class
|
231
|
+
attr_accessor default_object_class: Class
|
235
232
|
attr_accessor max_redirects: Integer
|
236
233
|
attr_accessor authenticator: Authenticator
|
237
234
|
attr_accessor connection: Connection
|
@@ -239,16 +236,17 @@ module X
|
|
239
236
|
attr_accessor redirect_handler: RedirectHandler
|
240
237
|
attr_accessor response_parser: ResponseParser
|
241
238
|
|
242
|
-
def initialize: (?api_key: String?, ?api_key_secret: String?, ?access_token: String?, ?access_token_secret: String?, ?bearer_token: String?, ?base_url: String, ?open_timeout: Float | Integer, ?read_timeout: Float | Integer, ?write_timeout: Float | Integer, ?proxy_url: URI::Generic? | String?, ?debug_output: IO, ?
|
243
|
-
def get: (String endpoint, ?headers: Hash[String, String]) -> untyped
|
244
|
-
def post: (String endpoint, ?String? body, ?headers: Hash[String, String]) -> untyped
|
245
|
-
def put: (String endpoint, ?String? body, ?headers: Hash[String, String]) -> untyped
|
246
|
-
def delete: (String endpoint, ?headers: Hash[String, String]) -> untyped
|
239
|
+
def initialize: (?api_key: String?, ?api_key_secret: String?, ?access_token: String?, ?access_token_secret: String?, ?bearer_token: String?, ?base_url: String, ?open_timeout: Float | Integer, ?read_timeout: Float | Integer, ?write_timeout: Float | Integer, ?proxy_url: URI::Generic? | String?, ?debug_output: IO, ?default_array_class: Class, ?default_object_class: Class, ?max_redirects: Integer) -> void
|
240
|
+
def get: (String endpoint, ?headers: Hash[String, String], ?array_class: Class, ?object_class: Class) -> untyped
|
241
|
+
def post: (String endpoint, ?String? body, ?headers: Hash[String, String], ?array_class: Class, ?object_class: Class) -> untyped
|
242
|
+
def put: (String endpoint, ?String? body, ?headers: Hash[String, String], ?array_class: Class, ?object_class: Class) -> untyped
|
243
|
+
def delete: (String endpoint, ?headers: Hash[String, String], ?array_class: Class, ?object_class: Class) -> untyped
|
247
244
|
|
248
245
|
private
|
249
|
-
def initialize_oauth: (String? api_key, String? api_key_secret, String? access_token, String? access_token_secret) -> void
|
246
|
+
def initialize_oauth: (String? api_key, String? api_key_secret, String? access_token, String? access_token_secret, String? bearer_token) -> void
|
247
|
+
def initialize_default_classes: (Class? default_array_class, Class? default_object_class) -> void
|
250
248
|
def initialize_authenticator: -> Authenticator
|
251
|
-
def execute_request: (Symbol http_method, String endpoint, headers: Hash[String, String], ?
|
249
|
+
def execute_request: (Symbol http_method, String endpoint, ?body: String?, ?headers: Hash[String, String], ?array_class: Class?, ?object_class: Class?) -> untyped
|
252
250
|
end
|
253
251
|
|
254
252
|
module MediaUploader
|
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.
|
4
|
+
version: 0.14.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-12-
|
11
|
+
date: 2023-12-08 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|