tartarus 1.0.3 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. data/.gitignore +1 -0
  2. data/.rvmrc +2 -0
  3. data/Gemfile +10 -0
  4. data/Gemfile.lock +104 -0
  5. data/README.rdoc +30 -4
  6. data/Rakefile +10 -28
  7. data/{generators → lib/generators}/tartarus/USAGE +4 -3
  8. data/lib/generators/tartarus/tartarus_generator.rb +36 -0
  9. data/{generators → lib/generators}/tartarus/templates/app/controllers/exceptions_controller.rb +0 -0
  10. data/{generators → lib/generators}/tartarus/templates/app/models/logged_exception.rb +0 -0
  11. data/{generators → lib/generators}/tartarus/templates/app/views/exceptions/_exception.html.erb +0 -0
  12. data/{generators → lib/generators}/tartarus/templates/app/views/exceptions/details.html.erb +0 -0
  13. data/{generators → lib/generators}/tartarus/templates/app/views/exceptions/index.html.erb +0 -0
  14. data/{generators → lib/generators}/tartarus/templates/config/exceptions.yml +0 -0
  15. data/{generators → lib/generators}/tartarus/templates/db/migrate/add_logged_exceptions.rb +0 -0
  16. data/{generators → lib/generators}/tartarus/templates/public/javascripts/tartarus.jquery.js +0 -0
  17. data/{generators → lib/generators}/tartarus/templates/public/stylesheets/tartarus.css +0 -0
  18. data/{generators → lib/generators}/tartarus/templates/spec/controllers/exceptions_controller_spec.rb +1 -1
  19. data/{generators → lib/generators}/tartarus/templates/spec/models/logged_exception_spec.rb +0 -0
  20. data/lib/tartarus.rb +7 -3
  21. data/lib/tartarus/logger.rb +50 -14
  22. data/lib/tartarus/notifiers/mail.rb +25 -0
  23. data/lib/tartarus/rack.rb +23 -0
  24. data/lib/tartarus/railtie.rb +9 -0
  25. data/lib/tartarus/version.rb +3 -0
  26. data/spec/rails_app/.gitignore +4 -0
  27. data/spec/rails_app/.rspec +1 -0
  28. data/spec/rails_app/Gemfile +13 -0
  29. data/spec/rails_app/Gemfile.lock +99 -0
  30. data/spec/rails_app/README +256 -0
  31. data/spec/rails_app/Rakefile +7 -0
  32. data/spec/rails_app/app/controllers/application_controller.rb +3 -0
  33. data/spec/rails_app/app/controllers/logged_exceptions_controller.rb +31 -0
  34. data/spec/rails_app/app/helpers/application_helper.rb +2 -0
  35. data/spec/{rails → rails_app}/app/models/logged_exception.rb +2 -1
  36. data/spec/rails_app/app/views/layouts/application.html.erb +14 -0
  37. data/spec/rails_app/app/views/logged_exceptions/_exception.html.erb +14 -0
  38. data/spec/rails_app/app/views/logged_exceptions/details.html.erb +86 -0
  39. data/spec/rails_app/app/views/logged_exceptions/index.html.erb +28 -0
  40. data/spec/rails_app/config.ru +4 -0
  41. data/spec/rails_app/config/application.rb +42 -0
  42. data/spec/rails_app/config/boot.rb +13 -0
  43. data/spec/rails_app/config/database.yml +22 -0
  44. data/spec/rails_app/config/environment.rb +5 -0
  45. data/spec/rails_app/config/environments/development.rb +26 -0
  46. data/spec/rails_app/config/environments/production.rb +49 -0
  47. data/spec/rails_app/config/environments/test.rb +35 -0
  48. data/spec/rails_app/config/exceptions.yml +18 -0
  49. data/spec/{rails → rails_app}/config/initializers/backtrace_silencers.rb +2 -2
  50. data/spec/{rails → rails_app}/config/initializers/inflections.rb +1 -1
  51. data/spec/{rails → rails_app}/config/initializers/mime_types.rb +0 -0
  52. data/spec/rails_app/config/initializers/secret_token.rb +7 -0
  53. data/spec/rails_app/config/initializers/session_store.rb +8 -0
  54. data/spec/{rails → rails_app}/config/locales/en.yml +1 -1
  55. data/spec/rails_app/config/routes.rb +58 -0
  56. data/spec/rails_app/db/migrate/20101230191040_add_logged_exception_table.rb +19 -0
  57. data/spec/rails_app/db/schema.rb +28 -0
  58. data/spec/rails_app/db/seeds.rb +7 -0
  59. data/spec/rails_app/doc/README_FOR_APP +2 -0
  60. data/spec/rails_app/lib/tasks/.gitkeep +0 -0
  61. data/spec/rails_app/public/404.html +26 -0
  62. data/spec/rails_app/public/422.html +26 -0
  63. data/spec/rails_app/public/500.html +26 -0
  64. data/spec/rails_app/public/favicon.ico +0 -0
  65. data/spec/rails_app/public/images/rails.png +0 -0
  66. data/spec/rails_app/public/javascripts/application.js +2 -0
  67. data/spec/rails_app/public/javascripts/controls.js +965 -0
  68. data/spec/rails_app/public/javascripts/dragdrop.js +974 -0
  69. data/spec/rails_app/public/javascripts/effects.js +1123 -0
  70. data/spec/rails_app/public/javascripts/prototype.js +6001 -0
  71. data/spec/rails_app/public/javascripts/rails.js +175 -0
  72. data/spec/rails_app/public/javascripts/tartarus.jquery.js +8 -0
  73. data/spec/rails_app/public/robots.txt +5 -0
  74. data/spec/rails_app/public/stylesheets/.gitkeep +0 -0
  75. data/spec/rails_app/public/stylesheets/tartarus.css +26 -0
  76. data/spec/rails_app/script/rails +6 -0
  77. data/spec/rails_app/spec/controllers/logged_exceptions_controller_spec.rb +83 -0
  78. data/spec/rails_app/spec/models/logged_exception_spec.rb +7 -0
  79. data/spec/rails_app/spec/spec_helper.rb +27 -0
  80. data/spec/rails_app/vendor/plugins/.gitkeep +0 -0
  81. data/spec/spec_helper.rb +14 -7
  82. data/spec/tartarus/logger_spec.rb +51 -23
  83. data/spec/tartarus_spec.rb +5 -8
  84. data/tartarus.gemspec +11 -103
  85. metadata +148 -94
  86. data/VERSION +0 -1
  87. data/generators/tartarus/tartarus_generator.rb +0 -50
  88. data/lib/tartarus/notifier.rb +0 -11
  89. data/lib/tartarus/rescue.rb +0 -39
  90. data/rails/init.rb +0 -3
  91. data/spec/rails/app/controllers/application_controller.rb +0 -10
  92. data/spec/rails/config/boot.rb +0 -110
  93. data/spec/rails/config/database.yml +0 -5
  94. data/spec/rails/config/environment.rb +0 -41
  95. data/spec/rails/config/environments/development.rb +0 -17
  96. data/spec/rails/config/environments/production.rb +0 -28
  97. data/spec/rails/config/environments/test.rb +0 -28
  98. data/spec/rails/config/exceptions.yml +0 -9
  99. data/spec/rails/config/initializers/new_rails_defaults.rb +0 -21
  100. data/spec/rails/config/initializers/session_store.rb +0 -15
  101. data/spec/rails/config/routes.rb +0 -43
  102. data/spec/rails/db/test.sqlite3 +0 -0
  103. data/spec/rcov.opts +0 -3
  104. data/spec/spec.opts +0 -4
  105. data/spec/tartarus/rescue_spec.rb +0 -86
  106. data/views/tartarus_notifier/notification.html.erb +0 -9
