twitter4r 0.2.5 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,27 @@
1
+ class Twitter::Client
2
+ @@AUTHENTICATION_URIS = {
3
+ :verify => '/account/verify_credentials',
4
+ }
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
+ #
10
+ # Example:
11
+ # client.authenticate?("osxisforlightweights", "l30p@rd_s^cks!")
12
+ def authenticate?(login, password)
13
+ verify_credentials(login, password)
14
+ end
15
+
16
+ private
17
+ def verify_credentials(username, passwd)
18
+ connection = create_http_connection
19
+ connection.start do |connection|
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
25
+ end
26
+ end
27
+
@@ -79,3 +79,4 @@ class Twitter::Client
79
79
  Net::HTTP::Delete.new(path, http_header)
80
80
  end
81
81
  end
82
+
@@ -0,0 +1,53 @@
1
+ class Twitter::Client
2
+ # Why Twitter.com developers can't correctly document their API, I do not know!
3
+ @@FAVORITES_URIS = {
4
+ :add => '/favourings/create',
5
+ :remove => '/favourings/destroy',
6
+ }
7
+
8
+ # Provides access to the Twitter list favorites API.
9
+ #
10
+ # You can access the authenticated [Twitter] user's favorites list using this method.
11
+ #
12
+ # By default you will receive the last twenty statuses added to your favorites list.
13
+ # To get a previous page you can provide options to this method. For example,
14
+ # statuses = client.favorites(:page => 2)
15
+ # The above one-liner will get the second page of favorites for the authenticated user.
16
+ def favorites(options = nil)
17
+ def uri_suffix(opts); opts && opts[:page] ? "?page=#{opts[:page]}" : ""; end
18
+ uri = '/favorites.json' + uri_suffix(options)
19
+ response = http_connect {|conn| create_http_get_request(uri) }
20
+ bless_models(Twitter::Status.unmarshal(response.body))
21
+ end
22
+
23
+ # Provides access to the Twitter add/remove favorite API.
24
+ #
25
+ # You can add and remove favorite status using this method.
26
+ #
27
+ # <tt>action</tt> can be any of the following values:
28
+ # * <tt>:add</tt> - to add a status to your favorites, you would use this <tt>action</tt> value
29
+ # * <tt>:remove</tt> - to remove an status from your existing favorites list use this.
30
+ #
31
+ # The <tt>value</tt> must be either the status object to add or remove or
32
+ # the integer unique status ID.
33
+ #
34
+ # Examples:
35
+ # id = 126006103423
36
+ # client.favorite(:add, id)
37
+ # client.favorite(:remove, id)
38
+ # status = Twitter::Status.find(id, client)
39
+ # client.favorite(:add, status)
40
+ # client.favorite(:remove, status)
41
+ def favorite(action, value)
42
+ raise ArgumentError, "Invalid favorite action provided: #{action}" unless @@FAVORITES_URIS.keys.member?(action)
43
+ value = value.to_i.to_s unless value.is_a?(String)
44
+ uri = "#{@@FAVORITES_URIS[action]}/#{value}.json"
45
+ case action
46
+ when :add
47
+ response = http_connect {|conn| create_http_post_request(uri) }
48
+ when :remove
49
+ response = http_connect {|conn| create_http_delete_request(uri) }
50
+ end
51
+ bless_model(Twitter::Status.unmarshal(response.body))
52
+ end
53
+ end
@@ -18,7 +18,6 @@ class Twitter::Client
18
18
  # * +:received+
19
19
  # * +:sent+
20
20
  def messages(action, options = nil)
21
- # method scoped method
22
21
  def uri_suffix(opts); opts && opts[:page] ? "?page=#{opts[:page]}" : ""; end
23
22
  raise ArgumentError, "Invalid messaging action: #{action}" unless [:sent, :received].member?(action)
24
23
  uri = @@MESSAGING_URIS[action] + uri_suffix(options)
@@ -15,4 +15,6 @@ require('twitter/client/status.rb')
15
15
  require('twitter/client/friendship.rb')
16
16
  require('twitter/client/messaging.rb')
17
17
  require('twitter/client/user.rb')
18
+ require('twitter/client/auth.rb')
19
+ require('twitter/client/favorites.rb')
18
20
 
@@ -3,8 +3,8 @@
3
3
 
4
4
  module Twitter::Version #:nodoc:
5
5
  MAJOR = 0
6
- MINOR = 2
7
- REVISION = 5
6
+ MINOR = 3
7
+ REVISION = 0
8
8
  class << self
9
9
  # Returns X.Y.Z formatted version string
10
10
  def to_version
