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.
- 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
|