data/.gitignore CHANGED
@@ -1,5 +1,6 @@
1
1
  *.sw?
2
2
  .DS_Store
3
+ .bundle
3
4
  coverage
4
5
  rdoc
5
6
  pkg
data/.rvmrc ADDED
@@ -0,0 +1,2 @@
1
+ rvm_install_on_use_flag=1
2
+ rvm ruby-1.8.7-p302@tartarus
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source :gemcutter
2
+
3
+ gemspec
4
+
5
+ gem 'rails', '~> 3.0.0'
6
+ gem 'rspec', '~> 2.3.0'
7
+ gem 'rspec-rails', '~> 2.3.1'
8
+ gem 'rcov', '~> 0.9.9'
9
+ gem 'json', '~> 1.4.6'
10
+ gem 'sqlite3-ruby', :require => 'sqlite3'
data/Gemfile.lock ADDED
@@ -0,0 +1,104 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ tartarus (2.0.0)
5
+ json (~> 1.4.6)
6
+ will_paginate (~> 3.0.pre2)
7
+
8
+ GEM
9
+ remote: http://rubygems.org/
10
+ specs:
11
+ abstract (1.0.0)
12
+ actionmailer (3.0.0)
13
+ actionpack (= 3.0.0)
14
+ mail (~> 2.2.5)
15
+ actionpack (3.0.0)
16
+ activemodel (= 3.0.0)
17
+ activesupport (= 3.0.0)
18
+ builder (~> 2.1.2)
19
+ erubis (~> 2.6.6)
20
+ i18n (~> 0.4.1)
21
+ rack (~> 1.2.1)
22
+ rack-mount (~> 0.6.12)
23
+ rack-test (~> 0.5.4)
24
+ tzinfo (~> 0.3.23)
25
+ activemodel (3.0.0)
26
+ activesupport (= 3.0.0)
27
+ builder (~> 2.1.2)
28
+ i18n (~> 0.4.1)
29
+ activerecord (3.0.0)
30
+ activemodel (= 3.0.0)
31
+ activesupport (= 3.0.0)
32
+ arel (~> 1.0.0)
33
+ tzinfo (~> 0.3.23)
34
+ activeresource (3.0.0)
35
+ activemodel (= 3.0.0)
36
+ activesupport (= 3.0.0)
37
+ activesupport (3.0.0)
38
+ arel (1.0.1)
39
+ activesupport (~> 3.0.0)
40
+ builder (2.1.2)
41
+ diff-lcs (1.1.2)
42
+ erubis (2.6.6)
43
+ abstract (>= 1.0.0)
44
+ i18n (0.4.2)
45
+ json (1.4.6)
46
+ mail (2.2.13)
47
+ activesupport (>= 2.3.6)
48
+ i18n (>= 0.4.0)
49
+ mime-types (~> 1.16)
50
+ treetop (~> 1.4.8)
51
+ mime-types (1.16)
52
+ polyglot (0.3.1)
53
+ rack (1.2.1)
54
+ rack-mount (0.6.13)
55
+ rack (>= 1.0.0)
56
+ rack-test (0.5.6)
57
+ rack (>= 1.0)
58
+ rails (3.0.0)
59
+ actionmailer (= 3.0.0)
60
+ actionpack (= 3.0.0)
61
+ activerecord (= 3.0.0)
62
+ activeresource (= 3.0.0)
63
+ activesupport (= 3.0.0)
64
+ bundler (~> 1.0.0)
65
+ railties (= 3.0.0)
66
+ railties (3.0.0)
67
+ actionpack (= 3.0.0)
68
+ activesupport (= 3.0.0)
69
+ rake (>= 0.8.4)
70
+ thor (~> 0.14.0)
71
+ rake (0.8.7)
72
+ rcov (0.9.9)
73
+ rspec (2.3.0)
74
+ rspec-core (~> 2.3.0)
75
+ rspec-expectations (~> 2.3.0)
76
+ rspec-mocks (~> 2.3.0)
77
+ rspec-core (2.3.1)
78
+ rspec-expectations (2.3.0)
79
+ diff-lcs (~> 1.1.2)
80
+ rspec-mocks (2.3.0)
81
+ rspec-rails (2.3.1)
82
+ actionpack (~> 3.0)
83
+ activesupport (~> 3.0)
84
+ railties (~> 3.0)
85
+ rspec (~> 2.3.0)
86
+ sqlite3-ruby (1.3.2)
87
+ thor (0.14.6)
88
+ treetop (1.4.9)
89
+ polyglot (>= 0.3.1)
90
+ tzinfo (0.3.23)
91
+ will_paginate (3.0.pre2)
92
+
93
+ PLATFORMS
94
+ ruby
95
+
96
+ DEPENDENCIES
97
+ json (~> 1.4.6)
98
+ rails (~> 3.0.0)
99
+ rcov (~> 0.9.9)
100
+ rspec (~> 2.3.0)
101
+ rspec-rails (~> 2.3.1)
102
+ sqlite3-ruby
103
+ tartarus!
104
+ will_paginate (~> 3.0.pre2)
data/README.rdoc CHANGED
@@ -12,23 +12,44 @@ If you wish to use the generator to build the exception viewing/manging interfac
12
12
  dependencies are used:
