minato_error_handler 0.1.2.pre.9 → 0.1.2

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: aa11977b026f5b1559817ddafd9f77418d66e69bd2a543bba9d586c99d236bb2
4
- data.tar.gz: cf0d78fc8750b6615c41196e012c9653c7881ad14f855960e37625f706c4e880
3
+ metadata.gz: 6dc9c58925db88b167dada6c2d68e633403a0c3bafe95ef8d3f55f445c8ae0a3
4
+ data.tar.gz: 1eb7c12bbb02ec88019476c6062eeb49d1e496c6778488c706e5057f58abf4b9
5
5
  SHA512:
6
- metadata.gz: 18b18c93a8a15ec3ada9e8b02137b84869df8fd67b4c2607ee468a9c91240d5f9c45a7b7fb739d0097da82a76bdbdaed4dcd3b93206eb617c24ad0ad6cf6328b
7
- data.tar.gz: 774ab7d5aff548411433d47f79a672dee1cf101ebc2fbfc855a8624233197b47b7b8f087499616a818f397db814538c2147cc3a3ebb52d607d80003bad97a5ae
6
+ metadata.gz: eaf3b474dbb49763a751e05e32ee7ba108e5a504d07cebd0d14b5064fe1551b3d60e05f8a1d3d8441678b195e5a346da21dd5dad221f671e5b36218631a3e1e8
7
+ data.tar.gz: 8239f273e1dab47c46aea4216793d30b46c236197bb85a10ff380c0e04d1c2914f2a3c030e15d0735e7257fb9dd260439a233929e4001de7fb54ebdd56a51d23
@@ -1,72 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "minato_logger"
4
+
3
5
  module MinatoErrorHandler
4
6
  module ErrorHandler
5
7
  extend ActiveSupport::Concern
6
8
 
7
- included do |base|
9
+ included do
8
10
  rescue_from StandardError, with: :handle
9
-
10
- base.extend ClassMethods
11
11
  end
12
12
 
13
13
  private
14
14
 
15
15
  def handle(exception)
16
- error = parse_error(exception)
17
- report_error error
18
- render_error error
19
- end
20
-
21
- def parse_error(error)
22
- return parse_minato_error(error) if minato_error?(error)
23
-
24
- build_minato_error(error)
25
- end
26
-
27
- def parse_minato_error(error)
28
- error.http_request ||= request
29
- error.http_response ||= response
30
- error
31
- end
32
-
33
- def minato_error?(error)
34
- error.is_a?(MinatoErrorHandler::Errors::MinatoError)
35
- end
36
-
37
- def error_class
38
- self.class.default_error_class || MinatoErrorHandler::Errors::UnknowError
39
- end
40
-
41
- def build_minato_error(error)
42
- minato_error = error_class.new
43
- minato_error.caused_by = error.full_message
44
- minato_error.backtrace = error.backtrace
45
- minato_error.http_request ||= request
46
- minato_error.http_response ||= response
47
- minato_error
16
+ error = MinatoErrorHandler::MinatoError.from_error(exception)
17
+ report_error(error)
18
+ render json: { errors: [error.to_json] }, status: error.status_code
48
19
  end
49
20
 
50
21
  def report_error(error)
51
- Rails.logger.error(error.as_json)
52
- end
53
-
54
- def render_error(error)
55
- render json: { errors: [error.json_response] }, status: error.status_code
56
- end
57
-
58
- module ClassMethods
59
- def default_error(klass)
60
- # rubocop:disable Style/ClassVars
61
- class_variable_set(:@@default_error_class, klass.to_s.camelize.constantize)
62
- # rubocop:enable Style/ClassVars
63
- end
64
-
65
- def default_error_class
66
- return nil unless class_variable_defined? :@@default_error_class
67
-
68
- class_variable_get(:@@default_error_class)
69
- end
22
+ logger = MinatoLogger::Logger.new
23
+ logger.error(error.to_json)
70
24
  end
71
25
  end
72
26
  end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "securerandom"
