twitter 5.1.1 → 5.2.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.
- data.tar.gz.sig +0 -0
- data/.yardopts +2 -0
- data/CHANGELOG.md +10 -1
- data/CONTRIBUTING.md +2 -2
- data/README.md +30 -20
- data/Rakefile +26 -5
- data/lib/twitter/arguments.rb +0 -1
- data/lib/twitter/base.rb +13 -16
- data/lib/twitter/basic_user.rb +3 -3
- data/lib/twitter/client.rb +7 -8
- data/lib/twitter/configuration.rb +5 -5
- data/lib/twitter/core_ext/enumerable.rb +0 -2
- data/lib/twitter/core_ext/kernel.rb +0 -2
- data/lib/twitter/creatable.rb +0 -1
- data/lib/twitter/cursor.rb +7 -10
- data/lib/twitter/direct_message.rb +1 -1
- data/lib/twitter/entity/uri.rb +2 -2
- data/lib/twitter/enumerable.rb +1 -2
- data/lib/twitter/error.rb +4 -6
- data/lib/twitter/error/already_favorited.rb +1 -1
- data/lib/twitter/error/already_posted.rb +1 -1
- data/lib/twitter/error/already_retweeted.rb +1 -1
- data/lib/twitter/error/too_many_requests.rb +2 -2
- data/lib/twitter/factory.rb +2 -6
- data/lib/twitter/geo.rb +1 -1
- data/lib/twitter/geo/point.rb +3 -5
- data/lib/twitter/geo_factory.rb +1 -5
- data/lib/twitter/geo_results.rb +5 -8
- data/lib/twitter/identity.rb +1 -2
- data/lib/twitter/list.rb +4 -5
- data/lib/twitter/media/photo.rb +1 -2
- data/lib/twitter/media_factory.rb +1 -5
- data/lib/twitter/null_object.rb +4 -6
- data/lib/twitter/oembed.rb +1 -1
- data/lib/twitter/place.rb +4 -5
- data/lib/twitter/profile_banner.rb +1 -3
- data/lib/twitter/rate_limit.rb +1 -3
- data/lib/twitter/relationship.rb +1 -2
- data/lib/twitter/rest/api/direct_messages.rb +13 -14
- data/lib/twitter/rest/api/favorites.rb +10 -11
- data/lib/twitter/rest/api/friends_and_followers.rb +36 -36
- data/lib/twitter/rest/api/help.rb +8 -9
- data/lib/twitter/rest/api/lists.rb +62 -63
- data/lib/twitter/rest/api/oauth.rb +3 -4
- data/lib/twitter/rest/api/places_and_geo.rb +9 -10
- data/lib/twitter/rest/api/saved_searches.rb +5 -6
- data/lib/twitter/rest/api/search.rb +2 -3
- data/lib/twitter/rest/api/spam_reporting.rb +1 -2
- data/lib/twitter/rest/api/suggested_users.rb +4 -5
- data/lib/twitter/rest/api/timelines.rb +17 -18
- data/lib/twitter/rest/api/trends.rb +10 -11
- data/lib/twitter/rest/api/tweets.rb +15 -16
- data/lib/twitter/rest/api/undocumented.rb +6 -7
- data/lib/twitter/rest/api/users.rb +51 -52
- data/lib/twitter/rest/api/utils.rb +23 -30
- data/lib/twitter/rest/client.rb +8 -9
- data/lib/twitter/rest/request/multipart_with_file.rb +0 -1
- data/lib/twitter/rest/response/parse_error_json.rb +0 -2
- data/lib/twitter/rest/response/parse_json.rb +0 -2
- data/lib/twitter/rest/response/raise_error.rb +1 -3
- data/lib/twitter/search_results.rb +12 -15
- data/lib/twitter/settings.rb +2 -2
- data/lib/twitter/size.rb +2 -2
- data/lib/twitter/source_user.rb +1 -1
- data/lib/twitter/streaming/client.rb +71 -18
- data/lib/twitter/streaming/connection.rb +1 -3
- data/lib/twitter/streaming/deleted_tweet.rb +8 -0
- data/lib/twitter/streaming/event.rb +8 -8
- data/lib/twitter/streaming/friend_list.rb +2 -9
- data/lib/twitter/streaming/message_parser.rb +13 -7
- data/lib/twitter/streaming/response.rb +0 -2
- data/lib/twitter/streaming/stall_warning.rb +7 -0
- data/lib/twitter/suggestion.rb +0 -1
- data/lib/twitter/token.rb +2 -3
- data/lib/twitter/trend_results.rb +5 -8
- data/lib/twitter/tweet.rb +16 -24
- data/lib/twitter/user.rb +30 -32
- data/lib/twitter/version.rb +2 -5
- data/spec/fixtures/track_streaming_user.json +2 -1
- data/spec/helper.rb +6 -2
- data/spec/twitter/base_spec.rb +9 -9
- data/spec/twitter/basic_user_spec.rb +6 -6
- data/spec/twitter/configuration_spec.rb +4 -4
- data/spec/twitter/cursor_spec.rb +27 -27
- data/spec/twitter/direct_message_spec.rb +36 -36
- data/spec/twitter/entity/uri_spec.rb +27 -27
- data/spec/twitter/error_spec.rb +21 -21
- data/spec/twitter/geo/point_spec.rb +9 -9
- data/spec/twitter/geo/polygon_spec.rb +5 -5
- data/spec/twitter/geo_factory_spec.rb +7 -7
- data/spec/twitter/geo_results_spec.rb +11 -11
- data/spec/twitter/geo_spec.rb +5 -5
- data/spec/twitter/identifiable_spec.rb +9 -9
- data/spec/twitter/list_spec.rb +38 -38
- data/spec/twitter/media/photo_spec.rb +54 -54
- data/spec/twitter/media_factory_spec.rb +5 -5
- data/spec/twitter/null_object_spec.rb +6 -6
- data/spec/twitter/oembed_spec.rb +65 -65
- data/spec/twitter/place_spec.rb +89 -60
- data/spec/twitter/profile_banner_spec.rb +3 -3
- data/spec/twitter/rate_limit_spec.rb +18 -18
- data/spec/twitter/relationship_spec.rb +16 -16
- data/spec/twitter/rest/api/direct_messages_spec.rb +61 -61
- data/spec/twitter/rest/api/favorites_spec.rb +93 -93
- data/spec/twitter/rest/api/friends_and_followers_spec.rb +349 -349
- data/spec/twitter/rest/api/geo_spec.rb +33 -33
- data/spec/twitter/rest/api/help_spec.rb +24 -24
- data/spec/twitter/rest/api/lists_spec.rb +487 -487
- data/spec/twitter/rest/api/oauth_spec.rb +30 -30
- data/spec/twitter/rest/api/saved_searches_spec.rb +40 -40
- data/spec/twitter/rest/api/search_spec.rb +16 -16
- data/spec/twitter/rest/api/spam_reporting_spec.rb +9 -9
- data/spec/twitter/rest/api/suggested_users_spec.rb +23 -23
- data/spec/twitter/rest/api/timelines_spec.rb +58 -58
- data/spec/twitter/rest/api/trends_spec.rb +26 -26
- data/spec/twitter/rest/api/tweets_spec.rb +284 -284
- data/spec/twitter/rest/api/undocumented_spec.rb +51 -51
- data/spec/twitter/rest/api/users_spec.rb +360 -360
- data/spec/twitter/rest/client_spec.rb +99 -103
- data/spec/twitter/saved_search_spec.rb +16 -16
- data/spec/twitter/search_results_spec.rb +44 -44
- data/spec/twitter/settings_spec.rb +8 -8
- data/spec/twitter/size_spec.rb +5 -5
- data/spec/twitter/source_user_spec.rb +6 -6
- data/spec/twitter/streaming/client_spec.rb +53 -49
- data/spec/twitter/streaming/deleted_tweet_spec.rb +23 -0
- data/spec/twitter/streaming/event_spec.rb +20 -22
- data/spec/twitter/streaming/friend_list_spec.rb +11 -0
- data/spec/twitter/streaming/message_parser_spec.rb +54 -0
- data/spec/twitter/suggestion_spec.rb +11 -11
- data/spec/twitter/target_user_spec.rb +6 -6
- data/spec/twitter/token_spec.rb +4 -4
- data/spec/twitter/trend_results_spec.rb +30 -30
- data/spec/twitter/trend_spec.rb +20 -20
- data/spec/twitter/tweet_spec.rb +170 -173
- data/spec/twitter/user_spec.rb +179 -179
- data/twitter.gemspec +2 -2
- metadata +21 -4
- metadata.gz.sig +2 -1
|
@@ -1,8 +1,14 @@
|
|
|
1
|
+
require 'twitter/direct_message'
|
|
2
|
+
require 'twitter/streaming/deleted_tweet'
|
|
3
|
+
require 'twitter/streaming/event'
|
|
4
|
+
require 'twitter/streaming/friend_list'
|
|
5
|
+
require 'twitter/streaming/stall_warning'
|
|
6
|
+
require 'twitter/tweet'
|
|
7
|
+
|
|
1
8
|
module Twitter
|
|
2
9
|
module Streaming
|
|
3
10
|
class MessageParser
|
|
4
|
-
|
|
5
|
-
def self.parse(data)
|
|
11
|
+
def self.parse(data) # rubocop:disable CyclomaticComplexity
|
|
6
12
|
if data[:id]
|
|
7
13
|
Tweet.new(data)
|
|
8
14
|
elsif data[:event]
|
|
@@ -11,12 +17,12 @@ module Twitter
|
|
|
11
17
|
DirectMessage.new(data[:direct_message])
|
|
12
18
|
elsif data[:friends]
|
|
13
19
|
FriendList.new(data[:friends])
|
|
14
|
-
elsif data[:delete]
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
20
|
+
elsif data[:delete] && data[:delete][:status]
|
|
21
|
+
DeletedTweet.new(data[:delete][:status])
|
|
22
|
+
elsif data[:warning]
|
|
23
|
+
StallWarning.new(data[:warning])
|
|
18
24
|
end
|
|
19
25
|
end
|
|
20
26
|
end
|
|
21
27
|
end
|
|
22
|
-
end
|
|
28
|
+
end
|
|
@@ -3,7 +3,6 @@ require 'buftok'
|
|
|
3
3
|
module Twitter
|
|
4
4
|
module Streaming
|
|
5
5
|
class Response
|
|
6
|
-
|
|
7
6
|
# Initializes a new Response object
|
|
8
7
|
#
|
|
9
8
|
# @return [Twitter::Streaming::Response]
|
|
@@ -28,7 +27,6 @@ module Twitter
|
|
|
28
27
|
@block.call(JSON.parse(line, :symbolize_names => true))
|
|
29
28
|
end
|
|
30
29
|
end
|
|
31
|
-
|
|
32
30
|
end
|
|
33
31
|
end
|
|
34
32
|
end
|
data/lib/twitter/suggestion.rb
CHANGED
data/lib/twitter/token.rb
CHANGED
|
@@ -3,15 +3,14 @@ require 'twitter/base'
|
|
|
3
3
|
module Twitter
|
|
4
4
|
class Token < Twitter::Base
|
|
5
5
|
attr_reader :access_token, :token_type
|
|
6
|
-
|
|
6
|
+
alias_method :to_s, :access_token
|
|
7
7
|
|
|
8
|
-
BEARER_TYPE =
|
|
8
|
+
BEARER_TYPE = 'bearer'
|
|
9
9
|
|
|
10
10
|
# @return [Boolean]
|
|
11
11
|
def bearer?
|
|
12
12
|
@attrs[:token_type] == BEARER_TYPE
|
|
13
13
|
end
|
|
14
14
|
memoize :bearer?
|
|
15
|
-
|
|
16
15
|
end
|
|
17
16
|
end
|
|
@@ -9,27 +9,25 @@ module Twitter
|
|
|
9
9
|
include Twitter::Enumerable
|
|
10
10
|
include Memoizable
|
|
11
11
|
attr_reader :attrs
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
alias_method :to_h, :attrs
|
|
13
|
+
alias_method :to_hash, :attrs
|
|
14
|
+
alias_method :to_hsh, :attrs
|
|
15
15
|
|
|
16
16
|
class << self
|
|
17
|
-
|
|
18
17
|
# Construct a new TrendResults object from a response hash
|
|
19
18
|
#
|
|
20
19
|
# @param response [Hash]
|
|
21
20
|
# @return [Twitter::Base]
|
|
22
|
-
def from_response(response={})
|
|
21
|
+
def from_response(response = {})
|
|
23
22
|
new(response[:body].first)
|
|
24
23
|
end
|
|
25
|
-
|
|
26
24
|
end
|
|
27
25
|
|
|
28
26
|
# Initializes a new TrendResults object
|
|
29
27
|
#
|
|
30
28
|
# @param attrs [Hash]
|
|
31
29
|
# @return [Twitter::TrendResults]
|
|
32
|
-
def initialize(attrs={})
|
|
30
|
+
def initialize(attrs = {})
|
|
33
31
|
@attrs = attrs
|
|
34
32
|
@collection = Array(@attrs[:trends]).map do |trend|
|
|
35
33
|
Trend.new(trend)
|
|
@@ -60,6 +58,5 @@ module Twitter
|
|
|
60
58
|
!@attrs[:locations].nil? && !@attrs[:locations].first.nil?
|
|
61
59
|
end
|
|
62
60
|
memoize :location?
|
|
63
|
-
|
|
64
61
|
end
|
|
65
62
|
end
|
data/lib/twitter/tweet.rb
CHANGED
|
@@ -4,39 +4,33 @@ module Twitter
|
|
|
4
4
|
class Tweet < Twitter::Identity
|
|
5
5
|
include Twitter::Creatable
|
|
6
6
|
attr_reader :favorite_count, :favorited, :in_reply_to_screen_name,
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
7
|
+
:in_reply_to_attrs_id, :in_reply_to_status_id,
|
|
8
|
+
:in_reply_to_user_id, :lang, :retweet_count, :retweeted,
|
|
9
|
+
:source, :text, :truncated
|
|
10
|
+
alias_method :favorites_count, :favorite_count
|
|
11
|
+
alias_method :favoriters_count, :favorite_count
|
|
12
|
+
alias_method :in_reply_to_tweet_id, :in_reply_to_status_id
|
|
13
|
+
alias_method :retweeters_count, :retweet_count
|
|
14
14
|
object_attr_reader :GeoFactory, :geo
|
|
15
15
|
object_attr_reader :Metadata, :metadata
|
|
16
16
|
object_attr_reader :Place, :place
|
|
17
17
|
object_attr_reader :Tweet, :retweeted_status
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
alias_method :retweet, :retweeted_status
|
|
19
|
+
alias_method :retweeted_tweet, :retweeted_status
|
|
20
|
+
alias_method :retweet?, :retweeted_status?
|
|
21
|
+
alias_method :retweeted_tweet?, :retweeted_status?
|
|
22
22
|
object_attr_reader :User, :user, :status
|
|
23
23
|
|
|
24
24
|
# @return [Boolean]
|
|
25
25
|
def entities?
|
|
26
|
-
!@attrs[:entities].nil? && @attrs[:entities].any?{|_, array| !array.empty?}
|
|
26
|
+
!@attrs[:entities].nil? && @attrs[:entities].any? { |_, array| !array.empty? }
|
|
27
27
|
end
|
|
28
28
|
memoize :entities?
|
|
29
29
|
|
|
30
30
|
def filter_level
|
|
31
|
-
@attrs[:filter_level] ||
|
|
31
|
+
@attrs[:filter_level] || 'none'
|
|
32
32
|
end
|
|
33
33
|
memoize :filter_level
|
|
34
|
-
|
|
35
|
-
# @note Not a real entity
|
|
36
|
-
# @return [Boolean]
|
|
37
|
-
def deleted?
|
|
38
|
-
deleted == true
|
|
39
|
-
end
|
|
40
34
|
|
|
41
35
|
# @return [String]
|
|
42
36
|
# @note May be > 140 characters.
|
|
@@ -82,7 +76,7 @@ module Twitter
|
|
|
82
76
|
Addressable::URI.parse("https://twitter.com/#{user.screen_name}/status/#{id}")
|
|
83
77
|
end
|
|
84
78
|
memoize :uri
|
|
85
|
-
|
|
79
|
+
alias_method :url, :uri
|
|
86
80
|
|
|
87
81
|
# @note Must include entities in your request for this method to work
|
|
88
82
|
# @return [Array<Twitter::Entity::URI>]
|
|
@@ -90,7 +84,7 @@ module Twitter
|
|
|
90
84
|
entities(Entity::URI, :urls)
|
|
91
85
|
end
|
|
92
86
|
memoize :uris
|
|
93
|
-
|
|
87
|
+
alias_method :urls, :uris
|
|
94
88
|
|
|
95
89
|
# @note Must include entities in your request for this method to work
|
|
96
90
|
# @return [Array<Twitter::Entity::UserMention>]
|
|
@@ -113,8 +107,6 @@ module Twitter
|
|
|
113
107
|
[]
|
|
114
108
|
end
|
|
115
109
|
end
|
|
116
|
-
|
|
117
110
|
end
|
|
118
|
-
|
|
119
|
-
Status = Tweet
|
|
111
|
+
Status = Tweet # rubocop:disable ConstantName
|
|
120
112
|
end
|
data/lib/twitter/user.rb
CHANGED
|
@@ -7,32 +7,32 @@ module Twitter
|
|
|
7
7
|
PREDICATE_URI_METHOD_REGEX = /_uri\?$/
|
|
8
8
|
include Twitter::Creatable
|
|
9
9
|
attr_reader :connections, :contributors_enabled, :default_profile,
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
10
|
+
:default_profile_image, :description, :favourites_count,
|
|
11
|
+
:follow_request_sent, :followers_count, :friends_count,
|
|
12
|
+
:geo_enabled, :is_translator, :lang, :listed_count, :location,
|
|
13
|
+
:name, :notifications, :profile_background_color,
|
|
14
|
+
:profile_background_image_url,
|
|
15
|
+
:profile_background_image_url_https, :profile_background_tile,
|
|
16
|
+
:profile_link_color, :profile_sidebar_border_color,
|
|
17
|
+
:profile_sidebar_fill_color, :profile_text_color,
|
|
18
|
+
:profile_use_background_image, :protected, :statuses_count,
|
|
19
|
+
:time_zone, :utc_offset, :verified
|
|
20
|
+
alias_method :favorites_count, :favourites_count
|
|
20
21
|
remove_method :favourites_count
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
alias_method :profile_background_image_uri, :profile_background_image_url
|
|
23
|
+
alias_method :profile_background_image_uri_https, :profile_background_image_url_https
|
|
24
|
+
alias_method :translator?, :is_translator
|
|
25
|
+
alias_method :tweets_count, :statuses_count
|
|
25
26
|
object_attr_reader :Tweet, :status, :user
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
alias_method :tweet, :status
|
|
28
|
+
alias_method :tweet?, :status?
|
|
29
|
+
alias_method :tweeted?, :status?
|
|
29
30
|
|
|
30
31
|
class << self
|
|
31
|
-
|
|
32
32
|
private
|
|
33
33
|
|
|
34
34
|
def alias_predicate_uri_methods(method)
|
|
35
|
-
|
|
35
|
+
%w(_url? _uri_https? _url_https?).each do |replacement|
|
|
36
36
|
alias_method_sub(method, PREDICATE_URI_METHOD_REGEX, replacement)
|
|
37
37
|
end
|
|
38
38
|
end
|
|
@@ -40,7 +40,6 @@ module Twitter
|
|
|
40
40
|
def alias_method_sub(method, pattern, replacement)
|
|
41
41
|
alias_method(method.to_s.sub(pattern, replacement).to_sym, method)
|
|
42
42
|
end
|
|
43
|
-
|
|
44
43
|
end
|
|
45
44
|
|
|
46
45
|
# @return [Array<Twitter::Entity::URI>]
|
|
@@ -50,25 +49,25 @@ module Twitter
|
|
|
50
49
|
end
|
|
51
50
|
end
|
|
52
51
|
memoize :description_uris
|
|
53
|
-
|
|
52
|
+
alias_method :description_urls, :description_uris
|
|
54
53
|
|
|
55
54
|
# Return the URL to the user's profile banner image
|
|
56
55
|
#
|
|
57
56
|
# @param size [String, Symbol] The size of the image. Must be one of: 'mobile', 'mobile_retina', 'web', 'web_retina', 'ipad', or 'ipad_retina'
|
|
58
57
|
# @return [String]
|
|
59
|
-
def profile_banner_uri(size
|
|
58
|
+
def profile_banner_uri(size = :web)
|
|
60
59
|
parse_encoded_uri(insecure_uri([@attrs[:profile_banner_url], size].join('/'))) if @attrs[:profile_banner_url]
|
|
61
60
|
end
|
|
62
|
-
|
|
61
|
+
alias_method :profile_banner_url, :profile_banner_uri
|
|
63
62
|
|
|
64
63
|
# Return the secure URL to the user's profile banner image
|
|
65
64
|
#
|
|
66
65
|
# @param size [String, Symbol] The size of the image. Must be one of: 'mobile', 'mobile_retina', 'web', 'web_retina', 'ipad', or 'ipad_retina'
|
|
67
66
|
# @return [String]
|
|
68
|
-
def profile_banner_uri_https(size
|
|
67
|
+
def profile_banner_uri_https(size = :web)
|
|
69
68
|
parse_encoded_uri([@attrs[:profile_banner_url], size].join('/')) if @attrs[:profile_banner_url]
|
|
70
69
|
end
|
|
71
|
-
|
|
70
|
+
alias_method :profile_banner_url_https, :profile_banner_uri_https
|
|
72
71
|
|
|
73
72
|
# @return [Boolean]
|
|
74
73
|
def profile_banner_uri?
|
|
@@ -81,16 +80,16 @@ module Twitter
|
|
|
81
80
|
#
|
|
82
81
|
# @param size [String, Symbol] The size of the image. Must be one of: 'mini', 'normal', 'bigger' or 'original'
|
|
83
82
|
# @return [String]
|
|
84
|
-
def profile_image_uri(size
|
|
83
|
+
def profile_image_uri(size = :normal)
|
|
85
84
|
parse_encoded_uri(insecure_uri(profile_image_uri_https(size))) if @attrs[:profile_image_url_https]
|
|
86
85
|
end
|
|
87
|
-
|
|
86
|
+
alias_method :profile_image_url, :profile_image_uri
|
|
88
87
|
|
|
89
88
|
# Return the secure URL to the user's profile image
|
|
90
89
|
#
|
|
91
90
|
# @param size [String, Symbol] The size of the image. Must be one of: 'mini', 'normal', 'bigger' or 'original'
|
|
92
91
|
# @return [String]
|
|
93
|
-
def profile_image_uri_https(size
|
|
92
|
+
def profile_image_uri_https(size = :normal)
|
|
94
93
|
# The profile image URL comes in looking like like this:
|
|
95
94
|
# https://a0.twimg.com/profile_images/1759857427/image1326743606_normal.png
|
|
96
95
|
# It can be converted to any of the following sizes:
|
|
@@ -99,7 +98,7 @@ module Twitter
|
|
|
99
98
|
# https://a0.twimg.com/profile_images/1759857427/image1326743606_bigger.png
|
|
100
99
|
parse_encoded_uri(@attrs[:profile_image_url_https].sub(PROFILE_IMAGE_SUFFIX_REGEX, profile_image_suffix(size))) if @attrs[:profile_image_url_https]
|
|
101
100
|
end
|
|
102
|
-
|
|
101
|
+
alias_method :profile_image_url_https, :profile_image_uri_https
|
|
103
102
|
|
|
104
103
|
def profile_image_uri?
|
|
105
104
|
!!@attrs[:profile_image_url_https]
|
|
@@ -112,7 +111,7 @@ module Twitter
|
|
|
112
111
|
Addressable::URI.parse("https://twitter.com/#{screen_name}")
|
|
113
112
|
end
|
|
114
113
|
memoize :uri
|
|
115
|
-
|
|
114
|
+
alias_method :url, :uri
|
|
116
115
|
|
|
117
116
|
# @return [String] The URL to the user's website.
|
|
118
117
|
def website
|
|
@@ -136,8 +135,7 @@ module Twitter
|
|
|
136
135
|
end
|
|
137
136
|
|
|
138
137
|
def profile_image_suffix(size)
|
|
139
|
-
:original == size.to_sym ?
|
|
138
|
+
:original == size.to_sym ? '\\1' : "_#{size}\\1"
|
|
140
139
|
end
|
|
141
|
-
|
|
142
140
|
end
|
|
143
141
|
end
|
data/lib/twitter/version.rb
CHANGED
|
@@ -1,18 +1,15 @@
|
|
|
1
1
|
module Twitter
|
|
2
2
|
class Version
|
|
3
3
|
MAJOR = 5
|
|
4
|
-
MINOR =
|
|
5
|
-
PATCH =
|
|
4
|
+
MINOR = 2
|
|
5
|
+
PATCH = 0
|
|
6
6
|
PRE = nil
|
|
7
7
|
|
|
8
8
|
class << self
|
|
9
|
-
|
|
10
9
|
# @return [String]
|
|
11
10
|
def to_s
|
|
12
11
|
[MAJOR, MINOR, PATCH, PRE].compact.join('.')
|
|
13
12
|
end
|
|
14
|
-
|
|
15
13
|
end
|
|
16
|
-
|
|
17
14
|
end
|
|
18
15
|
end
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
{"friends":[488736931,311444249]}
|
|
2
2
|
{"created_at":"Wed Apr 06 19:13:37 +0000 2011","id":55709764298092545,"id_str":"55709764298092545","text":"The problem with your code is that it's doing exactly what you told it to do.","source":"\u003ca href=\"http:\/\/twitter.com\/download\/iphone\" rel=\"nofollow\"\u003eTwitter for iPhone\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":7505382,"id_str":"7505382","name":"Erik Michaels-Ober","screen_name":"sferik","location":"San Francisco","description":"Write code. Not too much. Mostly Ruby.","url":"https:\/\/github.com\/sferik","entities":{"url":{"urls":[{"url":"https:\/\/github.com\/sferik","expanded_url":null,"indices":[0,25]}]},"description":{"urls":[]}},"protected":false,"followers_count":2479,"friends_count":200,"listed_count":132,"created_at":"Mon Jul 16 12:59:01 +0000 2007","favourites_count":4421,"utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","geo_enabled":true,"verified":false,"statuses_count":8730,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"000000","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/677717672\/bb0b3653dcf0644e344823e0a2eb3382.png","profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/677717672\/bb0b3653dcf0644e344823e0a2eb3382.png","profile_background_tile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1759857427\/image1326743606_normal.png","profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1759857427\/image1326743606_normal.png","profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/7505382\/1349499693","profile_link_color":"0084B4","profile_sidebar_border_color":"000000","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":{"type":"Point","coordinates":[37.78349999,-122.39362884]},"coordinates":{"type":"Point","coordinates":[-122.39362884,37.78349999]},"place":{"id":"5c92ab5379de3839","url":"https:\/\/api.twitter.com\/1.1\/geo\/id\/5c92ab5379de3839.json","place_type":"neighborhood","name":"South Beach","full_name":"South Beach, San Francisco","country_code":"US","country":"United States","bounding_box":{"type":"Polygon","coordinates":[[[-122.403482,37.777529],[-122.387436,37.777529],[-122.387436,37.794486],[-122.403482,37.794486]]]},"attributes":{}},"contributors":null,"retweet_count":316,"entities":{"hashtags":[],"urls":[],"user_mentions":[]},"favorited":false,"retweeted":false}
|
|
3
|
-
{"created_at":"Wed Apr 06 19:13:37 +0000 2011","id":55709764298092545,"id_str":"55709764298092545","text":"The problem with your code is that it's doing exactly what you told it to do.","source":"\u003ca href=\"http:\/\/twitter.com\/download\/iphone\" rel=\"nofollow\"\u003eTwitter for iPhone\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":7505382,"id_str":"7505382","name":"Erik Michaels-Ober","screen_name":"sferik","location":"San Francisco","description":"Write code. Not too much. Mostly Ruby.","url":"https:\/\/github.com\/sferik","entities":{"url":{"urls":[{"url":"https:\/\/github.com\/sferik","expanded_url":null,"indices":[0,25]}]},"description":{"urls":[]}},"protected":false,"followers_count":2479,"friends_count":200,"listed_count":132,"created_at":"Mon Jul 16 12:59:01 +0000 2007","favourites_count":4421,"utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","geo_enabled":true,"verified":false,"statuses_count":8730,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"000000","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/677717672\/bb0b3653dcf0644e344823e0a2eb3382.png","profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/677717672\/bb0b3653dcf0644e344823e0a2eb3382.png","profile_background_tile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1759857427\/image1326743606_normal.png","profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1759857427\/image1326743606_normal.png","profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/7505382\/1349499693","profile_link_color":"0084B4","profile_sidebar_border_color":"000000","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":{"type":"Point","coordinates":[37.78349999,-122.39362884]},"coordinates":{"type":"Point","coordinates":[-122.39362884,37.78349999]},"place":{"id":"5c92ab5379de3839","url":"https:\/\/api.twitter.com\/1.1\/geo\/id\/5c92ab5379de3839.json","place_type":"neighborhood","name":"South Beach","full_name":"South Beach, San Francisco","country_code":"US","country":"United States","bounding_box":{"type":"Polygon","coordinates":[[[-122.403482,37.777529],[-122.387436,37.777529],[-122.387436,37.794486],[-122.403482,37.794486]]]},"attributes":{}},"contributors":null,"retweet_count":316,"entities":{"hashtags":[],"urls":[],"user_mentions":[]},"favorited":false,"retweeted":false}
|
|
4
3
|
{"direct_message":{"id":389327745617891328,"id_str":"389327745617891328","text":"hello bot","sender":{"id":10083602,"id_str":"10083602","name":"Adam Bird","screen_name":"adambird","location":"Nottingham, UK","url":"http:\/\/about.me\/adambird", "description":"CEO @onediaryapp, ex @esendex CTO and co-founder, still cycling","protected":false,"followers_count":1286,"friends_count":850,"listed_count":51,"created_at":"Fri Nov 09 00:35:12 +0000 2007","favourites_count":93,"utc_offset":3600,"time_zone":"London","geo_enabled":true,"verified":false,"statuses_count":13480,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/378800000477232297\/23d85bb78f71534eea1e1133fb771f86_normal.jpeg","profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/378800000477232297\/23d85bb78f71534eea1e1133fb771f86_normal.jpeg","profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"default_profile":true,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"sender_id":10083602,"sender_id_str":"10083602","sender_screen_name":"adambird","recipient":{"id":1292911088,"id_str":"1292911088","name":"One Diary Bot","screen_name":"onediarybot","location":"","url":"http:\/\/www.onediary.com","description":"I'm the One Diary bot, here to help you with your life including personal cycling weather forecasts.","protected":false,"followers_count":113,"friends_count":148,"listed_count":1,"created_at":"Sat Mar 23 23:52:18 +0000 2013","favourites_count":0,"utc_offset":"","time_zone":"","geo_enabled":false,"verified":false,"statuses_count":7919,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/3651575369\/090551d8dd92080198f707769239ff43_normal.jpeg","profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/3651575369\/090551d8dd92080198f707769239ff43_normal.jpeg","profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"default_profile":true,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"recipient_id":1292911088,"recipient_id_str":"1292911088","recipient_screen_name":"onediarybot","created_at":"Sun Oct 13 09:52:22 +0000 2013","entities":{"hashtags":[],"symbols":[],"urls":[],"user_mentions":[]}}}
|
|
5
4
|
{"event":"follow","source":{"id":10083602,"id_str":"10083602","name":"Adam Bird","screen_name":"adambird","location":"Nottingham, UK","url":"http://t.co/M1eaIKDQyz","description":"CEO @onediaryapp, ex @esendex CTO and co-founder, still cycling","protected":false,"followers_count":1295,"friends_count":850,"listed_count":53,"created_at":"Fri Nov 09 00:35:12 +0000 2007","favourites_count":93,"utc_offset":0,"time_zone":"London","geo_enabled":true,"verified":false,"statuses_count":13507,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http://abs.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme1/bg.png","profile_background_tile":false,"profile_image_url":"http://pbs.twimg.com/profile_images/378800000477232297/23d85bb78f71534eea1e1133fb771f86_normal.jpeg","profile_image_url_https":"https://pbs.twimg.com/profile_images/378800000477232297/23d85bb78f71534eea1e1133fb771f86_normal.jpeg","profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"default_profile":true,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"target":{"id":1292911088,"id_str":"1292911088","name":"One Diary Bot","screen_name":"onediarybot","location":null,"url":"http://t.co/etHGc0xHX4","description":"I'm the One Diary bot, here to help you with your life including personal cycling weather forecasts.","protected":false,"followers_count":123,"friends_count":157,"listed_count":1,"created_at":"Sat Mar 23 23:52:18 +0000 2013","favourites_count":0,"utc_offset":null,"time_zone":null,"geo_enabled":false,"verified":false,"statuses_count":9637,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http://abs.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme1/bg.png","profile_background_tile":false,"profile_image_url":"http://pbs.twimg.com/profile_images/3651575369/090551d8dd92080198f707769239ff43_normal.jpeg","profile_image_url_https":"https://pbs.twimg.com/profile_images/3651575369/090551d8dd92080198f707769239ff43_normal.jpeg","profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"default_profile":true,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"created_at":"Sun Oct 27 20:35:25 +0000 2013"}
|
|
5
|
+
{"delete":{"status":{"id":272691609211117568,"user_id":478569062,"id_str":"272691609211117568","user_id_str":"478569062","deleted":true}}}
|
|
6
|
+
{"warning":{"code":"FALLING_BEHIND","message":"Your connection is falling behind and messages are being queued for delivery to you. Your queue is now over 60% full. You will be disconnected when the queue is full.","percent_full":60}}
|
data/spec/helper.rb
CHANGED
|
@@ -5,7 +5,11 @@ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
|
|
5
5
|
SimpleCov::Formatter::HTMLFormatter,
|
|
6
6
|
Coveralls::SimpleCov::Formatter
|
|
7
7
|
]
|
|
8
|
-
|
|
8
|
+
|
|
9
|
+
SimpleCov.start do
|
|
10
|
+
add_filter '/spec/'
|
|
11
|
+
minimum_coverage(99.07)
|
|
12
|
+
end
|
|
9
13
|
|
|
10
14
|
require 'twitter'
|
|
11
15
|
require 'rspec'
|
|
@@ -55,7 +59,7 @@ def stub_put(path)
|
|
|
55
59
|
end
|
|
56
60
|
|
|
57
61
|
def fixture_path
|
|
58
|
-
File.expand_path(
|
|
62
|
+
File.expand_path('../fixtures', __FILE__)
|
|
59
63
|
end
|
|
60
64
|
|
|
61
65
|
def fixture(file)
|
data/spec/twitter/base_spec.rb
CHANGED
|
@@ -5,22 +5,22 @@ describe Twitter::Base do
|
|
|
5
5
|
@base = Twitter::Base.new(:id => 1)
|
|
6
6
|
end
|
|
7
7
|
|
|
8
|
-
describe
|
|
9
|
-
it
|
|
8
|
+
describe '#[]' do
|
|
9
|
+
it 'calls methods using [] with symbol' do
|
|
10
10
|
expect(@base[:object_id]).to be_an Integer
|
|
11
11
|
end
|
|
12
|
-
it
|
|
13
|
-
expect(@base[
|
|
12
|
+
it 'calls methods using [] with string' do
|
|
13
|
+
expect(@base['object_id']).to be_an Integer
|
|
14
14
|
end
|
|
15
|
-
it
|
|
15
|
+
it 'returns nil for missing method' do
|
|
16
16
|
expect(@base[:foo]).to be_nil
|
|
17
|
-
expect(@base[
|
|
17
|
+
expect(@base['foo']).to be_nil
|
|
18
18
|
end
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
-
describe
|
|
22
|
-
it
|
|
23
|
-
expect(@base.attrs).to eq(
|
|
21
|
+
describe '#attrs' do
|
|
22
|
+
it 'returns a hash of attributes' do
|
|
23
|
+
expect(@base.attrs).to eq(:id => 1)
|
|
24
24
|
end
|
|
25
25
|
end
|
|
26
26
|
|
|
@@ -2,18 +2,18 @@ require 'helper'
|
|
|
2
2
|
|
|
3
3
|
describe Twitter::BasicUser do
|
|
4
4
|
|
|
5
|
-
describe
|
|
6
|
-
it
|
|
7
|
-
saved_search = Twitter::BasicUser.new(:id => 1, :name =>
|
|
8
|
-
other = Twitter::BasicUser.new(:id => 1, :name =>
|
|
5
|
+
describe '#==' do
|
|
6
|
+
it 'returns true when objects IDs are the same' do
|
|
7
|
+
saved_search = Twitter::BasicUser.new(:id => 1, :name => 'foo')
|
|
8
|
+
other = Twitter::BasicUser.new(:id => 1, :name => 'bar')
|
|
9
9
|
expect(saved_search == other).to be true
|
|
10
10
|
end
|
|
11
|
-
it
|
|
11
|
+
it 'returns false when objects IDs are different' do
|
|
12
12
|
saved_search = Twitter::BasicUser.new(:id => 1)
|
|
13
13
|
other = Twitter::BasicUser.new(:id => 2)
|
|
14
14
|
expect(saved_search == other).to be false
|
|
15
15
|
end
|
|
16
|
-
it
|
|
16
|
+
it 'returns false when classes are different' do
|
|
17
17
|
saved_search = Twitter::BasicUser.new(:id => 1)
|
|
18
18
|
other = Twitter::Identity.new(:id => 1)
|
|
19
19
|
expect(saved_search == other).to be false
|