restool 0.1.5 → 0.1.6

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: b9ce87d4cd969d5298ee7c90baef25ac9f2f2c3b725e4ae241a1b00a1b46114b
4
- data.tar.gz: 45766774466195ec86b84048d1aa659302d8cc4b50771a4a73c19246f15d4ec5
3
+ metadata.gz: 939d1069da8b669efb9bc394a55b641ac6ea7a759d0aecf0502d57fb00c26139
4
+ data.tar.gz: 2638de0068c9129d0aa752a79a94d680f857474f64da8da075c045c77bf245e6
5
5
  SHA512:
6
- metadata.gz: f62e492a295bd06e4f8699b19f98d895a66f5fabfd286ac8c64bcc3907194bc3ea463eed3206ee96567fd2793221a295bee8af2cffefa6698e98fbf61acd6e76
7
- data.tar.gz: 379a2006d01cbc9d35e08030f70e690414f77f9d8ce17fe6dc75a8d97a3493daf3b7153dc1d59cbd6b9a18b749accf5e85238ea2d1763bc2f62e97212e77d3ea
6
+ metadata.gz: 76e3401eced2a728940887af09ce40101bd7aaf460e019dc0d4dedc2f36106f6ba807a932fd68956bb62c283904b86919fc1e49c21b60ba8789d1c372b6d2729
7
+ data.tar.gz: 707282f1b15fda1d97b6a71da5bf429f3eab0969ffffa09a9f94beaa81b0a3d32807161273b9f1ed71cd7753c85d9110101ff8e6874405bdbdb2eecfa7523e27
@@ -1,11 +1,12 @@
1
1
  require_relative 'restool/settings/loader'
2
2
  require_relative 'restool/service/restool_service'
3
3
 
4
+ require_relative 'restool/mock/restool'
4
5
 
5
6
  module Restool
6
7
 
7
- def self.create(service_name, &response_handler)
8
- service_config = Restool::Settings::Loader.load(service_name)
8
+ def self.create(service_name, opts = {}, &response_handler)
9
+ service_config = Restool::Settings::Loader.load(service_name, opts)
9
10
 
10
11
  Restool::Service::RestoolService.new(service_config, response_handler)
11
12
  end
@@ -0,0 +1,47 @@
1
+ module Restool
2
+ class RequestLogger
3
+
4
+ def initialize(host, opts)
5
+ @host = host
6
+ @opts = opts
7
+ end
8
+
9
+ def log(request, &http_request)
10
+ log_request(request) if log?
11
+ response = http_request.call
12
+ log_response(response) if log?
13
+
14
+ response
15
+ end
16
+
17
+ def logger
18
+ @opts[:logger]
19
+ end
20
+
21
+ def log?
22
+ if @opts[:log] != nil
23
+ @opts[:log]
24
+ else
25
+ @opts[:logger] != nil
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def log_request(request)
32
+ logger.info { "Restool Service #{@host}" }
33
+ logger.info { "#{request.method.upcase} #{request.path}" }
34
+ logger.info { format_hash(request.headers) }
35
+ logger.debug { format_hash(request.params) }
36
+ end
37
+
38
+ def log_response(response)
39
+ logger.info { "Restool response (status #{response.code})" }
40
+ logger.debug { response.body }
41
+ end
42
+
43
+ def format_hash(headers)
44
+ headers.map { |key, value| "#{key}: #{value}" }.join(", ")
45
+ end
46
+ end
47
+ end
@@ -1,25 +1,32 @@
1
+ require_relative '../settings/loader'
2
+
1
3
  module Restool
2
4
  module Mock
3
- def self.create(service_name, &response_handler)
4
- service_config = Restool::Settings::Loader.load(service_name)
5
-
6
- # remote_client = Restool::Service::RemoteClient.new(service_config.host,
7
- # service_config.verify_ssl,
8
- # service_config.persistent,
9
- # service_config.timeout)
5
+ def self.create(service_name, operation_responses)
6
+ @operation_responses = operation_responses
7
+ @service_config = Restool::Settings::Loader.load(service_name)
10
8
 
11
- class FakeRemoteClient
12
- def initialize
13
- end
9
+ Service.new(@service_config, operation_responses)
10
+ end
14
11
 
15
- def make_request(path, operation_method, params, headers, basic_auth)
12
+ private
16
13
 
17
- end
14
+ class Service
15
+ def initialize(service_config, operation_responses)
16
+ @service_config = service_config
17
+ @operation_responses = operation_responses
18
18
  end
19
19
 
20
+ def method_missing(method, *args, &block)
21
+ if @service_config.operations.map(&:name).include?(method)
22
+ operation_response = @operation_responses[method]
23
+ response_representation = @service_config.operation.response
24
+ representations = @service_config.representations
20
25
 
21
- remote_client = double(make_request)
22
- Restool::Service::RestoolService.new(service_config, response_handler, remote_client)
26
+ Restool::Traversal::Converter.convert(operation_response, response_representation, representations)
27
+ end
28
+ end
23
29
  end
30
+
24
31
  end
25
32
  end
@@ -0,0 +1,15 @@
1
+ module Restool
2
+ class OperationRequest
3
+
4
+ attr_accessor :http_request, :method, :path, :params, :headers
5
+
6
+ def initialize(http_request, method, path, params, headers)
7
+ @http_request = http_request
8
+ @method = method
9
+ @path = path
10
+ @params = params
11
+ @headers = headers
12
+ end
13
+
14
+ end
15
+ end
@@ -1,12 +1,15 @@
1
1
  require 'persistent_http'
2
2
 
3
3
  require_relative 'request_utils'
