twitter 5.5.1 → 5.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CHANGELOG.md +12 -0
- data/README.md +8 -10
- data/lib/twitter/base.rb +4 -2
- data/lib/twitter/client.rb +7 -5
- data/lib/twitter/configuration.rb +1 -1
- data/lib/twitter/cursor.rb +18 -17
- data/lib/twitter/entities.rb +27 -1
- data/lib/twitter/error.rb +1 -1
- data/lib/twitter/error/request_timeout.rb +10 -0
- data/lib/twitter/geo_results.rb +5 -3
- data/lib/twitter/media/photo.rb +1 -1
- data/lib/twitter/null_object.rb +8 -20
- data/lib/twitter/profile_banner.rb +1 -1
- data/lib/twitter/request.rb +47 -0
- data/lib/twitter/rest/api/direct_messages.rb +7 -5
- data/lib/twitter/rest/api/favorites.rb +7 -7
- data/lib/twitter/rest/api/friends_and_followers.rb +11 -9
- data/lib/twitter/rest/api/help.rb +4 -3
- data/lib/twitter/rest/api/lists.rb +9 -7
- data/lib/twitter/rest/api/oauth.rb +11 -5
- data/lib/twitter/rest/api/places_and_geo.rb +6 -5
- data/lib/twitter/rest/api/saved_searches.rb +8 -6
- data/lib/twitter/rest/api/search.rb +4 -10
- data/lib/twitter/rest/api/spam_reporting.rb +1 -0
- data/lib/twitter/rest/api/suggested_users.rb +4 -3
- data/lib/twitter/rest/api/timelines.rb +5 -4
- data/lib/twitter/rest/api/trends.rb +5 -4
- data/lib/twitter/rest/api/tweets.rb +19 -24
- data/lib/twitter/rest/api/users.rb +17 -16
- data/lib/twitter/rest/api/utils.rb +45 -73
- data/lib/twitter/rest/client.rb +34 -34
- data/lib/twitter/rest/request/multipart_with_file.rb +2 -0
- data/lib/twitter/rest/response/parse_json.rb +2 -0
- data/lib/twitter/rest/response/raise_error.rb +2 -0
- data/lib/twitter/search_results.rb +28 -60
- data/lib/twitter/streaming/client.rb +4 -4
- data/lib/twitter/suggestion.rb +1 -1
- data/lib/twitter/trend_results.rb +6 -4
- data/lib/twitter/tweet.rb +3 -3
- data/lib/twitter/user.rb +1 -1
- data/lib/twitter/utils.rb +18 -3
- data/lib/twitter/version.rb +2 -2
- data/spec/helper.rb +1 -1
- data/spec/twitter/error_spec.rb +1 -1
- data/spec/twitter/geo_factory_spec.rb +1 -1
- data/spec/twitter/identifiable_spec.rb +1 -1
- data/spec/twitter/media_factory_spec.rb +1 -1
- data/spec/twitter/rest/api/favorites_spec.rb +2 -2
- data/spec/twitter/rest/api/tweets_spec.rb +4 -4
- data/spec/twitter/rest/client_spec.rb +13 -25
- data/spec/twitter/tweet_spec.rb +69 -0
- data/twitter.gemspec +2 -1
- metadata +23 -15
- metadata.gz.sig +0 -0
- data/spec/twitter/null_object_spec.rb +0 -90
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'twitter/arguments'
|
2
|
+
require 'twitter/request'
|
2
3
|
require 'twitter/rest/api/utils'
|
3
4
|
require 'twitter/suggestion'
|
4
5
|
require 'twitter/user'
|
@@ -27,9 +28,9 @@ module Twitter
|
|
27
28
|
def suggestions(*args)
|
28
29
|
arguments = Twitter::Arguments.new(args)
|
29
30
|
if arguments.last
|
30
|
-
|
31
|
+
perform_with_object(:get, "/1.1/users/suggestions/#{arguments.pop}.json", arguments.options, Twitter::Suggestion)
|
31
32
|
else
|
32
|
-
|
33
|
+
perform_with_objects(:get, '/1.1/users/suggestions.json', arguments.options, Twitter::Suggestion)
|
33
34
|
end
|
34
35
|
end
|
35
36
|
|
@@ -42,7 +43,7 @@ module Twitter
|
|
42
43
|
# @param options [Hash] A customizable set of options.
|
43
44
|
# @return [Array<Twitter::User>]
|
44
45
|
def suggest_users(slug, options = {})
|
45
|
-
|
46
|
+
perform_with_objects(:get, "/1.1/users/suggestions/#{slug}/members.json", options, Twitter::User)
|
46
47
|
end
|
47
48
|
end
|
48
49
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'twitter/request'
|
1
2
|
require 'twitter/rest/api/utils'
|
2
3
|
require 'twitter/tweet'
|
3
4
|
require 'twitter/user'
|
@@ -24,7 +25,7 @@ module Twitter
|
|
24
25
|
# @option options [Integer] :count Specifies the number of records to retrieve. Must be less than or equal to 200.
|
25
26
|
# @option options [Boolean, String, Integer] :trim_user Each tweet returned in a timeline will include a user object with only the author's numerical ID when set to true, 't' or 1.
|
26
27
|
def mentions_timeline(options = {})
|
27
|
-
|
28
|
+
perform_with_objects(:get, '/1.1/statuses/mentions_timeline.json', options, Twitter::Tweet)
|
28
29
|
end
|
29
30
|
alias_method :mentions, :mentions_timeline
|
30
31
|
|
@@ -112,7 +113,7 @@ module Twitter
|
|
112
113
|
# @option options [Boolean, String, Integer] :contributor_details Specifies that the contributors element should be enhanced to include the screen_name of the contributor.
|
113
114
|
# @option options [Boolean, String, Integer] :include_entities The tweet entities node will be disincluded when set to false.
|
114
115
|
def home_timeline(options = {})
|
115
|
-
|
116
|
+
perform_with_objects(:get, '/1.1/statuses/home_timeline.json', options, Twitter::Tweet)
|
116
117
|
end
|
117
118
|
|
118
119
|
# Returns the 20 most recent retweets posted by users the authenticating user follow.
|
@@ -152,7 +153,7 @@ module Twitter
|
|
152
153
|
# @option options [Boolean, String, Integer] :include_entities The tweet entities node will be disincluded when set to false.
|
153
154
|
# @option options [Boolean, String, Integer] :include_user_entities The user entities node will be disincluded when set to false.
|
154
155
|
def retweets_of_me(options = {})
|
155
|
-
|
156
|
+
perform_with_objects(:get, '/1.1/statuses/retweets_of_me.json', options, Twitter::Tweet)
|
156
157
|
end
|
157
158
|
|
158
159
|
private
|
@@ -173,7 +174,7 @@ module Twitter
|
|
173
174
|
|
174
175
|
# @param count [Integer]
|
175
176
|
# @return [Array<Twitter::Tweet>]
|
176
|
-
def collect_with_count(count
|
177
|
+
def collect_with_count(count)
|
177
178
|
options = {}
|
178
179
|
options[:count] = MAX_TWEETS_PER_REQUEST
|
179
180
|
collect_with_max_id do |max_id|
|
@@ -1,5 +1,6 @@
|
|
1
|
-
require 'twitter/rest/api/utils'
|
2
1
|
require 'twitter/place'
|
2
|
+
require 'twitter/request'
|
3
|
+
require 'twitter/rest/api/utils'
|
3
4
|
require 'twitter/trend_results'
|
4
5
|
|
5
6
|
module Twitter
|
@@ -20,7 +21,7 @@ module Twitter
|
|
20
21
|
# @return [Array<Twitter::Trend>]
|
21
22
|
def trends(id = 1, options = {})
|
22
23
|
options[:id] = id
|
23
|
-
|
24
|
+
perform_with_object(:get, '/1.1/trends/place.json', options, Twitter::TrendResults)
|
24
25
|
end
|
25
26
|
alias_method :local_trends, :trends
|
26
27
|
alias_method :trends_place, :trends
|
@@ -34,7 +35,7 @@ module Twitter
|
|
34
35
|
# @param options [Hash] A customizable set of options.
|
35
36
|
# @return [Array<Twitter::Place>]
|
36
37
|
def trends_available(options = {})
|
37
|
-
|
38
|
+
perform_with_objects(:get, '/1.1/trends/available.json', options, Twitter::Place)
|
38
39
|
end
|
39
40
|
alias_method :trend_locations, :trends_available
|
40
41
|
|
@@ -49,7 +50,7 @@ module Twitter
|
|
49
50
|
# @option options [Float] :long If provided with a :lat option the available trend locations will be sorted by distance, nearest to furthest, to the co-ordinate pair. The valid ranges for longitude are -180.0 to +180.0 (East is positive) inclusive.
|
50
51
|
# @return [Array<Twitter::Place>]
|
51
52
|
def trends_closest(options = {})
|
52
|
-
|
53
|
+
perform_with_objects(:get, '/1.1/trends/closest.json', options, Twitter::Place)
|
53
54
|
end
|
54
55
|
end
|
55
56
|
end
|
@@ -3,6 +3,7 @@ require 'twitter/error/already_posted'
|
|
3
3
|
require 'twitter/error/already_retweeted'
|
4
4
|
require 'twitter/error/forbidden'
|
5
5
|
require 'twitter/oembed'
|
6
|
+
require 'twitter/request'
|
6
7
|
require 'twitter/rest/api/utils'
|
7
8
|
require 'twitter/tweet'
|
8
9
|
require 'twitter/utils'
|
@@ -12,6 +13,7 @@ module Twitter
|
|
12
13
|
module API
|
13
14
|
module Tweets
|
14
15
|
include Twitter::REST::API::Utils
|
16
|
+
include Twitter::Utils
|
15
17
|
|
16
18
|
# Returns up to 100 of the first retweets of a given tweet
|
17
19
|
#
|
@@ -25,8 +27,7 @@ module Twitter
|
|
25
27
|
# @option options [Integer] :count Specifies the number of records to retrieve. Must be less than or equal to 100.
|
26
28
|
# @option options [Boolean, String, Integer] :trim_user Each tweet returned in a timeline will include a user object with only the author's numerical ID when set to true, 't' or 1.
|
27
29
|
def retweets(tweet, options = {})
|
28
|
-
|
29
|
-
objects_from_response(Twitter::Tweet, :get, "/1.1/statuses/retweets/#{id}.json", options)
|
30
|
+
perform_with_objects(:get, "/1.1/statuses/retweets/#{extract_id(tweet)}.json", options, Twitter::Tweet)
|
30
31
|
end
|
31
32
|
|
32
33
|
# Show up to 100 users who retweeted the Tweet
|
@@ -43,8 +44,8 @@ module Twitter
|
|
43
44
|
# @option options [Boolean] :ids_only ('false') Only return user ids instead of full user objects.
|
44
45
|
def retweeters_of(tweet, options = {})
|
45
46
|
ids_only = !!options.delete(:ids_only)
|
46
|
-
retweeters = retweets(tweet, options).
|
47
|
-
ids_only ? retweeters.
|
47
|
+
retweeters = retweets(tweet, options).collect(&:user)
|
48
|
+
ids_only ? retweeters.collect(&:id) : retweeters
|
48
49
|
end
|
49
50
|
|
50
51
|
# Returns a Tweet
|
@@ -59,8 +60,7 @@ module Twitter
|
|
59
60
|
# @param options [Hash] A customizable set of options.
|
60
61
|
# @option options [Boolean, String, Integer] :trim_user Each tweet returned in a timeline will include a user object with only the author's numerical ID when set to true, 't' or 1.
|
61
62
|
def status(tweet, options = {})
|
62
|
-
|
63
|
-
object_from_response(Twitter::Tweet, :get, "/1.1/statuses/show/#{id}.json", options)
|
63
|
+
perform_with_object(:get, "/1.1/statuses/show/#{extract_id(tweet)}.json", options, Twitter::Tweet)
|
64
64
|
end
|
65
65
|
|
66
66
|
# Returns Tweets
|
@@ -123,7 +123,7 @@ module Twitter
|
|
123
123
|
hash = options.dup
|
124
124
|
hash[:in_reply_to_status_id] = hash.delete(:in_reply_to_status).id unless hash[:in_reply_to_status].nil?
|
125
125
|
hash[:place_id] = hash.delete(:place).woeid unless hash[:place].nil?
|
126
|
-
|
126
|
+
perform_with_object(:post, '/1.1/statuses/update.json', hash.merge(:status => status), Twitter::Tweet)
|
127
127
|
rescue Twitter::Error::Forbidden => error
|
128
128
|
handle_forbidden_error(Twitter::Error::AlreadyPosted, error)
|
129
129
|
end
|
@@ -143,10 +143,9 @@ module Twitter
|
|
143
143
|
# @option options [Boolean, String, Integer] :trim_user Each tweet returned in a timeline will include a user object with only the author's numerical ID when set to true, 't' or 1.
|
144
144
|
def retweet(*args)
|
145
145
|
arguments = Twitter::Arguments.new(args)
|
146
|
-
|
147
|
-
id = extract_id(tweet)
|
146
|
+
parallel_map(arguments) do |tweet|
|
148
147
|
begin
|
149
|
-
post_retweet(
|
148
|
+
post_retweet(extract_id(tweet), arguments.options)
|
150
149
|
rescue Twitter::Error::Forbidden => error
|
151
150
|
raise unless error.message == Twitter::Error::AlreadyRetweeted::MESSAGE
|
152
151
|
end
|
@@ -169,10 +168,9 @@ module Twitter
|
|
169
168
|
# @option options [Boolean, String, Integer] :trim_user Each tweet returned in a timeline will include a user object with only the author's numerical ID when set to true, 't' or 1.
|
170
169
|
def retweet!(*args)
|
171
170
|
arguments = Twitter::Arguments.new(args)
|
172
|
-
|
173
|
-
id = extract_id(tweet)
|
171
|
+
parallel_map(arguments) do |tweet|
|
174
172
|
begin
|
175
|
-
post_retweet(
|
173
|
+
post_retweet(extract_id(tweet), arguments.options)
|
176
174
|
rescue Twitter::Error::Forbidden => error
|
177
175
|
handle_forbidden_error(Twitter::Error::AlreadyRetweeted, error)
|
178
176
|
end
|
@@ -203,7 +201,7 @@ module Twitter
|
|
203
201
|
hash = options.dup
|
204
202
|
hash[:in_reply_to_status_id] = hash.delete(:in_reply_to_status).id unless hash[:in_reply_to_status].nil?
|
205
203
|
hash[:place_id] = hash.delete(:place).woeid unless hash[:place].nil?
|
206
|
-
|
204
|
+
perform_with_object(:post, '/1.1/statuses/update_with_media.json', hash.merge('media[]' => media, 'status' => status), Twitter::Tweet)
|
207
205
|
rescue Twitter::Error::Forbidden => error
|
208
206
|
handle_forbidden_error(Twitter::Error::AlreadyPosted, error)
|
209
207
|
end
|
@@ -226,7 +224,7 @@ module Twitter
|
|
226
224
|
# @option options [String] :lang Language code for the rendered embed. This will affect the text and localization of the rendered HTML.
|
227
225
|
def oembed(tweet, options = {})
|
228
226
|
options[:id] = extract_id(tweet)
|
229
|
-
|
227
|
+
perform_with_object(:get, '/1.1/statuses/oembed.json', options, Twitter::OEmbed)
|
230
228
|
end
|
231
229
|
|
232
230
|
# Returns oEmbeds for Tweets
|
@@ -250,9 +248,8 @@ module Twitter
|
|
250
248
|
# @option options [String] :lang Language code for the rendered embed. This will affect the text and localization of the rendered HTML.
|
251
249
|
def oembeds(*args)
|
252
250
|
arguments = Twitter::Arguments.new(args)
|
253
|
-
|
254
|
-
|
255
|
-
oembed(id, arguments.options)
|
251
|
+
parallel_map(arguments) do |tweet|
|
252
|
+
oembed(extract_id(tweet), arguments.options)
|
256
253
|
end
|
257
254
|
end
|
258
255
|
|
@@ -271,7 +268,7 @@ module Twitter
|
|
271
268
|
def retweeters_ids(*args)
|
272
269
|
arguments = Twitter::Arguments.new(args)
|
273
270
|
arguments.options[:id] ||= extract_id(arguments.first)
|
274
|
-
|
271
|
+
perform_with_cursor(:get, '/1.1/statuses/retweeters/ids.json', arguments.options, :ids)
|
275
272
|
end
|
276
273
|
|
277
274
|
private
|
@@ -282,15 +279,13 @@ module Twitter
|
|
282
279
|
# @return [Array<Twitter::Tweet>]
|
283
280
|
def parallel_tweets_from_response(request_method, path, args)
|
284
281
|
arguments = Twitter::Arguments.new(args)
|
285
|
-
|
286
|
-
|
287
|
-
object_from_response(Twitter::Tweet, request_method, path + "/#{id}.json", arguments.options)
|
282
|
+
parallel_map(arguments) do |tweet|
|
283
|
+
perform_with_object(request_method, path + "/#{extract_id(tweet)}.json", arguments.options, Twitter::Tweet)
|
288
284
|
end
|
289
285
|
end
|
290
286
|
|
291
287
|
def post_retweet(tweet, options)
|
292
|
-
|
293
|
-
response = post("/1.1/statuses/retweet/#{id}.json", options)
|
288
|
+
response = post("/1.1/statuses/retweet/#{extract_id(tweet)}.json", options)
|
294
289
|
retweeted_status = response.dup
|
295
290
|
retweeted_status[:body] = response[:body].delete(:retweeted_status)
|
296
291
|
retweeted_status[:body][:retweeted_status] = response[:body]
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'twitter/arguments'
|
2
2
|
require 'twitter/error/not_found'
|
3
3
|
require 'twitter/profile_banner'
|
4
|
+
require 'twitter/request'
|
4
5
|
require 'twitter/rest/api/utils'
|
5
6
|
require 'twitter/settings'
|
6
7
|
require 'twitter/user'
|
@@ -11,6 +12,7 @@ module Twitter
|
|
11
12
|
module API
|
12
13
|
module Users
|
13
14
|
include Twitter::REST::API::Utils
|
15
|
+
include Twitter::Utils
|
14
16
|
MAX_USERS_PER_REQUEST = 100
|
15
17
|
|
16
18
|
# Updates the authenticating user's settings.
|
@@ -47,7 +49,7 @@ module Twitter
|
|
47
49
|
# @param options [Hash] A customizable set of options.
|
48
50
|
# @option options [Boolean, String, Integer] :skip_status Do not include user's Tweets when set to true, 't' or 1.
|
49
51
|
def verify_credentials(options = {})
|
50
|
-
|
52
|
+
perform_with_object(:get, '/1.1/account/verify_credentials.json', options, Twitter::User)
|
51
53
|
end
|
52
54
|
alias_method :current_user, :verify_credentials
|
53
55
|
|
@@ -61,7 +63,7 @@ module Twitter
|
|
61
63
|
# @param device [String] Must be one of: 'sms', 'none'.
|
62
64
|
# @param options [Hash] A customizable set of options.
|
63
65
|
def update_delivery_device(device, options = {})
|
64
|
-
|
66
|
+
perform_with_object(:post, '/1.1/account/update_delivery_device.json', options.merge(:device => device), Twitter::User)
|
65
67
|
end
|
66
68
|
|
67
69
|
# Sets values that users are able to set under the "Account" tab of their settings page
|
@@ -78,7 +80,7 @@ module Twitter
|
|
78
80
|
# @option options [String] :location The city or country describing where the user of the account is located. The contents are not normalized or geocoded in any way. Maximum of 30 characters.
|
79
81
|
# @option options [String] :description A description of the user owning the account. Maximum of 160 characters.
|
80
82
|
def update_profile(options = {})
|
81
|
-
|
83
|
+
perform_with_object(:post, '/1.1/account/update_profile.json', options, Twitter::User)
|
82
84
|
end
|
83
85
|
|
84
86
|
# Updates the authenticating user's profile background image
|
@@ -92,7 +94,7 @@ module Twitter
|
|
92
94
|
# @param options [Hash] A customizable set of options.
|
93
95
|
# @option options [Boolean] :tile Whether or not to tile the background image. If set to true the background image will be displayed tiled. The image will not be tiled otherwise.
|
94
96
|
def update_profile_background_image(image, options = {})
|
95
|
-
|
97
|
+
perform_with_object(:post, '/1.1/account/update_profile_background_image.json', options.merge(:image => image), Twitter::User)
|
96
98
|
end
|
97
99
|
|
98
100
|
# Sets one or more hex values that control the color scheme of the authenticating user's profile
|
@@ -109,7 +111,7 @@ module Twitter
|
|
109
111
|
# @option options [String] :profile_sidebar_fill_color Profile sidebar's background color.
|
110
112
|
# @option options [String] :profile_sidebar_border_color Profile sidebar's border color.
|
111
113
|
def update_profile_colors(options = {})
|
112
|
-
|
114
|
+
perform_with_object(:post, '/1.1/account/update_profile_colors.json', options, Twitter::User)
|
113
115
|
end
|
114
116
|
|
115
117
|
# Updates the authenticating user's profile image
|
@@ -124,7 +126,7 @@ module Twitter
|
|
124
126
|
# @param image [File] The avatar image for the profile, base64-encoded. Must be a valid GIF, JPG, or PNG image of less than 700 kilobytes in size. Images with width larger than 500 pixels will be scaled down. Animated GIFs will be converted to a static GIF of the first frame, removing the animation.
|
125
127
|
# @param options [Hash] A customizable set of options.
|
126
128
|
def update_profile_image(image, options = {})
|
127
|
-
|
129
|
+
perform_with_object(:post, '/1.1/account/update_profile_image.json', options.merge(:image => image), Twitter::User)
|
128
130
|
end
|
129
131
|
|
130
132
|
# Returns an array of user objects that the authenticating user is blocking
|
@@ -137,7 +139,7 @@ module Twitter
|
|
137
139
|
# @param options [Hash] A customizable set of options.
|
138
140
|
# @option options [Integer] :page Specifies the page of results to retrieve.
|
139
141
|
def blocking(options = {})
|
140
|
-
|
142
|
+
perform_with_cursor(:get, '/1.1/blocks/list.json', options, :users, Twitter::User)
|
141
143
|
end
|
142
144
|
|
143
145
|
# Returns an array of numeric user ids the authenticating user is blocking
|
@@ -152,7 +154,7 @@ module Twitter
|
|
152
154
|
def blocked_ids(*args)
|
153
155
|
arguments = Twitter::Arguments.new(args)
|
154
156
|
merge_user!(arguments.options, arguments.pop)
|
155
|
-
|
157
|
+
perform_with_cursor(:get, '/1.1/blocks/ids.json', arguments.options, :ids)
|
156
158
|
end
|
157
159
|
|
158
160
|
# Returns true if the authenticating user is blocking a target user
|
@@ -165,7 +167,6 @@ module Twitter
|
|
165
167
|
# @param user [Integer, String, URI, Twitter::User] A Twitter user ID, screen name, URI, or object.
|
166
168
|
# @param options [Hash] A customizable set of options.
|
167
169
|
def block?(user, options = {})
|
168
|
-
merge_default_cursor!(options)
|
169
170
|
user_id = case user
|
170
171
|
when Integer
|
171
172
|
user
|
@@ -174,7 +175,7 @@ module Twitter
|
|
174
175
|
when Twitter::User
|
175
176
|
user.id
|
176
177
|
end
|
177
|
-
blocked_ids(options).
|
178
|
+
blocked_ids(options).collect(&:to_i).include?(user_id)
|
178
179
|
end
|
179
180
|
|
180
181
|
# Blocks the users specified by the authenticating user
|
@@ -226,9 +227,9 @@ module Twitter
|
|
226
227
|
# @option options [Boolean] :include_entities The tweet entities node will be disincluded when set to false.
|
227
228
|
def users(*args)
|
228
229
|
arguments = Twitter::Arguments.new(args)
|
229
|
-
|
230
|
-
|
231
|
-
|
230
|
+
request_method = arguments.options.delete(:method) || :post
|
231
|
+
parallel_map(arguments.each_slice(MAX_USERS_PER_REQUEST)) do |users|
|
232
|
+
perform_with_objects(request_method, '/1.1/users/lookup.json', merge_users(arguments.options, users), Twitter::User)
|
232
233
|
end.flatten
|
233
234
|
end
|
234
235
|
|
@@ -254,7 +255,7 @@ module Twitter
|
|
254
255
|
arguments = Twitter::Arguments.new(args)
|
255
256
|
if arguments.last
|
256
257
|
merge_user!(arguments.options, arguments.pop)
|
257
|
-
|
258
|
+
perform_with_object(:get, '/1.1/users/show.json', arguments.options, Twitter::User)
|
258
259
|
else
|
259
260
|
verify_credentials(arguments.options)
|
260
261
|
end
|
@@ -287,7 +288,7 @@ module Twitter
|
|
287
288
|
# @option options [Integer] :count The number of people to retrieve. Maxiumum of 20 allowed per page.
|
288
289
|
# @option options [Integer] :page Specifies the page of results to retrieve.
|
289
290
|
def user_search(query, options = {})
|
290
|
-
|
291
|
+
perform_with_objects(:get, '/1.1/users/search.json', options.merge(:q => query), Twitter::User)
|
291
292
|
end
|
292
293
|
|
293
294
|
# Returns an array of users that the specified user can contribute to
|
@@ -374,7 +375,7 @@ module Twitter
|
|
374
375
|
def profile_banner(*args)
|
375
376
|
arguments = Twitter::Arguments.new(args)
|
376
377
|
merge_user!(arguments.options, arguments.pop || screen_name) unless arguments.options[:user_id] || arguments.options[:screen_name]
|
377
|
-
|
378
|
+
perform_with_object(:get, '/1.1/users/profile_banner.json', arguments.options, Twitter::ProfileBanner)
|
378
379
|
end
|
379
380
|
end
|
380
381
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'addressable/uri'
|
2
2
|
require 'twitter/arguments'
|
3
|
-
require 'twitter/
|
3
|
+
require 'twitter/request'
|
4
4
|
require 'twitter/user'
|
5
5
|
require 'twitter/utils'
|
6
6
|
|
@@ -8,23 +8,9 @@ module Twitter
|
|
8
8
|
module REST
|
9
9
|
module API
|
10
10
|
module Utils
|
11
|
-
|
11
|
+
include Twitter::Utils
|
12
12
|
URI_SUBSTRING = '://'
|
13
|
-
|
14
|
-
class << self
|
15
|
-
def included(base)
|
16
|
-
base.extend(ClassMethods)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
module ClassMethods
|
21
|
-
def deprecate_alias(new_name, old_name)
|
22
|
-
define_method(new_name) do |*args, &block|
|
23
|
-
warn "#{Kernel.caller.first}: [DEPRECATION] ##{new_name} is deprecated. Use ##{old_name} instead."
|
24
|
-
send(old_name, *args, &block)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
13
|
+
DEFAULT_CURSOR = -1
|
28
14
|
|
29
15
|
private
|
30
16
|
|
@@ -45,14 +31,42 @@ module Twitter
|
|
45
31
|
end
|
46
32
|
end
|
47
33
|
|
34
|
+
# @param request_method [Symbol]
|
35
|
+
# @param path [String]
|
36
|
+
# @param options [Hash]
|
37
|
+
# @param klass [Class]
|
38
|
+
def perform_with_object(request_method, path, options, klass)
|
39
|
+
request = Twitter::Request.new(self, request_method, path, options)
|
40
|
+
request.perform_with_object(klass)
|
41
|
+
end
|
42
|
+
|
43
|
+
# @param request_method [Symbol]
|
44
|
+
# @param path [String]
|
45
|
+
# @param options [Hash]
|
46
|
+
# @param klass [Class]
|
47
|
+
def perform_with_objects(request_method, path, options, klass)
|
48
|
+
request = Twitter::Request.new(self, request_method, path, options)
|
49
|
+
request.perform_with_objects(klass)
|
50
|
+
end
|
51
|
+
|
52
|
+
# @param request_method [Symbol]
|
53
|
+
# @param path [String]
|
54
|
+
# @param options [Hash]
|
55
|
+
# @param klass [Class]
|
56
|
+
def perform_with_cursor(request_method, path, options, collection_name, klass = nil) # rubocop:disable ParameterLists
|
57
|
+
merge_default_cursor!(options)
|
58
|
+
request = Twitter::Request.new(self, request_method, path, options)
|
59
|
+
request.perform_with_cursor(collection_name.to_sym, klass)
|
60
|
+
end
|
61
|
+
|
48
62
|
# @param request_method [Symbol]
|
49
63
|
# @param path [String]
|
50
64
|
# @param args [Array]
|
51
65
|
# @return [Array<Twitter::User>]
|
52
66
|
def parallel_user_objects_from_response(request_method, path, args)
|
53
67
|
arguments = Twitter::Arguments.new(args)
|
54
|
-
|
55
|
-
|
68
|
+
parallel_map(arguments) do |user|
|
69
|
+
perform_with_object(request_method, path, merge_user(arguments.options, user), Twitter::User)
|
56
70
|
end
|
57
71
|
end
|
58
72
|
|
@@ -63,7 +77,7 @@ module Twitter
|
|
63
77
|
def user_objects_from_response(request_method, path, args)
|
64
78
|
arguments = Twitter::Arguments.new(args)
|
65
79
|
merge_user!(arguments.options, arguments.pop || screen_name) unless arguments.options[:user_id] || arguments.options[:screen_name]
|
66
|
-
|
80
|
+
perform_with_objects(request_method, path, arguments.options, Twitter::User)
|
67
81
|
end
|
68
82
|
|
69
83
|
# @param klass [Class]
|
@@ -71,29 +85,10 @@ module Twitter
|
|
71
85
|
# @param path [String]
|
72
86
|
# @param args [Array]
|
73
87
|
# @return [Array]
|
74
|
-
def objects_from_response_with_user(klass, request_method, path, args)
|
88
|
+
def objects_from_response_with_user(klass, request_method, path, args)
|
75
89
|
arguments = Twitter::Arguments.new(args)
|
76
90
|
merge_user!(arguments.options, arguments.pop)
|
77
|
-
|
78
|
-
end
|
79
|
-
|
80
|
-
# @param klass [Class]
|
81
|
-
# @param request_method [Symbol]
|
82
|
-
# @param path [String]
|
83
|
-
# @param options [Hash]
|
84
|
-
# @return [Array]
|
85
|
-
def objects_from_response(klass, request_method, path, options = {}) # rubocop:disable ParameterLists
|
86
|
-
response = send(request_method.to_sym, path, options)[:body]
|
87
|
-
objects_from_array(klass, response)
|
88
|
-
end
|
89
|
-
|
90
|
-
# @param klass [Class]
|
91
|
-
# @param array [Array]
|
92
|
-
# @return [Array]
|
93
|
-
def objects_from_array(klass, array)
|
94
|
-
array.map do |element|
|
95
|
-
klass.new(element)
|
96
|
-
end
|
91
|
+
perform_with_objects(request_method, path, arguments.options, klass)
|
97
92
|
end
|
98
93
|
|
99
94
|
# @param klass [Class]
|
@@ -101,24 +96,13 @@ module Twitter
|
|
101
96
|
# @param path [String]
|
102
97
|
# @param args [Array]
|
103
98
|
# @return [Array]
|
104
|
-
def parallel_objects_from_response(klass, request_method, path, args)
|
99
|
+
def parallel_objects_from_response(klass, request_method, path, args)
|
105
100
|
arguments = Twitter::Arguments.new(args)
|
106
|
-
|
107
|
-
id
|
108
|
-
object_from_response(klass, request_method, path, arguments.options.merge(:id => id))
|
101
|
+
parallel_map(arguments) do |object|
|
102
|
+
perform_with_object(request_method, path, arguments.options.merge(:id => extract_id(object)), klass)
|
109
103
|
end
|
110
104
|
end
|
111
105
|
|
112
|
-
# @param klass [Class]
|
113
|
-
# @param request_method [Symbol]
|
114
|
-
# @param path [String]
|
115
|
-
# @param options [Hash]
|
116
|
-
# @return [Object]
|
117
|
-
def object_from_response(klass, request_method, path, options = {}) # rubocop:disable ParameterLists
|
118
|
-
response = send(request_method.to_sym, path, options)
|
119
|
-
klass.from_response(response)
|
120
|
-
end
|
121
|
-
|
122
106
|
# @param collection_name [Symbol]
|
123
107
|
# @param klass [Class]
|
124
108
|
# @param request_method [Symbol]
|
@@ -128,19 +112,7 @@ module Twitter
|
|
128
112
|
def cursor_from_response_with_user(collection_name, klass, request_method, path, args) # rubocop:disable ParameterLists
|
129
113
|
arguments = Twitter::Arguments.new(args)
|
130
114
|
merge_user!(arguments.options, arguments.pop || screen_name) unless arguments.options[:user_id] || arguments.options[:screen_name]
|
131
|
-
|
132
|
-
end
|
133
|
-
|
134
|
-
# @param collection_name [Symbol]
|
135
|
-
# @param klass [Class]
|
136
|
-
# @param request_method [Symbol]
|
137
|
-
# @param path [String]
|
138
|
-
# @param options [Hash]
|
139
|
-
# @return [Twitter::Cursor]
|
140
|
-
def cursor_from_response(collection_name, klass, request_method, path, options) # rubocop:disable ParameterLists
|
141
|
-
merge_default_cursor!(options)
|
142
|
-
response = send(request_method.to_sym, path, options)
|
143
|
-
Twitter::Cursor.from_response(response, collection_name.to_sym, klass, self, request_method, path, options)
|
115
|
+
perform_with_cursor(request_method, path, arguments.options, collection_name, klass)
|
144
116
|
end
|
145
117
|
|
146
118
|
def handle_forbidden_error(klass, error)
|
@@ -148,14 +120,14 @@ module Twitter
|
|
148
120
|
fail(error)
|
149
121
|
end
|
150
122
|
|
151
|
-
def merge_default_cursor!(options)
|
152
|
-
options[:cursor] = DEFAULT_CURSOR unless options[:cursor]
|
153
|
-
end
|
154
|
-
|
155
123
|
def screen_name
|
156
124
|
@screen_name ||= verify_credentials.screen_name
|
157
125
|
end
|
158
126
|
|
127
|
+
def merge_default_cursor!(options)
|
128
|
+
options[:cursor] = DEFAULT_CURSOR unless options[:cursor]
|
129
|
+
end
|
130
|
+
|
159
131
|
# Take a user and merge it into the hash with the correct key
|
160
132
|
#
|
161
133
|
# @param hash [Hash]
|
@@ -187,7 +159,7 @@ module Twitter
|
|
187
159
|
end
|
188
160
|
end
|
189
161
|
|
190
|
-
def set_compound_key(key, value, hash, prefix = nil)
|
162
|
+
def set_compound_key(key, value, hash, prefix = nil)
|
191
163
|
compound_key = [prefix, key].compact.join('_').to_sym
|
192
164
|
hash[compound_key] = value
|
193
165
|
hash
|