twitter 4.3.0 → 4.4.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 (60) hide show
  1. data/.yardopts +10 -0
  2. data/CHANGELOG.md +123 -110
  3. data/CONTRIBUTING.md +51 -0
  4. data/README.md +17 -2
  5. data/lib/twitter/api/direct_messages.rb +3 -6
  6. data/lib/twitter/api/favorites.rb +6 -13
  7. data/lib/twitter/api/friends_and_followers.rb +76 -8
  8. data/lib/twitter/api/lists.rb +65 -36
  9. data/lib/twitter/api/places_and_geo.rb +3 -3
  10. data/lib/twitter/api/saved_searches.rb +2 -2
  11. data/lib/twitter/api/spam_reporting.rb +2 -2
  12. data/lib/twitter/api/suggested_users.rb +1 -1
  13. data/lib/twitter/api/timelines.rb +12 -8
  14. data/lib/twitter/api/tweets.rb +8 -12
  15. data/lib/twitter/api/undocumented.rb +3 -3
  16. data/lib/twitter/api/users.rb +16 -10
  17. data/lib/twitter/api/utils.rb +109 -30
  18. data/lib/twitter/base.rb +15 -5
  19. data/lib/twitter/basic_user.rb +0 -1
  20. data/lib/twitter/client.rb +16 -37
  21. data/lib/twitter/core_ext/enumerable.rb +2 -2
  22. data/lib/twitter/default.rb +5 -8
  23. data/lib/twitter/exceptable.rb +36 -0
  24. data/lib/twitter/factory.rb +4 -4
  25. data/lib/twitter/list.rb +0 -1
  26. data/lib/twitter/request/multipart_with_file.rb +5 -7
  27. data/lib/twitter/search_results.rb +10 -6
  28. data/lib/twitter/settings.rb +0 -1
  29. data/lib/twitter/source_user.rb +0 -7
  30. data/lib/twitter/target_user.rb +0 -1
  31. data/lib/twitter/tweet.rb +15 -17
  32. data/lib/twitter/user.rb +4 -14
  33. data/lib/twitter/version.rb +4 -4
  34. data/spec/fixtures/followers_list.json +1 -0
  35. data/spec/fixtures/friends_list.json +1 -0
  36. data/spec/fixtures/ids_list.json +1 -1
  37. data/spec/fixtures/ids_list2.json +1 -1
  38. data/spec/helper.rb +9 -8
  39. data/spec/twitter/action_factory_spec.rb +1 -1
  40. data/spec/twitter/api/favorites_spec.rb +2 -2
  41. data/spec/twitter/api/friends_and_followers_spec.rb +102 -2
  42. data/spec/twitter/api/spam_reporting_spec.rb +2 -2
  43. data/spec/twitter/api/tweets_spec.rb +2 -2
  44. data/spec/twitter/api/users_spec.rb +107 -49
  45. data/spec/twitter/base_spec.rb +1 -1
  46. data/spec/twitter/client_spec.rb +4 -4
  47. data/spec/twitter/cursor_spec.rb +2 -2
  48. data/spec/twitter/error/client_error_spec.rb +16 -5
  49. data/spec/twitter/error/server_error_spec.rb +1 -1
  50. data/spec/twitter/error_spec.rb +2 -2
  51. data/spec/twitter/geo_factory_spec.rb +1 -1
  52. data/spec/twitter/identifiable_spec.rb +2 -2
  53. data/spec/twitter/media_factory_spec.rb +1 -1
  54. data/spec/twitter/search_results_spec.rb +11 -0
  55. data/spec/twitter/tweet_spec.rb +11 -0
  56. data/twitter.gemspec +3 -2
  57. metadata +190 -173
  58. data/lib/twitter/core_ext/array.rb +0 -7
  59. data/lib/twitter/core_ext/hash.rb +0 -100
  60. data/lib/twitter/core_ext/string.rb +0 -10
@@ -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 over 600 examples and runs in under 2 seconds
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 resources (over 100 resources)
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 = args.extract_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
- options = args.extract_options!
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
- options.merge_user!(user)
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 = args.extract_options!
35
+ options = extract_options!(args)
36
36
  if user = args.pop
37
- options.merge_user!(user)
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
- options = args.extract_options!
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 = args.extract_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 = args.extract_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
- if error.message == "You have already favorited this status"
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 = args.extract_options!
80
- options.merge_users!(Array(args))
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 = args.extract_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 = args.extract_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
- options.merge_user!(user)
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
- options.merge_user!(user)
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
- options.merge_user!(source, "source")
230
+ merge_user!(options, source, "source")
231
231
  options[:source_id] = options.delete(:source_user_id) unless options[:source_user_id].nil?
232
- options.merge_user!(target, "target")
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
@@ -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 = args.extract_options!
67
- options.merge_list!(args.pop)
68
- options.merge_owner!(args.pop || screen_name) unless options[:owner_id] || options[:owner_screen_name]
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 url [String]
510
+ # @param path [String]
511
511
  # @param args [Array]
512
512
  # @return [Array<Twitter::User>]
513
- def list_from_response(request_method, url, args)
514
- options = args.extract_options!
515
- options.merge_list!(args.pop)
516
- options.merge_owner!(args.pop || screen_name) unless options[:owner_id] || options[:owner_screen_name]
517
- object_from_response(Twitter::List, request_method, url, options)
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 url [String]
521
+ # @param path [String]
522
522
  # @param args [Array]
523
523
  # @return [Array<Twitter::List>]
524
- def lists_from_response(request_method, url, args)
525
- options = args.extract_options!
524
+ def lists_from_response(request_method, path, args)
525
+ options = extract_options!(args)
526
526
  merge_default_cursor!(options)
527
- options.merge_user!(args.pop)
528
- cursor_from_response(:lists, Twitter::List, request_method, url, options, calling_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, url, args)
532
- options = args.extract_options!
531
+ def list_users(request_method, path, args)
532
+ options = extract_options!(args)
533
533
  merge_default_cursor!(options)
534
- options.merge_list!(args.pop)
535
- options.merge_owner!(args.pop || screen_name) unless options[:owner_id] || options[:owner_screen_name]
536
- cursor_from_response(:users, Twitter::User, request_method, url, options, calling_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, url, args)
540
- options = args.extract_options!
541
- options.merge_user!(args.pop)
542
- options.merge_list!(args.pop)
543
- options.merge_owner!(args.pop || screen_name) unless options[:owner_id] || options[:owner_screen_name]
544
- send(request_method.to_sym, url, options)
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, url, args)
551
- options = args.extract_options!
552
- options.merge_user!(args.pop)
553
- options.merge_list!(args.pop)
554
- options.merge_owner!(args.pop || screen_name) unless options[:owner_id] || options[:owner_screen_name]
555
- object_from_response(Twitter::List, request_method, url, options)
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, url, args)
559
- options = args.extract_options!
558
+ def list_modify_members(request_method, path, args)
559
+ options = extract_options!(args)
560
560
  members = args.pop
561
- options.merge_list!(args.pop)
562
- options.merge_owner!(args.pop || screen_name) unless options[:owner_id] || options[:owner_screen_name]
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, url, options.merge_users(users))
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 url [String]
112
+ # @param path [String]
113
113
  # @param options [Hash]
114
114
  # @return [Array]
115
- def geo_collection_from_response(request_method, url, params={})
116
- collection_from_array(Twitter::Place, send(request_method.to_sym, url, params)[:body][:result][:places])
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