minato_error_handler 0.1.2 → 0.1.4

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: 6dc9c58925db88b167dada6c2d68e633403a0c3bafe95ef8d3f55f445c8ae0a3
4
- data.tar.gz: 1eb7c12bbb02ec88019476c6062eeb49d1e496c6778488c706e5057f58abf4b9
3
+ metadata.gz: 988d987bdc7a0593533084b7fc83288fe7f64ece3cfeba4594db9b4a8532b56b
4
+ data.tar.gz: 8119087acb2dfc744d0aa02451f2a9d1b9132f85fcc598124b09d364d25136dc
5
5
  SHA512:
6
- metadata.gz: eaf3b474dbb49763a751e05e32ee7ba108e5a504d07cebd0d14b5064fe1551b3d60e05f8a1d3d8441678b195e5a346da21dd5dad221f671e5b36218631a3e1e8
7
- data.tar.gz: 8239f273e1dab47c46aea4216793d30b46c236197bb85a10ff380c0e04d1c2914f2a3c030e15d0735e7257fb9dd260439a233929e4001de7fb54ebdd56a51d23
6
+ metadata.gz: 2d8820cace6d1019446059434765cae6918207f6bc0642bac9f07d29134dabe47684448f6f902ade6a650d79eba636b79d31fdd7f629bcbeac518fad798bc352
7
+ data.tar.gz: de8b0ba7c9fe5345854e69339d77949d869ec2e03c360f56af6fcfc8f75a8f0a21595db942a3f92e8cd08dfdd9ec4af6d5862de5b948b616b89c3706e9e88dba
@@ -1,26 +1,72 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "minato_logger"
4
-
5
3
  module MinatoErrorHandler
6
4
  module ErrorHandler
7
5
  extend ActiveSupport::Concern
8
6
 
9
- included do
7
+ included do |base|
10
8
  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 = MinatoErrorHandler::MinatoError.from_error(exception)
17
- report_error(error)
18
- render json: { errors: [error.to_json] }, status: error.status_code
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
19
48
  end
20
49
 
21
50
  def report_error(error)
22
- logger = MinatoLogger::Logger.new
23
- logger.error(error.to_json)
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
24
70
  end
25
71
  end
26
72
  end
@@ -0,0 +1,107 @@
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 error_reporting_type
17
+ "type.googleapis.com/google.devtools.clouderrorreporting.v1beta1.ReportedErrorEvent"
18
+ end
19
+
20
+ def status_code
21
+ raise_method_not_implemented_error __method__
22
+ end
23
+
24
+ def code
25
+ self.class.name
26
+ end
27
+
28
+ def backtrace=(backtrace)
29
+ set_backtrace(backtrace)
30
+ end
31
+
32
+ def unique_identifier
33
+ @unique_identifier ||= SecureRandom.uuid
34
+ end
35
+
36
+ def to_json(*_args)
37
+ serialized_hash(serializable_methods_to_log).to_json
38
+ end
39
+
40
+ def as_json
41
+ serialized_hash(serializable_methods_to_log).as_json
42
+ end
43
+
44
+ def json_response
45
+ serialized_hash(serializable_methods_to_response).as_json
46
+ end
47
+
48
+ def http_request=(req)
49
+ return if req.nil?
50
+
51
+ @http_request = { headers: parse_http_request_headers(req.headers), host: req.host,
52
+ method: req.request_method, path: req.path, query: req.query_parameters,
53
+ remote: req.remote_ip, scheme: req.scheme }
54
+ end
55
+
56
+ def http_response=(res)
57
+ return if res.nil?
58
+
59
+ @http_response = { headers: parse_http_response_headers(res.headers),
60
+ status: res.status,
61
+ text_status: res.status_message }
62
+ end
63
+
64
+ def stack_trace
65
+ backtrace
66
+ end
67
+
68
+ private
69
+
70
+ def serializable_methods_to_log
71
+ %i[caused_by code details debug_details message http_request
72
+ http_response status_code unique_identifier stack_trace @type]
73
+ end
74
+
75
+ def serializable_methods_to_response
76
+ methods_to_exclude = %i[http_request http_response stack_trace debug_details]
77
+ serializable_methods_to_log.reject { |m| methods_to_exclude.include? m }
78
+ end
79
+
80
+ def serialized_hash(methods)
81
+ data = {}
82
+ methods.each do |method|
83
+ if method == :@type
84
+ data["@type"] = error_reporting_type
85
+ else
86
+ data[method] = send(method)
87
+ end
88
+ end
89
+ data
90
+ end
91
+
92
+ def parse_http_request_headers(headers)
93
+ selected_headers = headers.env.filter { |k, _v| k.upcase.start_with? "HTTP" }
94
+ selected_headers.transform_keys! { |k| k.gsub(/\bHTTP_/, "").downcase }
95
+ selected_headers
96
+ end
97
+
98
+ def parse_http_response_headers(headers)
99
+ headers.transform_keys(&:downcase)
100
+ end
101
+
102
+ def raise_method_not_implemented_error(method_name)
103
+ raise "You must define \"#{method_name}\" in your concrete class."
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,27 @@
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
@@ -0,0 +1,15 @@
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MinatoErrorHandler
4
- VERSION = "0.1.2"
4
+ VERSION = "0.1.4"
5
5
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "minato_error_handler/railtie"
4
4
  require "minato_error_handler/version"
