Skip to content

Commit e0ec934

Browse files
committed
working prototype
1 parent 269bd61 commit e0ec934

File tree

16 files changed

+150
-7
lines changed

16 files changed

+150
-7
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@
88
/test/dummy/log/*.log
99
/test/dummy/storage/
1010
/test/dummy/tmp/
11+
Gemfile.lock

Gemfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@ gem "puma"
99
gem "sqlite3"
1010

1111
# Start debugger with binding.b [https://github.com/ruby/debug]
12-
# gem "debug", ">= 1.0.0"
12+
gem "debug", ">= 1.0.0"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<li><%= frame %></li>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<p>No backtrace available</p>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<h1><%= @error.class %></h1>
2+
<p><%= @error.message %></p>
3+
4+
<div>
5+
<%= render(partial: "frame", collection: @backtrace) || render("no_backtrace") -%>
6+
</div>

lib/email_error_reporter.rb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
require "email_error_reporter/version"
2-
require "email_error_reporter/railtie"
2+
require "email_error_reporter/engine"
33

44
module EmailErrorReporter
5-
# Your code goes here...
5+
extend ActiveSupport::Autoload
6+
7+
autoload :ErrorMailer
8+
autoload :Subscriber
9+
autoload :ExceptionSerializer
610
end

lib/email_error_reporter/engine.rb

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
module EmailErrorReporter
2+
class Engine < ::Rails::Engine
3+
isolate_namespace EmailErrorReporter
4+
5+
config.email_error_reporter = ActiveSupport::OrderedOptions.new
6+
config.email_error_reporter.to = []
7+
8+
initializer "email_error_reporter.error_subscribe" do
9+
Rails.error.subscribe(Subscriber.new)
10+
end
11+
12+
# ActiveJob cannot (de)-serialize exceptions by default
13+
initializer "email_error_reporter.exception_serializer" do |app|
14+
app.config.active_job.custom_serializers << ExceptionSerializer
15+
end
16+
end
17+
end
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
module EmailErrorReporter
2+
class ErrorMailer < ActionMailer::Base
3+
def error(error, handled:, severity:, context:, source: nil)
4+
@error = error
5+
@handled = handled
6+
@severity = severity
7+
@context = context
8+
@source = source
9+
10+
@backtrace = Array.wrap(error.backtrace)
11+
12+
mail(
13+
subject: "#{error.class}",
14+
to: Rails.application.config.email_error_reporter.to
15+
)
16+
end
17+
end
18+
end
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
module EmailErrorReporter
2+
class ExceptionSerializer < ActiveJob::Serializers::ObjectSerializer
3+
def serialize(exception)
4+
super(
5+
exception_class: exception.class.to_s,
6+
message: exception.message,
7+
backtrace: exception.backtrace
8+
)
9+
end
10+
11+
def deserialize(hash)
12+
hash[:exception_class].constantize.new(hash[:message]).tap do |e|
13+
e.set_backtrace(hash[:backtrace])
14+
end
15+
end
16+
17+
private
18+
19+
def klass
20+
Exception
21+
end
22+
end
23+
end

lib/email_error_reporter/railtie.rb

Lines changed: 0 additions & 4 deletions
This file was deleted.

0 commit comments

Comments
 (0)