exception_handler 0.4.1 → 0.4.6

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
  SHA1:
3
- metadata.gz: 6de01c4f183c029883d8ba33b9836f37c32b4208
4
- data.tar.gz: fa8727b10d22e0542b4835e0a9cdf2d9b41a99f1
3
+ metadata.gz: 71ba86443d6a75a89c634f589fa699e7da9b3d1f
4
+ data.tar.gz: 09d0e90fa92c55f15571be63bd00dd0274eccfac
5
5
  SHA512:
6
- metadata.gz: 82d20e9ef8b760482b6ef2fcf72ccba0a2bfa3cf22344bd7af8e7292d6cb0bf6f4ce6a209a4f661f3613f10b10a98b31469ad60fec60dba05f993100f850d72b
7
- data.tar.gz: aee498de71ee53630baa33afe8eb6601eab520d47afa029d68384e4978a120176deecc9332ea764235d182189da1ff1c53074b14d42737f8b0c892d25605ba9c
6
+ metadata.gz: 801a42bd1b0fb5effcd6ff29830c9c29f52cb8f65950e0c2a2b4d42c1dbbc2e9eff30742c1439fa576ad74cb9df663e17fdbebccdd29d95b077c80da8e894b44
7
+ data.tar.gz: d677c62c7d0887a93582b9d21a715a3798ec3e157073a437ce2f811c20b81117c3d4de378ebd289c62b80cb9446a13f15abfd75ed812b64cc0af5269b18ef6c9
data/README.md CHANGED
@@ -53,7 +53,7 @@ Whilst it's common practice to use `config.exceptions_app = self.routes` to send
53
53
 
54
54
  or
55
55
 
56
- gem 'exception_handler', '~> 0.4' # Gemfile
56
+ gem 'exception_handler', '~> 0.4.5' # Gemfile
57
57
 
58
58
  $ bundle
59
59
 