4
+ require "json"
5
+
6
+ module MinatoErrorHandler
7
+ class MinatoError < StandardError
8
+ def initialize(details: {}, caused_by: nil, status_code: 500)
9
+ @caused_by = caused_by
10
+ @details = details
11
+ @status_code = status_code
12
+ super
13
+ end
14
+
15
+ def self.from_error(error)
16
+ return error if error.is_a?(MinatoErrorHandler::MinatoError)
17
+
18
+ new caused_by: error.cause
19
+ end
20
+
21
+ attr_reader :details, :status_code
22
+
23
+ def message
24
+ "An unknow error has occurred!"
25
+ end
26
+
27
+ def code
28
+ self.class.name
29
+ end
30
+
31
+ def unique_identfier
32
+ @unique_identfier || SecureRandom.uuid
33
+ end
34
+
35
+ def caused_by
36
+ @caused_by || cause
37
+ end
38
+
39
+ def serialized_hash
40
+ { message: message, code: code, unique_identfier: unique_identfier,
41
+ details: details, caused_by: caused_by, status_code: status_code }
42
+ end
43
+
44
+ def to_json(*_args)
45
+ serialized_hash.as_json
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MinatoErrorHandler
4
+ class NetworkError < MinatoErrorHandler::MinatoError
5
+ def initialize(details: {}, caused_by: nil, status_code: nil, request_body: {})
6
+ @request_body = request_body
7
+ super(details: details, caused_by: caused_by, status_code: status_code)
8
+ end
9
+
10
+ attr_reader :request_body
11
+
12
+ def message
13
+ "A network error has occurred!"
14
+ end
15
+
16
+ def serialized_hash
17
+ super.merge({ request_body: request_body })
18
+ end
19
+ end
20
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MinatoErrorHandler
4
- VERSION = "0.1.2-9"
4
+ VERSION = "0.1.2"
5
5
  end
@@ -2,7 +2,6 @@
2
2
 
3
3
  require "minato_error_handler/railtie"
4
4
  require "minato_error_handler/version"
5
- require "minato_error_handler/errors/minato_error"
6
- require "minato_error_handler/errors/network_error"
7
- require "minato_error_handler/errors/unknow_error"
5
+ require "minato_error_handler/minato_error"
6
+ require "minato_error_handler/network_error"
8
7
  require "minato_error_handler/error_handler"
@@ -32,6 +32,7 @@ Gem::Specification.new do |spec|
32
32
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
33
33
  spec.require_paths = ["lib"]
34
34
 
35
+ spec.add_dependency "minato_logger", "~>0.1.6"
35
36
  spec.add_dependency "rails", ">= 7.0.4"
36
37
 
37
38
  # Uncomment to register a new dependency of your gem
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minato_error_handler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2.pre.9
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ferreri
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-12-18 00:00:00.000000000 Z
11
+ date: 2023-11-28 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: minato_logger
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.1.6
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.1.6
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: rails
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -24,7 +38,7 @@ dependencies:
24
38
  - - ">="
25
39
  - !ruby/object:Gem::Version
26
40
  version: 7.0.4
27
- description:
41
+ description:
28
42
  email:
29
43
  - contato@ferreri.co
30
44
  executables: []
@@ -43,9 +57,8 @@ files:
43
57
  - compose.yml
44
58
  - lib/minato_error_handler.rb
45
59
  - lib/minato_error_handler/error_handler.rb
46
- - lib/minato_error_handler/errors/minato_error.rb
47
- - lib/minato_error_handler/errors/network_error.rb
48
- - lib/minato_error_handler/errors/unknow_error.rb
60
+ - lib/minato_error_handler/minato_error.rb
61
+ - lib/minato_error_handler/network_error.rb
49
62
  - lib/minato_error_handler/railtie.rb
50
63
  - lib/minato_error_handler/version.rb
51
64
  - minato_error_handler.gemspec
@@ -58,7 +71,7 @@ metadata:
58
71
  source_code_uri: https://gitlab.com/ferreri/minato/minato_error_handler
59
72
  changelog_uri: https://gitlab.com/ferreri/minato/minato_error_handler/-/blob/main/CHANGELOG.md?ref_type=heads
60
73
  rubygems_mfa_required: 'false'
61
- post_install_message:
74
+ post_install_message:
62
75
  rdoc_options: []
63
76
  require_paths:
64
77
  - lib
@@ -69,12 +82,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
69
82
  version: 2.6.0
