twitter_labs_api 0.3.0 → 0.5.2

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: 13b7d27a82ec7637bded5657ab9a74e7b847236dc5377d5409cdf624ea8c8d73
4
- data.tar.gz: 4267e671b4e6b42cecb79dd7ea63151dfd36769bc386d690027e295ce5d81efd
3
+ metadata.gz: 697a03319c55056717774438db0f412e52df2337e52452bfecc0c9f5f00c99f2
4
+ data.tar.gz: d841c0f5c73763593663180cae40f1528b21037708fbc9b05f0c4fcc89d83720
5
5
  SHA512:
6
- metadata.gz: 2b6e3b2865de73eff4c74e5e0229f83358153af6a00c976bf8de0b0863e29b85875a0f52ea88af8e594caf9eeb0b00f04d37526cf6904f51c71263b07685c831
7
- data.tar.gz: b753f4ed2f3f3ca7f8cd72647bb92abe91e973b1cc08d5c206c79f1b6cfab0c801abf1e055a1515adc3369db71eaa9c1e4bbb2691532942f9c3dbadbf2dae976
6
+ metadata.gz: d4f956e69a646de92cd9c79139bae452091603630da9e6596e004d0a6f084c8be362bb083a01aa2ccb66cb4385dcfdc099d35dd8f2b91c291f9a19b93395f774
7
+ data.tar.gz: 88bb52e555879a7c003f4006f3d4f10c34bd509dfd083ac06856006a3e2a9d2f3b57dcd1a0e5d5e93df3c15a92bd8b723c0b362a40b0a287c639cfe234b68aa1
@@ -0,0 +1,32 @@
1
+ # This workflow uses actions that are not certified by GitHub.
2
+ # They are provided by a third-party and are governed by
3
+ # separate terms of service, privacy policy, and support
4
+ # documentation.
5
+ # This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
6
+ # For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
7
+
8
+ name: Ruby
9
+
10
+ on:
11
+ push:
12
+ branches: [ master ]
13
+ pull_request:
14
+ branches: [ master ]
15
+
16
+ jobs:
17
+ test:
18
+
19
+ runs-on: ubuntu-latest
20
+
21
+ steps:
22
+ - uses: actions/checkout@v2
23
+ - name: Set up Ruby
24
+ # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
25
+ # change this to (see https://github.com/ruby/setup-ruby#versioning):
26
+ uses: ruby/setup-ruby@v1
27
+ with:
28
+ ruby-version: 2.7
29
+ - name: Install dependencies
30
+ run: bundle install
31
+ - name: Run tests
32
+ run: bundle exec rspec
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --require spec_helper
@@ -1,3 +1,25 @@
1
+ # 0.5.2 - 28 July 2020
2
+
3
+ - Add `search`
4
+ - Finish `rdoc` coverage
5
+
6
+ # 0.5.1 - 28 July 2020
7
+
8
+ - Add `User-Agent` request header
9
+ - Add `hide_reply`
10
+
11
+ # 0.5.0 - 27 July 2020
12
+
13
+ - Refactor structure to prepare for adding additional API endpoints
14
+ - Add `get_users_by_username`
15
+ - Add some test coverage
16
+
17
+
18
+ # 0.4.0 - 24 July 2020
19
+
20
+ - Better exception-handling: when API returns an error, a `TwitterLabsAPI::APIError` is thrown. It has the `Net::HTTP` response as an attribute so that the error can be handled properly. See the README for an example.
21
+
22
+
1
23
  # 0.3.0 - 28 April 2020
2
24
 
3
25
  - Fix: namespace of error class
data/Gemfile CHANGED
@@ -1,6 +1,13 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gemspec
3
+ group :development, :test do
4
+ gem 'amazing_print'
5
+ gem 'httplog'
6
+ gem 'irbtools'
7
+ gem 'pry'
8
+ gem 'rake'
9
+ gem 'rspec'
10
+ gem 'webmock'
11
+ end
4
12
 
5
- gem 'activesupport'
6
- gem 'httplog'
13
+ gemspec
@@ -1,41 +1,134 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- twitter_labs_api (0.3.0)
4
+ twitter_labs_api (0.5.2)
5
+ activesupport (~> 6.0)
6
+ httplog (~> 1.4)
5
7
 
6
8
  GEM
7
9
  remote: https://rubygems.org/
