better-faraday 2.0.2 → 3.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.
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: better-faraday
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
4
+ version: 3.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yaroslav Konoplov
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2026-02-12 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: faraday
@@ -31,43 +30,137 @@ dependencies:
31
30
  - !ruby/object:Gem::Version
32
31
  version: '3.0'
33
32
  - !ruby/object:Gem::Dependency
34
- name: activesupport
33
+ name: bundler
35
34
  requirement: !ruby/object:Gem::Requirement
36
35
  requirements:
37
- - - ">="
36
+ - - "~>"
38
37
  - !ruby/object:Gem::Version
39
38
  version: '4.0'
40
- - - "<"
41
- - !ruby/object:Gem::Version
42
- version: '7.0'
43
- type: :runtime
39
+ type: :development
44
40
  prerelease: false
45
41
  version_requirements: !ruby/object:Gem::Requirement
46
42
  requirements:
47
- - - ">="
43
+ - - "~>"
48
44
  - !ruby/object:Gem::Version
49
45
  version: '4.0'
50
- - - "<"
46
+ - !ruby/object:Gem::Dependency
47
+ name: faraday-multipart
48
+ requirement: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - "~>"
51
+ - !ruby/object:Gem::Version
52
+ version: '1.2'
53
+ type: :development
54
+ prerelease: false
55
+ version_requirements: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '1.2'
60
+ - !ruby/object:Gem::Dependency
61
+ name: faraday-net_http_persistent
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: '2.3'
67
+ type: :development
68
+ prerelease: false
69
+ version_requirements: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "~>"
51
72
  - !ruby/object:Gem::Version
52
- version: '7.0'
53
- description: A gem extending Faraday (popular Ruby HTTP client) with useful features
54
- without breaking anything.
73
+ version: '2.3'
74
+ - !ruby/object:Gem::Dependency
75
+ name: pry-byebug
76
+ requirement: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: '3.12'
81
+ type: :development
82
+ prerelease: false
83
+ version_requirements: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '3.12'
88
+ - !ruby/object:Gem::Dependency
89
+ name: rake
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: '13.4'
95
+ type: :development
96
+ prerelease: false
97
+ version_requirements: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: '13.4'
102
+ - !ruby/object:Gem::Dependency
103
+ name: rspec
104
+ requirement: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: '3.13'
109
+ type: :development
110
+ prerelease: false
111
+ version_requirements: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - "~>"
114
+ - !ruby/object:Gem::Version
115
+ version: '3.13'
116
+ - !ruby/object:Gem::Dependency
117
+ name: webmock
118
+ requirement: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - "~>"
121
+ - !ruby/object:Gem::Version
122
+ version: '3.26'
123
+ type: :development
124
+ prerelease: false
125
+ version_requirements: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "~>"
128
+ - !ruby/object:Gem::Version
129
+ version: '3.26'
130
+ description: A gem extending Faraday HTTP client with useful features
55
131
  email: eahome00@gmail.com
56
132
  executables: []
57
133
  extensions: []
58
134
  extra_rdoc_files: []
59
135
  files:
60
136
  - ".gitignore"
137
+ - ".rubocop.yml"
61
138
  - ".ruby-version"
139
+ - Gemfile
140
+ - Gemfile.lock
62
141
  - LICENSE
63
142
  - README.md
143
+ - Rakefile
64
144
  - better-faraday.gemspec
65
- - lib/better-faraday.rb
145
+ - lib/better_faraday.rb
146
+ - spec/adapters_spec.rb
147
+ - spec/array_masking_spec.rb
148
+ - spec/assert_status_spec.rb
149
+ - spec/custom_sensitive_signs_spec.rb
150
+ - spec/http_error_spec.rb
151
+ - spec/inspect_truncation_spec.rb
152
+ - spec/invalid_json_spec.rb
153
+ - spec/logger_spec.rb
154
+ - spec/middleware_spec.rb
155
+ - spec/multipart_spec.rb
156
+ - spec/nested_sensitive_data_spec.rb
157
+ - spec/sensitive_data_signs_spec.rb
158
+ - spec/spec_helper.rb
159
+ - spec/timing_inspect_spec.rb
66
160
  homepage: https://github.com/yivo/better-faraday
67
161
  licenses:
68
162
  - MIT
69
163
  metadata: {}
70
- post_install_message:
71
164
  rdoc_options: []
72
165
  require_paths:
73
166
  - lib
@@ -75,15 +168,31 @@ required_ruby_version: !ruby/object:Gem::Requirement
75
168
  requirements:
76
169
  - - ">="
77
170
  - !ruby/object:Gem::Version
78
- version: '0'
171
+ version: 2.7.0
172
+ - - "<"
173
+ - !ruby/object:Gem::Version
174
+ version: '5.0'
79
175
  required_rubygems_version: !ruby/object:Gem::Requirement
80
176
  requirements:
81
177
  - - ">="
82
178
  - !ruby/object:Gem::Version
83
179
  version: '0'
84
180
  requirements: []
