faraday 1.10.4 → 2.0.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +117 -1
- data/README.md +16 -9
- data/examples/client_spec.rb +1 -1
- data/examples/client_test.rb +2 -2
- data/lib/faraday/adapter/test.rb +2 -0
- data/lib/faraday/adapter.rb +2 -5
- data/lib/faraday/connection.rb +5 -86
- data/lib/faraday/encoders/nested_params_encoder.rb +2 -2
- data/lib/faraday/error.rb +3 -2
- data/lib/faraday/logging/formatter.rb +1 -0
- data/lib/faraday/middleware.rb +0 -1
- data/lib/faraday/middleware_registry.rb +15 -79
- data/lib/faraday/options.rb +3 -3
- data/lib/faraday/rack_builder.rb +21 -18
- data/lib/faraday/request/authorization.rb +28 -41
- data/lib/faraday/request/instrumentation.rb +2 -0
- data/lib/faraday/request/url_encoded.rb +2 -0
- data/lib/faraday/request.rb +6 -24
- data/lib/faraday/response/json.rb +4 -4
- data/lib/faraday/response/logger.rb +2 -0
- data/lib/faraday/response/raise_error.rb +9 -1
- data/lib/faraday/response.rb +7 -20
- data/lib/faraday/utils/headers.rb +1 -1
- data/lib/faraday/utils.rb +10 -5
- data/lib/faraday/version.rb +1 -1
- data/lib/faraday.rb +4 -46
- data/spec/faraday/connection_spec.rb +102 -51
- data/spec/faraday/options/env_spec.rb +2 -2
- data/spec/faraday/rack_builder_spec.rb +7 -50
- data/spec/faraday/request/authorization_spec.rb +19 -32
- data/spec/faraday/request/instrumentation_spec.rb +5 -7
- data/spec/faraday/request/url_encoded_spec.rb +0 -1
- data/spec/faraday/request_spec.rb +0 -11
- data/spec/faraday/response/json_spec.rb +4 -6
- data/spec/faraday/response/raise_error_spec.rb +7 -4
- data/spec/faraday/utils_spec.rb +62 -1
- data/spec/spec_helper.rb +0 -2
- data/spec/support/fake_safe_buffer.rb +1 -1
- data/spec/support/helper_methods.rb +0 -37
- data/spec/support/shared_examples/adapter.rb +0 -1
- data/spec/support/shared_examples/request_method.rb +5 -18
- metadata +4 -162
- data/lib/faraday/adapter/typhoeus.rb +0 -15
- data/lib/faraday/autoload.rb +0 -89
- data/lib/faraday/dependency_loader.rb +0 -39
- data/lib/faraday/deprecate.rb +0 -110
- data/lib/faraday/request/basic_authentication.rb +0 -20
- data/lib/faraday/request/token_authentication.rb +0 -20
- data/spec/faraday/adapter/em_http_spec.rb +0 -49
- data/spec/faraday/adapter/em_synchrony_spec.rb +0 -18
- data/spec/faraday/adapter/excon_spec.rb +0 -49
- data/spec/faraday/adapter/httpclient_spec.rb +0 -73
- data/spec/faraday/adapter/net_http_spec.rb +0 -64
- data/spec/faraday/adapter/patron_spec.rb +0 -18
- data/spec/faraday/adapter/rack_spec.rb +0 -8
- data/spec/faraday/adapter/typhoeus_spec.rb +0 -7
- data/spec/faraday/composite_read_io_spec.rb +0 -80
- data/spec/faraday/deprecate_spec.rb +0 -147
- data/spec/faraday/response/middleware_spec.rb +0 -68
- data/spec/support/webmock_rack_app.rb +0 -68
@@ -1,49 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
unless defined?(JRUBY_VERSION)
|
4
|
-
RSpec.describe Faraday::Adapter::EMHttp do
|
5
|
-
features :request_body_on_query_methods, :reason_phrase_parse, :trace_method,
|
6
|
-
:skip_response_body_on_head, :parallel, :local_socket_binding
|
7
|
-
|
8
|
-
it_behaves_like 'an adapter'
|
9
|
-
|
10
|
-
it 'allows to provide adapter specific configs' do
|
11
|
-
url = URI('https://example.com:1234')
|
12
|
-
adapter = described_class.new nil, inactivity_timeout: 20
|
13
|
-
req = adapter.create_request(url: url, request: {})
|
14
|
-
|
15
|
-
expect(req.connopts.inactivity_timeout).to eq(20)
|
16
|
-
end
|
17
|
-
|
18
|
-
context 'Options' do
|
19
|
-
let(:request) { Faraday::RequestOptions.new }
|
20
|
-
let(:env) { { request: request } }
|
21
|
-
let(:options) { {} }
|
22
|
-
let(:adapter) { Faraday::Adapter::EMHttp.new }
|
23
|
-
|
24
|
-
it 'configures timeout' do
|
25
|
-
request.timeout = 5
|
26
|
-
adapter.configure_timeout(options, env)
|
27
|
-
expect(options[:inactivity_timeout]).to eq(5)
|
28
|
-
expect(options[:connect_timeout]).to eq(5)
|
29
|
-
end
|
30
|
-
|
31
|
-
it 'configures timeout and open_timeout' do
|
32
|
-
request.timeout = 5
|
33
|
-
request.open_timeout = 1
|
34
|
-
adapter.configure_timeout(options, env)
|
35
|
-
expect(options[:inactivity_timeout]).to eq(5)
|
36
|
-
expect(options[:connect_timeout]).to eq(1)
|
37
|
-
end
|
38
|
-
|
39
|
-
it 'configures all timeout settings' do
|
40
|
-
request.timeout = 5
|
41
|
-
request.read_timeout = 3
|
42
|
-
request.open_timeout = 1
|
43
|
-
adapter.configure_timeout(options, env)
|
44
|
-
expect(options[:inactivity_timeout]).to eq(3)
|
45
|
-
expect(options[:connect_timeout]).to eq(1)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
unless defined?(JRUBY_VERSION)
|
4
|
-
RSpec.describe Faraday::Adapter::EMSynchrony do
|
5
|
-
features :request_body_on_query_methods, :reason_phrase_parse,
|
6
|
-
:skip_response_body_on_head, :parallel, :local_socket_binding
|
7
|
-
|
8
|
-
it_behaves_like 'an adapter'
|
9
|
-
|
10
|
-
it 'allows to provide adapter specific configs' do
|
11
|
-
url = URI('https://example.com:1234')
|
12
|
-
adapter = described_class.new nil, inactivity_timeout: 20
|
13
|
-
req = adapter.create_request(url: url, request: {})
|
14
|
-
|
15
|
-
expect(req.connopts.inactivity_timeout).to eq(20)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RSpec.describe Faraday::Adapter::Excon do
|
4
|
-
features :request_body_on_query_methods, :reason_phrase_parse, :trace_method
|
5
|
-
|
6
|
-
it_behaves_like 'an adapter'
|
7
|
-
|
8
|
-
it 'allows to provide adapter specific configs' do
|
9
|
-
url = URI('https://example.com:1234')
|
10
|
-
|
11
|
-
adapter = described_class.new(nil, debug_request: true)
|
12
|
-
|
13
|
-
conn = adapter.build_connection(url: url)
|
14
|
-
|
15
|
-
expect(conn.data[:debug_request]).to be_truthy
|
16
|
-
end
|
17
|
-
|
18
|
-
context 'config' do
|
19
|
-
let(:adapter) { Faraday::Adapter::Excon.new }
|
20
|
-
let(:request) { Faraday::RequestOptions.new }
|
21
|
-
let(:uri) { URI.parse('https://example.com') }
|
22
|
-
let(:env) { { request: request, url: uri } }
|
23
|
-
|
24
|
-
it 'sets timeout' do
|
25
|
-
request.timeout = 5
|
26
|
-
options = adapter.send(:opts_from_env, env)
|
27
|
-
expect(options[:read_timeout]).to eq(5)
|
28
|
-
expect(options[:write_timeout]).to eq(5)
|
29
|
-
expect(options[:connect_timeout]).to eq(5)
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'sets timeout and open_timeout' do
|
33
|
-
request.timeout = 5
|
34
|
-
request.open_timeout = 3
|
35
|
-
options = adapter.send(:opts_from_env, env)
|
36
|
-
expect(options[:read_timeout]).to eq(5)
|
37
|
-
expect(options[:write_timeout]).to eq(5)
|
38
|
-
expect(options[:connect_timeout]).to eq(3)
|
39
|
-
end
|
40
|
-
|
41
|
-
it 'sets open_timeout' do
|
42
|
-
request.open_timeout = 3
|
43
|
-
options = adapter.send(:opts_from_env, env)
|
44
|
-
expect(options[:read_timeout]).to eq(nil)
|
45
|
-
expect(options[:write_timeout]).to eq(nil)
|
46
|
-
expect(options[:connect_timeout]).to eq(3)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
@@ -1,73 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RSpec.describe Faraday::Adapter::HTTPClient do
|
4
|
-
# ruby gem defaults for testing purposes
|
5
|
-
HTTPCLIENT_OPEN = 60
|
6
|
-
HTTPCLIENT_READ = 60
|
7
|
-
HTTPCLIENT_WRITE = 120
|
8
|
-
|
9
|
-
features :request_body_on_query_methods, :reason_phrase_parse, :compression,
|
10
|
-
:trace_method, :local_socket_binding
|
11
|
-
|
12
|
-
it_behaves_like 'an adapter'
|
13
|
-
|
14
|
-
it 'allows to provide adapter specific configs' do
|
15
|
-
adapter = described_class.new do |client|
|
16
|
-
client.keep_alive_timeout = 20
|
17
|
-
client.ssl_config.timeout = 25
|
18
|
-
end
|
19
|
-
|
20
|
-
client = adapter.build_connection(url: URI.parse('https://example.com'))
|
21
|
-
expect(client.keep_alive_timeout).to eq(20)
|
22
|
-
expect(client.ssl_config.timeout).to eq(25)
|
23
|
-
end
|
24
|
-
|
25
|
-
context 'Options' do
|
26
|
-
let(:request) { Faraday::RequestOptions.new }
|
27
|
-
let(:env) { { request: request } }
|
28
|
-
let(:options) { {} }
|
29
|
-
let(:adapter) { Faraday::Adapter::HTTPClient.new }
|
30
|
-
let(:client) { adapter.connection(url: URI.parse('https://example.com')) }
|
31
|
-
|
32
|
-
it 'configures timeout' do
|
33
|
-
assert_default_timeouts!
|
34
|
-
|
35
|
-
request.timeout = 5
|
36
|
-
adapter.configure_timeouts(client, request)
|
37
|
-
|
38
|
-
expect(client.connect_timeout).to eq(5)
|
39
|
-
expect(client.send_timeout).to eq(5)
|
40
|
-
expect(client.receive_timeout).to eq(5)
|
41
|
-
end
|
42
|
-
|
43
|
-
it 'configures open timeout' do
|
44
|
-
assert_default_timeouts!
|
45
|
-
|
46
|
-
request.open_timeout = 1
|
47
|
-
adapter.configure_timeouts(client, request)
|
48
|
-
|
49
|
-
expect(client.connect_timeout).to eq(1)
|
50
|
-
expect(client.send_timeout).to eq(HTTPCLIENT_WRITE)
|
51
|
-
expect(client.receive_timeout).to eq(HTTPCLIENT_READ)
|
52
|
-
end
|
53
|
-
|
54
|
-
it 'configures multiple timeouts' do
|
55
|
-
assert_default_timeouts!
|
56
|
-
|
57
|
-
request.open_timeout = 1
|
58
|
-
request.write_timeout = 10
|
59
|
-
request.read_timeout = 5
|
60
|
-
adapter.configure_timeouts(client, request)
|
61
|
-
|
62
|
-
expect(client.connect_timeout).to eq(1)
|
63
|
-
expect(client.send_timeout).to eq(10)
|
64
|
-
expect(client.receive_timeout).to eq(5)
|
65
|
-
end
|
66
|
-
|
67
|
-
def assert_default_timeouts!
|
68
|
-
expect(client.connect_timeout).to eq(HTTPCLIENT_OPEN)
|
69
|
-
expect(client.send_timeout).to eq(HTTPCLIENT_WRITE)
|
70
|
-
expect(client.receive_timeout).to eq(HTTPCLIENT_READ)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
@@ -1,64 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RSpec.describe Faraday::Adapter::NetHttp do
|
4
|
-
features :request_body_on_query_methods, :reason_phrase_parse, :compression, :streaming, :trace_method
|
5
|
-
|
6
|
-
it_behaves_like 'an adapter'
|
7
|
-
|
8
|
-
context 'checking http' do
|
9
|
-
let(:url) { URI('http://example.com') }
|
10
|
-
let(:adapter) { described_class.new }
|
11
|
-
let(:http) { adapter.send(:connection, url: url, request: {}) }
|
12
|
-
|
13
|
-
it { expect(http.port).to eq(80) }
|
14
|
-
|
15
|
-
it 'sets max_retries to 0' do
|
16
|
-
adapter.send(:configure_request, http, {})
|
17
|
-
|
18
|
-
expect(http.max_retries).to eq(0) if http.respond_to?(:max_retries=)
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'supports write_timeout' do
|
22
|
-
adapter.send(:configure_request, http, write_timeout: 10)
|
23
|
-
|
24
|
-
expect(http.write_timeout).to eq(10) if http.respond_to?(:write_timeout=)
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'supports open_timeout' do
|
28
|
-
adapter.send(:configure_request, http, open_timeout: 10)
|
29
|
-
|
30
|
-
expect(http.open_timeout).to eq(10)
|
31
|
-
end
|
32
|
-
|
33
|
-
it 'supports read_timeout' do
|
34
|
-
adapter.send(:configure_request, http, read_timeout: 10)
|
35
|
-
|
36
|
-
expect(http.read_timeout).to eq(10)
|
37
|
-
end
|
38
|
-
|
39
|
-
context 'with https url' do
|
40
|
-
let(:url) { URI('https://example.com') }
|
41
|
-
|
42
|
-
it { expect(http.port).to eq(443) }
|
43
|
-
end
|
44
|
-
|
45
|
-
context 'with http url including port' do
|
46
|
-
let(:url) { URI('https://example.com:1234') }
|
47
|
-
|
48
|
-
it { expect(http.port).to eq(1234) }
|
49
|
-
end
|
50
|
-
|
51
|
-
context 'with custom adapter config' do
|
52
|
-
let(:adapter) do
|
53
|
-
described_class.new do |http|
|
54
|
-
http.continue_timeout = 123
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
it do
|
59
|
-
adapter.send(:configure_request, http, {})
|
60
|
-
expect(http.continue_timeout).to eq(123)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RSpec.describe Faraday::Adapter::Patron, unless: defined?(JRUBY_VERSION) do
|
4
|
-
features :reason_phrase_parse
|
5
|
-
|
6
|
-
it_behaves_like 'an adapter'
|
7
|
-
|
8
|
-
it 'allows to provide adapter specific configs' do
|
9
|
-
conn = Faraday.new do |f|
|
10
|
-
f.adapter :patron do |session|
|
11
|
-
session.max_redirects = 10
|
12
|
-
raise 'Configuration block called'
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
expect { conn.get('/') }.to raise_error(RuntimeError, 'Configuration block called')
|
17
|
-
end
|
18
|
-
end
|
@@ -1,80 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'stringio'
|
4
|
-
|
5
|
-
RSpec.describe Faraday::CompositeReadIO do
|
6
|
-
Part = Struct.new(:to_io) do
|
7
|
-
def length
|
8
|
-
to_io.string.length
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
def part(str)
|
13
|
-
Part.new StringIO.new(str)
|
14
|
-
end
|
15
|
-
|
16
|
-
def composite_io(*parts)
|
17
|
-
Faraday::CompositeReadIO.new(*parts)
|
18
|
-
end
|
19
|
-
|
20
|
-
context 'with empty composite_io' do
|
21
|
-
subject { composite_io }
|
22
|
-
|
23
|
-
it { expect(subject.length).to eq(0) }
|
24
|
-
it { expect(subject.read).to eq('') }
|
25
|
-
it { expect(subject.read(1)).to be_nil }
|
26
|
-
end
|
27
|
-
|
28
|
-
context 'with empty parts' do
|
29
|
-
subject { composite_io(part(''), part('')) }
|
30
|
-
|
31
|
-
it { expect(subject.length).to eq(0) }
|
32
|
-
it { expect(subject.read).to eq('') }
|
33
|
-
it { expect(subject.read(1)).to be_nil }
|
34
|
-
end
|
35
|
-
|
36
|
-
context 'with 2 parts' do
|
37
|
-
subject { composite_io(part('abcd'), part('1234')) }
|
38
|
-
|
39
|
-
it { expect(subject.length).to eq(8) }
|
40
|
-
it { expect(subject.read).to eq('abcd1234') }
|
41
|
-
it 'allows to read in chunks' do
|
42
|
-
expect(subject.read(3)).to eq('abc')
|
43
|
-
expect(subject.read(3)).to eq('d12')
|
44
|
-
expect(subject.read(3)).to eq('34')
|
45
|
-
expect(subject.read(3)).to be_nil
|
46
|
-
end
|
47
|
-
it 'allows to rewind while reading in chunks' do
|
48
|
-
expect(subject.read(3)).to eq('abc')
|
49
|
-
expect(subject.read(3)).to eq('d12')
|
50
|
-
subject.rewind
|
51
|
-
expect(subject.read(3)).to eq('abc')
|
52
|
-
expect(subject.read(5)).to eq('d1234')
|
53
|
-
expect(subject.read(3)).to be_nil
|
54
|
-
subject.rewind
|
55
|
-
expect(subject.read(2)).to eq('ab')
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
context 'with mix of empty and non-empty parts' do
|
60
|
-
subject { composite_io(part(''), part('abcd'), part(''), part('1234'), part('')) }
|
61
|
-
|
62
|
-
it 'allows to read in chunks' do
|
63
|
-
expect(subject.read(6)).to eq('abcd12')
|
64
|
-
expect(subject.read(6)).to eq('34')
|
65
|
-
expect(subject.read(6)).to be_nil
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
context 'with utf8 multibyte part' do
|
70
|
-
subject { composite_io(part("\x86"), part('ファイル')) }
|
71
|
-
|
72
|
-
it { expect(subject.read).to eq(String.new("\x86\xE3\x83\x95\xE3\x82\xA1\xE3\x82\xA4\xE3\x83\xAB", encoding: 'BINARY')) }
|
73
|
-
it 'allows to read in chunks' do
|
74
|
-
expect(subject.read(3)).to eq(String.new("\x86\xE3\x83", encoding: 'BINARY'))
|
75
|
-
expect(subject.read(3)).to eq(String.new("\x95\xE3\x82", encoding: 'BINARY'))
|
76
|
-
expect(subject.read(8)).to eq(String.new("\xA1\xE3\x82\xA4\xE3\x83\xAB", encoding: 'BINARY'))
|
77
|
-
expect(subject.read(3)).to be_nil
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
@@ -1,147 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RSpec.describe Faraday::DeprecatedClass do
|
4
|
-
class SampleClass < StandardError
|
5
|
-
attr_accessor :foo
|
6
|
-
|
7
|
-
def initialize(foo = nil)
|
8
|
-
@foo = foo || :foo
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
SampleDeprecatedClass = Faraday::DeprecatedClass.proxy_class(SampleClass)
|
13
|
-
|
14
|
-
it 'does not raise error for deprecated classes but prints an error message' do
|
15
|
-
error_message, foobar = with_warn_squelching { SampleDeprecatedClass.new(:foo_bar) }
|
16
|
-
expect(foobar).to be_a(SampleClass)
|
17
|
-
expect(foobar.foo).to eq(:foo_bar)
|
18
|
-
expect(error_message).to match(
|
19
|
-
Regexp.new(
|
20
|
-
'NOTE: SampleDeprecatedClass.new is deprecated; '\
|
21
|
-
'use SampleClass.new instead. It will be removed in or after version 1.0'
|
22
|
-
)
|
23
|
-
)
|
24
|
-
end
|
25
|
-
|
26
|
-
it 'does not raise an error for inherited error-namespaced classes but prints an error message' do
|
27
|
-
error_message, = with_warn_squelching { Class.new(SampleDeprecatedClass) }
|
28
|
-
|
29
|
-
expect(error_message).to match(
|
30
|
-
Regexp.new(
|
31
|
-
'NOTE: Inheriting SampleDeprecatedClass is deprecated; '\
|
32
|
-
'use SampleClass instead. It will be removed in or after version 1.0'
|
33
|
-
)
|
34
|
-
)
|
35
|
-
end
|
36
|
-
|
37
|
-
it 'allows backward-compatible class to be subclassed' do
|
38
|
-
expect do
|
39
|
-
with_warn_squelching { Class.new(SampleDeprecatedClass) }
|
40
|
-
end.not_to raise_error
|
41
|
-
end
|
42
|
-
|
43
|
-
it 'allows rescuing of a current error with a deprecated error' do
|
44
|
-
expect { raise SampleClass, nil }.to raise_error(SampleDeprecatedClass)
|
45
|
-
end
|
46
|
-
|
47
|
-
it 'allows rescuing of a current error with a current error' do
|
48
|
-
expect { raise SampleClass, nil }.to raise_error(SampleClass)
|
49
|
-
end
|
50
|
-
|
51
|
-
it 'allows rescuing of a deprecated error with a deprecated error' do
|
52
|
-
expect { raise SampleDeprecatedClass, nil }.to raise_error(SampleDeprecatedClass)
|
53
|
-
end
|
54
|
-
|
55
|
-
it 'allows rescuing of a deprecated error with a current error' do
|
56
|
-
expect { raise SampleDeprecatedClass, nil }.to raise_error(SampleClass)
|
57
|
-
end
|
58
|
-
|
59
|
-
describe 'match behavior' do
|
60
|
-
class SampleDeprecatedClassA < SampleDeprecatedClass; end
|
61
|
-
class SampleDeprecatedClassB < SampleDeprecatedClass; end
|
62
|
-
|
63
|
-
class SampleDeprecatedClassAX < SampleDeprecatedClassA; end
|
64
|
-
|
65
|
-
class SampleClassA < SampleClass; end
|
66
|
-
|
67
|
-
describe 'undeprecated class' do
|
68
|
-
it 'is === to instance of deprecated class' do
|
69
|
-
expect(SampleDeprecatedClass.new.is_a?(SampleClass)).to be true
|
70
|
-
end
|
71
|
-
|
72
|
-
it 'is === to instance of subclass of deprecated class' do
|
73
|
-
expect(SampleDeprecatedClassA.new.is_a?(SampleClass)).to be true
|
74
|
-
end
|
75
|
-
|
76
|
-
it 'is === to instance of subclass of subclass of deprecated class' do
|
77
|
-
expect(SampleDeprecatedClassAX.new.is_a?(SampleClass)).to be true
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
describe 'subclass of undeprecated class' do
|
82
|
-
it 'is not === to instance of undeprecated class' do
|
83
|
-
expect(SampleClass.new.is_a?(SampleClassA)).to be false
|
84
|
-
end
|
85
|
-
|
86
|
-
it 'is not === to instance of deprecated class' do
|
87
|
-
expect(SampleDeprecatedClass.new.is_a?(SampleClassA)).to be false
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
describe 'deprecated class' do
|
92
|
-
it 'is === to instance of undeprecated class' do
|
93
|
-
expect(SampleDeprecatedClass.new.is_a?(SampleClass)).to be true
|
94
|
-
end
|
95
|
-
|
96
|
-
it 'is === to instance of subclass of undeprecated class' do
|
97
|
-
expect(SampleClassA.superclass == SampleDeprecatedClass.superclass).to be true
|
98
|
-
end
|
99
|
-
|
100
|
-
it 'is === to instance of subclass of deprecated class' do
|
101
|
-
expect(SampleDeprecatedClassA.new.is_a?(SampleDeprecatedClass)).to be true
|
102
|
-
end
|
103
|
-
|
104
|
-
it 'is === to instance of subclass of subclass of deprecated class' do
|
105
|
-
expect(SampleDeprecatedClassAX.new.is_a?(SampleDeprecatedClass)).to be true
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
describe 'subclass of deprecated class' do
|
110
|
-
it 'is not === to instance of subclass of undeprecated class' do
|
111
|
-
expect(SampleClass.new.is_a?(SampleDeprecatedClassA)).to be false
|
112
|
-
end
|
113
|
-
|
114
|
-
it 'is not === to instance of another subclass of deprecated class' do
|
115
|
-
expect(SampleDeprecatedClassB.new.is_a?(SampleDeprecatedClassA)).to be false
|
116
|
-
end
|
117
|
-
|
118
|
-
it 'is === to instance of its subclass' do
|
119
|
-
expect(SampleDeprecatedClassAX.new.is_a?(SampleDeprecatedClassA)).to be true
|
120
|
-
end
|
121
|
-
|
122
|
-
it 'is === to instance of deprecated class' do
|
123
|
-
expect(SampleDeprecatedClassB.new.is_a?(SampleDeprecatedClass)).to be true
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
describe 'subclass of subclass of deprecated class' do
|
128
|
-
it 'is not === to instance of subclass of another subclass of deprecated class' do
|
129
|
-
expect(SampleDeprecatedClassB.new.is_a?(SampleDeprecatedClassAX)).to be false
|
130
|
-
end
|
131
|
-
|
132
|
-
it 'is not === to instance of its superclass' do
|
133
|
-
expect(SampleDeprecatedClass.new.is_a?(SampleDeprecatedClassA)).to be false
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
def with_warn_squelching
|
139
|
-
stderr_catcher = StringIO.new
|
140
|
-
original_stderr = $stderr
|
141
|
-
$stderr = stderr_catcher
|
142
|
-
result = yield if block_given?
|
143
|
-
[stderr_catcher.tap(&:rewind).string, result]
|
144
|
-
ensure
|
145
|
-
$stderr = original_stderr
|
146
|
-
end
|
147
|
-
end
|
@@ -1,68 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RSpec.describe Faraday::Response::Middleware do
|
4
|
-
let(:conn) do
|
5
|
-
Faraday.new do |b|
|
6
|
-
b.use custom_middleware
|
7
|
-
b.adapter :test do |stub|
|
8
|
-
stub.get('ok') { [200, { 'Content-Type' => 'text/html' }, '<body></body>'] }
|
9
|
-
stub.get('not_modified') { [304, nil, nil] }
|
10
|
-
stub.get('no_content') { [204, nil, nil] }
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
context 'with a custom ResponseMiddleware' do
|
16
|
-
let(:custom_middleware) do
|
17
|
-
Class.new(Faraday::Response::Middleware) do
|
18
|
-
def parse(body)
|
19
|
-
body.upcase
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'parses the response' do
|
25
|
-
expect(conn.get('ok').body).to eq('<BODY></BODY>')
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
context 'with a custom ResponseMiddleware and private parse' do
|
30
|
-
let(:custom_middleware) do
|
31
|
-
Class.new(Faraday::Response::Middleware) do
|
32
|
-
private
|
33
|
-
|
34
|
-
def parse(body)
|
35
|
-
body.upcase
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
it 'parses the response' do
|
41
|
-
expect(conn.get('ok').body).to eq('<BODY></BODY>')
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
context 'with a custom ResponseMiddleware but empty response' do
|
46
|
-
let(:custom_middleware) do
|
47
|
-
Class.new(Faraday::Response::Middleware) do
|
48
|
-
def parse(_body)
|
49
|
-
raise 'this should not be called'
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
it 'raises exception for 200 responses' do
|
55
|
-
expect { conn.get('ok') }.to raise_error(StandardError)
|
56
|
-
end
|
57
|
-
|
58
|
-
it 'doesn\'t call the middleware for 204 responses' do
|
59
|
-
expect_any_instance_of(custom_middleware).not_to receive(:parse)
|
60
|
-
expect(conn.get('no_content').body).to be_nil
|
61
|
-
end
|
62
|
-
|
63
|
-
it 'doesn\'t call the middleware for 304 responses' do
|
64
|
-
expect_any_instance_of(custom_middleware).not_to receive(:parse)
|
65
|
-
expect(conn.get('not_modified').body).to be_nil
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
@@ -1,68 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Rack app used to test the Rack adapter.
|
4
|
-
# Uses Webmock to check if requests are registered, in which case it returns
|
5
|
-
# the registered response.
|
6
|
-
class WebmockRackApp
|
7
|
-
def call(env)
|
8
|
-
req_signature = WebMock::RequestSignature.new(
|
9
|
-
req_method(env),
|
10
|
-
req_uri(env),
|
11
|
-
body: req_body(env),
|
12
|
-
headers: req_headers(env)
|
13
|
-
)
|
14
|
-
|
15
|
-
WebMock::RequestRegistry
|
16
|
-
.instance
|
17
|
-
.requested_signatures
|
18
|
-
.put(req_signature)
|
19
|
-
|
20
|
-
process_response(req_signature)
|
21
|
-
end
|
22
|
-
|
23
|
-
def req_method(env)
|
24
|
-
env['REQUEST_METHOD'].downcase.to_sym
|
25
|
-
end
|
26
|
-
|
27
|
-
def req_uri(env)
|
28
|
-
scheme = env['rack.url_scheme']
|
29
|
-
host = env['SERVER_NAME']
|
30
|
-
port = env['SERVER_PORT']
|
31
|
-
path = env['PATH_INFO']
|
32
|
-
query = env['QUERY_STRING']
|
33
|
-
|
34
|
-
url = +"#{scheme}://#{host}:#{port}#{path}"
|
35
|
-
url += "?#{query}" if query
|
36
|
-
|
37
|
-
uri = WebMock::Util::URI.heuristic_parse(url)
|
38
|
-
uri.path = uri.normalized_path.gsub('[^:]//', '/')
|
39
|
-
uri
|
40
|
-
end
|
41
|
-
|
42
|
-
def req_headers(env)
|
43
|
-
http_headers = env.select { |k, _| k.start_with?('HTTP_') }
|
44
|
-
.map { |k, v| [k[5..-1], v] }
|
45
|
-
.to_h
|
46
|
-
|
47
|
-
special_headers = Faraday::Adapter::Rack::SPECIAL_HEADERS
|
48
|
-
http_headers.merge(env.select { |k, _| special_headers.include?(k) })
|
49
|
-
end
|
50
|
-
|
51
|
-
def req_body(env)
|
52
|
-
env['rack.input'].read
|
53
|
-
end
|
54
|
-
|
55
|
-
def process_response(req_signature)
|
56
|
-
res = WebMock::StubRegistry.instance.response_for_request(req_signature)
|
57
|
-
|
58
|
-
if res.nil? && req_signature.uri.host == 'localhost'
|
59
|
-
raise Faraday::ConnectionFailed, 'Trying to connect to localhost'
|
60
|
-
end
|
61
|
-
|
62
|
-
raise WebMock::NetConnectNotAllowedError, req_signature unless res
|
63
|
-
|
64
|
-
raise Faraday::TimeoutError if res.should_timeout
|
65
|
-
|
66
|
-
[res.status[0], res.headers || {}, [res.body || '']]
|
67
|
-
end
|
68
|
-
end
|