rest_api_builder 0.1.2 → 0.1.3
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/lib/rest_api_builder.rb +3 -28
- data/lib/rest_api_builder/api_client.rb +16 -0
- data/lib/rest_api_builder/helpers/string_helper.rb +15 -0
- data/lib/rest_api_builder/helpers/url_helper.rb +15 -0
- data/lib/rest_api_builder/request.rb +18 -0
- data/lib/rest_api_builder/request/request_options.rb +37 -0
- data/lib/rest_api_builder/request/response_handler.rb +48 -0
- data/lib/rest_api_builder/webmock_request_expectations.rb +2 -2
- data/rest_api_builder.gemspec +1 -1
- metadata +8 -5
- data/lib/rest_api_builder/request_options.rb +0 -33
- data/lib/rest_api_builder/response_handler.rb +0 -46
- data/lib/rest_api_builder/url_helper.rb +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7044c0a51394cd9997b23d7c1189e32a3342cdc63c5b2d15faff2050857d8114
|
4
|
+
data.tar.gz: 77684c0bc571a4b424f9e5624bbc25eafd45246b954c0ad1b7f2a2ba20535649
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e4efb71298656b1703b9b147dfdb9901cb94ab70bc74c013224439270211d9ad92357d7886d0355491eea22bf9b368e33db1a111096da1e643a6dd7807c067c1
|
7
|
+
data.tar.gz: 5562e548abb6dc0c8798e6fbe238d07110f41a9bcf8953c31286178dc26d3b6170f22fef14140241e1a47ae43d4482765f9b473db6aee1640432ae347ce38908
|
data/lib/rest_api_builder.rb
CHANGED
@@ -1,32 +1,7 @@
|
|
1
1
|
require 'forwardable'
|
2
|
-
require 'rest_api_builder/
|
3
|
-
require 'rest_api_builder/
|
2
|
+
require 'rest_api_builder/request'
|
3
|
+
require 'rest_api_builder/api_client'
|
4
4
|
|
5
5
|
module RestAPIBuilder
|
6
|
-
|
7
|
-
extend Forwardable
|
8
|
-
|
9
|
-
def initialize
|
10
|
-
@request_options = RequestOptions.new
|
11
|
-
@response_handler = ResponseHandler.new
|
12
|
-
end
|
13
|
-
|
14
|
-
def_delegator :@request_options, :compose, :compose_request_options
|
15
|
-
def_delegator :@request_options, :compose_json, :compose_json_request_options
|
16
|
-
|
17
|
-
def_delegators :@response_handler, :handle_response, :handle_json_response, :handle_response_error
|
18
|
-
end
|
19
|
-
|
20
|
-
extend Forwardable
|
21
|
-
|
22
|
-
def_delegators :rest_api_builder_helpers,
|
23
|
-
:compose_request_options,
|
24
|
-
:compose_json_request_options,
|
25
|
-
:handle_response,
|
26
|
-
:handle_json_response,
|
27
|
-
:handle_response_error
|
28
|
-
|
29
|
-
def rest_api_builder_helpers
|
30
|
-
APIHelpers.new
|
31
|
-
end
|
6
|
+
include RestAPIBuilder::Request
|
32
7
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'rest_api_builder/helpers/string_helper'
|
2
|
+
|
3
|
+
module RestAPIBuilder
|
4
|
+
module APIClient
|
5
|
+
def define_resource_shortcuts(resources, resources_scope:, init_with:)
|
6
|
+
resources.each do |name|
|
7
|
+
class_name = RestAPIBuilder::Helpers::StringHelper.camelize(name.to_s)
|
8
|
+
resource_class = Object.const_get("#{resources_scope}::#{class_name}")
|
9
|
+
|
10
|
+
define_singleton_method(name) do
|
11
|
+
init_with.call(resource_class)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module RestAPIBuilder
|
2
|
+
module Helpers
|
3
|
+
module StringHelper
|
4
|
+
module_function
|
5
|
+
|
6
|
+
# From https://apidock.com/rails/String/camelize
|
7
|
+
def camelize(string)
|
8
|
+
string
|
9
|
+
.sub(/^[a-z\d]*/, &:capitalize)
|
10
|
+
.gsub(/(?:_|(\/))([a-z\d]*)/) { "#{Regexp.last_match(1)}#{Regexp.last_match(2).capitalize}" }
|
11
|
+
.gsub("/", "::")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
require 'rest_api_builder/request/request_options'
|
3
|
+
require 'rest_api_builder/request/response_handler'
|
4
|
+
|
5
|
+
module RestAPIBuilder
|
6
|
+
module Request
|
7
|
+
extend Forwardable
|
8
|
+
|
9
|
+
def_delegators RestAPIBuilder::Request::RequestOptions,
|
10
|
+
:compose_request_options,
|
11
|
+
:compose_json_request_options
|
12
|
+
|
13
|
+
def_delegators RestAPIBuilder::Request::ResponseHandler,
|
14
|
+
:handle_response,
|
15
|
+
:handle_json_response,
|
16
|
+
:handle_response_error
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'rest_api_builder/helpers/url_helper'
|
2
|
+
|
3
|
+
module RestAPIBuilder
|
4
|
+
module Request
|
5
|
+
module RequestOptions
|
6
|
+
extend RestAPIBuilder::Helpers::UrlHelper
|
7
|
+
|
8
|
+
module_function
|
9
|
+
|
10
|
+
def compose_request_options(base_url:, method:, path: nil, body: nil, headers: {}, query: nil)
|
11
|
+
if method == :get && body
|
12
|
+
raise ArgumentError, 'GET requests do not support body'
|
13
|
+
end
|
14
|
+
|
15
|
+
headers = headers.merge(params: query) if query
|
16
|
+
|
17
|
+
{
|
18
|
+
method: method,
|
19
|
+
url: full_url(base_url, path),
|
20
|
+
payload: body,
|
21
|
+
headers: headers
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
def compose_json_request_options(**options)
|
26
|
+
result = compose_request_options(**options)
|
27
|
+
headers = result[:headers]
|
28
|
+
payload = result[:payload]
|
29
|
+
|
30
|
+
result.merge(
|
31
|
+
headers: headers.merge(content_type: :json),
|
32
|
+
payload: payload && JSON.generate(payload)
|
33
|
+
)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'rest-client'
|
2
|
+
|
3
|
+
module RestAPIBuilder
|
4
|
+
module Request
|
5
|
+
module ResponseHandler
|
6
|
+
module_function
|
7
|
+
|
8
|
+
def handle_json_response(**options, &block)
|
9
|
+
result = handle_response(**options, &block)
|
10
|
+
result.merge(body: parse_json(result[:body]))
|
11
|
+
end
|
12
|
+
|
13
|
+
def handle_response(logger: nil, &block)
|
14
|
+
result = parse_response(**handle_response_error(&block))
|
15
|
+
maybe_log_result(result, logger: logger)
|
16
|
+
result
|
17
|
+
end
|
18
|
+
|
19
|
+
def handle_response_error
|
20
|
+
response = yield
|
21
|
+
{ raw_response: response, success: true }
|
22
|
+
rescue RestClient::RequestFailed => e
|
23
|
+
raise e unless e.response
|
24
|
+
|
25
|
+
{ raw_response: e.response, success: false }
|
26
|
+
end
|
27
|
+
|
28
|
+
def parse_response(raw_response:, success:)
|
29
|
+
{
|
30
|
+
success: success,
|
31
|
+
status: raw_response.code,
|
32
|
+
body: raw_response.body,
|
33
|
+
headers: raw_response.headers
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
def maybe_log_result(result, logger:)
|
38
|
+
logger && logger << "# => Response: #{result}\n"
|
39
|
+
end
|
40
|
+
|
41
|
+
def parse_json(json)
|
42
|
+
JSON.parse(json)
|
43
|
+
rescue JSON::ParserError
|
44
|
+
json
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'webmock'
|
2
|
-
require 'rest_api_builder/url_helper'
|
2
|
+
require 'rest_api_builder/helpers/url_helper'
|
3
3
|
|
4
4
|
module RestAPIBuilder
|
5
5
|
class WebMockRequestExpectationsSingleton
|
6
6
|
include WebMock::API
|
7
|
-
include RestAPIBuilder::UrlHelper
|
7
|
+
include RestAPIBuilder::Helpers::UrlHelper
|
8
8
|
|
9
9
|
def expect_json_execute(response: nil, **options)
|
10
10
|
if response && response[:body]
|
data/rest_api_builder.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'rest_api_builder'
|
3
|
-
s.version = '0.1.
|
3
|
+
s.version = '0.1.3'
|
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.1.
|
4
|
+
version: 0.1.3
|
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-09-
|
11
|
+
date: 2020-09-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubocop
|
@@ -62,9 +62,12 @@ files:
|
|
62
62
|
- LICENSE
|
63
63
|
- README.md
|
64
64
|
- lib/rest_api_builder.rb
|
65
|
-
- lib/rest_api_builder/
|
66
|
-
- lib/rest_api_builder/
|
67
|
-
- lib/rest_api_builder/url_helper.rb
|
65
|
+
- lib/rest_api_builder/api_client.rb
|
66
|
+
- lib/rest_api_builder/helpers/string_helper.rb
|
67
|
+
- lib/rest_api_builder/helpers/url_helper.rb
|
68
|
+
- lib/rest_api_builder/request.rb
|
69
|
+
- lib/rest_api_builder/request/request_options.rb
|
70
|
+
- lib/rest_api_builder/request/response_handler.rb
|
68
71
|
- lib/rest_api_builder/webmock_request_expectations.rb
|
69
72
|
- rest_api_builder.gemspec
|
70
73
|
homepage: https://github.com/alexeyds/rest_api_builder
|
@@ -1,33 +0,0 @@
|
|
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
|
@@ -1,46 +0,0 @@
|
|
1
|
-
require 'rest-client'
|
2
|
-
|
3
|
-
module RestAPIBuilder
|
4
|
-
class ResponseHandler
|
5
|
-
def handle_json_response(**options, &block)
|
6
|
-
result = handle_response(**options, &block)
|
7
|
-
result.merge(body: parse_json(result[:body]))
|
8
|
-
end
|
9
|
-
|
10
|
-
def handle_response(logger: nil, &block)
|
11
|
-
result = parse_response(**handle_response_error(&block))
|
12
|
-
maybe_log_result(result, logger: logger)
|
13
|
-
result
|
14
|
-
end
|
15
|
-
|
16
|
-
def handle_response_error
|
17
|
-
response = yield
|
18
|
-
{ raw_response: response, success: true }
|
19
|
-
rescue RestClient::RequestFailed => e
|
20
|
-
raise e unless e.response
|
21
|
-
|
22
|
-
{ raw_response: e.response, success: false }
|
23
|
-
end
|
24
|
-
|
25
|
-
private
|
26
|
-
|
27
|
-
def parse_response(raw_response:, success:)
|
28
|
-
{
|
29
|
-
success: success,
|
30
|
-
status: raw_response.code,
|
31
|
-
body: raw_response.body,
|
32
|
-
headers: raw_response.headers
|
33
|
-
}
|
34
|
-
end
|
35
|
-
|
36
|
-
def maybe_log_result(result, logger:)
|
37
|
-
logger && logger << "# => Response: #{result}\n"
|
38
|
-
end
|
39
|
-
|
40
|
-
def parse_json(json)
|
41
|
-
JSON.parse(json)
|
42
|
-
rescue JSON::ParserError
|
43
|
-
json
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|