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 +4 -4
- data/lib/minato_error_handler/error_handler.rb +8 -54
- data/lib/minato_error_handler/minato_error.rb +48 -0
- data/lib/minato_error_handler/network_error.rb +20 -0
- data/lib/minato_error_handler/version.rb +1 -1
- data/lib/minato_error_handler.rb +2 -3
- data/minato_error_handler.gemspec +1 -0
- metadata +25 -12
- data/lib/minato_error_handler/errors/minato_error.rb +0 -99
- data/lib/minato_error_handler/errors/network_error.rb +0 -27
- data/lib/minato_error_handler/errors/unknow_error.rb +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6dc9c58925db88b167dada6c2d68e633403a0c3bafe95ef8d3f55f445c8ae0a3
|
4
|
+
data.tar.gz: 1eb7c12bbb02ec88019476c6062eeb49d1e496c6778488c706e5057f58abf4b9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
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 =
|
17
|
-
report_error
|
18
|
-
|
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
|
-
|
52
|
-
|
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
|
data/lib/minato_error_handler.rb
CHANGED
@@ -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/
|
6
|
-
require "minato_error_handler/
|
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
|
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-
|
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/
|
47
|
-
- lib/minato_error_handler/
|
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:
|
87
|
+
version: '0'
|
75
88
|
requirements: []
|
76
|
-
rubygems_version: 3.
|
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
|