twitter4r 0.1.0 → 0.1.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/lib/twitter/core.rb +32 -13
- data/lib/twitter/meta.rb +1 -2
- data/lib/twitter/version.rb +1 -1
- data/spec/spec_helper.rb +4 -0
- data/spec/twitter/core_spec.rb +126 -108
- data/spec/twitter/meta_spec.rb +18 -25
- data/spec/twitter/version_spec.rb +6 -6
- metadata +2 -2
data/lib/twitter/core.rb
CHANGED
@@ -40,8 +40,9 @@ module Twitter
|
|
40
40
|
def eql?(obj)
|
41
41
|
[:id, :name, :description, :location,
|
42
42
|
:screen_name, :url].each do |att|
|
43
|
-
return false
|
44
|
-
end
|
43
|
+
return false unless self.send(att).eql?(obj.send(att))
|
44
|
+
end
|
45
|
+
true
|
45
46
|
end
|
46
47
|
end # User
|
47
48
|
|
@@ -52,8 +53,9 @@ module Twitter
|
|
52
53
|
|
53
54
|
def eql?(obj)
|
54
55
|
[:id, :text, :created_at, :user].each do |att|
|
55
|
-
return false
|
56
|
-
end
|
56
|
+
return false unless self.send(att).eql?(obj.send(att))
|
57
|
+
end
|
58
|
+
true
|
57
59
|
end
|
58
60
|
end # Status
|
59
61
|
|
@@ -62,9 +64,11 @@ module Twitter
|
|
62
64
|
include ClassUtilMixin
|
63
65
|
attr_accessor :login, :password
|
64
66
|
|
65
|
-
@@
|
66
|
-
|
67
|
-
|
67
|
+
@@CONF = {
|
68
|
+
:host => 'twitter.com',
|
69
|
+
:port => 80,
|
70
|
+
:ssl => false,
|
71
|
+
}
|
68
72
|
@@URIS = {:public => '/statuses/public_timeline.json',
|
69
73
|
:friends => '/statuses/friends_timeline.json',
|
70
74
|
:friends_statues => '/statuses/friends.json',
|
@@ -73,10 +77,16 @@ module Twitter
|
|
73
77
|
:send_direct_message => '/direct_messages/new.json', }
|
74
78
|
|
75
79
|
class << self
|
80
|
+
# The following configuration options can be passed in a hash to this method:
|
81
|
+
# * <tt>host</tt> - host of the REST server, defaults to twitter.com. Should only be changed for integration testing.
|
82
|
+
# * <tt>port</tt> - port of the REST server, defaults to 443.
|
83
|
+
# * <tt>ssl</tt> - SSL flag, defaults to false. Do not use :use_ssl anymore.
|
84
|
+
# * <tt>proxy_host</tt> - proxy host. No default.
|
85
|
+
# * <tt>proxy_port</tt> - proxy port. No default.
|
86
|
+
# * <tt>proxy_user</tt> - proxy username. No default.
|
87
|
+
# * <tt>proxy_pass</tt> - proxy password. No default.
|
76
88
|
def config(conf)
|
77
|
-
|
78
|
-
@@PORT = conf[:port] if conf[:port]
|
79
|
-
@@SSL = conf[:use_ssl] if conf[:use_ssl] # getting ready for SSL support
|
89
|
+
@@CONF.merge!(conf)
|
80
90
|
end
|
81
91
|
|
82
92
|
# Mostly helper method for irb shell prototyping
|
@@ -88,7 +98,7 @@ module Twitter
|
|
88
98
|
end # class << self
|
89
99
|
|
90
100
|
def timeline(type = :public)
|
91
|
-
http =
|
101
|
+
http = create_http_connection
|
92
102
|
http.start do |http|
|
93
103
|
timeline_request(type, http)
|
94
104
|
end # http.start block
|
@@ -112,7 +122,7 @@ module Twitter
|
|
112
122
|
|
113
123
|
def update(message)
|
114
124
|
uri = @@URIS[:update]
|
115
|
-
http =
|
125
|
+
http = create_http_connection
|
116
126
|
http.start do |http|
|
117
127
|
request = Net::HTTP::Post.new(uri)
|
118
128
|
request.basic_auth(@login, @password)
|
@@ -124,7 +134,7 @@ module Twitter
|
|
124
134
|
def send_direct_message(user, message)
|
125
135
|
login = user.respond_to?(:screen_name) ? user.screen_name : user
|
126
136
|
uri = @@URIS[:send_direct_message]
|
127
|
-
http =
|
137
|
+
http = create_http_connection
|
128
138
|
http.start do |http|
|
129
139
|
request = Net::HTTP::Post.new(uri)
|
130
140
|
request.basic_auth(@login, @password)
|
@@ -164,6 +174,15 @@ module Twitter
|
|
164
174
|
unmarshall_statuses(JSON.parse(response.body))
|
165
175
|
end
|
166
176
|
|
177
|
+
def create_http_connection
|
178
|
+
conn = Net::HTTP.new(@@CONF[:host], @@CONF[:port],
|
179
|
+
@@CONF[:proxy_host], @@CONF[:proxy_port],
|
180
|
+
@@CONF[:proxy_user], @@CONF[:proxy_pass])
|
181
|
+
conn.use_ssl = @@CONF[:ssl]
|
182
|
+
conn.verify_mode = OpenSSL::SSL::VERIFY_NONE if @@CONF[:ssl]
|
183
|
+
conn
|
184
|
+
end
|
185
|
+
|
167
186
|
def raise_rest_error(response, uri = nil)
|
168
187
|
raise RESTError.new(:code => response.code,
|
169
188
|
:message => response.message,
|
data/lib/twitter/meta.rb
CHANGED
@@ -3,7 +3,7 @@ require('erb')
|
|
3
3
|
|
4
4
|
class Twitter::Meta #:nodoc:
|
5
5
|
attr_accessor :root_dir
|
6
|
-
attr_reader :
|
6
|
+
attr_reader :gem_spec, :project_files, :spec_files
|
7
7
|
|
8
8
|
def initialize(root_dir)
|
9
9
|
@root_dir = root_dir
|
@@ -39,4 +39,3 @@ class Twitter::Meta #:nodoc:
|
|
39
39
|
@gem_spec
|
40
40
|
end
|
41
41
|
end
|
42
|
-
|
data/lib/twitter/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -16,6 +16,8 @@ def stubbed_net_http(response, obj_stubs = {}, host = 'twitter.com', port = 80)
|
|
16
16
|
http = Net::HTTP.new(host, port)
|
17
17
|
Net::HTTP.stub!(:new).and_return(http)
|
18
18
|
http.stub!(:request).and_return(response)
|
19
|
+
http.stub!(:use_ssl=)
|
20
|
+
http.stub!(:verify_mode=)
|
19
21
|
http
|
20
22
|
end
|
21
23
|
|
@@ -27,6 +29,8 @@ def mas_net_http(response)
|
|
27
29
|
Net::HTTP.stub!(:new).and_return(http)
|
28
30
|
http.stub!(:request).and_return(response)
|
29
31
|
http.stub!(:start).and_yield(http)
|
32
|
+
http.stub!(:use_ssl=)
|
33
|
+
http.stub!(:verify_mode=)
|
30
34
|
http
|
31
35
|
end
|
32
36
|
|
data/spec/twitter/core_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
describe "Twitter::ClassUtilMixin mixed-in class" do
|
4
|
+
before(:each) do
|
5
5
|
class TestClass
|
6
6
|
include Twitter::ClassUtilMixin
|
7
7
|
attr_accessor :var1, :var2, :var3
|
@@ -9,78 +9,96 @@ context "Twitter::ClassUtilMixin mixed-in class" do
|
|
9
9
|
@init_hash = { :var1 => 'val1', :var2 => 'val2', :var3 => 'val3' }
|
10
10
|
end
|
11
11
|
|
12
|
-
|
13
|
-
TestClass.included_modules.member?(Twitter::ClassUtilMixin).should
|
12
|
+
it "should have Twitter::ClassUtilMixin as an included module" do
|
13
|
+
TestClass.included_modules.member?(Twitter::ClassUtilMixin).should be(true)
|
14
14
|
end
|
15
15
|
|
16
|
-
|
16
|
+
it "should set attributes passed in the hash to TestClass.new" do
|
17
17
|
test = TestClass.new(@init_hash)
|
18
18
|
@init_hash.each do |key, val|
|
19
|
-
test.send(key).should
|
19
|
+
test.send(key).should eql(val)
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
|
23
|
+
it "should not set attributes passed in the hash that are not attributes in TestClass.new" do
|
24
24
|
test = nil
|
25
|
-
lambda { test = TestClass.new(@init_hash.merge(:var4 => 'val4')) }.
|
26
|
-
test.respond_to?(:var4).should
|
25
|
+
lambda { test = TestClass.new(@init_hash.merge(:var4 => 'val4')) }.should_not raise_error
|
26
|
+
test.respond_to?(:var4).should be(false)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
|
31
|
-
|
30
|
+
describe "Twitter::RESTError#to_s" do
|
31
|
+
before(:each) do
|
32
32
|
@hash = { :code => 200, :message => 'OK', :uri => 'http://test.host/bla' }
|
33
33
|
@error = Twitter::RESTError.new(@hash)
|
34
34
|
@expected_message = "HTTP #{@hash[:code]}: #{@hash[:message]} at #{@hash[:uri]}"
|
35
35
|
end
|
36
36
|
|
37
|
-
|
38
|
-
@error.to_s.should
|
37
|
+
it "should return @expected_message" do
|
38
|
+
@error.to_s.should eql(@expected_message)
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
-
|
43
|
-
|
42
|
+
describe "Twitter::Client" do
|
43
|
+
before(:each) do
|
44
44
|
@init_hash = { :login => 'user', :password => 'pass' }
|
45
45
|
end
|
46
46
|
|
47
|
-
|
47
|
+
it ".new should accept login and password as initializer hash keys and set the values to instance values" do
|
48
48
|
client = nil
|
49
49
|
lambda do
|
50
50
|
client = Twitter::Client.new(@init_hash)
|
51
|
-
end.
|
52
|
-
client.send(:login).should
|
53
|
-
client.send(:password).should
|
51
|
+
end.should_not raise_error
|
52
|
+
client.send(:login).should eql(@init_hash[:login])
|
53
|
+
client.send(:password).should eql(@init_hash[:password])
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
-
|
58
|
-
|
57
|
+
describe "Twitter::Client.config" do
|
58
|
+
before(:each) do
|
59
59
|
@config_hash = { :host => 'test.host',
|
60
60
|
:port => 443,
|
61
|
-
:
|
61
|
+
:ssl => true,
|
62
|
+
:proxy_host => 'myproxy.host',
|
63
|
+
:proxy_port => 8080,
|
64
|
+
:proxy_user => 'myproxyuser',
|
65
|
+
:proxy_pass => 'myproxypass',
|
66
|
+
}
|
62
67
|
end
|
63
68
|
|
64
|
-
|
69
|
+
it "should override @@CONF values if supplied" do
|
65
70
|
Twitter::Client.config @config_hash
|
66
|
-
host = Twitter::Client.class_eval("@@
|
67
|
-
host.should
|
68
|
-
port = Twitter::Client.class_eval("@@
|
69
|
-
port.should
|
70
|
-
ssl = Twitter::Client.class_eval("@@
|
71
|
-
ssl.should
|
71
|
+
host = Twitter::Client.class_eval("@@CONF[:host]")
|
72
|
+
host.should eql(@config_hash[:host])
|
73
|
+
port = Twitter::Client.class_eval("@@CONF[:port]")
|
74
|
+
port.should eql(@config_hash[:port])
|
75
|
+
ssl = Twitter::Client.class_eval("@@CONF[:ssl]")
|
76
|
+
ssl.should eql(@config_hash[:ssl])
|
77
|
+
proxy_host = Twitter::Client.class_eval("@@CONF[:proxy_host]")
|
78
|
+
proxy_host.should eql(@config_hash[:proxy_host])
|
79
|
+
proxy_port = Twitter::Client.class_eval("@@CONF[:proxy_port]")
|
80
|
+
proxy_port.should eql(@config_hash[:proxy_port])
|
81
|
+
proxy_user = Twitter::Client.class_eval("@@CONF[:proxy_user]")
|
82
|
+
proxy_user.should eql(@config_hash[:proxy_user])
|
83
|
+
proxy_pass = Twitter::Client.class_eval("@@CONF[:proxy_pass]")
|
84
|
+
proxy_pass.should eql(@config_hash[:proxy_pass])
|
85
|
+
|
72
86
|
end
|
73
87
|
|
74
|
-
|
88
|
+
after(:each) do
|
75
89
|
Twitter::Client.config :host => 'twitter.com', :port => 80, :use_ssl => false
|
76
90
|
end
|
77
91
|
end
|
78
92
|
|
79
|
-
|
80
|
-
|
93
|
+
describe "Twitter::Client#timeline(:public)" do
|
94
|
+
before(:each) do
|
81
95
|
Twitter::Client.config(:port => 443, :use_ssl => false)
|
82
|
-
@host = Twitter::Client.class_eval("@@
|
83
|
-
@port = Twitter::Client.class_eval("@@
|
96
|
+
@host = Twitter::Client.class_eval("@@CONF[:host]")
|
97
|
+
@port = Twitter::Client.class_eval("@@CONF[:port]")
|
98
|
+
@proxy_host = Twitter::Client.class_eval("@@CONF[:proxy_host]")
|
99
|
+
@proxy_port = Twitter::Client.class_eval("@@CONF[:proxy_port]")
|
100
|
+
@proxy_user = Twitter::Client.class_eval("@@CONF[:proxy_user]")
|
101
|
+
@proxy_pass = Twitter::Client.class_eval("@@CONF[:proxy_pass]")
|
84
102
|
|
85
103
|
@request = mas_net_http_get(:basic_auth => nil)
|
86
104
|
@response = mas_net_http_response(:success, '[]')
|
@@ -91,19 +109,19 @@ context "Twitter::Client#timeline(:public)" do
|
|
91
109
|
@password = @client.instance_eval("@password")
|
92
110
|
end
|
93
111
|
|
94
|
-
|
95
|
-
Net::HTTP.should_receive(:new).with(@host, @port).once.and_return(@http)
|
112
|
+
it "should connect to the Twitter service via HTTP connection" do
|
113
|
+
Net::HTTP.should_receive(:new).with(@host, @port, @proxy_host, @proxy_port, @proxy_user, @proxy_pass).once.and_return(@http)
|
96
114
|
@client.timeline(:public)
|
97
115
|
end
|
98
116
|
|
99
|
-
|
117
|
+
it " should send HTTP Basic Authentication credentials" do
|
100
118
|
@request.should_receive(:basic_auth).with(@login, @password).once
|
101
119
|
@client.timeline(:public)
|
102
120
|
end
|
103
121
|
end
|
104
122
|
|
105
|
-
|
106
|
-
|
123
|
+
describe "Twitter::Client#unmarshall_statuses" do
|
124
|
+
before(:each) do
|
107
125
|
@json_hash = { "text" => "Thinking Zipcar is lame...",
|
108
126
|
"id" => 46672912,
|
109
127
|
"user" => {"name" => "Angie",
|
@@ -121,15 +139,15 @@ context "Twitter::Client#unmarshall_statuses" do
|
|
121
139
|
@client = Twitter::Client.from_config 'config/twitter.yml'
|
122
140
|
end
|
123
141
|
|
124
|
-
|
142
|
+
it "should return expected populated Twitter::Status object values in an Array" do
|
125
143
|
statuses = @client.send(:unmarshall_statuses, [@json_hash])
|
126
|
-
statuses.should
|
144
|
+
statuses.should have(1).entries
|
127
145
|
statuses.first.should.eql? @status
|
128
146
|
end
|
129
147
|
end
|
130
148
|
|
131
|
-
|
132
|
-
|
149
|
+
describe "Twitter::Client#unmarshall_user" do
|
150
|
+
before(:each) do
|
133
151
|
@json_hash = { "name" => "Lucy Snowe",
|
134
152
|
"description" => "School Mistress Entrepreneur",
|
135
153
|
"location" => "Villette",
|
@@ -141,14 +159,14 @@ context "Twitter::Client#unmarshall_user" do
|
|
141
159
|
@client = Twitter::Client.from_config 'config/twitter.yml'
|
142
160
|
end
|
143
161
|
|
144
|
-
|
162
|
+
it "should return expected populated Twitter::User object value" do
|
145
163
|
user = @client.send(:unmarshall_user, @json_hash)
|
146
164
|
user.should.eql? @user
|
147
165
|
end
|
148
166
|
end
|
149
167
|
|
150
|
-
|
151
|
-
|
168
|
+
describe "Twitter::Client#timeline_request upon 200 HTTP response" do
|
169
|
+
before(:each) do
|
152
170
|
@request = mas_net_http_get :basic_auth => nil
|
153
171
|
@response = mas_net_http_response # defaults to :success
|
154
172
|
|
@@ -159,7 +177,7 @@ context "Twitter::Client#timeline_request upon 200 HTTP response" do
|
|
159
177
|
JSON.stub!(:parse).and_return({})
|
160
178
|
end
|
161
179
|
|
162
|
-
|
180
|
+
it "should make GET HTTP request to appropriate URL" do
|
163
181
|
@uris.keys.each do |type|
|
164
182
|
Net::HTTP::Get.should_receive(:new).with(@uris[type]).and_return(@request)
|
165
183
|
@client.send(:timeline_request, type, @http)
|
@@ -167,8 +185,8 @@ context "Twitter::Client#timeline_request upon 200 HTTP response" do
|
|
167
185
|
end
|
168
186
|
end
|
169
187
|
|
170
|
-
|
171
|
-
|
188
|
+
describe "Twitter::Client#timeline_request upon 403 HTTP response" do
|
189
|
+
before(:each) do
|
172
190
|
@request = mas_net_http_get :basic_auth => nil
|
173
191
|
@response = mas_net_http_response :not_authorized
|
174
192
|
|
@@ -177,18 +195,18 @@ context "Twitter::Client#timeline_request upon 403 HTTP response" do
|
|
177
195
|
@uris = Twitter::Client.class_eval("@@URIS")
|
178
196
|
end
|
179
197
|
|
180
|
-
|
198
|
+
it "should make GET HTTP request to appropriate URL" do
|
181
199
|
@uris.keys.each do |type|
|
182
200
|
lambda do
|
183
201
|
Net::HTTP::Get.should_receive(:new).with(@uris[type]).and_return(@request)
|
184
202
|
@client.send(:timeline_request, type, @http)
|
185
|
-
end.
|
203
|
+
end.should raise_error(Twitter::RESTError)
|
186
204
|
end
|
187
205
|
end
|
188
206
|
end
|
189
207
|
|
190
|
-
|
191
|
-
|
208
|
+
describe "Twitter::Client#timeline_request upon 500 HTTP response" do
|
209
|
+
before(:each) do
|
192
210
|
@request = mas_net_http_get(:basic_auth => nil)
|
193
211
|
@response = mas_net_http_response(:server_error)
|
194
212
|
|
@@ -197,18 +215,18 @@ context "Twitter::Client#timeline_request upon 500 HTTP response" do
|
|
197
215
|
@uris = Twitter::Client.class_eval("@@URIS")
|
198
216
|
end
|
199
217
|
|
200
|
-
|
218
|
+
it "should make GET HTTP request to appropriate URL" do
|
201
219
|
@uris.keys.each do |type|
|
202
220
|
lambda do
|
203
221
|
Net::HTTP::Get.should_receive(:new).with(@uris[type]).and_return(@request)
|
204
222
|
@client.send(:timeline_request, type, @http)
|
205
|
-
end.
|
223
|
+
end.should raise_error(Twitter::RESTError)
|
206
224
|
end
|
207
225
|
end
|
208
226
|
end
|
209
227
|
|
210
|
-
|
211
|
-
|
228
|
+
describe "Twitter::Client#timeline_request upon 404 HTTP response" do
|
229
|
+
before(:each) do
|
212
230
|
@request = mas_net_http_get(:basic_auth => nil)
|
213
231
|
@response = mas_net_http_response(:file_not_found)
|
214
232
|
|
@@ -217,18 +235,18 @@ context "Twitter::Client#timeline_request upon 404 HTTP response" do
|
|
217
235
|
@uris = Twitter::Client.class_eval("@@URIS")
|
218
236
|
end
|
219
237
|
|
220
|
-
|
238
|
+
it "should make GET HTTP request to appropriate URL" do
|
221
239
|
@uris.keys.each do |type|
|
222
240
|
lambda do
|
223
241
|
Net::HTTP::Get.should_receive(:new).with(@uris[type]).and_return(@request)
|
224
242
|
@client.send(:timeline_request, type, @http)
|
225
|
-
end.
|
243
|
+
end.should raise_error(Twitter::RESTError)
|
226
244
|
end
|
227
245
|
end
|
228
246
|
end
|
229
247
|
|
230
|
-
|
231
|
-
|
248
|
+
describe "Twitter::Client#update(msg) upon 200 HTTP response" do
|
249
|
+
before(:each) do
|
232
250
|
@request = mas_net_http_post(:basic_auth => nil)
|
233
251
|
@response = mas_net_http_response
|
234
252
|
|
@@ -239,14 +257,14 @@ context "Twitter::Client#update(msg) upon 200 HTTP response" do
|
|
239
257
|
@message = "We love Jodhi May!"
|
240
258
|
end
|
241
259
|
|
242
|
-
|
260
|
+
it "should make POST HTTP request to appropriate URL" do
|
243
261
|
Net::HTTP::Post.should_receive(:new).with(@expected_uri).and_return(@request)
|
244
262
|
@client.update(@message)
|
245
263
|
end
|
246
264
|
end
|
247
265
|
|
248
|
-
|
249
|
-
|
266
|
+
describe "Twitter::Client#update(msg) upon 500 HTTP response" do
|
267
|
+
before(:each) do
|
250
268
|
@request = mas_net_http_post(:basic_auth => nil)
|
251
269
|
@response = mas_net_http_response(:server_error)
|
252
270
|
|
@@ -257,16 +275,16 @@ context "Twitter::Client#update(msg) upon 500 HTTP response" do
|
|
257
275
|
@message = "We love Jodhi May!"
|
258
276
|
end
|
259
277
|
|
260
|
-
|
278
|
+
it "should make POST HTTP request to appropriate URL" do
|
261
279
|
lambda do
|
262
280
|
Net::HTTP::Post.should_receive(:new).with(@expected_uri).and_return(@request)
|
263
281
|
@client.update(@message)
|
264
|
-
end.
|
282
|
+
end.should raise_error(Twitter::RESTError)
|
265
283
|
end
|
266
284
|
end
|
267
285
|
|
268
|
-
|
269
|
-
|
286
|
+
describe "Twitter::Client#public_timeline" do
|
287
|
+
before(:each) do
|
270
288
|
@request = mas_net_http_get(:basic_auth => nil)
|
271
289
|
@response = mas_net_http_response
|
272
290
|
|
@@ -274,14 +292,14 @@ context "Twitter::Client#public_timeline" do
|
|
274
292
|
@client = Twitter::Client.from_config 'config/twitter.yml'
|
275
293
|
end
|
276
294
|
|
277
|
-
|
295
|
+
it "should delegate work to Twitter::Client#public(:public)" do
|
278
296
|
@client.should_receive(:timeline).with(:public).once
|
279
297
|
@client.public_timeline
|
280
298
|
end
|
281
299
|
end
|
282
300
|
|
283
|
-
|
284
|
-
|
301
|
+
describe "Twitter::Client#friend_timeline" do
|
302
|
+
before(:each) do
|
285
303
|
@request = mas_net_http_get(:basic_auth => nil)
|
286
304
|
@response = mas_net_http_response
|
287
305
|
|
@@ -289,14 +307,14 @@ context "Twitter::Client#friend_timeline" do
|
|
289
307
|
@client = Twitter::Client.from_config 'config/twitter.yml'
|
290
308
|
end
|
291
309
|
|
292
|
-
|
310
|
+
it "should delegate work to Twitter::Client#public(:friends)" do
|
293
311
|
@client.should_receive(:timeline).with(:friends).once
|
294
312
|
@client.friend_timeline
|
295
313
|
end
|
296
314
|
end
|
297
315
|
|
298
|
-
|
299
|
-
|
316
|
+
describe "Twitter::Client#friend_statuses" do
|
317
|
+
before(:each) do
|
300
318
|
@request = mas_net_http_get(:basic_auth => nil)
|
301
319
|
@response = mas_net_http_response
|
302
320
|
|
@@ -304,14 +322,14 @@ context "Twitter::Client#friend_statuses" do
|
|
304
322
|
@client = Twitter::Client.from_config 'config/twitter.yml'
|
305
323
|
end
|
306
324
|
|
307
|
-
|
325
|
+
it "should delegate work to Twitter::Client#public(:friends_statuses)" do
|
308
326
|
@client.should_receive(:timeline).with(:friends_statuses).once
|
309
327
|
@client.friend_statuses
|
310
328
|
end
|
311
329
|
end
|
312
330
|
|
313
|
-
|
314
|
-
|
331
|
+
describe "Twitter::Client#follower_statuses" do
|
332
|
+
before(:each) do
|
315
333
|
@request = mas_net_http_get(:basic_auth => nil)
|
316
334
|
@response = mas_net_http_response
|
317
335
|
|
@@ -319,14 +337,14 @@ context "Twitter::Client#follower_statuses" do
|
|
319
337
|
@client = Twitter::Client.from_config 'config/twitter.yml'
|
320
338
|
end
|
321
339
|
|
322
|
-
|
340
|
+
it "should delegate work to Twitter::Client#public(:followers)" do
|
323
341
|
@client.should_receive(:timeline).with(:followers).once
|
324
342
|
@client.follower_statuses
|
325
343
|
end
|
326
344
|
end
|
327
345
|
|
328
|
-
|
329
|
-
|
346
|
+
describe "Twitter::Client#send_direct_message" do
|
347
|
+
before(:each) do
|
330
348
|
@request = mas_net_http_post(:basic_auth => nil)
|
331
349
|
@response = mas_net_http_response
|
332
350
|
|
@@ -344,29 +362,29 @@ context "Twitter::Client#send_direct_message" do
|
|
344
362
|
@expected_params = "user=#{@user.screen_name}&text=#{URI.escape(@message)}"
|
345
363
|
end
|
346
364
|
|
347
|
-
|
365
|
+
it "should convert given Twitter::User object to screen name" do
|
348
366
|
@user.should_receive(:screen_name).once
|
349
367
|
@client.send_direct_message(@user, @message)
|
350
368
|
end
|
351
369
|
|
352
|
-
|
370
|
+
it "should POST to expected URI" do
|
353
371
|
Net::HTTP::Post.should_receive(:new).with(@expected_uri).once.and_return(@request)
|
354
372
|
@client.send_direct_message(@user, @message)
|
355
373
|
end
|
356
374
|
|
357
|
-
|
375
|
+
it "should login via HTTP Basic Authentication using expected credentials" do
|
358
376
|
@request.should_receive(:basic_auth).with(@login, @password).once
|
359
377
|
@client.send_direct_message(@user, @message)
|
360
378
|
end
|
361
379
|
|
362
|
-
|
380
|
+
it "should make POST request with expected URI escaped parameters" do
|
363
381
|
@http.should_receive(:request).with(@request, @expected_params).once.and_return(@response)
|
364
382
|
@client.send_direct_message(@user, @message)
|
365
383
|
end
|
366
384
|
end
|
367
385
|
|
368
|
-
|
369
|
-
|
386
|
+
describe "Twitter::Status#eql?" do
|
387
|
+
before(:each) do
|
370
388
|
@attr_hash = { :text => 'Status', :id => 34329594003,
|
371
389
|
:user => { :name => 'Tess',
|
372
390
|
:description => "Unfortunate D'Urberville",
|
@@ -379,27 +397,27 @@ context "Twitter::Status#eql?" do
|
|
379
397
|
@other = Twitter::Status.new @attr_hash
|
380
398
|
end
|
381
399
|
|
382
|
-
|
400
|
+
it "should return true when non-transient object attributes are eql?" do
|
383
401
|
@obj.should.eql? @other
|
384
402
|
@obj.eql?(@other).should.eql? true # for the sake of getting rcov to recognize this method is covered in the specs
|
385
403
|
end
|
386
404
|
|
387
|
-
|
405
|
+
it "should return false when not all non-transient object attributes are eql?" do
|
388
406
|
@other.created_at = Time.now.to_s
|
389
|
-
@obj.
|
390
|
-
@obj.eql?(@other).should
|
407
|
+
@obj.should_not eql(@other)
|
408
|
+
@obj.eql?(@other).should be(false) # for the sake of getting rcov to recognize this method is covered in the specs
|
391
409
|
end
|
392
410
|
|
393
|
-
|
394
|
-
@obj.should
|
395
|
-
@obj.eql?(@obj).should
|
396
|
-
@other.should
|
397
|
-
@other.eql?(@other).should
|
411
|
+
it "should return true when comparing same object to itself" do
|
412
|
+
@obj.should eql(@obj)
|
413
|
+
@obj.eql?(@obj).should be(true) # for the sake of getting rcov to recognize this method is covered in the specs
|
414
|
+
@other.should eql(@other)
|
415
|
+
@other.eql?(@other).should be(true) # for the sake of getting rcov to recognize this method is covered in the specs
|
398
416
|
end
|
399
417
|
end
|
400
418
|
|
401
|
-
|
402
|
-
|
419
|
+
describe "Twitter::User#eql?" do
|
420
|
+
before(:each) do
|
403
421
|
@attr_hash = { :name => 'Elizabeth Jane Newson-Henshard',
|
404
422
|
:description => "Wronged 'Daughter'",
|
405
423
|
:location => 'Casterbridge',
|
@@ -410,21 +428,21 @@ context "Twitter::User#eql?" do
|
|
410
428
|
@other = Twitter::User.new @attr_hash
|
411
429
|
end
|
412
430
|
|
413
|
-
|
414
|
-
@obj.should
|
415
|
-
@obj.eql?(@other).should
|
431
|
+
it "should return true when non-transient object attributes are eql?" do
|
432
|
+
@obj.should eql(@other)
|
433
|
+
@obj.eql?(@other).should be(true)
|
416
434
|
end
|
417
435
|
|
418
|
-
|
436
|
+
it "should return false when not all non-transient object attributes are eql?" do
|
419
437
|
@other.id = 1
|
420
|
-
@obj.
|
421
|
-
@obj.eql?(@other).should
|
438
|
+
@obj.should_not eql(@other)
|
439
|
+
@obj.eql?(@other).should be(false)
|
422
440
|
end
|
423
441
|
|
424
|
-
|
425
|
-
@obj.should
|
426
|
-
@obj.eql?(@obj).should
|
427
|
-
@other.should
|
428
|
-
@obj.eql?(@obj).should
|
442
|
+
it "should return true when comparing same object to itself" do
|
443
|
+
@obj.should eql(@obj)
|
444
|
+
@obj.eql?(@obj).should be(true)
|
445
|
+
@other.should eql(@other)
|
446
|
+
@obj.eql?(@obj).should be(true)
|
429
447
|
end
|
430
448
|
end
|
data/spec/twitter/meta_spec.rb
CHANGED
@@ -21,9 +21,10 @@ module ERBMetaMixin
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
-
|
24
|
+
describe "Twitter::Meta cache policy" do
|
25
25
|
include ERBMetaMixin
|
26
|
-
|
26
|
+
include ERBMetaMixin
|
27
|
+
before(:each) do
|
27
28
|
@root_dir = project_root_dir
|
28
29
|
@meta = Twitter::Meta.new(@root_dir)
|
29
30
|
@expected_pkg_info = load_erb_yaml(File.join(@root_dir, 'pkg-info.yml'), binding)
|
@@ -31,34 +32,26 @@ context "Twitter::Meta cache policy" do
|
|
31
32
|
@expected_spec_files = spec_files
|
32
33
|
end
|
33
34
|
|
34
|
-
|
35
|
-
@meta.instance_eval("@
|
36
|
-
@meta.pkg_info
|
37
|
-
@meta.instance_eval("@pkg_info").should_eql?(@expected_pkg_info)
|
38
|
-
@meta.pkg_info
|
39
|
-
@meta.instance_eval("@pkg_info").should_eql?(@expected_pkg_info)
|
40
|
-
end
|
41
|
-
|
42
|
-
specify "should store value returned from project_files in @project_files after first glob" do
|
43
|
-
@meta.instance_eval("@project_files").should.eql?(nil)
|
35
|
+
it "should store value returned from project_files in @project_files after first glob" do
|
36
|
+
@meta.instance_eval("@project_files").should be(nil)
|
44
37
|
@meta.project_files
|
45
|
-
@meta.instance_eval("@project_files").should
|
38
|
+
@meta.instance_eval("@project_files").should eql(@expected_project_files)
|
46
39
|
@meta.project_files
|
47
|
-
@meta.instance_eval("@project_files").should
|
40
|
+
@meta.instance_eval("@project_files").should eql(@expected_project_files)
|
48
41
|
end
|
49
42
|
|
50
|
-
|
51
|
-
@meta.instance_eval("@spec_files").should
|
43
|
+
it "should store value returned from spec_files in @spec_files after first glob" do
|
44
|
+
@meta.instance_eval("@spec_files").should be(nil)
|
52
45
|
@meta.spec_files
|
53
|
-
@meta.instance_eval("@spec_files").should
|
46
|
+
@meta.instance_eval("@spec_files").should eql(@expected_spec_files)
|
54
47
|
@meta.spec_files
|
55
|
-
@meta.instance_eval("@spec_files").should
|
48
|
+
@meta.instance_eval("@spec_files").should eql(@expected_spec_files)
|
56
49
|
end
|
57
50
|
end
|
58
51
|
|
59
|
-
|
52
|
+
describe "Twitter::Meta" do
|
60
53
|
include ERBMetaMixin
|
61
|
-
|
54
|
+
before(:each) do
|
62
55
|
@root_dir = project_root_dir
|
63
56
|
@meta = Twitter::Meta.new(@root_dir)
|
64
57
|
@expected_yaml_hash = load_erb_yaml(File.join(@root_dir, 'pkg-info.yml'), binding)
|
@@ -66,27 +59,27 @@ context "Twitter::Meta" do
|
|
66
59
|
@expected_spec_files = spec_files
|
67
60
|
end
|
68
61
|
|
69
|
-
|
62
|
+
it "should load and return YAML file into Hash object upon #pkg_info call" do
|
70
63
|
yaml_hash = @meta.pkg_info
|
71
64
|
yaml_hash.should.eql? @expected_yaml_hash
|
72
65
|
end
|
73
66
|
|
74
|
-
|
67
|
+
it "should return the embedded hash responding to key 'spec' of #pkg_info call upon #spec_info call" do
|
75
68
|
yaml_hash = @meta.spec_info
|
76
69
|
yaml_hash.should.eql? @expected_yaml_hash['spec']
|
77
70
|
end
|
78
71
|
|
79
|
-
|
72
|
+
it "should return list of files matching ROOT_DIR/lib/**/*.rb upon #project_files call" do
|
80
73
|
project_files = @meta.project_files
|
81
74
|
project_files.should.eql? @expected_project_files
|
82
75
|
end
|
83
76
|
|
84
|
-
|
77
|
+
it "should return list of files matching ROOT_DIR/spec/**/*.rb upon #spec_files call" do
|
85
78
|
spec_files = @meta.spec_files
|
86
79
|
spec_files.should.eql? @expected_spec_files
|
87
80
|
end
|
88
81
|
|
89
|
-
|
82
|
+
it "should return Gem specification based on YAML file contents and #project_files and #spec_files return values" do
|
90
83
|
spec = @meta.gem_spec
|
91
84
|
expected_spec_hash = @expected_yaml_hash['spec']
|
92
85
|
expected_spec_hash.each do |key, val|
|
@@ -5,15 +5,15 @@ VERSION_LIST = [Twitter::Version::MAJOR, Twitter::Version::MINOR, Twitter::Versi
|
|
5
5
|
EXPECTED_VERSION = VERSION_LIST.join('.')
|
6
6
|
EXPECTED_NAME = VERSION_LIST.join('_')
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
Twitter::Version.to_version.should
|
8
|
+
describe "Twitter::Version.to_version" do
|
9
|
+
it "should return #{EXPECTED_VERSION}" do
|
10
|
+
Twitter::Version.to_version.should eql(EXPECTED_VERSION)
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
Twitter::Version.to_name.should
|
14
|
+
describe "Twitter::Version.to_name" do
|
15
|
+
it "should return #{EXPECTED_NAME}" do
|
16
|
+
Twitter::Version.to_name.should eql(EXPECTED_NAME)
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
|
|
3
3
|
specification_version: 1
|
4
4
|
name: twitter4r
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.1.
|
7
|
-
date: 2007-
|
6
|
+
version: 0.1.1
|
7
|
+
date: 2007-06-25 00:00:00 -05:00
|
8
8
|
summary: A clean Twitter client API in pure Ruby (not command-line client). Will include Twitter add-ons also in Ruby.
|
9
9
|
require_paths:
|
10
10
|
- lib
|