chatterbox 0.4.0 → 0.5.0

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.
Files changed (30) hide show
  1. data/CHANGELOG.markdown +15 -0
  2. data/README.markdown +1 -1
  3. data/Rakefile +2 -2
  4. data/chatterbox.gemspec +31 -16
  5. data/examples/example_helper.rb +13 -3
  6. data/examples/lib/chatterbox/exception_notification/filter_example.rb +38 -0
  7. data/examples/lib/chatterbox/exception_notification/presenter_example.rb +89 -0
  8. data/examples/lib/chatterbox/exception_notification/rails_extracter_example.rb +50 -0
  9. data/examples/lib/chatterbox/rails_catcher_example.rb +17 -10
  10. data/examples/lib/chatterbox/services/email/mailer_example.rb +54 -0
  11. data/examples/lib/chatterbox/services/email_example.rb +89 -0
  12. data/examples/lib/chatterbox/services_example.rb +0 -0
  13. data/examples/{chatterbox_example.rb → lib/chatterbox_example.rb} +22 -24
  14. data/lib/chatterbox/{notification.rb → exception_notification/extracter.rb} +23 -35
  15. data/lib/chatterbox/exception_notification/presenter.rb +81 -0
  16. data/lib/chatterbox/exception_notification/rails_extracter.rb +51 -0
  17. data/lib/chatterbox/exception_notification.rb +8 -0
  18. data/lib/chatterbox/rails_catcher.rb +11 -1
  19. data/lib/chatterbox/services/email/mailer.rb +28 -0
  20. data/lib/chatterbox/services/email/views/chatterbox/services/email/mailer/message.erb +0 -0
  21. data/lib/chatterbox/services/email.rb +66 -0
  22. data/lib/chatterbox/services.rb +4 -0
  23. data/lib/chatterbox.rb +21 -24
  24. data/todo.markdown +0 -2
  25. data/version.yml +2 -1
  26. metadata +26 -12
  27. data/examples/lib/chatterbox/consumers/email_consumer_example.rb +0 -65
  28. data/examples/lib/chatterbox/notification_example.rb +0 -147
  29. data/lib/consumers/email_consumer.rb +0 -64
  30. data/lib/consumers.rb +0 -2
