twitter 8.2.0 → 8.3.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 (100) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.md +1 -1
  3. data/README.md +172 -10
  4. data/lib/twitter/arguments.rb +14 -1
  5. data/lib/twitter/base.rb +72 -11
  6. data/lib/twitter/basic_user.rb +7 -1
  7. data/lib/twitter/client.rb +94 -3
  8. data/lib/twitter/creatable.rb +11 -2
  9. data/lib/twitter/cursor.rb +58 -11
  10. data/lib/twitter/direct_message.rb +32 -4
  11. data/lib/twitter/direct_message_event.rb +34 -10
  12. data/lib/twitter/direct_messages/welcome_message.rb +22 -1
  13. data/lib/twitter/direct_messages/welcome_message_rule.rb +7 -0
  14. data/lib/twitter/direct_messages/welcome_message_rule_wrapper.rb +26 -3
  15. data/lib/twitter/direct_messages/welcome_message_wrapper.rb +36 -11
  16. data/lib/twitter/entities.rb +84 -8
  17. data/lib/twitter/entity/hashtag.rb +7 -1
  18. data/lib/twitter/entity/symbol.rb +7 -1
  19. data/lib/twitter/entity/uri.rb +2 -1
  20. data/lib/twitter/entity/user_mention.rb +20 -1
  21. data/lib/twitter/entity.rb +7 -1
  22. data/lib/twitter/enumerable.rb +20 -3
  23. data/lib/twitter/error.rb +137 -61
  24. data/lib/twitter/factory.rb +9 -5
  25. data/lib/twitter/geo/point.rb +37 -5
  26. data/lib/twitter/geo/polygon.rb +1 -0
  27. data/lib/twitter/geo.rb +16 -2
  28. data/lib/twitter/geo_factory.rb +7 -3
  29. data/lib/twitter/geo_results.rb +39 -8
  30. data/lib/twitter/headers.rb +44 -7
  31. data/lib/twitter/identity.rb +13 -3
  32. data/lib/twitter/language.rb +21 -1
  33. data/lib/twitter/list.rb +101 -11
  34. data/lib/twitter/media/animated_gif.rb +1 -0
  35. data/lib/twitter/media/photo.rb +19 -3
  36. data/lib/twitter/media/video.rb +21 -3
  37. data/lib/twitter/media/video_info.rb +15 -1
  38. data/lib/twitter/media_factory.rb +7 -3
  39. data/lib/twitter/metadata.rb +14 -1
  40. data/lib/twitter/null_object.rb +16 -14
  41. data/lib/twitter/oembed.rb +56 -2
  42. data/lib/twitter/place.rb +74 -6
  43. data/lib/twitter/premium_search_results.rb +87 -18
  44. data/lib/twitter/profile.rb +100 -44
  45. data/lib/twitter/profile_banner.rb +9 -4
  46. data/lib/twitter/rate_limit.rb +32 -3
  47. data/lib/twitter/relationship.rb +8 -5
  48. data/lib/twitter/rest/account_activity.rb +55 -26
  49. data/lib/twitter/rest/api.rb +2 -0
  50. data/lib/twitter/rest/client.rb +18 -0
  51. data/lib/twitter/rest/direct_messages/welcome_messages.rb +89 -18
  52. data/lib/twitter/rest/direct_messages.rb +160 -96
  53. data/lib/twitter/rest/favorites.rb +58 -22
  54. data/lib/twitter/rest/form_encoder.rb +57 -17
  55. data/lib/twitter/rest/friends_and_followers.rb +101 -35
  56. data/lib/twitter/rest/help.rb +13 -3
  57. data/lib/twitter/rest/lists.rb +136 -47
  58. data/lib/twitter/rest/oauth.rb +21 -15
  59. data/lib/twitter/rest/places_and_geo.rb +44 -28
  60. data/lib/twitter/rest/premium_search.rb +17 -12
  61. data/lib/twitter/rest/request.rb +173 -55
  62. data/lib/twitter/rest/saved_searches.rb +22 -7
  63. data/lib/twitter/rest/search.rb +20 -16
  64. data/lib/twitter/rest/spam_reporting.rb +5 -1
  65. data/lib/twitter/rest/suggested_users.rb +15 -6
  66. data/lib/twitter/rest/timelines.rb +92 -52
  67. data/lib/twitter/rest/trends.rb +32 -13
  68. data/lib/twitter/rest/tweets.rb +147 -89
  69. data/lib/twitter/rest/undocumented.rb +10 -1
  70. data/lib/twitter/rest/upload_utils.rb +45 -29
  71. data/lib/twitter/rest/users.rb +151 -72
  72. data/lib/twitter/rest/utils.rb +135 -39
  73. data/lib/twitter/saved_search.rb +23 -2
  74. data/lib/twitter/search_results.rb +66 -18
  75. data/lib/twitter/settings.rb +37 -11
  76. data/lib/twitter/size.rb +37 -3
  77. data/lib/twitter/source_user.rb +4 -3
  78. data/lib/twitter/streaming/client.rb +61 -9
  79. data/lib/twitter/streaming/connection.rb +54 -6
  80. data/lib/twitter/streaming/deleted_tweet.rb +8 -0
  81. data/lib/twitter/streaming/event.rb +43 -1
  82. data/lib/twitter/streaming/friend_list.rb +1 -0
  83. data/lib/twitter/streaming/message_parser.rb +20 -10
  84. data/lib/twitter/streaming/response.rb +31 -5
  85. data/lib/twitter/streaming/stall_warning.rb +23 -0
  86. data/lib/twitter/suggestion.rb +25 -1
  87. data/lib/twitter/target_user.rb +2 -1
  88. data/lib/twitter/trend.rb +29 -1
  89. data/lib/twitter/trend_results.rb +50 -7
  90. data/lib/twitter/tweet.rb +180 -21
  91. data/lib/twitter/user.rb +289 -53
  92. data/lib/twitter/utils.rb +12 -13
  93. data/lib/twitter/variant.rb +12 -1
  94. data/lib/twitter/version.rb +66 -29
  95. data/lib/twitter.rb +6 -1
  96. metadata +23 -57
  97. data/.yardopts +0 -16
  98. data/CHANGELOG.md +0 -1040
  99. data/CONTRIBUTING.md +0 -49
  100. data/twitter.gemspec +0 -40
