weary 1.0.1 → 1.1.0
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/.gitignore +1 -0
- data/Gemfile +9 -4
- data/Gemfile.lock +36 -20
- data/README.md +11 -3
- data/lib/weary/adapter.rb +25 -1
- data/lib/weary/adapters/excon.rb +36 -0
- data/lib/weary/adapters/net_http.rb +29 -47
- data/lib/weary/adapters/typhoeus.rb +32 -0
- data/lib/weary/client.rb +2 -29
- data/lib/weary/deferred.rb +1 -1
- data/lib/weary/env.rb +6 -1
- data/lib/weary/middleware/timeout.rb +22 -0
- data/lib/weary/request.rb +14 -23
- data/lib/weary/requestable.rb +69 -0
- data/lib/weary/resource.rb +35 -32
- data/lib/weary/response.rb +6 -2
- data/lib/weary/route.rb +6 -1
- data/lib/weary/version.rb +1 -1
- data/spec/spec_helper.rb +2 -1
- data/spec/support/shared_examples_for_a_rack_app.rb +12 -0
- data/spec/support/shared_examples_for_a_requestable.rb +77 -0
- data/spec/support/shared_examples_for_an_adapter.rb +16 -0
- data/spec/weary/adapter_spec.rb +8 -15
- data/spec/weary/adapters/excon_spec.rb +86 -0
- data/spec/weary/adapters/nethttp_spec.rb +63 -54
- data/spec/weary/adapters/typhoeus_spec.rb +68 -0
- data/spec/weary/client_spec.rb +4 -0
- data/spec/weary/deferred_spec.rb +1 -1
- data/spec/weary/middleware/basic_auth_spec.rb +2 -2
- data/spec/weary/middleware/timeout_spec.rb +24 -0
- data/spec/weary/request_spec.rb +6 -42
- data/spec/weary/requestable_spec.rb +9 -0
- data/spec/weary/resource_spec.rb +6 -18
- data/spec/weary/response_spec.rb +10 -0
- data/weary.gemspec +2 -2
- metadata +56 -15
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Weary::Adapter::Excon do
|
4
|
+
before do
|
5
|
+
@url = "http://github.com/api/v2/json/repos/show/mwunsch/weary"
|
6
|
+
@request = Weary::Request.new @url
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "class methods" do
|
10
|
+
it_behaves_like "an Adapter" do
|
11
|
+
before do
|
12
|
+
stub_request(:get, @url).
|
13
|
+
to_return(:status => 200, :body => "", :headers => {})
|
14
|
+
end
|
15
|
+
|
16
|
+
subject { described_class }
|
17
|
+
let(:env) { @request.env }
|
18
|
+
end
|
19
|
+
|
20
|
+
describe ".call" do
|
21
|
+
it "performs the request through the connect method" do
|
22
|
+
described_class.stub(:connect) { Rack::Response.new("", 200, {})}
|
23
|
+
described_class.should_receive :connect
|
24
|
+
described_class.call(@request.env)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe ".connect" do
|
29
|
+
before do
|
30
|
+
stub_request(:get, @url)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "performs the http request" do
|
34
|
+
req = Rack::Request.new(@request.env)
|
35
|
+
described_class.connect(req)
|
36
|
+
a_request(:get, @url).should have_been_made
|
37
|
+
end
|
38
|
+
|
39
|
+
it "sets appropriate request headers" do
|
40
|
+
@request.headers 'User-Agent' => Weary::USER_AGENTS['Lynx 2.8.4rel.1 on Linux']
|
41
|
+
req = Rack::Request.new(@request.env)
|
42
|
+
described_class.connect(req)
|
43
|
+
a_request(:get, @url).with(:headers => @request.headers).should have_been_made
|
44
|
+
end
|
45
|
+
|
46
|
+
it "sets the body of the request" do
|
47
|
+
stub_request(:post, @url)
|
48
|
+
|
49
|
+
@request.method = "POST"
|
50
|
+
@request.params :foo => "baz"
|
51
|
+
req = Rack::Request.new(@request.env)
|
52
|
+
described_class.connect(req)
|
53
|
+
a_request(:post, @url).with(:body => "foo=baz").should have_been_made
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "#connect" do
|
59
|
+
it "calls the class method `.connect`" do
|
60
|
+
described_class.stub(:connect) { [200, {'Content-Type' => 'text/plain'}, [""]] }
|
61
|
+
described_class.should_receive(:connect)
|
62
|
+
described_class.new.connect(Rack::Request.new(@request.env))
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe "#call" do
|
67
|
+
it "uses the overriden `#connect` method" do
|
68
|
+
instance = described_class.new
|
69
|
+
instance.stub(:connect) { Rack::Response.new [""], 501, {"Content-Type" => "text/plain"} }
|
70
|
+
instance.should_receive(:connect)
|
71
|
+
instance.call(@request.env)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
it_behaves_like "an Adapter" do
|
76
|
+
before do
|
77
|
+
stub_request(:get, @url).
|
78
|
+
to_return(:status => 200, :body => "", :headers => {})
|
79
|
+
end
|
80
|
+
|
81
|
+
subject { described_class }
|
82
|
+
let(:env) { @request.env }
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
end
|
@@ -6,83 +6,92 @@ describe Weary::Adapter::NetHttp do
|
|
6
6
|
@request = Weary::Request.new @url
|
7
7
|
end
|
8
8
|
|
9
|
-
describe "
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
describe "class methods" do
|
10
|
+
it_behaves_like "an Adapter" do
|
11
|
+
before do
|
12
|
+
stub_request(:get, @url).
|
13
|
+
to_return(:status => 200, :body => "", :headers => {})
|
14
|
+
end
|
14
15
|
|
15
|
-
it_behaves_like "a Rack application" do
|
16
16
|
subject { described_class }
|
17
17
|
let(:env) { @request.env }
|
18
18
|
end
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
20
|
+
describe ".call" do
|
21
|
+
it "performs the request through the connect method" do
|
22
|
+
described_class.stub(:connect) { Rack::Response.new("", 200, {})}
|
23
|
+
described_class.should_receive :connect
|
24
|
+
described_class.call(@request.env)
|
25
|
+
end
|
24
26
|
end
|
25
|
-
end
|
26
27
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
described_class.new.call(@request.env)
|
32
|
-
end
|
33
|
-
end
|
28
|
+
describe ".connect" do
|
29
|
+
before do
|
30
|
+
stub_request(:get, @url)
|
31
|
+
end
|
34
32
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
33
|
+
it "performs the http request" do
|
34
|
+
req = Rack::Request.new(@request.env)
|
35
|
+
described_class.connect(req)
|
36
|
+
a_request(:get, @url).should have_been_made
|
37
|
+
end
|
39
38
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
39
|
+
it "sets appropriate request headers" do
|
40
|
+
@request.headers 'User-Agent' => Weary::USER_AGENTS['Lynx 2.8.4rel.1 on Linux']
|
41
|
+
req = Rack::Request.new(@request.env)
|
42
|
+
described_class.connect(req)
|
43
|
+
a_request(:get, @url).with(:headers => @request.headers).should have_been_made
|
44
|
+
end
|
45
45
|
|
46
|
-
|
47
|
-
|
48
|
-
|
46
|
+
it "sets the body of the request" do
|
47
|
+
stub_request(:post, @url)
|
48
|
+
@request.method = "POST"
|
49
|
+
@request.params :foo => "baz"
|
50
|
+
req = Rack::Request.new(@request.env)
|
51
|
+
described_class.connect(req)
|
52
|
+
a_request(:post, @url).with(:body => "foo=baz").should have_been_made
|
53
|
+
end
|
49
54
|
end
|
50
55
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
+
describe ".socket" do
|
57
|
+
it "sets up the http connection" do
|
58
|
+
req = Rack::Request.new(@request.env)
|
59
|
+
described_class.socket(req).should be_kind_of Net::HTTP
|
60
|
+
end
|
56
61
|
end
|
57
62
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
req = Rack::Request.new(@request.env)
|
63
|
-
described_class.connect(req)
|
64
|
-
a_request(:post, @url).with(:body => "foo=baz").should have_been_made
|
63
|
+
describe ".request_class" do
|
64
|
+
it "gets the Net::HTTP request class for the request method" do
|
65
|
+
described_class.request_class("POST").should be Net::HTTP::Post
|
66
|
+
end
|
65
67
|
end
|
66
68
|
end
|
67
69
|
|
68
|
-
describe "
|
69
|
-
it "
|
70
|
-
|
71
|
-
|
72
|
-
|
70
|
+
describe "#connect" do
|
71
|
+
it "calls the class method `.connect`" do
|
72
|
+
described_class.stub(:connect) { [200, {'Content-Type' => 'text/plain'}, [""]] }
|
73
|
+
described_class.should_receive(:connect)
|
74
|
+
described_class.new.connect(Rack::Request.new(@request.env))
|
73
75
|
end
|
74
76
|
end
|
75
77
|
|
76
|
-
describe "
|
77
|
-
it "
|
78
|
-
|
79
|
-
|
78
|
+
describe "#call" do
|
79
|
+
it "uses the overriden `#connect` method" do
|
80
|
+
instance = described_class.new
|
81
|
+
instance.stub(:connect) { Rack::Response.new [""], 501, {"Content-Type" => "text/plain"} }
|
82
|
+
instance.should_receive(:connect)
|
83
|
+
instance.call(@request.env)
|
80
84
|
end
|
81
85
|
end
|
82
86
|
|
83
|
-
|
84
|
-
|
85
|
-
|
87
|
+
it_behaves_like "an Adapter" do
|
88
|
+
before do
|
89
|
+
stub_request(:get, @url).
|
90
|
+
to_return(:status => 200, :body => "", :headers => {})
|
86
91
|
end
|
92
|
+
|
93
|
+
subject { described_class.new }
|
94
|
+
let(:env) { @request.env }
|
87
95
|
end
|
96
|
+
|
88
97
|
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
begin
|
4
|
+
describe Weary::Adapter::Typhoeus do
|
5
|
+
before do
|
6
|
+
@url = "http://github.com/api/v2/json/repos/show/mwunsch/weary"
|
7
|
+
@request = Weary::Request.new @url
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "class methods" do
|
11
|
+
it_behaves_like "an Adapter" do
|
12
|
+
before do
|
13
|
+
stub_request(:get, @url).
|
14
|
+
to_return(:status => 200, :body => "", :headers => {})
|
15
|
+
end
|
16
|
+
|
17
|
+
subject { described_class }
|
18
|
+
let(:env) { @request.env }
|
19
|
+
end
|
20
|
+
|
21
|
+
describe ".call" do
|
22
|
+
it "performs the request through the connect method" do
|
23
|
+
described_class.stub(:connect) { Rack::Response.new("", 200, {})}
|
24
|
+
described_class.should_receive :connect
|
25
|
+
described_class.call(@request.env)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#connect" do
|
31
|
+
it "calls the class method `.connect`" do
|
32
|
+
described_class.stub(:connect) { [200, {'Content-Type' => 'text/plain'}, [""]] }
|
33
|
+
described_class.should_receive(:connect)
|
34
|
+
described_class.new.connect(Rack::Request.new(@request.env))
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "#call" do
|
39
|
+
it "uses the overriden `#connect` method" do
|
40
|
+
instance = described_class.new
|
41
|
+
instance.stub(:connect) { Rack::Response.new [""], 501, {"Content-Type" => "text/plain"} }
|
42
|
+
instance.should_receive(:connect)
|
43
|
+
instance.call(@request.env)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
it_behaves_like "an Adapter" do
|
48
|
+
before do
|
49
|
+
stub_request(:get, @url).
|
50
|
+
to_return(:status => 200, :body => "", :headers => {})
|
51
|
+
end
|
52
|
+
|
53
|
+
subject { described_class }
|
54
|
+
let(:env) { @request.env }
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
rescue LoadError => e
|
60
|
+
warn <<-MSG
|
61
|
+
[warn] Received a LoadError when attempting to load the Typhoeus adapter,
|
62
|
+
and skipping the specs.
|
63
|
+
|
64
|
+
#{e.message}
|
65
|
+
|
66
|
+
Make sure Typhoeus is in the $LOAD_PATH.
|
67
|
+
MSG
|
68
|
+
end
|
data/spec/weary/client_spec.rb
CHANGED
@@ -2,6 +2,10 @@ require 'spec_helper'
|
|
2
2
|
require 'rack/lobster'
|
3
3
|
|
4
4
|
describe Weary::Client do
|
5
|
+
it_behaves_like "a Requestable" do
|
6
|
+
subject { Class.new(Weary::Client) }
|
7
|
+
end
|
8
|
+
|
5
9
|
describe "::resource" do
|
6
10
|
before do
|
7
11
|
@url = "http://github.com/api/v2/json/repos/show/mwunsch/weary"
|
data/spec/weary/deferred_spec.rb
CHANGED
@@ -10,12 +10,12 @@ describe Weary::Middleware::BasicAuth do
|
|
10
10
|
end
|
11
11
|
|
12
12
|
it_behaves_like "a Rack application" do
|
13
|
-
subject { described_class.new(@request,
|
13
|
+
subject { described_class.new(@request, "mwunsch", "secret") }
|
14
14
|
let(:env) { @request.env }
|
15
15
|
end
|
16
16
|
|
17
17
|
it "prepares the Authorization header for the request" do
|
18
|
-
middleware = described_class.new(@request,
|
18
|
+
middleware = described_class.new(@request, "mwunsch", "secret")
|
19
19
|
middleware.call(@request.env)
|
20
20
|
a_request(:get, @url).should have_been_made
|
21
21
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'weary/middleware/timeout'
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Weary::Middleware::Timeout do
|
5
|
+
describe "#call" do
|
6
|
+
before do
|
7
|
+
@url = "http://github.com/api/v2/json/repos/show/mwunsch/weary"
|
8
|
+
@request = Weary::Request.new @url
|
9
|
+
stub_request(:get, @request.uri.to_s).to_timeout
|
10
|
+
end
|
11
|
+
|
12
|
+
it_behaves_like "a Rack application" do
|
13
|
+
subject { described_class.new(@request) }
|
14
|
+
let(:env) { @request.env }
|
15
|
+
end
|
16
|
+
|
17
|
+
it "returns a 504 (Gateway Timeout) when no response is received in time" do
|
18
|
+
middleware = described_class.new(@request)
|
19
|
+
status, header, body = middleware.call(@request.env)
|
20
|
+
status.should eql 504
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
data/spec/weary/request_spec.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Weary::Request do
|
4
|
+
it_behaves_like "a Requestable" do
|
5
|
+
subject { described_class.new "http://github.com/api/v2/json/repos/show/mwunsch/weary" }
|
6
|
+
end
|
7
|
+
|
4
8
|
describe "#uri" do
|
5
9
|
subject { described_class.new "http://github.com/api/v2/json/repos/show/mwunsch/weary" }
|
6
10
|
|
@@ -97,16 +101,6 @@ describe Weary::Request do
|
|
97
101
|
subject { described_class.new "http://github.com/api/v2/json/repos/show/mwunsch/weary" }
|
98
102
|
let(:hash) { {'User-Agent' => Weary::USER_AGENTS['Lynx 2.8.4rel.1 on Linux']} }
|
99
103
|
|
100
|
-
it "sets headers for the request" do
|
101
|
-
subject.headers(hash)
|
102
|
-
subject.instance_variable_get(:@headers).should eql hash
|
103
|
-
end
|
104
|
-
|
105
|
-
it "gets previously set headers" do
|
106
|
-
subject.headers(hash)
|
107
|
-
subject.headers.should eql hash
|
108
|
-
end
|
109
|
-
|
110
104
|
it "updates the env with the Rack-friendly key" do
|
111
105
|
subject.headers(hash)
|
112
106
|
subject.env.should have_key('HTTP_USER_AGENT')
|
@@ -118,21 +112,6 @@ describe Weary::Request do
|
|
118
112
|
end
|
119
113
|
end
|
120
114
|
|
121
|
-
describe "#user_agent" do
|
122
|
-
subject { described_class.new "http://github.com/api/v2/json/repos/show/mwunsch/weary" }
|
123
|
-
let(:agent) { 'RSpec' }
|
124
|
-
|
125
|
-
it "updates the #headers hash with a User-Agent" do
|
126
|
-
subject.user_agent agent
|
127
|
-
subject.headers.should have_key 'User-Agent'
|
128
|
-
end
|
129
|
-
|
130
|
-
it "sets the user agent for the headers" do
|
131
|
-
subject.user_agent agent
|
132
|
-
subject.headers['User-Agent'].should be agent
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
115
|
describe "#params" do
|
137
116
|
it "sets the query string for a GET request" do
|
138
117
|
req = described_class.new "http://api.twitter.com/version/users/show.json"
|
@@ -142,8 +121,7 @@ describe Weary::Request do
|
|
142
121
|
|
143
122
|
it "sets the rack input for a POST request" do
|
144
123
|
req = described_class.new "https://api.github.com/gists", "POST"
|
145
|
-
req.params :public => true
|
146
|
-
:files => { "file1.txt" => { :content => "String file contents"}}
|
124
|
+
req.params :public => true
|
147
125
|
req.env['rack.input'].read.should eql req.params
|
148
126
|
end
|
149
127
|
|
@@ -196,20 +174,6 @@ describe Weary::Request do
|
|
196
174
|
end
|
197
175
|
end
|
198
176
|
|
199
|
-
describe "#adapter" do
|
200
|
-
subject { described_class.new "http://github.com/api/v2/json/repos/show/mwunsch/weary" }
|
201
|
-
|
202
|
-
it "sets a new adapter to set the connection" do
|
203
|
-
klass = Class.new { include Weary::Adapter }
|
204
|
-
subject.adapter(klass)
|
205
|
-
subject.adapter.should be klass
|
206
|
-
end
|
207
|
-
|
208
|
-
it "defaults to the Net::HTTP adapter" do
|
209
|
-
subject.adapter.should be Weary::Adapter::NetHttp
|
210
|
-
end
|
211
|
-
end
|
212
|
-
|
213
177
|
describe "#perform" do
|
214
178
|
subject do
|
215
179
|
url = "http://github.com/api/v2/json/repos/show/mwunsch/weary"
|
@@ -233,7 +197,7 @@ describe Weary::Request do
|
|
233
197
|
end
|
234
198
|
|
235
199
|
describe "#use" do
|
236
|
-
it "
|
200
|
+
it "runs middleware through the calling stack" do
|
237
201
|
req = described_class.new "http://github.com/api/v2/json/repos/show/mwunsch/weary"
|
238
202
|
req.adapter(Class.new { include Weary::Adapter })
|
239
203
|
# Rack::Runtime sets an "X-Runtime" response header
|