13
13
 
14
14
  * will_paginate
15
+ * json
15
16
  * jquery
16
17
 
17
18
  === Installation
18
19
 
20
+ ==== Rails 2.x
21
+
19
22
  1. Install the gem from:
20
- gem install tartarus
23
+ gem install tartarus --version=1.0.3
24
+
21
25
  2. Add the tartarus gem dependency to your enviroment.rb:
22
26
  config.gem "tartarus"
27
+
23
28
  3. Run the generator from the root of your Rails application:
24
29
  script/generate tartarus
25
- 4. Run the migration that was generated:
30
+
31
+ ==== Rails 3.x
32
+
33
+ 1. Add the tartarus gem to your Gemfile:
34
+ gem 'tartarus', '2.0.0'
35
+
36
+ 2. Run 'bundle install' to install the gem.
37
+
38
+ 3. Run the generator from the root of your Rails application:
39
+ rails generate tartarus
40
+
41
+
42
+ ==== Complete Setup
43
+ 1. Run the migration that was generated:
26
44
  rake db:migrate
27
- 5. Add the javascript and stylesheet includes in your layout:
45
+
46
+ 2. Add "config.middleware.use 'Tartarus::Rack' to the enviroments that you'd like logging in.
47
+
48
+ 3. Add the javascript and stylesheet includes in your layout:
28
49
  <script type="text/javascript" src="/javascripts/tartarus.jquery.js"></script>
