dhc 2.4.0 → 3.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/README.md +6 -9
- data/lib/dhc/formats/json.rb +0 -2
- data/lib/dhc/interceptors/default_timeout.rb +1 -1
- data/lib/dhc/interceptors/throttle.rb +1 -2
- data/lib/dhc/response.rb +1 -2
- data/lib/dhc/version.rb +1 -1
- data/spec/basic_methods/delete_spec.rb +2 -2
- data/spec/basic_methods/get_spec.rb +3 -3
- data/spec/basic_methods/post_spec.rb +2 -2
- data/spec/basic_methods/put_spec.rb +2 -2
- data/spec/basic_methods/request_spec.rb +1 -1
- data/spec/interceptors/auth/bearer_spec.rb +1 -1
- data/spec/interceptors/logging/main_spec.rb +3 -3
- data/spec/request/error_handling_spec.rb +3 -3
- data/spec/response/data_accessor_spec.rb +1 -1
- data/spec/response/data_spec.rb +4 -24
- metadata +3 -8
- data/lib/dhc/errors/parser_error.rb +0 -4
- data/lib/dhc/response/data/base.rb +0 -18
- data/lib/dhc/response/data/collection.rb +0 -16
- data/lib/dhc/response/data/item.rb +0 -29
- data/lib/dhc/response/data.rb +0 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 38b1300c7240268c0d2d3d571d86dc70e1d9015440a9a600c65fcf4bb2532cce
|
4
|
+
data.tar.gz: 3aff5b7adbd2d7150cc4aa68f28fe728d248a53c3a4fd2db7875ea3919bc45c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e25e5a034157c23c9da5792ace6e560f44623f767ec9b63d7a1d2b3895a9a0a49489256eee6eddaafd59e37e77bb8eb80711e30968075b8669919e52f39c2065
|
7
|
+
data.tar.gz: d01e8730f5b9d28a4ed933a4aec7bca68be14888ee45c7cffd4990e97e6fcd9627213f458b1cc171d214ea6a01eabeade3348db3e2530691c5cc84a4b684fa12
|
data/README.md
CHANGED
@@ -21,8 +21,8 @@ use it like:
|
|
21
21
|
|
22
22
|
```ruby
|
23
23
|
response = DHC.get('http://datastore/v2/feedbacks')
|
24
|
-
response.data.items
|
25
|
-
response.data.items
|
24
|
+
response.data.dig('items', 0)
|
25
|
+
response.data.dig('items', 0, 'recommended')
|
26
26
|
response.body
|
27
27
|
response.headers
|
28
28
|
```
|
@@ -236,8 +236,8 @@ User-Agent DHC (9.4.2; MyRailsApplicationName) [https://github.com/DePayFi/dhc]
|
|
236
236
|
```ruby
|
237
237
|
response.request #<DHC::Request> the associated request.
|
238
238
|
|
239
|
-
response.data
|
240
|
-
response.data.something
|
239
|
+
response.data # JSON
|
240
|
+
response.data.dig('something', 'nested')
|
241
241
|
|
242
242
|
response.body #<String>
|
243
243
|
|
@@ -256,9 +256,6 @@ The response data can be access with dot-notation and square-bracket notation. Y
|
|
256
256
|
|
257
257
|
```ruby
|
258
258
|
response = DHC.request(url: 'http://datastore/entry/1')
|
259
|
-
response.data.as_open_struct #<OpenStruct name='depay.fi'>
|
260
|
-
response.data.as_json # { name: 'depay.fi' }
|
261
|
-
response.data.name # 'depay.fi'
|
262
259
|
response.data[:name] # 'depay.fi'
|
263
260
|
```
|
264
261
|
|
@@ -347,7 +344,7 @@ If your error handler returns anything else but `nil` it replaces the response b
|
|
347
344
|
```ruby
|
348
345
|
handler = ->(response){ do_something_with_response; return {name: 'unknown'} }
|
349
346
|
response = DHC.get('http://something', rescue: handler)
|
350
|
-
response.data
|
347
|
+
response.data[:name] # 'unknown'
|
351
348
|
```
|
352
349
|
|
353
350
|
### Ignore certain errors
|
@@ -481,7 +478,7 @@ If you configure `expires_at` and `refresh` proc in addition to `bearer`, DHC wi
|
|
481
478
|
```ruby
|
482
479
|
refresh = ->(response = nil){
|
483
480
|
if response
|
484
|
-
if response.code == 401 && response.data && response.data
|
481
|
+
if response.code == 401 && response.data && response.data[:error_code] == 'ACCESS_TOKEN_EXPIRED'
|
485
482
|
session[:access_token] = new_access_token
|
486
483
|
end
|
487
484
|
else
|
data/lib/dhc/formats/json.rb
CHANGED
@@ -9,7 +9,7 @@ class DHC::DefaultTimeout < DHC::Interceptor
|
|
9
9
|
TIMEOUT = 15 # seconds
|
10
10
|
|
11
11
|
def before_init
|
12
|
-
request_options =
|
12
|
+
request_options = request.options || {}
|
13
13
|
request_options[:timeout] ||= timeout || TIMEOUT
|
14
14
|
request_options[:connecttimeout] ||= connecttimeout || CONNECTTIMEOUT
|
15
15
|
end
|
@@ -45,9 +45,8 @@ class DHC::Throttle < DHC::Interceptor
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def track?
|
48
|
-
|
48
|
+
options.dig(:remaining) && [options.dig(:track), response.headers].none?(&:blank?) ||
|
49
49
|
options.dig(:track).present?
|
50
|
-
)
|
51
50
|
end
|
52
51
|
|
53
52
|
def break?
|
data/lib/dhc/response.rb
CHANGED
@@ -5,7 +5,6 @@ require 'active_support/core_ext/module'
|
|
5
5
|
# The response contains the raw response (typhoeus)
|
6
6
|
# and provides functionality to access response data.
|
7
7
|
class DHC::Response
|
8
|
-
autoload :Data, 'dhc/response/data'
|
9
8
|
|
10
9
|
attr_accessor :request, :body_replacement
|
11
10
|
attr_reader :from_cache
|
@@ -23,7 +22,7 @@ class DHC::Response
|
|
23
22
|
end
|
24
23
|
|
25
24
|
def data
|
26
|
-
@data ||= body.present? ?
|
25
|
+
@data ||= body.present? ? JSON.parse(body) : nil
|
27
26
|
end
|
28
27
|
|
29
28
|
def [](key)
|
data/lib/dhc/version.rb
CHANGED
@@ -21,9 +21,9 @@ describe DHC do
|
|
21
21
|
DHC.delete('http://datastore/v2/feedbacks/12121')
|
22
22
|
end
|
23
23
|
|
24
|
-
it 'makes response data available
|
24
|
+
it 'makes response data available' do
|
25
25
|
response = DHC.delete('http://datastore/v2/feedbacks/12121')
|
26
|
-
expect(response.data
|
26
|
+
expect(response.data['recommended']).to eq true
|
27
27
|
end
|
28
28
|
|
29
29
|
it 'provides response headers' do
|
@@ -24,9 +24,9 @@ describe DHC do
|
|
24
24
|
DHC.get(:feedbacks, params: parameters)
|
25
25
|
end
|
26
26
|
|
27
|
-
it 'makes response data available
|
27
|
+
it 'makes response data available' do
|
28
28
|
response = DHC.get('http://datastore/v2/feedbacks', params: parameters)
|
29
|
-
expect(response.data
|
29
|
+
expect(response.data['total']).to eq 99
|
30
30
|
end
|
31
31
|
|
32
32
|
it 'provides response headers' do
|
@@ -43,7 +43,7 @@ describe DHC do
|
|
43
43
|
|
44
44
|
it 'requests json and parses response body' do
|
45
45
|
data = DHC.json.get('http://datastore/v2/feedbacks').data
|
46
|
-
expect(data
|
46
|
+
expect(data['some']).to eq 'json'
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
@@ -29,9 +29,9 @@ describe DHC do
|
|
29
29
|
DHC.post(:feedbacks, body: feedback)
|
30
30
|
end
|
31
31
|
|
32
|
-
it 'makes response data available
|
32
|
+
it 'makes response data available' do
|
33
33
|
response = DHC.post('http://datastore/v2/feedbacks', body: feedback)
|
34
|
-
expect(response.data
|
34
|
+
expect(response.data['source_id']).to eq 'aaa'
|
35
35
|
end
|
36
36
|
|
37
37
|
it 'provides response headers' do
|
@@ -35,9 +35,9 @@ describe DHC do
|
|
35
35
|
DHC.put(:feedbacks, body: change)
|
36
36
|
end
|
37
37
|
|
38
|
-
it 'makes response data available
|
38
|
+
it 'makes response data available' do
|
39
39
|
response = DHC.put('http://datastore/v2/feedbacks', body: change)
|
40
|
-
expect(response.data
|
40
|
+
expect(response.data['recommended']).to eq false
|
41
41
|
end
|
42
42
|
|
43
43
|
it 'provides response headers' do
|
@@ -13,7 +13,7 @@ describe DHC do
|
|
13
13
|
|
14
14
|
it 'does a request returning a response' do
|
15
15
|
response = DHC.request(url: 'http://datastore/v2/feedbacks', params: { has_reviews: true }, method: :get)
|
16
|
-
expect(response.data
|
16
|
+
expect(response.data['total']).to eq total
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
@@ -39,7 +39,7 @@ describe DHC::Auth do
|
|
39
39
|
before do
|
40
40
|
refresh = ->(response = nil) {
|
41
41
|
if response
|
42
|
-
if response.code == 401 && response.data && response.data
|
42
|
+
if response.code == 401 && response.data && response.data['error_code'] == 'ACCESS_TOKEN_EXPIRED'
|
43
43
|
session[:access_token] = third_access_token
|
44
44
|
end
|
45
45
|
else
|
@@ -17,7 +17,7 @@ describe DHC::Logging do
|
|
17
17
|
%r{Before DHC request <\d+> GET http://depay.fi at \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+\d{2}:\d{2} Params={} Headers={.*?}}
|
18
18
|
)
|
19
19
|
expect(logger).to have_received(:info).once.with(
|
20
|
-
%r{After DHC response for request <\d+> GET http://depay.fi at \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+\d{2}:\d{2} Time
|
20
|
+
%r{After DHC response for request <\d+> GET http://depay.fi at \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+\d{2}:\d{2} Time=\d+(\.\d+)?ms URL=http://depay.fi:80/}
|
21
21
|
)
|
22
22
|
end
|
23
23
|
|
@@ -27,10 +27,10 @@ describe DHC::Logging do
|
|
27
27
|
it 'does log the source if provided as option' do
|
28
28
|
DHC.get('http://depay.fi', source: source)
|
29
29
|
expect(logger).to have_received(:info).once.with(
|
30
|
-
%r{Before DHC request <\d+> GET http://depay.fi at \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+\d{2}:\d{2} Params={} Headers={.*?} \nCalled from #{source}}
|
30
|
+
%r{Before DHC request <\d+> GET http://depay.fi at \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+\d{2}:\d{2} Params={} Headers={.*?} \nCalled from #{Regexp.escape(source)}}
|
31
31
|
)
|
32
32
|
expect(logger).to have_received(:info).once.with(
|
33
|
-
%r{After DHC response for request <\d+> GET http://depay.fi at \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+\d{2}:\d{2} Time
|
33
|
+
%r{After DHC response for request <\d+> GET http://depay.fi at \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+\d{2}:\d{2} Time=\d+(\.\d+)?ms URL=http://depay.fi:80/ \nCalled from #{Regexp.escape(source)}}
|
34
34
|
)
|
35
35
|
end
|
36
36
|
end
|
@@ -59,7 +59,7 @@ describe DHC::Request do
|
|
59
59
|
it 'requests json and parses response body' do
|
60
60
|
expect(-> {
|
61
61
|
DHC.json.get('http://datastore/v2/feedbacks').data
|
62
|
-
}).to raise_error(
|
62
|
+
}).to raise_error(JSON::ParserError)
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
@@ -75,14 +75,14 @@ describe DHC::Request do
|
|
75
75
|
stub_request(:get, 'http://something').to_return(status: 400)
|
76
76
|
handler = ->(_response) { { name: 'unknown' }.to_json }
|
77
77
|
request = DHC::Request.new(url: 'http://something', rescue: handler)
|
78
|
-
expect(request.response.data
|
78
|
+
expect(request.response.data['name']).to eq 'unknown'
|
79
79
|
end
|
80
80
|
|
81
81
|
it 'does not exchange body with handlers return if the handler returns nil' do
|
82
82
|
stub_request(:get, 'http://something').to_return(status: 400, body: { message: 'an error occurred' }.to_json)
|
83
83
|
handler = ->(_response) { nil }
|
84
84
|
request = DHC::Request.new(url: 'http://something', rescue: handler)
|
85
|
-
expect(request.response.data
|
85
|
+
expect(request.response.data['message']).to eq 'an error occurred'
|
86
86
|
end
|
87
87
|
end
|
88
88
|
end
|
data/spec/response/data_spec.rb
CHANGED
@@ -14,23 +14,15 @@ describe DHC::Response do
|
|
14
14
|
let(:body) { { some_key: { nested: value } } }
|
15
15
|
|
16
16
|
it 'makes data from response body available' do
|
17
|
-
expect(response.data.some_key
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'makes data from response body available with hash bracket notation' do
|
21
|
-
expect(response.data[:some_key][:nested]).to eq value
|
17
|
+
expect(response.data.dig('some_key', 'nested')).to eq value
|
22
18
|
end
|
23
19
|
|
24
20
|
it 'can be converted to json with the as_json method' do
|
25
21
|
expect(response.data.as_json).to eq body.as_json
|
26
22
|
end
|
27
23
|
|
28
|
-
it 'can be converted to an open struct with the as_open_struct method' do
|
29
|
-
expect(response.data.as_open_struct).to eq JSON.parse(response.body, object_class: OpenStruct)
|
30
|
-
end
|
31
|
-
|
32
24
|
it 'returns nil when data is not available' do
|
33
|
-
expect(response.data
|
25
|
+
expect(response.data['something']).to be_nil
|
34
26
|
end
|
35
27
|
end
|
36
28
|
|
@@ -41,20 +33,8 @@ describe DHC::Response do
|
|
41
33
|
expect(response.data.as_json).to eq body.as_json
|
42
34
|
end
|
43
35
|
|
44
|
-
it 'can be converted to an open struct with the as_open_struct method' do
|
45
|
-
expect(response.data.as_open_struct).to eq JSON.parse(response.body, object_class: OpenStruct)
|
46
|
-
end
|
47
|
-
|
48
|
-
it 'is a collection of items' do
|
49
|
-
expect(response.data.size).to eq(1)
|
50
|
-
end
|
51
|
-
|
52
36
|
it 'makes item data from response body available' do
|
53
|
-
expect(response.data.
|
54
|
-
end
|
55
|
-
|
56
|
-
it 'makes item data from response body available with hash bracket notation' do
|
57
|
-
expect(response.data.first[:some_key][:nested]).to eq value
|
37
|
+
expect(response.data.dig(0, 'some_key', 'nested')).to eq value
|
58
38
|
end
|
59
39
|
end
|
60
40
|
end
|
@@ -77,7 +57,7 @@ describe DHC::Response do
|
|
77
57
|
DHC.get('http://listings')
|
78
58
|
rescue DHC::Error => error
|
79
59
|
expect(
|
80
|
-
error.response.request.response.data.meta
|
60
|
+
error.response.request.response.data.dig('meta', 'errors').detect { |item| item['code'] == 2000 }['msg']
|
81
61
|
).to eq 'I like to hide error messages (this is meta).'
|
82
62
|
end
|
83
63
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dhc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- https://github.com/DePayFi/dhc/contributors
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-10-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -215,7 +215,6 @@ files:
|
|
215
215
|
- lib/dhc/endpoint.rb
|
216
216
|
- lib/dhc/error.rb
|
217
217
|
- lib/dhc/errors/client_error.rb
|
218
|
-
- lib/dhc/errors/parser_error.rb
|
219
218
|
- lib/dhc/errors/server_error.rb
|
220
219
|
- lib/dhc/errors/timeout.rb
|
221
220
|
- lib/dhc/errors/unknown_error.rb
|
@@ -241,10 +240,6 @@ files:
|
|
241
240
|
- lib/dhc/railtie.rb
|
242
241
|
- lib/dhc/request.rb
|
243
242
|
- lib/dhc/response.rb
|
244
|
-
- lib/dhc/response/data.rb
|
245
|
-
- lib/dhc/response/data/base.rb
|
246
|
-
- lib/dhc/response/data/collection.rb
|
247
|
-
- lib/dhc/response/data/item.rb
|
248
243
|
- lib/dhc/rspec.rb
|
249
244
|
- lib/dhc/test/cache_helper.rb
|
250
245
|
- lib/dhc/version.rb
|
@@ -399,7 +394,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
399
394
|
version: '0'
|
400
395
|
requirements:
|
401
396
|
- Ruby >= 2.0.0
|
402
|
-
rubygems_version: 3.4.
|
397
|
+
rubygems_version: 3.4.10
|
403
398
|
signing_key:
|
404
399
|
specification_version: 4
|
405
400
|
summary: Advanced HTTP Client for Ruby, fueled with interceptors
|
@@ -1,18 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Response data is data provided through the response body
|
4
|
-
# but made accssible in the ruby world
|
5
|
-
module DHC::Response::Data::Base
|
6
|
-
def as_json
|
7
|
-
@json ||= (@data || @response.format.as_json(@response.body))
|
8
|
-
end
|
9
|
-
|
10
|
-
def as_open_struct
|
11
|
-
@open_struct ||=
|
12
|
-
if @data
|
13
|
-
JSON.parse(@data.to_json, object_class: OpenStruct)
|
14
|
-
else
|
15
|
-
@response.format.as_open_struct(@response.body)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class DHC::Response::Data::Collection < Array
|
4
|
-
include DHC::Response::Data::Base
|
5
|
-
|
6
|
-
def initialize(response, data: nil)
|
7
|
-
@response = response
|
8
|
-
@data = data
|
9
|
-
|
10
|
-
super(
|
11
|
-
as_json.map do |i|
|
12
|
-
DHC::Response::Data.new(response, data: i)
|
13
|
-
end
|
14
|
-
)
|
15
|
-
end
|
16
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class DHC::Response::Data::Item < OpenStruct
|
4
|
-
include DHC::Response::Data::Base
|
5
|
-
|
6
|
-
def initialize(response, data: nil)
|
7
|
-
@response = response
|
8
|
-
@data = data
|
9
|
-
|
10
|
-
set_dynamic_accessor_methods
|
11
|
-
|
12
|
-
super(as_json)
|
13
|
-
end
|
14
|
-
|
15
|
-
def [](key)
|
16
|
-
@hash ||= as_json.with_indifferent_access
|
17
|
-
@hash[key]
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
|
22
|
-
def set_dynamic_accessor_methods
|
23
|
-
as_json.keys.each do |key|
|
24
|
-
define_singleton_method key do |*args|
|
25
|
-
as_open_struct.send key, *args
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
data/lib/dhc/response/data.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class DHC::Response::Data
|
4
|
-
autoload :Base, 'dhc/response/data/base'
|
5
|
-
autoload :Item, 'dhc/response/data/item'
|
6
|
-
autoload :Collection, 'dhc/response/data/collection'
|
7
|
-
|
8
|
-
include DHC::Response::Data::Base
|
9
|
-
|
10
|
-
def initialize(response, data: nil)
|
11
|
-
@response = response
|
12
|
-
@data = data
|
13
|
-
|
14
|
-
if as_json.is_a?(Hash)
|
15
|
-
@base = DHC::Response::Data::Item.new(@response, data: data)
|
16
|
-
elsif as_json.is_a?(Array)
|
17
|
-
@base = DHC::Response::Data::Collection.new(@response, data: data)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def method_missing(method, *args, &block)
|
22
|
-
@base.send(method, *args, &block)
|
23
|
-
end
|
24
|
-
|
25
|
-
def respond_to_missing?(method_name, include_private = false)
|
26
|
-
@base.respond_to?(method_name, include_private) || super
|
27
|
-
end
|
28
|
-
end
|