rest_api_builder 0.0.4 → 0.0.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a164d75c362c383c5fb6c093f936cae3859143a5bffd3e59d833adcf686a7875
4
- data.tar.gz: 3a7cb13ef985522132219e0d753c2a04867792325ac38927c48d737198e9360d
3
+ metadata.gz: 7ca6b82ae8dc6fab46c1804dfe8b7a48a5082fada32c6aad18ec4834953e1b06
4
+ data.tar.gz: c9f328a5da83137dc49772eed5e37e5b8647e26195488279d105891fed5c1704
5
5
  SHA512:
6
- metadata.gz: e708b1b6b6635db0840387320699b0ada62547e0f408d68ac484249da8cf4c92766f3dd6dac372f041db6e3bcc5ca658f822dbf6caa4f4bf7416da56f773d4c6
7
- data.tar.gz: 5641d558c45f78b10422b253e49f7b0737d840f0d7dbb28c5386a49c6435d2e5fa08d6f0ae22463f6df872f9e42cb2164bd502613c4e1713635619ec3fa34403
6
+ metadata.gz: '07918f30ca0bfa5303987f446d0022099084a1cf3ebf47a202aa573b517fa230dbef62502d4645a813a9d174d5647b404c0687a388141c214b6c1ae6aee13b91'
7
+ data.tar.gz: adf81df2acb76b6b81673a833ebb813ff6715d5ec3bfcef4c6d5237ace09f465cd4c1231425faff0ea8c4d20a9ca6815b27a22d0dd0a5eec7c074d75a6f51c78
@@ -1 +1,21 @@
1
+ require 'forwardable'
1
2
  require 'rest_api_builder/request'
3
+ require 'rest_api_builder/request_options'
4
+ require 'rest_api_builder/response_handler'
5
+
6
+ module RestAPIBuilder
7
+ extend Forwardable
8
+
9
+ def_delegator :request_options, :compose, :compose_request_options
10
+ def_delegator :request_options, :compose_json, :compose_json_request_options
11
+
12
+ def_delegators :response_handler, :handle_response, :handle_json_response, :handle_response_error
13
+
14
+ def request_options
15
+ RequestOptions.new
16
+ end
17
+
18
+ def response_handler
19
+ ResponseHandler.new
20
+ end
21
+ end
@@ -1,11 +1,7 @@
1
1
  require 'rest-client'
2
- require 'rest_api_builder/url_helper'
3
- require 'rest_api_builder/rest_client_response_parser'
4
2
 
5
3
  module RestAPIBuilder
6
4
  class RequestSingleton
7
- include RestAPIBuilder::UrlHelper
8
-
9
5
  def json_execute(headers: {}, body: nil, **options)
10
6
  headers = headers.merge(content_type: :json)
11
7
  body &&= JSON.generate(body)
@@ -24,31 +20,24 @@ module RestAPIBuilder
24
20
  raw_response: false,
25
21
  rest_client_options: {}
26
22
  )