29
50
  <link href="/stylesheets/tartarus.css" media="all" rel="stylesheet" type="text/css" />
30
51
 
31
- === Configuration
52
+ ==== Configuration
32
53
 
33
54
  Configuration is handled by config/exceptions.yml, which will be generated for you. You typically
34
55
  will not need to change anything in here, however you can use this to set an email address to
@@ -37,6 +58,11 @@ to send the notification, and is handled per-exception grouping (you will be not
37
58
  threshold is reached, so with the default of 10 you will be notified at 10,20,30,etc.). In addition,
38
59
  when an email is set, a notification will always be sent everytime a new type of exception is raised.
39
60
 
61
+ ==== TODO
62
+
63
+ * Campfire notifications
64
+ * Move configuration from the YAML file into the middleware initializer.
65
+
40
66
  === License
41
67
 
42
68
  Copyright (c) 2009 Daniel Insley
data/Rakefile CHANGED
@@ -1,38 +1,20 @@
1
1
  require 'rubygems'
2
2
  require 'rake'
3
+ require 'bundler'
3
4
 
4
- begin
5
- require 'jeweler'
6
- Jeweler::Tasks.new do |gem|
7
- gem.name = "tartarus"
8
- gem.summary = %Q{Exception Logging for Rails}
9
- gem.description = %Q{Provides exception logging and a generator for creating a clean interface to manage exceptions.}
10
- gem.email = "dinsley@gmail.com"
11
- gem.homepage = "http://github.com/dinsley/tartarus"
12
- gem.authors = ["Daniel Insley"]
13
- gem.add_dependency "will_paginate"
14
- gem.add_development_dependency "rails"
15
- gem.add_development_dependency "rspec"
16
- gem.add_development_dependency "rspec-rails"
17
- # Gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
18
- end
19
- rescue LoadError
20
- puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
21
- end
5
+ Bundler::GemHelper.install_tasks
22
6
 
23
- require 'spec/rake/spectask'
7
+ require "rspec/core/rake_task"
24
8
 
25
- Spec::Rake::SpecTask.new(:spec) do |spec|
26
- spec.spec_opts = ['--options', "spec/spec.opts"]
27
- spec.libs << 'lib' << 'spec'
28
- spec.spec_files = FileList['spec/**/*_spec.rb']
29
- spec.rcov = true
30
- spec.rcov_opts = lambda do
31
- IO.readlines("spec/rcov.opts").map { |l| l.chomp.split " " }.flatten
32
- end
9
+ RSpec::Core::RakeTask.new(:spec) do |spec|
10
+ spec.rspec_opts = ['--color', '--format progress']
11
+ spec.pattern = 'spec/**/*_spec.rb'
12
+ # spec.rcov = true
13
+ # spec.rcov_opts = lambda do
14
+ # IO.readlines("spec/rcov.opts").map { |l| l.chomp.split " " }.flatten
15
+ # end
33
16
  end
34
17
 
35
- task :spec => :check_dependencies
36
18
  task :default => :spec
37
19
 
38
20
  require 'rake/rdoctask'
@@ -5,10 +5,11 @@ Usage:
5
5
  If you do not pass any arguments, the model class will default to "LoggedException".