4
+ require_relative '../logger/request_logger'
4
5
 
5
6
  module Restool
6
7
  module Service
7
8
  class RemoteClient
8
9
 
9
- def initialize(host, verify_ssl, persistent_connection, timeout)
10
+ def initialize(host, verify_ssl, persistent_connection, timeout, opts)
11
+ @request_logger = Restool::RequestLogger.new(host, opts)
12
+
10
13
  @connection = if persistent_connection
11
14
  PersistentHTTP.new(
12
15
  pool_size: persistent_connection.pool_size,
@@ -21,27 +24,25 @@ module Restool
21
24
  else
22
25
  uri = URI.parse(host)
23
26
  http = Net::HTTP.new(uri.host, uri.port)
24
- http.use_ssl = ssl_implied?(uri)
27
+ http.use_ssl = uri.is_a?(URI::HTTPS)
25
28
  http.verify_mode = verify_ssl?(verify_ssl)
26
29
  http.read_timeout = timeout
27
30
  http.open_timeout = timeout
28
- # http.set_debug_output($stdout)
31
+ http.set_debug_output($stdout) if opts[:debug]
29
32
  http
30
33
  end
31
34
  end
32
35
 
33
36
  def make_request(path, method, request_params, headers, basic_auth)
34
- request = RequestUtils.build_request(method, path, request_params, headers, basic_auth)
37
+ operation_request = RequestUtils.build_request(method, path, request_params, headers, basic_auth)
35
38
 
36
- @connection.request(request)
39
+ @request_logger.log(operation_request) do
40
+ @connection.request(operation_request.http_request)
41
+ end
37
42
  end
38
43
 
39
44
  private
40
45
 
41
- def ssl_implied?(uri)
42
- uri.port == 443 || uri.scheme == 'https'
43
- end
44
-
45
46
  def verify_ssl?(verify_ssl_setting)
46
47
  verify_ssl_setting ? OpenSSL::SSL::VERIFY_PEER : OpenSSL::SSL::VERIFY_NONE
47
48
  end
@@ -1,3 +1,5 @@
1
+ require_relative 'operation_request'
2
+
1
3
  module Restool
2
4
  module Service
3
5
  module RequestUtils
@@ -23,7 +25,7 @@ module Restool
23
25
 
24
26
  headers.each { |k, v| request[k] = v } if headers
25
27
 
26
- request
28
+ OperationRequest.new(request, method, path, params, headers)
27
29
  end
28
30
 
29
31
  def self.build_base_request(method, path)
@@ -11,7 +11,7 @@ module Restool
11
11
  @service_config = service_config
12
12
  @response_handler = response_handler
13
13
  @remote_client = Restool::Service::RemoteClient.new(service_config.host, service_config.verify_ssl,
14
- service_config.persistent, service_config.timeout)
14
+ service_config.persistent, service_config.timeout, service_config.opts)
15
15
 
16
16
  define_operations(
17
17
  @service_config, method(:make_request), method(:make_request_with_uri_params)
@@ -11,19 +11,19 @@ module Restool
11
11
  DEFAULT_SSL_VERIFY = false
12
12
 
13
13
 
14
- def self.load(service_name)
14
+ def self.load(service_name, opts)
15
15
  service_config = config['services'].detect do |service|
16
16
  service['name'] == service_name
17
17
  end
18
18
 
19
19
  raise "Service #{service_name} not found in configuration" unless service_config
20
20
 
21
- build_service(service_config)
21
+ build_service(service_config, opts)
22
22
  end
23
23
 
24
24
  private
25
25
 
26
- def self.build_service(service_config)
26
+ def self.build_service(service_config, opts)
27
27
  representations = if service_config['representations']
28
28
  build_representations(service_config['representations'])
29
29
  else
@@ -53,7 +53,8 @@ module Restool
53
53
  service_config['timeout'] || DEFAULT_TIMEOUT,
54
54
  representations,
55
55
  basic_auth,
56
- service_config['ssl_verify'] || DEFAULT_SSL_VERIFY
56
+ service_config['ssl_verify'] || DEFAULT_SSL_VERIFY,
57
+ opts
57
58
  )
58
59
  end
59
60
 
@@ -4,7 +4,7 @@ module Restool
4
4
 
5
5
  Operation = Struct.new(:name, :path, :method, :uri_params, :response)
6
6
  OperationResponse = Struct.new(:fields)
7
- Service = Struct.new(:name, :host, :operations, :persistent, :timeout, :representations, :basic_auth, :verify_ssl)
7
+ Service = Struct.new(:name, :host, :operations, :persistent, :timeout, :representations, :basic_auth, :verify_ssl, :opts)
8
8
  Representation = Struct.new(:name, :fields)
9
9
  RepresentationField = Struct.new(:key, :metonym, :type)
10
10
  BasicAuthentication = Struct.new(:user, :password)
@@ -1,3 +1,3 @@
1
1
  module Restool
2
- VERSION = '0.1.5'
2
+ VERSION = '0.1.6'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: restool
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Juan Andres Zeni
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-29 00:00:00.000000000 Z
11
+ date: 2020-06-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: persistent_http
@@ -33,8 +33,10 @@ extensions: []
33
33
  extra_rdoc_files: []
34
34
  files:
35
35
  - lib/restool.rb
36
+ - lib/restool/logger/request_logger.rb
36
37
  - lib/restool/mock/restool.rb
37
38
  - lib/restool/service/operation_definer.rb
39
+ - lib/restool/service/operation_request.rb
38
40
  - lib/restool/service/remote_client.rb
39
41
  - lib/restool/service/remote_connector.rb
40
42
  - lib/restool/service/request_utils.rb