exception_handler 0.4.7 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +11 -0
  3. data/.rspec +3 -1
  4. data/Gemfile +1 -1
  5. data/README.md +241 -92
  6. data/app/controllers/exception_handler/exception_controller.rb +13 -44
  7. data/app/helpers/exception_handler/application_helper.rb +47 -23
  8. data/app/models/exception_handler/error.rb +10 -9
  9. data/app/services/exception_handler/exception.rb +34 -0
  10. data/app/views/exception_handler/exception/show.html.erb +9 -6
  11. data/app/views/layouts/exception.html.erb +3 -3
  12. data/config/locales/en.yml +9 -0
  13. data/exception_handler.gemspec +16 -6
  14. data/lib/exception_handler.rb +67 -32
  15. data/lib/exception_handler/config.rb +49 -46
  16. data/lib/exception_handler/parse.rb +17 -17
  17. data/lib/exception_handler/parser/data.rb +57 -51
  18. data/lib/exception_handler/parser/ignore.rb +23 -23
  19. data/lib/exception_handler/version.rb +1 -1
  20. data/lib/generators/exception_handler/migration_generator.rb +17 -17
  21. data/lib/generators/exception_handler/views_generator.rb +27 -27
  22. data/spec/database.yml +3 -0
  23. data/spec/dummy/Rakefile +6 -0
  24. data/spec/dummy/app/assets/config/manifest.js +4 -0
  25. data/spec/dummy/app/assets/images/.keep +0 -0
  26. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  27. data/spec/dummy/app/assets/javascripts/cable.coffee +11 -0
  28. data/spec/dummy/app/assets/javascripts/channels/.keep +0 -0
  29. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  30. data/spec/dummy/app/channels/application_cable/channel.rb +5 -0
  31. data/spec/dummy/app/channels/application_cable/connection.rb +5 -0
  32. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  33. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  34. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  35. data/spec/dummy/app/jobs/application_job.rb +2 -0
  36. data/spec/dummy/app/mailers/application_mailer.rb +4 -0
  37. data/spec/dummy/app/models/application_record.rb +3 -0
  38. data/spec/dummy/app/models/concerns/.keep +0 -0
  39. data/spec/dummy/app/views/layouts/application.html.erb +15 -0
  40. data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
  41. data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
  42. data/spec/dummy/bin/bundle +3 -0
  43. data/spec/dummy/bin/rails +4 -0
  44. data/spec/dummy/bin/rake +4 -0
  45. data/spec/dummy/bin/setup +34 -0
  46. data/spec/dummy/bin/update +29 -0
  47. data/spec/dummy/config.ru +8 -0
  48. data/spec/dummy/config/application.rb +21 -0
  49. data/spec/dummy/config/boot.rb +5 -0
  50. data/spec/dummy/config/cable.yml +10 -0
  51. data/spec/dummy/config/database.yml +25 -0
  52. data/spec/dummy/config/environment.rb +5 -0
  53. data/spec/dummy/config/environments/development.rb +62 -0
  54. data/spec/dummy/config/environments/production.rb +87 -0
  55. data/spec/dummy/config/environments/test.rb +42 -0
  56. data/spec/dummy/config/initializers/active_record_belongs_to_required_by_default.rb +6 -0
  57. data/spec/dummy/config/initializers/application_controller_renderer.rb +6 -0
  58. data/spec/dummy/config/initializers/assets.rb +11 -0
  59. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  60. data/spec/dummy/config/initializers/callback_terminator.rb +6 -0
  61. data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
  62. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  63. data/spec/dummy/config/initializers/inflections.rb +16 -0
  64. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  65. data/spec/dummy/config/initializers/per_form_csrf_tokens.rb +4 -0
  66. data/spec/dummy/config/initializers/request_forgery_protection.rb +4 -0
  67. data/spec/dummy/config/initializers/session_store.rb +3 -0
  68. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  69. data/spec/dummy/config/locales/en.yml +23 -0
  70. data/spec/dummy/config/puma.rb +47 -0
  71. data/spec/dummy/config/routes.rb +6 -0
  72. data/spec/dummy/config/secrets.yml +22 -0
  73. data/spec/dummy/lib/assets/.keep +0 -0
  74. data/spec/dummy/log/.keep +0 -0
  75. data/spec/dummy/public/404.html +67 -0
  76. data/spec/dummy/public/422.html +67 -0
  77. data/spec/dummy/public/500.html +66 -0
  78. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  79. data/spec/dummy/public/apple-touch-icon.png +0 -0
  80. data/spec/dummy/public/favicon.ico +0 -0
  81. data/spec/exception_handler.rb +22 -0
  82. data/spec/helpers/exception_handler/application_helper_spec.rb +42 -0
  83. data/spec/spec_helper.rb +28 -9
  84. metadata +102 -39
  85. data/readme/400.jpg +0 -0
  86. data/readme/500.jpg +0 -0
  87. data/readme/application_controller.jpg +0 -0
  88. data/readme/config.jpg +0 -0
  89. data/readme/db.jpg +0 -0
  90. data/readme/db_edit.jpg +0 -0
  91. data/readme/dev.jpg +0 -0
  92. data/readme/exception_controller.jpg +0 -0
  93. data/readme/exceptions_app.png +0 -0
  94. data/readme/layout.jpg +0 -0
  95. data/readme/parser.jpg +0 -0
  96. data/readme/rubygems.jpg +0 -0
  97. data/readme/source/screen.psd +0 -0
  98. data/readme/source/subtitle.psd +0 -0
  99. data/readme/source/title.psd +0 -0
  100. data/readme/subtitle.jpg +0 -0
  101. data/readme/title.jpg +0 -0
  102. data/readme/titles/bugs.png +0 -0
  103. data/readme/titles/contents.png +0 -0
  104. data/readme/titles/contribution.png +0 -0
  105. data/readme/titles/custom_error_pages.png +0 -0
  106. data/readme/titles/support.png +0 -0
  107. data/readme/titles/testing.png +0 -0
  108. data/readme/titles/title.psd +0 -0
  109. data/readme/view.jpg +0 -0