8
10
  specs:
9
- activesupport (6.0.0)
11
+ activesupport (6.0.3.2)
10
12
  concurrent-ruby (~> 1.0, >= 1.0.2)
11
13
  i18n (>= 0.7, < 2)
12
14
  minitest (~> 5.1)
13
15
  tzinfo (~> 1.1)
14
- zeitwerk (~> 2.1, >= 2.1.8)
16
+ zeitwerk (~> 2.2, >= 2.2.2)
17
+ addressable (2.7.0)
18
+ public_suffix (>= 2.0.2, < 5.0)
19
+ alias (0.2.3)
20
+ amazing_print (1.2.1)
21
+ binding.repl (3.0.0)
22
+ boson (1.3.0)
23
+ boson-more (0.3.1)
24
+ boson (>= 1.3.0)
25
+ cd (1.0.1)
26
+ clipboard (1.0.6)
27
+ coderay (1.1.3)
15
28
  concurrent-ruby (1.1.6)
16
- httplog (1.3.2)
29
+ crack (0.4.3)
30
+ safe_yaml (~> 1.0.0)
31
+ debugging (1.1.1)
32
+ binding.repl (~> 3.0)
33
+ paint (>= 0.9, < 3.0)
34
+ diff-lcs (1.4.4)
35
+ every_day_irb (2.1.0)
36
+ cd (~> 1.0)
37
+ fancy_irb (1.2.1)
38
+ paint (>= 0.9, < 3.0)
39
+ unicode-display_width (~> 1.1)
40
+ ffi (1.13.1)
41
+ g (1.7.2)
42
+ hashdiff (1.0.1)
43
+ hirb (0.7.3)
44
+ httplog (1.4.3)
17
45
  rack (>= 1.0)
18
46
  rainbow (>= 2.0.0)
19
- i18n (1.6.0)
47
+ i18n (1.8.5)
20
48
  concurrent-ruby (~> 1.0)
21
- minitest (5.14.0)
22
- rack (2.2.2)
49
+ interactive_editor (0.0.11)
50
+ spoon (>= 0.0.1)
51
+ irbtools (1.7.1)
52
+ alias (~> 0.2.3)
53
+ binding.repl (~> 3.0)
54
+ boson (~> 1.3.0)
55
+ boson-more (~> 0.3.0)
56
+ clipboard (~> 1.0.5)
57
+ coderay (~> 1.1.0)
58
+ debugging (~> 1.0)
59
+ every_day_irb (>= 1.7.1)
60
+ fancy_irb (>= 0.7.3)
61
+ g (>= 1.7.2)
62
+ hirb (~> 0.7, >= 0.7.3)
63
+ interactive_editor (>= 0.0.10)
64
+ method_locator (>= 0.0.4)
65
+ method_source (>= 0.8.2)
66
+ methodfinder (~> 2.0)
67
+ ori (~> 0.1.0)
68
+ os (~> 0.9)
69
+ paint (>= 0.8.7)
70
+ ruby_engine (~> 1.0)
71
+ ruby_info (~> 1.0)
72
+ ruby_version (~> 1.0)
73
+ wirb (>= 1.0.3)
74
+ method_locator (0.0.4)
75
+ method_source (1.0.0)
76
+ methodfinder (2.2.1)
77
+ minitest (5.14.1)
78
+ ori (0.1.0)
79
+ os (0.9.6)
80
+ paint (2.2.0)
81
+ pry (0.13.1)
82
+ coderay (~> 1.1)
83
+ method_source (~> 1.0)
84
+ public_suffix (4.0.5)
85
+ rack (2.2.3)
23
86
  rainbow (3.0.0)
24
87
  rake (13.0.1)
88
+ rspec (3.9.0)
89
+ rspec-core (~> 3.9.0)
90
+ rspec-expectations (~> 3.9.0)
91
+ rspec-mocks (~> 3.9.0)
92
+ rspec-core (3.9.2)
93
+ rspec-support (~> 3.9.3)
94
+ rspec-expectations (3.9.2)
95
+ diff-lcs (>= 1.2.0, < 2.0)
96
+ rspec-support (~> 3.9.0)
97
+ rspec-mocks (3.9.1)
98
+ diff-lcs (>= 1.2.0, < 2.0)
99
+ rspec-support (~> 3.9.0)
100
+ rspec-support (3.9.3)
101
+ ruby_engine (1.0.1)
102
+ ruby_info (1.0.1)
103
+ ruby_version (1.0.2)
104
+ safe_yaml (1.0.5)
105
+ spoon (0.0.6)
106
+ ffi
25
107
  thread_safe (0.3.6)