6
6
 
7
7
  Examples:
8
- script/generate tartarus
8
+ rails generate tartarus
9
9
 
10
10
  Creates default logged exception model, controller, and views.
11
11
 
12
- script/generate tartarus MyException
12
+ rails generate tartarus MyException
13
+
14
+ Creates a custom model, controller, and views.
13
15
 
14
- Creates a custom model, controller, and views.
@@ -0,0 +1,36 @@
1
+ class TartarusGenerator < Rails::Generators::NamedBase
2
+ include Rails::Generators::Migration
3
+
4
+ source_root File.expand_path('../templates', __FILE__)
5
+ argument :name, :type => 'string', :default => 'LoggedException'
6
+
7
+ def generate_tartarus
8
+ template 'config/exceptions.yml', 'config/exceptions.yml'
9
+ template 'app/models/logged_exception.rb', "app/models/#{file_name}.rb"
10
+ template 'spec/models/logged_exception_spec.rb', "spec/models/#{file_name}_spec.rb"
11
+
12
+ template 'app/controllers/exceptions_controller.rb', "app/controllers/#{plural_name}_controller.rb"
13
+ template 'spec/controllers/exceptions_controller_spec.rb', "spec/controllers/#{plural_name}_controller_spec.rb"
14
+
15
+ copy_file 'app/views/exceptions/index.html.erb', "app/views/#{plural_name}/index.html.erb"
16
+ copy_file 'app/views/exceptions/details.html.erb', "app/views/#{plural_name}/details.html.erb"
17
+ copy_file 'app/views/exceptions/_exception.html.erb', "app/views/#{plural_name}/_exception.html.erb"
18
+
19
+ copy_file 'public/javascripts/tartarus.jquery.js', 'public/javascripts/tartarus.jquery.js'
20
+ copy_file 'public/stylesheets/tartarus.css', 'public/stylesheets/tartarus.css'
21
+
22
+ migration_template "db/migrate/add_logged_exceptions.rb", "db/migrate/add_#{singular_name}_table"
23
+ end
24
+
25
+ def after_generate
26
+ puts "\nIn order for exceptional to function properly, you'll need to complete the following steps to complete the installation process: \n\n"
27
+ puts " 1) Run 'rake db:migrate' to generate the logging table for your model.\n"
28
+ puts " 2) Add \"config.middleware.use 'Tartarus::Rack'\" to the enviroments that you'd like logging."
29
+ puts " 3) Add '/javascripts/tartarus.jquery.js', and 'stylesheets/tartarus.css' to your applications layout.\n"
30
+ end
31
+
32
+ def self.next_migration_number(path)
33
+ Time.now.utc.strftime("%Y%m%d%H%M%S")
34
+ end
35
+
36
+ end
@@ -24,7 +24,7 @@ describe ExceptionsController do
24
24
  <%= class_name %>.should_receive(:paginate).with(:all, :conditions => { :group_id => '89hasd98ashdasas98dhsda' },
25
25
  :order => 'created_at DESC', :page => '1', :per_page => 1).and_return([@exception, @exception2])
26
26
 
27
- get :details, :id => '89hasd98ashdasas98dhsda', :page => 1
27
+ get :details, :id => '89hasd98ashdasas98dhsda', :page => '1'
28
28
  assigns[:exceptions].should == [@exception, @exception2]
29
29
  end
30
30
 
data/lib/tartarus.rb CHANGED
@@ -2,9 +2,11 @@ require 'yaml'
2
2
  require 'will_paginate'
3
3
 
4
4
  class Tartarus
5
+ module Notifiers; end
6
+
5
7
  class << self
6
8
  def configuration
7
- @cached_config ||= YAML.load_file("#{Rails.root}/config/exceptions.yml")[Rails.env]
9
+ @cached_configuration ||= YAML.load_file("#{Rails.root}/config/exceptions.yml")[Rails.env]
8
10
  end
9
11
 
10
12
  def logger_class
@@ -21,6 +23,8 @@ class Tartarus
21
23
  end
22
24
  end
23
25
 
26
+ require 'tartarus/rack'
24
27
  require 'tartarus/logger'
25
- require 'tartarus/rescue'
26
- require 'tartarus/notifier'
28
+ require 'tartarus/notifiers/mail'
29
+ require 'tartarus/railtie'
30
+
@@ -1,35 +1,71 @@
1
1
  module Tartarus::Logger
