twitter 4.3.0 → 4.4.0

Sign up to get free protection for your applications and to get access to all the features.
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