@@ -0,0 +1,34 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')
2
+
3
+ describe Twitter::Client, "#authenticate?" do
4
+ before(:each) do
5
+ @uri = '/account/verify_credentials.json'
6
+ @request = mas_net_http_get(:basic_auth => nil)
7
+ @twitter = client_context
8
+ @default_header = @twitter.send(:http_header)
9
+ @response = mas_net_http_response(:success)
10
+ @error_response = mas_net_http_response(404, "Resource Not Found")
11
+ @connection = mas_net_http(@response)
12
+ Net::HTTP.stub!(:new).and_return(@connection)
13
+ @login = "applestillsucks"
14
+ @password = "linuxstillrocks"
15
+ end
16
+
17
+ it "creates expected HTTP GET request" do
18
+ @twitter.should_receive(:create_http_get_request).with(@uri).and_return(@request)
19
+ @twitter.authenticate?(@login, @password)
20
+ end
21
+
22
+ it "should return true if HTTP response is 20X" do
23
+ @twitter.authenticate?(@login, @password).should be(true)
24
+ end
25
+
26
+ it "should return false if HTTP response is not 20X" do
27
+ Net::HTTP.stub!(:new).and_return(mas_net_http(@error_response))
28
+ @twitter.authenticate?(@login, @password).should be(false)
29
+ end
30
+
31
+ after(:each) do
32
+ nilize(@uri, @request, @twitter, @default_header, @response, @error_response, @connection, @login, @password)
33
+ end
34
+ end
@@ -0,0 +1,183 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')
2
+
3
+ describe Twitter::Client, "#favorites" do
4
+ before(:each) do
5
+ @uri = '/favorites.json'
6
+ @request = mas_net_http_get(:basic_auth => nil)
7
+ @twitter = client_context
8
+ @default_header = @twitter.send(:http_header)
9
+ @response = mas_net_http_response(:success)
10
+ @connection = mas_net_http(@response)
11
+ @options = { :page => 4 }
12
+ Net::HTTP.stub!(:new).and_return(@connection)
13
+ @favorites = []
14
+ Twitter::Status.stub!(:unmarshal).and_return(@favorites)
15
+ end
16
+
17
+ it "should create expected HTTP GET request when not giving options" do
18
+ @twitter.should_receive(:create_http_get_request).with(@uri).and_return(@request)
19
+ @twitter.favorites
20
+ end
21
+
22
+ it "should create expected HTTP GET request when giving :page options" do
23
+ @twitter.should_receive(:create_http_get_request).with("#{@uri}?#{@options.to_http_str}").and_return(@request)
24
+ @twitter.favorites(@options)
25
+ end
26
+
27
+ it "should raise Twitter::RESTError when 401 HTTP response received without giving options" do
28
+ @connection = mas_net_http(mas_net_http_response(:not_authorized))
29
+ lambda {
30
+ @twitter.favorites
31
+ }.should raise_error(Twitter::RESTError)
32
+ end
33
+
34
+ it "should raise Twitter::RESTError when 401 HTTP response received when giving page options" do
35
+ @connection = mas_net_http(mas_net_http_response(:not_authorized))
36
+ lambda {
37
+ @twitter.favorites(@options)
38
+ }.should raise_error(Twitter::RESTError)
39
+ end
40
+
41
+ it "should raise Twitter::RESTError when 403 HTTP response received without giving options" do
42
+ @connection = mas_net_http(mas_net_http_response(:forbidden))
43
+ lambda {
44
+ @twitter.favorites
45
+ }.should raise_error(Twitter::RESTError)
46
+ end
47
+
48
+ it "should raise Twitter::RESTError when 403 HTTP response received when giving page options" do
49
+ @connection = mas_net_http(mas_net_http_response(:forbidden))
50
+ lambda {
51
+ @twitter.favorites(@options)
52
+ }.should raise_error(Twitter::RESTError)
53
+ end
54
+
55
+ it "should raise Twitter::RESTError when 500 HTTP response received without giving options" do
56
+ @connection = mas_net_http(mas_net_http_response(:server_error))
57
+ lambda {
58
+ @twitter.favorites
59
+ }.should raise_error(Twitter::RESTError)
60
+ end
61
+
62
+ it "should raise Twitter::RESTError when 500 HTTP response received when giving page options" do
63
+ @connection = mas_net_http(mas_net_http_response(:server_error))
64
+ lambda {
65
+ @twitter.favorites(@options)
66
+ }.should raise_error(Twitter::RESTError)
67
+ end
68
+
69
+ after(:each) do
70
+ nilize(@uri, @request, @twitter, @default_header, @response, @error_response, @connection)
71
+ end
72
+ end
73
+
74
+ module FavoriteSpecMixin
75
+ def init
76
+ @base_uri = '/favourings'
77
+ @request = mas_net_http_get(:basic_auth => nil)
78
+ @twitter = client_context
79
+ @default_header = @twitter.send(:http_header)
80
+ @response = mas_net_http_response(:success)
81
+ @connection = mas_net_http(@response)
82
+ Net::HTTP.stub!(:new).and_return(@connection)
83
+ @id = 234923423
84
+ @status = mas_twitter_status(:id => @id, :to_i => @id)
85
+ Twitter::Status.stub!(:unmarshal).and_return(@status)
86
+ end
87
+
88
+ def create_uri(method, id)
89
+ "#{@base_uri}/#{method.to_s}/#{id.to_i.to_s}.json"
90
+ end
91
+
92
+ def connection=(connection)
93
+ @connection = connection
94
+ end
95
+
96
+ def finalize
97
+ nilize(@uri, @request, @twitter, @default_header, @response, @error_response, @connection)
98
+ end
99
+ end
100
+
101
+ describe "Twitter::Client#favorite error handling", :shared => true do
102
+ it "should raise a Twitter::RESTError exception when a 401 HTTP response is received" do
103
+ connection = mas_net_http(mas_net_http_response(:not_authorized))
104
+ lambda {
105
+ execute_method
106
+ }.should raise_error(Twitter::RESTError)
107
+ end
108
+
109
+ it "should raise a Twitter::RESTError exception when a 403 HTTP response is received" do
110
+ connection = mas_net_http(mas_net_http_response(:forbidden))
111
+ lambda {
112
+ execute_method
113
+ }.should raise_error(Twitter::RESTError)
114
+ end
115
+
116
+ it "should raise a Twitter::RESTError exception when a 404 HTTP response is received" do
117
+ connection = mas_net_http(mas_net_http_response(:file_not_found))
118
+ lambda {
119
+ execute_method
120
+ }.should raise_error(Twitter::RESTError)
121
+ end
122
+
123
+ it "should raise a Twitter::RESTError exception when a 500 HTTP response is received" do
124
+ connection = mas_net_http(mas_net_http_response(:server_error))
125
+ lambda {
126
+ execute_method
127
+ }.should raise_error(Twitter::RESTError)
128
+ end
129
+ end
130
+
131
+ describe Twitter::Client, "#favorite(:add, status)" do
132
+ include FavoriteSpecMixin
133
+ it_should_behave_like "Twitter::Client#favorite error handling"
134
+
135
+ before(:each) do
136
+ init
137
+ end
138
+
139
+ def execute_method
140
+ @twitter.favorite(:add, @id)
141
+ end
142
+
143
+ it "should create expected POST request for :add action supplying integer id of status" do
144
+ @twitter.should_receive(:create_http_post_request).with(create_uri(:create, @id)).and_return(@request)
145
+ @twitter.favorite(:add, @id)
146
+ end
147
+
148
+ it "should create expected POST request for :add action supplying status object" do
149
+ @twitter.should_receive(:create_http_post_request).with(create_uri(:create, @id)).and_return(@request)
150
+ @twitter.favorite(:add, @status)
151
+ end
152
+
153
+ after(:each) do
154
+ finalize
155
+ end
156
+ end
157
+
158
+ describe Twitter::Client, "#favorite(:remove, status)" do
159
+ include FavoriteSpecMixin
160
+ it_should_behave_like "Twitter::Client#favorite error handling"
161
+
162
+ before(:each) do
163
+ init
164
+ end
165
+
166
+ def execute_method
167
+ @twitter.favorite(:remove, @id)
168
+ end
169
+
170
+ it "should create expected DELETE request for :remove action supplying integer id of status" do
171
+ @twitter.should_receive(:create_http_delete_request).with(create_uri(:destroy, @id)).and_return(@request)
172
+ @twitter.favorite(:remove, @id)
173
+ end
174
+
175
+ it "should create expected DELETE request for :remove action supplying status object" do
176
+ @twitter.should_receive(:create_http_delete_request).with(create_uri(:destroy, @id)).and_return(@request)
177
+ @twitter.favorite(:remove, @status)
178
+ end
179
+
180
+ after(:each) do
181
+ finalize
182
+ end
183
+ end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
3
3
  specification_version: 1
