x 0.12.0 → 0.12.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5c6252a6765246fe6ca0820e5ce96f9e66d9611e91b2d59753730fad6b87f67e
4
- data.tar.gz: 7a7dc55ece60d848cde08c151e887a1cc86808408a864c05934c4be906b2021a
3
+ metadata.gz: 553e0e0e9a87126211bf62942b02cb2c7c8b6d9380ee8fd4336058038c9735b0
4
+ data.tar.gz: 34922d1e52a0c04de3c6fe090e854174d78d437c8e14b061a95ca4ab5e1a0438
5
5
  SHA512:
6
- metadata.gz: 4216ad5a466dd1a714a638a45d9c0996f40c16247f7fc6eb0ff756d301c3cd63aac5ca95fd421940634e3661db5cb41e19300b73f8ef01056c14e21ad89edea1
7
- data.tar.gz: a27036e7dd594f9b13b5cd66267c57b63679352ea3eeeaada13adbba838c6cdad5d8f841fe35b808950fc610808c219679e72334091b3d8de1dca5899ba386b5
6
+ metadata.gz: e28c53b17bb053c26326d46940eb539c4612d6f4a547b074e974c2b6ddee616bb37af6c2dd2d4d84b05a21aa2946306de074889b90bd411b2a268793e40d72a0
7
+ data.tar.gz: 79ab655009e07915cf71158bb2976301d1519093c753b6f8fc1d128781b4844e867551c3d430bb0226aa113d3c7342efdd401e08d4f3d920a7437dfa8c432ba6
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## [0.12.1] - 2023-11-28
2
+ * Ensure split chunks are written as binary (c6e257f)
3
+ * Require tmpdir in X::MediaUploader (9e7c7f1)
4
+
1
5
  ## [0.12.0] - 2023-11-02
2
6
  * Ensure Authenticator is passed to RedirectHandler (fc8557b)
3
7
  * Add AUTHENTICATION_HEADER to X::Authenticator base class (85a2818)
data/README.md CHANGED
@@ -41,24 +41,24 @@ x_client = X::Client.new(**x_credentials)
41
41
  x_client.get("users/me")
42
42
  # {"data"=>{"id"=>"7505382", "name"=>"Erik Berlin", "username"=>"sferik"}}
43
43
 
44
- # Post a tweet
45
- tweet = x_client.post("tweets", '{"text":"Hello, World! (from @gem)"}')
44
+ # Post
45
+ post = x_client.post("tweets", '{"text":"Hello, World! (from @gem)"}')
46
46
  # {"data"=>{"edit_history_tweet_ids"=>["1234567890123456789"], "id"=>"1234567890123456789", "text"=>"Hello, World! (from @gem)"}}
47
47
 
48
- # Delete the tweet you just posted
49
- x_client.delete("tweets/#{tweet["data"]["id"]}")
48
+ # Delete the post
49
+ x_client.delete("tweets/#{post["data"]["id"]}")
50
50
  # {"data"=>{"deleted"=>true}}
51
51
 
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
- # Request your account settings
55
+ # Get your account settings
56
56
  v1_client.get("account/settings.json")
57
57
 
58
58
  # Initialize an X Ads API client
59
59
  ads_client = X::Client.new(base_url: "https://ads-api.twitter.com/12/", **x_credentials)
60
60
 
61
- # Request your ad accounts
61
+ # Get your ad accounts
62
62
  ads_client.get("accounts")