70
83
  required_rubygems_version: !ruby/object:Gem::Requirement
71
84
  requirements:
72
- - - ">"
85
+ - - ">="
73
86
  - !ruby/object:Gem::Version
74
- version: 1.3.1
87
+ version: '0'
75
88
  requirements: []
76
- rubygems_version: 3.4.10
77
- signing_key:
89
+ rubygems_version: 3.1.6
90
+ signing_key:
78
91
  specification_version: 4
79
92
  summary: Error reporting for Minato Rails Apps.
80
93
  test_files: []
@@ -1,99 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "securerandom"
4
- require "json"
5
-
6
- module MinatoErrorHandler
7
- module Errors
8
- class MinatoError < StandardError
9
- attr_accessor :caused_by, :details, :debug_details
10
- attr_reader :http_request, :http_response
11
-
12
- def message
13
- raise_method_not_implemented_error __method__
14
- end
15
-
16
- def status_code
17
- raise_method_not_implemented_error __method__
18
- end
19
-
20
- def code
21
- self.class.name
22
- end
23
-
24
- def backtrace=(backtrace)
25
- set_backtrace(backtrace)
26
- end
27
-
28
- def unique_identifier
29
- @unique_identifier ||= SecureRandom.uuid
30
- end
31
-
32
- def to_json(*_args)
33
- serialized_hash(serializable_methods_to_log).to_json
34
- end
35
-
36
- def as_json
37
- serialized_hash(serializable_methods_to_log).as_json
38
- end
39
-
40
- def json_response
41
- serialized_hash(serializable_methods_to_response).as_json
42
- end
43
-
44
- def http_request=(req)
45
- return if req.nil?
46
-
47
- @http_request = { headers: parse_http_request_headers(req.headers), host: req.host,
48
- method: req.request_method, path: req.path, query: req.query_parameters,
49
- remote: req.remote_ip, scheme: req.scheme }
50
- end
51
-
52
- def http_response=(res)
53
- return if res.nil?
54
-
55
- @http_response = { headers: parse_http_response_headers(res.headers),
56
- status: res.status,
57
- text_status: res.status_message }
58
- end
59
-
60
- def stack_trace
61
- backtrace
62
- end
63
-
64
- private
65
-
66
- def serializable_methods_to_log
67
- %i[caused_by code details debug_details message http_request
68
- http_response status_code unique_identifier stack_trace]
69
- end
70
-
71
- def serializable_methods_to_response
72
- methods_to_exclude = %i[http_request http_response stack_trace debug_details]
73
- serializable_methods_to_log.reject { |m| methods_to_exclude.include? m }
74
- end
75
-
76
- def serialized_hash(methods)
77
- data = {}
78
- methods.each do |method|
79
- data[method] = send(method)
80
- end
81
- data
82
- end
83
-
84
- def parse_http_request_headers(headers)
85
- selected_headers = headers.env.filter { |k, _v| k.upcase.start_with? "HTTP" }
86
- selected_headers.transform_keys! { |k| k.gsub(/\bHTTP_/, "").downcase }
87
- selected_headers
88
- end
89
-
90
- def parse_http_response_headers(headers)
91
- headers.transform_keys(&:downcase)
92
- end
93
-
94
- def raise_method_not_implemented_error(method_name)
95
- raise "You must define \"#{method_name}\" in your concrete class."
96
- end
97
- end
98
- end
99
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module MinatoErrorHandler
4
- module Errors
5
- class NetworkError < MinatoErrorHandler::Errors::MinatoError
6
- attr_accessor :req, :res
7
-
8
- def initialize(req: nil, res: nil)
9
- @req = req
10
- @res = res
11
- super()
12
- end
13
-
14
- def message
15
- "A network error has occurred!"
16
- end
17
-
18
- def status_code
19
- 503
20
- end
21
-
22
- def debug_details
23
- { request: req, response: res }
24
- end
25
- end
26
- end
27
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module MinatoErrorHandler
4
- module Errors
5
- class UnknowError < MinatoError
6
- def message
7
- "An unknow error has occurred! See more details in caused_by field."
8
- end
9
-
10
- def status_code
11
- 500
12
- end
13
- end
14
- end
15
- end