twitter 4.8.1 → 5.0.0.rc.1

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 (197) hide show
  1. data.tar.gz.sig +0 -0
  2. data/CHANGELOG.md +30 -0
  3. data/LICENSE.md +1 -1
  4. data/README.md +386 -266
  5. data/lib/twitter.rb +4 -39
  6. data/lib/twitter/arguments.rb +11 -0
  7. data/lib/twitter/base.rb +89 -68
  8. data/lib/twitter/client.rb +69 -110
  9. data/lib/twitter/configuration.rb +7 -3
  10. data/lib/twitter/creatable.rb +2 -4
  11. data/lib/twitter/cursor.rb +50 -42
  12. data/lib/twitter/direct_message.rb +2 -11
  13. data/lib/twitter/entity/uri.rb +13 -0
  14. data/lib/twitter/enumerable.rb +15 -0
  15. data/lib/twitter/error.rb +55 -7
  16. data/lib/twitter/error/already_favorited.rb +1 -1
  17. data/lib/twitter/error/already_posted.rb +10 -0
  18. data/lib/twitter/error/already_retweeted.rb +1 -1
  19. data/lib/twitter/error/bad_gateway.rb +2 -3
  20. data/lib/twitter/error/bad_request.rb +2 -2
  21. data/lib/twitter/error/forbidden.rb +2 -2
  22. data/lib/twitter/error/gateway_timeout.rb +2 -3
  23. data/lib/twitter/error/internal_server_error.rb +2 -3
  24. data/lib/twitter/error/not_acceptable.rb +2 -2
  25. data/lib/twitter/error/not_found.rb +2 -2
  26. data/lib/twitter/error/service_unavailable.rb +2 -3
  27. data/lib/twitter/error/too_many_requests.rb +2 -2
  28. data/lib/twitter/error/unauthorized.rb +2 -2
  29. data/lib/twitter/error/unprocessable_entity.rb +2 -2
  30. data/lib/twitter/factory.rb +2 -8
  31. data/lib/twitter/geo_factory.rb +2 -2
  32. data/lib/twitter/geo_results.rb +36 -0
  33. data/lib/twitter/identity.rb +0 -22
  34. data/lib/twitter/list.rb +18 -4
  35. data/lib/twitter/media/photo.rb +3 -3
  36. data/lib/twitter/media_factory.rb +2 -2
  37. data/lib/twitter/null_object.rb +24 -0
  38. data/lib/twitter/oembed.rb +3 -2
  39. data/lib/twitter/place.rb +15 -9
  40. data/lib/twitter/profile_banner.rb +5 -3
  41. data/lib/twitter/rate_limit.rb +1 -17
  42. data/lib/twitter/relationship.rb +2 -10
  43. data/lib/twitter/rest/api/direct_messages.rb +135 -0
  44. data/lib/twitter/rest/api/favorites.rb +120 -0
  45. data/lib/twitter/rest/api/friends_and_followers.rb +290 -0
  46. data/lib/twitter/rest/api/help.rb +58 -0
  47. data/lib/twitter/rest/api/lists.rb +491 -0
  48. data/lib/twitter/rest/api/oauth.rb +45 -0
  49. data/lib/twitter/rest/api/places_and_geo.rb +104 -0
  50. data/lib/twitter/rest/api/saved_searches.rb +91 -0
  51. data/lib/twitter/rest/api/search.rb +37 -0
  52. data/lib/twitter/rest/api/spam_reporting.rb +29 -0
  53. data/lib/twitter/rest/api/suggested_users.rb +51 -0
  54. data/lib/twitter/rest/api/timelines.rb +202 -0
  55. data/lib/twitter/rest/api/trends.rb +58 -0
  56. data/lib/twitter/rest/api/tweets.rb +293 -0
  57. data/lib/twitter/rest/api/undocumented.rb +52 -0
  58. data/lib/twitter/rest/api/users.rb +383 -0
  59. data/lib/twitter/rest/api/utils.rb +219 -0
  60. data/lib/twitter/rest/client.rb +193 -0
  61. data/lib/twitter/rest/request/multipart_with_file.rb +36 -0
  62. data/lib/twitter/rest/response/parse_json.rb +27 -0
  63. data/lib/twitter/{response → rest/response}/raise_error.rb +8 -11
  64. data/lib/twitter/search_results.rb +33 -21
  65. data/lib/twitter/settings.rb +1 -6
  66. data/lib/twitter/size.rb +1 -1
  67. data/lib/twitter/streaming/client.rb +77 -0
  68. data/lib/twitter/streaming/connection.rb +22 -0
  69. data/lib/twitter/streaming/response.rb +30 -0
  70. data/lib/twitter/suggestion.rb +4 -2
  71. data/lib/twitter/token.rb +8 -0
  72. data/lib/twitter/trend.rb +2 -1
  73. data/lib/twitter/trend_results.rb +59 -0
  74. data/lib/twitter/tweet.rb +41 -85
  75. data/lib/twitter/user.rb +51 -41
  76. data/lib/twitter/version.rb +4 -4
  77. data/spec/fixtures/already_posted.json +1 -0
  78. data/spec/fixtures/ids_list.json +1 -1
  79. data/spec/fixtures/ids_list2.json +1 -1
  80. data/spec/fixtures/search.json +1 -1
  81. data/spec/fixtures/search_malformed.json +1 -1
  82. data/spec/fixtures/track_streaming.json +3 -0
  83. data/spec/helper.rb +8 -13
  84. data/spec/twitter/base_spec.rb +25 -99
  85. data/spec/twitter/configuration_spec.rb +1 -1
  86. data/spec/twitter/cursor_spec.rb +13 -31
  87. data/spec/twitter/direct_message_spec.rb +41 -8
  88. data/spec/twitter/entity/uri_spec.rb +74 -0
  89. data/spec/twitter/error_spec.rb +59 -11
  90. data/spec/twitter/geo/point_spec.rb +1 -1
  91. data/spec/twitter/geo_factory_spec.rb +3 -3
  92. data/spec/twitter/geo_results_spec.rb +35 -0
  93. data/spec/twitter/identifiable_spec.rb +0 -21
  94. data/spec/twitter/list_spec.rb +51 -8
  95. data/spec/twitter/media/photo_spec.rb +118 -3
  96. data/spec/twitter/media_factory_spec.rb +2 -2
  97. data/spec/twitter/null_object_spec.rb +26 -0
  98. data/spec/twitter/oembed_spec.rb +69 -45
  99. data/spec/twitter/place_spec.rb +68 -12
  100. data/spec/twitter/profile_banner_spec.rb +1 -1
  101. data/spec/twitter/rate_limit_spec.rb +12 -12
  102. data/spec/twitter/relationship_spec.rb +31 -9
  103. data/spec/twitter/{api → rest/api}/direct_messages_spec.rb +22 -9
  104. data/spec/twitter/{api → rest/api}/favorites_spec.rb +80 -7
  105. data/spec/twitter/{api → rest/api}/friends_and_followers_spec.rb +104 -65
  106. data/spec/twitter/{api → rest/api}/geo_spec.rb +10 -10
  107. data/spec/twitter/{api → rest/api}/help_spec.rb +6 -6
  108. data/spec/twitter/{api → rest/api}/lists_spec.rb +77 -56
  109. data/spec/twitter/{api → rest/api}/oauth_spec.rb +6 -6
  110. data/spec/twitter/{api → rest/api}/saved_searches_spec.rb +7 -7
  111. data/spec/twitter/{api → rest/api}/search_spec.rb +8 -9
  112. data/spec/twitter/{api → rest/api}/spam_reporting_spec.rb +3 -3
  113. data/spec/twitter/{api → rest/api}/suggested_users_spec.rb +5 -5
  114. data/spec/twitter/{api → rest/api}/timelines_spec.rb +9 -9
  115. data/spec/twitter/{api → rest/api}/trends_spec.rb +6 -6
  116. data/spec/twitter/rest/api/tweets_spec.rb +503 -0
  117. data/spec/twitter/{api → rest/api}/undocumented_spec.rb +19 -45
  118. data/spec/twitter/{api → rest/api}/users_spec.rb +60 -35
  119. data/spec/twitter/rest/client_spec.rb +193 -0
  120. data/spec/twitter/saved_search_spec.rb +11 -0
  121. data/spec/twitter/search_results_spec.rb +29 -42
  122. data/spec/twitter/settings_spec.rb +17 -6
  123. data/spec/twitter/streaming/client_spec.rb +75 -0
  124. data/spec/twitter/token_spec.rb +16 -0
  125. data/spec/twitter/trend_results_spec.rb +89 -0
  126. data/spec/twitter/trend_spec.rb +23 -0
  127. data/spec/twitter/tweet_spec.rb +122 -115
  128. data/spec/twitter/user_spec.rb +136 -77
  129. data/spec/twitter_spec.rb +0 -119
  130. data/twitter.gemspec +8 -5
  131. metadata +148 -141
  132. metadata.gz.sig +0 -0
  133. data/lib/twitter/action/favorite.rb +0 -19
  134. data/lib/twitter/action/follow.rb +0 -30
  135. data/lib/twitter/action/list_member_added.rb +0 -39
  136. data/lib/twitter/action/mention.rb +0 -46
  137. data/lib/twitter/action/reply.rb +0 -27
  138. data/lib/twitter/action/retweet.rb +0 -27
  139. data/lib/twitter/action/tweet.rb +0 -20
  140. data/lib/twitter/action_factory.rb +0 -22
  141. data/lib/twitter/api/arguments.rb +0 -13
  142. data/lib/twitter/api/direct_messages.rb +0 -148
  143. data/lib/twitter/api/favorites.rb +0 -126
  144. data/lib/twitter/api/friends_and_followers.rb +0 -334
  145. data/lib/twitter/api/help.rb +0 -64
  146. data/lib/twitter/api/lists.rb +0 -618
  147. data/lib/twitter/api/oauth.rb +0 -44
  148. data/lib/twitter/api/places_and_geo.rb +0 -121
  149. data/lib/twitter/api/saved_searches.rb +0 -99
  150. data/lib/twitter/api/search.rb +0 -37
  151. data/lib/twitter/api/spam_reporting.rb +0 -30
  152. data/lib/twitter/api/suggested_users.rb +0 -55
  153. data/lib/twitter/api/timelines.rb +0 -214
  154. data/lib/twitter/api/trends.rb +0 -63
  155. data/lib/twitter/api/tweets.rb +0 -304
  156. data/lib/twitter/api/undocumented.rb +0 -97
  157. data/lib/twitter/api/users.rb +0 -439
  158. data/lib/twitter/api/utils.rb +0 -187
  159. data/lib/twitter/configurable.rb +0 -96
  160. data/lib/twitter/default.rb +0 -102
  161. data/lib/twitter/entity/url.rb +0 -9
  162. data/lib/twitter/error/client_error.rb +0 -35
  163. data/lib/twitter/error/decode_error.rb +0 -9
  164. data/lib/twitter/error/identity_map_key_error.rb +0 -9
  165. data/lib/twitter/error/server_error.rb +0 -28
  166. data/lib/twitter/exceptable.rb +0 -36
  167. data/lib/twitter/identity_map.rb +0 -22
  168. data/lib/twitter/request/multipart_with_file.rb +0 -34
  169. data/lib/twitter/response/parse_json.rb +0 -25
  170. data/spec/fixtures/about_me.json +0 -1
  171. data/spec/fixtures/activity_summary.json +0 -1
  172. data/spec/fixtures/bad_gateway.json +0 -1
  173. data/spec/fixtures/bad_request.json +0 -1
  174. data/spec/fixtures/by_friends.json +0 -1
  175. data/spec/fixtures/end_session.json +0 -1
  176. data/spec/fixtures/forbidden.json +0 -1
  177. data/spec/fixtures/internal_server_error.json +0 -1
  178. data/spec/fixtures/not_acceptable.json +0 -1
  179. data/spec/fixtures/phoenix_search.phoenix +0 -1
  180. data/spec/fixtures/resolve.json +0 -1
  181. data/spec/fixtures/service_unavailable.json +0 -1
  182. data/spec/fixtures/totals.json +0 -1
  183. data/spec/fixtures/trends.json +0 -1
  184. data/spec/fixtures/unauthorized.json +0 -1
  185. data/spec/fixtures/video_facets.json +0 -1
  186. data/spec/twitter/action/favorite_spec.rb +0 -29
  187. data/spec/twitter/action/follow_spec.rb +0 -29
  188. data/spec/twitter/action/list_member_added_spec.rb +0 -41
  189. data/spec/twitter/action/mention_spec.rb +0 -52
  190. data/spec/twitter/action/reply_spec.rb +0 -41
  191. data/spec/twitter/action/retweet_spec.rb +0 -41
  192. data/spec/twitter/action_factory_spec.rb +0 -35
  193. data/spec/twitter/action_spec.rb +0 -16
  194. data/spec/twitter/api/tweets_spec.rb +0 -285
  195. data/spec/twitter/client_spec.rb +0 -223
  196. data/spec/twitter/error/client_error_spec.rb +0 -23
  197. data/spec/twitter/error/server_error_spec.rb +0 -20