@@ -7,59 +7,62 @@
7
7
  ###########################################
8
8
 
9
9
  module ExceptionHandler
10
- class Config
10
+ class Config
11
11
 
12
- #Instace Objects
13
- attr_accessor :db, :email, :social, :layouts
12
+ #Instace Objects
13
+ attr_accessor :dev, :db, :email, :social, :layouts
14
14
 
15
- ###########################################
15
+ ###########################################
16
16
 
17
- #Init
18
- def initialize values
19
- defaults = values.present? ? Config::DEFAULTS.deep_merge!(values) : Config::DEFAULTS
20
- defaults.each do |k,v|
21
- instance_variable_set("@#{k}",v) #-> http://apidock.com/ruby/Object/instance_variable_set
22
- end
23
- end
17
+ #Init
18
+ def initialize values=nil
19
+ defaults = values.present? ? Config::DEFAULTS.deep_merge!(values) : Config::DEFAULTS
20
+ defaults.each do |k,v|
21
+ instance_variable_set("@#{k}",v) #-> http://apidock.com/ruby/Object/instance_variable_set
22
+ end
23
+ end
24
24
 
25
- # INSTANCE METHODS #
25
+ # INSTANCE METHODS #
26
26
 
27
- #DB
28
- def db
29
- @db == true ? Config::TABLE_NAME : @db
30
- end
27
+ #DB
28
+ def db
29
+ @db == true ? Config::TABLE_NAME : @db
30
+ end
31
31
 
32
- ###########################################
32
+ ###########################################
33
33
 
34
- #Default Table Name
35
- # Has to be "errors" because "exceptions" is a reserved word
36
- TABLE_NAME = :errors
34
+ #Default Table Name
35
+ # Has to be "errors" because "exceptions" is a reserved word
36
+ TABLE_NAME = :errors
37
37
 
38
- # Defaults
39
- # http://stackoverflow.com/a/8917301/1143732
40
- DEFAULTS = {
41
- db: false, #-> defaults to :errors if true, else use :table_name
42
- email: false, #-> need to integrate
43
- social: {
44
- :facebook => 'frontline.utilities',
45
- :twitter => 'frontlineutils',
46
- :youtube => 'frontlineutils',
47
- :linkedin => 'frontline-utilities',
48
- :fusion => 'frontlineutils',
49
- :url => {
50
- :facebook => 'https://facebook.com',
51
- :twitter => 'http://twitter.com',
52
- :youtube => 'https://youtube.com/user',
53
- :linkedin => 'https://linkedin.com/company',
54
- :fusion => 'https://frontlinefusion.com',
55
- },
56
- },
57
- layouts: {
58
- '400' => nil,
59
- '404' => nil, #-> 404 Callback (needs improving big time) Use the following: '404' => <<-EOF redirect_to root_url, notice: "Hello" EOF
60
- '500' => 'exception'
61
- },
62
- }
38
+ # Defaults
39
+ # http://stackoverflow.com/a/8917301/1143732
40
+ DEFAULTS = {
41
+ dev: false, #-> defaults to "false" for dev mode
42
+ db: false, #-> defaults to :errors if true, else use "table_name" / :table_name
43
+ email: false, #-> need to integrate
44
+ social: {
45
+ :facebook => 'frontline.utilities',
46
+ :twitter => 'frontlineutils',
47
+ :youtube => 'frontlineutils',
48
+ :linkedin => 'frontline-utilities',
49
+ :fusion => 'frontlineutils',
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
+ },
57
+ },
58
+ layouts: {
59
+ '404' => nil, #-> 404 Callback (needs improving big time) Use the following: '404' => <<-EOF redirect_to root_url, notice: "Hello" EOF
60
+ '400' => nil, #-> layout for 400 error code (404 should only be used as response)
61
+ '500' => 'exception'
62
+ },
63
+ }
63
64
 
