twitter_tweet_bot 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +18 -10
  3. data/lib/twitter_tweet_bot/api/access_token.rb +1 -3
  4. data/lib/twitter_tweet_bot/api/authorization/secure_code.rb +1 -1
  5. data/lib/twitter_tweet_bot/api/authorization.rb +4 -4
  6. data/lib/twitter_tweet_bot/api/http/error.rb +5 -6
  7. data/lib/twitter_tweet_bot/api/http/headers.rb +14 -2
  8. data/lib/twitter_tweet_bot/api/http/post.rb +2 -2
  9. data/lib/twitter_tweet_bot/api/params/boolean_param.rb +13 -0
  10. data/lib/twitter_tweet_bot/api/params/comma_separated_param.rb +21 -0
  11. data/lib/twitter_tweet_bot/api/params/hash_param.rb +13 -0
  12. data/lib/twitter_tweet_bot/api/params/string_param.rb +13 -0
  13. data/lib/twitter_tweet_bot/api/params/tweet_params.rb +53 -0
  14. data/lib/twitter_tweet_bot/api/params/users_me_params.rb +43 -0
  15. data/lib/twitter_tweet_bot/api/refresh_token.rb +1 -4
  16. data/lib/twitter_tweet_bot/api/tweet.rb +14 -4
  17. data/lib/twitter_tweet_bot/api/users_me.rb +10 -4
  18. data/lib/twitter_tweet_bot/cache/caching.rb +2 -1
  19. data/lib/twitter_tweet_bot/cache/client_ext.rb +1 -1
  20. data/lib/twitter_tweet_bot/cache/configuration_ext.rb +3 -2
  21. data/lib/twitter_tweet_bot/cache/entity_ext/base.rb +2 -3
  22. data/lib/twitter_tweet_bot/cache/store.rb +1 -0
  23. data/lib/twitter_tweet_bot/cache.rb +1 -1
  24. data/lib/twitter_tweet_bot/client/api.rb +6 -6
  25. data/lib/twitter_tweet_bot/client/entity.rb +2 -2
  26. data/lib/twitter_tweet_bot/{configration.rb → configuration.rb} +2 -3
  27. data/lib/twitter_tweet_bot/entity/base.rb +14 -10
  28. data/lib/twitter_tweet_bot/entity/tweet.rb +4 -2
  29. data/lib/twitter_tweet_bot/entity/user.rb +4 -3
  30. data/lib/twitter_tweet_bot/version.rb +5 -1
  31. data/lib/twitter_tweet_bot.rb +5 -5
  32. metadata +9 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8a2b63d602240d7b56c182f40ec07306600818005a0b5d35b9cf6f8a93e405cf
4
- data.tar.gz: 9c2b1c30135546c64319ddaf38bf75ee15184d9d3a7b0d42404c96380b036ba0
3
+ metadata.gz: 0075abce451f1cc89c2cfaf56d04c9a18c3a1ae4e9bed984c8ec1a582689a944
4
+ data.tar.gz: 8d37895dec281683bf51db107ac3b4f02894d53380d797a7ff98aab0aa6d78a0
5
5
  SHA512:
6
- metadata.gz: 453ac53d4a7240829771bee7d8a94e5b1b1a5bfebdb26352fbe63579bdad9df20ac2da805da551f8a8d5f9a20ab9c3e6361dbcc5c8c96e8a14f42e3201d0d7c9
7
- data.tar.gz: 6ae79d1b5ac9de5a26830eb28ba6ae8a62e0df6e85beda2ae9975b3d625bfab7495b5b5d6a704dfd66e5b6327b7e04406b86dfd3d8587d0140058889ce73922a
6
+ metadata.gz: '0969b67fe82425486264df739eec73b98945eb339e39588d2117831949ca5667c8a2da7a9098dd25fc16a78fdb5318a416ddce331c939c0e34cd4b8dd553ada4'
7
+ data.tar.gz: ef888edd3e082f7371148c2471ce0ea0fa82c89da230506511681d7880df388ed72c349a8ee879debe1f7ffe2d3e9b65bf8fa82a6228d040026e844dd08eab00
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # twitter_tweet_bot
2
2
  Tweet Bot with Twitter's V2 API.<br/>