2
- def group_count
3
- self.class.count( :conditions => ["group_id = ?", group_id] )
4
- end
5
-
6
- def handle_notifications
7
- notification_address = Tartarus.configuration['notification_address']
8
- return unless notification_address.present?
9
- Tartarus::Notifier.deliver_notification( notification_address, self ) if group_count == 1 or (group_count%Tartarus.configuration['notification_threshold']).zero?
10
- end
11
-
12
2
  def self.included(base)
13
3
  base.extend ClassMethods
14
- base.serialize :request
4
+ base.send :include, InstanceMethods
5
+ base.send :before_save, :json_serialize
6
+ base.send :after_save, :json_deserialize
7
+ base.send :after_find, :json_deserialize
8
+ end
9
+
10
+ module InstanceMethods
11
+ def group_count
12
+ self.class.count( :conditions => ["group_id = ?", group_id] )
13
+ end
14
+
15
+ def handle_notifications
16
+ notification_address = Tartarus.configuration['notification_address']
17
+ return unless notification_address.present?
18
+ Tartarus::Notifiers::Mail.deliver_notification( notification_address, self ) if group_count == 1 or (group_count%Tartarus.configuration['notification_threshold']).zero?
19
+ end
20
+
21
+ def json_serialize
22
+ self.request = self.request.to_json
23
+ end
24
+
25
+ def json_deserialize
26
+ self.request = JSON.parse(request)
27
+ end
28
+
15
29
  end
16
30
 
17
31
  module ClassMethods
18
- def log(controller, exception)
32
+ def log(env, exception)
19
33
  logged = create do |logged_exception|
34
+ controller = env['action_controller.instance']
20
35
  group_id = "#{exception.class.name}#{exception.message.gsub(/(#<.+):(.+)(>)/,'\1\3')}#{controller.controller_path}#{controller.action_name}"
21
-
36
+
22
37
  logged_exception.exception_class = exception.class.name
23
38
  logged_exception.controller_path = controller.controller_path
24
39
  logged_exception.action_name = controller.action_name
25
40
  logged_exception.message = exception.message
26
41
  logged_exception.backtrace = exception.backtrace * "\n"
27
- logged_exception.request = controller.normalize_request_data_for_tartarus
42
+ logged_exception.request = self.normalize_request_data(env)
28
43
  logged_exception.group_id = Digest::SHA1.hexdigest(group_id)
29
44
  end
30
45
  logged.handle_notifications
31
46
  logged
32
47
  end
33
48
 
49
+ def normalize_request_data(env)
50
+ request = env['action_controller.instance'].request
51
+
52
+ request_details = {
53
+ :enviroment => { :process => $$, :server => `hostname -s`.chomp },
54
+ :session => { :variables => request.env['rack.session'].to_hash, :cookie => request.env['rack.request.cookie_hash'] },
55
+ :http_details => {
56
+ :method => request.method.to_s.upcase,
57
+ :url => "#{request.protocol}#{request.env["HTTP_HOST"]}#{request.fullpath}",
58
+ :format => request.format.to_s,
59
+ :parameters => request.filtered_parameters
60
+ }
61
+ }
62
+
63
+ request.env.each_pair do |key, value|
64
+ request_details[:enviroment][key.downcase] = value if key.match(/^[A-Z_]*$/)
65
+ end
66
+
67
+ return request_details
68
+ end
69
+
34
70
  end
35
71
  end
@@ -0,0 +1,25 @@
1
+ class Tartarus::Notifiers::Mail < ActionMailer::Base
2
+
3
+ def notification(address, exception)
4
+ subject = "Exception raised at #{exception.controller_path}##{exception.action_name} (#{exception.exception_class}) #{exception.message}"
5
+ mail(:to => address, :from => Tartarus.configuration['sender'], :subject => subject) do |format|
6
+ format.text do
7
+ render :text => %{
8
+ A new exception was raised (#{exception.created_at.strftime("%m/%d/%Y %I:%M%p")}):
9
+
10
+ Class : #{exception.exception_class}
11
+ Location : #{exception.controller_path}##{exception.action_name}
12
+ Message : #{exception.message}
13
+ Count : #{exception.group_count}
14
+
15
+ Backtrace:
16
+ #{exception.backtrace}
17
+
18
+ Request:
19
+ #{exception.request}
20
+ }
21
+ end
22
+ end
23
+ end
24
+
25
+ end