@@ -65,7 +65,7 @@ You can see [`ExceptionHandler` on RubyGems](https://rubygems.org/gems/exception
65
65
 
66
66
  *Optional*
67
67
 
68
- If you wish to change any of the default settings (listed below), run the following command:
68
+ If you wish to change any of the default settings (listed below), you can now add `config.exception_handler` to your `config/application.rb` file:
69
69
 
70
70
  $ rails g exception_handler:install
71
71
 
@@ -1,18 +1,23 @@
1
1
  /* Vars */
2
- <% size = 20 %>
2
+ <% size = 18 %>
3
3
  <% opacity = 0.85 %>
4
4
  <% footer = 50 %>
5
5
  <% radius = 5 %>
6
6
  <% title_bg = "rgba(227,11,11,1)" %>
7
7
 
8
-
8
+ /**************/
9
9
  /* Responsive */
10
+ /**************/
11
+
10
12
  @media screen and (max-width: 950px) {
11
13
  html { background-size: cover !important; }
12
14
  .container .error { width: 55% !important; }
13
15
  }
14
16
 
17
+ /***********/
15
18
  /* Styling */
19
+ /***********/
20
+
16
21
  * { margin: 0; }
17
22
  html, body, .container { height: 100%; }
18
23
  html {
@@ -138,7 +143,9 @@ a:hover { text-decoration: underline; }
138
143
  }
139
144
  .container .message .title a.close:hover img { opacity: 0.75; }
140
145
 
141
-
146
+ /***********/
147
+ /* Details */
148
+ /***********/
142
149
 
143
150
  .container .message .details {
144
151
  position: relative;
@@ -254,18 +261,22 @@ a:hover { text-decoration: underline; }
254
261
  .container .message > .info .notification a.home:hover { opacity: <%= opacity %>; }
255
262
  .container .message > .info .notification a.home img { height: 12px; }
256
263
 
264
+ /**********/
257
265
  /* Footer */
266
+ /**********/
267
+
258
268
  footer {
259
269
  display: block;
260
270
  position: relative;
261
271
  vertical-align: middle;
262
272
  clear: both;
263
273
  color: #fff;
264
- margin: 15px auto 0;
265
- padding: 14px 1%;
274
+ margin: 15px 2% 0;
275
+ padding: 14px 0;
266
276
  box-sizing: border-box;
267
277
  max-height: <%= footer %>;
268
278
  z-index: 1100;
279
+ border-top: 1px solid rgba(255,255,255,0.1);
269
280
  }
270
281
 
271
282
  footer .app { text-transform: uppercase; }
@@ -286,12 +297,13 @@ footer .connect a {
286
297
  padding-left: 4px;
287
298
  margin: 0 -1px; /* Use 0 -1px for inline block & ERB - HAML removes whitespace; ERB does now - http://haml.info/docs/yardoc/file.REFERENCE.html#whitespace_removal__and_ */
288
299
  transition: opacity 0.2s ease;
300
+ vertical-align: middle;
289
301
  }
290
302
 
291
- footer .connect a img { display: block; vertical-align: middle; }
292
- footer .connect a.facebook img { height: <%= size * 0.85 %>px; }
293
- footer .connect a.twitter img { height: <%= size * 0.85 %>px; }
294
- footer .connect a.linkedin img { height: <%= size * 0.9 %>px; }
295
- footer .connect a.youtube img { height: <%= size * 0.875 %>px; }
303
+ footer .connect a img { display: block; padding: 0 5px; }
304
+ footer .connect a.facebook img { height: <%= size * 0.92 %>px; }
305
+ footer .connect a.twitter img { height: <%= size * 0.88 %>px; }
306
+ footer .connect a.youtube img { height: <%= size %>px; }
307
+ footer .connect a.linkedin img { height: <%= size * 0.97 %>px; }
296
308
  footer .connect a.fusion img { height: <%= size %>px; }
297
309
  footer .connect:hover a:hover { opacity: 1; }
@@ -10,6 +10,10 @@ module ExceptionHandler
10
10
  #Layout
11
11
  layout :layout_status
12
12
 
13
+ #Helpers
14
+ helper ExceptionHandler::ApplicationHelper #-> HELPERS http://stackoverflow.com/questions/9809787/why-is-my-rails-mountable-engine-not-loading-helper-methods-correctly
15
+ include Rails.application.routes.url_helpers #-> ROUTES http://stackoverflow.com/a/6074911/1143732
16
+
13
17
  ####################
14
18
  # Action #
15
19
  ####################
@@ -17,8 +21,15 @@ module ExceptionHandler
17
21
  #Show
18
22
  def show
19
23
  @layout = self.send(:_layout)
20
- @message = @status == 404 ? "Sorry, this page is missing" : details[:message]
21
- render status: @status
24
+ @message = (/^(5[0-9]{2})$/ !~ @status.to_s) ? "Sorry, this page is missing" : details[:message]
25
+
26
+ ## Config "404 block" handler ##
27
+ if /^(5[0-9]{2})$/ !~ @status.to_s && ExceptionHandler.config["404"] #-> http://www.justskins.com/forums/ruby-s-regexp-is-52846.html
28
+ eval ExceptionHandler.config["404"]
29
+ else
30
+ ## Render (if eval do anything) ##
31
+ render status: @status
32
+ end
22
33
  end
23
34
 
24
35
  ####################
@@ -55,9 +66,9 @@ module ExceptionHandler
55
66
  def layout_status
56
67
  case @status
57
68
  when 404
58
- ExceptionHandler.config.error_layout || nil #-> inherits ApplicationController layout
69
+ ExceptionHandler.config[:layouts]["400"] || nil #-> inherits ApplicationController layout
59
70
  else
60
- ExceptionHandler.config.exception_layout || 'error'
71
+ ExceptionHandler.config[:layouts]["500"] #-> should pull default if none sepecified
61
72
  end
62
73
  end
63
74
 
@@ -0,0 +1,32 @@
1
+ module ExceptionHandler
2
+ module ApplicationHelper
3
+
4
+ #Refs
5
+ #http://stackoverflow.com/a/5795683/1143732
6
+ #http://stackoverflow.com/questions/8028021/helpers-in-rails-engine
7
+ #ActiveSupport.on_load( :action_view ){ include ExceptionHandler::ViewHelpers }
8
+
9
+ #Social
10
+ def social *services
11
+ output = []
12
+ # options = args.extract_options! http://simonecarletti.com/blog/2009/09/inside-ruby-on-rails-extract_options-from-arrays/ - args for arrays
13
+
14
+ services = ExceptionHandler.config[:social] unless services.any?
15
+ services.except(:url).each do |service,username| #-> except http://stackoverflow.com/a/11105831/1143732
16
+ output.push link_to(image_tag("exception_handler/connect/#{service}.png", title: "Find us on " + service.to_s.titleize), link(service), target: :blank, class: service.to_s)
17
+ end
18
+
19
+ output.join("").html_safe #-> ruby returns last line
20
+ end
21
+
22
+ private
23
+
24
+ def link service #-> bloated way to allow single references in config
25
+ url = []
26
+ url.push ExceptionHandler.config[:social][:url][service]
27
+ url.push ExceptionHandler.config[:social][service]
28
+ url.join("/")
29
+ end
30
+
31
+ end
32
+ end
@@ -2,8 +2,12 @@ module ExceptionHandler
2
2
  class Error < ActiveRecord::Base
3
3
  #Table is called "errors"
4
4
  #Dev needs to use migration to create db
5
+ def self.table_name
6
+ ExceptionHandler.config[:db]
7
+ end
5
8
 
6
9
  #Associations
7
10
  belongs_to :usable, polymorphic: true
11
+
8
12
  end
9
13
  end
@@ -1,11 +1,11 @@
1
1
  <div class="error">
2
- <% if @layout == "error" %>
2
+ <% if /^(5[0-9]{2})$/ =~ @status.to_s %>
3
3
 
4
4
  <!--Message -->
5
5
  <%= content_tag :div, class: "message" do %>
6
6
  <%= content_tag :div, class: "title" do %>
7
7
  <span><%= "#{@status} Error - #{details[:name]}" %></span>
8
- <%= link_to image_tag("exception_handler/close.png"), root_url, title: "Close (Go back home)", class: "close" %>
8
+ <%= link_to image_tag("exception_handler/close.png"), main_app.root_url, title: "Close (Go back home)", class: "close" %>
9
9
  <% end %>
10
10
  <%= content_tag :div, class: "details" do %>
11
11
  <%= image_tag "exception_handler/alert.png", title: "#{@status} Error" %>
@@ -14,7 +14,7 @@
14
14
  <%= content_tag :div, class: "info" do %>
15
15
  <span><%= @message %></span>
16
16
  <div class="notification">
17
- <%= link_to image_tag("exception_handler/home.png", title: "Go Back Home"), root_url, class: "home" %>
17
+ <%= link_to image_tag("exception_handler/home.png", title: "Go Back Home"), main_app.root_url, class: "home" %>
18
18
  <div class="version">v<%= Rails.version %></div>
19
19
  <strong>Our developers have been notified - we're working on it!</strong>
20
20
  </div>
@@ -17,12 +17,10 @@
17
17
  <!-- Footer -->
18
18
  <footer>
19
19
  <div class="connect">
20
- <% ExceptionHandler.config.social.each do |item, address| %>
21
- <%= link_to image_tag("exception_handler/connect/#{item}.png", title: "Find us on " + item.to_s.titleize), address, target: :blank, class: item.to_s %>
22
- <% end %>
20
+ <%= social %>
23
21
  </div>
24
22
  <div class="app">
25
- <strong><%= link_to @app_name, root_url, title: "Go to index" %></strong>
23
+ <strong><%= link_to @app_name, main_app.root_url, title: "Go to index" %></strong>
26
24
  <span> - <%= @status %> Error</span>
27
25
  </div>
28
26
  </footer>
@@ -3,25 +3,27 @@ lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'exception_handler/version'
5
5
 
6
- Gem::Specification.new do |spec|
7
- spec.name = "exception_handler"
8
- spec.version = ExceptionHandler::VERSION
9
- spec.authors = ["Richard Peck", "Joe Hilton"]
10
- spec.email = ["rpeck@frontlineutilities.co.uk", "jhilton@frontlineutilities.co.uk"]
11
- spec.summary = %q{Rails gem to show custom error pages in production. Also logs errors in "errors" db if required}
12
- spec.description = %q{Rails gem to create custom error pages. Captures exceptions using "exception_app" callback, routing to "Exception" controller, rendering the view as required.}
13
- spec.homepage = "http://frontlineutilities.co.uk/ror/custom_error_pages"
14
- spec.license = "MIT"
6
+ Gem::Specification.new do |s|
7
+ s.name = "exception_handler"
8
+ s.version = ExceptionHandler::VERSION
9
+ s.authors = ["Richard Peck", "Joe Hilton"]
10
+ s.email = ["rpeck@frontlineutilities.co.uk", "jhilton@frontlineutilities.co.uk"]
11
+ s.summary = %q{Rails gem to show custom error pages in production. Also logs errors in "errors" db if required}
12
+ 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.}
13
+ s.homepage = "http://frontlineutilities.co.uk/ror/custom_error_pages"
14
+ s.license = "MIT"
15
15
 
16
- spec.files = `git ls-files -z`.split("\x0")
17
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
- spec.require_paths = ["lib"]
16
+ s.files = `git ls-files -z`.split("\x0")
17
+ s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
19
+ s.require_paths = ["lib"]
20
20
 
21
- spec.add_development_dependency "bundler", "~> 1.6"
22
- spec.add_development_dependency "rails", "~> 4.0.0"
23
- spec.add_development_dependency "activerecord"
24
- spec.add_development_dependency "activesupport"
25
- spec.add_development_dependency "rake"
26
- spec.add_development_dependency "rspec"
21
+ s.post_install_message = File.read(File.join(File.dirname(__FILE__), 'post_install_message.md')) #-> https://github.com/jarrett/ichiban/blob/master/ichiban.gemspec#L35
22
+
23
+ s.add_development_dependency "bundler", "~> 1.6"
24
+ s.add_development_dependency "rails", "~> 4.0.0"
25
+ s.add_development_dependency "activerecord"
26
+ s.add_development_dependency "activesupport"
27
+ s.add_development_dependency "rake"
28
+ s.add_development_dependency "rspec"
27
29
  end
@@ -3,41 +3,56 @@
3
3
  #Core Dependencies
4
4
  require "action_dispatch"
5
5
 
6
- #Gem Files
7
- libs = %w(version parser config)
8
- for lib in libs do
9
- require "exception_handler/#{lib}"
10
- end
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
11
 
12
12
  ###########################################
13
13
 
14
14
  module ExceptionHandler
15
15
 
16
+ #Version
17
+ autoload :VERSION, 'exception_handler/version'
18
+
19
+ #Config
20
+ #https://github.com/thoughtbot/paperclip/blob/523bd46c768226893f23889079a7aa9c73b57d68/lib/paperclip/railtie.rb#L13
21
+ mattr_accessor :config
22
+ @@config = ExceptionHandler::Config.defaults #-> instance of defaults invoked with @@config, merged with deep_merge
23
+
24
+ # Don't have prefix method return anything.
25
+ # This will keep Rails Engine from generating all table prefixes with the engines name
26
+ # http://stackoverflow.com/questions/19435214/rails-mountable-engine-with-isolate-namespace-but-without-prefixed-namespace-on
27
+ def self.table_name_prefix
28
+ #No prefix
29
+ end
30
+
16
31
  #Exception Handler
17
32
  class Exceptions < Rails::Engine
33
+ #Keep helpers in your engine
34
+ #http://guides.rubyonrails.org/engines.html#inside-an-engine
35
+ #http://stackoverflow.com/questions/31877839/accessing-helpers-from-the-parent-app-in-an-isolated-rails-engine
36
+ #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
37
+ isolate_namespace ExceptionHandler
18
38
 
19
39
  #Stylesheet
20
40
  config.assets.precompile += %w(exception_handler/error.css)
21
41
 
22
- #Parser
42
+ #Config
43
+ @@config = ExceptionHandler.config
44
+
45
+ #Hook
23
46
  initializer "exception_handler.configure_rails_initialization" do |app|
24
- app.config.middleware.use "ExceptionHandler::Message" unless ExceptionHandler.config.db == false #Parser
25
- app.config.exceptions_app = ->(env) { ExceptionHandler::ExceptionController.action(:show).call(env) } #Pages
47
+
48
+ #Options
49
+ @@config.deep_merge! app.config.exception_handler if app.config.respond_to? :exception_handler
50
+ @@config[:db] = ExceptionHandler::Config::TABLE_NAME if @@config[:db] == true
51
+
52
+ #Middleware
53
+ app.config.middleware.use ExceptionHandler::Parse if @@config[:db] # && ActiveRecord::Base.connection.table_exists?(:errors unless @@config[:db].blank?) #DB
54
+ app.config.exceptions_app = ->(env) { ExceptionHandler::ExceptionController.action(:show).call(env) } #Controller
26
55
  end
27
56
 
28
57
  end
29
-
30
- ####################
31
- # Config #
32
- ####################
33
-
34
- mattr_accessor :config, :table
35
-
36
- #Vars
37
- @@config ||= Config.new
38
-
39
- #Block (for initializer)
40
- def self.setup
41
- yield(config) if block_given?
42
- end
43
58
  end
@@ -7,24 +7,47 @@
7
7
  ###########################################
8
8
 
9
9
  module ExceptionHandler
10
- class Config
11
- attr_accessor :db, :social, :error_layout, :exception_layout
10
+ class Config
11
+ mattr_accessor :db, :email, :table, :social, :layouts
12
12
 
13
- def db
14
- false
15
- end
13
+ #Default Table Name
14
+ # Has to be "errors" because "exceptions" is a reserved word
15
+ TABLE_NAME = :errors
16
+
17
+ # Defaults
18
+ # Merged with Rails options with @@config in engine
19
+ def self.defaults
20
+ {
21
+ db: false, #-> defaults to :errors if true, else use :table_name
22
+ email: false, #-> need to integrate
23
+ social: {
24
+ :facebook => 'frontline.utilities',
25
+ :twitter => 'frontlineutils',
26
+ :youtube => 'frontlineutils',
27
+ :linkedin => 'frontline-utilities',
28
+ :fusion => 'frontlineutils',
29
+ :url => {
30
+ :facebook => 'https://facebook.com',
31
+ :twitter => 'http://twitter.com',
32
+ :youtube => 'https://youtube.com/user',
33
+ :linkedin => 'https://linkedin.com/company',
34
+ :fusion => 'https://frontlinefusion.com',
35
+ },
36
+ },
37
+ layouts: {
38
+ '400' => nil,
39
+ '500' => 'exception'
40
+ },
41
+ }
42
+ end
43
+
44
+ #404 Callback (needs improving big time)
45
+ #Use the following:
16
46
 
17
- def initialize
18
- @db = false # -> db name (false = no; true = "errors"; [value] = [value])
19
- @social = {
20
- facebook: "https://facebook.com/frontline.utilities",
21
- twitter: "http://twitter.com/frontlineutils",
22
- linkedin: "https://linkedin.com/company/frontline-utilities",
23
- youtube: "https://youtube.com/user/frontlineutils",
24
- fusion: "http://frontlinefusion.com/frontlineutils"
25
- }
26
- @error_layout = nil
27
- @exception_layout = nil
28
- end
29
- end
47
+ #'404' => <<-EOF
48
+ # redirect_to root_url, notice: "Hello"
49
+ #EOF
50
+
51
+ #This will invoke specifics for the
52
+ end
30
53
  end
@@ -0,0 +1,23 @@
1
+ module ExceptionHandler
2
+ class Parse
3
+
4
+ # Init
5
+ def initialize(app)
6
+ @app = app
7
+ end
8
+
9
+ #Exception
10
+ def call(env)
11
+ @app.call(env)
12
+
13
+ rescue Exception => exception
14
+ request = ActionDispatch::Request.new(env)
15
+ controller = env['action_controller.instance']
16
+ ignore = ExceptionHandler::Parser::Ignore.new(exception, request).match?
17
+
18
+ ExceptionHandler::Parser::Data.new(exception, request, controller).save unless ignore
19
+ raise exception
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,53 @@
1
+ module ExceptionHandler
2
+ module Parser
3
+ class Data
4
+
5
+ #Init
6
+ def initialize(exception, request, controller)
7
+ @exception, @request, @controller, @user = exception, request, controller, user
8
+ end
9
+
10
+ #Save
11
+ def save
12
+ #http://blog.habanerohq.com/post/16800611137/selectively-silence-activerecord-logging
13
+ message = ""
14
+ ActiveRecord::Base.logger.silence do
15
+ ExceptionHandler::Error.create info do |error|
16
+ message += "\n======================\n"
17
+ message += "#{error.class_name}:\n"
18
+ message += "\n#{error.message}\n"
19
+ message += Rails.backtrace_cleaner.clean(error.trace.split("\n")).join("\n")
20
+ message += "\n======================\n"
21
+ end
22
+ end
23
+ Rails.logger.fatal message unless message.blank?
24
+ end
25
+
26
+ private
27
+
28
+ #User
29
+ def user
30
+ @controller.send(:current_user) if @controller.respond_to?(:current_user)
31
+ end
32
+
33
+ #Info
34
+ def info
35
+ info = {
36
+ class_name: @exception.class.to_s,
37
+ message: @exception.message.to_s,
38
+ trace: @exception.backtrace.join("\n"),
39
+ target_url: @request.url,
40
+ referer_url: @request.referer,
41
+ params: @request.params.inspect,
42
+ user_agent: @request.user_agent
43
+ }
44
+ if @user && @user.respond_to(:id)
45
+ info[:usable_type] = @user.model_name.human
46
+ info[:usable_id] = @user.id
47
+ end
48
+ return info
49
+ end
50
+
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,32 @@
1
+ module ExceptionHandler
2
+ module Parser
3
+ class Ignore
4
+
5
+ #Init
6
+ def initialize(exception, request)
7
+ @exception, @request = exception, request
8
+ end
9
+
10
+ #Matches?
11
+ def match?
12
+ return true if errors.include?(@exception.class) && @request.referer.blank?
13
+ return true if @request.user_agent =~ bots
14
+ end
15
+
16
+ private
17
+
18
+ #Has to be instance vars for env to handle ActionController::RoutingError constant etc
19
+
20
+ #Errors
21
+ def errors #-> http://ruby-doc.org/core-2.2.0/Array.html#class-Array-label-Creating+Arrays
22
+ Array(ActionController::RoutingError, AbstractController::ActionNotFound, ActiveRecord::RecordNotFound)
23
+ end
24
+
25
+ #Bots
26
+ def bots
27
+ Regexp.new %w(Baidu Gigabot Googlebot libwww-per lwp-trivial msnbot SiteUptime Slurp Wordpress ZIBB ZyBorg Yandex Jyxobot Huaweisymantecspider ApptusBot).join("|"), Regexp::IGNORECASE
28
+ end
29
+
30
+ end
31
+ end
32
+ end
@@ -1,3 +1,3 @@
1
1
  module ExceptionHandler
2
- VERSION = "0.4.1"
3
- end
2
+ VERSION = "0.4.6"
3
+ end
@@ -21,7 +21,7 @@ module ExceptionHandler
21
21
  #Table Name - false = off, true = errors, value = value
22
22
  #Always outputs string for some reason...
23
23
  def table_name
24
- ExceptionHandler.config.db || :errors
24
+ ExceptionHandler.config[:db]
25
25
  end
26
26
 
27
27
  ###########################################
@@ -2,7 +2,7 @@ module ExceptionHandler
2
2
  class ViewsGenerator < Rails::Generators::Base
3
3
 
4
4
  #Views
5
- @@views = %w(views controllers models assets)
5
+ @@views = %w(views controllers helpers models assets)
6
6
 
7
7
  #Options
8
8
  class_option :files, aliases: "-v", default: @@views, type: :array, desc: "Select file types (views, models, controllers, assets)"
@@ -0,0 +1,53 @@
1
+ ########################################################################################
2
+ ## _____ _ _ _ _ _ _ ##
3
+ ## | ___| | | (_) | | | | | | | ##
4
+ ## | |____ _____ ___ _ __ | |_ _ ___ _ __ | |_| | __ _ _ __ __| | | ___ _ __ ##
5
+ ## | __\ \/ / __/ _ \ '_ \| __| |/ _ \| '_ \ | _ |/ _` | '_ \ / _` | |/ _ \ '__| ##
6
+ ## | |___> < (_| __/ |_) | |_| | (_) | | | | | | | | (_| | | | | (_| | | __/ | ##
7
+ ## \____/_/\_\___\___| .__/ \__|_|\___/|_| |_| \_| |_/\__,_|_| |_|\__,_|_|\___|_| ##
8
+ ## | | ##
9
+ ## |_| ##
10
+ ########################################################################################
11
+
12
+ IMPORTANT -
13
+ **IF UPGRADING EXCEPTION HANDLER (to 0.4.5)***
14
+ **DELETE INITIALIZER (config/initializers/exception_handler.rb)**
15
+
16
+ We've changed the initialization process for ExceptionHandler.
17
+
18
+ The initializer has been replaced with /config/application.rb
19
+ options:
20
+
21
+ #config/application.rb
22
+ config.exception_handler = {
23
+ db: false, #-> defaults to :errors if true, else use :table_name
24
+ email: false, #-> need to integrate
25
+ social: {
26
+ :twitter => 'frontlineutils',
27
+ :facebook => 'frontline.utilities',
28
+ :linkedin => 'frontline-utilities',
29
+ :youtube => 'frontlineutils',
30
+ :fusion => 'frontlineutils',
31
+ :url => {
32
+ :facebook => 'https://facebook.com',
33
+ :twitter => 'http://twitter.com',
34
+ :youtube => 'https://youtube.com/user',
35
+ :linkedin => 'https://linkedin.com/company',
36
+ :fusion => 'https://frontlinefusion.com',
37
+ },
38
+ },
39
+ layouts: {
40
+ '400' => nil,
41
+ '500' => 'exception'
42
+ },
43
+ }
44
+
45
+ If you've made any changes to your initializer,
46
+ you MUST DELETE it, replacing the options with
47
+ those in config/application.rb, or
48
+ config/environments/production.rb.
49
+
50
+ More info on the ExceptionHandler github page:
51
+ http://github.com/richpeck/exception_handler
52
+
53
+ Thank you & enjoy!!
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: exception_handler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Peck
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-11-16 00:00:00.000000000 Z
12
+ date: 2015-12-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -126,19 +126,21 @@ files:
126
126
  - app/assets/images/exception_handler/overlay.png
127
127
  - app/assets/stylesheets/exception_handler/error.css.erb
128
128
  - app/controllers/exception_handler/exception_controller.rb
129
+ - app/helpers/exception_handler/application_helper.rb
129
130
  - app/models/exception_handler/error.rb
130
131
  - app/views/exception_handler/exception/show.html.erb
131
- - app/views/layouts/error.html.erb
132
+ - app/views/layouts/exception.html.erb
132
133
  - exception_handler.gemspec
133
134
  - lib/exception_handler.rb
134
135
  - lib/exception_handler/config.rb
135
- - lib/exception_handler/parser.rb
136
+ - lib/exception_handler/parse.rb
137
+ - lib/exception_handler/parser/data.rb
138
+ - lib/exception_handler/parser/ignore.rb
136
139
  - lib/exception_handler/version.rb
137
- - lib/generators/exception_handler/install_generator.rb
138
140
  - lib/generators/exception_handler/migration_generator.rb
139
141
  - lib/generators/exception_handler/views_generator.rb
140
- - lib/generators/templates/config.rb
141
142
  - lib/generators/templates/migration.rb.erb
143
+ - post_install_message.md
142
144
  - readme/400.jpg
143
145
  - readme/500.jpg
144
146
  - readme/application_controller.jpg
@@ -155,13 +157,35 @@ files:
155
157
  - readme/subtitle.jpg
156
158
  - readme/title.png
157
159
  - readme/view.jpg
158
- - spec/installation_spec.rb
159
160
  - spec/spec_helper.rb
160
161
  homepage: http://frontlineutilities.co.uk/ror/custom_error_pages
161
162
  licenses:
162
163
  - MIT
163
164
  metadata: {}
164
- post_install_message:
165
+ post_install_message: "########################################################################################\n##
166
+ \ _____ _ _ _ _ _ _ ##\n##
167
+ | ___| | | (_) | | | | | | | ##\n##
168
+ | |____ _____ ___ _ __ | |_ _ ___ _ __ | |_| | __ _ _ __ __| | | ___ _ __
169
+ \ ##\n## | __\\ \\/ / __/ _ \\ '_ \\| __| |/ _ \\| '_ \\ | _ |/ _` | '_ \\
170
+ / _` | |/ _ \\ '__| ##\n## | |___> < (_| __/ |_) | |_| | (_) | | | | | | | |
171
+ (_| | | | | (_| | | __/ | ##\n## \\____/_/\\_\\___\\___| .__/ \\__|_|\\___/|_|
172
+ |_| \\_| |_/\\__,_|_| |_|\\__,_|_|\\___|_| ## \n## | | ##\n##
173
+ \ |_| ##\n########################################################################################\n\nIMPORTANT
174
+ -\n**IF UPGRADING EXCEPTION HANDLER (to 0.4.5)***\n**DELETE INITIALIZER (config/initializers/exception_handler.rb)**\n\nWe've
175
+ changed the initialization process for ExceptionHandler.\n\nThe initializer has
176
+ been replaced with /config/application.rb\noptions:\n\n#config/application.rb\nconfig.exception_handler
177
+ = {\n\tdb: \tfalse, #-> defaults to :errors if true, else use :table_name\n\temail:
178
+ \tfalse, #-> need to integrate\n\tsocial: {\n\t :twitter \t=> \t'frontlineutils',\n\t
179
+ \ :facebook \t=> \t'frontline.utilities',\n\t :linkedin \t=> \t'frontline-utilities',\n\t
180
+ \ :youtube \t=>\t'frontlineutils',\n\t :fusion \t=> \t'frontlineutils',\n\t
181
+ \ :url => {\n\t\t :facebook \t=> \t'https://facebook.com',\n\t\t :twitter
182
+ \t=> \t'http://twitter.com',\n\t\t :youtube \t=>\t'https://youtube.com/user',\n\t\t
183
+ \ :linkedin \t=> \t'https://linkedin.com/company',\n\t\t :fusion \t=> \t'https://frontlinefusion.com',\n\t\t},\n\t},\n\tlayouts:
184
+ {\n\t '400' => nil,\n\t '500' => 'exception'\n\t},\n}\n\nIf you've made any
185
+ changes to your initializer,\nyou MUST DELETE it, replacing the options with\nthose
186
+ in config/application.rb, or\nconfig/environments/production.rb.\n\nMore info on
187
+ the ExceptionHandler github page:\nhttp://github.com/richpeck/exception_handler\n\nThank
188
+ you & enjoy!!"
165
189
  rdoc_options: []
166
190
  require_paths:
167
191
  - lib
@@ -183,5 +207,4 @@ specification_version: 4
183
207
  summary: Rails gem to show custom error pages in production. Also logs errors in "errors"
184
208
  db if required
185
209
  test_files:
186
- - spec/installation_spec.rb
187
210
  - spec/spec_helper.rb
@@ -1,87 +0,0 @@
1
- module ExceptionHandler
2
-
3
- #Message
4
- class Message
5
-
6
- # Init
7
- def initialize(app)
8
- @app = app
9
- end
10
-
11
- #Error
12
- def call(env)
13
- @app.call(env)
14
-
15
- rescue Exception => exception
16
- request = ActionDispatch::Request.new(env)
17
- controller = env['action_controller.instance']
18
-
19
- ExceptionHandler::Parser.new(exception, request, controller).save unless self.ignore?(exception, request)
20
- raise exception
21
- end
22
-
23
- #Ignore
24
- def ignore?(exception, request, ignored = {})
25
- ignored[:errors] = [ActionController::RoutingError, AbstractController::ActionNotFound, ActiveRecord::RecordNotFound]
26
- ignored[:bots] = /\b(Baidu|Gigabot|Googlebot|libwww-per|lwp-trivial|msnbot|SiteUptime|Slurp|Wordpress|ZIBB|ZyBorg|Yandex|Jyxobot|Huaweisymantecspider|ApptusBot)\b/i
27
-
28
- return true if ignored[:errors].include?(exception.class) && request.referer.blank?
29
- return true if request.user_agent =~ ignored[:bots]
30
- end
31
-
32
- end
33
-
34
- #Parse
35
- class Parser
36
-
37
- #Init
38
- def initialize(exception, request, controller)
39
- @exception, @request, @controller = exception, request, controller
40
- end
41
-
42
- #Save
43
- def save
44
- ActiveRecord::Base.logger.silence do
45
- ExceptionHandler::Error.create(relevant_info)
46
- end
47
- log(relevant_info)
48
- end
49
-
50
- #Info
51
- def relevant_info(info = {})
52
- info[:class_name] = @exception.class.to_s
53
- info[:message] = @exception.to_s
54
- info[:trace] = @exception.backtrace.join("\n")
55
- info[:target_url] = @request.url
56
- info[:referer_url] = @request.referer
57
- info[:params] = @request.params.inspect
58
- info[:user_agent] = @request.user_agent
59
- if user
60
- info[:usable_type] = user[:type]
61
- info[:usable_id] = user[:id]
62
- end
63
- return info
64
- end
65
-
66
- #User
67
- def user(data = {})
68
- # => refer to Joe's if want to find admin / user
69
- if(@controller.respond_to?("current_user"))
70
- user = @controller.send("current_user")
71
- [:id].each do |field|
72
- data[:id] = user.send(field) if user.respond_to?(field)
73
- data[:type] = "User" if @controller.respond_to?("current_user")
74
- end
75
- end
76
- return data
77
- end
78
-
79
- #Log
80
- def log(info)
81
- message = "#{info[:class_name]} (#{info[:message]}):\n "
82
- message += Rails.backtrace_cleaner.clean(info[:trace].split("\n")).join("\n")
83
- Rails.logger.fatal(message)
84
- end
85
-
86
- end
87
- end
@@ -1,20 +0,0 @@
1
- module ExceptionHandler
2
- class Generators
3
- class InstallGenerator < Rails::Generators::Base
4
-
5
- #Needed to reference files
6
- source_root File.expand_path("../../templates", __FILE__)
7
-
8
- ###########################################
9
-
10
- #Config
11
- def create_config_file
12
- return unless options.empty?
13
- template "config.rb", "config/initializers/exception_handler.rb" # https://github.com/plataformatec/devise/blob/master/lib/generators/devise/install_generator.rb#L13
14
- end
15
-
16
- ###########################################
17
-
18
- end
19
- end
20
- end
@@ -1,43 +0,0 @@
1
- #################################################################################################
2
- ## ##
3
- ## ______ __ _ __ __ ____ ##
4
- ## / ____/ __________ ____ / /_(_)___ ____ / / / /___ _____ ____/ / /__ _____ ##
5
- ## / __/ | |/_/ ___/ _ \/ __ \/ __/ / __ \/ __ \ / /_/ / __ `/ __ \/ __ / / _ \/ ___/ ##
6
- ## / /____> </ /__/ __/ /_/ / /_/ / /_/ / / / / / __ / /_/ / / / / /_/ / / __/ / ##
7
- ## /_____/_/|_|\___/\___/ .___/\__/_/\____/_/ /_/ /_/ /_/\__,_/_/ /_/\__,_/_/\___/_/ ##
8
- ## /_/ ##
9
- ## ##
10
- #################################################################################################
11
- # You can add different settings using this file #
12
- # Use the docs at http://github.com/richpeck/exception_handler for info #
13
- #################################################################################################
14
-
15
- # config/initializers/exception_handler.rb
16
- ExceptionHandler.setup do |config|
17
-
18
- # DB -
19
- # false / true / :table_name (must exist)
20
- config.db = false
21
-
22
- # Exception Layout (for 500 errors, defaults to Error)
23
- # false / name (str or sym)
24
- #config.exception_layout = :your_name
25
-
26
- # Error Layout (for 400 errors, defaults to Application)
27
- # false / name (str or sym)
28
- #config.error_layout = :your_name
29
-
30
- # Email -
31
- # false / true
32
- # config.email =
33
-
34
- # Social
35
- config.social = {
36
- twitter: 'http://twitter.com/frontlineutils',
37
- facebook: 'https://facebook.com/frontline.utilities',
38
- linkedin: 'https://linkedin.com/company/frontline-utilities',
39
- youtube: 'https://youtube.com/user/frontlineutils',
40
- fusion: 'http://frontlinefusion.com/frontlineutils'
41
- }
42
-
43
- end
@@ -1,24 +0,0 @@
1
- ###########################################
2
-
3
- require 'spec_helper'
4
-
5
- ###########################################
6
-
7
- class InstallationSpec < Rails::Generators::TestCase
8
-
9
- #Setup
10
- tests ExceptionHandler::Generators::InstallGenerator
11
- destination File.expand_path("../../tmp", __FILE__)
12
-
13
- #Before
14
- setup do
15
- prepare_destination
16
- run_generator
17
- end
18
-
19
- #Config Installer
20
- test "assert Config Files Are Created" do
21
- assert_file "config/initializers/exception_handler.rb"
22
- end
23
-
24
- end