data/lib/twitter/user.rb CHANGED
@@ -1,99 +1,335 @@
1
- require "addressable/uri"
1
+ require "uri"
2
2
  require "twitter/basic_user"
3
3
  require "twitter/creatable"
4
4
  require "twitter/entity/uri"
5
5
  require "twitter/profile"
6
6
 
7
7
  module Twitter
8
- class User < Twitter::BasicUser
9
- include Twitter::Creatable
10
- include Twitter::Profile
8
+ # Represents a Twitter user
9
+ class User < BasicUser
10
+ include Creatable
11
+ include Profile
12
+
13
+ # The user's connections
14
+ #
15
+ # @api public
16
+ # @example
17
+ # user.connections
11
18
  # @return [Array]
12
19
  attr_reader :connections
20
+
21
+ # The number of favourites
22
+ #
23
+ # @api public
24
+ # @example
25
+ # user.favourites_count
26
+ # @return [Integer]
27
+
28
+ # The number of followers
29
+ #
30
+ # @api public
31
+ # @example
32
+ # user.followers_count
33
+ # @return [Integer]
34
+
35
+ # The number of friends (following)
36
+ #
37
+ # @api public
38
+ # @example
39
+ # user.friends_count
40
+ # @return [Integer]
41
+
42
+ # The number of lists this user is on
43
+ #
44
+ # @api public
45
+ # @example
46
+ # user.listed_count
47
+ # @return [Integer]
48
+
49
+ # The number of statuses/tweets
50
+ #
51
+ # @api public
52
+ # @example
53
+ # user.statuses_count
54
+ # @return [Integer]
55
+
56
+ # The UTC offset in seconds
57
+ #
58
+ # @api public
59
+ # @example
60
+ # user.utc_offset
13
61
  # @return [Integer]