85
- rubygems_version: 3.1.6
86
- signing_key:
181
+ rubygems_version: 4.0.22
87
182
  specification_version: 4
88
- summary: Extends Faraday with useful features.
89
- test_files: []
183
+ summary: Extends Faraday with useful features
184
+ test_files:
185
+ - spec/adapters_spec.rb
186
+ - spec/array_masking_spec.rb
187
+ - spec/assert_status_spec.rb
188
+ - spec/custom_sensitive_signs_spec.rb
189
+ - spec/http_error_spec.rb
190
+ - spec/inspect_truncation_spec.rb
191
+ - spec/invalid_json_spec.rb
192
+ - spec/logger_spec.rb
193
+ - spec/middleware_spec.rb
194
+ - spec/multipart_spec.rb
195
+ - spec/nested_sensitive_data_spec.rb
196
+ - spec/sensitive_data_signs_spec.rb
197
+ - spec/spec_helper.rb
198
+ - spec/timing_inspect_spec.rb
@@ -1,259 +0,0 @@
1
- # encoding: UTF-8
2
- # frozen_string_literal: true
3
-
4
- require "json"
5
- require "net/http"
6
- require "faraday"
7
- require "faraday/error"
8
- require "faraday/options"
9
- require "faraday/response"
10
- require "active_support/core_ext/string/filters"
11
- require "active_support/core_ext/string/inflections"
12
-
13
- Module.new do
14
- def call(environment)
15
- environment.instance_variable_set(:@bf_request_sent_at, Time.now.utc)
16
- super
17
- end
18
-
19
- def save_response(environment, *)
20
- environment.instance_variable_set \
21
- :@bf_response_received_at,
22
- Time.now.utc
23
-
24
- body = environment.body
25
- value = body.respond_to?(:read) ? body.read : body
26
- value = value.to_s unless String === value
27
-
28
- environment.instance_variable_set \
29
- :@bf_request_body,
30
- value
31
-
32
- super
33
- end
34
- end.tap { |m| Faraday::Adapter.prepend(m) }
35
-
36
- Module.new do
37
- def end_transport(request, response)
38
- headers = request.to_hash
39
- headers.keys.each { |k| headers[k] = headers[k].join(", ") }
40
- response.instance_variable_set :@bf_request_headers, headers
41
- super
42
- end
43
- end.tap { |m| Net::HTTP.prepend(m) }
44
-
45
- Module.new do
46
- def perform_request(connection, environment)
47
- super(connection, environment).tap do |response|
48
- environment.instance_variable_set \
49
- :@bf_request_headers,
50
- response.instance_variable_get(:@bf_request_headers)
51
- end
52
- end
53
- end.tap do |m|
54
- Faraday::Adapter::NetHttp.prepend(m)
55
- Faraday::Adapter::NetHttpPersistent.prepend(m) if defined?(Faraday::Adapter::NetHttpPersistent)
56
- end
57
-
58
- module Faraday
59
- class Env
60
- attr_reader :bf_request_headers, :bf_request_body, :bf_request_sent_at, :bf_response_received_at
61
- end
62
-
63
- class Response
64
- def assert_status!(code_or_range)
65
- within_range = if Range === code_or_range
66
- code_or_range.include?(status)
67
- else
68
- status == code_or_range
69
- end
70
-
71
- return self if within_range
72
-
73
- klass = if status_4xx?
74
- "BetterFaraday::HTTP#{status}".safe_constantize || BetterFaraday::HTTP4xx
75
- elsif status_5xx?
76
- "BetterFaraday::HTTP#{status}".safe_constantize || BetterFaraday::HTTP5xx
77
- else
78
- BetterFaraday::HTTPError
79
- end
80
-
81
- raise klass.new(self)
82
- end
83
-
84
- def assert_2xx!
85
- assert_status!(200..299)
86
- end
87
-
88
- def assert_200!
89
- assert_status! 200
90
- end
91
-
92
- def status_2xx?
93
- status >= 200 && status <= 299
94
- end
95
-
96
- def status_3xx?
97
- status >= 300 && status <= 399
98
- end
99
-
100
- def status_4xx?
101
- status >= 400 && status <= 499
102
- end
103
-
104
- def status_5xx?
105
- status >= 500 && status <= 599
106
- end
107
-
108
- def inspect
109
- @inspection_text ||= begin
110
- request_headers = bf_protect_data(env.bf_request_headers.dup)
111
- request_body = env.bf_request_body.yield_self { |body| String === body ? body : body.to_s }
112
- request_body_bytes_count = env.bf_request_body.bytesize
113
- response_body = env.body.yield_self { |body| String === body ? body : body.to_s }
114
- response_body_bytes_count = response_body.bytesize
115
-
116
- if env.bf_request_headers["content-type"].to_s.match?(/\bapplication\/json\b/i)
117
- request_json = bf_json_parse(request_body).yield_self do |data|
118
- bf_json_dump(bf_protect_data(data)) if data
119
- end
120
- end
121
-
122
- if env.response_headers
123
- response_headers = bf_protect_data(env.response_headers.to_hash)
124
- end
125
-
126
- if env.response_headers && env.response_headers["content-type"].to_s.match?(/\bapplication\/json\b/i)
127
- response_json = bf_json_parse(response_body).yield_self do |data|
128
- bf_json_dump(bf_protect_data(data)) if data
129
- end
130
- end
131
-
132
- lines = [
133
- "-- #{status} #{reason_phrase} --".upcase,
134
- "",
135
- "-- Request URL --",
136
- env.url.to_s,
137
- "",
138
- "-- Request Method --",
139
- env.method.to_s.upcase,
140
- "",
141
- "-- Request Headers --",
142
- bf_json_dump(request_headers).truncate(2048, omission: "... (truncated)"),
143
- "",
144
-
145
- %[-- Request Body (#{request_body_bytes_count} #{"byte".pluralize(request_body_bytes_count)}) --],
146
- if request_json
147
- request_json
148
- else
149
- # String#inspect returns \x{XXXX} for the encoding other than Unicode.
150
- # [1..-2] removed leading and trailing " added by String#inspect.
151
- # gsub(/\\"/, "\"") unescapes ".
152
- request_body.inspect.gsub(/\\"/, "\"")[1..-2]
153
- end.truncate(2048, omission: "... (truncated)"),
154
- "",
155
-
156
- "-- Request Sent At --",
157
- env.bf_request_sent_at.strftime("%Y-%m-%d %H:%M:%S.%3N") + " UTC",
158
- "",
159
-
160
- "-- Response Headers --",
161
- if response_headers
162
- bf_json_dump(response_headers)
163
- else
164
- env.response_headers.to_s.inspect.gsub(/\\"/, "\"")[1..-2]
165
- end.truncate(2048, omission: "... (truncated)"),
166
- "",
167
-
168
- %[-- Response Body (#{response_body_bytes_count} #{"byte".pluralize(response_body_bytes_count)}) --],
169
- if response_json
170
- response_json
171
- else
172
- response_body.inspect.gsub(/\\"/, "\"")[1..-2]
173
- end.truncate(2048, omission: "... (truncated)"),
174
- ""
175
- ]
176
-
177
- if env.bf_response_received_at
178
- lines.concat [
179
- "-- Response Received At --",
180
- env.bf_response_received_at.strftime("%Y-%m-%d %H:%M:%S.%3N") + " UTC",
181
- "",
182
- "-- Response Received In --",
183
- "#{((env.bf_response_received_at.to_f - env.bf_request_sent_at.to_f) * 1000.0).ceil(3)}ms",
184
- ""
185
- ]
186
- end
187
-
188
- lines.join("\n").freeze
189
- end
190
-
191
- @inspection_text.dup
192
- end
193
-
194
- private
195
-
196
- def bf_json_parse(json)
197
- return nil unless ::String === json
198
- data = ::JSON.parse(json)
199
- data if ::Hash === data || ::Array === data
200
- rescue ::JSON::ParserError
201
- nil
202
- end
203
-
204
- def bf_json_dump(data)
205
- ::JSON.generate(data, space: " ", object_nl: " ", array_nl: " ")
206
- end
207
-
208
- def bf_protect_data(data)
209
- return data.map(&method(:bf_protect_data)) if ::Array === data
210
- return data unless ::Hash === data
211
-
212
- signs = BetterFaraday.sensitive_data_signs
213
-
214
- data.each_with_object({}) do |(key, value), memo|
215
- memo[key] = if key.to_s.underscore.tr("_", " ").yield_self { |k| signs.any? { |r| k.match?(r) } }
216
- "SECRET"
217
- else
218
- bf_protect_data(value)
219
- end
220
- end
221
- end
222
- end
223
- end
224
-
225
- module BetterFaraday
226
- class HTTPError < Faraday::Error
227
- def initialize(response)
228
- super(response.inspect, response)
229
- end
230
-
231
- def inspect
232
- %[#{self.class}\n\n#{response.inspect}]
233
- end
234
- end
235
-
236
- class HTTP4xx < HTTPError; end
237
- class HTTP400 < HTTP4xx; end
238
- class HTTP401 < HTTP4xx; end
239
- class HTTP403 < HTTP4xx; end
240
- class HTTP404 < HTTP4xx; end
241
- class HTTP408 < HTTP4xx; end
242
- class HTTP422 < HTTP4xx; end
243
- class HTTP429 < HTTP4xx; end
244
- class HTTP5xx < HTTPError; end
245
- class HTTP500 < HTTP5xx; end
246
- class HTTP502 < HTTP5xx; end
247
- class HTTP503 < HTTP5xx; end
248
-
249
- class << self
250
- attr_accessor :sensitive_data_signs
251
- end
252
-
253
- self.sensitive_data_signs = [
254
- /\bpass(?:word|phrase)\b/i,
255
- /\bauthorization\b/i,
256
- /\bsecret\b/i,
257
- /\b(:?access)?token\b/i
258
- ]
259
- end