5
- require "minato_error_handler/minato_error"
6
- require "minato_error_handler/network_error"
5
+ require "minato_error_handler/errors/minato_error"
6
+ require "minato_error_handler/errors/network_error"
7
+ require "minato_error_handler/errors/unknow_error"
7
8
  require "minato_error_handler/error_handler"
@@ -32,7 +32,6 @@ 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"
36
35
  spec.add_dependency "rails", ">= 7.0.4"
37
36
 
38
37
  # Uncomment to register a new dependency of your gem
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minato_error_handler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.4
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-11-28 00:00:00.000000000 Z
11
+ date: 2024-01-02 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
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: rails
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -38,7 +24,7 @@ dependencies:
38
24
  - - ">="
39
25
  - !ruby/object:Gem::Version
40
26
  version: 7.0.4
41
- description:
27
+ description:
42
28
  email:
43
29
  - contato@ferreri.co
44
30
  executables: []
@@ -57,8 +43,9 @@ files:
57
43
  - compose.yml
58
44
  - lib/minato_error_handler.rb
59
45
  - lib/minato_error_handler/error_handler.rb
60
- - lib/minato_error_handler/minato_error.rb
61
- - lib/minato_error_handler/network_error.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
62
49
  - lib/minato_error_handler/railtie.rb
63
50
  - lib/minato_error_handler/version.rb
64
51
  - minato_error_handler.gemspec
@@ -71,7 +58,7 @@ metadata:
71
58
  source_code_uri: https://gitlab.com/ferreri/minato/minato_error_handler
72
59
  changelog_uri: https://gitlab.com/ferreri/minato/minato_error_handler/-/blob/main/CHANGELOG.md?ref_type=heads
73
60
  rubygems_mfa_required: 'false'
74
- post_install_message:
61
+ post_install_message:
75
62
  rdoc_options: []
76
63
  require_paths:
77
64
  - lib
@@ -86,8 +73,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
86
73
  - !ruby/object:Gem::Version
87
74
  version: '0'
88
75
  requirements: []
89
- rubygems_version: 3.1.6
90
- signing_key:
76
+ rubygems_version: 3.4.10
77
+ signing_key:
91
78
  specification_version: 4
92
79
  summary: Error reporting for Minato Rails Apps.
93
80
  test_files: []
@@ -1,48 +0,0 @@
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
@@ -1,20 +0,0 @@
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