14
62
  attr_reader :favourites_count, :followers_count, :friends_count,
15
- :listed_count, :statuses_count, :utc_offset
63
+ :listed_count, :statuses_count, :utc_offset
64
+
65
+ # The user's description
66
+ #
67
+ # @api public
68
+ # @example
69
+ # user.description
70
+ # @return [String]
71
+
72
+ # The user's email address
73
+ #
74
+ # @api public
75
+ # @example
76
+ # user.email
77
+ # @return [String]
78
+
79
+ # The user's language
80
+ #
81
+ # @api public
82
+ # @example
83
+ # user.lang
84
+ # @return [String]
85
+
86
+ # The user's location
87
+ #
88
+ # @api public
89
+ # @example
90
+ # user.location
91
+ # @return [String]
92
+
93
+ # The user's name
94
+ #
95
+ # @api public
96
+ # @example
97
+ # user.name
98
+ # @return [String]
99
+
100
+ # The profile background color
101
+ #
102
+ # @api public
103
+ # @example
104
+ # user.profile_background_color
105
+ # @return [String]
106
+
107
+ # The profile link color
108
+ #
109
+ # @api public
110
+ # @example
111
+ # user.profile_link_color
112
+ # @return [String]
113
+
114
+ # The profile sidebar border color
115
+ #
116
+ # @api public
117
+ # @example
118
+ # user.profile_sidebar_border_color
119
+ # @return [String]
120
+
121
+ # The profile sidebar fill color
122
+ #
123
+ # @api public
124
+ # @example
125
+ # user.profile_sidebar_fill_color
126
+ # @return [String]
127
+
128
+ # The profile text color
129
+ #
130
+ # @api public
131
+ # @example
132
+ # user.profile_text_color
133
+ # @return [String]
134
+
135
+ # The user's time zone
136
+ #
137
+ # @api public
138
+ # @example
139
+ # user.time_zone
16
140
  # @return [String]
17
141
  attr_reader :description, :email, :lang, :location, :name,
18
- :profile_background_color, :profile_link_color,
19
- :profile_sidebar_border_color, :profile_sidebar_fill_color,
20
- :profile_text_color, :time_zone
21
- alias favorites_count favourites_count
22
- alias tweets_count statuses_count
142
+ :profile_background_color, :profile_link_color,
143
+ :profile_sidebar_border_color, :profile_sidebar_fill_color,
144
+ :profile_text_color, :time_zone
145
+
146
+ # @!method favorites_count
147
+ # The number of favorites (US spelling)
148
+ # @api public
149
+ # @example
150
+ # user.favorites_count
151
+ # @return [Integer]
152
+ alias_method :favorites_count, :favourites_count
153
+
154
+ # @!method tweets_count
155
+ # The number of tweets
156
+ # @api public
157
+ # @example
158
+ # user.tweets_count
159
+ # @return [Integer]
160
+ alias_method :tweets_count, :statuses_count
23
161
  object_attr_reader :Tweet, :status, :user
24
- alias tweet status
25
- alias tweet? status?
26
- alias tweeted? status?
162
+
163
+ # The user's latest tweet
164
+ #
165
+ # @!method tweet
166
+ # @api public
167
+ # @example
168
+ # user.tweet
169
+ # @return [Twitter::Tweet]
170
+ alias_method :tweet, :status
171
+
172
+ # Returns true if the user has a tweet
173
+ #
174
+ # @!method tweet?
175
+ # @api public
176
+ # @example
177
+ # user.tweet?
178
+ # @return [Boolean]
179
+ alias_method :tweet?, :status?
180
+
181
+ # Returns true if the user has tweeted
182
+ #
183
+ # @!method tweeted?
184
+ # @api public
185
+ # @example
186
+ # user.tweeted?
187
+ # @return [Boolean]
188
+ alias_method :tweeted?, :status?
27
189
  predicate_attr_reader :contributors_enabled, :default_profile,