26
- tzinfo (1.2.6)
108
+ tzinfo (1.2.7)
27
109
  thread_safe (~> 0.1)
28
- zeitwerk (2.1.9)
110
+ unicode-display_width (1.7.0)
111
+ webmock (3.8.3)
112
+ addressable (>= 2.3.6)
113
+ crack (>= 0.3.2)
114
+ hashdiff (>= 0.4.0, < 2.0.0)
115
+ wirb (2.2.1)
116
+ paint (>= 0.9, < 3.0)
117
+ zeitwerk (2.4.0)
29
118
 
30
119
  PLATFORMS
31
120
  ruby
32
121
 
33
122
  DEPENDENCIES
34
- activesupport
123
+ amazing_print
35
124
  bundler (~> 2.0)
36
125
  httplog
37
- rake (~> 13.0)
126
+ irbtools
127
+ pry
128
+ rake
129
+ rspec
38
130
  twitter_labs_api!
131
+ webmock
39
132
 
40
133
  BUNDLED WITH
41
- 2.0.2
134
+ 2.1.4
data/README.md CHANGED
@@ -5,9 +5,9 @@ A basic implementation of a Twitter Labs API client as a handy Ruby [gem](https:
5
5
  ## Usage
6
6
 
7
7
  ### Prerequisite
8
- All one needs is a Twitter [bearer token](https://developer.twitter.com/en/docs/basics/authentication/oauth-2-0/bearer-tokens) to get started.
8
+ All one needs is a Twitter [bearer token](https://developer.twitter.com/en/docs/basics/authentication/oauth-2-0/bearer-tokens) to get started. The bearer token is available on the 'Tokens and Keys' page within your app's dashboard on the [Twitter for Developers](https://developer.twitter.com/) site.
9
9
 
10
- One easy way to get a bearer token is to use [this method](https://www.rubydoc.info/gems/twitter/Twitter/REST/Client#bearer_token%3F-instance_method) from https://github.com/sferik/twitter.
10
+ Alternatively, one can get a bearer token using [this method](https://www.rubydoc.info/gems/twitter/Twitter/REST/Client#bearer_token%3F-instance_method) from https://github.com/sferik/twitter.
11
11
 
12
12
  ### Setup
13
13
 
@@ -19,7 +19,7 @@ gem install twitter_labs_api
19
19
 
20
20
  #### Getting a Tweet by ID
21
21
  ```ruby
22
- requre `twitter_labs_api`
22
+ require `twitter_labs_api`
23
23
 
24
24
  api = TwitterLabsAPI.new(bearer_token: 'YOUR-BEARER-TOKEN')
25
25
 
@@ -40,17 +40,42 @@ api.get_tweet(id: '1235508591232090112', tweet_fields: my_fields)
40
40
  >> {"author_id"=>"229708614", "created_at"=>"2020-03-05T10:12:57.000Z", "id"=>"1235508591232090112", "text"=>"Hot take: coronavirus will not boost remote work in the long run because spur-of-the-moment work-from-home for in-person companies is likely to be a shitshow."}
41
41
  ```
42
42
 
43
+ #### API Errors
44
+
45
+ Sometimes the API will respond with an error, for example, `429 Too Many Requests`. The gem will throw an error with the `Net::HTTP` response as an attribute for proper exception-handling by the consuming app:
46
+
47
+ ```ruby
48
+ def my_twitter_request
49
+ api.get_tweet(id: '1235508591232090112', tweet_fields: my_fields)
50
+
51
+ rescue TwitterLabsAPI::APIError => e
52
+ puts e.msg # 429 Too Many Requests
53
+ puts e.response # <Net::HTTPTooManyRequests 429 Too Many Requests readbody=true>
54
+ # do something with the Net::HTTP response...
55
+ end
56
+ ```
57
+
43
58
  ### Status
44
59
  Currently, the following endpoints are implemented:
45
60
 
46
- - `TwitterLabsAPI#get_tweet` - Retrieve a single Tweet object with an `id`
47
- - `TwitterLabsAPI#get_tweets` - Retrieve multiple Tweets with a collection of `ids`
48
- - `TwitterLabsAPI#get_user` - Retrieve a single user object with an `id`
49
- - `TwitterLabsAPI#get_users` - Retrieve multiple user objects with a collection of `ids`
61
+ #### Tweets
62
+
63
+ - `TwitterLabsAPI#get_tweet` ([docs](https://developer.twitter.com/en/docs/labs/tweets-and-users/api-reference/get-tweets-id)) - Retrieve a single Tweet object with an `id`
64
+ - `TwitterLabsAPI#get_tweets` ([docs](https://developer.twitter.com/en/docs/labs/tweets-and-users/api-reference/get-tweets)) - Retrieve multiple Tweets with a collection of `ids`
65
+ - `TwitterLabsAPI#hide_reply` ([docs](https://developer.twitter.com/en/docs/labs/hide-replies/api-reference/put-hidden)) - Hide a reply by referencing it's `id`; must be in a conversation belonging to the authenticating user
66
+ - `TwitterLabsAPI#search` ([docs](https://developer.twitter.com/en/docs/labs/recent-search/api-reference/get-recent-search)) - Returns Tweets from the last 7 days that match a search query.
67
+
68
+ #### Users
69
+
70
+ - `TwitterLabsAPI#get_user` ([docs](https://developer.twitter.com/en/docs/labs/tweets-and-users/api-reference/get-users-id)) - Retrieve a single user object with an `id`
71
+ - `TwitterLabsAPI#get_users` ([docs](https://developer.twitter.com/en/docs/labs/tweets-and-users/api-reference/get-users)) - Retrieve multiple user objects with a collection of `ids`
72
+ - `TwitterLabsAPI#get_users_by_username` ([docs](https://developer.twitter.com/en/docs/labs/tweets-and-users/api-reference/get-users)) - Retrieve multiple user objects with a collection of `usernames`
50
73
 
51
74
  ## Roadmap
52
75
 
53
- Since this project is initially driven by my own usage of the API, I will focus on implementing and refinining the Tweets, Users, and Metrics endpoints. If this repo gets enough interest, I might implement the other endpoints and create a proper `.gemspec`. And of course, contributions are welcome :)
76
+ Currently focused on implementing support for all v2 endpoints; if there is enough interest, I will add v1 endpoint support as well.
77
+
78
+ And of course, contributions are welcome :)
54
79
 
55
80
  ## Dependencies
56
81
 
@@ -0,0 +1 @@
1
+ bundle exec rspec
@@ -2,105 +2,13 @@ require 'json'
2
2
  require 'net/http'
3
3
  require 'uri'
4
4
  require 'active_support/core_ext/hash/indifferent_access'
5
-
6
- DEFAULT_TWEET_FIELDS = %w[id author_id created_at lang public_metrics].freeze
7
- DEFAULT_USER_FIELDS = %w[name username].freeze
5
+ require_relative 'twitter_labs_api/client'
8
6
 
9
7
  # A basic implementation of a Twitter Labs API client.
10
- class TwitterLabsAPI
11
- attr_accessor :bearer_token, :debug, :api_response, :parsed_response
12
-
13
- class TwitterLabsAPIError < StandardError; end
14
-
15
- def initialize(bearer_token:, debug: false)
16
- @bearer_token = bearer_token
17
- @debug = debug
18
- require 'httplog' if debug
19
- end
20
-
21
- # @param [String] :id the ID of the requested Tweet
22
- # @param [Array<String>] :tweet_fields (["id", "author_id", "created_at", "lang", "public_metrics"]) the list of fields to retrieve for the given tweet
23
- def get_tweet(id:, tweet_fields: DEFAULT_TWEET_FIELDS)
24
- url = "https://api.twitter.com/labs/2/tweets/#{id}"
25
- params = {
26
- 'tweet.fields' => tweet_fields.join(',')
27
- }.compact
28
-
29
- make_request(url: url, params: params)
30
- end
31
-
32
- # @param [Array<String>] :ids the collection of requested Tweet IDs
33
- # @param [Array<String>] :tweet_fields (["id", "author_id", "created_at", "lang", "public_metrics"]) the list of fields to retrieve for the given tweet
34
- def get_tweets(ids:, tweet_fields: DEFAULT_TWEET_FIELDS)
35
- url = 'https://api.twitter.com/labs/2/tweets'
36
- params = {
37
- 'ids' => ids.join(','),
38
- 'tweet.fields' => tweet_fields.join(',')
39
- }.compact
40
-
41
- make_request(url: url, params: params, is_collection: true)
42
- end
43
-
44
- # @param [String] :id the ID of the requested User
45
- # @param [Array<String>] :user_fields (["name", "username"]) the list of fields to retrieve for the given User
46
- def get_user(id:, user_fields: DEFAULT_USER_FIELDS)
47
- url = "https://api.twitter.com/labs/2/users/#{id}"
48
- params = {
49
- 'user.fields' => user_fields.join(',')
50
- }.compact
51
-
52
- make_request(url: url, params: params)
53
- end
54
-
55
- # @param [Array<String>] :ids the collection of requested User IDs
56
- # @param [Array<String>] :user_fields (["name", "username"]) the list of fields to retrieve for the given User
57
- def get_users(ids:, user_fields: DEFAULT_USER_FIELDS)
58
- url = 'https://api.twitter.com/labs/2/users'
59
- params = {
60
- 'ids' => ids.join(','),
61
- 'user.fields' => user_fields.join(',')
62
- }.compact
63
-
64
- make_request(url: url, params: params, is_collection: true)
65
- end
66
-
67
- private
68
-
69
- def make_request(url:, params: {}, is_collection: false)
70
- uri = URI.parse(url)
71
- uri.query = URI.encode_www_form(params)
72
- request = Net::HTTP::Get.new(uri)
73
- request['Authorization'] = "Bearer #{bearer_token}"
74
- req_options = { use_ssl: uri.scheme == 'https' }
75
-
76
- self.api_response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
77
- http.request(request)
8
+ module TwitterLabsAPI
9
+ class << self
10
+ def new(bearer_token:, debug: false)
11
+ Client.new(bearer_token: bearer_token, debug: debug)
78
12
  end
79
-
80
- raise TwitterLabsAPIError("#{api_response.code} #{api_response.msg}") unless api_response.is_a?(Net::HTTPSuccess)
81
-
82
- self.parsed_response = JSON.parse(api_response.body)
83
-
84
- handle_api_error if error_response?
85
-
86
- is_collection ? handle_collection : handle_single
87
- end
88
-
89
- def error_response?
90
- parsed_response.key?('errors')
91
- end
92
-
93
- def handle_single
94
- parsed_response['data'].with_indifferent_access
95
- end
96
-
97
- def handle_collection
98
- parsed_response['data'].map(&:with_indifferent_access)
99
- end
100
-
101
- def handle_api_error
102
- error = parsed_response['errors'].first
103
-
104
- raise TwitterLabsAPIError, "#{error['title']}: #{error['detail']} #{error['type']}"
105
13
  end
106
14
  end
@@ -0,0 +1,13 @@
1
+ module TwitterLabsAPI
2
+ class APIError < StandardError
3
+ DEFAULT_MESSAGE = 'Twitter Labs API error, check the response attribute'.freeze
4
+
5
+ attr_reader :response
6
+
7
+ def initialize(msg = DEFAULT_MESSAGE, response = nil)
8
+ @response = response
9
+
10
+ super(msg)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,72 @@
1
+ require_relative 'api_error'
2
+ require_relative 'resources/tweet'
3
+ require_relative 'resources/user'
4
+
5
+ module TwitterLabsAPI
6
+ class Client
7
+ include Resources::Tweet
8
+ include Resources::User
9
+
10
+ attr_accessor :bearer_token, :debug, :api_response, :parsed_response
11
+
12
+ def initialize(bearer_token:, debug: false)
13
+ @bearer_token = bearer_token
14
+ @debug = debug
15
+ require 'httplog' if debug
16
+ end
17
+
18
+ private
19
+
20
+ def make_request(url:, params: {}, is_collection: false, method: :get)
21
+ uri = URI.parse(url)
22
+ uri.query = URI.encode_www_form(params)
23
+ request = http_adapter(method).new(uri)
24
+ request['Authorization'] = "Bearer #{bearer_token}"
25
+ request['User-Agent'] = "twitter_labs_api gem #{TwitterLabsAPI::VERSION}"
26
+ req_options = { use_ssl: uri.scheme == 'https' }
27
+
28
+ self.api_response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
29
+ http.request(request)
30
+ end
31
+
32
+ raise_http_error unless api_response.is_a?(Net::HTTPSuccess)
33
+
34
+ self.parsed_response = JSON.parse(api_response.body)
35
+
36
+ handle_api_error if error_response?
37
+
38
+ is_collection ? handle_collection : handle_single
39
+ end
40
+
41
+ def http_adapter(method)
42
+ case method
43
+ when :put
44
+ Net::HTTP::Put
45
+ else
46
+ Net::HTTP::Get
47
+ end
48
+ end
49
+
50
+ def error_response?
51
+ parsed_response.key?('errors')
52
+ end
53
+
54
+ def handle_single
55
+ parsed_response['data'].with_indifferent_access
56
+ end
57
+
58
+ def handle_collection
59
+ parsed_response['data'].map(&:with_indifferent_access)
60
+ end
61
+
62
+ def raise_http_error
63
+ raise(APIError.new("#{api_response.code} #{api_response.msg}", api_response))
64
+ end
65
+
66
+ def handle_api_error
67
+ error = parsed_response['errors'].first
68
+
69
+ raise APIError.new("#{error['title']}: #{error['detail']} #{error['type']}", api_response)
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,57 @@
1
+ module TwitterLabsAPI
2
+ module Resources
3
+ module Tweet
4
+ DEFAULT_TWEET_FIELDS = %w[id author_id created_at lang public_metrics].freeze
5
+
6
+ # Returns a variety of information about a single Tweet specified by the requested ID.
7
+ # @param [String] :id the ID of the requested Tweet
8
+ # @param [Array<String>] :tweet_fields (["id", "author_id", "created_at", "lang", "public_metrics"]) the list of fields to retrieve for the given tweet
9
+ # @return Hash an object with requested tweet fields
10
+ def get_tweet(id:, tweet_fields: DEFAULT_TWEET_FIELDS)
11
+ url = "https://api.twitter.com/labs/2/tweets/#{id}"
12
+ params = {
13
+ 'tweet.fields' => tweet_fields.join(',')
14
+ }.compact
15
+
16
+ make_request(url: url, params: params)
17
+ end
18
+
19
+ # Returns a variety of information about the Tweet specified by the requested ID or list of IDs.
20
+ # @param [Array<String>] :ids the collection of requested Tweet IDs
21
+ # @param [Array<String>] :tweet_fields (["id", "author_id", "created_at", "lang", "public_metrics"]) the list of fields to retrieve for the given tweet
22
+ # @return [Array<Hash>] of tweet objects with the requested tweet fields
23
+ def get_tweets(ids:, tweet_fields: DEFAULT_TWEET_FIELDS)
24
+ url = 'https://api.twitter.com/labs/2/tweets'
25
+ params = {
26
+ 'ids' => ids.join(','),
27
+ 'tweet.fields' => tweet_fields.join(',')
28
+ }.compact
29
+
30
+ make_request(url: url, params: params, is_collection: true)
31
+ end
32
+
33
+ # Hides or unhides a reply to a Tweet.
34
+ # @param [String] :id the ID of the requested Tweet; must belong to a conversation by the authenticated user
35
+ # @return boolean indicating the hidden status of the requested tweet
36
+ def hide_reply(id:)
37
+ url = "https://api.twitter.com/labs/2/tweets/#{id}/hidden"
38
+
39
+ make_request(url: url, method: :put)[:hidden]
40
+ end
41
+
42
+ # The Labs recent search endpoint returns Tweets from the last 7 days that match a search query.
43
+ # @param [String] :query the search query
44
+ # @param [Array<String>] :tweet_fields (["id", "author_id", "created_at", "lang", "public_metrics"]) the list of fields to retrieve for the given tweet
45
+ # @param [Array<String>] :tweet_fields (["id", "author_id", "created_at", "lang", "public_metrics"]) the list of fields to retrieve for the given tweet
46
+ def search(query:, tweet_fields: DEFAULT_TWEET_FIELDS)
47
+ url = "https://api.twitter.com/labs/2/tweets/search"
48
+ params = {
49
+ 'query' => query,
50
+ 'tweet.fields' => tweet_fields.join(',')
51
+ }.compact
52
+
53
+ make_request(url: url, params: params, is_collection: true)
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,48 @@
1
+ module TwitterLabsAPI
2
+ module Resources
3
+ module User
4
+ DEFAULT_USER_FIELDS = %w[id name username].freeze
5
+
6
+ # Returns a variety of information about a single more user specified by the requested ID.
7
+ # @param [String] :id the ID of the requested User
8
+ # @param [Array<String>] :user_fields (["name", "username"]) the list of fields to retrieve for the given User
9
+ # @return Hash an object with requested user fields
10
+ def get_user(id:, user_fields: DEFAULT_USER_FIELDS)
11
+ url = "https://api.twitter.com/labs/2/users/#{id}"
12
+ params = {
13
+ 'user.fields' => user_fields.join(',')
14
+ }.compact
15
+
16
+ make_request(url: url, params: params)
17
+ end
18
+
19
+ # Returns a variety of information about one or more Users specified by the requested IDs.
20
+ # @param [Array<String>] :ids the collection of requested User IDs
21
+ # @param [Array<String>] :user_fields (["name", "username"]) the list of fields to retrieve for the given User
22
+ # @return [Array<Hash>] of user objects with the requested user fields
23
+ def get_users(ids:, user_fields: DEFAULT_USER_FIELDS)
24
+ url = 'https://api.twitter.com/labs/2/users'
25
+ params = {
26
+ 'ids' => ids.join(','),
27
+ 'user.fields' => user_fields.join(',')
28
+ }.compact
29
+
30
+ make_request(url: url, params: params, is_collection: true)
31
+ end
32
+
33
+ # Returns a variety of information about one or more Users specified by the requested usernames.
34
+ # @param [Array<String>] :usernames the collection of requested Usernames
35
+ # @param [Array<String>] :user_fields (["name", "username"]) the list of fields to retrieve for the given User
36
+ # @return [Array<Hash>] of user objects with the requested user fields
37
+ def get_users_by_usernames(usernames:, user_fields: DEFAULT_USER_FIELDS)
38
+ url = 'https://api.twitter.com/labs/2/users/by'
39
+ params = {
40
+ 'usernames' => usernames.join(','),
41
+ 'user.fields' => user_fields.join(',')
42
+ }.compact
43
+
44
+ make_request(url: url, params: params, is_collection: true)
45
+ end
46
+ end
47
+ end
48
+ end
@@ -1,3 +1,3 @@
1
- class TwitterLabsAPI
2
- VERSION = '0.3.0'.freeze
1
+ module TwitterLabsAPI
2
+ VERSION = '0.5.2'.freeze
3
3
  end
@@ -25,6 +25,9 @@ Gem::Specification.new do |spec|
25
25
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
26
26
  spec.require_paths = ['lib']
27
27
 
28
+ spec.add_dependency 'activesupport', '~> 6.0'
29
+ spec.add_dependency 'httplog', '~> 1.4'
30
+
28
31
  spec.add_development_dependency 'bundler', '~> 2.0'
29
32
  spec.add_development_dependency 'rake', '~> 13.0'
30
33
  end
metadata CHANGED
@@ -1,15 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: twitter_labs_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - tomholford
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-04-28 00:00:00.000000000 Z
11
+ date: 2020-07-28 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '6.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '6.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: httplog
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.4'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.4'
13
41
  - !ruby/object:Gem::Dependency
14
42
  name: bundler
15
43
  requirement: !ruby/object:Gem::Requirement
@@ -45,7 +73,9 @@ executables: []
45
73
  extensions: []
46
74
  extra_rdoc_files: []
47
75
  files:
76
+ - ".github/workflows/ruby.yml"
48
77
  - ".gitignore"
78
+ - ".rspec"
49
79
  - CHANGELOG.md
50
80
  - Gemfile
51
81
  - Gemfile.lock
@@ -54,7 +84,12 @@ files:
54
84
  - Rakefile
55
85
  - bin/console
56
86
  - bin/setup
87
+ - bin/specs
57
88
  - lib/twitter_labs_api.rb
89
+ - lib/twitter_labs_api/api_error.rb
90
+ - lib/twitter_labs_api/client.rb
91
+ - lib/twitter_labs_api/resources/tweet.rb
92
+ - lib/twitter_labs_api/resources/user.rb
58
93
  - lib/twitter_labs_api/version.rb
59
94
  - twitter-labs-api.gemspec
60
95
  homepage: https://github.com/tomholford/twitter-labs-api