twitter 4.3.0 → 4.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.yardopts +10 -0
- data/CHANGELOG.md +123 -110
- data/CONTRIBUTING.md +51 -0
- data/README.md +17 -2
- data/lib/twitter/api/direct_messages.rb +3 -6
- data/lib/twitter/api/favorites.rb +6 -13
- data/lib/twitter/api/friends_and_followers.rb +76 -8
- data/lib/twitter/api/lists.rb +65 -36
- data/lib/twitter/api/places_and_geo.rb +3 -3
- data/lib/twitter/api/saved_searches.rb +2 -2
- data/lib/twitter/api/spam_reporting.rb +2 -2
- data/lib/twitter/api/suggested_users.rb +1 -1
- data/lib/twitter/api/timelines.rb +12 -8
- data/lib/twitter/api/tweets.rb +8 -12
- data/lib/twitter/api/undocumented.rb +3 -3
- data/lib/twitter/api/users.rb +16 -10
- data/lib/twitter/api/utils.rb +109 -30
- data/lib/twitter/base.rb +15 -5
- data/lib/twitter/basic_user.rb +0 -1
- data/lib/twitter/client.rb +16 -37
- data/lib/twitter/core_ext/enumerable.rb +2 -2
- data/lib/twitter/default.rb +5 -8
- data/lib/twitter/exceptable.rb +36 -0
- data/lib/twitter/factory.rb +4 -4
- data/lib/twitter/list.rb +0 -1
- data/lib/twitter/request/multipart_with_file.rb +5 -7
- data/lib/twitter/search_results.rb +10 -6
- data/lib/twitter/settings.rb +0 -1
- data/lib/twitter/source_user.rb +0 -7
- data/lib/twitter/target_user.rb +0 -1
- data/lib/twitter/tweet.rb +15 -17
- data/lib/twitter/user.rb +4 -14
- data/lib/twitter/version.rb +4 -4
- data/spec/fixtures/followers_list.json +1 -0
- data/spec/fixtures/friends_list.json +1 -0
- data/spec/fixtures/ids_list.json +1 -1
- data/spec/fixtures/ids_list2.json +1 -1
- data/spec/helper.rb +9 -8
- data/spec/twitter/action_factory_spec.rb +1 -1
- data/spec/twitter/api/favorites_spec.rb +2 -2
- data/spec/twitter/api/friends_and_followers_spec.rb +102 -2
- data/spec/twitter/api/spam_reporting_spec.rb +2 -2
- data/spec/twitter/api/tweets_spec.rb +2 -2
- data/spec/twitter/api/users_spec.rb +107 -49
- data/spec/twitter/base_spec.rb +1 -1
- data/spec/twitter/client_spec.rb +4 -4
- data/spec/twitter/cursor_spec.rb +2 -2
- data/spec/twitter/error/client_error_spec.rb +16 -5
- data/spec/twitter/error/server_error_spec.rb +1 -1
- data/spec/twitter/error_spec.rb +2 -2
- data/spec/twitter/geo_factory_spec.rb +1 -1
- data/spec/twitter/identifiable_spec.rb +2 -2
- data/spec/twitter/media_factory_spec.rb +1 -1
- data/spec/twitter/search_results_spec.rb +11 -0
- data/spec/twitter/tweet_spec.rb +11 -0
- data/twitter.gemspec +3 -2
- metadata +190 -173
- data/lib/twitter/core_ext/array.rb +0 -7
- data/lib/twitter/core_ext/hash.rb +0 -100
- data/lib/twitter/core_ext/string.rb +0 -10
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
## Contributing
|
2
|
+
In the spirit of [free software][free-sw], **everyone** is encouraged to help
|
3
|
+
improve this project.
|
4
|
+
|
5
|
+
[free-sw]: http://www.fsf.org/licensing/essays/free-sw.html
|
6
|
+
|
7
|
+
Here are some ways *you* can contribute:
|
8
|
+
|
9
|
+
* by using alpha, beta, and prerelease versions
|
10
|
+
* by reporting bugs
|
11
|
+
* by suggesting new features
|
12
|
+
* by writing or editing documentation
|
13
|
+
* by writing specifications
|
14
|
+
* by writing code (**no patch is too small**: fix typos, add comments, clean up
|
15
|
+
inconsistent whitespace)
|
16
|
+
* by refactoring code
|
17
|
+
* by fixing [issues][]
|
18
|
+
* by reviewing patches
|
19
|
+
* [financially][pledgie]
|
20
|
+
|
21
|
+
[issues]: https://github.com/sferik/twitter/issues
|
22
|
+
[pledgie]: http://pledgie.com/campaigns/18388
|
23
|
+
|
24
|
+
## Submitting an Issue
|
25
|
+
We use the [GitHub issue tracker][issues] to track bugs and features. Before
|
26
|
+
submitting a bug report or feature request, check to make sure it hasn't
|
27
|
+
already been submitted. When submitting a bug report, please include a [Gist][]
|
28
|
+
that includes a stack trace and any details that may be necessary to reproduce
|
29
|
+
the bug, including your gem version, Ruby version, and operating system.
|
30
|
+
Ideally, a bug report should include a pull request with failing specs.
|
31
|
+
|
32
|
+
[gist]: https://gist.github.com/
|
33
|
+
|
34
|
+
## Submitting a Pull Request
|
35
|
+
1. [Fork the repository.][fork]
|
36
|
+
2. [Create a topic branch.][branch]
|
37
|
+
3. Add specs for your unimplemented feature or bug fix.
|
38
|
+
4. Run `bundle exec rake spec`. If your specs pass, return to step 3.
|
39
|
+
5. Implement your feature or bug fix.
|
40
|
+
6. Run `bundle exec rake spec`. If your specs fail, return to step 5.
|
41
|
+
7. Run `open coverage/index.html`. If your changes are not completely covered
|
42
|
+
by your tests, return to step 3.
|
43
|
+
8. Add documentation for your feature or bug fix.
|
44
|
+
9. Run `bundle exec rake yard`. If your changes are not 100% documented, go
|
45
|
+
back to step 8.
|
46
|
+
10. Add, commit, and push your changes.
|
47
|
+
11. [Submit a pull request.][pr]
|
48
|
+
|
49
|
+
[fork]: http://help.github.com/fork-a-repo/
|
50
|
+
[branch]: http://learn.github.com/p/branching.html
|
51
|
+
[pr]: http://help.github.com/send-pull-requests/
|
data/README.md
CHANGED
@@ -302,6 +302,20 @@ Twitter.follow(213747670)
|
|
302
302
|
Twitter.user("gem")
|
303
303
|
Twitter.user(213747670)
|
304
304
|
```
|
305
|
+
**Fetch a cursored list of followers with profile details (by screen name or user ID, or by implict authenticated user)**
|
306
|
+
|
307
|
+
```ruby
|
308
|
+
Twitter.followers("gem")
|
309
|
+
Twitter.followers(213747670)
|
310
|
+
Twitter.followers
|
311
|
+
```
|
312
|
+
**Fetch a cursored list of friends with profile details (by screen name or user ID, or by implict authenticated user)**
|
313
|
+
|
314
|
+
```ruby
|
315
|
+
Twitter.friends("gem")
|
316
|
+
Twitter.friends(213747670)
|
317
|
+
Twitter.friends
|
318
|
+
```
|
305
319
|
**Fetch the timeline of Tweets by a user**
|
306
320
|
|
307
321
|
```ruby
|
@@ -357,10 +371,11 @@ Here are some fun facts about this library:
|
|
357
371
|
|
358
372
|
* It is implemented in just 2,000 lines of Ruby code
|
359
373
|
* With over 4,000 lines of specs, the spec-to-code ratio is over 2:1
|
360
|
-
* The spec suite contains
|
374
|
+
* The spec suite contains 700 examples and runs in about 2 seconds
|
361
375
|
* It has 100% C0 code coverage (the tests execute every line of
|
362
376
|
source code at least once)
|
363
|
-
* It is comprehensive: you can request all documented Twitter REST API
|
377
|
+
* It is comprehensive: you can request all documented Twitter REST API
|
378
|
+
resources (over 100 resources)
|
364
379
|
* This gem works on every major Ruby implementation, including JRuby and
|
365
380
|
Rubinius
|
366
381
|
* The first version was released on November 26, 2006
|
@@ -92,7 +92,7 @@ module Twitter
|
|
92
92
|
# @param ids [Array<Integer>, Set<Integer>] An array of Tweet IDs.
|
93
93
|
# @param options [Hash] A customizable set of options.
|
94
94
|
def direct_messages(*args)
|
95
|
-
options =
|
95
|
+
options = extract_options!(args)
|
96
96
|
if args.empty?
|
97
97
|
direct_messages_received(options)
|
98
98
|
else
|
@@ -118,10 +118,7 @@ module Twitter
|
|
118
118
|
# @param ids [Array<Integer>, Set<Integer>] An array of Tweet IDs.
|
119
119
|
# @param options [Hash] A customizable set of options.
|
120
120
|
def direct_message_destroy(*args)
|
121
|
-
|
122
|
-
args.flatten.threaded_map do |id|
|
123
|
-
object_from_response(Twitter::DirectMessage, :post, "/1.1/direct_messages/destroy.json", options.merge(:id => id))
|
124
|
-
end
|
121
|
+
threaded_object_from_response(Twitter::DirectMessage, :post, "/1.1/direct_messages/destroy.json", args)
|
125
122
|
end
|
126
123
|
|
127
124
|
# Sends a new direct message to the specified user from the authenticating user
|
@@ -138,7 +135,7 @@ module Twitter
|
|
138
135
|
# Twitter.direct_message_create('sferik', "I'm sending you this message via @gem!")
|
139
136
|
# Twitter.direct_message_create(7505382, "I'm sending you this message via @gem!") # Same as above
|
140
137
|
def direct_message_create(user, text, options={})
|
141
|
-
|
138
|
+
merge_user!(options, user)
|
142
139
|
options[:text] = text
|
143
140
|
object_from_response(Twitter::DirectMessage, :post, "/1.1/direct_messages/new.json", options)
|
144
141
|
end
|
@@ -32,9 +32,9 @@ module Twitter
|
|
32
32
|
# @example Return the 20 most recent favorite Tweets for @sferik
|
33
33
|
# Twitter.favorites('sferik')
|
34
34
|
def favorites(*args)
|
35
|
-
options =
|
35
|
+
options = extract_options!(args)
|
36
36
|
if user = args.pop
|
37
|
-
|
37
|
+
merge_user!(options, user)
|
38
38
|
end
|
39
39
|
collection_from_response(Twitter::Tweet, :get, "/1.1/favorites/list.json", options)
|
40
40
|
end
|
@@ -55,10 +55,7 @@ module Twitter
|
|
55
55
|
# @param ids [Array<Integer>, Set<Integer>] An array of Tweet IDs.
|
56
56
|
# @param options [Hash] A customizable set of options.
|
57
57
|
def unfavorite(*args)
|
58
|
-
|
59
|
-
args.flatten.threaded_map do |id|
|
60
|
-
object_from_response(Twitter::Tweet, :post, "/1.1/favorites/destroy.json", options.merge(:id => id))
|
61
|
-
end
|
58
|
+
threaded_object_from_response(Twitter::Tweet, :post, "/1.1/favorites/destroy.json", args)
|
62
59
|
end
|
63
60
|
alias favorite_destroy unfavorite
|
64
61
|
alias favourite_destroy unfavorite
|
@@ -79,7 +76,7 @@ module Twitter
|
|
79
76
|
# @param ids [Array<Integer>, Set<Integer>] An array of Tweet IDs.
|
80
77
|
# @param options [Hash] A customizable set of options.
|
81
78
|
def favorite(*args)
|
82
|
-
options =
|
79
|
+
options = extract_options!(args)
|
83
80
|
args.flatten.threaded_map do |id|
|
84
81
|
begin
|
85
82
|
object_from_response(Twitter::Tweet, :post, "/1.1/favorites/create.json", options.merge(:id => id))
|
@@ -109,16 +106,12 @@ module Twitter
|
|
109
106
|
# @param ids [Array<Integer>, Set<Integer>] An array of Tweet IDs.
|
110
107
|
# @param options [Hash] A customizable set of options.
|
111
108
|
def favorite!(*args)
|
112
|
-
options =
|
109
|
+
options = extract_options!(args)
|
113
110
|
args.flatten.threaded_map do |id|
|
114
111
|
begin
|
115
112
|
object_from_response(Twitter::Tweet, :post, "/1.1/favorites/create.json", options.merge(:id => id))
|
116
113
|
rescue Twitter::Error::Forbidden => error
|
117
|
-
|
118
|
-
raise Twitter::Error::AlreadyFavorited.new("Tweet with the ID #{id} has already been favorited by the authenticated user.")
|
119
|
-
else
|
120
|
-
raise
|
121
|
-
end
|
114
|
+
handle_forbidden_error(Twitter::Error::AlreadyFavorited, error)
|
122
115
|
end
|
123
116
|
end
|
124
117
|
end
|
@@ -76,8 +76,8 @@ module Twitter
|
|
76
76
|
# @param users [Array<Integer, String, Twitter::User>, Set<Integer, String, Twitter::User>] An array of Twitter user IDs, screen names, or objects.
|
77
77
|
# @param options [Hash] A customizable set of options.
|
78
78
|
def friendships(*args)
|
79
|
-
options =
|
80
|
-
|
79
|
+
options = extract_options!(args)
|
80
|
+
merge_users!(options, Array(args))
|
81
81
|
collection_from_response(Twitter::User, :get, "/1.1/friendships/lookup.json", options)
|
82
82
|
end
|
83
83
|
|
@@ -129,7 +129,7 @@ module Twitter
|
|
129
129
|
# @param options [Hash] A customizable set of options.
|
130
130
|
# @option options [Boolean] :follow (false) Enable notifications for the target user.
|
131
131
|
def follow(*args)
|
132
|
-
options =
|
132
|
+
options = extract_options!(args)
|
133
133
|
# Twitter always turns on notifications if the "follow" option is present, even if it's set to false
|
134
134
|
# so only send follow if it's true
|
135
135
|
options[:follow] = true if !!options.delete(:follow)
|
@@ -159,13 +159,13 @@ module Twitter
|
|
159
159
|
# @param options [Hash] A customizable set of options.
|
160
160
|
# @option options [Boolean] :follow (false) Enable notifications for the target user.
|
161
161
|
def follow!(*args)
|
162
|
-
options =
|
162
|
+
options = extract_options!(args)
|
163
163
|
# Twitter always turns on notifications if the "follow" option is present, even if it's set to false
|
164
164
|
# so only send follow if it's true
|
165
165
|
options[:follow] = true if !!options.delete(:follow)
|
166
166
|
args.flatten.threaded_map do |user|
|
167
167
|
begin
|
168
|
-
|
168
|
+
merge_user!(options, user)
|
169
169
|
object_from_response(Twitter::User, :post, "/1.1/friendships/create.json", options)
|
170
170
|
rescue Twitter::Error::Forbidden
|
171
171
|
# This error will be raised if the user doesn't have permission to
|
@@ -208,7 +208,7 @@ module Twitter
|
|
208
208
|
# @example Enable rewteets and devise notifications for @sferik
|
209
209
|
# Twitter.friendship_update('sferik', :device => true, :retweets => true)
|
210
210
|
def friendship_update(user, options={})
|
211
|
-
|
211
|
+
merge_user!(options, user)
|
212
212
|
object_from_response(Twitter::Relationship, :post, "/1.1/friendships/update.json", options)
|
213
213
|
end
|
214
214
|
|
@@ -227,9 +227,9 @@ module Twitter
|
|
227
227
|
# Twitter.friendship('sferik', 14100886) # Same as above
|
228
228
|
# Twitter.friendship(7505382, 14100886) # Same as above
|
229
229
|
def friendship(source, target, options={})
|
230
|
-
|
230
|
+
merge_user!(options, source, "source")
|
231
231
|
options[:source_id] = options.delete(:source_user_id) unless options[:source_user_id].nil?
|
232
|
-
|
232
|
+
merge_user!(options, target, "target")
|
233
233
|
options[:target_id] = options.delete(:target_user_id) unless options[:target_user_id].nil?
|
234
234
|
object_from_response(Twitter::Relationship, :get, "/1.1/friendships/show.json", options)
|
235
235
|
end
|
@@ -254,6 +254,74 @@ module Twitter
|
|
254
254
|
friendship(source, target, options).source.following?
|
255
255
|
end
|
256
256
|
|
257
|
+
# Returns a cursored collection of user objects for users following the specified user.
|
258
|
+
#
|
259
|
+
# @see https://dev.twitter.com/docs/api/1.1/get/followers/list
|
260
|
+
# @rate_limited Yes
|
261
|
+
# @authentication_required Requires user context
|
262
|
+
# @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
|
263
|
+
# @return [Twitter::Cursor]
|
264
|
+
# @overload friend_ids(options={})
|
265
|
+
# Returns an array of numeric IDs for every user the authenticated user is following
|
266
|
+
#
|
267
|
+
# @param options [Hash] A customizable set of options.
|
268
|
+
# @option options [Integer] :cursor (-1) Breaks the results into pages. This is recommended for users who are following many users. Provide a value of -1 to begin paging. Provide values as returned in the response body's next_cursor and previous_cursor attributes to page back and forth in the list.
|
269
|
+
# @option options [Boolean, String, Integer] :skip_status Do not include contributee's Tweets when set to true, 't' or 1.
|
270
|
+
# @option options [Boolean, String, Integer] :include_user_entities The user entities node will be disincluded when set to false.
|
271
|
+
# @example Return the authenticated user's friends' IDs
|
272
|
+
# Twitter.friend_ids
|
273
|
+
# @overload friend_ids(user, options={})
|
274
|
+
# Returns an array of numeric IDs for every user the specified user is following
|
275
|
+
#
|
276
|
+
# @param user [Integer, String, Twitter::User] A Twitter user ID, screen name, or object.
|
277
|
+
# @param options [Hash] A customizable set of options.
|
278
|
+
# @option options [Integer] :cursor (-1) Breaks the results into pages. Provide values as returned in the response objects's next_cursor and previous_cursor attributes to page back and forth in the list.
|
279
|
+
# @option options [Boolean, String, Integer] :skip_status Do not include contributee's Tweets when set to true, 't' or 1.
|
280
|
+
# @option options [Boolean, String, Integer] :include_user_entities The user entities node will be disincluded when set to false.
|
281
|
+
# @example Return the cursored collection of users following @sferik
|
282
|
+
# Twitter.followers('sferik')
|
283
|
+
# Twitter.followers(7505382) # Same as above
|
284
|
+
def followers(*args)
|
285
|
+
options = extract_options!(args)
|
286
|
+
merge_user!(options, args.pop || screen_name)
|
287
|
+
merge_default_cursor!(options)
|
288
|
+
cursor_from_response(:users, Twitter::User, :get, "/1.1/followers/list.json", options)
|
289
|
+
end
|
290
|
+
|
291
|
+
# Returns a cursored collection of user objects for every user the specified user is following (otherwise known as their "friends").
|
292
|
+
#
|
293
|
+
# @see https://dev.twitter.com/docs/api/1.1/get/friendships/show
|
294
|
+
# @rate_limited Yes
|
295
|
+
# @authentication_required Requires user context
|
296
|
+
# @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
|
297
|
+
# @return [Twitter::Cursor]
|
298
|
+
# @overload friend_ids(options={})
|
299
|
+
# Returns an array of numeric IDs for every user the authenticated user is following
|
300
|
+
#
|
301
|
+
# @param options [Hash] A customizable set of options.
|
302
|
+
# @option options [Integer] :cursor (-1) Breaks the results into pages. This is recommended for users who are following many users. Provide a value of -1 to begin paging. Provide values as returned in the response body's next_cursor and previous_cursor attributes to page back and forth in the list.
|
303
|
+
# @option options [Boolean, String, Integer] :skip_status Do not include contributee's Tweets when set to true, 't' or 1.
|
304
|
+
# @option options [Boolean, String, Integer] :include_user_entities The user entities node will be disincluded when set to false.
|
305
|
+
# @example Return the authenticated user's friends' IDs
|
306
|
+
# Twitter.friend_ids
|
307
|
+
# @overload friend_ids(user, options={})
|
308
|
+
# Returns an array of numeric IDs for every user the specified user is following
|
309
|
+
#
|
310
|
+
# @param user [Integer, String, Twitter::User] A Twitter user ID, screen name, or object.
|
311
|
+
# @param options [Hash] A customizable set of options.
|
312
|
+
# @option options [Integer] :cursor (-1) Breaks the results into pages. Provide values as returned in the response objects's next_cursor and previous_cursor attributes to page back and forth in the list.
|
313
|
+
# @option options [Boolean, String, Integer] :skip_status Do not include contributee's Tweets when set to true, 't' or 1.
|
314
|
+
# @option options [Boolean, String, Integer] :include_user_entities The user entities node will be disincluded when set to false.
|
315
|
+
# @example Return the cursored collection of users @sferik is following
|
316
|
+
# Twitter.friends('sferik')
|
317
|
+
# Twitter.friends(7505382) # Same as above
|
318
|
+
def friends(*args)
|
319
|
+
options = extract_options!(args)
|
320
|
+
merge_user!(options, args.pop || screen_name)
|
321
|
+
merge_default_cursor!(options)
|
322
|
+
cursor_from_response(:users, Twitter::User, :get, "/1.1/friends/list.json", options)
|
323
|
+
end
|
324
|
+
alias following friends
|
257
325
|
end
|
258
326
|
end
|
259
327
|
end
|
data/lib/twitter/api/lists.rb
CHANGED
@@ -63,9 +63,9 @@ module Twitter
|
|
63
63
|
# Twitter.list_timeline(7505382, 'presidents')
|
64
64
|
# Twitter.list_timeline(7505382, 8863586)
|
65
65
|
def list_timeline(*args)
|
66
|
-
options =
|
67
|
-
|
68
|
-
|
66
|
+
options = extract_options!(args)
|
67
|
+
merge_list!(options, args.pop)
|
68
|
+
merge_owner!(options, args.pop || screen_name) unless options[:owner_id] || options[:owner_screen_name]
|
69
69
|
collection_from_response(Twitter::Tweet, :get, "/1.1/lists/statuses.json", options)
|
70
70
|
end
|
71
71
|
|
@@ -507,64 +507,93 @@ module Twitter
|
|
507
507
|
private
|
508
508
|
|
509
509
|
# @param request_method [Symbol]
|
510
|
-
# @param
|
510
|
+
# @param path [String]
|
511
511
|
# @param args [Array]
|
512
512
|
# @return [Array<Twitter::User>]
|
513
|
-
def list_from_response(request_method,
|
514
|
-
options =
|
515
|
-
|
516
|
-
|
517
|
-
object_from_response(Twitter::List, request_method,
|
513
|
+
def list_from_response(request_method, path, args)
|
514
|
+
options = extract_options!(args)
|
515
|
+
merge_list!(options, args.pop)
|
516
|
+
merge_owner!(options, args.pop || screen_name) unless options[:owner_id] || options[:owner_screen_name]
|
517
|
+
object_from_response(Twitter::List, request_method, path, options)
|
518
518
|
end
|
519
519
|
|
520
520
|
# @param request_method [Symbol]
|
521
|
-
# @param
|
521
|
+
# @param path [String]
|
522
522
|
# @param args [Array]
|
523
523
|
# @return [Array<Twitter::List>]
|
524
|
-
def lists_from_response(request_method,
|
525
|
-
options =
|
524
|
+
def lists_from_response(request_method, path, args)
|
525
|
+
options = extract_options!(args)
|
526
526
|
merge_default_cursor!(options)
|
527
|
-
|
528
|
-
cursor_from_response(:lists, Twitter::List, request_method,
|
527
|
+
merge_user!(options, args.pop)
|
528
|
+
cursor_from_response(:lists, Twitter::List, request_method, path, options, calling_method)
|
529
529
|
end
|
530
530
|
|
531
|
-
def list_users(request_method,
|
532
|
-
options =
|
531
|
+
def list_users(request_method, path, args)
|
532
|
+
options = extract_options!(args)
|
533
533
|
merge_default_cursor!(options)
|
534
|
-
|
535
|
-
|
536
|
-
cursor_from_response(:users, Twitter::User, request_method,
|
534
|
+
merge_list!(options, args.pop)
|
535
|
+
merge_owner!(options, args.pop || screen_name) unless options[:owner_id] || options[:owner_screen_name]
|
536
|
+
cursor_from_response(:users, Twitter::User, request_method, path, options, calling_method)
|
537
537
|
end
|
538
538
|
|
539
|
-
def list_user?(request_method,
|
540
|
-
options =
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
send(request_method.to_sym,
|
539
|
+
def list_user?(request_method, path, args)
|
540
|
+
options = extract_options!(args)
|
541
|
+
merge_user!(options, args.pop)
|
542
|
+
merge_list!(options, args.pop)
|
543
|
+
merge_owner!(options, args.pop || screen_name) unless options[:owner_id] || options[:owner_screen_name]
|
544
|
+
send(request_method.to_sym, path, options)
|
545
545
|
true
|
546
546
|
rescue Twitter::Error::NotFound, Twitter::Error::Forbidden
|
547
547
|
false
|
548
548
|
end
|
549
549
|
|
550
|
-
def list_modify_member(request_method,
|
551
|
-
options =
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
object_from_response(Twitter::List, request_method,
|
550
|
+
def list_modify_member(request_method, path, args)
|
551
|
+
options = extract_options!(args)
|
552
|
+
merge_user!(options, args.pop)
|
553
|
+
merge_list!(options, args.pop)
|
554
|
+
merge_owner!(options, args.pop || screen_name) unless options[:owner_id] || options[:owner_screen_name]
|
555
|
+
object_from_response(Twitter::List, request_method, path, options)
|
556
556
|
end
|
557
557
|
|
558
|
-
def list_modify_members(request_method,
|
559
|
-
options =
|
558
|
+
def list_modify_members(request_method, path, args)
|
559
|
+
options = extract_options!(args)
|
560
560
|
members = args.pop
|
561
|
-
|
562
|
-
|
561
|
+
merge_list!(options, args.pop)
|
562
|
+
merge_owner!(options, args.pop || screen_name) unless options[:owner_id] || options[:owner_screen_name]
|
563
563
|
members.flatten.each_slice(MAX_USERS_PER_REQUEST).threaded_map do |users|
|
564
|
-
object_from_response(Twitter::List, request_method,
|
564
|
+
object_from_response(Twitter::List, request_method, path, merge_users(options, users))
|
565
565
|
end.last
|
566
566
|
end
|
567
567
|
|
568
|
+
# Take a list and merge it into the hash with the correct key
|
569
|
+
#
|
570
|
+
# @param hash [Hash]
|
571
|
+
# @param list [Integer, String, Twitter::List] A Twitter list ID, slug, or object.
|
572
|
+
# @return [Hash]
|
573
|
+
def merge_list!(hash, list)
|
574
|
+
case list
|
575
|
+
when Integer
|
576
|
+
hash[:list_id] = list
|
577
|
+
when String
|
578
|
+
hash[:slug] = list
|
579
|
+
when Twitter::List
|
580
|
+
hash[:list_id] = list.id
|
581
|
+
merge_owner!(hash, list.user)
|
582
|
+
end
|
583
|
+
hash
|
584
|
+
end
|
585
|
+
|
586
|
+
# Take an owner and merge it into the hash with the correct key
|
587
|
+
#
|
588
|
+
# @param hash [Hash]
|
589
|
+
# @param user[Integer, String, Twitter::User] A Twitter user ID, screen_name, or object.
|
590
|
+
# @return [Hash]
|
591
|
+
def merge_owner!(hash, user)
|
592
|
+
merge_user!(hash, user, "owner")
|
593
|
+
hash[:owner_id] = hash.delete(:owner_user_id) unless hash[:owner_user_id].nil?
|
594
|
+
hash
|
595
|
+
end
|
596
|
+
|
568
597
|
end
|
569
598
|
end
|
570
599
|
end
|
@@ -109,11 +109,11 @@ module Twitter
|
|
109
109
|
private
|
110
110
|
|
111
111
|
# @param request_method [Symbol]
|
112
|
-
# @param
|
112
|
+
# @param path [String]
|
113
113
|
# @param options [Hash]
|
114
114
|
# @return [Array]
|
115
|
-
def geo_collection_from_response(request_method,
|
116
|
-
collection_from_array(Twitter::Place, send(request_method.to_sym,
|
115
|
+
def geo_collection_from_response(request_method, path, params={})
|
116
|
+
collection_from_array(Twitter::Place, send(request_method.to_sym, path, params)[:body][:result][:places])
|
117
117
|
end
|
118
118
|
|
119
119
|
end
|