3
- (by Twitter's V2 API / OAuth 2.0 with PCKE)
3
+ (by OAuth 2.0 with PCKE)
4
4
 
5
5
  ## Getting Started
6
6
 
@@ -19,7 +19,7 @@ require 'twitter_tweet_bot'
19
19
  TwitterTweetBot.post_tweet(<ACEESS_TOKEN>, 'Yeah!')
20
20
  ```
21
21
 
22
- 1. Congiuration
22
+ 1. Configuration
23
23
  2. Issue Authorization URL
24
24
  3. Go to Authorization URL
25
25
  4. Fetch Access Token
@@ -29,7 +29,7 @@ TwitterTweetBot.post_tweet(<ACEESS_TOKEN>, 'Yeah!')
29
29
 
30
30
  <summary>Details</summary>
31
31
 
32
- #### Step1. Congiuration
32
+ #### Step1. Configuration
33
33
 
34
34
  ```rb
35
35
  require 'twitter_tweet_bot'
@@ -44,14 +44,14 @@ TwitterTweetBot.configure do |config|
44
44
  # Redirect URL After Authorization
45
45
  config.redirect_uri = 'https://example.com/twitter/callback'
46
46
  # Twitter's App Scopes with OAuth 2.0
47
- config.scopes = ['tweet.read', 'tweet.write', 'users.read', 'offline.access']
47
+ config.scopes = %w[tweet.read tweet.write users.read offline.access]
48
48
  end
49
49
  ```
50
50
 
51
51
  #### Step2. Issue an authorization url
52
52
 
53
53
  ```rb
54
- authorization = TwitterTweetBot.authorization
54
+ authorization = TwitterTweetBot.authorize
55
55
  # =>
56
56
  # #<TwitterTweetBot::Entity::Authorization
57
57
  # @code_verifier="*****",
@@ -59,7 +59,7 @@ authorization = TwitterTweetBot.authorization
59
59
  # @url="https://twitter.com/i/oauth2/authorize?response_type=code&redirect_uri=<YOUR_REDIRECT_URI>&client_id=<YOUR_CLIENT_ID>&scope=<SCOPES>&code_challenge=*****&code_challenge_method=S256&state=***">
60
60
  ```
61
61
 
62
- #### Step3. Rerirect (or Go) to `authorization.url`
62
+ #### Step3. Redirect (or Go) to `authorization.url`
63
63
 
64
64
  And smash `"Authorize app"`.
65
65
 
@@ -94,7 +94,15 @@ TwitterTweetBot.post_tweet(token.access_token, 'Yeah!')
94
94
  # @text="Yeah!">
95
95
  ```
96
96
 
97
- #### Ex. Restore an access token (required `'offline.access'` in scopes)
97
+ ##### With [some params](https://developer.twitter.com/en/docs/twitter-api/tweets/manage-tweets/api-reference/post-tweets)
98
+
99
+ ```rb
100
+ TwitterTweetBot.post_tweet(token.access_token, 'Yeah! Yeah!') do |params|
101
+ params.reply = { in_reply_to_tweet_id: '*******************' }
102
+ end
103
+ ```
104
+
105
+ #### Ex. Refresh an access token (required `'offline.access'` in scopes)
98
106
 
99
107
  ```rb
100
108
  TwitterTweetBot.refresh_token(token.refresh_token)
@@ -122,10 +130,10 @@ TwitterTweetBot.post_tweet('Yeah!')
122
130
 
123
131
  <summary>Details</summary>
124
132
 
125
- #### Step1. Congiuration
133
+ #### Step1. Configuration
126
134
 
127
135
  ```rb
128
- require 'twitter_tweet_bot'
136
+ require 'twitter_tweet_bot/cache'
129
137
 
130
138
  TwitterTweetBot.configure do |config|
131
139
  # ...
@@ -139,7 +147,7 @@ end
139
147
 
140
148
  ```rb
141
149
  # `code_verifier` and `state` will be cached.
142
- TwitterTweetBot.authorization
150
+ TwitterTweetBot.authorize
143
151
  ```
144
152
 
145
153
  #### Step3. Fetch an access token
@@ -52,9 +52,7 @@ module TwitterTweetBot
52
52
  end
53
53
 
54
54
  def headers
55
- basic_authorization_header(
56
- Base64.strict_encode64("#{client_id}:#{client_secret}")
57
- )
55
+ basic_authorization_header(client_id, client_secret)
58
56
  end
59
57
 
60
58
  private_constant :API_ENDPOTNT,
@@ -26,7 +26,7 @@ module TwitterTweetBot
26
26
  Base64.urlsafe_encode64(digest_by_sha256(verifier), padding: false)
27
27
  )
