twitter_labs_api 0.5.0 → 0.7.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: f31f636cbf46ed53a3d35e61c3376b9f47184220db4b23277f4f7c504f4be251
4
- data.tar.gz: be3ae4940e263fe6bf33661686072c62c807236f9c2814488661efc8da8799a8
3
+ metadata.gz: 5ce6092d6dc4256bc5db207476e6b5d74c822340b2a65287c6642d80ccd011ba
4
+ data.tar.gz: 6182b14e47a3bf227c12031cc674f115c178ae625e8278f192bf67dc5adc781e
5
5
  SHA512:
6
- metadata.gz: 6062719f695c9979a327d94396795df7365559e92598fe08e727d2e87dc2e4a987a4f6bf689954cd2efc2b6c20f0ad5ae3003f651e0e45fc0caea12f46a57688
7
- data.tar.gz: 7c1616a9f97582a2dda4061f2a0c540b7967d4d525c0bd344141643723450d91a4208357d919b8acf4d0d89a17d2046e0f6fba75a5c3eb6e9a10d9f6caa4df31
6
+ metadata.gz: ef6bf629eae0a91baa59eb43beb7d0770bca8e75243ca04d3884839987f3e466f25b6c763b4046b57d20cc07cb1e5605dd7febb935ddb5333f4ebf74bb2101b7
7
+ data.tar.gz: 84eb57aec3cde7b0b4e8e30f507016e1e97930c810f0777018593841507430b5a871fb3da6ba140ecf2c57462da6101f304deb0a4ab621efa61e4839aefcc2e3
@@ -1,3 +1,41 @@
1
+ # 0.7.1 - 28 August 2020
2
+
3
+ - Fix: add missing require statement
4
+
5
+ # 0.7.0 - 28 August 2020
6
+
7
+ - Refactor interface for requesting custom response fields
8
+
9
+ ## Breaking Change
10
+
11
+ Heads up, the argument to request fields was previously called `tweet_fields`; it is now called `fields`.
12
+
13
+ ```ruby
14
+ api.get_tweet(id: '123455683780', fields: requested_fields)
15
+ ```
16
+
17
+ The `fields` parameter now supports multiple different data types (instead of just Tweet attributes). So for example, to request the URL of an embedded media item:
18
+
19
+ ```ruby
20
+ requested_fields = { tweet: %w[id username], media: %w[url] }
21
+
22
+ api.get_tweet(id: my_id, fields: requested_fields)
23
+ ```
24
+
25
+ # 0.6.0 - 28 July 2020
26
+
27
+ - Fix: broken dependency
28
+
29
+ # 0.5.2 - 28 July 2020
30
+
31
+ - Add `search`
32
+ - Finish `rdoc` coverage
33
+
34
+ # 0.5.1 - 28 July 2020
35
+
36
+ - Add `User-Agent` request header
37
+ - Add `hide_reply`
38
+
1
39
  # 0.5.0 - 27 July 2020
2
40
 
3
41
  - Refactor structure to prepare for adding additional API endpoints
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- twitter_labs_api (0.5.0)
4
+ twitter_labs_api (0.7.1)
5
5
  activesupport (~> 6.0)
6
6
  httplog (~> 1.4)
7
7
 
@@ -25,7 +25,7 @@ GEM
25
25
  cd (1.0.1)
26
26
  clipboard (1.0.6)
27
27
  coderay (1.1.3)
28
- concurrent-ruby (1.1.6)
28
+ concurrent-ruby (1.1.7)
29
29
  crack (0.4.3)
30
30
  safe_yaml (~> 1.0.0)
31
31
  debugging (1.1.1)
data/README.md CHANGED
@@ -1,13 +1,15 @@
1
1
  # twitter-labs-api
2
2
 
