restool 0.1.1 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
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
  - - ">="