@@ -0,0 +1,491 @@
1
+ require 'twitter/arguments'
2
+ require 'twitter/core_ext/enumerable'
3
+ require 'twitter/cursor'
4
+ require 'twitter/error/forbidden'
5
+ require 'twitter/error/not_found'
6
+ require 'twitter/list'
7
+ require 'twitter/rest/api/utils'
8
+ require 'twitter/tweet'
9
+ require 'twitter/user'
10
+
11
+ module Twitter
12
+ module REST
13
+ module API
14
+ module Lists
15
+ include Twitter::REST::API::Utils
16
+ MAX_USERS_PER_REQUEST = 100
17
+ URI_SUBSTRING = "://"
18
+
19
+ # Returns all lists the authenticating or specified user subscribes to, including their own
20
+ #
21
+ # @see https://dev.twitter.com/docs/api/1.1/get/lists/list
22
+ # @rate_limited Yes
23
+ # @authentication Requires user context
24
+ # @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
25
+ # @return [Array<Twitter::List>]
26
+ # @overload lists(options={})
27
+ # @param options [Hash] A customizable set of options.
28
+ # @option options [Boolean] :reverse Set this to true if you would like owned lists to be returned first.
29
+ # @overload lists(user, options={})
30
+ # @param user [Integer, String, Twitter::User] A Twitter user ID, screen name, URI, or object.
31
+ # @param options [Hash] A customizable set of options.
32
+ # @option options [Boolean] :reverse Set this to true if you would like owned lists to be returned first.
33
+ def lists(*args)
34
+ objects_from_response_with_user(Twitter::List, :get, "/1.1/lists/list.json", args)
35
+ end
36
+ alias lists_subscribed_to lists
37
+
38
+ # Show tweet timeline for members of the specified list
39
+ #
40
+ # @see https://dev.twitter.com/docs/api/1.1/get/lists/statuses
41
+ # @rate_limited Yes
42
+ # @authentication Requires user context
43
+ # @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
44
+ # @return [Array<Twitter::Tweet>]
45
+ # @overload list_timeline(list, options={})
46
+ # @param list [Integer, String, Twitter::List] A Twitter list ID, slug, URI, or object.
47
+ # @param options [Hash] A customizable set of options.
48
+ # @option options [Integer] :since_id Returns results with an ID greater than (that is, more recent than) the specified ID.
49
+ # @option options [Integer] :max_id Returns results with an ID less than (that is, older than) or equal to the specified ID.
50
+ # @option options [Integer] :count The number of results to retrieve.
51
+ # @overload list_timeline(user, list, options={})
52
+ # @param user [Integer, String, Twitter::User] A Twitter user ID, screen name, URI, or object.
53
+ # @param list [Integer, String, Twitter::List] A Twitter list ID, slug, URI, or object.
54
+ # @param options [Hash] A customizable set of options.
55
+ # @option options [Integer] :since_id Returns results with an ID greater than (that is, more recent than) the specified ID.
56
+ # @option options [Integer] :max_id Returns results with an ID less than (that is, older than) or equal to the specified ID.
57
+ # @option options [Integer] :count The number of results to retrieve.
58
+ def list_timeline(*args)
59
+ arguments = Twitter::Arguments.new(args)
60
+ merge_list!(arguments.options, arguments.pop)
61
+ merge_owner!(arguments.options, arguments.pop)
62
+ objects_from_response(Twitter::Tweet, :get, "/1.1/lists/statuses.json", arguments.options)
63
+ end
64
+
65
+ # Removes the specified member from the list
66
+ #
67
+ # @see https://dev.twitter.com/docs/api/1.1/post/lists/members/destroy
68
+ # @rate_limited No
69
+ # @authentication Requires user context
70
+ # @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
71
+ # @return [Twitter::List] The list.
72
+ # @overload list_remove_member(list, user_to_remove, options={})
73
+ # @param list [Integer, String, Twitter::List] A Twitter list ID, slug, URI, or object.
74
+ # @param user_to_remove [Integer, String] The user id or screen name of the list member to remove.
75
+ # @param options [Hash] A customizable set of options.
76
+ # @overload list_remove_member(user, list, user_to_remove, options={})
77
+ # @param user [Integer, String, Twitter::User] A Twitter user ID, screen name, URI, or object.
78
+ # @param list [Integer, String, Twitter::List] A Twitter list ID, slug, URI, or object.
79
+ # @param user_to_remove [Integer, String] The user id or screen name of the list member to remove.
80
+ # @param options [Hash] A customizable set of options.
81
+ def list_remove_member(*args)
82
+ list_from_response_with_user(:post, "/1.1/lists/members/destroy.json", args)
83
+ end
84
+
85
+ # List the lists the specified user has been added to
86
+ #
87
+ # @see https://dev.twitter.com/docs/api/1.1/get/lists/memberships
88
+ # @rate_limited Yes
89
+ # @authentication Requires user context
90
+ # @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
91
+ # @return [Twitter::Cursor]
92
+ # @overload memberships(options={})
93
+ # @param options [Hash] A customizable set of options.
94
+ # @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.
95
+ # @option options [Boolean, String, Integer] :filter_to_owned_lists When set to true, t or 1, will return just lists the authenticating user owns, and the user represented by user_id or screen_name is a member of.
96
+ # @overload memberships(user, options={})
97
+ # @param user [Integer, String, Twitter::User] A Twitter user ID, screen name, URI, or object.
98
+ # @param options [Hash] A customizable set of options.
99
+ # @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.
100
+ # @option options [Boolean, String, Integer] :filter_to_owned_lists When set to true, t or 1, will return just lists the authenticating user owns, and the user represented by user_id or screen_name is a member of.
101
+ def memberships(*args)
102
+ cursor_from_response_with_user(:lists, Twitter::List, :get, "/1.1/lists/memberships.json", args)
103
+ end
104
+
105
+ # Returns the subscribers of the specified list
106
+ #
107
+ # @see https://dev.twitter.com/docs/api/1.1/get/lists/subscribers
108
+ # @rate_limited Yes
109
+ # @authentication Requires user context
110
+ # @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
111
+ # @return [Twitter::Cursor] The subscribers of the specified list.
112
+ # @overload list_subscribers(list, options={})
113
+ # @param list [Integer, String, Twitter::List] A Twitter list ID, slug, URI, or object.
114
+ # @param options [Hash] A customizable set of options.
115
+ # @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.
116
+ # @overload list_subscribers(user, list, options={})
117
+ # @param user [Integer, String, Twitter::User] A Twitter user ID, screen name, URI, or object.
118
+ # @param list [Integer, String, Twitter::List] A Twitter list ID, slug, URI, or object.
119
+ # @param options [Hash] A customizable set of options.
120
+ # @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.
121
+ def list_subscribers(*args)
122
+ cursor_from_response_with_list(:get, "/1.1/lists/subscribers.json", args)
123
+ end
124
+
125
+ # Make the authenticated user follow the specified list
126
+ #
127
+ # @see https://dev.twitter.com/docs/api/1.1/post/lists/subscribers/create
128
+ # @rate_limited No
129
+ # @authentication Requires user context
130
+ # @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
131
+ # @return [Twitter::List] The specified list.
132
+ # @overload list_subscribe(list, options={})
133
+ # @param list [Integer, String, Twitter::List] A Twitter list ID, slug, URI, or object.
134
+ # @param options [Hash] A customizable set of options.
135
+ # @overload list_subscribe(user, list, options={})
136
+ # @param user [Integer, String, Twitter::User] A Twitter user ID, screen name, URI, or object.
137
+ # @param list [Integer, String, Twitter::List] A Twitter list ID, slug, URI, or object.
138
+ # @param options [Hash] A customizable set of options.
139
+ def list_subscribe(*args)
140
+ list_from_response(:post, "/1.1/lists/subscribers/create.json", args)
141
+ end
142
+
143
+ # Check if a user is a subscriber of the specified list
144
+ #
145
+ # @see https://dev.twitter.com/docs/api/1.1/get/lists/subscribers/show
146
+ # @rate_limited Yes
147
+ # @authentication Requires user context
148
+ # @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
149
+ # @return [Boolean] true if user is a subscriber of the specified list, otherwise false.
150
+ # @overload list_subscriber?(list, user_to_check, options={})
151
+ # @param list [Integer, String, Twitter::List] A Twitter list ID, slug, URI, or object.
152
+ # @param user_to_check [Integer, String, Twitter::User] A Twitter user ID, screen name, URI, or object.
153
+ # @param options [Hash] A customizable set of options.
154
+ # @overload list_subscriber?(user, list, user_to_check, options={})
155
+ # @param user [Integer, String, Twitter::User] A Twitter user ID, screen name, URI, or object.
156
+ # @param list [Integer, String, Twitter::List] A Twitter list ID, slug, URI, or object.
157
+ # @param user_to_check [Integer, String, Twitter::User] A Twitter user ID, screen name, URI, or object.
158
+ # @param options [Hash] A customizable set of options.
159
+ # @return [Boolean] true if user is a subscriber of the specified list, otherwise false.
160
+ def list_subscriber?(*args)
161
+ list_user?(:get, "/1.1/lists/subscribers/show.json", args)
162
+ end
163
+
164
+ # Unsubscribes the authenticated user form the specified list
165
+ #
166
+ # @see https://dev.twitter.com/docs/api/1.1/post/lists/subscribers/destroy
167
+ # @rate_limited No
168
+ # @authentication Requires user context
169
+ # @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
170
+ # @return [Twitter::List] The specified list.
171
+ # @overload list_unsubscribe(list, options={})
172
+ # @param list [Integer, String, Twitter::List] A Twitter list ID, slug, URI, or object.
173
+ # @param options [Hash] A customizable set of options.
174
+ # @overload list_unsubscribe(user, list, options={})
175
+ # @param user [Integer, String, Twitter::User] A Twitter user ID, screen name, URI, or object.
176
+ # @param list [Integer, String, Twitter::List] A Twitter list ID, slug, URI, or object.
177
+ # @param options [Hash] A customizable set of options.
178
+ def list_unsubscribe(*args)
179
+ list_from_response(:post, "/1.1/lists/subscribers/destroy.json", args)
180
+ end
181
+
182
+ # Adds specified members to a list
183
+ #
184
+ # @see https://dev.twitter.com/docs/api/1.1/post/lists/members/create_all
185
+ # @note Lists are limited to having 500 members, and you are limited to adding up to 100 members to a list at a time with this method.
186
+ # @rate_limited No
187
+ # @authentication Requires user context
188
+ # @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
189
+ # @return [Twitter::List] The list.
190
+ # @overload list_add_members(list, users, options={})
191
+ # @param list [Integer, String, Twitter::List] A Twitter list ID, slug, URI, or object.
192
+ # @param users [Enumerable<Integer, String, Twitter::User>] A collection of Twitter user IDs, screen names, or objects.
193
+ # @param options [Hash] A customizable set of options.
194
+ # @overload list_add_members(user, list, users, options={})
195
+ # @param user [Integer, String, Twitter::User] A Twitter user ID, screen name, URI, or object.
196
+ # @param list [Integer, String, Twitter::List] A Twitter list ID, slug, URI, or object.
197
+ # @param users [Enumerable<Integer, String, Twitter::User>] A collection of Twitter user IDs, screen names, or objects.
198
+ # @param options [Hash] A customizable set of options.
199
+ def list_add_members(*args)
200
+ list_from_response_with_users(:post, "/1.1/lists/members/create_all.json", args)
201
+ end
202
+
203
+ # Check if a user is a member of the specified list
204
+ #
205
+ # @see https://dev.twitter.com/docs/api/1.1/get/lists/members/show
206
+ # @authentication Requires user context
207
+ # @rate_limited Yes
208
+ # @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
209
+ # @return [Boolean] true if user is a member of the specified list, otherwise false.
210
+ # @overload list_member?(list, user_to_check, options={})
211
+ # @param list [Integer, String, Twitter::List] A Twitter list ID, slug, URI, or object.
212
+ # @param user_to_check [Integer, String] The user ID or screen name of the list member.
213
+ # @param options [Hash] A customizable set of options.
214
+ # @overload list_member?(user, list, user_to_check, options={})
215
+ # @param user [Integer, String, Twitter::User] A Twitter user ID, screen name, URI, or object.
216
+ # @param list [Integer, String, Twitter::List] A Twitter list ID, slug, URI, or object.
217
+ # @param user_to_check [Integer, String] The user ID or screen name of the list member.
218
+ # @param options [Hash] A customizable set of options.
219
+ def list_member?(*args)
220
+ list_user?(:get, "/1.1/lists/members/show.json", args)
221
+ end
222
+
223
+ # Returns the members of the specified list
224
+ #
225
+ # @see https://dev.twitter.com/docs/api/1.1/get/lists/members
226
+ # @rate_limited Yes
227
+ # @authentication Requires user context
228
+ # @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
229
+ # @return [Twitter::Cursor]
230
+ # @overload list_members(list, options={})
231
+ # @param list [Integer, String, Twitter::List] A Twitter list ID, slug, URI, or object.
232
+ # @param options [Hash] A customizable set of options.
233
+ # @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.
234
+ # @overload list_members(user, list, options={})
235
+ # @param user [Integer, String, Twitter::User] A Twitter user ID, screen name, URI, or object.
236
+ # @param list [Integer, String, Twitter::List] A Twitter list ID, slug, URI, or object.
237
+ # @param options [Hash] A customizable set of options.
238
+ # @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.
239
+ def list_members(*args)
240
+ cursor_from_response_with_list(:get, "/1.1/lists/members.json", args)
241
+ end
242
+
243
+ # Add a member to a list
244
+ #
245
+ # @see https://dev.twitter.com/docs/api/1.1/post/lists/members/create
246
+ # @note Lists are limited to having 500 members.
247
+ # @rate_limited No
248
+ # @authentication Requires user context
249
+ # @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
250
+ # @return [Twitter::List] The list.
251
+ # @overload list_add_member(list, user_to_add, options={})
252
+ # @param list [Integer, String, Twitter::List] A Twitter list ID, slug, URI, or object.
253
+ # @param user_to_add [Integer, String] The user id or screen name to add to the list.
254
+ # @param options [Hash] A customizable set of options.
255
+ # @overload list_add_member(user, list, user_to_add, options={})
256
+ # @param user [Integer, String, Twitter::User] A Twitter user ID, screen name, URI, or object.
257
+ # @param list [Integer, String, Twitter::List] A Twitter list ID, slug, URI, or object.
258
+ # @param user_to_add [Integer, String] The user id or screen name to add to the list.
259
+ # @param options [Hash] A customizable set of options.
260
+ def list_add_member(*args)
261
+ list_from_response_with_user(:post, "/1.1/lists/members/create.json", args)
262
+ end
263
+
264
+ # Deletes the specified list
265
+ #
266
+ # @see https://dev.twitter.com/docs/api/1.1/post/lists/destroy
267
+ # @note Must be owned by the authenticated user.
268
+ # @rate_limited No
269
+ # @authentication Requires user context
270
+ # @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
271
+ # @return [Twitter::List] The deleted list.
272
+ # @overload list_destroy(list, options={})
273
+ # @param list [Integer, String, Twitter::List] A Twitter list ID, slug, URI, or object.
274
+ # @param options [Hash] A customizable set of options.
275
+ # @overload list_destroy(user, list, options={})
276
+ # @param user [Integer, String, Twitter::User] A Twitter user ID, screen name, URI, or object.
277
+ # @param list [Integer, String, Twitter::List] A Twitter list ID, slug, URI, or object.
278
+ # @param options [Hash] A customizable set of options.
279
+ def list_destroy(*args)
280
+ list_from_response(:post, "/1.1/lists/destroy.json", args)
281
+ end
282
+
283
+ # Updates the specified list
284
+ #
285
+ # @see https://dev.twitter.com/docs/api/1.1/post/lists/update
286
+ # @rate_limited No
287
+ # @authentication Requires user context
288
+ # @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
289
+ # @return [Twitter::List] The created list.
290
+ # @overload list_update(list, options={})
291
+ # @param list [Integer, String, Twitter::List] A Twitter list ID, slug, URI, or object.
292
+ # @param options [Hash] A customizable set of options.
293
+ # @option options [String] :mode ('public') Whether your list is public or private. Values can be 'public' or 'private'.
294
+ # @option options [String] :description The description to give the list.
295
+ # @overload list_update(user, list, options={})
296
+ # @param user [Integer, String, Twitter::User] A Twitter user ID, screen name, URI, or object.
297
+ # @param list [Integer, String, Twitter::List] A Twitter list ID, slug, URI, or object.
298
+ # @param options [Hash] A customizable set of options.
299
+ # @option options [String] :mode ('public') Whether your list is public or private. Values can be 'public' or 'private'.
300
+ # @option options [String] :description The description to give the list.
301
+ def list_update(*args)
302
+ list_from_response(:post, "/1.1/lists/update.json", args)
303
+ end
304
+
305
+ # Creates a new list for the authenticated user
306
+ #
307
+ # @see https://dev.twitter.com/docs/api/1.1/post/lists/create
308
+ # @note Accounts are limited to 20 lists.
309
+ # @rate_limited No
310
+ # @authentication Requires user context
311
+ # @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
312
+ # @return [Twitter::List] The created list.
313
+ # @param name [String] The name for the list.
314
+ # @param options [Hash] A customizable set of options.
315
+ # @option options [String] :mode ('public') Whether your list is public or private. Values can be 'public' or 'private'.
316
+ # @option options [String] :description The description to give the list.
317
+ def list_create(name, options={})
318
+ object_from_response(Twitter::List, :post, "/1.1/lists/create.json", options.merge(:name => name))
319
+ end
320
+
321
+ # Show the specified list
322
+ #
323
+ # @see https://dev.twitter.com/docs/api/1.1/get/lists/show
324
+ # @note Private lists will only be shown if the authenticated user owns the specified list.
325
+ # @rate_limited Yes
326
+ # @authentication Requires user context
327
+ # @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
328
+ # @return [Twitter::List] The specified list.
329
+ # @overload list(list, options={})
330
+ # @param list [Integer, String, Twitter::List] A Twitter list ID, slug, URI, or object.
331
+ # @param options [Hash] A customizable set of options.
332
+ # @overload list(user, list, options={})
333
+ # @param user [Integer, String, Twitter::User] A Twitter user ID, screen name, URI, or object.
334
+ # @param list [Integer, String, Twitter::List] A Twitter list ID, slug, URI, or object.
335
+ # @param options [Hash] A customizable set of options.
336
+ def list(*args)
337
+ list_from_response(:get, "/1.1/lists/show.json", args)
338
+ end
339
+
340
+ # List the lists the specified user follows
341
+ #
342
+ # @see https://dev.twitter.com/docs/api/1.1/get/lists/subscriptions
343
+ # @rate_limited Yes
344
+ # @authentication Requires user context
345
+ # @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
346
+ # @return [Twitter::Cursor]
347
+ # @overload subscriptions(options={})
348
+ # @param options [Hash] A customizable set of options.
349
+ # @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.
350
+ # @overload subscriptions(user, options={})
351
+ # @param user [Integer, String, Twitter::User] A Twitter user ID, screen name, URI, or object.
352
+ # @param options [Hash] A customizable set of options.
353
+ # @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.
354
+ def subscriptions(*args)
355
+ cursor_from_response_with_user(:lists, Twitter::List, :get, "/1.1/lists/subscriptions.json", args)
356
+ end
357
+
358
+ # Removes specified members from the list
359
+ #
360
+ # @see https://dev.twitter.com/docs/api/1.1/post/lists/members/destroy_all
361
+ # @rate_limited No
362
+ # @authentication Requires user context
363
+ # @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
364
+ # @return [Twitter::List] The list.
365
+ # @overload list_remove_members(list, users, options={})
366
+ # @param list [Integer, String, Twitter::List] A Twitter list ID, slug, URI, or object.
367
+ # @param users [Enumerable<Integer, String, Twitter::User>] A collection of Twitter user IDs, screen names, or objects.
368
+ # @param options [Hash] A customizable set of options.
369
+ # @overload list_remove_members(user, list, users, options={})
370
+ # @param user [Integer, String, Twitter::User] A Twitter user ID, screen name, URI, or object.
371
+ # @param list [Integer, String, Twitter::List] A Twitter list ID, slug, URI, or object.
372
+ # @param users [Enumerable<Integer, String, Twitter::User>] A collection of Twitter user IDs, screen names, or objects.
373
+ # @param options [Hash] A customizable set of options.
374
+ def list_remove_members(*args)
375
+ list_from_response_with_users(:post, "/1.1/lists/members/destroy_all.json", args)
376
+ end
377
+
378
+ # Returns the lists owned by the specified Twitter user
379
+ #
380
+ # @see https://dev.twitter.com/docs/api/1.1/get/lists/ownerships
381
+ # @rate_limited Yes
382
+ # @authentication Requires user context
383
+ # @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
384
+ # @return [Array<Twitter::List>]
385
+ # @overload lists_owned(options={})
386
+ # @param options [Hash] A customizable set of options.
387
+ # @option options [Integer] :count The amount of results to return per page. Defaults to 20. No more than 1000 results will ever be returned in a single page.
388
+ # @overload lists_owned(user, options={})
389
+ # @param user [Integer, String, Twitter::User] A Twitter user ID, screen name, URI, or object.
390
+ # @param options [Hash] A customizable set of options.
391
+ # @option options [Integer] :count The amount of results to return per page. Defaults to 20. No more than 1000 results will ever be returned in a single page.
392
+ def lists_owned(*args)
393
+ cursor_from_response_with_user(:lists, Twitter::List, :get, "/1.1/lists/ownerships.json", args)
394
+ end
395
+ alias lists_ownerships lists_owned
396
+
397
+ private
398
+
399
+ # @param request_method [Symbol]
400
+ # @param path [String]
401
+ # @param args [Array]
402
+ # @return [Array<Twitter::User>]
403
+ def list_from_response(request_method, path, args)
404
+ arguments = Twitter::Arguments.new(args)
405
+ merge_list!(arguments.options, arguments.pop)
406
+ merge_owner!(arguments.options, arguments.pop)
407
+ object_from_response(Twitter::List, request_method, path, arguments.options)
408
+ end
409
+
410
+ def cursor_from_response_with_list(request_method, path, args)
411
+ arguments = Twitter::Arguments.new(args)
412
+ merge_list!(arguments.options, arguments.pop)
413
+ merge_owner!(arguments.options, arguments.pop)
414
+ cursor_from_response(:users, Twitter::User, request_method, path, arguments.options)
415
+ end
416
+
417
+ def list_user?(request_method, path, args)
418
+ arguments = Twitter::Arguments.new(args)
419
+ merge_user!(arguments.options, arguments.pop)
420
+ merge_list!(arguments.options, arguments.pop)
421
+ merge_owner!(arguments.options, arguments.pop)
422
+ send(request_method.to_sym, path, arguments.options)
423
+ true
424
+ rescue Twitter::Error::NotFound, Twitter::Error::Forbidden
425
+ false
426
+ end
427
+
428
+ def list_from_response_with_user(request_method, path, args)
429
+ arguments = Twitter::Arguments.new(args)
430
+ merge_user!(arguments.options, arguments.pop)
431
+ merge_list!(arguments.options, arguments.pop)
432
+ merge_owner!(arguments.options, arguments.pop)
433
+ object_from_response(Twitter::List, request_method, path, arguments.options)
434
+ end
435
+
436
+ def list_from_response_with_users(request_method, path, args)
437
+ arguments = Twitter::Arguments.new(args)
438
+ members = arguments.pop
439
+ merge_list!(arguments.options, arguments.pop)
440
+ merge_owner!(arguments.options, arguments.pop)
441
+ members.flatten.each_slice(MAX_USERS_PER_REQUEST).threaded_map do |users|
442
+ object_from_response(Twitter::List, request_method, path, merge_users(arguments.options, users))
443
+ end.last
444
+ end
445
+
446
+ # Take a list and merge it into the hash with the correct key
447
+ #
448
+ # @param hash [Hash]
449
+ # @param list [Integer, String, URI, Twitter::List] A Twitter list ID, slug, URI, or object.
450
+ # @return [Hash]
451
+ def merge_list!(hash, list)
452
+ case list
453
+ when Integer
454
+ hash[:list_id] = list
455
+ when String
456
+ if list[URI_SUBSTRING]
457
+ list = list.split("/")
458
+ hash[:slug] = list.pop
459
+ hash[:owner_screen_name] = list.pop
460
+ else
461
+ hash[:slug] = list
462
+ end
463
+ when URI
464
+ list = list.path.split("/")
465
+ hash[:slug] = list.pop
466
+ hash[:owner_screen_name] = list.pop
467
+ when Twitter::List
468
+ hash[:list_id] = list.id
469
+ merge_owner!(hash, list.user)
470
+ end
471
+ hash
472
+ end
473
+
474
+ # Take an owner and merge it into the hash with the correct key
475
+ #
476
+ # @param hash [Hash]
477
+ # @param user[Integer, String, Twitter::User] A Twitter user ID, screen_name, or object.
478
+ # @return [Hash]
479
+ def merge_owner!(hash, user)
480
+ unless hash[:owner_id] || hash[:owner_screen_name]
481
+ user ||= screen_name
482
+ merge_user!(hash, user, "owner")
483
+ hash[:owner_id] = hash.delete(:owner_user_id) unless hash[:owner_user_id].nil?
484
+ end
485
+ hash
486
+ end
487
+
488
+ end
489
+ end
490
+ end
491
+ end