restool 0.1.1 → 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: 037a0d2760186255d1e6e19aa80307a0cfe00c617df4c15c85eb6148d167b143
4
- data.tar.gz: 03f9ab4693211541306a9ef47dc471333e8769b26a60926826e8f3406c9d250d
3
+ metadata.gz: 939d1069da8b669efb9bc394a55b641ac6ea7a759d0aecf0502d57fb00c26139
4
+ data.tar.gz: 2638de0068c9129d0aa752a79a94d680f857474f64da8da075c045c77bf245e6
5
5
  SHA512:
6
- metadata.gz: 9166a80ee4927346fbb2562f2dd6d93115636fa43d42764dc18bb200bf207b16dbe08f94f4cff6f90b3f29f6e27b32ce882dea4fd8c8cbc8cec8f0210a997248
7
- data.tar.gz: 3702698b11aa24a5f47f20eee1a1314c155b683c8623a307fdd477eb4ea3e7fa6df08c1beb09548669fdd6a9f5c5bf4544f272f2a1eec234581c25521bd4024d
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
@@ -0,0 +1,32 @@
1
+ require_relative '../settings/loader'
2
+
3
+ module Restool
4
+ module Mock
5
+ def self.create(service_name, operation_responses)
6
+ @operation_responses = operation_responses
7
+ @service_config = Restool::Settings::Loader.load(service_name)
8
+
9
+ Service.new(@service_config, operation_responses)
10
+ end
11
+
12
+ private
13
+
14
+ class Service
15
+ def initialize(service_config, operation_responses)
16
+ @service_config = service_config
17
+ @operation_responses = operation_responses
18
+ end
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
25
+
26
+ Restool::Traversal::Converter.convert(operation_response, response_representation, representations)
27
+ end
28
+ end
29
+ end
30
+
31
+ end
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
 
@@ -105,7 +106,7 @@ module Restool
105
106
  def self.config
106
107
  return @config if @config
107
108
 
108
- files_to_load = Dir['config/restool/*'] + ['config/restool.yml', 'config/restool.json']
109
+ files_to_load = Dir['config/restool/*.yml'] + Dir['config/restool/*.yaml'] + ['config/restool.yml', 'config/restool.yaml', 'config/restool.json']
109
110
 
110
111
  @config = { 'services' => [] }
111
112
 
@@ -114,12 +115,12 @@ module Restool
114
115
 
115
116
  extension = File.extname(file_name)
116
117
 
117
- content = if extension == '.yml'
118
- YAML.load_file(file_name)
119
- elsif extension == '.json'
120
- json_file = File.read(file_name)
121
- JSON.parse(json_file)
122
- end
118
+ content = if extension == '.yml' || extension == '.yaml'
119
+ YAML.load_file(file_name)
120
+ elsif extension == '.json'
121
+ json_file = File.read(file_name)
122
+ JSON.parse(json_file)
123
+ end
123
124
 
124
125
  @config['services'] += content['services']
125
126
  end
@@ -127,10 +128,6 @@ module Restool
127
128
  @config
128
129
  end
129
130
 
130
- def self.validate
131
- # TODO: perform validations
132
- end
133
-
134
131
  end
135
132
  end
136
133
  end
@@ -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)
@@ -19,6 +19,9 @@ module Restool
19
19
  def self.convert(request_response, response_representation, representations)
20
20
  object = Restool::Traversal::Object.new
21
21
 
22
+ object.class.__send__(:attr_accessor, :_raw)
23
+ object.__send__("_raw=", request_response)
24
+
22
25
  if request_response.is_a?(Array)
23
26
  request_response.map do |element|
24
27
  map_response_to_representation(response_representation, element, object, representations)
@@ -32,10 +35,15 @@ module Restool
32
35
 
33
36
  def self.map_response_to_representation(representation, request_response, object, representations)
34
37
  representation.fields.each do |field|
35
- value = request_response[field.key]
38
+ value = request_response[field.key.to_s] || request_response[field.key.to_sym]
36
39
 
37
40
  object.class.__send__(:attr_accessor, var_name(field))
38
41
 
42
+ if value.nil?
43
+ set_var(object, field, nil)
44
+ next
45
+ end
46
+
39
47
  if Restool::Traversal::TRAVERSAL_TYPES.include?(field.type.to_sym)
40
48
  map_primitive_field(value, field, object)
41
49
  else
@@ -53,7 +61,7 @@ module Restool
53
61
  parse_value(field.type, value)
54
62
  end
55
63
 
56
- object.__send__("#{var_name(field)}=", new_value)
64
+ set_var(object, field, new_value)
57
65
  end
58
66
 
59
67
  def self.map_complex_field(value, field, object, representations)
@@ -65,6 +73,10 @@ module Restool
65
73
  convert(value, operation_representation, representations)
66
74
  end
67
75
 
76
+ set_var(object, field, new_value)
77
+ end
78
+
79
+ def self.set_var(object, field, new_value)
68
80
  object.__send__("#{var_name(field)}=", new_value)
69
81
  end
70
82
 
@@ -75,7 +87,7 @@ module Restool
75
87
  def self.parse_value(type, value)
76
88
  case type
77
89
  when Restool::Traversal::TRAVERSAL_TYPE_STRING
78
- value
90
+ value.to_s
79
91
  when Restool::Traversal::TRAVERSAL_TYPE_INTEGER
80
92
  Integer(value)
81
93
  when Restool::Traversal::TRAVERSAL_TYPE_DECIMAL
@@ -1,17 +1,5 @@
1
1
  module Restool
2
2
  module Traversal
3
- class Object
4
-
5
- def to_hash
6
- instance_variables
7
- .inject({}) do |acum, var|
8
- acum[var.to_s.delete('@')] = instance_variable_get(var)
9
- acum
10
- end
11
- end
12
-
13
- alias_method :to_h, :to_hash
14
-
15
- end
3
+ class Object; end
16
4
  end
17
5
  end
@@ -1,3 +1,3 @@
1
1
  module Restool
2
- VERSION = "0.1.1"
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.1
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-04-12 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,7 +33,10 @@ extensions: []
33
33
  extra_rdoc_files: []
34
34
  files:
35
35
  - lib/restool.rb
36
+ - lib/restool/logger/request_logger.rb
37
+ - lib/restool/mock/restool.rb
36
38
  - lib/restool/service/operation_definer.rb
39
+ - lib/restool/service/operation_request.rb
37
40
  - lib/restool/service/remote_client.rb
38
41
  - lib/restool/service/remote_connector.rb
39
42
  - lib/restool/service/request_utils.rb
@@ -56,7 +59,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
56
59
  requirements:
57
60
  - - ">="
58
61
  - !ruby/object:Gem::Version
59
- version: 2.3.0
62
+ version: '0'
60
63
  required_rubygems_version: !ruby/object:Gem::Requirement
61
64
  requirements:
62
65
  - - ">="