64
- end
65
+ ###########################################
66
+
67
+ end
65
68
  end
@@ -1,23 +1,23 @@
1
1
  module ExceptionHandler
2
- class Parse
2
+ class Parse
3
3
 
4
- # Init
5
- def initialize(app)
6
- @app = app
7
- end
4
+ # Init
5
+ def initialize(app)
6
+ @app = app
7
+ end
8
8
 
9
- #Exception
10
- def call(env)
11
- @app.call(env)
9
+ #Exception
10
+ def call(env)
11
+ @app.call(env)
12
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?
13
+ rescue Exception => exception
14
+ request = ActionDispatch::Request.new(env)
15
+ controller = request.env['action_controller.instance']
16
+ ignore = ExceptionHandler::Parser::Ignore.new(exception, request).match?
17
17
 
18
- ExceptionHandler::Parser::Data.new(exception, request, controller).save unless ignore
19
- raise exception
20
- end
18
+ ExceptionHandler::Parser::Data.create exception, request, controller unless ignore
19
+ raise exception
20
+ end
21
21
 
22
- end
23
- end
22
+ end
23
+ end
@@ -1,53 +1,59 @@
1
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
2
+ module Parser
3
+ class Data
4
+
5
+ # Data
6
+ attr_reader :exception, :request, :controller, :user
7
+
8
+ #Create
9
+ class << self
10
+ def create exception, request, controller
11
+
12
+ @exception = exception
13
+ @request = request
14
+ @controller = controller
15
+
16
+ #http://blog.habanerohq.com/post/16800611137/selectively-silence-activerecord-logging
17
+ message = ""
18
+ Rails.logger.silence do #-> stops Error.create from showing output
19
+ ExceptionHandler::Error.create info do |error|
20
+ message += "\n======================\n"
21
+ message += "#{error.class_name}:\n"
22
+ message += "\n#{error.message}\n"
23
+ message += Rails.backtrace_cleaner.clean(error.trace.split("\n")).join("\n")
24
+ message += "\n======================\n"
25
+ end
26
+ end
27
+ Rails.logger.fatal message unless message.blank?
28
+
29
+ end
30
+ end
31
+
32
+ private
33
+
34
+ #User
35
+ def user
36
+ @controller.send(:current_user) if @controller.respond_to?(:current_user)
37
+ end
38
+
39
+ #Info
40
+ def info
41
+ info = {
42
+ class_name: @exception.class.to_s,
43
+ message: @exception.message.to_s,
44
+ trace: @exception.backtrace.join("\n"),
45
+ target_url: @request.url,
46
+ referer_url: @request.referer,
47
+ params: @request.params.inspect,
48
+ user_agent: @request.user_agent
49
+ }
50
+ if @user && @user.respond_to(:id)
51
+ info[:usable_type] = @user.model_name.human
52
+ info[:usable_id] = @user.id
53
+ end
54
+ info
55
+ end
56
+
57
+ end
58
+ end
53
59
  end
@@ -1,32 +1,32 @@
1
1
  module ExceptionHandler
2
- module Parser
3
- class Ignore
2
+ module Parser
3
+ class Ignore
4
4
 
5
- #Init
6
- def initialize(exception, request)
7
- @exception, @request = exception, request
8
- end
5
+ #Init
6
+ def initialize(exception, request)
7
+ @exception, @request = exception, request
8
+ end
9
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
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
15
 
16
- private
16
+ private
17
17
 
18
- #Has to be instance vars for env to handle ActionController::RoutingError constant etc
18
+ #Has to be instance vars for env to handle ActionController::RoutingError constant etc
19
19
 
20
- #Errors
21
- def errors #-> http://ruby-doc.org/core-2.2.0/Array.html#class-Array-label-Creating+Arrays
22
- [ActionController::RoutingError, AbstractController::ActionNotFound, ActiveRecord::RecordNotFound]
23
- end
20
+ #Errors
21
+ def errors #-> http://ruby-doc.org/core-2.2.0/Array.html#class-Array-label-Creating+Arrays
22
+ [ActionController::RoutingError, AbstractController::ActionNotFound, ActiveRecord::RecordNotFound]
23
+ end
24
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
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
29
 