28
- :default_profile_image, :follow_request_sent,
29
- :geo_enabled, :muting, :needs_phone_verification,
30
- :notifications, :protected, :profile_background_tile,
31
- :profile_use_background_image, :suspended, :verified
190
+ :default_profile_image, :follow_request_sent,
191
+ :geo_enabled, :muting, :needs_phone_verification,
192
+ :notifications, :protected, :profile_background_tile,
193
+ :profile_use_background_image, :suspended, :verified
32
194
  define_predicate_method :translator, :is_translator
33
195
  define_predicate_method :translation_enabled, :is_translation_enabled
34
196
  uri_attr_reader :profile_background_image_uri, :profile_background_image_uri_https
35
197
 
36
- class << self
37
- private
38
-
39
- # Dynamically define a method for entity URIs
40
- #
41
- # @param key1 [Symbol]
42
- # @param key2 [Symbol]
43
- def define_entity_uris_methods(key1, key2)
44
- array = key1.to_s.split("_")
45
- index = array.index("uris")
46
- array[index] = "urls"
47
- url_key = array.join("_").to_sym
48
- define_entity_uris_method(key1, key2)
49
- alias_method(url_key, key1)
50
- define_entity_uris_predicate_method(key1)
51
- alias_method(:"#{url_key}?", :"#{key1}?")
198
+ # Returns an array of URIs in the user's description
199
+ #
200
+ # @api public
201
+ # @example
202
+ # user.description_uris
203
+ # @return [Array<Twitter::Entity::URI>]
204
+ def description_uris
205
+ empty_hash = {} # : Hash[Symbol, untyped]
206
+ empty_array = [] # : Array[untyped]
207
+ @attrs.fetch(:entities, empty_hash).fetch(:description, empty_hash).fetch(:urls, empty_array).collect do |url|
208
+ Entity::URI.new(url)
52
209
  end
210
+ end
211
+ memoize :description_uris
53
212
 
54
- def define_entity_uris_method(key1, key2)
55
- define_method(key1) do
56
- @attrs.fetch(:entities, {}).fetch(key2, {}).fetch(:urls, []).collect do |url|
57
- Entity::URI.new(url)
58
- end
59
- end
60
- memoize(key1)
61
- end
213
+ # @!method description_urls
214
+ # Returns an array of URLs in the user's description
215
+ # @api public
216
+ # @example
217
+ # user.description_urls
218
+ # @return [Array<Twitter::Entity::URI>]
219
+ alias_method :description_urls, :description_uris
220
+
221
+ # Returns true if the user has description URIs
222
+ #
223
+ # @api public
224
+ # @example
225
+ # user.description_uris?
226
+ # @return [Boolean]
227
+ def description_uris?
228
+ description_uris.any?
229
+ end
230
+ memoize :description_uris?
231
+
232
+ # @!method description_urls?
233
+ # Returns true if the user has description URLs
234
+ # @api public
235
+ # @example
236
+ # user.description_urls?
237
+ # @return [Boolean]
238
+ alias_method :description_urls?, :description_uris?
62
239
 
63
- def define_entity_uris_predicate_method(key1)
64
- define_method(:"#{key1}?") do
65
- send(:"#{key1}").any?
66
- end
67
- memoize(:"#{key1}?")
240
+ # Returns an array of URIs in the user's website
241
+ #
242
+ # @api public
243
+ # @example
244
+ # user.website_uris
245
+ # @return [Array<Twitter::Entity::URI>]
246
+ def website_uris
247
+ empty_hash = {} # : Hash[Symbol, untyped]
248
+ empty_array = [] # : Array[untyped]
249
+ @attrs.fetch(:entities, empty_hash).fetch(:url, empty_hash).fetch(:urls, empty_array).collect do |url|
250
+ Entity::URI.new(url)
68
251
  end
69
252
  end
253
+ memoize :website_uris
70
254
 
71
- define_entity_uris_methods :description_uris, :description
72
- define_entity_uris_methods :website_uris, :url
255
+ # @!method website_urls
256
+ # Returns an array of URLs in the user's website
257
+ # @api public
258
+ # @example
259
+ # user.website_urls
260
+ # @return [Array<Twitter::Entity::URI>]
261
+ alias_method :website_urls, :website_uris
73
262
 
