faraday 0.8.11 → 0.9.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +6 -0
- data/CONTRIBUTING.md +36 -0
- data/Gemfile +7 -6
- data/LICENSE.md +1 -1
- data/README.md +38 -51
- data/Rakefile +2 -18
- data/faraday.gemspec +34 -0
- data/lib/faraday.rb +181 -67
- data/lib/faraday/adapter.rb +19 -34
- data/lib/faraday/adapter/em_http.rb +24 -10
- data/lib/faraday/adapter/em_synchrony.rb +1 -15
- data/lib/faraday/adapter/excon.rb +6 -12
- data/lib/faraday/adapter/httpclient.rb +92 -0
- data/lib/faraday/adapter/net_http.rb +2 -3
- data/lib/faraday/adapter/net_http_persistent.rb +3 -15
- data/lib/faraday/adapter/patron.rb +13 -21
- data/lib/faraday/adapter/rack.rb +0 -2
- data/lib/faraday/adapter/test.rb +35 -36
- data/lib/faraday/adapter/typhoeus.rb +10 -12
- data/lib/faraday/autoload.rb +87 -0
- data/lib/faraday/connection.rb +196 -99
- data/lib/faraday/error.rb +33 -33
- data/lib/faraday/options.rb +215 -0
- data/lib/faraday/parameters.rb +193 -0
- data/lib/faraday/{builder.rb → rack_builder.rb} +78 -21
- data/lib/faraday/request.rb +12 -25
- data/lib/faraday/request/authorization.rb +3 -3
- data/lib/faraday/request/basic_authentication.rb +1 -1
- data/lib/faraday/request/instrumentation.rb +38 -0
- data/lib/faraday/request/multipart.rb +10 -9
- data/lib/faraday/request/retry.rb +70 -6
- data/lib/faraday/request/token_authentication.rb +2 -2
- data/lib/faraday/request/url_encoded.rb +7 -6
- data/lib/faraday/response.rb +17 -22
- data/lib/faraday/response/logger.rb +4 -4
- data/lib/faraday/response/raise_error.rb +4 -5
- data/lib/faraday/utils.rb +54 -67
- data/script/console +7 -0
- data/script/release +6 -3
- data/script/server +3 -1
- data/script/test +7 -33
- data/test/adapters/em_http_test.rb +6 -1
- data/test/adapters/em_synchrony_test.rb +7 -1
- data/test/adapters/excon_test.rb +0 -7
- data/test/adapters/httpclient_test.rb +16 -0
- data/test/adapters/integration.rb +8 -39
- data/test/adapters/logger_test.rb +1 -1
- data/test/adapters/net_http_test.rb +0 -31
- data/test/adapters/patron_test.rb +1 -1
- data/test/adapters/rack_test.rb +0 -5
- data/test/adapters/test_middleware_test.rb +19 -4
- data/test/adapters/typhoeus_test.rb +20 -3
- data/test/authentication_middleware_test.rb +7 -7
- data/test/connection_test.rb +52 -75
- data/test/env_test.rb +33 -24
- data/test/helper.rb +15 -13
- data/test/live_server.rb +10 -4
- data/test/middleware/instrumentation_test.rb +75 -0
- data/test/middleware/retry_test.rb +44 -38
- data/test/middleware_stack_test.rb +12 -11
- data/test/options_test.rb +126 -0
- data/test/request_middleware_test.rb +17 -7
- data/test/response_middleware_test.rb +2 -4
- data/test/strawberry.rb +2 -0
- metadata +82 -28
- checksums.yaml +0 -7
- data/script/proxy-server +0 -41
- data/test/multibyte.txt +0 -1
- data/test/parameters_test.rb +0 -24
- data/test/utils_test.rb +0 -30
data/test/env_test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.expand_path(
|
1
|
+
require File.expand_path('../helper', __FILE__)
|
2
2
|
|
3
3
|
class EnvTest < Faraday::TestCase
|
4
4
|
def setup
|
@@ -6,29 +6,29 @@ class EnvTest < Faraday::TestCase
|
|
6
6
|
:headers => {'Mime-Version' => '1.0'},
|
7
7
|
:request => {:oauth => {:consumer_key => 'anonymous'}}
|
8
8
|
|
9
|
-
@conn.options
|
10
|
-
@conn.options
|
11
|
-
@conn.ssl
|
9
|
+
@conn.options.timeout = 3
|
10
|
+
@conn.options.open_timeout = 5
|
11
|
+
@conn.ssl.verify = false
|
12
12
|
@conn.proxy 'http://proxy.com'
|
13
13
|
end
|
14
14
|
|
15
15
|
def test_request_create_stores_method
|
16
16
|
env = make_env(:get)
|
17
|
-
assert_equal :get, env
|
17
|
+
assert_equal :get, env.method
|
18
18
|
end
|
19
19
|
|
20
20
|
def test_request_create_stores_uri
|
21
21
|
env = make_env do |req|
|
22
22
|
req.url 'foo.json', 'a' => 1
|
23
23
|
end
|
24
|
-
assert_equal 'http://sushi.com/api/foo.json?a=1', env
|
24
|
+
assert_equal 'http://sushi.com/api/foo.json?a=1', env.url.to_s
|
25
25
|
end
|
26
26
|
|
27
27
|
def test_request_create_stores_headers
|
28
28
|
env = make_env do |req|
|
29
29
|
req['Server'] = 'Faraday'
|
30
30
|
end
|
31
|
-
headers = env
|
31
|
+
headers = env.request_headers
|
32
32
|
assert_equal '1.0', headers['mime-version']
|
33
33
|
assert_equal 'Faraday', headers['server']
|
34
34
|
end
|
@@ -37,37 +37,37 @@ class EnvTest < Faraday::TestCase
|
|
37
37
|
env = make_env do |req|
|
38
38
|
req.body = 'hi'
|
39
39
|
end
|
40
|
-
assert_equal 'hi', env
|
40
|
+
assert_equal 'hi', env.body
|
41
41
|
end
|
42
42
|
|
43
43
|
def test_global_request_options
|
44
44
|
env = make_env
|
45
|
-
assert_equal 3, env
|
46
|
-
assert_equal 5, env
|
45
|
+
assert_equal 3, env.request.timeout
|
46
|
+
assert_equal 5, env.request.open_timeout
|
47
47
|
end
|
48
48
|
|
49
49
|
def test_per_request_options
|
50
50
|
env = make_env do |req|
|
51
|
-
req.options
|
52
|
-
req.options
|
53
|
-
req.options
|
51
|
+
req.options.timeout = 10
|
52
|
+
req.options.boundary = 'boo'
|
53
|
+
req.options.oauth[:consumer_secret] = 'xyz'
|
54
54
|
end
|
55
|
-
assert_equal 10, env
|
56
|
-
assert_equal 5, env
|
57
|
-
assert_equal
|
55
|
+
assert_equal 10, env.request.timeout
|
56
|
+
assert_equal 5, env.request.open_timeout
|
57
|
+
assert_equal 'boo', env.request.boundary
|
58
58
|
|
59
59
|
oauth_expected = {:consumer_secret => 'xyz', :consumer_key => 'anonymous'}
|
60
|
-
assert_equal oauth_expected, env
|
60
|
+
assert_equal oauth_expected, env.request.oauth
|
61
61
|
end
|
62
62
|
|
63
63
|
def test_request_create_stores_ssl_options
|
64
64
|
env = make_env
|
65
|
-
assert_equal false, env
|
65
|
+
assert_equal false, env.ssl.verify
|
66
66
|
end
|
67
67
|
|
68
68
|
def test_request_create_stores_proxy_options
|
69
69
|
env = make_env
|
70
|
-
assert_equal 'proxy.com', env
|
70
|
+
assert_equal 'proxy.com', env.request.proxy.host
|
71
71
|
end
|
72
72
|
|
73
73
|
private
|
@@ -131,10 +131,9 @@ end
|
|
131
131
|
|
132
132
|
class ResponseTest < Faraday::TestCase
|
133
133
|
def setup
|
134
|
-
@env =
|
134
|
+
@env = Faraday::Env.from \
|
135
135
|
:status => 404, :body => 'yikes',
|
136
|
-
:response_headers =>
|
137
|
-
}
|
136
|
+
:response_headers => {'Content-Type' => 'text/plain'}
|
138
137
|
@response = Faraday::Response.new @env
|
139
138
|
end
|
140
139
|
|
@@ -174,10 +173,20 @@ class ResponseTest < Faraday::TestCase
|
|
174
173
|
def test_marshal
|
175
174
|
@response = Faraday::Response.new
|
176
175
|
@response.on_complete { }
|
177
|
-
@response.finish @env.merge(:
|
176
|
+
@response.finish @env.merge(:params => 'moo')
|
178
177
|
|
179
178
|
loaded = Marshal.load Marshal.dump(@response)
|
180
|
-
assert_nil loaded.env[:
|
179
|
+
assert_nil loaded.env[:params]
|
181
180
|
assert_equal %w[body response_headers status], loaded.env.keys.map { |k| k.to_s }.sort
|
182
181
|
end
|
182
|
+
|
183
|
+
def test_hash
|
184
|
+
hash = @response.to_hash
|
185
|
+
assert_kind_of Hash, hash
|
186
|
+
assert_equal @env.to_hash, hash
|
187
|
+
assert_equal hash[:status], @response.status
|
188
|
+
assert_equal hash[:response_headers], @response.headers
|
189
|
+
assert_equal hash[:body], @response.body
|
190
|
+
end
|
183
191
|
end
|
192
|
+
|
data/test/helper.rb
CHANGED
@@ -1,14 +1,17 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
require 'rubygems' # rubygems/version doesn't work by itself
|
2
|
+
require 'rubygems/version' # for simplecov-html
|
3
|
+
require 'simplecov'
|
4
|
+
require 'coveralls'
|
3
5
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
7
|
+
SimpleCov::Formatter::HTMLFormatter,
|
8
|
+
Coveralls::SimpleCov::Formatter
|
9
|
+
]
|
10
|
+
SimpleCov.start do
|
11
|
+
add_filter '/bundle/'
|
9
12
|
end
|
10
13
|
|
11
|
-
require '
|
14
|
+
require 'minitest/autorun'
|
12
15
|
|
13
16
|
if ENV['LEFTRIGHT']
|
14
17
|
begin
|
@@ -19,6 +22,9 @@ if ENV['LEFTRIGHT']
|
|
19
22
|
end
|
20
23
|
|
21
24
|
require File.expand_path('../../lib/faraday', __FILE__)
|
25
|
+
Dir[File.expand_path('../../lib/faraday/r*/*', __FILE__)].each do |file|
|
26
|
+
require file
|
27
|
+
end
|
22
28
|
|
23
29
|
require 'stringio'
|
24
30
|
require 'uri'
|
@@ -44,7 +50,7 @@ module Faraday
|
|
44
50
|
end
|
45
51
|
end
|
46
52
|
|
47
|
-
class TestCase <
|
53
|
+
class TestCase < MiniTest::Unit::TestCase
|
48
54
|
extend LiveServerConfig
|
49
55
|
self.live_server = ENV['LIVE']
|
50
56
|
|
@@ -70,10 +76,6 @@ module Faraday
|
|
70
76
|
defined? RUBY_ENGINE and 'rbx' == RUBY_ENGINE
|
71
77
|
end
|
72
78
|
|
73
|
-
def self.ruby_22_plus?
|
74
|
-
RUBY_VERSION > '2.2'
|
75
|
-
end
|
76
|
-
|
77
79
|
def self.ssl_mode?
|
78
80
|
ENV['SSL'] == 'yes'
|
79
81
|
end
|
data/test/live_server.rb
CHANGED
@@ -25,11 +25,9 @@ class LiveServer < Sinatra::Base
|
|
25
25
|
|
26
26
|
post '/file' do
|
27
27
|
if params[:uploaded_file].respond_to? :each_key
|
28
|
-
"file %s %s
|
28
|
+
"file %s %s" % [
|
29
29
|
params[:uploaded_file][:filename],
|
30
|
-
params[:uploaded_file][:type]
|
31
|
-
params[:uploaded_file][:tempfile].size
|
32
|
-
]
|
30
|
+
params[:uploaded_file][:type]]
|
33
31
|
else
|
34
32
|
status 400
|
35
33
|
end
|
@@ -39,11 +37,19 @@ class LiveServer < Sinatra::Base
|
|
39
37
|
[200, { 'Set-Cookie' => 'one, two' }, '']
|
40
38
|
end
|
41
39
|
|
40
|
+
get '/who-am-i' do
|
41
|
+
request.env['REMOTE_ADDR']
|
42
|
+
end
|
43
|
+
|
42
44
|
get '/slow' do
|
43
45
|
sleep 10
|
44
46
|
[200, {}, 'ok']
|
45
47
|
end
|
46
48
|
|
49
|
+
get '/204' do
|
50
|
+
status 204 # no content
|
51
|
+
end
|
52
|
+
|
47
53
|
get '/ssl' do
|
48
54
|
request.secure?.to_s
|
49
55
|
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require File.expand_path("../../helper", __FILE__)
|
2
|
+
|
3
|
+
module Middleware
|
4
|
+
class InstrumentationTest < Faraday::TestCase
|
5
|
+
def setup
|
6
|
+
@instrumenter = FakeInstrumenter.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_default_name
|
10
|
+
assert_equal 'request.faraday', options.name
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_default_instrumenter
|
14
|
+
begin
|
15
|
+
instrumenter = options.instrumenter
|
16
|
+
rescue NameError => err
|
17
|
+
assert_match 'ActiveSupport', err.to_s
|
18
|
+
else
|
19
|
+
assert_equal ActiveSupport::Notifications, instrumenter
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_name
|
24
|
+
assert_equal 'booya', options(:name => 'booya').name
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_instrumenter
|
28
|
+
assert_equal :boom, options(:instrumenter => :boom).instrumenter
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_instrumentation
|
32
|
+
assert_equal 0, @instrumenter.instrumentations.size
|
33
|
+
|
34
|
+
faraday = conn :name => 'booya'
|
35
|
+
res = faraday.get '/'
|
36
|
+
assert_equal 'ok', res.body
|
37
|
+
|
38
|
+
assert_equal 1, @instrumenter.instrumentations.size
|
39
|
+
name, env = @instrumenter.instrumentations.first
|
40
|
+
assert_equal 'booya', name
|
41
|
+
assert_equal '/', env[:url].path
|
42
|
+
end
|
43
|
+
|
44
|
+
class FakeInstrumenter
|
45
|
+
attr_reader :instrumentations
|
46
|
+
|
47
|
+
def initialize
|
48
|
+
@instrumentations = []
|
49
|
+
end
|
50
|
+
|
51
|
+
def instrument(name, env)
|
52
|
+
@instrumentations << [name, env]
|
53
|
+
yield
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def options(hash = nil)
|
58
|
+
Faraday::Request::Instrumentation::Options.from hash
|
59
|
+
end
|
60
|
+
|
61
|
+
def conn(hash = nil)
|
62
|
+
hash ||= {}
|
63
|
+
hash[:instrumenter] = @instrumenter
|
64
|
+
|
65
|
+
Faraday.new do |f|
|
66
|
+
f.request :instrumentation, hash
|
67
|
+
f.adapter :test do |stub|
|
68
|
+
stub.get '/' do
|
69
|
+
[200, {}, 'ok']
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -1,56 +1,62 @@
|
|
1
|
-
require File.expand_path(
|
1
|
+
require File.expand_path("../../helper", __FILE__)
|
2
2
|
|
3
3
|
module Middleware
|
4
4
|
class RetryTest < Faraday::TestCase
|
5
5
|
def setup
|
6
|
-
@
|
7
|
-
@conn = Faraday.new do |b|
|
8
|
-
b.request :retry, 2
|
9
|
-
b.use ContentValidator
|
10
|
-
b.adapter :test, @stubs
|
11
|
-
end
|
6
|
+
@times_called = 0
|
12
7
|
end
|
13
8
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
9
|
+
def conn(*retry_args)
|
10
|
+
Faraday.new do |b|
|
11
|
+
b.request :retry, *retry_args
|
12
|
+
b.adapter :test do |stub|
|
13
|
+
stub.post('/unstable') {
|
14
|
+
@times_called += 1
|
15
|
+
@explode.call @times_called
|
16
|
+
}
|
17
|
+
end
|
19
18
|
end
|
20
19
|
end
|
21
20
|
|
22
|
-
def
|
23
|
-
|
24
|
-
|
25
|
-
@
|
26
|
-
|
27
|
-
[200, {}, "hello"]
|
28
|
-
end
|
21
|
+
def test_unhandled_error
|
22
|
+
@explode = lambda {|n| raise "boom!" }
|
23
|
+
assert_raises(RuntimeError) { conn.post("/unstable") }
|
24
|
+
assert_equal 1, @times_called
|
25
|
+
end
|
29
26
|
|
30
|
-
|
31
|
-
|
27
|
+
def test_handled_error
|
28
|
+
@explode = lambda {|n| raise Errno::ETIMEDOUT }
|
29
|
+
assert_raises(Errno::ETIMEDOUT) { conn.post("/unstable") }
|
30
|
+
assert_equal 3, @times_called
|
32
31
|
end
|
33
32
|
|
34
|
-
def
|
35
|
-
|
36
|
-
|
33
|
+
def test_legacy_max_retries
|
34
|
+
@explode = lambda {|n| raise Errno::ETIMEDOUT }
|
35
|
+
assert_raises(Errno::ETIMEDOUT) { conn(1).post("/unstable") }
|
36
|
+
assert_equal 2, @times_called
|
37
|
+
end
|
37
38
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
else
|
44
|
-
[200, {"Content-type" => "application/json"}, '{"message": "hello"}']
|
45
|
-
end
|
46
|
-
end
|
39
|
+
def test_new_max_retries
|
40
|
+
@explode = lambda {|n| raise Errno::ETIMEDOUT }
|
41
|
+
assert_raises(Errno::ETIMEDOUT) { conn(:max => 3).post("/unstable") }
|
42
|
+
assert_equal 4, @times_called
|
43
|
+
end
|
47
44
|
|
48
|
-
|
49
|
-
@
|
45
|
+
def test_interval
|
46
|
+
@explode = lambda {|n| raise Errno::ETIMEDOUT }
|
47
|
+
started = Time.now
|
48
|
+
assert_raises(Errno::ETIMEDOUT) {
|
49
|
+
conn(:max => 2, :interval => 0.1).post("/unstable")
|
50
|
+
}
|
51
|
+
assert_in_delta 0.2, Time.now - started, 0.03
|
52
|
+
end
|
50
53
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
+
def test_custom_exceptions
|
55
|
+
@explode = lambda {|n| raise "boom!" }
|
56
|
+
assert_raises(RuntimeError) {
|
57
|
+
conn(:exceptions => StandardError).post("/unstable")
|
58
|
+
}
|
59
|
+
assert_equal 3, @times_called
|
54
60
|
end
|
55
61
|
end
|
56
62
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.expand_path(
|
1
|
+
require File.expand_path('../helper', __FILE__)
|
2
2
|
|
3
3
|
class MiddlewareStackTest < Faraday::TestCase
|
4
4
|
# mock handler classes
|
@@ -75,7 +75,7 @@ class MiddlewareStackTest < Faraday::TestCase
|
|
75
75
|
@conn.get('/')
|
76
76
|
assert @builder.locked?
|
77
77
|
|
78
|
-
assert_raises Faraday::
|
78
|
+
assert_raises Faraday::RackBuilder::StackLocked do
|
79
79
|
@conn.use Orange
|
80
80
|
end
|
81
81
|
end
|
@@ -95,16 +95,16 @@ class MiddlewareStackTest < Faraday::TestCase
|
|
95
95
|
build_stack Apple
|
96
96
|
assert_equal @builder.handlers.first, Apple
|
97
97
|
assert_equal @builder.handlers[0,1], [Apple]
|
98
|
-
assert_equal @builder.handlers.first, Faraday::
|
98
|
+
assert_equal @builder.handlers.first, Faraday::RackBuilder::Handler.new(Apple)
|
99
99
|
end
|
100
100
|
|
101
101
|
def test_unregistered_symbol
|
102
|
-
err =
|
102
|
+
err = assert_raises(Faraday::Error){ build_stack :apple }
|
103
103
|
assert_equal ":apple is not registered on Faraday::Middleware", err.message
|
104
104
|
end
|
105
105
|
|
106
106
|
def test_registered_symbol
|
107
|
-
Faraday.register_middleware :apple => Apple
|
107
|
+
Faraday::Middleware.register_middleware :apple => Apple
|
108
108
|
begin
|
109
109
|
build_stack :apple
|
110
110
|
assert_handlers %w[Apple]
|
@@ -114,7 +114,7 @@ class MiddlewareStackTest < Faraday::TestCase
|
|
114
114
|
end
|
115
115
|
|
116
116
|
def test_registered_symbol_with_proc
|
117
|
-
Faraday.register_middleware :apple => lambda { Apple }
|
117
|
+
Faraday::Middleware.register_middleware :apple => lambda { Apple }
|
118
118
|
begin
|
119
119
|
build_stack :apple
|
120
120
|
assert_handlers %w[Apple]
|
@@ -123,13 +123,14 @@ class MiddlewareStackTest < Faraday::TestCase
|
|
123
123
|
end
|
124
124
|
end
|
125
125
|
|
126
|
-
def
|
127
|
-
Faraday.register_middleware
|
126
|
+
def test_registered_symbol_with_array
|
127
|
+
Faraday::Middleware.register_middleware File.expand_path("..", __FILE__),
|
128
|
+
:strawberry => [lambda { Strawberry }, 'strawberry']
|
128
129
|
begin
|
129
|
-
build_stack
|
130
|
-
assert_handlers %w[
|
130
|
+
build_stack :strawberry
|
131
|
+
assert_handlers %w[Strawberry]
|
131
132
|
ensure
|
132
|
-
unregister_middleware Faraday::
|
133
|
+
unregister_middleware Faraday::Middleware, :strawberry
|
133
134
|
end
|
134
135
|
end
|
135
136
|
|