exception_handler 0.5.1 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/.travis.yml +4 -4
- data/Gemfile +1 -3
- data/README.md +111 -98
- data/app/assets/images/exception_handler/connect/facebook.png +0 -0
- data/app/assets/images/exception_handler/connect/fusion.png +0 -0
- data/app/assets/images/exception_handler/connect/linkedin.png +0 -0
- data/app/assets/images/exception_handler/connect/twitter.png +0 -0
- data/app/assets/images/exception_handler/connect/youtube.png +0 -0
- data/app/assets/images/exception_handler/noise.png +0 -0
- data/app/assets/images/favicon.ico +0 -0
- data/app/assets/stylesheets/exception_handler.css.erb +18 -0
- data/app/assets/stylesheets/styles/_base.css.erb +34 -0
- data/app/assets/stylesheets/styles/_exception.css.erb +105 -0
- data/app/assets/stylesheets/styles/_footer.css.erb +27 -0
- data/app/assets/stylesheets/styles/_responsive.css +5 -0
- data/app/controllers/exception_handler/exception_controller.rb +28 -33
- data/app/mailers/exception_handler/exception_mailer.rb +17 -0
- data/app/models/exception_handler/exception.rb +191 -0
- data/app/views/exception_handler/exception/show.html.erb +3 -32
- data/app/views/exception_handler/mailers/layout.haml +8 -0
- data/app/views/exception_handler/mailers/layout.text.erb +1 -0
- data/app/views/exception_handler/mailers/new_exception.erb +4 -0
- data/app/views/layouts/exception.html.erb +15 -23
- data/config/locales/exception_handler.en.yml +13 -0
- data/exception_handler.gemspec +61 -16
- data/lib/exception_handler.rb +20 -79
- data/lib/exception_handler/config.rb +20 -22
- data/lib/exception_handler/engine.rb +36 -0
- data/lib/generators/exception_handler/migration_generator.rb +28 -10
- data/lib/generators/exception_handler/views_generator.rb +5 -5
- data/lib/generators/templates/migration.rb.erb +12 -11
- metadata +41 -64
- data/app/assets/images/exception_handler/close.png +0 -0
- data/app/assets/images/exception_handler/home.png +0 -0
- data/app/assets/stylesheets/exception_handler/error.css.erb +0 -309
- data/app/helpers/exception_handler/application_helper.rb +0 -56
- data/app/models/exception_handler/error.rb +0 -14
- data/app/services/exception_handler/exception.rb +0 -34
- data/config/locales/en.yml +0 -9
- data/lib/exception_handler/parse.rb +0 -23
- data/lib/exception_handler/parser/data.rb +0 -59
- data/lib/exception_handler/parser/ignore.rb +0 -32
- data/lib/exception_handler/version.rb +0 -3
- data/post_install_message.md +0 -53
- data/spec/helpers/exception_handler/application_helper_spec.rb +0 -42
@@ -0,0 +1 @@
|
|
1
|
+
<%= yield %>
|
@@ -1,29 +1,21 @@
|
|
1
1
|
<!DOCTYPE html>
|
2
2
|
<html>
|
3
|
+
<!-- Head -->
|
3
4
|
<head>
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
<%= stylesheet_link_tag "exception_handler/error" %>
|
8
|
-
|
5
|
+
<%= content_tag :title, "Error - #{@exception.status} (#{@exception.response.to_s.gsub("_", " ").titleize})" %>
|
6
|
+
<%= stylesheet_link_tag :exception_handler %>
|
7
|
+
<%= favicon_link_tag %>
|
9
8
|
</head>
|
10
|
-
|
11
|
-
<!--Body -->
|
12
|
-
<body>
|
13
|
-
<div class="container">
|
14
|
-
<%= yield %>
|
15
|
-
</div>
|
16
9
|
|
17
|
-
|
18
|
-
|
19
|
-
<div class="connect">
|
20
|
-
<%= social %>
|
21
|
-
</div>
|
22
|
-
<div class="app">
|
23
|
-
<strong><%= link_to app, main_app.root_url, title: "Go to index" %></strong>
|
24
|
-
<span> - <%= @exception.status %> Error</span>
|
25
|
-
</div>
|
26
|
-
</footer>
|
10
|
+
<!-- Body -->
|
11
|
+
<%= content_tag :body, yield %>
|
27
12
|
|
28
|
-
|
29
|
-
|
13
|
+
<!-- Footer -->
|
14
|
+
<% if ExceptionHandler.config.try(:social) %>
|
15
|
+
<%= content_tag :footer do %>
|
16
|
+
<% ExceptionHandler.config.social.each do |k,v| %>
|
17
|
+
<%= link_to image_tag("exception_handler/connect/#{k}.png"), v[:url] + "/" + v[:name], id: v[:name] if v %>
|
18
|
+
<% end %>
|
19
|
+
<% end %>
|
20
|
+
<% end %>
|
21
|
+
</html>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
##################################
|
2
|
+
##################################
|
3
|
+
# Have to use strings rather than integers
|
4
|
+
##################################
|
5
|
+
##################################
|
6
|
+
|
7
|
+
en:
|
8
|
+
exception:
|
9
|
+
not_found: "Page missing"
|
10
|
+
internal_server_error: "<strong>Our server experienced an error. Our developers have been notified and are resolving it:</strong> %{message}"
|
11
|
+
|
12
|
+
##################################
|
13
|
+
##################################
|
data/exception_handler.gemspec
CHANGED
@@ -1,21 +1,56 @@
|
|
1
|
-
#
|
1
|
+
# Dependencies
|
2
2
|
lib = File.expand_path('../lib', __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require 'exception_handler/version'
|
5
4
|
|
5
|
+
##############################################################
|
6
|
+
##############################################################
|
7
|
+
|
8
|
+
# => Version
|
9
|
+
# => https://github.com/rails/rails/blob/master/version.rb
|
10
|
+
module ExceptionHandler
|
11
|
+
module VERSION
|
12
|
+
MAJOR = 0
|
13
|
+
MINOR = 6
|
14
|
+
TINY = 0
|
15
|
+
PRE = nil # "alpha"
|
16
|
+
|
17
|
+
STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# => Declaration
|
22
|
+
# => https://github.com/rails/rails/blob/master/rails.gemspec#L1
|
23
|
+
version = ExceptionHandler::VERSION::STRING
|
24
|
+
|
25
|
+
##############################################################
|
26
|
+
##############################################################
|
27
|
+
|
28
|
+
# => Gem
|
6
29
|
Gem::Specification.new do |s|
|
7
30
|
|
8
|
-
|
31
|
+
##############################################################
|
32
|
+
|
33
|
+
# => General
|
34
|
+
s.platform = Gem::Platform::RUBY
|
9
35
|
s.name = "exception_handler"
|
10
|
-
s.version =
|
36
|
+
s.version = version
|
37
|
+
|
38
|
+
# => Author
|
11
39
|
s.authors = ["Richard Peck"]
|
12
40
|
s.email = ["rpeck@frontlineutilities.co.uk"]
|
41
|
+
|
42
|
+
# => Details
|
13
43
|
s.summary = %q{Rails gem to show custom error pages in production. Also logs errors in db & sends notification emails}
|
14
44
|
s.description = %q{Rails gem to create custom error pages. Captures exceptions using "exception_app" callback, routing to "Exception" controller, rendering the view as required.}
|
15
45
|
s.homepage = "http://github.com/richpeck/exception_handler"
|
46
|
+
|
47
|
+
# => License
|
16
48
|
s.license = "MIT"
|
17
49
|
|
18
|
-
|
50
|
+
##############################################################
|
51
|
+
|
52
|
+
# => Files
|
53
|
+
# => Remove "readme" dir from gem
|
19
54
|
s.files = `git ls-files -z`.split("\x0")
|
20
55
|
s.files.reject! { |fn| fn.include? "readme" } #-> https://github.com/gauntlt/gauntlt/blob/master/gauntlt.gemspec#L16
|
21
56
|
|
@@ -23,17 +58,27 @@ Gem::Specification.new do |s|
|
|
23
58
|
s.test_files = s.files.grep(%r{^(test|spec|features)/}) unless RUBY_VERSION >= "2.2.0" #-> deprecated in Ruby 2.2.0
|
24
59
|
s.require_paths = ["lib"]
|
25
60
|
|
26
|
-
|
27
|
-
|
61
|
+
##############################################################
|
62
|
+
|
63
|
+
# => Ruby
|
64
|
+
s.required_ruby_version = ">= 2.1.0"
|
28
65
|
|
29
|
-
#
|
30
|
-
s.
|
31
|
-
s.
|
32
|
-
s.
|
33
|
-
|
66
|
+
# => Runtime
|
67
|
+
s.add_dependency "bundler", "~> 1.6"
|
68
|
+
s.add_dependency "rails", ">= 4.2.0"
|
69
|
+
s.add_dependency "responders", "~> 2.3"
|
70
|
+
|
71
|
+
# => Extras
|
72
|
+
s.add_development_dependency "autoprefixer-rails"
|
73
|
+
|
74
|
+
# => Dev
|
75
|
+
# => For testing etc
|
34
76
|
s.add_development_dependency "rake"
|
35
|
-
s.add_development_dependency "rspec"
|
36
|
-
s.add_development_dependency "rspec-rails"
|
37
|
-
s.add_development_dependency "sqlite3",
|
77
|
+
s.add_development_dependency "rspec"
|
78
|
+
s.add_development_dependency "rspec-rails"
|
79
|
+
s.add_development_dependency "sqlite3", ">= 1.3.10"
|
80
|
+
|
81
|
+
##############################################################
|
82
|
+
##############################################################
|
38
83
|
|
39
|
-
end
|
84
|
+
end
|
data/lib/exception_handler.rb
CHANGED
@@ -1,88 +1,29 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
#Core Dependencies
|
4
|
-
require "action_dispatch"
|
5
|
-
|
6
|
-
#Libs
|
7
|
-
#http://stackoverflow.com/a/4528011/1143732
|
8
|
-
#http://stackoverflow.com/a/21693468/1143732
|
9
|
-
#https://github.com/jekyll/jekyll/blob/master/lib/jekyll.rb#L8
|
10
|
-
Dir.glob(File.join(File.dirname(__FILE__), "exception_handler", '**/*.rb'), &method(:require))
|
11
|
-
|
12
|
-
###########################################
|
1
|
+
#########################################################
|
2
|
+
#########################################################
|
13
3
|
|
14
4
|
module ExceptionHandler
|
15
5
|
|
16
|
-
#
|
17
|
-
#
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
@@config = "" #-> should initialize class & then append in initializer
|
22
|
-
|
23
|
-
# Class methods
|
24
|
-
class << self
|
25
|
-
# Don't have prefix method return anything.
|
26
|
-
# This will keep Rails Engine from generating all table prefixes with the engines name
|
27
|
-
# http://stackoverflow.com/questions/19435214/rails-mountable-engine-with-isolate-namespace-but-without-prefixed-namespace-on
|
28
|
-
def table_name_prefix
|
29
|
-
#No prefix
|
30
|
-
end
|
6
|
+
# => Table Prefix
|
7
|
+
# => Keeps Rails Engine from generating all table prefixes with the engines name
|
8
|
+
# => http://stackoverflow.com/questions/19435214/rails-mountable-engine-with-isolate-namespace-but-without-prefixed-namespace-on
|
9
|
+
def self.table_name_prefix
|
10
|
+
# => No prefix
|
31
11
|
end
|
32
12
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
class Engine < Rails::Engine
|
37
|
-
#Keep helpers in your engine
|
38
|
-
#http://guides.rubyonrails.org/engines.html#inside-an-engine
|
39
|
-
#http://stackoverflow.com/questions/31877839/accessing-helpers-from-the-parent-app-in-an-isolated-rails-engine
|
40
|
-
#use main_app to call "main app" helpers etc http://stackoverflow.com/a/9178022/1143732 + http://edgeapi.rubyonrails.org/classes/Rails/Engine.html#class-Rails::Engine-label-Using+Engine-27s+routes+outside+Engine
|
41
|
-
isolate_namespace ExceptionHandler
|
42
|
-
|
43
|
-
#Tests (generates dummy Rails app)
|
44
|
-
#http://stackoverflow.com/q/32082637/1143732 (ref in question)
|
45
|
-
config.generators do |g|
|
46
|
-
g.test_framework :rspec
|
47
|
-
end
|
48
|
-
|
49
|
-
#Assets
|
50
|
-
config.assets.precompile << %w(exception_handler/**)
|
51
|
-
|
52
|
-
#Config
|
53
|
-
config.before_initialize do |app|
|
54
|
-
ExceptionHandler.config = ExceptionHandler::Config.new app.config.try(:exception_handler) #-> Var
|
55
|
-
end
|
56
|
-
|
57
|
-
#Boot order:
|
58
|
-
#http://api.rubyonrails.org/classes/Rails/Application.html#class-Rails::Application-label-Booting+process
|
59
|
-
#1) require "config/boot.rb" to setup load paths
|
60
|
-
#2) require railties and engines
|
61
|
-
#3) Define Rails.application as "class MyApp::Application < Rails::Application"
|
62
|
-
#4) Run config.before_configuration callbacks
|
63
|
-
#5) Load config/environments/ENV.rb
|
64
|
-
#6) Run config.before_initialize callbacks
|
65
|
-
#7) Run Railtie#initializer defined by railties, engines and application.
|
66
|
-
# One by one, each engine sets up its load paths, routes and runs its config/initializers/* files.
|
67
|
-
#8) Custom Railtie#initializers added by railties, engines and applications are executed
|
68
|
-
#9) Build the middleware stack and run to_prepare callbacks
|
69
|
-
#10) Run config.before_eager_load and eager_load! if eager_load is true
|
70
|
-
#11) Run config.after_initialize callbacks
|
71
|
-
|
72
|
-
#Hook
|
73
|
-
#Needs to fire before better_errors (for dev)
|
74
|
-
initializer :exception_handler, before: "better_errors.configure_rails_initialization" do |app| #-> "before" ref - http://blog.carbonfive.com/2011/02/25/configure-your-gem-the-rails-way-with-railtie/ && http://apidock.com/rails/Rails/Initializable/Initializer/before - should degrade gracefully
|
13
|
+
# => Config
|
14
|
+
# => Invoke instance of config (ExceptionHandler.config)
|
15
|
+
mattr_accessor :config
|
75
16
|
|
76
|
-
|
77
|
-
app.config.middleware.use ExceptionHandler::Parse if ExceptionHandler.config.try(:db) #-> DB
|
78
|
-
app.config.exceptions_app = ->(env) { ExceptionHandler::ExceptionController.action(:show).call(env) } #-> Controller
|
17
|
+
end
|
79
18
|
|
80
|
-
|
81
|
-
|
82
|
-
app.config.consider_all_requests_local = false if Rails.env.development? and ExceptionHandler.config.try(:dev)
|
83
|
-
end
|
19
|
+
#########################################################
|
20
|
+
#########################################################
|
84
21
|
|
85
|
-
|
86
|
-
|
22
|
+
# => Libs
|
23
|
+
# => http://stackoverflow.com/a/4528011/1143732
|
24
|
+
# => http://stackoverflow.com/a/21693468/1143732
|
25
|
+
# => https://github.com/jekyll/jekyll/blob/master/lib/jekyll.rb#L8
|
26
|
+
Dir.glob(File.join(File.dirname(__FILE__), 'exception_handler', '**/*.rb'), &method(:require))
|
87
27
|
|
88
|
-
|
28
|
+
#########################################################
|
29
|
+
#########################################################
|
@@ -16,17 +16,23 @@ module ExceptionHandler
|
|
16
16
|
|
17
17
|
#Init
|
18
18
|
def initialize values=nil
|
19
|
-
defaults = values.present? ? Config::DEFAULTS.deep_merge!(values) :
|
19
|
+
defaults = values.present? ? Config::DEFAULTS.deep_merge!(values) : DEFAULTS
|
20
20
|
defaults.each do |k,v|
|
21
|
-
instance_variable_set("@#{k}",v) #-> http://apidock.com/ruby/Object/instance_variable_set
|
21
|
+
instance_variable_set("@#{k}",v) #-> http://apidock.com/ruby/Object/instance_variable_set
|
22
22
|
end
|
23
|
+
|
24
|
+
# => Errors
|
25
|
+
raise(Exception, "ExceptionHandler :: Valid Email Required") if @email && !@email.is_a?(String)
|
26
|
+
#raise(Exception, "ExceptionHandler :: Migration Required → Table \"#{db}\" doesn't exist") if @db && !ActiveRecord::Base.connection.table_exists?(db)
|
23
27
|
end
|
24
28
|
|
25
|
-
|
29
|
+
###########################################
|
30
|
+
|
31
|
+
# Public (Instance) Methods #
|
26
32
|
|
27
33
|
#DB
|
28
34
|
def db
|
29
|
-
@db == true ?
|
35
|
+
@db == true ? TABLE_NAME : @db
|
30
36
|
end
|
31
37
|
|
32
38
|
###########################################
|
@@ -38,31 +44,23 @@ module ExceptionHandler
|
|
38
44
|
# Defaults
|
39
45
|
# http://stackoverflow.com/a/8917301/1143732
|
40
46
|
DEFAULTS = {
|
41
|
-
dev:
|
47
|
+
dev: false, #-> defaults to "false" for dev mode
|
42
48
|
db: false, #-> defaults to :errors if true, else use "table_name" / :table_name
|
43
|
-
email: false, #->
|
49
|
+
email: false, #-> requires string email and ActionMailer
|
44
50
|
social: {
|
45
|
-
:
|
46
|
-
:
|
47
|
-
:
|
48
|
-
:
|
49
|
-
:
|
50
|
-
:url => {
|
51
|
-
:facebook => 'https://facebook.com',
|
52
|
-
:twitter => 'http://twitter.com',
|
53
|
-
:youtube => 'https://youtube.com/user',
|
54
|
-
:linkedin => 'https://linkedin.com/company',
|
55
|
-
:fusion => 'https://frontlinefusion.com',
|
56
|
-
},
|
51
|
+
facebook: { name: "frontline.utilities", url: "https://facebook.com" },
|
52
|
+
twitter: { name: "frontlineutils", url: "http://twitter.com" },
|
53
|
+
youtube: { name: "frontlineutils", url: "https://youtube.com/user" },
|
54
|
+
linkedin: { name: "frontline-utilities", url: "https://linkedin.com/company" },
|
55
|
+
fusion: { name: "flutils", url: "https://frontlinefusion.com" }
|
57
56
|
},
|
58
57
|
layouts: {
|
59
|
-
|
60
|
-
|
61
|
-
'500' => 'exception'
|
58
|
+
"400" => nil, # => inherits from "ApplicationController" layout
|
59
|
+
"500" => "exception"
|
62
60
|
},
|
63
61
|
}
|
64
62
|
|
65
63
|
###########################################
|
66
64
|
|
67
65
|
end
|
68
|
-
end
|
66
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module ExceptionHandler
|
2
|
+
class Engine < Rails::Engine
|
3
|
+
|
4
|
+
#########################################################
|
5
|
+
#########################################################
|
6
|
+
|
7
|
+
# => Wraps helpers in ExceptionHandler module
|
8
|
+
# => http://guides.rubyonrails.org/engines.html#inside-an-engine
|
9
|
+
# => http://stackoverflow.com/questions/31877839/accessing-helpers-from-the-parent-app-in-an-isolated-rails-engine
|
10
|
+
isolate_namespace ExceptionHandler
|
11
|
+
|
12
|
+
# => Tests
|
13
|
+
config.generators do |g|
|
14
|
+
g.test_framework :rspec
|
15
|
+
end
|
16
|
+
|
17
|
+
# => Assets
|
18
|
+
# => For Sprockets 4, had to include link_tree in exception_handler.css
|
19
|
+
config.assets.precompile << %w(exception_handler.css)
|
20
|
+
|
21
|
+
#########################################################
|
22
|
+
#########################################################
|
23
|
+
|
24
|
+
# => Hooks
|
25
|
+
# => This should be config.before_initialize but because ActiveRecord is not initialized, cannot check for table
|
26
|
+
initializer :exception_handler, before: "better_errors.configure_rails_initialization" do |app|
|
27
|
+
ExceptionHandler.config ||= ExceptionHandler::Config.new config.try(:exception_handler) # => Vars
|
28
|
+
app.config.exceptions_app = ->(env) { ExceptionHandler::ExceptionController.action(:show).call(env) } # => Rails
|
29
|
+
app.config.consider_all_requests_local = false if Rails.env.development? && ExceptionHandler.config.try(:dev) # => Dev
|
30
|
+
end
|
31
|
+
|
32
|
+
#########################################################
|
33
|
+
#########################################################
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
@@ -1,37 +1,55 @@
|
|
1
1
|
###########################################
|
2
2
|
|
3
3
|
require 'rails/generators/active_record'
|
4
|
+
require 'exception_handler/exception' # => ATTRS constant (for attributes)
|
4
5
|
|
5
6
|
###########################################
|
6
7
|
|
7
|
-
#Migration Generator (for adding errors table)
|
8
|
-
#Ref: https://github.com/plataformatec/devise/blob/master/lib/generators/active_record/devise_generator.rb
|
8
|
+
# => Migration Generator (for adding errors table)
|
9
|
+
# => Ref: https://github.com/plataformatec/devise/blob/master/lib/generators/active_record/devise_generator.rb
|
9
10
|
|
10
11
|
module ExceptionHandler
|
11
12
|
class MigrationGenerator < ActiveRecord::Generators::Base
|
12
|
-
|
13
|
-
#Name - from http://old.thoughtsincomputation.com/posts/cgfr3-part-3-adding-a-generator
|
13
|
+
|
14
|
+
# => Name - from http://old.thoughtsincomputation.com/posts/cgfr3-part-3-adding-a-generator
|
14
15
|
argument :name, default: "migration"
|
15
16
|
|
16
|
-
#Source of Migrations
|
17
|
+
# => Source of Migrations
|
17
18
|
source_root File.expand_path("../../templates", __FILE__)
|
18
19
|
|
19
20
|
###########################################
|
20
21
|
|
21
|
-
#Table Name - false = off, true = errors, value = value
|
22
|
-
#Always outputs string for some reason...
|
22
|
+
# => Table Name - false = off, true = errors, value = value
|
23
|
+
# => Always outputs string for some reason...
|
23
24
|
def table_name
|
24
25
|
ExceptionHandler.config.db
|
25
26
|
end
|
26
27
|
|
27
28
|
###########################################
|
28
29
|
|
29
|
-
#Create
|
30
|
+
# => Create
|
30
31
|
def create_errors_migration
|
31
|
-
migration_template "migration.rb.erb", "db/migrate/
|
32
|
+
migration_template "migration.rb.erb", "db/migrate/create_#{table_name.to_s.gsub("_","")}.rb", migration_version: migration_version
|
33
|
+
end
|
34
|
+
|
35
|
+
###########################################
|
36
|
+
|
37
|
+
# => From Devise
|
38
|
+
# => https://github.com/plataformatec/devise/blob/master/lib/generators/active_record/devise_generator.rb#L81
|
39
|
+
|
40
|
+
# => Rails 5?
|
41
|
+
def rails5?
|
42
|
+
Rails.version.start_with? '5'
|
43
|
+
end
|
44
|
+
|
45
|
+
# => Migration Version
|
46
|
+
def migration_version
|
47
|
+
if rails5?
|
48
|
+
"[#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}]"
|
49
|
+
end
|
32
50
|
end
|
33
51
|
|
34
52
|
###########################################
|
35
53
|
|
36
54
|
end
|
37
|
-
end
|
55
|
+
end
|