@@ -1,147 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), *%w[.. .. example_helper]))
2
-
3
- describe Chatterbox::Notification do
4
-
5
- before do
6
- Chatterbox.logger = Logger.new(nil)
7
- end
8
-
9
- describe "creating the notice" do
10
-
11
- it "should safely handle nil" do
12
- lambda {
13
- Chatterbox::Notification.new(nil).notice
14
- }.should_not raise_error
15
- end
16
-
17
- it "should use to_hash if message is not an exception and it responds_to possible" do
18
- some_object = mock(:to_hash => {:foo => "bar"})
19
- Chatterbox::Notification.new(some_object).notice.should include({:foo => "bar"})
20
- end
21
-
22
- it "should call to_s on anything that responds to it, as a last resort" do
23
- some_object = mock(:to_s => "my to_s")
24
- Chatterbox::Notification.new(some_object).notice.should include({:summary => "my to_s"})
25
- end
26
-
27
- it "merges hash passed in with default info" do
28
- hash = {:message => "hey!"}
29
- default_info = mock()
30
- default_info.expects(:merge).with(hash)
31
- notification = Chatterbox::Notification.new(hash)
32
- notification.expects(:default_info).returns(default_info)
33
- notification.notice
34
- end
35
-
36
- it "turns string notice into a hash keyed by notice" do
37
- notification = Chatterbox::Notification.new("You have been placed on alert")
38
- notification.notice.should include({:summary => "You have been placed on alert"})
39
- end
40
-
41
- it "always includes a summary" do
42
- Chatterbox::Notification.new().notice.should include(:summary)
43
- Chatterbox::Notification.new({}).notice.should include(:summary)
44
- Chatterbox::Notification.new(RuntimeError.new).notice.should include(:summary)
45
- end
46
-
47
- it "should set summary to N/A if nothing provided" do
48
- Chatterbox::Notification.new({}).notice.should include(:summary => "N/A")
49
- Chatterbox::Notification.new({:foo => 'baz'}).notice.should include(:summary => "N/A")
50
- end
51
- end
52
-
53
- describe "exceptions" do
54
-
55
- def raised_exception
56
- raise RuntimeError, "Your zing bats got mixed up with the snosh frazzles."
57
- rescue => e
58
- e
59
- end
60
-
61
- it "should extract exception info" do
62
- exception = raised_exception
63
- data = Chatterbox::Notification.new(exception).notice
64
- data[:summary].should == "RuntimeError: Your zing bats got mixed up with the snosh frazzles."
65
- data[:error_class].should == "RuntimeError"
66
- data[:error_message].should == "Your zing bats got mixed up with the snosh frazzles."
67
- data[:backtrace].should == exception.backtrace
68
- end
69
-
70
- it "should extract exception info from an exception in a hash" do
71
- exception = raised_exception
72
- data = Chatterbox::Notification.new(:exception => exception, :other_info => "yo dawg").notice
73
- data[:summary].should == "RuntimeError: Your zing bats got mixed up with the snosh frazzles."
74
- data[:error_class].should == "RuntimeError"
75
- data[:error_message].should == "Your zing bats got mixed up with the snosh frazzles."
76
- data[:backtrace].should == exception.backtrace
77
- data[:other_info].should == "yo dawg"
78
- end
79
-
80
- it "should let extra data win over auto extracted exception data" do
81
- exception = raised_exception
82
- data = Chatterbox::Notification.new(:exception => exception, :summary => "I know what I'm doing, and we got an error").notice
83
- data[:summary].should == "I know what I'm doing, and we got an error"
84
- end
85
-
86
- it "merges rails info and ruby info into the exception info" do
87
- notification = Chatterbox::Notification.new(raised_exception)
88
- rails = stub_everything(:version => "2.0", :root => "/rails/root", :env => "production")
89
- notification.stubs(:rails_configuration).returns(rails)
90
- notification.notice.should include(:rails_version => "2.0")
91
- notification.notice.should include(:rails_root => "/rails/root")
92
- notification.notice.should include(:rails_env => "production")
93
- end
94
-
95
- end
96
-
97
- describe "hashes" do
98
-
99
- it "merges rails info and ruby info into the notification" do
100
- notification = Chatterbox::Notification.new({})
101
- rails = stub_everything(:version => "2.0", :root => "/rails/root", :env => "production")
102
- notification.stubs(:rails_configuration).returns(rails)
103
- notification.notice.should include(:rails_version => "2.0")
104
- notification.notice.should include(:rails_root => "/rails/root")
105
- notification.notice.should include(:rails_env => "production")
106
- end
107
-
108
- end
109
-
110
- describe "default info to be included with every notification" do
111
-
112
- it "should return full ENV" do
113
- environment = { "USER" => "jdoe", "PATH" => "/usr/bin", "HOME" => "/usr/home/jdoe" }
114
- notification = Chatterbox::Notification.new
115
- notification.stubs(:env).returns(environment)
116
- notification.default_info.should include(:environment => environment)
117
- end
118
-
119
- it "should return Ruby version and platform" do
120
- notification = Chatterbox::Notification.new
121
- notification.stubs(:ruby_version).returns("1.8.6")
122
- notification.stubs(:ruby_platform).returns("Mac OS X blah")
123
- data = notification.default_info
124
- data.should include(:ruby_version => "1.8.6")
125
- data.should include(:ruby_platform => "Mac OS X blah")
126
- end
127
-
128
- describe "when Rails is defined" do
129
-
130
- it "should return Rails info" do
131
- notification = Chatterbox::Notification.new
132
- rails = stub
133
- rails.stubs(:root).returns("/some/path")
134
- rails.stubs(:env).returns("production")
135
- rails.stubs(:version).returns("2.1.2")
136
- notification.stubs(:rails_configuration).returns(rails)
137
-
138
- notification.default_info.should include(:rails_root => "/some/path")
139
- notification.default_info.should include(:rails_env => "production")
140
- notification.default_info.should include(:rails_version => "2.1.2")
141
- end
142
-
143
- end
144
-
145
- end
146
-
147
- end
@@ -1,64 +0,0 @@
1
- module Chatterbox
2
- class EmailConsumer
3
-
4
- attr_reader :notice
5
-
6
- def initialize(notice)
7
- @notice = notice
8
- end
9
-
10
- def process
11
- Chatterbox.logger.debug { "Mailing notification #{notice[:summary]}"}
12
- Mailer.deliver_exception_notification(notice)
13
- end
14
-
15
- end
16
-
17
- # Things taken out of the hash for exception emails:
18
- #
19
- # :details => a hash of details about the context of the error -- ie current state, request info, etc...any info
20
- # related to the exception that is domain specific
21
- # :error_class => taken from the Exception
22
- # :error_message => taken from the Exception
23
- # :backtrace => taken from the Exception
24
- class Mailer < ActionMailer::Base
25
- @@sender_address = %("Exception Notifier" <exception.notifier@default.com>)
26
- cattr_accessor :sender_address
27
-
28
- @@exception_recipients = []
29
- cattr_accessor :exception_recipients
30
-
31
- @@email_prefix = "[ERROR] "
32
- cattr_accessor :email_prefix
33
-
34
- self.template_root = File.expand_path(File.join(File.dirname(__FILE__), *%w[.. .. views]))
35
-
36
- def self.reloadable?() false end
37
-
38
- def exception_notification(data={})
39
- data = data.dup.symbolize_keys
40
-
41
- content_type "text/plain"
42
-
43
- subject "#{email_prefix} Error - #{data.delete(:summary)}"
44
-
45
- recipients exception_recipients
46
- from sender_address
47
-
48
- body data
49
- end
50
-
51
- private
52
-
53
- def sanitize_backtrace(trace)
54
- re = Regexp.new(/^#{Regexp.escape(rails_root)}/)
55
- trace.map { |line| Pathname.new(line.gsub(re, "[RAILS_ROOT]")).cleanpath.to_s }
56
- end
57
-
58
- def rails_root
59
- @rails_root ||= Pathname.new(RAILS_ROOT).cleanpath.to_s
60
- end
61
-
62
- end
63
-
64
- end
data/lib/consumers.rb DELETED
@@ -1,2 +0,0 @@
1
- require 'action_mailer'
2
- require File.join(File.dirname(__FILE__), *%w[consumers email_consumer])