twitter 4.8.1 → 5.0.0.rc.1
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +0 -0
- data/CHANGELOG.md +30 -0
- data/LICENSE.md +1 -1
- data/README.md +386 -266
- data/lib/twitter.rb +4 -39
- data/lib/twitter/arguments.rb +11 -0
- data/lib/twitter/base.rb +89 -68
- data/lib/twitter/client.rb +69 -110
- data/lib/twitter/configuration.rb +7 -3
- data/lib/twitter/creatable.rb +2 -4
- data/lib/twitter/cursor.rb +50 -42
- data/lib/twitter/direct_message.rb +2 -11
- data/lib/twitter/entity/uri.rb +13 -0
- data/lib/twitter/enumerable.rb +15 -0
- data/lib/twitter/error.rb +55 -7
- data/lib/twitter/error/already_favorited.rb +1 -1
- data/lib/twitter/error/already_posted.rb +10 -0
- data/lib/twitter/error/already_retweeted.rb +1 -1
- data/lib/twitter/error/bad_gateway.rb +2 -3
- data/lib/twitter/error/bad_request.rb +2 -2
- data/lib/twitter/error/forbidden.rb +2 -2
- data/lib/twitter/error/gateway_timeout.rb +2 -3
- data/lib/twitter/error/internal_server_error.rb +2 -3
- data/lib/twitter/error/not_acceptable.rb +2 -2
- data/lib/twitter/error/not_found.rb +2 -2
- data/lib/twitter/error/service_unavailable.rb +2 -3
- data/lib/twitter/error/too_many_requests.rb +2 -2
- data/lib/twitter/error/unauthorized.rb +2 -2
- data/lib/twitter/error/unprocessable_entity.rb +2 -2
- data/lib/twitter/factory.rb +2 -8
- data/lib/twitter/geo_factory.rb +2 -2
- data/lib/twitter/geo_results.rb +36 -0
- data/lib/twitter/identity.rb +0 -22
- data/lib/twitter/list.rb +18 -4
- data/lib/twitter/media/photo.rb +3 -3
- data/lib/twitter/media_factory.rb +2 -2
- data/lib/twitter/null_object.rb +24 -0
- data/lib/twitter/oembed.rb +3 -2
- data/lib/twitter/place.rb +15 -9
- data/lib/twitter/profile_banner.rb +5 -3
- data/lib/twitter/rate_limit.rb +1 -17
- data/lib/twitter/relationship.rb +2 -10
- data/lib/twitter/rest/api/direct_messages.rb +135 -0
- data/lib/twitter/rest/api/favorites.rb +120 -0
- data/lib/twitter/rest/api/friends_and_followers.rb +290 -0
- data/lib/twitter/rest/api/help.rb +58 -0
- data/lib/twitter/rest/api/lists.rb +491 -0
- data/lib/twitter/rest/api/oauth.rb +45 -0
- data/lib/twitter/rest/api/places_and_geo.rb +104 -0
- data/lib/twitter/rest/api/saved_searches.rb +91 -0
- data/lib/twitter/rest/api/search.rb +37 -0
- data/lib/twitter/rest/api/spam_reporting.rb +29 -0
- data/lib/twitter/rest/api/suggested_users.rb +51 -0
- data/lib/twitter/rest/api/timelines.rb +202 -0
- data/lib/twitter/rest/api/trends.rb +58 -0
- data/lib/twitter/rest/api/tweets.rb +293 -0
- data/lib/twitter/rest/api/undocumented.rb +52 -0
- data/lib/twitter/rest/api/users.rb +383 -0
- data/lib/twitter/rest/api/utils.rb +219 -0
- data/lib/twitter/rest/client.rb +193 -0
- data/lib/twitter/rest/request/multipart_with_file.rb +36 -0
- data/lib/twitter/rest/response/parse_json.rb +27 -0
- data/lib/twitter/{response → rest/response}/raise_error.rb +8 -11
- data/lib/twitter/search_results.rb +33 -21
- data/lib/twitter/settings.rb +1 -6
- data/lib/twitter/size.rb +1 -1
- data/lib/twitter/streaming/client.rb +77 -0
- data/lib/twitter/streaming/connection.rb +22 -0
- data/lib/twitter/streaming/response.rb +30 -0
- data/lib/twitter/suggestion.rb +4 -2
- data/lib/twitter/token.rb +8 -0
- data/lib/twitter/trend.rb +2 -1
- data/lib/twitter/trend_results.rb +59 -0
- data/lib/twitter/tweet.rb +41 -85
- data/lib/twitter/user.rb +51 -41
- data/lib/twitter/version.rb +4 -4
- data/spec/fixtures/already_posted.json +1 -0
- data/spec/fixtures/ids_list.json +1 -1
- data/spec/fixtures/ids_list2.json +1 -1
- data/spec/fixtures/search.json +1 -1
- data/spec/fixtures/search_malformed.json +1 -1
- data/spec/fixtures/track_streaming.json +3 -0
- data/spec/helper.rb +8 -13
- data/spec/twitter/base_spec.rb +25 -99
- data/spec/twitter/configuration_spec.rb +1 -1
- data/spec/twitter/cursor_spec.rb +13 -31
- data/spec/twitter/direct_message_spec.rb +41 -8
- data/spec/twitter/entity/uri_spec.rb +74 -0
- data/spec/twitter/error_spec.rb +59 -11
- data/spec/twitter/geo/point_spec.rb +1 -1
- data/spec/twitter/geo_factory_spec.rb +3 -3
- data/spec/twitter/geo_results_spec.rb +35 -0
- data/spec/twitter/identifiable_spec.rb +0 -21
- data/spec/twitter/list_spec.rb +51 -8
- data/spec/twitter/media/photo_spec.rb +118 -3
- data/spec/twitter/media_factory_spec.rb +2 -2
- data/spec/twitter/null_object_spec.rb +26 -0
- data/spec/twitter/oembed_spec.rb +69 -45
- data/spec/twitter/place_spec.rb +68 -12
- data/spec/twitter/profile_banner_spec.rb +1 -1
- data/spec/twitter/rate_limit_spec.rb +12 -12
- data/spec/twitter/relationship_spec.rb +31 -9
- data/spec/twitter/{api → rest/api}/direct_messages_spec.rb +22 -9
- data/spec/twitter/{api → rest/api}/favorites_spec.rb +80 -7
- data/spec/twitter/{api → rest/api}/friends_and_followers_spec.rb +104 -65
- data/spec/twitter/{api → rest/api}/geo_spec.rb +10 -10
- data/spec/twitter/{api → rest/api}/help_spec.rb +6 -6
- data/spec/twitter/{api → rest/api}/lists_spec.rb +77 -56
- data/spec/twitter/{api → rest/api}/oauth_spec.rb +6 -6
- data/spec/twitter/{api → rest/api}/saved_searches_spec.rb +7 -7
- data/spec/twitter/{api → rest/api}/search_spec.rb +8 -9
- data/spec/twitter/{api → rest/api}/spam_reporting_spec.rb +3 -3
- data/spec/twitter/{api → rest/api}/suggested_users_spec.rb +5 -5
- data/spec/twitter/{api → rest/api}/timelines_spec.rb +9 -9
- data/spec/twitter/{api → rest/api}/trends_spec.rb +6 -6
- data/spec/twitter/rest/api/tweets_spec.rb +503 -0
- data/spec/twitter/{api → rest/api}/undocumented_spec.rb +19 -45
- data/spec/twitter/{api → rest/api}/users_spec.rb +60 -35
- data/spec/twitter/rest/client_spec.rb +193 -0
- data/spec/twitter/saved_search_spec.rb +11 -0
- data/spec/twitter/search_results_spec.rb +29 -42
- data/spec/twitter/settings_spec.rb +17 -6
- data/spec/twitter/streaming/client_spec.rb +75 -0
- data/spec/twitter/token_spec.rb +16 -0
- data/spec/twitter/trend_results_spec.rb +89 -0
- data/spec/twitter/trend_spec.rb +23 -0
- data/spec/twitter/tweet_spec.rb +122 -115
- data/spec/twitter/user_spec.rb +136 -77
- data/spec/twitter_spec.rb +0 -119
- data/twitter.gemspec +8 -5
- metadata +148 -141
- metadata.gz.sig +0 -0
- data/lib/twitter/action/favorite.rb +0 -19
- data/lib/twitter/action/follow.rb +0 -30
- data/lib/twitter/action/list_member_added.rb +0 -39
- data/lib/twitter/action/mention.rb +0 -46
- data/lib/twitter/action/reply.rb +0 -27
- data/lib/twitter/action/retweet.rb +0 -27
- data/lib/twitter/action/tweet.rb +0 -20
- data/lib/twitter/action_factory.rb +0 -22
- data/lib/twitter/api/arguments.rb +0 -13
- data/lib/twitter/api/direct_messages.rb +0 -148
- data/lib/twitter/api/favorites.rb +0 -126
- data/lib/twitter/api/friends_and_followers.rb +0 -334
- data/lib/twitter/api/help.rb +0 -64
- data/lib/twitter/api/lists.rb +0 -618
- data/lib/twitter/api/oauth.rb +0 -44
- data/lib/twitter/api/places_and_geo.rb +0 -121
- data/lib/twitter/api/saved_searches.rb +0 -99
- data/lib/twitter/api/search.rb +0 -37
- data/lib/twitter/api/spam_reporting.rb +0 -30
- data/lib/twitter/api/suggested_users.rb +0 -55
- data/lib/twitter/api/timelines.rb +0 -214
- data/lib/twitter/api/trends.rb +0 -63
- data/lib/twitter/api/tweets.rb +0 -304
- data/lib/twitter/api/undocumented.rb +0 -97
- data/lib/twitter/api/users.rb +0 -439
- data/lib/twitter/api/utils.rb +0 -187
- data/lib/twitter/configurable.rb +0 -96
- data/lib/twitter/default.rb +0 -102
- data/lib/twitter/entity/url.rb +0 -9
- data/lib/twitter/error/client_error.rb +0 -35
- data/lib/twitter/error/decode_error.rb +0 -9
- data/lib/twitter/error/identity_map_key_error.rb +0 -9
- data/lib/twitter/error/server_error.rb +0 -28
- data/lib/twitter/exceptable.rb +0 -36
- data/lib/twitter/identity_map.rb +0 -22
- data/lib/twitter/request/multipart_with_file.rb +0 -34
- data/lib/twitter/response/parse_json.rb +0 -25
- data/spec/fixtures/about_me.json +0 -1
- data/spec/fixtures/activity_summary.json +0 -1
- data/spec/fixtures/bad_gateway.json +0 -1
- data/spec/fixtures/bad_request.json +0 -1
- data/spec/fixtures/by_friends.json +0 -1
- data/spec/fixtures/end_session.json +0 -1
- data/spec/fixtures/forbidden.json +0 -1
- data/spec/fixtures/internal_server_error.json +0 -1
- data/spec/fixtures/not_acceptable.json +0 -1
- data/spec/fixtures/phoenix_search.phoenix +0 -1
- data/spec/fixtures/resolve.json +0 -1
- data/spec/fixtures/service_unavailable.json +0 -1
- data/spec/fixtures/totals.json +0 -1
- data/spec/fixtures/trends.json +0 -1
- data/spec/fixtures/unauthorized.json +0 -1
- data/spec/fixtures/video_facets.json +0 -1
- data/spec/twitter/action/favorite_spec.rb +0 -29
- data/spec/twitter/action/follow_spec.rb +0 -29
- data/spec/twitter/action/list_member_added_spec.rb +0 -41
- data/spec/twitter/action/mention_spec.rb +0 -52
- data/spec/twitter/action/reply_spec.rb +0 -41
- data/spec/twitter/action/retweet_spec.rb +0 -41
- data/spec/twitter/action_factory_spec.rb +0 -35
- data/spec/twitter/action_spec.rb +0 -16
- data/spec/twitter/api/tweets_spec.rb +0 -285
- data/spec/twitter/client_spec.rb +0 -223
- data/spec/twitter/error/client_error_spec.rb +0 -23
- data/spec/twitter/error/server_error_spec.rb +0 -20
data/lib/twitter.rb
CHANGED
@@ -1,14 +1,10 @@
|
|
1
|
-
require 'twitter/action_factory'
|
2
|
-
require 'twitter/client'
|
3
|
-
require 'twitter/configurable'
|
4
1
|
require 'twitter/configuration'
|
5
2
|
require 'twitter/cursor'
|
6
|
-
require 'twitter/default'
|
7
3
|
require 'twitter/direct_message'
|
8
4
|
require 'twitter/entity'
|
9
5
|
require 'twitter/entity/hashtag'
|
10
6
|
require 'twitter/entity/symbol'
|
11
|
-
require 'twitter/entity/
|
7
|
+
require 'twitter/entity/uri'
|
12
8
|
require 'twitter/entity/user_mention'
|
13
9
|
require 'twitter/geo_factory'
|
14
10
|
require 'twitter/language'
|
@@ -20,47 +16,16 @@ require 'twitter/place'
|
|
20
16
|
require 'twitter/profile_banner'
|
21
17
|
require 'twitter/rate_limit'
|
22
18
|
require 'twitter/relationship'
|
19
|
+
require 'twitter/rest/client'
|
23
20
|
require 'twitter/saved_search'
|
24
21
|
require 'twitter/search_results'
|
25
22
|
require 'twitter/settings'
|
26
23
|
require 'twitter/size'
|
27
24
|
require 'twitter/source_user'
|
25
|
+
require 'twitter/streaming/client'
|
28
26
|
require 'twitter/suggestion'
|
29
27
|
require 'twitter/target_user'
|
30
28
|
require 'twitter/trend'
|
31
29
|
require 'twitter/tweet'
|
32
30
|
require 'twitter/user'
|
33
|
-
|
34
|
-
module Twitter
|
35
|
-
class << self
|
36
|
-
include Twitter::Configurable
|
37
|
-
|
38
|
-
# Delegate to a Twitter::Client
|
39
|
-
#
|
40
|
-
# @return [Twitter::Client]
|
41
|
-
def client
|
42
|
-
@client = Twitter::Client.new(options) unless defined?(@client) && @client.hash == options.hash
|
43
|
-
@client
|
44
|
-
end
|
45
|
-
|
46
|
-
# Has a client been initialized on the Twitter module
|
47
|
-
#
|
48
|
-
# @return [Boolean]
|
49
|
-
def client?
|
50
|
-
!!@client
|
51
|
-
end
|
52
|
-
|
53
|
-
def respond_to_missing?(method_name, include_private=false); client.respond_to?(method_name, include_private); end if RUBY_VERSION >= "1.9"
|
54
|
-
def respond_to?(method_name, include_private=false); client.respond_to?(method_name, include_private) || super; end if RUBY_VERSION < "1.9"
|
55
|
-
|
56
|
-
private
|
57
|
-
|
58
|
-
def method_missing(method_name, *args, &block)
|
59
|
-
return super unless client.respond_to?(method_name)
|
60
|
-
client.send(method_name, *args, &block)
|
61
|
-
end
|
62
|
-
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
Twitter.setup
|
31
|
+
require 'uri'
|
data/lib/twitter/base.rb
CHANGED
@@ -1,83 +1,114 @@
|
|
1
|
-
require '
|
1
|
+
require 'forwardable'
|
2
|
+
require 'twitter/null_object'
|
3
|
+
require 'uri'
|
2
4
|
|
3
5
|
module Twitter
|
4
6
|
class Base
|
5
|
-
|
7
|
+
extend Forwardable
|
8
|
+
attr_reader :attrs
|
9
|
+
alias to_h attrs
|
10
|
+
alias to_hash attrs
|
11
|
+
alias to_hsh attrs
|
12
|
+
def_delegators :attrs, :delete, :update
|
13
|
+
|
14
|
+
# Define methods that retrieve the value from attributes
|
6
15
|
#
|
7
|
-
# @param attrs [Array,
|
16
|
+
# @param attrs [Array, Symbol]
|
8
17
|
def self.attr_reader(*attrs)
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
@attrs[attribute.to_sym]
|
13
|
-
end
|
14
|
-
define_method "#{attribute}?" do
|
15
|
-
!!@attrs[attribute.to_sym]
|
16
|
-
end
|
17
|
-
end
|
18
|
+
attrs.each do |attr|
|
19
|
+
define_attribute_method(attr)
|
20
|
+
define_predicate_method(attr)
|
18
21
|
end
|
19
|
-
const_set(:Attributes, mod)
|
20
|
-
include mod
|
21
22
|
end
|
22
23
|
|
23
|
-
#
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
24
|
+
# Define object methods from attributes
|
25
|
+
#
|
26
|
+
# @param klass [Symbol]
|
27
|
+
# @param key1 [Symbol]
|
28
|
+
# @param key2 [Symbol]
|
29
|
+
def self.object_attr_reader(klass, key1, key2=nil)
|
30
|
+
define_attribute_method(key1, klass, key2)
|
31
|
+
define_predicate_method(key1)
|
28
32
|
end
|
29
33
|
|
30
|
-
#
|
34
|
+
# Define URI methods from attributes
|
31
35
|
#
|
32
|
-
# @param attrs [
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
36
|
+
# @param attrs [Array, Symbol]
|
37
|
+
def self.uri_attr_reader(*attrs)
|
38
|
+
attrs.each do |uri_key|
|
39
|
+
array = uri_key.to_s.split("_")
|
40
|
+
index = array.index("uri")
|
41
|
+
array[index] = "url"
|
42
|
+
url_key = array.join("_").to_sym
|
43
|
+
define_uri_method(uri_key, url_key)
|
44
|
+
define_predicate_method(uri_key, url_key)
|
45
|
+
alias_method(url_key, uri_key)
|
46
|
+
alias_method("#{url_key}?", "#{uri_key}?")
|
38
47
|
end
|
39
|
-
return yield if block_given?
|
40
|
-
raise Twitter::Error::IdentityMapKeyError, "key not found"
|
41
48
|
end
|
42
49
|
|
43
|
-
#
|
50
|
+
# Dynamically define a method for a URI
|
44
51
|
#
|
45
|
-
# @param
|
46
|
-
# @
|
47
|
-
def self.
|
48
|
-
|
49
|
-
|
52
|
+
# @param key1 [Symbol]
|
53
|
+
# @param key2 [Symbol]
|
54
|
+
def self.define_uri_method(key1, key2)
|
55
|
+
define_method(key1) do
|
56
|
+
memoize(key1) do
|
57
|
+
::URI.parse(@attrs[key2]) if @attrs[key2]
|
58
|
+
end
|
59
|
+
end
|
50
60
|
end
|
51
61
|
|
52
|
-
#
|
62
|
+
# Dynamically define a method for an attribute
|
53
63
|
#
|
54
|
-
# @param
|
55
|
-
# @
|
56
|
-
|
57
|
-
|
64
|
+
# @param key1 [Symbol]
|
65
|
+
# @param klass [Symbol]
|
66
|
+
# @param key2 [Symbol]
|
67
|
+
def self.define_attribute_method(key1, klass=nil, key2=nil)
|
68
|
+
define_method(key1) do
|
69
|
+
memoize(key1) do
|
70
|
+
if klass.nil?
|
71
|
+
@attrs[key1]
|
72
|
+
else
|
73
|
+
if @attrs[key1]
|
74
|
+
if key2.nil?
|
75
|
+
Twitter.const_get(klass).new(@attrs[key1])
|
76
|
+
else
|
77
|
+
attrs = @attrs.dup
|
78
|
+
value = attrs.delete(key1)
|
79
|
+
Twitter.const_get(klass).new(value.update(key2 => attrs))
|
80
|
+
end
|
81
|
+
else
|
82
|
+
Twitter::NullObject.instance
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
58
87
|
end
|
59
88
|
|
60
|
-
#
|
61
|
-
# identity map if it doesn't already exist.
|
89
|
+
# Dynamically define a predicate method for an attribute
|
62
90
|
#
|
63
|
-
# @param
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
return new(attrs) unless identity_map
|
68
|
-
|
69
|
-
fetch(attrs) do
|
70
|
-
object = new(attrs)
|
71
|
-
store(object)
|
91
|
+
# @param key [Symbol]
|
92
|
+
def self.define_predicate_method(key1, key2=key1)
|
93
|
+
define_method(:"#{key1}?") do
|
94
|
+
!!@attrs[key2]
|
72
95
|
end
|
73
96
|
end
|
74
97
|
|
98
|
+
# Construct an object from a response hash
|
99
|
+
#
|
100
|
+
# @param response [Hash]
|
101
|
+
# @return [Twitter::Base]
|
102
|
+
def self.from_response(response={})
|
103
|
+
new(response[:body])
|
104
|
+
end
|
105
|
+
|
75
106
|
# Initializes a new object
|
76
107
|
#
|
77
108
|
# @param attrs [Hash]
|
78
109
|
# @return [Twitter::Base]
|
79
110
|
def initialize(attrs={})
|
80
|
-
@attrs = attrs
|
111
|
+
@attrs = attrs || {}
|
81
112
|
end
|
82
113
|
|
83
114
|
# Fetches an attribute of an object using hash notation
|
@@ -89,30 +120,20 @@ module Twitter
|
|
89
120
|
nil
|
90
121
|
end
|
91
122
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
end
|
98
|
-
alias to_hash attrs
|
99
|
-
|
100
|
-
# Update the attributes of an object
|
101
|
-
#
|
102
|
-
# @param attrs [Hash]
|
103
|
-
# @return [Twitter::Base]
|
104
|
-
def update(attrs)
|
105
|
-
@attrs.update(attrs)
|
106
|
-
self
|
123
|
+
def memoize(key, &block)
|
124
|
+
ivar = :"@#{key}"
|
125
|
+
return instance_variable_get(ivar) if instance_variable_defined?(ivar)
|
126
|
+
result = block.call
|
127
|
+
instance_variable_set(ivar, result)
|
107
128
|
end
|
108
129
|
|
109
|
-
|
130
|
+
private
|
110
131
|
|
111
132
|
# @param attr [Symbol]
|
112
133
|
# @param other [Twitter::Base]
|
113
134
|
# @return [Boolean]
|
114
135
|
def attr_equal(attr, other)
|
115
|
-
self.class == other.class && !other.send(attr).nil? && send(attr) == other.send(attr)
|
136
|
+
self.class == other.class && !other.send(attr.to_sym).nil? && send(attr.to_sym) == other.send(attr.to_sym)
|
116
137
|
end
|
117
138
|
|
118
139
|
# @param other [Twitter::Base]
|
data/lib/twitter/client.rb
CHANGED
@@ -1,147 +1,106 @@
|
|
1
|
-
require 'faraday'
|
2
|
-
require 'multi_json'
|
3
|
-
require 'twitter/api/direct_messages'
|
4
|
-
require 'twitter/api/favorites'
|
5
|
-
require 'twitter/api/friends_and_followers'
|
6
|
-
require 'twitter/api/help'
|
7
|
-
require 'twitter/api/lists'
|
8
|
-
require 'twitter/api/oauth'
|
9
|
-
require 'twitter/api/places_and_geo'
|
10
|
-
require 'twitter/api/saved_searches'
|
11
|
-
require 'twitter/api/search'
|
12
|
-
require 'twitter/api/spam_reporting'
|
13
|
-
require 'twitter/api/suggested_users'
|
14
|
-
require 'twitter/api/timelines'
|
15
|
-
require 'twitter/api/trends'
|
16
|
-
require 'twitter/api/tweets'
|
17
|
-
require 'twitter/api/undocumented'
|
18
|
-
require 'twitter/api/users'
|
19
|
-
require 'twitter/configurable'
|
20
|
-
require 'twitter/error/client_error'
|
21
|
-
require 'twitter/error/decode_error'
|
22
1
|
require 'simple_oauth'
|
2
|
+
require 'twitter/version'
|
23
3
|
require 'uri'
|
24
4
|
|
25
5
|
module Twitter
|
26
|
-
# Wrapper for the Twitter REST API
|
27
|
-
#
|
28
|
-
# @note All methods have been separated into modules and follow the same grouping used in {http://dev.twitter.com/doc the Twitter API Documentation}.
|
29
|
-
# @see http://dev.twitter.com/pages/every_developer
|
30
6
|
class Client
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
include Twitter::API::Lists
|
36
|
-
include Twitter::API::OAuth
|
37
|
-
include Twitter::API::PlacesAndGeo
|
38
|
-
include Twitter::API::SavedSearches
|
39
|
-
include Twitter::API::Search
|
40
|
-
include Twitter::API::SpamReporting
|
41
|
-
include Twitter::API::SuggestedUsers
|
42
|
-
include Twitter::API::Timelines
|
43
|
-
include Twitter::API::Trends
|
44
|
-
include Twitter::API::Tweets
|
45
|
-
include Twitter::API::Undocumented
|
46
|
-
include Twitter::API::Users
|
47
|
-
include Twitter::Configurable
|
7
|
+
attr_writer :access_token, :access_token_secret, :consumer_key,
|
8
|
+
:consumer_secret, :user_agent
|
9
|
+
alias oauth_token= access_token=
|
10
|
+
alias oauth_token_secret= access_token_secret=
|
48
11
|
|
49
12
|
# Initializes a new Client object
|
50
13
|
#
|
51
14
|
# @param options [Hash]
|
52
|
-
# @return [Twitter::Client]
|
15
|
+
# @return [Twitter::REST::Client]
|
53
16
|
def initialize(options={})
|
54
|
-
|
55
|
-
|
17
|
+
options.each do |key, value|
|
18
|
+
send(:"#{key}=", value)
|
56
19
|
end
|
20
|
+
yield self if block_given?
|
21
|
+
validate_credential_type!
|
57
22
|
end
|
58
23
|
|
59
|
-
#
|
60
|
-
def
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
request(:get, path, params)
|
24
|
+
# @return [String]
|
25
|
+
def consumer_key
|
26
|
+
if instance_variable_defined?(:@consumer_key)
|
27
|
+
@consumer_key
|
28
|
+
else
|
29
|
+
ENV['TWITTER_CONSUMER_KEY']
|
30
|
+
end
|
67
31
|
end
|
68
32
|
|
69
|
-
#
|
70
|
-
def
|
71
|
-
|
72
|
-
|
33
|
+
# @return [String]
|
34
|
+
def consumer_secret
|
35
|
+
if instance_variable_defined?(:@consumer_secret)
|
36
|
+
@consumer_secret
|
37
|
+
else
|
38
|
+
ENV['TWITTER_CONSUMER_SECRET']
|
39
|
+
end
|
73
40
|
end
|
74
41
|
|
75
|
-
#
|
76
|
-
def
|
77
|
-
|
42
|
+
# @return [String]
|
43
|
+
def access_token
|
44
|
+
if instance_variable_defined?(:@access_token)
|
45
|
+
@access_token
|
46
|
+
else
|
47
|
+
ENV['TWITTER_ACCESS_TOKEN'] || ENV['TWITTER_OAUTH_TOKEN']
|
48
|
+
end
|
78
49
|
end
|
50
|
+
alias oauth_token access_token
|
79
51
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
# @param params [Hash]
|
87
|
-
# @return [Proc]
|
88
|
-
def request_setup(method, path, params, signature_params)
|
89
|
-
Proc.new do |request|
|
90
|
-
if params.delete(:bearer_token_request)
|
91
|
-
request.headers[:authorization] = bearer_token_credentials_auth_header
|
92
|
-
request.headers[:content_type] = 'application/x-www-form-urlencoded; charset=UTF-8'
|
93
|
-
request.headers[:accept] = '*/*' # It is important we set this, otherwise we get an error.
|
94
|
-
elsif params.delete(:app_auth) || !user_token?
|
95
|
-
unless bearer_token?
|
96
|
-
@bearer_token = token
|
97
|
-
Twitter.client.bearer_token = @bearer_token if Twitter.client?
|
98
|
-
end
|
99
|
-
request.headers[:authorization] = bearer_auth_header
|
100
|
-
else
|
101
|
-
request.headers[:authorization] = oauth_auth_header(method, path, signature_params).to_s
|
102
|
-
end
|
52
|
+
# @return [String]
|
53
|
+
def access_token_secret
|
54
|
+
if instance_variable_defined?(:@access_token_secret)
|
55
|
+
@access_token_secret
|
56
|
+
else
|
57
|
+
ENV['TWITTER_ACCESS_TOKEN_SECRET'] || ENV['TWITTER_OAUTH_TOKEN_SECRET']
|
103
58
|
end
|
104
59
|
end
|
60
|
+
alias oauth_token_secret access_token_secret
|
105
61
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
rescue Faraday::Error::ClientError
|
110
|
-
raise Twitter::Error::ClientError
|
111
|
-
rescue MultiJson::DecodeError
|
112
|
-
raise Twitter::Error::DecodeError
|
62
|
+
# @return [Boolean]
|
63
|
+
def user_token?
|
64
|
+
!!(access_token && access_token_secret)
|
113
65
|
end
|
114
66
|
|
115
|
-
|
116
|
-
|
117
|
-
# @return [Faraday::Connection]
|
118
|
-
def connection
|
119
|
-
@connection ||= Faraday.new(@endpoint, @connection_options.merge(:builder => @middleware))
|
67
|
+
def user_agent
|
68
|
+
@user_agent ||= "Twitter Ruby Gem #{Twitter::Version}"
|
120
69
|
end
|
121
70
|
|
122
|
-
#
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
71
|
+
# @return [Hash]
|
72
|
+
def credentials
|
73
|
+
{
|
74
|
+
:consumer_key => consumer_key,
|
75
|
+
:consumer_secret => consumer_secret,
|
76
|
+
:token => access_token,
|
77
|
+
:token_secret => access_token_secret,
|
78
|
+
}
|
128
79
|
end
|
129
80
|
|
130
|
-
|
131
|
-
|
81
|
+
# @return [Boolean]
|
82
|
+
def credentials?
|
83
|
+
credentials.values.all?
|
132
84
|
end
|
133
85
|
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
86
|
+
private
|
87
|
+
|
88
|
+
# Ensures that all credentials set during configuration are of a
|
89
|
+
# valid type. Valid types are String and Symbol.
|
90
|
+
#
|
91
|
+
# @raise [Twitter::Error::ConfigurationError] Error is raised when
|
92
|
+
# supplied twitter credentials are not a String or Symbol.
|
93
|
+
def validate_credential_type!
|
94
|
+
credentials.each do |credential, value|
|
95
|
+
next if value.nil?
|
96
|
+
raise(Error::ConfigurationError, "Invalid #{credential} specified: #{value.inspect} must be a string or symbol.") unless value.is_a?(String) || value.is_a?(Symbol)
|
139
97
|
end
|
140
98
|
end
|
141
99
|
|
142
|
-
def oauth_auth_header(method,
|
143
|
-
uri = URI(
|
100
|
+
def oauth_auth_header(method, uri, params={})
|
101
|
+
uri = URI.parse(uri)
|
144
102
|
SimpleOAuth::Header.new(method, uri, params, credentials)
|
145
103
|
end
|
104
|
+
|
146
105
|
end
|
147
106
|
end
|