30
- end
31
- end
30
+ end
31
+ end
32
32
  end
@@ -1,3 +1,3 @@
1
1
  module ExceptionHandler
2
- VERSION = "0.4.7"
2
+ VERSION = "0.5.1"
3
3
  end
@@ -10,28 +10,28 @@ require 'rails/generators/active_record'
10
10
  module ExceptionHandler
11
11
  class MigrationGenerator < ActiveRecord::Generators::Base
12
12
 
13
- #Name - from http://old.thoughtsincomputation.com/posts/cgfr3-part-3-adding-a-generator
14
- argument :name, default: "migration"
13
+ #Name - from http://old.thoughtsincomputation.com/posts/cgfr3-part-3-adding-a-generator
14
+ argument :name, default: "migration"
15
15
 
16
- #Source of Migrations
17
- source_root File.expand_path("../../templates", __FILE__)
16
+ #Source of Migrations
17
+ source_root File.expand_path("../../templates", __FILE__)
18
18
 
19
- ###########################################
19
+ ###########################################
20
20
 
21
- #Table Name - false = off, true = errors, value = value
22
- #Always outputs string for some reason...
23
- def table_name
24
- ExceptionHandler.config.db
25
- end
21
+ #Table Name - false = off, true = errors, value = value
22
+ #Always outputs string for some reason...
23
+ def table_name
24
+ ExceptionHandler.config.db
25
+ end
26
26
 
27
- ###########################################
27
+ ###########################################
28
28
 
29
- #Create
30
- def create_errors_migration
31
- migration_template "migration.rb.erb", "db/migrate/create_errors.rb"
32
- end
29
+ #Create
30
+ def create_errors_migration
31
+ migration_template "migration.rb.erb", "db/migrate/create_errors.rb"
32
+ end
33
33
 
34
- ###########################################
34
+ ###########################################
35
35
 
36
- end
36
+ end
37
37
  end
@@ -1,42 +1,42 @@
1
1
  module ExceptionHandler
2
- class ViewsGenerator < Rails::Generators::Base
2
+ class ViewsGenerator < Rails::Generators::Base
3
3
 
4
- #Views
5
- @@views = %w(views controllers helpers models assets)
4
+ #Views
5
+ @@views = %w(views controllers helpers models assets)
6
6
 
7
- #Options
8
- class_option :files, aliases: "-v", default: @@views, type: :array, desc: "Select file types (views, models, controllers, assets)"
7
+ #Options
8
+ class_option :files, aliases: "-v", default: @@views, type: :array, desc: "Select file types (views, models, controllers, assets)"
9
9
 
10
- #Needed to reference files
11
- source_root File.expand_path("../../../../app", __FILE__)
10
+ #Needed to reference files
11
+ source_root File.expand_path("../../../../app", __FILE__)
12
12
 
13
- ###########################################
13
+ ###########################################
14
14
 
15
- #Files
16
- def create_files
17
- generate_files options.files
18
- end
15
+ #Files
16
+ def create_files
17
+ generate_files options.files
18
+ end
19
19
 
20
- ###########################################
20
+ ###########################################
21
21
 
22
- protected
22
+ protected
23
23
 
24
- #File Generator
25
- def generate_files args
24
+ #File Generator
25
+ def generate_files args
26
26
 
27
- #Valid?
28
- return raise args.inspect unless args.nil? || (args-@@views).empty?
27
+ #Valid?
28
+ return raise args.inspect unless args.nil? || (args-@@views).empty?
29
29
 
30
- #Types
31
- for arg in args do
32
- directory arg, "app/#{arg}"
33
- end
30
+ #Types
31
+ for arg in args do
32
+ directory arg, "app/#{arg}"
33
+ end
34
34
 
35
- #Success
36
- puts "Files transferred successfully"
37
- end
35
+ #Success
36
+ puts "Files transferred successfully"
37
+ end
38
38
 
39
- ###########################################
39
+ ###########################################
40
40
 
41
- end
41
+ end
42
42
  end
@@ -0,0 +1,3 @@
1
+ test:
2
+ adapter: sqlite3
3
+ database: ":memory:" #-> https://github.com/thoughtbot/paperclip/blob/master/spec/database.yml
@@ -0,0 +1,6 @@
1
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
2
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
+
4
+ require File.expand_path('../config/application', __FILE__)
5
+
6
+ Rails.application.load_tasks