twitter4r 0.3.2 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +2 -0
- data/lib/twitter/client/account.rb +2 -7
- data/lib/twitter/client/auth.rb +12 -18
- data/lib/twitter/client/base.rb +81 -39
- data/lib/twitter/client/blocks.rb +1 -1
- data/lib/twitter/client/favorites.rb +3 -3
- data/lib/twitter/client/friendship.rb +23 -4
- data/lib/twitter/client/graph.rb +1 -1
- data/lib/twitter/client/messaging.rb +3 -4
- data/lib/twitter/client/profile.rb +2 -7
- data/lib/twitter/client/search.rb +1 -3
- data/lib/twitter/client/status.rb +6 -5
- data/lib/twitter/client/timeline.rb +13 -2
- data/lib/twitter/client/user.rb +4 -2
- data/lib/twitter/config.rb +28 -2
- data/lib/twitter/extras.rb +1 -1
- data/lib/twitter/model.rb +7 -7
- data/lib/twitter/version.rb +2 -2
- data/lib/twitter.rb +5 -1
- data/spec/twitter/client/account_spec.rb +2 -2
- data/spec/twitter/client/auth_spec.rb +8 -8
- data/spec/twitter/client/base_spec.rb +0 -103
- data/spec/twitter/client/blocks_spec.rb +6 -6
- data/spec/twitter/client/favorites_spec.rb +6 -6
- data/spec/twitter/client/friendship_spec.rb +31 -12
- data/spec/twitter/client/graph_spec.rb +6 -6
- data/spec/twitter/client/messaging_spec.rb +7 -6
- data/spec/twitter/client/profile_spec.rb +7 -24
- data/spec/twitter/client/search_spec.rb +4 -4
- data/spec/twitter/client/status_spec.rb +14 -36
- data/spec/twitter/client/timeline_spec.rb +6 -6
- data/spec/twitter/client/user_spec.rb +12 -19
- data/spec/twitter/extras_spec.rb +2 -3
- metadata +77 -41
data/README
CHANGED
@@ -15,6 +15,8 @@ Code:
|
|
15
15
|
* Christian Johansen <christian at cjohansen dot no> - in_reply_to attributes in Twitter::Status
|
16
16
|
* Harry Love <harrylove at gmail dot com> - added attributes to Twitter::Status
|
17
17
|
* Filipe Giusti <filipegiusti at gmail dot com> - fixed users/show issue that Twitter.com changed from under us
|
18
|
+
* Seth Cousins <seth.cousins at gmail dot com> - added HTTP timeout option and provided a patch that inspired the OAuth support for Twitter4R
|
19
|
+
* John McKerrell <@mcknut on twitter> - added geo attribute to Twitter::Message.
|
18
20
|
|
19
21
|
Design Suggestions:
|
20
22
|
* Bosco So <rubymeetup at boscoso dot com> - making Twitter::Error a RuntimeError instead of an Exception to prevent irb from crashing out.
|
@@ -13,12 +13,7 @@ class Twitter::Client
|
|
13
13
|
# account_status = client.account_info
|
14
14
|
# puts account_status.remaining_hits
|
15
15
|
def account_info(type = :rate_limit_status)
|
16
|
-
|
17
|
-
|
18
|
-
response = http_connect do |conn|
|
19
|
-
create_http_get_request(@@ACCOUNT_URIS[type])
|
20
|
-
end
|
21
|
-
bless_models(Twitter::RateLimitStatus.unmarshal(response.body))
|
22
|
-
end
|
16
|
+
response = rest_oauth_connect(:get, @@ACCOUNT_URIS[type])
|
17
|
+
bless_models(Twitter::RateLimitStatus.unmarshal(response.body))
|
23
18
|
end
|
24
19
|
end
|
data/lib/twitter/client/auth.rb
CHANGED
@@ -2,26 +2,20 @@ class Twitter::Client
|
|
2
2
|
@@AUTHENTICATION_URIS = {
|
3
3
|
:verify => '/account/verify_credentials',
|
4
4
|
}
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
|
6
|
+
# Provides access to the Twitter verify credentials API.
|
7
|
+
#
|
8
|
+
# You can verify Twitter user credentials with minimal overhead using this method.
|
9
9
|
#
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
# Example:
|
11
|
+
# client.authenticate?("osxisforlightweights", "l30p@rd_s^cks!")
|
12
|
+
def authenticate?(login, password)
|
13
13
|
verify_credentials(login, password)
|
14
|
-
|
15
|
-
|
16
|
-
private
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
17
|
def verify_credentials(username, passwd)
|
18
|
-
|
19
|
-
|
20
|
-
request = create_http_get_request("#{@@AUTHENTICATION_URIS[:verify]}.json")
|
21
|
-
request.basic_auth(username, passwd)
|
22
|
-
response = connection.request(request)
|
23
|
-
response.is_a?(Net::HTTPSuccess) ? true : false
|
24
|
-
end
|
18
|
+
response = rest_oauth_connect(:get, "#{@@AUTHENTICATION_URIS[:verify]}.json")
|
19
|
+
response.is_a?(Net::HTTPSuccess) ? true : false
|
25
20
|
end
|
26
21
|
end
|
27
|
-
|
data/lib/twitter/client/base.rb
CHANGED
@@ -4,24 +4,37 @@ class Twitter::Client
|
|
4
4
|
def inspect
|
5
5
|
s = old_inspect
|
6
6
|
s.gsub!(/@password=".*?"/, '@password="XXXX"')
|
7
|
+
s.gsub!(/"secret"=>".*?"/, '"secret"=>"XXXX"')
|
8
|
+
s
|
7
9
|
end
|
8
10
|
|
9
11
|
protected
|
10
|
-
attr_accessor :login, :
|
11
|
-
|
12
|
-
# Returns the response of the HTTP
|
13
|
-
def
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
handle_rest_response(response)
|
21
|
-
response
|
12
|
+
attr_accessor :login, :oauth_consumer, :oauth_access
|
13
|
+
|
14
|
+
# Returns the response of the OAuth/HTTP(s) request for REST API requests (not Search)
|
15
|
+
def rest_oauth_connect(method, path, params = {}, headers = {}, require_auth = true)
|
16
|
+
atoken = rest_access_token
|
17
|
+
uri = rest_request_uri(path)
|
18
|
+
if [:get, :delete].include?(method)
|
19
|
+
response = atoken.send(method, uri, http_header.merge(headers))
|
20
|
+
else
|
21
|
+
response = atoken.send(method, uri, params, http_header.merge(headers))
|
22
22
|
end
|
23
|
+
handle_rest_response(response)
|
24
|
+
response
|
23
25
|
end
|
24
|
-
|
26
|
+
|
27
|
+
# Returns the response of the OAuth/HTTP(s) request for Search API requests (not REST)
|
28
|
+
def search_oauth_connect(method, path, params = {}, headers = {}, require_auth = true)
|
29
|
+
atoken = search_access_token
|
30
|
+
uri = search_request_uri(path)
|
31
|
+
if method == :get
|
32
|
+
response = atoken.send(method, uri, http_header.merge(headers))
|
33
|
+
end
|
34
|
+
handle_rest_response(response)
|
35
|
+
response
|
36
|
+
end
|
37
|
+
|
25
38
|
# "Blesses" model object with client information
|
26
39
|
def bless_model(model)
|
27
40
|
model.bless(self) if model
|
@@ -34,7 +47,43 @@ class Twitter::Client
|
|
34
47
|
|
35
48
|
private
|
36
49
|
@@http_header = nil
|
50
|
+
|
51
|
+
def rest_consumer
|
52
|
+
unless @consumer
|
53
|
+
@consumer = OAuth::Consumer.new(@oauth_consumer["key"],
|
54
|
+
@oauth_consumer["secret"],
|
55
|
+
:site => construct_site_url)
|
56
|
+
end
|
57
|
+
@consumer
|
58
|
+
end
|
59
|
+
|
60
|
+
def rest_access_token
|
61
|
+
unless @access_token
|
62
|
+
@access_token = OAuth::AccessToken.new(rest_consumer,
|
63
|
+
@oauth_access["key"],
|
64
|
+
@oauth_access["secret"])
|
65
|
+
end
|
66
|
+
@access_token
|
67
|
+
end
|
37
68
|
|
69
|
+
def search_consumer
|
70
|
+
unless @consumer
|
71
|
+
@consumer = OAuth::Consumer.new(@oauth_consumer["key"],
|
72
|
+
@oauth_consumer["secret"],
|
73
|
+
:site => construct_site_url(:search))
|
74
|
+
end
|
75
|
+
@consumer
|
76
|
+
end
|
77
|
+
|
78
|
+
def search_access_token
|
79
|
+
unless @access_token
|
80
|
+
@access_token = OAuth::AccessToken.new(search_consumer,
|
81
|
+
@oauth_access["key"],
|
82
|
+
@oauth_access["secret"])
|
83
|
+
end
|
84
|
+
@access_token
|
85
|
+
end
|
86
|
+
|
38
87
|
def raise_rest_error(response, uri = nil)
|
39
88
|
map = JSON.parse(response.body)
|
40
89
|
raise Twitter::RESTError.new(:code => response.code,
|
@@ -49,23 +98,6 @@ class Twitter::Client
|
|
49
98
|
end
|
50
99
|
end
|
51
100
|
|
52
|
-
def create_http_connection(service = :rest)
|
53
|
-
case service
|
54
|
-
when :rest
|
55
|
-
protocol, host, port = @@config.protocol, @@config.host, @@config.port
|
56
|
-
when :search
|
57
|
-
protocol, host, port = @@config.search_protocol, @@config.search_host, @@config.search_port
|
58
|
-
end
|
59
|
-
conn = Net::HTTP.new(host, port,
|
60
|
-
@@config.proxy_host, @@config.proxy_port,
|
61
|
-
@@config.proxy_user, @@config.proxy_pass)
|
62
|
-
if protocol == :ssl
|
63
|
-
conn.use_ssl = true
|
64
|
-
conn.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
65
|
-
end
|
66
|
-
conn
|
67
|
-
end
|
68
|
-
|
69
101
|
def http_header
|
70
102
|
# can cache this in class variable since all "variables" used to
|
71
103
|
# create the contents of the HTTP header are determined by other
|
@@ -79,18 +111,28 @@ class Twitter::Client
|
|
79
111
|
}
|
80
112
|
@@http_header
|
81
113
|
end
|
82
|
-
|
83
|
-
def
|
84
|
-
|
85
|
-
Net::HTTP::Get.new(path, http_header)
|
114
|
+
|
115
|
+
def rest_request_uri(path)
|
116
|
+
"#{@@config.path_prefix}#{path}"
|
86
117
|
end
|
87
118
|
|
88
|
-
def
|
89
|
-
|
119
|
+
def search_request_uri(path)
|
120
|
+
"#{@@config.search_path_prefix}#{path}"
|
90
121
|
end
|
91
122
|
|
92
|
-
def
|
93
|
-
|
94
|
-
|
123
|
+
def uri_components(service = :rest)
|
124
|
+
case service
|
125
|
+
when :rest
|
126
|
+
return @@config.protocol, @@config.host, @@config.port,
|
127
|
+
@@config.path_prefix
|
128
|
+
when :search
|
129
|
+
return @@config.search_protocol, @@config.search_host,
|
130
|
+
@@config.search_port, @@config.search_path_prefix
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def construct_site_url(service = :rest)
|
135
|
+
protocol, host, port, path_prefix = uri_components(service)
|
136
|
+
"#{protocol == :ssl ? :https : protocol}://#{host}:#{port}"
|
95
137
|
end
|
96
138
|
end
|
@@ -29,7 +29,7 @@ class Twitter::Client
|
|
29
29
|
raise ArgumentError, "Invalid friend action provided: #{action}" unless @@BLOCK_URIS.keys.member?(action)
|
30
30
|
value = value.to_i unless value.is_a?(String)
|
31
31
|
uri = "#{@@BLOCK_URIS[action]}/#{value}.json"
|
32
|
-
response =
|
32
|
+
response = rest_oauth_connect(:get, uri)
|
33
33
|
bless_model(Twitter::User.unmarshal(response.body))
|
34
34
|
end
|
35
35
|
end
|
@@ -16,7 +16,7 @@ class Twitter::Client
|
|
16
16
|
def favorites(options = nil)
|
17
17
|
def uri_suffix(opts); opts && opts[:page] ? "?page=#{opts[:page]}" : ""; end
|
18
18
|
uri = '/favorites.json' + uri_suffix(options)
|
19
|
-
response =
|
19
|
+
response = rest_oauth_connect(:get, uri)
|
20
20
|
bless_models(Twitter::Status.unmarshal(response.body))
|
21
21
|
end
|
22
22
|
|
@@ -44,9 +44,9 @@ class Twitter::Client
|
|
44
44
|
uri = "#{@@FAVORITES_URIS[action]}/#{value}.json"
|
45
45
|
case action
|
46
46
|
when :add
|
47
|
-
response =
|
47
|
+
response = rest_oauth_connect(:post, uri)
|
48
48
|
when :remove
|
49
|
-
response =
|
49
|
+
response = rest_oauth_connect(:delete, uri)
|
50
50
|
end
|
51
51
|
bless_model(Twitter::Status.unmarshal(response.body))
|
52
52
|
end
|
@@ -1,8 +1,13 @@
|
|
1
1
|
class Twitter::Client
|
2
|
-
@@
|
2
|
+
@@FRIEND_URIS = {
|
3
3
|
:add => '/friendships/create',
|
4
4
|
:remove => '/friendships/destroy',
|
5
5
|
}
|
6
|
+
|
7
|
+
@@FRIENDSHIP_URIS = {
|
8
|
+
:incoming => '/friendships/incoming.json',
|
9
|
+
:outgoing => '/friendships/outgoing.json',
|
10
|
+
}
|
6
11
|
|
7
12
|
# Provides access to the Twitter Friendship API.
|
8
13
|
#
|
@@ -26,10 +31,24 @@ class Twitter::Client
|
|
26
31
|
# client.friend(:add, user)
|
27
32
|
# client.friend(:remove, user)
|
28
33
|
def friend(action, value)
|
29
|
-
raise ArgumentError, "Invalid friend action provided: #{action}" unless @@
|
34
|
+
raise ArgumentError, "Invalid friend action provided: #{action}" unless @@FRIEND_URIS.keys.member?(action)
|
30
35
|
value = value.to_i unless value.is_a?(String)
|
31
|
-
uri = "#{@@
|
32
|
-
response =
|
36
|
+
uri = "#{@@FRIEND_URIS[action]}/#{value}.json"
|
37
|
+
response = rest_oauth_connect(:post, uri)
|
33
38
|
bless_model(Twitter::User.unmarshal(response.body))
|
34
39
|
end
|
40
|
+
|
41
|
+
# Provides friendship information for the following scenarios:
|
42
|
+
# * <tt>:incoming</tt> - returns an array of numeric IDs for every user who has a pending request to follow the authenticating user.
|
43
|
+
# * <tt>:outgoing</tt> - returns an array of numeric IDs for every protected user for whom the authenticating user has a pending follow request.
|
44
|
+
#
|
45
|
+
# Examples:
|
46
|
+
# client.friendships(:incoming)
|
47
|
+
# #=> { :id_list => { :ids => [30592818, 21249843], :next_cursor => 1288724293877798413, :previous_cursor => -1300794057949944903 }}
|
48
|
+
def friendships(action)
|
49
|
+
raise ArgumentError, "Invalid friend action provided: #{action}" unless @@FRIENDSHIP_URIS.keys.member?(action)
|
50
|
+
uri = @@FRIENDSHIP_URIS[action]
|
51
|
+
response = rest_oauth_connect(:get, uri)
|
52
|
+
JSON.parse(response.body)
|
53
|
+
end
|
35
54
|
end
|
data/lib/twitter/client/graph.rb
CHANGED
@@ -31,7 +31,7 @@ class Twitter::Client
|
|
31
31
|
id ||= value
|
32
32
|
id ||= @login
|
33
33
|
uri = "#{@@GRAPH_URIS[action]}.json"
|
34
|
-
response =
|
34
|
+
response = rest_oauth_connect(:get, uri, :id => id)
|
35
35
|
JSON.parse(response.body)
|
36
36
|
end
|
37
37
|
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
class Twitter::Client
|
2
|
-
|
3
2
|
@@MESSAGING_URIS = {
|
4
3
|
:received => '/direct_messages.json',
|
5
4
|
:sent => '/direct_messages/sent.json',
|
@@ -20,7 +19,7 @@ class Twitter::Client
|
|
20
19
|
def messages(action, options = {})
|
21
20
|
raise ArgumentError, "Invalid messaging action: #{action}" unless [:sent, :received].member?(action)
|
22
21
|
uri = @@MESSAGING_URIS[action]
|
23
|
-
response =
|
22
|
+
response = rest_oauth_connect(:get, uri, options)
|
24
23
|
bless_models(Twitter::Message.unmarshal(response.body))
|
25
24
|
end
|
26
25
|
|
@@ -69,9 +68,9 @@ class Twitter::Client
|
|
69
68
|
user = user.to_i if user and user.is_a?(Twitter::User)
|
70
69
|
case action
|
71
70
|
when :post
|
72
|
-
response =
|
71
|
+
response = rest_oauth_connect(:post, uri, {:text => value, :user => user, :source => @@config.source})
|
73
72
|
when :delete
|
74
|
-
response =
|
73
|
+
response = rest_oauth_connect(:delete, "#{uri}/#{value.to_i}")
|
75
74
|
end
|
76
75
|
message = Twitter::Message.unmarshal(response.body)
|
77
76
|
bless_model(message)
|
@@ -18,12 +18,7 @@ class Twitter::Client
|
|
18
18
|
# user = client.profile(:info, :location => "University Library")
|
19
19
|
# puts user.inspect
|
20
20
|
def profile(action, attributes)
|
21
|
-
|
22
|
-
|
23
|
-
response = http_connect(attributes.to_http_str) do |conn|
|
24
|
-
create_http_post_request(@@PROFILE_URIS[action])
|
25
|
-
end
|
26
|
-
bless_models(Twitter::User.unmarshal(response.body))
|
27
|
-
end
|
21
|
+
response = rest_oauth_connect(:post, @@PROFILE_URIS[action], attributes)
|
22
|
+
bless_models(Twitter::User.unmarshal(response.body))
|
28
23
|
end
|
29
24
|
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
class Twitter::Client
|
2
|
-
|
3
2
|
@@SEARCH_URIS = {
|
4
3
|
:basic => "/search.json",
|
5
4
|
}
|
@@ -18,9 +17,8 @@ class Twitter::Client
|
|
18
17
|
# * +:received+
|
19
18
|
# * +:sent+
|
20
19
|
def search(options = {})
|
21
|
-
# raise ArgumentError, "Invalid messaging action: #{action}"
|
22
20
|
uri = @@SEARCH_URIS[:basic]
|
23
|
-
response =
|
21
|
+
response = search_oauth_connect(:get, uri, options)
|
24
22
|
json = JSON.parse(response.body)
|
25
23
|
bless_models(Twitter::Status.unmarshal(JSON.dump(json["results"])))
|
26
24
|
end
|
@@ -3,7 +3,7 @@ class Twitter::Client
|
|
3
3
|
:get => '/statuses/show.json',
|
4
4
|
:post => '/statuses/update.json',
|
5
5
|
:delete => '/statuses/destroy.json',
|
6
|
-
:reply => '/statuses/update.json'
|
6
|
+
:reply => '/statuses/update.json'
|
7
7
|
}
|
8
8
|
|
9
9
|
# Provides access to individual statuses via Twitter's Status APIs
|
@@ -37,14 +37,15 @@ class Twitter::Client
|
|
37
37
|
response = nil
|
38
38
|
case action
|
39
39
|
when :get
|
40
|
-
|
40
|
+
response = rest_oauth_connect(:get, "#{uri}?#{{:id => value.to_i}.to_http_str}")
|
41
41
|
when :post
|
42
|
-
|
42
|
+
response = rest_oauth_connect(:post, uri, :status => value, :source => @@config.source)
|
43
43
|
when :delete
|
44
|
-
|
44
|
+
response = rest_oauth_connect(:delete, "#{uri}?#{{:id => value.to_i}.to_http_str}")
|
45
45
|
when :reply
|
46
46
|
return nil if (!value.is_a?(Hash) || !value[:status] || !value[:in_reply_to_status_id])
|
47
|
-
|
47
|
+
params = value.merge(:source => @@config.source)
|
48
|
+
response = rest_oauth_connect(:post, uri, params)
|
48
49
|
end
|
49
50
|
bless_model(Twitter::Status.unmarshal(response.body))
|
50
51
|
end
|
@@ -1,11 +1,16 @@
|
|
1
1
|
class Twitter::Client
|
2
2
|
@@TIMELINE_URIS = {
|
3
3
|
:public => '/statuses/public_timeline.json',
|
4
|
+
:home => '/statuses/home_timeline.json',
|
4
5
|
:friends => '/statuses/friends_timeline.json',
|
5
6
|
:friend => '/statuses/friends_timeline.json',
|
6
7
|
:user => '/statuses/user_timeline.json',
|
7
8
|
:me => '/statuses/user_timeline.json',
|
8
9
|
:replies => '/statuses/replies.json',
|
10
|
+
:mentions => '/statuses/mentions.json',
|
11
|
+
:retweetsbyme => '/statuses/retweeted_by_me.json',
|
12
|
+
:retweetstome => '/statuses/retweeted_to_me.json',
|
13
|
+
:retweetsofme => '/statuses/retweets_of_me.json',
|
9
14
|
}
|
10
15
|
|
11
16
|
# Provides access to Twitter's Timeline APIs
|
@@ -35,7 +40,8 @@ class Twitter::Client
|
|
35
40
|
# <tt>options</tt> can also include the following keys:
|
36
41
|
# * <tt>:id</tt> is the user ID, screen name of Twitter::User representation of a <tt>Twitter</tt> user.
|
37
42
|
# * <tt>:since</tt> is a Time object specifying the date-time from which to return results for. Applicable for the :friend, :friends, :user and :me cases.
|
38
|
-
# * <tt>:
|
43
|
+
# * <tt>:per_page</tt> specifies the number of statuses to retrieve at a time. Only applicable for the :user case.
|
44
|
+
# * <tt>:page</tt> specifies page number to retrieve.
|
39
45
|
# * <tt>since_id</tt> is the status id of the public timeline from which to retrieve statuses for <tt>:public</tt>. Only applicable for the :public case.
|
40
46
|
#
|
41
47
|
# You can also pass this method a block, which will iterate through the results
|
@@ -61,10 +67,15 @@ class Twitter::Client
|
|
61
67
|
# * +:friend+
|
62
68
|
# * +:user+
|
63
69
|
# * +:me+
|
70
|
+
# * +:mentions+
|
71
|
+
# * +:replies+
|
72
|
+
# * +:retweetsbyme+
|
73
|
+
# * +:retweetstome+
|
74
|
+
# * +:retweetsofme+
|
64
75
|
def timeline_for(type, options = {}, &block)
|
65
76
|
raise ArgumentError, "Invalid timeline type: #{type}" unless @@TIMELINE_URIS.keys.member?(type)
|
66
77
|
uri = @@TIMELINE_URIS[type]
|
67
|
-
response =
|
78
|
+
response = rest_oauth_connect(:get, uri, options)
|
68
79
|
timeline = Twitter::Status.unmarshal(response.body)
|
69
80
|
timeline.each {|status| bless_model(status); yield status if block_given? }
|
70
81
|
timeline
|
data/lib/twitter/client/user.rb
CHANGED
@@ -35,7 +35,8 @@ class Twitter::Client
|
|
35
35
|
id = id.to_i if id.is_a?(Twitter::User)
|
36
36
|
id_param = id.is_a?(String) ? :screen_name : :user_id
|
37
37
|
params = options.merge(id_param => id)
|
38
|
-
|
38
|
+
uri = "#{@@USER_URIS[action]}?#{params.to_http_str}"
|
39
|
+
response = rest_oauth_connect(:get, uri)
|
39
40
|
bless_models(Twitter::User.unmarshal(response.body))
|
40
41
|
end
|
41
42
|
|
@@ -59,7 +60,8 @@ class Twitter::Client
|
|
59
60
|
def my(action, options = {})
|
60
61
|
raise ArgumentError, "Invalid user action: #{action}" unless @@USER_URIS.keys.member?(action)
|
61
62
|
params = options.merge(:id => @login)
|
62
|
-
|
63
|
+
uri = "#{@@USER_URIS[action]}?#{params.to_http_str}"
|
64
|
+
response = rest_oauth_connect(:get, uri)
|
63
65
|
users = Twitter::User.unmarshal(response.body)
|
64
66
|
bless_models(users)
|
65
67
|
end
|
data/lib/twitter/config.rb
CHANGED
@@ -7,24 +7,37 @@ module Twitter
|
|
7
7
|
# * <tt>protocol</tt> - <tt>:http</tt>, <tt>:https</tt> or <tt>:ssl</tt> supported. <tt>:ssl</tt> is an alias for <tt>:https</tt>. Defaults to <tt>:ssl</tt>
|
8
8
|
# * <tt>host</tt> - hostname to connect to for the Twitter service. Defaults to <tt>'twitter.com'</tt>.
|
9
9
|
# * <tt>port</tt> - port to connect to for the Twitter service. Defaults to <tt>443</tt>.
|
10
|
+
# * <tt>path_prefix</tt> - path to prefix URIs of REST API calls. Defaults to <tt>""</tt>.
|
11
|
+
# * <tt>search_protocol</tt> - <tt>:http</tt>, <tt>:https</tt> or <tt>:ssl</tt> supported. <tt>:ssl</tt> is an alias for <tt>:https</tt>. Defaults to <tt>:ssl</tt>
|
12
|
+
# * <tt>search_host</tt> - hostname to connect to for the Twitter Search service. Defaults to <tt>'twitter.com'</tt>.
|
13
|
+
# * <tt>search_port</tt> - port to connect to for the Twitter Search service. Defaults to <tt>443</tt>.
|
14
|
+
# * <tt>search_path_prefix</tt> - path to prefix URIs of Search API calls. Defaults to <tt>""</tt>.
|
10
15
|
# * <tt>proxy_host</tt> - proxy host to use. Defaults to nil.
|
11
16
|
# * <tt>proxy_port</tt> - proxy host to use. Defaults to nil.
|
12
17
|
# * <tt>proxy_user</tt> - proxy username to use. Defaults to nil.
|
13
18
|
# * <tt>proxy_pass</tt> - proxy password to use. Defaults to nil.
|
14
19
|
# * <tt>user_agent</tt> - user agent string to use for each request of the HTTP header.
|
15
|
-
# * <tt>application_name</tt> - name of your client application. Defaults to 'Twitter4R'
|
20
|
+
# * <tt>application_name</tt> - name of your client application. Defaults to 'Twitter4R'.
|
16
21
|
# * <tt>application_version</tt> - version of your client application. Defaults to current <tt>Twitter::Version.to_version</tt>.
|
17
22
|
# * <tt>application_url</tt> - URL of your client application. Defaults to http://twitter4r.rubyforge.org.
|
18
23
|
# * <tt>source</tt> - the source id given to you by Twitter to identify your application in their web interface. Note: you must contact Twitter.com developer directly so they can configure their servers appropriately.
|
24
|
+
# * <tt>timeout</tt> - the timeout in second for HTTP requests.
|
25
|
+
# * <tt>oauth_consumer_token</tt> - the OAuth consumer token for your application
|
26
|
+
# * <tt>oauth_consumer_secret</tt> - the OAuth consumer secret for your application
|
27
|
+
# * <tt>oauth_request_token_path</tt> - the URI path for Twitter API's OAuth request token call. Not usually necessary to override.
|
28
|
+
# * <tt>oauth_access_token_path</tt> - the URI path for Twitter API's OAuth access token call. Not usually necessary to override.
|
29
|
+
# * <tt>oauth_authorize_path</tt> - the URI path for Twitter API's OAuth authorize call. Not usually necessary to override.
|
19
30
|
class Config
|
20
31
|
include ClassUtilMixin
|
21
32
|
@@ATTRIBUTES = [
|
22
33
|
:protocol,
|
23
34
|
:host,
|
24
35
|
:port,
|
36
|
+
:path_prefix,
|
25
37
|
:search_protocol,
|
26
38
|
:search_host,
|
27
39
|
:search_port,
|
40
|
+
:search_path_prefix,
|
28
41
|
:proxy_host,
|
29
42
|
:proxy_port,
|
30
43
|
:proxy_user,
|
@@ -34,8 +47,15 @@ module Twitter
|
|
34
47
|
:application_version,
|
35
48
|
:application_url,
|
36
49
|
:source,
|
50
|
+
:timeout,
|
51
|
+
:oauth_consumer_token,
|
52
|
+
:oauth_consumer_secret,
|
53
|
+
:oauth_request_token_path,
|
54
|
+
:oauth_access_token_path,
|
55
|
+
:oauth_authorize_path,
|
37
56
|
]
|
38
|
-
|
57
|
+
|
58
|
+
attr_accessor(*@@ATTRIBUTES)
|
39
59
|
|
40
60
|
# Override of Object#eql? to ensure RSpec specifications run
|
41
61
|
# correctly. Also done to follow Ruby best practices.
|
@@ -52,9 +72,11 @@ module Twitter
|
|
52
72
|
@@defaults = { :host => 'twitter.com',
|
53
73
|
:port => 443,
|
54
74
|
:protocol => :ssl,
|
75
|
+
:path_prefix => "",
|
55
76
|
:search_host => 'search.twitter.com',
|
56
77
|
:search_port => 80,
|
57
78
|
:search_protocol => :http,
|
79
|
+
:search_path_prefix => "",
|
58
80
|
:proxy_host => nil,
|
59
81
|
:proxy_port => nil,
|
60
82
|
:user_agent => "default",
|
@@ -62,6 +84,10 @@ module Twitter
|
|
62
84
|
:application_version => Twitter::Version.to_version,
|
63
85
|
:application_url => 'http://twitter4r.rubyforge.org',
|
64
86
|
:source => 'twitter4r',
|
87
|
+
:timeout => 20,
|
88
|
+
:oauth_request_token_path => '/oauth/request_token',
|
89
|
+
:oauth_access_token_path => '/oauth/access_token',
|
90
|
+
:oauth_authorize_path => '/oauth/authorize',
|
65
91
|
}
|
66
92
|
@@config = Twitter::Config.new(@@defaults)
|
67
93
|
|
data/lib/twitter/extras.rb
CHANGED
@@ -18,7 +18,7 @@ class Twitter::Client
|
|
18
18
|
# represent Twitter's featured users.
|
19
19
|
def featured(type)
|
20
20
|
uri = @@FEATURED_URIS[type]
|
21
|
-
response =
|
21
|
+
response = rest_oauth_connect(:get, uri)
|
22
22
|
bless_models(Twitter::User.unmarshal(response.body))
|
23
23
|
end
|
24
24
|
end
|
data/lib/twitter/model.rb
CHANGED
@@ -164,8 +164,8 @@ module Twitter
|
|
164
164
|
:profile_sidebar_border_color, :profile_background_image_url,
|
165
165
|
:profile_background_tile, :utc_offset, :time_zone,
|
166
166
|
:following, :notifications, :favourites_count, :followers_count,
|
167
|
-
:friends_count, :statuses_count, :created_at
|
168
|
-
attr_accessor
|
167
|
+
:friends_count, :statuses_count, :created_at ]
|
168
|
+
attr_accessor(*@@ATTRIBUTES)
|
169
169
|
|
170
170
|
class << self
|
171
171
|
# Used as factory method callback
|
@@ -227,8 +227,8 @@ module Twitter
|
|
227
227
|
include ModelMixin
|
228
228
|
@@ATTRIBUTES = [:id, :text, :source, :truncated, :created_at, :user, :from_user, :to_user,
|
229
229
|
:favorited, :in_reply_to_status_id, :in_reply_to_user_id,
|
230
|
-
:in_reply_to_screen_name]
|
231
|
-
attr_accessor
|
230
|
+
:in_reply_to_screen_name, :geo]
|
231
|
+
attr_accessor(*@@ATTRIBUTES)
|
232
232
|
|
233
233
|
class << self
|
234
234
|
# Used as factory method callback
|
@@ -288,8 +288,8 @@ module Twitter
|
|
288
288
|
# Represents a direct message on <tt>Twitter</tt> between <tt>Twitter</tt> users.
|
289
289
|
class Message
|
290
290
|
include ModelMixin
|
291
|
-
@@ATTRIBUTES = [:id, :recipient, :sender, :text, :created_at]
|
292
|
-
attr_accessor
|
291
|
+
@@ATTRIBUTES = [:id, :recipient, :sender, :text, :geo, :created_at]
|
292
|
+
attr_accessor(*@@ATTRIBUTES)
|
293
293
|
|
294
294
|
class << self
|
295
295
|
# Used as factory method callback
|
@@ -350,7 +350,7 @@ module Twitter
|
|
350
350
|
class RateLimitStatus
|
351
351
|
include ModelMixin
|
352
352
|
@@ATTRIBUTES = [:remaining_hits, :hourly_limit, :reset_time_in_seconds, :reset_time]
|
353
|
-
attr_accessor
|
353
|
+
attr_accessor(*@@ATTRIBUTES)
|
354
354
|
|
355
355
|
class << self
|
356
356
|
# Used as factory method callback
|
data/lib/twitter/version.rb
CHANGED
data/lib/twitter.rb
CHANGED
@@ -21,7 +21,11 @@ require('net/https')
|
|
21
21
|
require('uri')
|
22
22
|
require('cgi')
|
23
23
|
require('json')
|
24
|
-
require('
|
24
|
+
require('oauth')
|
25
|
+
|
26
|
+
if RUBY_VERSION < "1.9.0"
|
27
|
+
require('yaml')
|
28
|
+
end
|
25
29
|
|
26
30
|
# Ordering matters...pay attention here!
|
27
31
|
require_local('twitter/ext')
|
@@ -3,7 +3,7 @@ require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')
|
|
3
3
|
describe Twitter::Client, "#account_info" do
|
4
4
|
before(:each) do
|
5
5
|
@uri = Twitter::Client.class_eval("@@ACCOUNT_URIS[:rate_limit_status]")
|
6
|
-
@request = mas_net_http_get
|
6
|
+
@request = mas_net_http_get
|
7
7
|
@twitter = client_context
|
8
8
|
@default_header = @twitter.send(:http_header)
|
9
9
|
@response = mas_net_http_response(:success)
|
@@ -15,7 +15,7 @@ describe Twitter::Client, "#account_info" do
|
|
15
15
|
end
|
16
16
|
|
17
17
|
it "should create expected HTTP GET request" do
|
18
|
-
@twitter.should_receive(:
|
18
|
+
@twitter.should_receive(:rest_oauth_connect).with(:get, @uri).and_return(@response)
|
19
19
|
@twitter.account_info
|
20
20
|
end
|
21
21
|
|