27
- if method == :get && body
28
- raise ArgumentError, 'GET requests do not support body'
29
- end
30
-
31
- response_parser = RestAPIBuilder::RestClientResponseParser.new(
32
- logger: logger,
33
- parse_json: parse_json,
34
- raw_response: raw_response
23
+ options = RequestOptions.new.compose(
24
+ base_url: base_url,
25
+ method: method,
26
+ body: body,
27
+ headers: headers,
28
+ query: query,
29
+ path: path
35
30
  )
36
- headers = headers.merge(params: query) if query
37
31
 
38
- begin
39
- response = RestClient::Request.execute(
40
- method: method,
41
- url: full_url(base_url, path),
42
- payload: body,
43
- headers: headers,
44
- log: logger,
45
- **rest_client_options
46
- )
47
- response_parser.parse_response(response, success: true)
48
- rescue RestClient::RequestFailed => e
49
- raise e unless e.response
32
+ response_handler = ResponseHandler.new
33
+ execute_request = proc { RestClient::Request.execute(**options, log: logger, **rest_client_options) }
50
34
 
51
- response_parser.parse_response(e.response, success: false)
35
+ if parse_json
36
+ response_handler.handle_json_response(logger: logger, &execute_request)
37
+ elsif raw_response
38
+ response_handler.handle_response_error(&execute_request)
39
+ else
40
+ response_handler.handle_response(logger: logger, &execute_request)
52
41
  end
53
42
  end
54
43
  end
@@ -0,0 +1,33 @@
1
+ require 'rest_api_builder/url_helper'
2
+
3
+ module RestAPIBuilder
4
+ class RequestOptions
5
+ include RestAPIBuilder::UrlHelper
6
+
7
+ def compose(base_url:, method:, path: nil, body: nil, headers: {}, query: nil)
8
+ if method == :get && body
9
+ raise ArgumentError, 'GET requests do not support body'
10
+ end
11
+
12
+ headers = headers.merge(params: query) if query
13
+
14
+ {
15
+ method: method,
16
+ url: full_url(base_url, path),
17
+ payload: body,
18
+ headers: headers
19
+ }
20
+ end
21
+
22
+ def compose_json(**options)
23
+ result = compose(**options)
24
+ headers = result[:headers]
25
+ payload = result[:payload]
26
+
27
+ result.merge(
28
+ headers: headers.merge(content_type: :json),
29
+ payload: payload && JSON.generate(payload)
30
+ )
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,44 @@
1
+ module RestAPIBuilder
2
+ class ResponseHandler
3
+ def handle_json_response(**options, &block)
4
+ result = handle_response(**options, &block)
5
+ result.merge(body: parse_json(result[:body]))
6
+ end
7
+
8
+ def handle_response(logger: nil, &block)
9
+ result = parse_response(**handle_response_error(&block))
10
+ maybe_log_result(result, logger: logger)
11
+ result
12
+ end
13
+
14
+ def handle_response_error
15
+ response = yield
16
+ { raw_response: response, success: true }
17
+ rescue RestClient::RequestFailed => e
18
+ raise e unless e.response
19
+
20
+ { raw_response: e.response, success: false }
21
+ end
22
+
23
+ private
24
+
25
+ def parse_response(raw_response:, success:)
26
+ {
27
+ success: success,
28
+ status: raw_response.code,
29
+ body: raw_response.body,
30
+ headers: raw_response.headers
31
+ }
32
+ end
33
+
34
+ def maybe_log_result(result, logger:)
35
+ logger && logger << "# => Response: #{result}\n"
36
+ end
37
+
38
+ def parse_json(json)
39
+ JSON.parse(json)
40
+ rescue JSON::ParserError
41
+ json
42
+ end
43
+ end
44
+ end
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'rest_api_builder'
3
- s.version = '0.0.4'
3
+ s.version = '0.0.5'
4
4
  s.summary = "A simple wrapper for rest-client"
5
5
  s.description = "A simple wrapper for rest-client aiming to make creation and testing of API clients easier."
6
6
  s.authors = ["Alexey D"]
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rest_api_builder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexey D
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-27 00:00:00.000000000 Z
11
+ date: 2020-07-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubocop
@@ -63,7 +63,8 @@ files:
63
63
  - README.md
64
64
  - lib/rest_api_builder.rb
65
65
  - lib/rest_api_builder/request.rb
66
- - lib/rest_api_builder/rest_client_response_parser.rb
66
+ - lib/rest_api_builder/request_options.rb
67
+ - lib/rest_api_builder/response_handler.rb
67
68
  - lib/rest_api_builder/url_helper.rb
68
69
  - lib/rest_api_builder/webmock_request_expectations.rb
69
70
  - rest_api_builder.gemspec
@@ -1,39 +0,0 @@
1
- require 'json'
2
-
3
- module RestAPIBuilder
4
- class RestClientResponseParser
5
- def initialize(logger:, parse_json:, raw_response:)
6
- @logger = logger
7
- @parse_json = parse_json
8
- @raw_response = raw_response
9
- end
10
-
11
- def parse_response(response, success:)
12
- return { success: success, raw_response: response } if @raw_response
13
-
14
- body = @parse_json ? parse_json(response.body) : response.body
15
-
16
- result = {
17
- success: success,
18
- status: response.code,
19
- body: body,
20
- headers: response.headers
21
- }
22
- maybe_log_result(result)
23
-
24
- result
25
- end
26
-
27
- private
28
-
29
- def parse_json(json)
30
- JSON.parse(json)
31
- rescue JSON::ParserError
32
- json
33
- end
34
-
35
- def maybe_log_result(result)
36
- @logger && @logger << "# => Response: #{result}\n"
37
- end
38
- end
39
- end