twitter_friendly 0.2.1 → 0.3.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.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/twitter_friendly/cache.rb +10 -13
- data/lib/twitter_friendly/cache_key.rb +12 -3
- data/lib/twitter_friendly/caching_and_logging.rb +73 -0
- data/lib/twitter_friendly/client.rb +12 -3
- data/lib/twitter_friendly/log_subscriber.rb +43 -34
- data/lib/twitter_friendly/rest/api.rb +7 -2
- data/lib/twitter_friendly/rest/base.rb +16 -16
- data/lib/twitter_friendly/rest/collector.rb +25 -23
- data/lib/twitter_friendly/rest/extension/clusters.rb +313 -0
- data/lib/twitter_friendly/rest/extension/timelines.rb +129 -0
- data/lib/twitter_friendly/rest/favorites.rb +4 -5
- data/lib/twitter_friendly/rest/friends_and_followers.rb +37 -18
- data/lib/twitter_friendly/rest/lists.rb +22 -6
- data/lib/twitter_friendly/rest/parallel.rb +12 -7
- data/lib/twitter_friendly/rest/search.rb +5 -6
- data/lib/twitter_friendly/rest/timelines.rb +16 -5
- data/lib/twitter_friendly/rest/tweets.rb +11 -2
- data/lib/twitter_friendly/rest/users.rb +45 -7
- data/lib/twitter_friendly/rest/utils.rb +6 -0
- data/lib/twitter_friendly/utils.rb +15 -2
- data/lib/twitter_friendly/version.rb +1 -1
- metadata +5 -3
- data/lib/twitter_friendly/caching.rb +0 -86
@@ -4,9 +4,18 @@ module TwitterFriendly
|
|
4
4
|
|
5
5
|
MAX_IDS_PER_REQUEST = 100
|
6
6
|
|
7
|
+
# @return [Hash]
|
8
|
+
#
|
9
|
+
# @overload retweeters_ids(tweet, options = {})
|
10
|
+
#
|
11
|
+
# @param user [Integer, String] A Twitter user ID or screen name.
|
12
|
+
#
|
13
|
+
# @option options [Integer] :count The number of tweets to return per page, up to a maximum of 5000.
|
7
14
|
def retweeters_ids(*args)
|
8
|
-
|
9
|
-
|
15
|
+
# このメソッドではページングができない
|
16
|
+
options = {count: MAX_IDS_PER_REQUEST}.merge(args.extract_options!)
|
17
|
+
push_operations(options, __method__)
|
18
|
+
fetch_resources_with_cursor(__method__, args[0], options)
|
10
19
|
end
|
11
20
|
end
|
12
21
|
end
|
@@ -2,29 +2,67 @@ module TwitterFriendly
|
|
2
2
|
module REST
|
3
3
|
module Users
|
4
4
|
def verify_credentials(options = {})
|
5
|
-
@twitter.
|
5
|
+
@twitter.verify_credentials({skip_status: true}.merge(options))&.to_hash
|
6
6
|
end
|
7
7
|
|
8
|
-
def user?(
|
9
|
-
@twitter.
|
8
|
+
def user?(user, options = {})
|
9
|
+
@twitter.user?(user, options)
|
10
10
|
end
|
11
11
|
|
12
12
|
def user(*args)
|
13
|
-
@twitter.
|
13
|
+
@twitter.user(*args)&.to_hash
|
14
14
|
end
|
15
15
|
|
16
16
|
MAX_USERS_PER_REQUEST = 100
|
17
17
|
|
18
18
|
def users(values, options = {})
|
19
19
|
if values.size <= MAX_USERS_PER_REQUEST
|
20
|
-
|
20
|
+
key = CacheKey.gen(__method__, values, options.merge(hash: credentials_hash))
|
21
|
+
|
22
|
+
@cache.fetch(key, args: [__method__, options]) do
|
23
|
+
Instrumenter.perform_request(args: [__method__, super_operation: options[:super_operation]]) do
|
24
|
+
@twitter.send(__method__, values, options.except(:parallel, :super_operation, :recursive))&.compact&.map(&:to_hash)
|
25
|
+
end
|
26
|
+
end
|
21
27
|
else
|
28
|
+
options[:recursive] = true
|
22
29
|
_users(values, options)
|
23
30
|
end
|
24
31
|
end
|
25
32
|
|
26
33
|
def blocked_ids(*args)
|
27
|
-
@twitter.
|
34
|
+
@twitter.blocked_ids(*args)&.attrs&.fetch(:ids)
|
35
|
+
end
|
36
|
+
|
37
|
+
module Instrumenter
|
38
|
+
|
39
|
+
module_function
|
40
|
+
|
41
|
+
# 他のメソッドと違い再帰的に呼ばれるため、全体をキャッシュすると、すべてを再帰的にキャッシュしてしまう。
|
42
|
+
# それを防ぐために、特別にここでキャッシュの処理を登録している。
|
43
|
+
|
44
|
+
def perform_request(options, &block)
|
45
|
+
payload = {operation: 'request', args: options[:args]}
|
46
|
+
::ActiveSupport::Notifications.instrument('request.twitter_friendly', payload) { yield(payload) }
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
module Caching
|
51
|
+
%i(
|
52
|
+
users
|
53
|
+
).each do |name|
|
54
|
+
define_method(name) do |*args, &block|
|
55
|
+
options = args.extract_options!
|
56
|
+
do_request = Proc.new { options.empty? ? super(*args, &block) : super(*args, options, &block) }
|
57
|
+
|
58
|
+
if options[:recursive]
|
59
|
+
do_request.call
|
60
|
+
else
|
61
|
+
TwitterFriendly::CachingAndLogging::Instrumenter.start_processing(name, options)
|
62
|
+
TwitterFriendly::CachingAndLogging::Instrumenter.complete_processing(name, options, &do_request)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
28
66
|
end
|
29
67
|
|
30
68
|
private
|
@@ -40,7 +78,7 @@ module TwitterFriendly
|
|
40
78
|
end.flatten
|
41
79
|
else
|
42
80
|
values.each_slice(MAX_USERS_PER_REQUEST).map do |targets|
|
43
|
-
|
81
|
+
users(targets, options)
|
44
82
|
end
|
45
83
|
end&.flatten&.compact&.map(&:to_hash)
|
46
84
|
end
|
@@ -6,6 +6,12 @@ module TwitterFriendly
|
|
6
6
|
def credentials_hash
|
7
7
|
Digest::MD5.hexdigest(access_token + access_token_secret + consumer_key + consumer_secret)
|
8
8
|
end
|
9
|
+
|
10
|
+
def push_operations(options, operation)
|
11
|
+
options[:super_operation] = [] unless options[:super_operation]
|
12
|
+
options[:super_operation] = [options[:super_operation]] unless options[:super_operation].is_a?(Array)
|
13
|
+
options[:super_operation].prepend operation
|
14
|
+
end
|
9
15
|
end
|
10
16
|
end
|
11
17
|
end
|
@@ -1,6 +1,19 @@
|
|
1
1
|
module TwitterFriendly
|
2
|
-
|
3
|
-
|
2
|
+
module Utils
|
3
|
+
def uid_or_screen_name?(object)
|
4
|
+
raise NotImplementedError.new("You must implement ##{__method__}.")
|
5
|
+
object.kind_of?(String) || object.kind_of?(Integer)
|
6
|
+
end
|
7
|
+
|
8
|
+
def authenticating_user?(target)
|
9
|
+
raise NotImplementedError.new("You must implement ##{__method__}.")
|
10
|
+
user.id.to_i == user(target).id.to_i
|
11
|
+
end
|
12
|
+
|
13
|
+
def authorized_user?(target)
|
14
|
+
raise NotImplementedError.new("You must implement ##{__method__}.")
|
15
|
+
target_user = user(target)
|
16
|
+
!target_user.protected? || friendship?(user.id.to_i, target_user.id.to_i)
|
4
17
|
end
|
5
18
|
end
|
6
19
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: twitter_friendly
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ts-3156
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-01-
|
11
|
+
date: 2019-01-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -180,7 +180,7 @@ files:
|
|
180
180
|
- lib/twitter_friendly.rb
|
181
181
|
- lib/twitter_friendly/cache.rb
|
182
182
|
- lib/twitter_friendly/cache_key.rb
|
183
|
-
- lib/twitter_friendly/
|
183
|
+
- lib/twitter_friendly/caching_and_logging.rb
|
184
184
|
- lib/twitter_friendly/client.rb
|
185
185
|
- lib/twitter_friendly/log_subscriber.rb
|
186
186
|
- lib/twitter_friendly/logger.rb
|
@@ -188,6 +188,8 @@ files:
|
|
188
188
|
- lib/twitter_friendly/rest/api.rb
|
189
189
|
- lib/twitter_friendly/rest/base.rb
|
190
190
|
- lib/twitter_friendly/rest/collector.rb
|
191
|
+
- lib/twitter_friendly/rest/extension/clusters.rb
|
192
|
+
- lib/twitter_friendly/rest/extension/timelines.rb
|
191
193
|
- lib/twitter_friendly/rest/favorites.rb
|
192
194
|
- lib/twitter_friendly/rest/friends_and_followers.rb
|
193
195
|
- lib/twitter_friendly/rest/lists.rb
|
@@ -1,86 +0,0 @@
|
|
1
|
-
module TwitterFriendly
|
2
|
-
module Caching
|
3
|
-
%i(
|
4
|
-
verify_credentials
|
5
|
-
user?
|
6
|
-
user
|
7
|
-
users
|
8
|
-
blocked_ids
|
9
|
-
friendship?
|
10
|
-
).each do |name|
|
11
|
-
define_method(name) do |*args|
|
12
|
-
options = args.extract_options!
|
13
|
-
Instrumenter.start_processing(name, options)
|
14
|
-
|
15
|
-
Instrumenter.complete_processing(name, options) do
|
16
|
-
do_request =
|
17
|
-
Proc.new {Instrumenter.perform_request(name, options) {options.empty? ? super(*args) : super(*args, options)}}
|
18
|
-
|
19
|
-
if Utils.cache_disabled?(options)
|
20
|
-
do_request.call
|
21
|
-
else
|
22
|
-
user = (name == :friendship?) ? args[0, 2] : args[0]
|
23
|
-
@cache.fetch(name, user, options.merge(args: [name, options], hash: credentials_hash), &do_request)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
# これらのメソッドは、内部で呼ぶメソッドをキャッシュするため、
|
30
|
-
# 全体をキャッシュすることはない。
|
31
|
-
%i(
|
32
|
-
friend_ids
|
33
|
-
follower_ids
|
34
|
-
friends
|
35
|
-
followers
|
36
|
-
friend_ids_and_follower_ids
|
37
|
-
friends_and_followers
|
38
|
-
search
|
39
|
-
favorites
|
40
|
-
home_timeline
|
41
|
-
user_timeline
|
42
|
-
mentions_timeline
|
43
|
-
memberships
|
44
|
-
list_members
|
45
|
-
retweeters_ids
|
46
|
-
).each do |name|
|
47
|
-
define_method(name) do |*args|
|
48
|
-
options = args.extract_options!
|
49
|
-
Instrumenter.start_processing(name, options)
|
50
|
-
|
51
|
-
Instrumenter.complete_processing(name, options) do
|
52
|
-
options.empty? ? super(*args) : super(*args, options)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
module Instrumenter
|
58
|
-
|
59
|
-
module_function
|
60
|
-
|
61
|
-
def start_processing(operation, options)
|
62
|
-
payload = {operation: operation}.merge(options)
|
63
|
-
::ActiveSupport::Notifications.instrument('start_processing.twitter_friendly', payload) {}
|
64
|
-
end
|
65
|
-
|
66
|
-
def complete_processing(operation, options)
|
67
|
-
payload = {operation: operation}.merge(options)
|
68
|
-
::ActiveSupport::Notifications.instrument('complete_processing.twitter_friendly', payload) { yield(payload) }
|
69
|
-
end
|
70
|
-
|
71
|
-
def perform_request(caller, options, &block)
|
72
|
-
payload = {operation: 'request', args: [caller, options]}
|
73
|
-
::ActiveSupport::Notifications.instrument('request.twitter_friendly', payload) { yield(payload) }
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
module Utils
|
78
|
-
|
79
|
-
module_function
|
80
|
-
|
81
|
-
def cache_disabled?(options)
|
82
|
-
options.is_a?(Hash) && options.has_key?(:cache) && !options[:cache]
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|