hayesdavis-grackle 0.1.2 → 0.1.3
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/README.rdoc +1 -1
- data/grackle.gemspec +2 -2
- data/lib/grackle/client.rb +4 -3
- data/lib/grackle/transport.rb +9 -1
- data/lib/grackle.rb +1 -1
- data/test/test_client.rb +49 -7
- metadata +4 -3
data/README.rdoc
CHANGED
@@ -31,7 +31,7 @@ Before you do anything else, you'll need to
|
|
31
31
|
====Using OAuth
|
32
32
|
client = Grackle::Client.new(:auth=>{
|
33
33
|
:type=>:oauth,
|
34
|
-
:consumer_key=>'SOMECONSUMERKEYFROMTWITTER', :
|
34
|
+
:consumer_key=>'SOMECONSUMERKEYFROMTWITTER', :consumer_secret=>'SOMECONSUMERTOKENFROMTWITTER',
|
35
35
|
:token=>'ACCESSTOKENACQUIREDONUSERSBEHALF', :token_secret=>'SUPERSECRETACCESSTOKENSECRET'
|
36
36
|
})
|
37
37
|
|
data/grackle.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{grackle}
|
5
|
-
s.version = "0.1.
|
5
|
+
s.version = "0.1.3"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Hayes Davis"]
|
9
|
-
s.date = %q{2009-
|
9
|
+
s.date = %q{2009-05-23}
|
10
10
|
s.description = %q{Grackle is a lightweight library for the Twitter REST and Search API.}
|
11
11
|
s.email = %q{hayes@appozite.com}
|
12
12
|
s.files = ["History.txt", "README.rdoc", "grackle.gemspec", "lib/grackle.rb", "lib/grackle/client.rb", "lib/grackle/handlers.rb", "lib/grackle/transport.rb", "lib/grackle/utils.rb", "test/test_grackle.rb", "test/test_helper.rb", "test/test_client.rb", "test/test_handlers.rb"]
|
data/lib/grackle/client.rb
CHANGED
@@ -39,7 +39,7 @@ module Grackle
|
|
39
39
|
# you've got all the necessary tokens and keys:
|
40
40
|
# client = Grackle::Client.new(:auth=>{
|
41
41
|
# :type=>:oauth,
|
42
|
-
# :consumer_key=>'SOMECONSUMERKEYFROMTWITTER, :
|
42
|
+
# :consumer_key=>'SOMECONSUMERKEYFROMTWITTER, :consumer_secret=>'SOMECONSUMERTOKENFROMTWITTER',
|
43
43
|
# :token=>'ACCESSTOKENACQUIREDONUSERSBEHALF', :token_secret=>'SUPERSECRETACCESSTOKENSECRET'
|
44
44
|
# })
|
45
45
|
class Client
|
@@ -88,7 +88,7 @@ module Grackle
|
|
88
88
|
:authorize_path=>'/oauth/authorize'
|
89
89
|
}
|
90
90
|
|
91
|
-
attr_accessor :auth, :handlers, :default_format, :headers, :ssl, :api, :transport, :request, :api_hosts
|
91
|
+
attr_accessor :auth, :handlers, :default_format, :headers, :ssl, :api, :transport, :request, :api_hosts, :timeout
|
92
92
|
|
93
93
|
# Arguments (all are optional):
|
94
94
|
# - :username - twitter username to authenticate with (deprecated in favor of :auth arg)
|
@@ -110,6 +110,7 @@ module Grackle
|
|
110
110
|
self.ssl = options[:ssl] == true
|
111
111
|
self.api = options[:api] || :rest
|
112
112
|
self.api_hosts = TWITTER_API_HOSTS.clone
|
113
|
+
self.timeout = options[:timeout] || 60
|
113
114
|
self.auth = {}
|
114
115
|
if options.has_key?(:username) || options.has_key?(:password)
|
115
116
|
#Use basic auth if :username and :password args are passed in
|
@@ -202,7 +203,7 @@ module Grackle
|
|
202
203
|
def send_request(params)
|
203
204
|
begin
|
204
205
|
transport.request(
|
205
|
-
request.method,request.url,:auth=>auth,:headers=>headers,:params=>params
|
206
|
+
request.method,request.url,:auth=>auth,:headers=>headers,:params=>params, :timeout => timeout
|
206
207
|
)
|
207
208
|
rescue => e
|
208
209
|
puts e
|
data/lib/grackle/transport.rb
CHANGED
@@ -16,6 +16,7 @@ module Grackle
|
|
16
16
|
attr_accessor :debug
|
17
17
|
|
18
18
|
CRLF = "\r\n"
|
19
|
+
DEFAULT_REDIRECT_LIMIT = 5
|
19
20
|
|
20
21
|
def req_class(method)
|
21
22
|
case method
|
@@ -31,6 +32,7 @@ module Grackle
|
|
31
32
|
# a multipart request will be sent. If a Time is included, .httpdate will be called on it.
|
32
33
|
# - :headers - a hash of headers to send with the request
|
33
34
|
# - :auth - a hash of authentication parameters for either basic or oauth
|
35
|
+
# - :timeout - timeout for the http request in seconds
|
34
36
|
def request(method, string_url, options={})
|
35
37
|
params = stringify_params(options[:params])
|
36
38
|
if method == :get && params
|
@@ -49,6 +51,7 @@ module Grackle
|
|
49
51
|
conn.use_ssl = (url.scheme == 'https')
|
50
52
|
conn.start do |http|
|
51
53
|
req = req_class(method).new(url.request_uri)
|
54
|
+
http.read_timeout = options[:timeout]
|
52
55
|
add_headers(req,options[:headers])
|
53
56
|
if file_param?(options[:params])
|
54
57
|
add_multipart_data(req,options[:params])
|
@@ -65,7 +68,12 @@ module Grackle
|
|
65
68
|
dump_request(req) if debug
|
66
69
|
res = http.request(req)
|
67
70
|
dump_response(res) if debug
|
68
|
-
|
71
|
+
redirect_limit = options[:redirect_limit] || DEFAULT_REDIRECT_LIMIT
|
72
|
+
if res.code.to_s =~ /^30\d$/ && redirect_limit > 0
|
73
|
+
execute_request(method,URI.parse(res['location']),options.merge(:redirect_limit=>redirect_limit-1))
|
74
|
+
else
|
75
|
+
Response.new(method,url.to_s,res.code.to_i,res.body)
|
76
|
+
end
|
69
77
|
end
|
70
78
|
end
|
71
79
|
|
data/lib/grackle.rb
CHANGED
data/test/test_client.rb
CHANGED
@@ -5,21 +5,26 @@ class TestClient < Test::Unit::TestCase
|
|
5
5
|
#Used for mocking HTTP requests
|
6
6
|
class Net::HTTP
|
7
7
|
class << self
|
8
|
-
attr_accessor :response, :request, :last_instance
|
8
|
+
attr_accessor :response, :request, :last_instance, :responder
|
9
9
|
end
|
10
10
|
|
11
11
|
def request(req)
|
12
12
|
self.class.last_instance = self
|
13
|
-
self.class.
|
14
|
-
|
13
|
+
if self.class.responder
|
14
|
+
self.class.responder.call(self,req)
|
15
|
+
else
|
16
|
+
self.class.request = req
|
17
|
+
self.class.response
|
18
|
+
end
|
15
19
|
end
|
16
20
|
end
|
17
21
|
|
18
|
-
#Mock responses that conform
|
19
|
-
class MockResponse
|
20
|
-
include Net::HTTPHeader
|
22
|
+
#Mock responses that conform to HTTPResponse's interface
|
23
|
+
class MockResponse < Net::HTTPResponse
|
24
|
+
#include Net::HTTPHeader
|
21
25
|
attr_accessor :code, :body
|
22
26
|
def initialize(code,body,headers={})
|
27
|
+
super
|
23
28
|
self.code = code
|
24
29
|
self.body = body
|
25
30
|
headers.each do |name, value|
|
@@ -30,7 +35,7 @@ class TestClient < Test::Unit::TestCase
|
|
30
35
|
|
31
36
|
#Transport that collects info on requests and responses for testing purposes
|
32
37
|
class MockTransport < Grackle::Transport
|
33
|
-
attr_accessor :status, :body, :method, :url, :options
|
38
|
+
attr_accessor :status, :body, :method, :url, :options, :timeout
|
34
39
|
|
35
40
|
def initialize(status,body,headers={})
|
36
41
|
Net::HTTP.response = MockResponse.new(status,body,headers)
|
@@ -56,6 +61,36 @@ class TestClient < Test::Unit::TestCase
|
|
56
61
|
end
|
57
62
|
end
|
58
63
|
|
64
|
+
def test_redirects
|
65
|
+
redirects = 2 #Check that we can follow 2 redirects before getting to original request
|
66
|
+
req_count = 0
|
67
|
+
responder = Proc.new do |inst, req|
|
68
|
+
req_count += 1
|
69
|
+
#Store the original request
|
70
|
+
if req_count == 1
|
71
|
+
inst.class.request = req
|
72
|
+
else
|
73
|
+
assert_equal("/somewhere_else#{req_count-1}.json",req.path)
|
74
|
+
end
|
75
|
+
if req_count <= redirects
|
76
|
+
MockResponse.new(302,"You are being redirected",'location'=>"http://twitter.com/somewhere_else#{req_count}.json")
|
77
|
+
else
|
78
|
+
inst.class.response
|
79
|
+
end
|
80
|
+
end
|
81
|
+
with_http_responder(responder) do
|
82
|
+
test_simple_get_request
|
83
|
+
end
|
84
|
+
assert_equal(redirects+1,req_count)
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_timeouts
|
88
|
+
client = new_client(200,'{"id":12345,"screen_name":"test_user"}')
|
89
|
+
assert_equal(60, client.timeout)
|
90
|
+
client.timeout = 30
|
91
|
+
assert_equal(30, client.timeout)
|
92
|
+
end
|
93
|
+
|
59
94
|
def test_simple_get_request
|
60
95
|
client = new_client(200,'{"id":12345,"screen_name":"test_user"}')
|
61
96
|
value = client.users.show.json? :screen_name=>'test_user'
|
@@ -150,6 +185,13 @@ class TestClient < Test::Unit::TestCase
|
|
150
185
|
end
|
151
186
|
|
152
187
|
private
|
188
|
+
def with_http_responder(responder)
|
189
|
+
Net::HTTP.responder = responder
|
190
|
+
yield
|
191
|
+
ensure
|
192
|
+
Net::HTTP.responder = nil
|
193
|
+
end
|
194
|
+
|
153
195
|
def new_client(response_status, response_body, client_opts={})
|
154
196
|
client = Grackle::Client.new(client_opts)
|
155
197
|
client.transport = MockTransport.new(response_status,response_body)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hayesdavis-grackle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hayes Davis
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-05-23 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -65,6 +65,7 @@ files:
|
|
65
65
|
- test/test_handlers.rb
|
66
66
|
has_rdoc: true
|
67
67
|
homepage: http://github.com/hayesdavis/grackle
|
68
|
+
licenses:
|
68
69
|
post_install_message:
|
69
70
|
rdoc_options:
|
70
71
|
- --inline-source
|
@@ -87,7 +88,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
87
88
|
requirements: []
|
88
89
|
|
89
90
|
rubyforge_project: grackle
|
90
|
-
rubygems_version: 1.
|
91
|
+
rubygems_version: 1.3.5
|
91
92
|
signing_key:
|
92
93
|
specification_version: 2
|
93
94
|
summary: Grackle is a library for the Twitter REST and Search API designed to not require a new release in the face Twitter API changes or errors. It supports both basic and OAuth authentication mechanisms.
|