4
4
  name: twitter4r
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.2.5
7
- date: 2007-09-23 00:00:00 -07:00
6
+ version: 0.3.0
7
+ date: 2007-11-05 00:00:00 -06:00
8
8
  summary: A clean Twitter client API in pure Ruby. Will include Twitter add-ons also in Ruby.
9
9
  require_paths:
10
10
  - lib
@@ -35,8 +35,10 @@ files:
35
35
  - lib/twitter/client/timeline.rb
36
36
  - lib/twitter/client/messaging.rb
37
37
  - lib/twitter/client/base.rb
38
+ - lib/twitter/client/favorites.rb
38
39
  - lib/twitter/client/status.rb
39
40
  - lib/twitter/client/friendship.rb
41
+ - lib/twitter/client/auth.rb
40
42
  - lib/twitter/client/user.rb
41
43
  - lib/twitter/rails.rb
42
44
  - lib/twitter/client.rb
@@ -52,9 +54,11 @@ files:
52
54
  - spec/twitter/model_spec.rb
53
55
  - spec/twitter/client/status_spec.rb
54
56
  - spec/twitter/client/timeline_spec.rb
57
+ - spec/twitter/client/auth_spec.rb
55
58
  - spec/twitter/client/user_spec.rb
56
59
  - spec/twitter/client/messaging_spec.rb
57
60
  - spec/twitter/client/base_spec.rb
61
+ - spec/twitter/client/favorites_spec.rb
58
62
  - spec/twitter/client/friendship_spec.rb
59
63
  - spec/twitter/version_spec.rb
60
64
  - spec/twitter/rails_spec.rb