faraday 2.7.11 → 2.8.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/faraday/adapter/test.rb +1 -1
- data/lib/faraday/error.rb +4 -0
- data/lib/faraday/logging/formatter.rb +1 -1
- data/lib/faraday/options.rb +3 -3
- data/lib/faraday/request/json.rb +7 -1
- data/lib/faraday/response/json.rb +20 -1
- data/lib/faraday/response/raise_error.rb +2 -0
- data/lib/faraday/version.rb +1 -1
- data/spec/faraday/request/json_spec.rb +64 -0
- data/spec/faraday/response/json_spec.rb +72 -0
- data/spec/faraday/response/raise_error_spec.rb +12 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 14056963c7f6d474cd9c3a407ea2bfbe9e9fd2246b3b3a69aa57585668bc0739
|
4
|
+
data.tar.gz: d8d3125754e43fdfdfbaf134d53d2e6524944cd68422f7b10b13fb587a9ff288
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 026fcfad3c5696d387f4bd68c6ddbe36ef6b13a640771209954adf4fb191d27e8fcc13af61b23645cba44cf4f92c71e720a3e7d022081402143b8639ca0a8fa7
|
7
|
+
data.tar.gz: 21bce5de8543dc53735214b7a35d6dcf3387f93be56e1a1c575522ce07e66d6de555fbb5673aede73f3fa9ca3fa3613e06a5aa7e9a63035b8028553f2cb4ccfe
|
data/lib/faraday/adapter/test.rb
CHANGED
@@ -146,7 +146,7 @@ module Faraday
|
|
146
146
|
# which means that all of a path, parameters, and headers must be the same as an actual request.
|
147
147
|
def strict_mode=(value)
|
148
148
|
@strict_mode = value
|
149
|
-
@stack.
|
149
|
+
@stack.each_value do |stubs|
|
150
150
|
stubs.each do |stub|
|
151
151
|
stub.strict_mode = value
|
152
152
|
end
|
data/lib/faraday/error.rb
CHANGED
@@ -124,6 +124,10 @@ module Faraday
|
|
124
124
|
class UnprocessableEntityError < ClientError
|
125
125
|
end
|
126
126
|
|
127
|
+
# Raised by Faraday::Response::RaiseError in case of a 429 response.
|
128
|
+
class TooManyRequestsError < ClientError
|
129
|
+
end
|
130
|
+
|
127
131
|
# Faraday server error class. Represents 5xx status responses.
|
128
132
|
class ServerError < Error
|
129
133
|
end
|
data/lib/faraday/options.rb
CHANGED
@@ -30,7 +30,7 @@ module Faraday
|
|
30
30
|
new_value = value
|
31
31
|
end
|
32
32
|
|
33
|
-
send("#{key}=", new_value) unless new_value.nil?
|
33
|
+
send(:"#{key}=", new_value) unless new_value.nil?
|
34
34
|
end
|
35
35
|
self
|
36
36
|
end
|
@@ -38,7 +38,7 @@ module Faraday
|
|
38
38
|
# Public
|
39
39
|
def delete(key)
|
40
40
|
value = send(key)
|
41
|
-
send("#{key}=", nil)
|
41
|
+
send(:"#{key}=", nil)
|
42
42
|
value
|
43
43
|
end
|
44
44
|
|
@@ -57,7 +57,7 @@ module Faraday
|
|
57
57
|
else
|
58
58
|
other_value
|
59
59
|
end
|
60
|
-
send("#{key}=", new_value) unless new_value.nil?
|
60
|
+
send(:"#{key}=", new_value) unless new_value.nil?
|
61
61
|
end
|
62
62
|
self
|
63
63
|
end
|
data/lib/faraday/request/json.rb
CHANGED
@@ -24,7 +24,13 @@ module Faraday
|
|
24
24
|
private
|
25
25
|
|
26
26
|
def encode(data)
|
27
|
-
|
27
|
+
if options[:encoder].is_a?(Array) && options[:encoder].size >= 2
|
28
|
+
options[:encoder][0].public_send(options[:encoder][1], data)
|
29
|
+
elsif options[:encoder].respond_to?(:dump)
|
30
|
+
options[:encoder].dump(data)
|
31
|
+
else
|
32
|
+
::JSON.generate(data)
|
33
|
+
end
|
28
34
|
end
|
29
35
|
|
30
36
|
def match_content_type(env)
|
@@ -11,6 +11,8 @@ module Faraday
|
|
11
11
|
@parser_options = parser_options
|
12
12
|
@content_types = Array(content_type)
|
13
13
|
@preserve_raw = preserve_raw
|
14
|
+
|
15
|
+
process_parser_options
|
14
16
|
end
|
15
17
|
|
16
18
|
def on_complete(env)
|
@@ -27,7 +29,11 @@ module Faraday
|
|
27
29
|
end
|
28
30
|
|
29
31
|
def parse(body)
|
30
|
-
|
32
|
+
return if body.strip.empty?
|
33
|
+
|
34
|
+
decoder, method_name = @decoder_options
|
35
|
+
|
36
|
+
decoder.public_send(method_name, body, @parser_options || {})
|
31
37
|
end
|
32
38
|
|
33
39
|
def parse_response?(env)
|
@@ -47,6 +53,19 @@ module Faraday
|
|
47
53
|
type = type.split(';', 2).first if type.index(';')
|
48
54
|
type
|
49
55
|
end
|
56
|
+
|
57
|
+
def process_parser_options
|
58
|
+
@decoder_options = @parser_options&.delete(:decoder)
|
59
|
+
|
60
|
+
@decoder_options =
|
61
|
+
if @decoder_options.is_a?(Array) && @decoder_options.size >= 2
|
62
|
+
@decoder_options.slice(0, 2)
|
63
|
+
elsif @decoder_options.respond_to?(:load)
|
64
|
+
[@decoder_options, :load]
|
65
|
+
else
|
66
|
+
[::JSON, :parse]
|
67
|
+
end
|
68
|
+
end
|
50
69
|
end
|
51
70
|
end
|
52
71
|
end
|
@@ -30,6 +30,8 @@ module Faraday
|
|
30
30
|
raise Faraday::ConflictError, response_values(env)
|
31
31
|
when 422
|
32
32
|
raise Faraday::UnprocessableEntityError, response_values(env)
|
33
|
+
when 429
|
34
|
+
raise Faraday::TooManyRequestsError, response_values(env)
|
33
35
|
when ClientErrorStatuses
|
34
36
|
raise Faraday::ClientError, response_values(env)
|
35
37
|
when ServerErrorStatuses
|
data/lib/faraday/version.rb
CHANGED
@@ -132,4 +132,68 @@ RSpec.describe Faraday::Request::Json do
|
|
132
132
|
expect(result_type).to eq('application/xml; charset=utf-8')
|
133
133
|
end
|
134
134
|
end
|
135
|
+
|
136
|
+
context 'with encoder' do
|
137
|
+
let(:encoder) do
|
138
|
+
double('Encoder').tap do |e|
|
139
|
+
allow(e).to receive(:dump) { |s, opts| JSON.generate(s, opts) }
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
let(:result) { process(a: 1) }
|
144
|
+
|
145
|
+
context 'when encoder is passed as object' do
|
146
|
+
let(:middleware) { described_class.new(->(env) { Faraday::Response.new(env) }, { encoder: encoder }) }
|
147
|
+
|
148
|
+
it 'calls specified JSON encoder\'s dump method' do
|
149
|
+
expect(encoder).to receive(:dump).with({ a: 1 })
|
150
|
+
|
151
|
+
result
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'encodes body' do
|
155
|
+
expect(result_body).to eq('{"a":1}')
|
156
|
+
end
|
157
|
+
|
158
|
+
it 'adds content type' do
|
159
|
+
expect(result_type).to eq('application/json')
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
context 'when encoder is passed as an object-method pair' do
|
164
|
+
let(:middleware) { described_class.new(->(env) { Faraday::Response.new(env) }, { encoder: [encoder, :dump] }) }
|
165
|
+
|
166
|
+
it 'calls specified JSON encoder' do
|
167
|
+
expect(encoder).to receive(:dump).with({ a: 1 })
|
168
|
+
|
169
|
+
result
|
170
|
+
end
|
171
|
+
|
172
|
+
it 'encodes body' do
|
173
|
+
expect(result_body).to eq('{"a":1}')
|
174
|
+
end
|
175
|
+
|
176
|
+
it 'adds content type' do
|
177
|
+
expect(result_type).to eq('application/json')
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
context 'when encoder is not passed' do
|
182
|
+
let(:middleware) { described_class.new(->(env) { Faraday::Response.new(env) }) }
|
183
|
+
|
184
|
+
it 'calls JSON.generate' do
|
185
|
+
expect(JSON).to receive(:generate).with({ a: 1 })
|
186
|
+
|
187
|
+
result
|
188
|
+
end
|
189
|
+
|
190
|
+
it 'encodes body' do
|
191
|
+
expect(result_body).to eq('{"a":1}')
|
192
|
+
end
|
193
|
+
|
194
|
+
it 'adds content type' do
|
195
|
+
expect(result_type).to eq('application/json')
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
135
199
|
end
|
@@ -114,4 +114,76 @@ RSpec.describe Faraday::Response::Json, type: :response do
|
|
114
114
|
expect(response.body).to eq(result)
|
115
115
|
end
|
116
116
|
end
|
117
|
+
|
118
|
+
context 'with decoder' do
|
119
|
+
let(:decoder) do
|
120
|
+
double('Decoder').tap do |e|
|
121
|
+
allow(e).to receive(:load) { |s, opts| JSON.parse(s, opts) }
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
let(:body) { '{"a": 1}' }
|
126
|
+
let(:result) { { a: 1 } }
|
127
|
+
|
128
|
+
context 'when decoder is passed as object' do
|
129
|
+
let(:options) do
|
130
|
+
{
|
131
|
+
parser_options: {
|
132
|
+
decoder: decoder,
|
133
|
+
option: :option_value,
|
134
|
+
symbolize_names: true
|
135
|
+
}
|
136
|
+
}
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'passes relevant options to specified decoder\'s load method' do
|
140
|
+
expect(decoder).to receive(:load)
|
141
|
+
.with(body, { option: :option_value, symbolize_names: true })
|
142
|
+
.and_return(result)
|
143
|
+
|
144
|
+
response = process(body)
|
145
|
+
expect(response.body).to eq(result)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
context 'when decoder is passed as an object-method pair' do
|
150
|
+
let(:options) do
|
151
|
+
{
|
152
|
+
parser_options: {
|
153
|
+
decoder: [decoder, :load],
|
154
|
+
option: :option_value,
|
155
|
+
symbolize_names: true
|
156
|
+
}
|
157
|
+
}
|
158
|
+
end
|
159
|
+
|
160
|
+
it 'passes relevant options to specified decoder\'s method' do
|
161
|
+
expect(decoder).to receive(:load)
|
162
|
+
.with(body, { option: :option_value, symbolize_names: true })
|
163
|
+
.and_return(result)
|
164
|
+
|
165
|
+
response = process(body)
|
166
|
+
expect(response.body).to eq(result)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
context 'when decoder is not passed' do
|
171
|
+
let(:options) do
|
172
|
+
{
|
173
|
+
parser_options: {
|
174
|
+
symbolize_names: true
|
175
|
+
}
|
176
|
+
}
|
177
|
+
end
|
178
|
+
|
179
|
+
it 'passes relevant options to JSON parse' do
|
180
|
+
expect(JSON).to receive(:parse)
|
181
|
+
.with(body, { symbolize_names: true })
|
182
|
+
.and_return(result)
|
183
|
+
|
184
|
+
response = process(body)
|
185
|
+
expect(response.body).to eq(result)
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
117
189
|
end
|
@@ -14,6 +14,7 @@ RSpec.describe Faraday::Response::RaiseError do
|
|
14
14
|
stub.get('request-timeout') { [408, { 'X-Reason' => 'because' }, 'keep looking'] }
|
15
15
|
stub.get('conflict') { [409, { 'X-Reason' => 'because' }, 'keep looking'] }
|
16
16
|
stub.get('unprocessable-entity') { [422, { 'X-Reason' => 'because' }, 'keep looking'] }
|
17
|
+
stub.get('too-many-requests') { [429, { 'X-Reason' => 'because' }, 'keep looking'] }
|
17
18
|
stub.get('4xx') { [499, { 'X-Reason' => 'because' }, 'keep looking'] }
|
18
19
|
stub.get('nil-status') { [nil, { 'X-Reason' => 'nil' }, 'fail'] }
|
19
20
|
stub.get('server-error') { [500, { 'X-Error' => 'bailout' }, 'fail'] }
|
@@ -113,6 +114,17 @@ RSpec.describe Faraday::Response::RaiseError do
|
|
113
114
|
end
|
114
115
|
end
|
115
116
|
|
117
|
+
it 'raises Faraday::TooManyRequestsError for 429 responses' do
|
118
|
+
expect { conn.get('too-many-requests') }.to raise_error(Faraday::TooManyRequestsError) do |ex|
|
119
|
+
expect(ex.message).to eq('the server responded with status 429')
|
120
|
+
expect(ex.response[:headers]['X-Reason']).to eq('because')
|
121
|
+
expect(ex.response[:status]).to eq(429)
|
122
|
+
expect(ex.response_status).to eq(429)
|
123
|
+
expect(ex.response_body).to eq('keep looking')
|
124
|
+
expect(ex.response_headers['X-Reason']).to eq('because')
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
116
128
|
it 'raises Faraday::NilStatusError for nil status in response' do
|
117
129
|
expect { conn.get('nil-status') }.to raise_error(Faraday::NilStatusError) do |ex|
|
118
130
|
expect(ex.message).to eq('http status could not be derived from the server response')
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: faraday
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.8.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "@technoweenie"
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2023-
|
13
|
+
date: 2023-12-21 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: base64
|
@@ -145,7 +145,7 @@ licenses:
|
|
145
145
|
- MIT
|
146
146
|
metadata:
|
147
147
|
homepage_uri: https://lostisland.github.io/faraday
|
148
|
-
changelog_uri: https://github.com/lostisland/faraday/releases/tag/v2.
|
148
|
+
changelog_uri: https://github.com/lostisland/faraday/releases/tag/v2.8.1
|
149
149
|
source_code_uri: https://github.com/lostisland/faraday
|
150
150
|
bug_tracker_uri: https://github.com/lostisland/faraday/issues
|
151
151
|
post_install_message:
|