3
+ [![Labs v2](https://img.shields.io/static/v1?label=Twitter%20API&message=Developer%20Labs%20v2&color=192430&style=flat&logo=Twitter)](https://developer.twitter.com/en/docs/labs/overview/versioning)
4
+
3
5
  A basic implementation of a Twitter Labs API client as a handy Ruby [gem](https://rubygems.org/gems/twitter_labs_api). This project uses the v2 endpoints announced [here](https://twittercommunity.com/t/releasing-a-new-version-of-labs-endpoints/134219/3).
4
6
 
5
7
  ## Usage
6
8
 
7
9
  ### 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.
10
+ 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
11
 
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.
12
+ 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
13
 
12
14
  ### Setup
13
15
 
@@ -30,14 +32,13 @@ api.get_tweet(id: '1234671272602193920')
30
32
 
31
33
  #### Specifying which fields to include in the response
32
34
 
33
- By default, the gem requests the 'default' fields for each entity. See the [API Reference](https://developer.twitter.com/en/docs/labs/tweets-and-users/api-reference) for available fields. One can customize the response payload like so:
35
+ By default, the gem requests the 'default' fields for each entity. See the [API Reference](https://developer.twitter.com/en/docs/labs/tweets-and-users/api-reference) for available fields. One can customize the response payload, depending on the requested resource.
34
36
 
37
+ For example, to request the URL of a Tweet's embedded media item:
35
38
  ```ruby
36
- my_fields = %w[id author_id created_at text]
37
-
38
- api.get_tweet(id: '1235508591232090112', tweet_fields: my_fields)
39
+ requested_fields = { tweet: %w[id username], media: %w[url] }
39
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
+ api.get_tweet(id: my_id, fields: requested_fields)
41
42
  ```
42
43
 
43
44
  #### API Errors
@@ -62,6 +63,8 @@ Currently, the following endpoints are implemented:
62
63
 
63
64
  - `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
65
  - `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`
66
+ - `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
67
+ - `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.
65
68
 
66
69
  #### Users
67
70
 
@@ -71,7 +74,9 @@ Currently, the following endpoints are implemented:
71
74
 
72
75
  ## Roadmap
73
76
 
74
- Since this project is initially driven by my own usage of the API, I will focus on implementing and refining 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 :)
77
+ Currently focused on implementing support for all v2 endpoints; if there is enough interest, I will add v1 endpoint support as well.
78
+
79
+ And of course, contributions are welcome :)
75
80
 
76
81
  ## Dependencies
77
82
 
@@ -1,4 +1,6 @@
1
+ require_relative 'version'
1
2
  require_relative 'api_error'
3
+ require_relative 'services/params_service'
2
4
  require_relative 'resources/tweet'
3
5
  require_relative 'resources/user'
4
6
 
@@ -17,13 +19,14 @@ module TwitterLabsAPI
17
19
 
18
20
  private
19
21
 
20
- def make_request(url:, params: {}, is_collection: false)
22
+ def make_request(url:, params: {}, is_collection: false, method: :get)
21
23
  uri = URI.parse(url)
22
24
  uri.query = URI.encode_www_form(params)
23
- request = Net::HTTP::Get.new(uri)
25
+ request = http_adapter(method).new(uri)
24
26
  request['Authorization'] = "Bearer #{bearer_token}"
27
+ request['User-Agent'] = "twitter_labs_api gem #{TwitterLabsAPI::VERSION}"
25
28
  req_options = { use_ssl: uri.scheme == 'https' }
26
-
29
+
27
30
  self.api_response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
28
31
  http.request(request)
29
32
  end
@@ -36,7 +39,16 @@ module TwitterLabsAPI
36
39
 
37
40
  is_collection ? handle_collection : handle_single
38
41
  end
39
-
42
+
43
+ def http_adapter(method)
44
+ case method
45
+ when :put
46
+ Net::HTTP::Put
47
+ else
48
+ Net::HTTP::Get
49
+ end
50
+ end
51
+
40
52
  def error_response?
41
53
  parsed_response.key?('errors')
42
54
  end
@@ -2,26 +2,54 @@ module TwitterLabsAPI
2
2
  module Resources
3
3
  module Tweet
4
4
  DEFAULT_TWEET_FIELDS = %w[id author_id created_at lang public_metrics].freeze
5
+ DEFAULT_FIELDS = { tweet: DEFAULT_TWEET_FIELDS }.freeze
5
6
 
7
+ # Returns a variety of information about a single Tweet specified by the requested ID.
6
8
  # @param [String] :id the ID of the requested Tweet
7
- # @param [Array<String>] :tweet_fields (["id", "author_id", "created_at", "lang", "public_metrics"]) the list of fields to retrieve for the given tweet
8
- def get_tweet(id:, tweet_fields: DEFAULT_TWEET_FIELDS)
9
+ # @param [Hash] :fields a hash for fields to include in the response payload;
10
+ #
11
+ # e.g.: { tweet: %w[id username], media: %w[url] }
12
+ # @return Hash an object with requested tweet fields
13
+ def get_tweet(id:, fields: DEFAULT_FIELDS)
9
14
  url = "https://api.twitter.com/labs/2/tweets/#{id}"
10
- params = {
11
- 'tweet.fields' => tweet_fields.join(',')
12
- }.compact
15
+ params = ParamsService.from_fields(fields)
13
16
 
14
17
  make_request(url: url, params: params)
15
18
  end
16
19
 
20
+ # Returns a variety of information about the Tweet specified by the requested ID or list of IDs.
17
21
  # @param [Array<String>] :ids the collection of requested Tweet IDs
18
- # @param [Array<String>] :tweet_fields (["id", "author_id", "created_at", "lang", "public_metrics"]) the list of fields to retrieve for the given tweet
19
- def get_tweets(ids:, tweet_fields: DEFAULT_TWEET_FIELDS)
22
+ # @param [Hash] :fields a hash for fields to include in the response payload;
23
+ #
24
+ # e.g.: { tweet: %w[id username], media: %w[url] }
25
+ # @return [Array<Hash>] of tweet objects with the requested tweet fields
26
+ def get_tweets(ids:, fields: DEFAULT_FIELDS)
20
27
  url = 'https://api.twitter.com/labs/2/tweets'
21
- params = {
22
- 'ids' => ids.join(','),
23
- 'tweet.fields' => tweet_fields.join(',')
24
- }.compact
28
+ params = ParamsService.from_fields(fields)
29
+ params.merge!({ ids: ids.join(',') })
30
+
31
+ make_request(url: url, params: params, is_collection: true)
32
+ end
33
+
34
+ # Hides or unhides a reply to a Tweet.
35
+ # @param [String] :id the ID of the requested Tweet; must belong to a conversation by the authenticated user
36
+ # @return boolean indicating the hidden status of the requested tweet
37
+ def hide_reply(id:)
38
+ url = "https://api.twitter.com/labs/2/tweets/#{id}/hidden"
39
+
40
+ make_request(url: url, method: :put)[:hidden]
41
+ end
42
+
43
+ # The Labs recent search endpoint returns Tweets from the last 7 days that match a search query.
44
+ # @param [String] :query the search query
45
+ # @param [Hash] :fields a hash for fields to include in the response payload;
46
+ #
47
+ # e.g.: { tweet: %w[id username], media: %w[url] }
48
+ # @return [Array<Hash>] of tweet objects with the requested tweet fields
49
+ def search(query:, fields: DEFAULT_FIELDS)
50
+ url = 'https://api.twitter.com/labs/2/tweets/search'
51
+ params = ParamsService.from_fields(fields)
52
+ params.merge!({ query: query })
25
53
 
26
54
  make_request(url: url, params: params, is_collection: true)
27
55
  end
@@ -2,38 +2,45 @@ module TwitterLabsAPI
2
2
  module Resources
3
3
  module User
4
4
  DEFAULT_USER_FIELDS = %w[id name username].freeze
5
+ DEFAULT_FIELDS = { user: DEFAULT_USER_FIELDS }.freeze
5
6
 
7
+ # Returns a variety of information about a single more user specified by the requested ID.
6
8
  # @param [String] :id the ID of the requested User
7
- # @param [Array<String>] :user_fields (["name", "username"]) the list of fields to retrieve for the given User
8
- def get_user(id:, user_fields: DEFAULT_USER_FIELDS)
9
+ # @param [Hash] :fields a hash for fields to include in the response payload;
10
+ #
11
+ # e.g.: { user: %w[id name username] }
12
+ # @return Hash an object with requested user fields
13
+ def get_user(id:, fields: DEFAULT_FIELDS)
9
14
  url = "https://api.twitter.com/labs/2/users/#{id}"
10
- params = {
11
- 'user.fields' => user_fields.join(',')
12
- }.compact
15
+ params = ParamsService.from_fields(fields)
13
16
 
14
17
  make_request(url: url, params: params)
15
18
  end
16
19
 
20
+ # Returns a variety of information about one or more Users specified by the requested IDs.
17
21
  # @param [Array<String>] :ids the collection of requested User IDs
18
- # @param [Array<String>] :user_fields (["name", "username"]) the list of fields to retrieve for the given User
19
- def get_users(ids:, user_fields: DEFAULT_USER_FIELDS)
22
+ # @param [Hash] :fields a hash for fields to include in the response payload;
23
+ #
24
+ # e.g.: { user: %w[id name username] }
25
+ # @return [Array<Hash>] of user objects with the requested user fields
26
+ def get_users(ids:, fields: DEFAULT_FIELDS)
20
27
  url = 'https://api.twitter.com/labs/2/users'
21
- params = {
22
- 'ids' => ids.join(','),
23
- 'user.fields' => user_fields.join(',')
24
- }.compact
28
+ params = ParamsService.from_fields(fields)
29
+ params.merge!({ ids: ids.join(',') })
25
30
 
26
31
  make_request(url: url, params: params, is_collection: true)
27
32
  end
28
33
 
34
+ # Returns a variety of information about one or more Users specified by the requested usernames.
29
35
  # @param [Array<String>] :usernames the collection of requested Usernames
30
- # @param [Array<String>] :user_fields (["name", "username"]) the list of fields to retrieve for the given User
31
- def get_users_by_usernames(usernames:, user_fields: DEFAULT_USER_FIELDS)
36
+ # @param [Hash] :fields a hash for fields to include in the response payload;
37
+ #
38
+ # e.g.: { user: %w[id name username] }
39
+ # @return [Array<Hash>] of user objects with the requested user fields
40
+ def get_users_by_usernames(usernames:, fields: DEFAULT_FIELDS)
32
41
  url = 'https://api.twitter.com/labs/2/users/by'
33
- params = {
34
- 'usernames' => usernames.join(','),
35
- 'user.fields' => user_fields.join(',')
36
- }.compact
42
+ params = ParamsService.from_fields(fields)
43
+ params.merge!({ usernames: usernames.join(',') })
37
44
 
38
45
  make_request(url: url, params: params, is_collection: true)
39
46
  end
@@ -0,0 +1,15 @@
1
+ class ParamsService
2
+ # Convert user-passed fields hash to query params
3
+ # @param [Hash] :fields A hash of requested fields; see API Reference for details
4
+ # @return [Hash] A hash of query params for consumption by API client
5
+ # @example
6
+ # input: { tweet: %w[id username], media: ['url'] }
7
+ # output: { 'tweet.fields' => 'id,username', 'media.fields' => 'url }
8
+ def self.from_fields(fields)
9
+ fields.keys.inject({}) do |memo, key|
10
+ memo["#{key}.fields"] = fields[key].join(',')
11
+
12
+ memo
13
+ end
14
+ end
15
+ end
@@ -1,3 +1,3 @@
1
1
  module TwitterLabsAPI
2
- VERSION = '0.5.0'.freeze
2
+ VERSION = '0.7.1'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: twitter_labs_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - tomholford
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-07-27 00:00:00.000000000 Z
11
+ date: 2020-08-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -90,6 +90,7 @@ files:
90
90
  - lib/twitter_labs_api/client.rb
91
91
  - lib/twitter_labs_api/resources/tweet.rb
92
92
  - lib/twitter_labs_api/resources/user.rb
93
+ - lib/twitter_labs_api/services/params_service.rb
93
94
  - lib/twitter_labs_api/version.rb
94
95
  - twitter-labs-api.gemspec
95
96
  homepage: https://github.com/tomholford/twitter-labs-api