63
63
  ```
64
64
 
@@ -66,7 +66,7 @@ See other common usage [examples](https://github.com/sferik/x-ruby/tree/main/exa
66
66
 
67
67
  ## History and Philosophy
68
68
 
69
- This library is a rewrite of the [Twitter Ruby library](https://github.com/sferik/twitter). Over 16 years of development, that library ballooned to over 3,000 lines of code (plus 7,500 lines of tests). At the time of writing, this library is about 300 lines of code (plus 200 test lines) and I’d like to keep it that way. That doesn’t mean new features won’t be added over time, but the benefits of more code must be weighted against the benefits of less:
69
+ This library is a rewrite of the [Twitter Ruby library](https://github.com/sferik/twitter). Over 16 years of development, that library ballooned to over 3,000 lines of code (plus 7,500 lines of tests), not counting dependencies. This library is about 500 lines of code (plus 1000 test lines) and has no runtime dependencies. That doesn’t mean new features won’t be added over time, but the benefits of more code must be weighed against the benefits of less:
70
70
 
71
71
  * Less code is easier to maintain.
72
72
  * Less code means fewer bugs.
@@ -76,9 +76,7 @@ In the immortal words of [Ezra Zygmuntowicz](https://github.com/ezmobius) and hi
76
76
 
77
77
  > No code is faster than no code.
78
78
 
79
- The fastest code is the code that is never executed because it doesn’t exist. That principle should apply not just to this library itself but to third-party dependencies. At present, this library has no runtime dependencies and I’d like to keep it that way.
80
-
81
- The tests for the previous version of this library executed in about 2 seconds. That sounds pretty fast until you see that tests for this library run in 2 hundredths of a second. This means you can automatically run the tests any time you write a file and receive immediate feedback. For such of workflows, 2 seconds feels painfully slow.
79
+ The tests for the previous version of this library executed in about 2 seconds. That sounds pretty fast until you see that tests for this library run in one-twentieth of a second. This means you can automatically run the tests any time you write a file and receive immediate feedback. For such of workflows, 2 seconds feels painfully slow.
82
80
 
83
81
  This code is not littered with comments that are intended to generate documentation. Rather, this code is intended to be simple enough to serve as its own documentation. If you want to understand how something works, don’t read the documentation—it might be wrong—read the code. The code is always right.
84
82
 
@@ -103,6 +101,8 @@ Many thanks to our sponsors (listed in order of when they sponsored this project
103
101
  <a href="https://betterstack.com"><img src="https://raw.githubusercontent.com/sferik/x-ruby/main/sponsor_logos/better_stack.svg" alt="Better Stack" width="200" align="middle"></a>
104
102
  <img src="https://raw.githubusercontent.com/sferik/x-ruby/main/sponsor_logos/spacer.png" width="20" align="middle">
105
103
  <a href="https://sentry.io"><img src="https://raw.githubusercontent.com/sferik/x-ruby/main/sponsor_logos/sentry.svg" alt="Sentry" width="200" align="middle"></a>
104
+ <img src="https://raw.githubusercontent.com/sferik/x-ruby/main/sponsor_logos/spacer.png" width="20" align="middle">
105
+ <a href="https://ifttt.com"><img src="https://raw.githubusercontent.com/sferik/x-ruby/main/sponsor_logos/ifttt.svg" alt="IFTTT" width="200" align="middle"></a>
106
106
 
107
107
  ## Development
108
108
 
@@ -1,5 +1,4 @@
1
1
  module X
2
- # Base Authenticator class
3
2
  class Authenticator
4
3
  AUTHENTICATION_HEADER = "Authorization".freeze
5
4
 
@@ -1,7 +1,6 @@
1
1
  require_relative "authenticator"
2
2
 
3
3
  module X
4
- # Handles bearer token authentication
5
4
  class BearerTokenAuthenticator < Authenticator
6
5
  attr_accessor :bearer_token
7
6
 
data/lib/x/cgi.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  require "cgi"
2
2
 
3
3
  module X
4
- # Namespaced CGI class
5
4
  class CGI
6
5
  # TODO: Replace CGI.escape with CGI.escapeURIComponent when support for Ruby 3.1 is dropped
7
6
  def self.escape(value)
data/lib/x/client.rb CHANGED
@@ -7,7 +7,6 @@ require_relative "request_builder"
7
7
  require_relative "response_parser"
8
8
 
9
9
  module X
10
- # Main public interface
11
10
  class Client
12
11
  extend Forwardable
13
12
 
data/lib/x/connection.rb CHANGED
@@ -5,7 +5,6 @@ require "uri"
5
5
  require_relative "errors/network_error"
6
6
 
7
7
  module X
8
- # Sends HTTP requests
9
8
  class Connection
10
9
  extend Forwardable
11
10
 
@@ -2,7 +2,6 @@ require "json"
2
2
  require_relative "error"
3
3
 
4
4
  module X
5
- # Base HTTP error class
6
5
  class HTTPError < Error
7
6
  JSON_CONTENT_TYPE_REGEXP = %r{application/(problem\+|)json}
8
7
 
@@ -1,7 +1,6 @@
1
1
  require_relative "client_error"
2
2
 
3
3
  module X
4
- # Rate limit error class
5
4
  class TooManyRequests < ClientError
6
5
  def limit
7
6
  response["x-rate-limit-limit"].to_i
@@ -1,7 +1,7 @@
1
1
  require "securerandom"
2
+ require "tmpdir"
2
3
 
3
4
  module X
4
- # Helper module for uploading images and videos
5
5
  module MediaUploader
6
6
  extend self
7
7
 
@@ -72,7 +72,7 @@ module X
72
72
  File.open(file_path, "rb") do |f|
73
73
  while (chunk = f.read(chunk_size))
74
74
  file_paths << "#{Dir.mktmpdir}/x#{format("%03d", file_number += 1)}".tap do |path|
75
- File.write(path, chunk)
75
+ File.binwrite(path, chunk)
76
76
  end
77
77
  end
78
78
  end
@@ -7,7 +7,6 @@ require_relative "authenticator"
7
7
  require_relative "cgi"
8
8
 
9
9
  module X
10
- # Handles OAuth authentication
11
10
  class OAuthAuthenticator < Authenticator
12
11
  OAUTH_VERSION = "1.0".freeze
13
12
  OAUTH_SIGNATURE_METHOD = "HMAC-SHA1".freeze
@@ -6,7 +6,6 @@ require_relative "errors/too_many_redirects"
6
6
  require_relative "request_builder"
7
7
 
8
8
  module X
9
- # Handles HTTP redirects
10
9
  class RedirectHandler
11
10
  DEFAULT_MAX_REDIRECTS = 10
12
11
 
@@ -5,7 +5,6 @@ require_relative "cgi"
5
5
  require_relative "version"
6
6
 
7
7
  module X
8
- # Creates HTTP requests
9
8
  class RequestBuilder
10
9
  DEFAULT_HEADERS = {
11
10
  "Content-Type" => "application/json; charset=utf-8",
@@ -17,7 +17,6 @@ require_relative "errors/unauthorized"
17
17
  require_relative "errors/unprocessable_entity"
18
18
 
19
19
  module X
20
- # Process HTTP responses
21
20
  class ResponseParser
22
21
  ERROR_MAP = {
23
22
  400 => BadRequest,
data/lib/x/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  require "rubygems/version"
2
2
 
3
3
  module X
4
- VERSION = Gem::Version.create("0.12.0")
4
+ VERSION = Gem::Version.create("0.12.1")
5
5
  end
data/sig/x.rbs CHANGED
@@ -279,7 +279,3 @@ module X
279
279
  def self.escape_params: (Hash[String, String] | Array[[String, String]] params) -> String
280
280
  end
281
281
  end
282
-
283
- class Dir
284
- def self.mktmpdir: (?String? prefix_suffix) -> String
285
- end
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.12.0
4
+ version: 0.12.1
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-11-02 00:00:00.000000000 Z
11
+ date: 2023-11-28 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
@@ -81,7 +81,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  requirements: []
84
- rubygems_version: 3.4.21
84
+ rubygems_version: 3.4.22
85
85
  signing_key:
86
86
  specification_version: 4
87
87
  summary: A Ruby interface to the X API.