263
+ # Returns true if the user has website URIs
264
+ #
265
+ # @api public
266
+ # @example
267
+ # user.website_uris?
268
+ # @return [Boolean]
269
+ def website_uris?
270
+ website_uris.any?
271
+ end
272
+ memoize :website_uris?
273
+
274
+ # @!method website_urls?
275
+ # Returns true if the user has website URLs
276
+ # @api public
277
+ # @example
278
+ # user.website_urls?
279
+ # @return [Boolean]
280
+ alias_method :website_urls?, :website_uris?
281
+
282
+ # Returns true if the user has entities
283
+ #
284
+ # @api public
285
+ # @example
286
+ # user.entities?
74
287
  # @return [Boolean]
75
288
  def entities?
76
289
  !@attrs[:entities].nil? && @attrs[:entities].any? { |_, hash| hash[:urls].any? }
77
290
  end
78
291
  memoize :entities?
79
292
 
80
- # @return [Addressable::URI] The URL to the user.
293
+ # Returns the URI to the user's profile
294
+ #
295
+ # @api public
296
+ # @example
297
+ # user.uri
298
+ # @return [URI::Generic]
81
299
  def uri
82
- Addressable::URI.parse("https://twitter.com/#{screen_name}") if screen_name?
300
+ URI.parse("https://twitter.com/#{screen_name}") if screen_name?
83
301
  end
84
302
  memoize :uri
85
- alias url uri
86
303
 
87
- # @return [Addressable::URI] The URL to the user's website.
304
+ # @!method url
305
+ # Returns the URL to the user's profile
306
+ # @api public
307
+ # @example
308
+ # user.url
309
+ # @return [URI::Generic]
310
+ alias_method :url, :uri
311
+
312
+ # Returns the user's website URL
313
+ #
314
+ # @api public
315
+ # @example
316
+ # user.website
317
+ # @return [URI::Generic]
88
318
  def website
89
319
  if website_uris?
90
320
  website_uris.first.expanded_url
91
321
  else
92
- Addressable::URI.parse(@attrs[:url])
322
+ URI.parse(@attrs[:url]) unless @attrs[:url].nil?
93
323
  end
94
324
  end
95
325
  memoize :website
96
326
 
327
+ # Returns true if the user has a website
328
+ #
329
+ # @api public
330
+ # @example
331
+ # user.website?
332
+ # @return [Boolean]
97
333
  def website?
98
334
  !!(website_uris? || @attrs[:url])
99
335
  end
data/lib/twitter/utils.rb CHANGED
@@ -1,10 +1,11 @@
1
1
  module Twitter
2
+ # Utility methods for parallel mapping
3
+ #
4
+ # @api private
2
5
  module Utils
3
- module_function
4
-
5
- # Returns a new array with the concatenated results of running block once for every element in enumerable.
6
- # If no block is given, an enumerator is returned instead.
6
+ # Parallel flat_map for enumerables
7
7
  #
8
+ # @api private
8
9
  # @param enumerable [Enumerable]
9
10
  # @return [Array, Enumerator]
10
11
  def flat_pmap(enumerable, &block)
@@ -12,20 +13,18 @@ module Twitter
12
13
 
13
14
  pmap(enumerable, &block).flatten(1)
14
15
  end
16
+ module_function :flat_pmap
15
17
 
16
- # Returns a new array with the results of running block once for every element in enumerable.
17
- # If no block is given, an enumerator is returned instead.
18
+ # Parallel map for enumerables
18
19
  #
20
+ # @api private
19
21
  # @param enumerable [Enumerable]
20
22
  # @return [Array, Enumerator]
21
- def pmap(enumerable, &block)
22
- return to_enum(:pmap, enumerable) unless block
23
+ def pmap(enumerable, &)
24
+ return to_enum(:pmap, enumerable) unless block_given?
23
25
 