28
28
  else # 'plain'
29
- verifier
29
+ encode(verifier)
30
30
  end
31
31
  end
32
32
 
@@ -11,7 +11,7 @@ module TwitterTweetBot
11
11
  AUTH_URL = 'https://twitter.com/i/oauth2/authorize'.freeze
12
12
  RESPONSE_TYPE = 'code'.freeze
13
13
 
14
- def self.authorization(
14
+ def self.authorize(
15
15
  client_id:,
16
16
  redirect_uri:,
17
17
  scopes:,
@@ -21,7 +21,7 @@ module TwitterTweetBot
21
21
  **
22
22
  )
23
23
  new(client_id, redirect_uri, scopes)
24
- .authorization(code_verifier, code_challenge_method, state)
24
+ .authorize(code_verifier, code_challenge_method, state)
25
25
  end
26
26
 
27
27
  def initialize(client_id, redirect_uri, scopes)
@@ -30,14 +30,14 @@ module TwitterTweetBot
30
30
  @scopes = scopes
31
31
  end
32
32
 
33
- def authorization(code_verifier, code_challenge_method, state)
33
+ def authorize(code_verifier, code_challenge_method, state)
34
34
  secure_code = Authorization::SecureCode.new(
35
35
  code_verifier: code_verifier,
36
36
  code_challenge_method: code_challenge_method,
37
37
  state: state
38
38
  )
39
39
  uri = build_uri(AUTH_URL, build_body(secure_code))
40
- return as_hash(uri.to_s, secure_code)
40
+ as_hash(uri.to_s, secure_code)
41
41
  end
42
42
 
43
43
  private
@@ -3,15 +3,14 @@ module TwitterTweetBot
3
3
  module HTTP
4
4
  module Error
5
5
  class RequestFaild < StandardError
6
- attr_reader :code, :body
7
-
8
6
  def initialize(code, body)
9
- @code = code
10
- @body = body
7
+ super(format_message(code, body))
11
8
  end
12
9
 
13
- def inspect
14
- "#<#{self.class} #{code} #{body}>"
10
+ private
11
+
12
+ def format_message(code, body)
13
+ [code, body].join("\n")
15
14
  end
16
15
  end
17
16
 
@@ -1,3 +1,4 @@
1
+ require 'base64'
1
2
  require 'uri'
2
3
  require 'net/http'
3
4
 
@@ -8,13 +9,24 @@ module TwitterTweetBot
8
9
  BASIC_AUTHORIZATION = 'Basic %<credentials>s'.freeze
9
10
  BEARER_AUTHORIZATION = 'Bearer %<credentials>s'.freeze
10
11
 
11
- def basic_authorization_header(credentials)
12
- { authorization: format(BASIC_AUTHORIZATION, credentials: credentials) }
12
+ def basic_authorization_header(user, password)
13
+ {
14
+ authorization: format(
15
+ BASIC_AUTHORIZATION,
16
+ credentials: authorization_credentials(user, password)
17
+ )
18
+ }
13
19
  end
14
20
 
15
21
  def bearer_authorization_header(credentials)
16
22
  { authorization: format(BEARER_AUTHORIZATION, credentials: credentials) }
17
23
  end
24
+
25
+ private
26
+
27
+ def authorization_credentials(user, password)
28
+ Base64.strict_encode64("#{user}:#{password}")
29
+ end
18
30
  end
19
31
  end
20
32
  end
@@ -9,8 +9,8 @@ module TwitterTweetBot
9
9
  module Post
10
10
  include Base
11
11
 
12
- JSON_CONTENT_TYPE = 'application/json'.freeze
13
12
  URLENCODED_CONTENT_TYPE = 'application/x-www-form-urlencoded; charset=UTF-8'.freeze
13
+ JSON_CONTENT_TYPE = 'application/json'.freeze
14
14
 
15
15
  def request_post_form(url, body, headers = {})
16
16
  request_post(
@@ -39,7 +39,7 @@ module TwitterTweetBot
39
39
  end
40
40
 
41
41
  private_constant :JSON_CONTENT_TYPE,
42
- :URLENCODED_CONTENT_TYPE
42
+ :URLENCODED_CONTENT_TYPE
43
43
  end
44
44
  end
45
45
  end
@@ -0,0 +1,13 @@
1
+ module TwitterTweetBot
2
+ module API
3
+ module Params
4
+ module BooleanParam
5
+ def self.build(key, value)
6
+ return {} unless value.is_a?(TrueClass) || value.is_a?(FalseClass)
7
+
8
+ { key => value }
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,21 @@
1
+ module TwitterTweetBot
2
+ module API
3
+ module Params
4
+ module CommaSeparatedParam
5
+ DELIMITER = ','.freeze
6
+
7
+ def self.build(key, value)
8
+ { key => formed_value(value) }
9
+ end
10
+
11
+ def self.formed_value(value)
12
+ return value unless value.is_a?(Array)
13
+
14
+ value.join(DELIMITER)
15
+ end
16
+
17
+ private_constant :DELIMITER
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,13 @@
1
+ module TwitterTweetBot
2
+ module API
3
+ module Params
4
+ module HashParam
5
+ def self.build(key, value)
6
+ return {} unless value.is_a?(Hash)
7
+
8
+ { key => value }
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module TwitterTweetBot
2
+ module API
3
+ module Params
4
+ module StringParam
5
+ def self.build(key, value)
6
+ return {} unless value.is_a?(String)
7
+
8
+ { key => value }
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,53 @@
1
+ require 'twitter_tweet_bot/api/params/boolean_param'
2
+ require 'twitter_tweet_bot/api/params/string_param'
3
+ require 'twitter_tweet_bot/api/params/hash_param'
4
+
5
+ module TwitterTweetBot
6
+ module API
7
+ module Params
8
+ class TweetParams
9
+ private_class_method :new
10
+
11
+ # @yield [params]
12
+ # @yieldparam params [TwitterTweetBot::API::Params::TweetParams]
13
+ def self.build(&block)
14
+ new(&block).build
15
+ end
16
+
17
+ # @see https://developer.twitter.com/en/docs/twitter-api/tweets/manage-tweets/api-reference/post-tweets
18
+ AVAILABLE_PARAMS = {
19
+ for_super_followers_only: BooleanParam,
20
+ text: StringParam,
21
+ direct_message_deep_link: StringParam,
22
+ quote_tweet_id: StringParam,
23
+ reply_settings: StringParam,
24
+ geo: HashParam,
25
+ media: HashParam,
26
+ poll: HashParam,
27
+ reply: HashParam
28
+ }.freeze
29
+
30
+ # @yield [params]
31
+ # @yieldparam params [TwitterTweetBot::API::Params::TweetParams]
32
+ def initialize(&block)
33
+ block&.call(self)
34
+ end
35
+
36
+ def params
37
+ @params ||= {}
38
+ end
39
+ alias build params
40
+
41
+ private :params
42
+
43
+ AVAILABLE_PARAMS.each do |name, param_klass|
44
+ define_method("#{name}=") do |value|
45
+ params.merge!(param_klass.build(name, value))
46
+ end
47
+ end
48
+
49
+ private_constant :AVAILABLE_PARAMS
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,43 @@
1
+ require 'twitter_tweet_bot/api/params/comma_separated_param'
2
+ require 'twitter_tweet_bot/api/params/string_param'
3
+
4
+ module TwitterTweetBot
5
+ module API
6
+ module Params
7
+ class UsersMeParams
8
+ private_class_method :new
9
+
10
+ # @yield [params]
11
+ # @yieldparam params [TwitterTweetBot::API::Params::UsersMeParams]
12
+ def self.build(&block)
13
+ new(&block).build
14
+ end
15
+
16
+ # @yield [params]
17
+ # @yieldparam params [TwitterTweetBot::API::Params::UsersMeParams]
18
+ def initialize(&block)
19
+ block&.call(self)
20
+ end
21
+
22
+ def params
23
+ @params ||= {}
24
+ end
25
+ alias build params
26
+
27
+ def expansions=(value)
28
+ params.merge!(StringParam.build('expansions', value))
29
+ end
30
+
31
+ def tweet_fields=(value)
32
+ params.merge!(CommaSeparatedParam.build('tweet.fields', value))
33
+ end
34
+
35
+ def user_fields=(value)
36
+ params.merge!(CommaSeparatedParam.build('user.fields', value))
37
+ end
38
+
39
+ private :params
40
+ end
41
+ end
42
+ end
43
+ end
@@ -1,4 +1,3 @@
1
- require 'base64'
2
1
  require 'twitter_tweet_bot/api/http'
3
2
 
4
3
  module TwitterTweetBot
@@ -43,9 +42,7 @@ module TwitterTweetBot
43
42
  end
44
43
 
45
44
  def headers
46
- basic_authorization_header(
47
- Base64.strict_encode64("#{client_id}:#{client_secret}")
48
- )
45
+ basic_authorization_header(client_id, client_secret)
49
46
  end
50
47
 
51
48
  private_constant :API_ENDPOTNT,
@@ -1,4 +1,5 @@
1
1
  require 'twitter_tweet_bot/api/http'
2
+ require 'twitter_tweet_bot/api/params/tweet_params'
2
3
 
3
4
  module TwitterTweetBot
4
5
  module API
@@ -9,19 +10,28 @@ module TwitterTweetBot
9
10
 
10
11
  API_ENDPOTNT = 'https://api.twitter.com/2/tweets'.freeze
11
12
 
12
- def self.post(access_token:, text:, **)
13
- new(access_token).post(text)
13
+ # @param [String] access_token
14
+ # @param [String] text
15
+ # @yield [params]
16
+ # @yieldparam params [TwitterTweetBot::API::Params::TweetParams]
17
+ def self.post(access_token:, text:, **, &block)
18
+ new(access_token).post(
19
+ Params::TweetParams.build do |params|
20
+ params.text = text
21
+ block&.call(params)
22
+ end
23
+ )
14
24
  end
15
25
 
16
26
  def initialize(access_token)
17
27
  @access_token = access_token
18
28
  end
19
29
 
20
- def post(text)
30
+ def post(params)
21
31
  request(
22
32
  :post_json,
23
33
  API_ENDPOTNT,
24
- { text: text },
34
+ params,
25
35
  bearer_authorization_header(access_token)
26
36
  )
27
37
  end
@@ -1,4 +1,5 @@
1
1
  require 'twitter_tweet_bot/api/http'
2
+ require 'twitter_tweet_bot/api/params/users_me_params'
2
3
 
3
4
  module TwitterTweetBot
4
5
  module API
@@ -9,19 +10,24 @@ module TwitterTweetBot
9
10
 
10
11
  API_ENDPOTNT = 'https://api.twitter.com/2/users/me'.freeze
11
12
 
12
- def self.fetch(access_token:, fields:, **)
13
- new(access_token).fetch(fields)
13
+ # @param [String] access_token
14
+ # @yield [params]
15
+ # @yieldparam params [TwitterTweetBot::API::Params::UsersMeParams]
16
+ def self.fetch(access_token:, **, &block)
17
+ new(access_token).fetch(
18
+ Params::UsersMeParams.build(&block)
19
+ )
14
20
  end
15
21
 
16
22
  def initialize(access_token)
17
23
  @access_token = access_token
18
24
  end
19
25
 
20
- def fetch(fields)
26
+ def fetch(params)
21
27
  request(
22
28
  :get,
23
29
  API_ENDPOTNT,
24
- fields,
30
+ params,
25
31
  bearer_authorization_header(access_token)
26
32
  )
27
33
  end
@@ -7,7 +7,7 @@ module TwitterTweetBot
7
7
 
8
8
  def with_cache(&block)
9
9
  current_cache = read_cache
10
- result = yield(current_cache)
10
+ result = block.call(current_cache)
11
11
  write_cache(current_cache, result)
12
12
 
13
13
  result
@@ -25,6 +25,7 @@ module TwitterTweetBot
25
25
 
26
26
  def to_cache_object(object)
27
27
  return {} unless object.respond_to?(:to_cache)
28
+
28
29
  object.to_cache
29
30
  end
30
31
  end
@@ -5,7 +5,7 @@ module TwitterTweetBot
5
5
  module ClientExt
6
6
  include Caching
7
7
 
8
- def authorization(*)
8
+ def authorize(*)
9
9
  with_cache { super }
10
10
  end
11
11
 
@@ -2,8 +2,9 @@ require 'twitter_tweet_bot/cache/store'
2
2
 
3
3
  module TwitterTweetBot
4
4
  module Cache
5
- module ConfigrationExt
6
- attr_accessor :cache_provider, :cache
5
+ module ConfigurationExt
6
+ attr_accessor :cache_provider
7
+ attr_writer :cache
7
8
 
8
9
  def initialize(cache_provider: nil, **kwargs)
9
10
  @cache_provider = cache_provider
@@ -15,14 +15,13 @@ module TwitterTweetBot
15
15
  end
16
16
 
17
17
  def to_cache
18
- cache_fields.reduce({}) do |hash, cache_field|
18
+ cache_fields.each_with_object({}) do |cache_field, hash|
19
19
  next hash unless respond_to?(cache_field)
20
20
 
21
21
  value = send(cache_field)
22
22
  next hash if value.nil?
23
- hash[cache_field] = value
24
23
 
25
- hash
24
+ hash[cache_field] = value
26
25
  end
27
26
  end
28
27
  end
@@ -32,6 +32,7 @@ module TwitterTweetBot
32
32
 
33
33
  def deserialize_value(value)
34
34
  return {} if value.nil?
35
+
35
36
  JSON.parse(value, symbolize_names: true)
36
37
  end
37
38
 
@@ -6,7 +6,7 @@ require 'twitter_tweet_bot/cache/entity_ext'
6
6
 
7
7
  module TwitterTweetBot
8
8
  Client.prepend(Cache::ClientExt)
9
- Configration.prepend(Cache::ConfigrationExt)
9
+ Configuration.prepend(Cache::ConfigurationExt)
10
10
 
11
11
  Entity::Authorization.include(Cache::EntityExt::Authorization)
12
12
  Entity::Token.include(Cache::EntityExt::Token)
@@ -3,8 +3,8 @@ require 'twitter_tweet_bot/api'
3
3
  module TwitterTweetBot
4
4
  class Client
5
5
  module API
6
- def authorization(code_verifier = nil, code_challenge_method = nil, state = nil)
7
- TwitterTweetBot::API::Authorization.authorization(
6
+ def authorize(code_verifier = nil, code_challenge_method = nil, state = nil)
7
+ TwitterTweetBot::API::Authorization.authorize(
8
8
  **params_with_config(
9
9
  code_verifier: code_verifier,
10
10
  code_challenge_method: code_challenge_method,
@@ -28,15 +28,15 @@ module TwitterTweetBot
28
28
  )
29
29
  end
30
30
 
31
- def post_tweet(access_token, text)
31
+ def post_tweet(access_token, text, &block)
32
32
  TwitterTweetBot::API::Tweet.post(
33
- **params_with_config(access_token: access_token, text: text)
33
+ **params_with_config(access_token: access_token, text: text), &block
34
34
  )
35
35
  end
36
36
 
37
- def users_me(access_token, fields = {})
37
+ def users_me(access_token, &block)
38
38
  TwitterTweetBot::API::UsersMe.fetch(
39
- **params_with_config(access_token: access_token, fields: fields)
39
+ **params_with_config(access_token: access_token), &block
40
40
  )
41
41
  end
42
42
 
@@ -4,7 +4,7 @@ require 'twitter_tweet_bot/entity'
4
4
  module TwitterTweetBot
5
5
  class Client
6
6
  module Entity
7
- def authorization(*)
7
+ def authorize(*)
8
8
  with_entity(TwitterTweetBot::Entity::Authorization) { super }
9
9
  end
10
10
 
@@ -27,7 +27,7 @@ module TwitterTweetBot
27
27
  private
28
28
 
29
29
  def with_entity(entity_klass, &block)
30
- entity_klass.new(yield)
30
+ entity_klass.build(block.call)
31
31
  end
32
32
 
33
33
  def parse_json(body)
@@ -1,5 +1,5 @@
1
1
  module TwitterTweetBot
2
- class Configration
2
+ class Configuration
3
3
  attr_accessor :name,
4
4
  :client_id,
5
5
  :client_secret,
@@ -23,9 +23,8 @@ module TwitterTweetBot
23
23
  end
24
24
 
25
25
  def to_hash
26
- instance_variables.reduce({}) do |hash, key|
26
+ instance_variables.each_with_object({}) do |key, hash|
27
27
  hash[key[1..].to_sym] = instance_variable_get(key)
28
- hash
29
28
  end
30
29
  end
31
30
  end
@@ -7,24 +7,28 @@ module TwitterTweetBot
7
7
  extend ActiveSupport::Concern
8
8
 
9
9
  class_methods do
10
+ # @param [Array] fields
10
11
  def act_as_entity(*fields)
11
12
  class_attribute :fields,
12
13
  instance_writer: false,
13
14
  default: fields
14
15
 
15
- attr_reader(*fields)
16
- end
17
- end
16
+ attr_reader :raw
18
17
 
19
- def initialize(json)
20
- set_fields!(Hash(json))
21
- end
18
+ fields.each do |field|
19
+ define_method(field) { target_fields[field] }
20
+ end
22
21
 
23
- private
22
+ # @param [Hash] hash
23
+ define_method(:initialize) { |hash| @raw = Hash(hash) }
24
+
25
+ define_method(:target_fields) { raw }
26
+ private :target_fields
27
+ end
24
28
 
25
- def set_fields!(hash)
26
- fields.each do |field|
27
- instance_variable_set(:"@#{field}", hash[field])
29
+ # @param [Hash] hash
30
+ def build(hash)
31
+ new(hash)
28
32
  end
29
33
  end
30
34
  end
@@ -11,8 +11,10 @@ module TwitterTweetBot
11
11
  :edit_history_tweet_ids
12
12
  )
13
13
 
14
- def initialize(data)
15
- super Hash(data)[:data]
14
+ private
15
+
16
+ def target_fields
17
+ Hash(raw[:data])
16
18
  end
17
19
  end
18
20
  end
@@ -1,4 +1,3 @@
1
-
2
1
  require 'twitter_tweet_bot/entity/base'
3
2
 
4
3
  module TwitterTweetBot
@@ -12,8 +11,10 @@ module TwitterTweetBot
12
11
  :username
13
12
  )
14
13
 
15
- def initialize(data)
16
- super Hash(data)[:data]
14
+ private
15
+
16
+ def target_fields
17
+ Hash(raw[:data])
17
18
  end
18
19
  end
19
20
  end
@@ -1,3 +1,7 @@
1
1
  module TwitterTweetBot
2
- VERSION = '1.0.0'.freeze
2
+ module Version
3
+ def self.current
4
+ Gem::Version.new('1.2.0')
5
+ end
6
+ end
3
7
  end
@@ -1,25 +1,25 @@
1
1
  require 'twitter_tweet_bot/client'
2
- require 'twitter_tweet_bot/configration'
2
+ require 'twitter_tweet_bot/configuration'
3
3
  require 'twitter_tweet_bot/version'
4
4
 
5
5
  require 'active_support/core_ext/module/attribute_accessors'
6
6
  require 'active_support/core_ext/module/delegation'
7
7
 
8
8
  module TwitterTweetBot
9
- NoConfigrationError = Class.new(StandardError).freeze
9
+ NoConfigurationError = Class.new(StandardError).freeze
10
10
 
11
11
  mattr_accessor :default_config
12
12
 
13
13
  class << self
14
14
  def configure(&block)
15
- self.default_config = Configration.new(&block)
15
+ self.default_config = Configuration.new(&block)
16
16
  end
17
17
 
18
18
  def client(config = nil)
19
19
  Client.new(config || default_config!)
20
20
  end
21
21
 
22
- delegate :authorization,
22
+ delegate :authorize,
23
23
  :fetch_token,
24
24
  :refresh_token,
25
25
  :post_tweet,
@@ -29,7 +29,7 @@ module TwitterTweetBot
29
29
  private
30
30
 
31
31
  def default_config!
32
- default_config or raise NoConfigrationError
32
+ default_config or raise NoConfigurationError
33
33
  end
34
34
  end
35
35
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: twitter_tweet_bot
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - SongCastle
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-05-14 00:00:00.000000000 Z
11
+ date: 2023-07-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -42,6 +42,12 @@ files:
42
42
  - lib/twitter_tweet_bot/api/http/get.rb
43
43
  - lib/twitter_tweet_bot/api/http/headers.rb
44
44
  - lib/twitter_tweet_bot/api/http/post.rb
45
+ - lib/twitter_tweet_bot/api/params/boolean_param.rb
46
+ - lib/twitter_tweet_bot/api/params/comma_separated_param.rb
47
+ - lib/twitter_tweet_bot/api/params/hash_param.rb
48
+ - lib/twitter_tweet_bot/api/params/string_param.rb
49
+ - lib/twitter_tweet_bot/api/params/tweet_params.rb
50
+ - lib/twitter_tweet_bot/api/params/users_me_params.rb
45
51
  - lib/twitter_tweet_bot/api/refresh_token.rb
46
52
  - lib/twitter_tweet_bot/api/tweet.rb
47
53
  - lib/twitter_tweet_bot/api/users_me.rb
@@ -57,7 +63,7 @@ files:
57
63
  - lib/twitter_tweet_bot/client.rb
58
64
  - lib/twitter_tweet_bot/client/api.rb
59
65
  - lib/twitter_tweet_bot/client/entity.rb
60
- - lib/twitter_tweet_bot/configration.rb
66
+ - lib/twitter_tweet_bot/configuration.rb
61
67
  - lib/twitter_tweet_bot/entity.rb
62
68
  - lib/twitter_tweet_bot/entity/authorization.rb
63
69
  - lib/twitter_tweet_bot/entity/base.rb