24
- if enumerable.count == 1
25
- enumerable.collect(&block)
26
- else
27
- enumerable.collect { |object| Thread.new { yield(object) } }.collect(&:value)
28
- end
26
+ enumerable.collect(&)
29
27
  end
28
+ module_function :pmap
30
29
  end
31
30
  end
@@ -1,10 +1,21 @@
1
1
  require "twitter/base"
2
2
 
3
3
  module Twitter
4
- class Variant < Twitter::Base
4
+ # Represents a video variant with a specific bitrate and format
5
+ class Variant < Base
6
+ # The bitrate of this variant in bits per second
7
+ #
8
+ # @api public
9
+ # @example
10
+ # variant.bitrate
5
11
  # @return [Integer]
6
12
  attr_reader :bitrate
7
13
 
14
+ # The content type (MIME type) of this variant
15
+ #
16
+ # @api public
17
+ # @example
18
+ # variant.content_type
8
19
  # @return [String]
9
20
  attr_reader :content_type
10
21
 
@@ -1,40 +1,77 @@
1
1
  module Twitter
2
+ # Provides version information for the Twitter gem
3
+ #
4
+ # @api public
2
5
  module Version
3
- module_function
6
+ class << self
7
+ # The major version number
8
+ #
9
+ # @api private
10
+ # @example
11
+ # Twitter::Version.major # => 8
12
+ # @return [Integer]
13
+ def major
14
+ 8
15
+ end
4
16
 
5
- # @return [Integer]
6
- def major
7
- 8
8
- end
17
+ # The minor version number
18
+ #
19
+ # @api private
20
+ # @example
21
+ # Twitter::Version.minor # => 3
22
+ # @return [Integer]
23
+ def minor
24
+ 3
25
+ end
9
26
 
10
- # @return [Integer]
11
- def minor
12
- 2
13
- end
27
+ # The patch version number
28
+ #
29
+ # @api private
30
+ # @example
31
+ # Twitter::Version.patch # => 1
32
+ # @return [Integer]
33
+ def patch
34
+ 1
35
+ end
14
36
 
15
- # @return [Integer]
16
- def patch
17
- 0
18
- end
37
+ # The pre-release version identifier
38
+ #
39
+ # @api private
40
+ # @example
41
+ # Twitter::Version.pre # => nil
42
+ # @return [Integer, NilClass]
43
+ def pre
44
+ end
19
45
 
20
- # @return [Integer, NilClass]
21
- def pre
22
- nil
23
- end
46
+ # The version as a hash
47
+ #
48
+ # @api private
49
+ # @example
50
+ # Twitter::Version.to_h # => {major: 8, minor: 3, patch: 1, pre: nil}
51
+ # @return [Hash]
52
+ def to_h
53
+ {major:, minor:, patch:, pre: nil}
54
+ end
24
55
 
25
- # @return [Hash]
26
- def to_h
27
- {major:, minor:, patch:, pre:}
28
- end
29
-
30
- # @return [Array]
31
- def to_a
32
- [major, minor, patch, pre].compact
33
- end
56
+ # The version as an array
57
+ #
58
+ # @api private
59
+ # @example
60
+ # Twitter::Version.to_a # => [8, 3, 1]
61
+ # @return [Array]
62
+ def to_a
63
+ [major, minor, patch]
64
+ end
34
65
 
35
- # @return [String]
36
- def to_s
37
- to_a.join(".")
66
+ # The version as a string
67
+ #
68
+ # @api private
69
+ # @example
70
+ # Twitter::Version.to_s # => "8.3.1"
71
+ # @return [String]
72
+ def to_s
73
+ to_a.join(".")
74
+ end
38
75
  end
39
76
  end
40
77
  end
data/lib/twitter.rb CHANGED
@@ -1,4 +1,9 @@
1
- require "addressable/uri"
1
+ require "uri"
2
+
3
+ # Ruby interface to the Twitter API
4
+ module Twitter
5
+ end
6
+
2
7
  require "twitter/base"
3
8
  require "twitter/cursor"
4
9
  require "twitter/direct_message"