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.
- data/CHANGELOG.markdown +15 -0
- data/README.markdown +1 -1
- data/Rakefile +2 -2
- data/chatterbox.gemspec +31 -16
- data/examples/example_helper.rb +13 -3
- data/examples/lib/chatterbox/exception_notification/filter_example.rb +38 -0
- data/examples/lib/chatterbox/exception_notification/presenter_example.rb +89 -0
- data/examples/lib/chatterbox/exception_notification/rails_extracter_example.rb +50 -0
- data/examples/lib/chatterbox/rails_catcher_example.rb +17 -10
- data/examples/lib/chatterbox/services/email/mailer_example.rb +54 -0
- data/examples/lib/chatterbox/services/email_example.rb +89 -0
- data/examples/lib/chatterbox/services_example.rb +0 -0
- data/examples/{chatterbox_example.rb → lib/chatterbox_example.rb} +22 -24
- data/lib/chatterbox/{notification.rb → exception_notification/extracter.rb} +23 -35
- data/lib/chatterbox/exception_notification/presenter.rb +81 -0
- data/lib/chatterbox/exception_notification/rails_extracter.rb +51 -0
- data/lib/chatterbox/exception_notification.rb +8 -0
- data/lib/chatterbox/rails_catcher.rb +11 -1
- data/lib/chatterbox/services/email/mailer.rb +28 -0
- data/lib/chatterbox/services/email/views/chatterbox/services/email/mailer/message.erb +0 -0
- data/lib/chatterbox/services/email.rb +66 -0
- data/lib/chatterbox/services.rb +4 -0
- data/lib/chatterbox.rb +21 -24
- data/todo.markdown +0 -2
- data/version.yml +2 -1
- metadata +26 -12
- data/examples/lib/chatterbox/consumers/email_consumer_example.rb +0 -65
- data/examples/lib/chatterbox/notification_example.rb +0 -147
- data/lib/consumers/email_consumer.rb +0 -64
- data/lib/consumers.rb +0 -2
@@ -1,19 +1,21 @@
|
|
1
|
-
module Chatterbox
|
2
|
-
|
3
|
-
class Notification
|
4
|
-
|
1
|
+
module Chatterbox::ExceptionNotification
|
2
|
+
class Extracter
|
5
3
|
attr_reader :message
|
6
|
-
|
7
|
-
def
|
4
|
+
|
5
|
+
def self.wrap(notification = {})
|
6
|
+
new(notification).notice
|
7
|
+
end
|
8
|
+
|
9
|
+
def initialize(message = {})
|
8
10
|
@message = message
|
9
11
|
end
|
10
|
-
|
12
|
+
|
11
13
|
def notice
|
12
14
|
hash = normalize_message_to_hash(message)
|
13
15
|
hash = exception_to_notice(hash)
|
14
16
|
default_info.merge(hash)
|
15
17
|
end
|
16
|
-
|
18
|
+
|
17
19
|
def normalize_message_to_hash(message)
|
18
20
|
case
|
19
21
|
when Exception === message
|
@@ -24,23 +26,20 @@ module Chatterbox
|
|
24
26
|
string_to_notice(message.to_s)
|
25
27
|
end
|
26
28
|
end
|
27
|
-
|
29
|
+
|
28
30
|
def default_info
|
29
31
|
default_info = {
|
30
32
|
:summary => "N/A",
|
31
|
-
:environment => env
|
32
|
-
:ruby_version => ruby_version,
|
33
|
-
:ruby_platform => ruby_platform
|
33
|
+
:environment => env
|
34
34
|
}
|
35
35
|
default_info = add_ruby_info(default_info)
|
36
|
-
default_info = add_rails_info(default_info) if rails_configuration
|
37
36
|
default_info
|
38
37
|
end
|
39
|
-
|
38
|
+
|
40
39
|
def string_to_notice(message)
|
41
40
|
{ :summary => message }
|
42
41
|
end
|
43
|
-
|
42
|
+
|
44
43
|
def exception_to_notice(hash)
|
45
44
|
return hash unless hash.key?(:exception)
|
46
45
|
exception = hash[:exception]
|
@@ -51,37 +50,26 @@ module Chatterbox
|
|
51
50
|
:backtrace => exception.backtrace,
|
52
51
|
}.merge(hash)
|
53
52
|
end
|
54
|
-
|
55
|
-
def add_rails_info(data)
|
56
|
-
data.merge({
|
57
|
-
:rails_env => rails_configuration.env,
|
58
|
-
:rails_root => rails_configuration.root,
|
59
|
-
:rails_version => rails_configuration.version
|
60
|
-
})
|
61
|
-
end
|
62
|
-
|
53
|
+
|
63
54
|
def add_ruby_info(data)
|
64
|
-
data.merge({
|
65
|
-
:
|
66
|
-
|
55
|
+
data.merge({
|
56
|
+
:ruby_info => {
|
57
|
+
:ruby_version => ruby_version,
|
58
|
+
:ruby_platform => ruby_platform
|
59
|
+
}
|
67
60
|
})
|
68
61
|
end
|
69
62
|
|
70
63
|
def ruby_version
|
71
64
|
RUBY_VERSION
|
72
65
|
end
|
73
|
-
|
66
|
+
|
74
67
|
def ruby_platform
|
75
68
|
RUBY_PLATFORM
|
76
69
|
end
|
77
|
-
|
70
|
+
|
78
71
|
def env
|
79
72
|
ENV.to_hash
|
80
73
|
end
|
81
|
-
|
82
|
-
def rails_configuration
|
83
|
-
defined?(Rails) && Rails
|
84
|
-
end
|
85
|
-
|
86
74
|
end
|
87
|
-
end
|
75
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module Chatterbox::ExceptionNotification
|
4
|
+
class Presenter
|
5
|
+
attr_reader :options
|
6
|
+
|
7
|
+
def self.render(options)
|
8
|
+
new(options).to_message
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(options = {})
|
12
|
+
@options = options
|
13
|
+
@config = options[:config]
|
14
|
+
end
|
15
|
+
|
16
|
+
def summary
|
17
|
+
options.delete(:summary)
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_message
|
21
|
+
{ :message => { :summary => summary, :body => body },
|
22
|
+
:config => @config }
|
23
|
+
end
|
24
|
+
|
25
|
+
def section_order
|
26
|
+
[:error_message, :request, :backtrace, :environment, :ruby_info, :rails_info]
|
27
|
+
end
|
28
|
+
|
29
|
+
def body
|
30
|
+
body = ""
|
31
|
+
section_order.each do |section|
|
32
|
+
output = render_section(section)
|
33
|
+
body << output if output
|
34
|
+
end
|
35
|
+
body
|
36
|
+
end
|
37
|
+
|
38
|
+
def render_section(key)
|
39
|
+
return nil unless options.key?(key)
|
40
|
+
output = key.to_s.titleize
|
41
|
+
output << "\n"
|
42
|
+
output << "----------\n"
|
43
|
+
output << "#{inspect_value(options[key])}\n\n"
|
44
|
+
output
|
45
|
+
end
|
46
|
+
|
47
|
+
# Taken from exception_notification - thanks Jamis.
|
48
|
+
def inspect_value(value)
|
49
|
+
object_to_yaml(value).strip
|
50
|
+
end
|
51
|
+
|
52
|
+
def object_to_yaml(object)
|
53
|
+
result = ""
|
54
|
+
result << render_obj(object)
|
55
|
+
result
|
56
|
+
end
|
57
|
+
|
58
|
+
def render_obj(object)
|
59
|
+
if object.is_a?(Hash)
|
60
|
+
render_hash(object)
|
61
|
+
else
|
62
|
+
render_non_hash(object)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def render_non_hash(object)
|
67
|
+
object.to_yaml.sub(/^---\s*\n?/, "")
|
68
|
+
end
|
69
|
+
|
70
|
+
# renders hashes with keys in sorted order
|
71
|
+
def render_hash(hsh)
|
72
|
+
str = ""
|
73
|
+
indiff_hsh = hsh.with_indifferent_access
|
74
|
+
indiff_hsh.keys.sort.each do |key|
|
75
|
+
value = indiff_hsh[key]
|
76
|
+
str << "#{key}: #{render_obj(value)}"
|
77
|
+
end
|
78
|
+
str
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Chatterbox::ExceptionNotification
|
2
|
+
class RailsExtracter
|
3
|
+
def self.wrap(notification = {})
|
4
|
+
new(notification).notice
|
5
|
+
end
|
6
|
+
|
7
|
+
def initialize(message = {})
|
8
|
+
@message = message
|
9
|
+
end
|
10
|
+
|
11
|
+
def notice
|
12
|
+
hsh = extract_rails_info(@message)
|
13
|
+
hsh = extract_request_info(hsh)
|
14
|
+
hsh
|
15
|
+
end
|
16
|
+
|
17
|
+
def rails_configuration
|
18
|
+
Object.const_get("Rails") if Object.const_defined?("Rails")
|
19
|
+
end
|
20
|
+
|
21
|
+
def extract_rails_info(message)
|
22
|
+
return message if rails_configuration.nil?
|
23
|
+
message.merge({
|
24
|
+
:rails_info => {
|
25
|
+
:rails_env => rails_configuration.env,
|
26
|
+
:rails_root => rails_configuration.root,
|
27
|
+
:rails_version => rails_configuration.version
|
28
|
+
}
|
29
|
+
})
|
30
|
+
end
|
31
|
+
|
32
|
+
def extract_request_info(message)
|
33
|
+
return message unless message.key?(:request)
|
34
|
+
request = message.delete(:request)
|
35
|
+
message.merge({
|
36
|
+
:request => {
|
37
|
+
:url => request.url,
|
38
|
+
:remote_ip => request.remote_ip,
|
39
|
+
:parameters => request.parameters
|
40
|
+
}
|
41
|
+
})
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
#
|
48
|
+
# * URL : <%= @request.protocol %><%= @host %><%= @request.request_uri %>
|
49
|
+
# * IP address: <%= @request.env["HTTP_X_FORWARDED_FOR"] || @request.env["REMOTE_ADDR"] %>
|
50
|
+
# * Parameters: <%= filter_sensitive_post_data_parameters(@request.parameters).inspect %>
|
51
|
+
# * Rails root: <%= @rails_root %>
|
@@ -6,6 +6,7 @@ module Chatterbox
|
|
6
6
|
if base.instance_methods.map(&:to_s).include? 'rescue_action_in_public' and !base.instance_methods.map(&:to_s).include? 'rescue_action_in_public_without_chatterbox'
|
7
7
|
base.send(:alias_method, :rescue_action_in_public_without_chatterbox, :rescue_action_in_public)
|
8
8
|
base.send(:alias_method, :rescue_action_in_public, :rescue_action_in_public_with_chatterbox)
|
9
|
+
base.hide_action(:rescue_action_in_public_with_chatterbox, :rescue_action_in_public_without_chatterbox)
|
9
10
|
end
|
10
11
|
end
|
11
12
|
|
@@ -13,12 +14,21 @@ module Chatterbox
|
|
13
14
|
# any custom processing that is defined with Rails 2's exception helpers.
|
14
15
|
def rescue_action_in_public_with_chatterbox exception
|
15
16
|
Chatterbox.logger.debug { "#{self.class}#rescue_action_in_public_with_chatterbox: caught exception #{exception} - about to handle"}
|
16
|
-
|
17
|
+
options = extract_exception_details(exception)
|
18
|
+
Chatterbox.handle_notice(options)
|
17
19
|
Chatterbox.logger.debug { "#{self.class}#rescue_action_in_public_with_chatterbox: handing exception #{exception} off to normal rescue handling"}
|
18
20
|
|
19
21
|
rescue_action_in_public_without_chatterbox(exception)
|
20
22
|
end
|
21
23
|
|
24
|
+
def extract_exception_details(exception)
|
25
|
+
options = { :exception => exception, :request => request }
|
26
|
+
options = Chatterbox::ExceptionNotification::Extracter.wrap(options)
|
27
|
+
options = Chatterbox::ExceptionNotification::RailsExtracter.wrap(options)
|
28
|
+
options = Chatterbox::ExceptionNotification::Presenter.render(options)
|
29
|
+
options
|
30
|
+
end
|
31
|
+
|
22
32
|
end
|
23
33
|
|
24
34
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'action_mailer'
|
2
|
+
|
3
|
+
module Chatterbox::Services
|
4
|
+
class Email
|
5
|
+
class Mailer < ActionMailer::Base
|
6
|
+
self.template_root = File.join(File.dirname(__FILE__), *%w[views])
|
7
|
+
|
8
|
+
def self.reloadable?() false end
|
9
|
+
|
10
|
+
def message(data={})
|
11
|
+
data = data.dup.symbolize_keys
|
12
|
+
|
13
|
+
content_type data[:config][:content_type] || "text/plain"
|
14
|
+
|
15
|
+
recipients data[:config][:to]
|
16
|
+
from data[:config][:from]
|
17
|
+
|
18
|
+
reply_to data[:config][:reply_to] if data[:config][:reply_to]
|
19
|
+
bcc data[:config][:bcc] if data[:config][:bcc]
|
20
|
+
cc data[:config][:cc] if data[:config][:cc]
|
21
|
+
|
22
|
+
subject data[:message][:summary]
|
23
|
+
body data[:message][:body] if data[:message][:body]
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
File without changes
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'chatterbox'
|
2
|
+
require 'chatterbox/services/email/mailer'
|
3
|
+
|
4
|
+
module Chatterbox::Services
|
5
|
+
class Email
|
6
|
+
attr_reader :options
|
7
|
+
@default_configuration = {}
|
8
|
+
|
9
|
+
def self.default_configuration
|
10
|
+
@default_configuration
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.configure(config_options)
|
14
|
+
@default_configuration = config_options
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.deliver(options = {})
|
18
|
+
new(options).deliver
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize(options = {})
|
22
|
+
@options = options
|
23
|
+
merge_configs
|
24
|
+
validate_options
|
25
|
+
end
|
26
|
+
|
27
|
+
def deliver
|
28
|
+
Mailer.deliver_message(options)
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def merge_configs
|
34
|
+
@options[:config] ||= {}
|
35
|
+
@options[:config] = self.class.default_configuration.merge(options[:config])
|
36
|
+
end
|
37
|
+
|
38
|
+
def validate_options
|
39
|
+
require_message
|
40
|
+
require_message_keys(:summary)
|
41
|
+
|
42
|
+
require_config
|
43
|
+
require_config_keys(:to, :from)
|
44
|
+
end
|
45
|
+
|
46
|
+
def require_message
|
47
|
+
raise(ArgumentError, "Must configure with a :message - you provided #{options.inspect}") unless options.key?(:message)
|
48
|
+
end
|
49
|
+
|
50
|
+
def require_config
|
51
|
+
raise(ArgumentError, "Must configure with a :config or set default_configuration") unless options.key?(:config)
|
52
|
+
end
|
53
|
+
|
54
|
+
def require_config_keys(*keys)
|
55
|
+
Array(keys).each do |key|
|
56
|
+
raise(ArgumentError, "Must provide #{key.inspect} in the :config\nYou provided #{options.inspect}") unless options[:config].key?(key)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def require_message_keys(*keys)
|
61
|
+
Array(keys).each do |key|
|
62
|
+
raise(ArgumentError, "Must provide #{key.inspect} in the :message") unless options[:message].key?(key)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/lib/chatterbox.rb
CHANGED
@@ -1,51 +1,48 @@
|
|
1
|
-
require
|
2
|
-
require File.join(File.dirname(__FILE__), *%w[consumers])
|
1
|
+
require 'active_support'
|
3
2
|
|
4
3
|
module Chatterbox
|
5
|
-
|
6
4
|
def handle_notice(message)
|
7
5
|
publish_notice(message)
|
6
|
+
message
|
8
7
|
end
|
8
|
+
|
9
|
+
alias_method :notify, :handle_notice
|
9
10
|
|
10
11
|
def publish_notice(message)
|
11
|
-
Publishers.publishers.each { |p| p.call(message) }
|
12
|
+
Publishers.publishers.each { |p| p.call(message.with_indifferent_access) }
|
12
13
|
end
|
13
14
|
|
14
15
|
def logger
|
15
|
-
@logger ||=
|
16
|
+
@logger ||= Logger.new(nil)
|
16
17
|
end
|
17
18
|
|
18
19
|
def logger=(logger)
|
19
20
|
@logger = logger
|
20
21
|
end
|
21
22
|
|
22
|
-
def
|
23
|
-
|
23
|
+
def register(&blk)
|
24
|
+
Publishers.register(&blk)
|
24
25
|
end
|
25
26
|
|
26
27
|
extend self
|
27
28
|
|
28
29
|
module Publishers
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
def publishers
|
33
|
-
@publishers ||= []
|
34
|
-
end
|
35
|
-
|
36
|
-
def register(&blk)
|
37
|
-
Chatterbox.logger.debug { "Registering publisher: #{blk}"}
|
38
|
-
publishers << blk
|
39
|
-
blk
|
40
|
-
end
|
30
|
+
def publishers
|
31
|
+
@publishers ||= []
|
32
|
+
end
|
41
33
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
34
|
+
def register(&blk)
|
35
|
+
Chatterbox.logger.debug { "Registering publisher: #{blk}"}
|
36
|
+
publishers << blk
|
37
|
+
blk
|
46
38
|
end
|
47
39
|
|
40
|
+
def clear!
|
41
|
+
@publishers = []
|
42
|
+
end
|
43
|
+
|
44
|
+
extend self
|
48
45
|
end
|
49
|
-
|
50
46
|
end
|
51
47
|
|
48
|
+
require "chatterbox/services"
|
data/todo.markdown
CHANGED
data/version.yml
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chatterbox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rob Sanheim
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-11-06 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -52,7 +52,7 @@ dependencies:
|
|
52
52
|
- !ruby/object:Gem::Version
|
53
53
|
version: "0"
|
54
54
|
version:
|
55
|
-
description:
|
55
|
+
description: Send notifications and messages. However you want.
|
56
56
|
email: rsanheim@gmail.com
|
57
57
|
executables: []
|
58
58
|
|
@@ -64,21 +64,31 @@ extra_rdoc_files:
|
|
64
64
|
files:
|
65
65
|
- .gitignore
|
66
66
|
- .treasure_map.rb
|
67
|
+
- CHANGELOG.markdown
|
67
68
|
- LICENSE
|
68
69
|
- README.markdown
|
69
70
|
- Rakefile
|
70
71
|
- chatterbox.gemspec
|
71
|
-
- examples/chatterbox_example.rb
|
72
72
|
- examples/example_helper.rb
|
73
|
-
- examples/lib/chatterbox/
|
74
|
-
- examples/lib/chatterbox/
|
73
|
+
- examples/lib/chatterbox/exception_notification/filter_example.rb
|
74
|
+
- examples/lib/chatterbox/exception_notification/presenter_example.rb
|
75
|
+
- examples/lib/chatterbox/exception_notification/rails_extracter_example.rb
|
75
76
|
- examples/lib/chatterbox/rails_catcher_example.rb
|
77
|
+
- examples/lib/chatterbox/services/email/mailer_example.rb
|
78
|
+
- examples/lib/chatterbox/services/email_example.rb
|
79
|
+
- examples/lib/chatterbox/services_example.rb
|
80
|
+
- examples/lib/chatterbox_example.rb
|
76
81
|
- init.rb
|
77
82
|
- lib/chatterbox.rb
|
78
|
-
- lib/chatterbox/
|
83
|
+
- lib/chatterbox/exception_notification.rb
|
84
|
+
- lib/chatterbox/exception_notification/extracter.rb
|
85
|
+
- lib/chatterbox/exception_notification/presenter.rb
|
86
|
+
- lib/chatterbox/exception_notification/rails_extracter.rb
|
79
87
|
- lib/chatterbox/rails_catcher.rb
|
80
|
-
- lib/
|
81
|
-
- lib/
|
88
|
+
- lib/chatterbox/services.rb
|
89
|
+
- lib/chatterbox/services/email.rb
|
90
|
+
- lib/chatterbox/services/email/mailer.rb
|
91
|
+
- lib/chatterbox/services/email/views/chatterbox/services/email/mailer/message.erb
|
82
92
|
- rails/init.rb
|
83
93
|
- todo.markdown
|
84
94
|
- version.yml
|
@@ -112,8 +122,12 @@ signing_key:
|
|
112
122
|
specification_version: 3
|
113
123
|
summary: Notifications and messages
|
114
124
|
test_files:
|
115
|
-
- examples/chatterbox_example.rb
|
116
125
|
- examples/example_helper.rb
|
117
|
-
- examples/lib/chatterbox/
|
118
|
-
- examples/lib/chatterbox/
|
126
|
+
- examples/lib/chatterbox/exception_notification/filter_example.rb
|
127
|
+
- examples/lib/chatterbox/exception_notification/presenter_example.rb
|
128
|
+
- examples/lib/chatterbox/exception_notification/rails_extracter_example.rb
|
119
129
|
- examples/lib/chatterbox/rails_catcher_example.rb
|
130
|
+
- examples/lib/chatterbox/services/email/mailer_example.rb
|
131
|
+
- examples/lib/chatterbox/services/email_example.rb
|
132
|
+
- examples/lib/chatterbox/services_example.rb
|
133
|
+
- examples/lib/chatterbox_example.rb
|
@@ -1,65 +0,0 @@
|
|
1
|
-
require File.expand_path(File.join(File.dirname(__FILE__), *%w[.. .. .. example_helper]))
|
2
|
-
require 'chatterbox'
|
3
|
-
|
4
|
-
describe Chatterbox::Mailer do
|
5
|
-
|
6
|
-
it "displays environment vars sorted" do
|
7
|
-
notice = {
|
8
|
-
:environment => {
|
9
|
-
"PATH" => "/usr/bin",
|
10
|
-
"PS1" => "$",
|
11
|
-
"TMPDIR" => "/tmp"
|
12
|
-
}
|
13
|
-
}
|
14
|
-
expected = <<EOL
|
15
|
-
PATH => /usr/bin
|
16
|
-
PS1 => $
|
17
|
-
TMPDIR => /tmp
|
18
|
-
EOL
|
19
|
-
mail = Chatterbox::Mailer.create_exception_notification(notice)
|
20
|
-
mail.body.should include(expected.strip)
|
21
|
-
end
|
22
|
-
|
23
|
-
it "displays any other details in the hash in the email body" do
|
24
|
-
notice = {
|
25
|
-
:details => { "message_id" => "user01-create", "current_user" => "Chris Liebing" },
|
26
|
-
:environment => { "foo" => "path" }
|
27
|
-
}
|
28
|
-
Chatterbox::Mailer.create_exception_notification(notice)
|
29
|
-
expected = <<EOL
|
30
|
-
Details
|
31
|
-
-------
|
32
|
-
current_user => Chris Liebing
|
33
|
-
message_id => user01-create
|
34
|
-
EOL
|
35
|
-
mail = Chatterbox::Mailer.create_exception_notification(notice)
|
36
|
-
mail.body.should include(expected.strip)
|
37
|
-
end
|
38
|
-
|
39
|
-
it "does not mutate the provided hash" do
|
40
|
-
notice = {'foo' => 'bar', :environment => {}}
|
41
|
-
Chatterbox::Mailer.create_exception_notification(notice)
|
42
|
-
notice.should == {'foo' => 'bar', :environment => {}}
|
43
|
-
end
|
44
|
-
|
45
|
-
describe "subject" do
|
46
|
-
|
47
|
-
it "extracts the subject from the given data hash when the key is a symbol" do
|
48
|
-
mail = Chatterbox::Mailer.create_exception_notification(:environment => {}, :summary => 'foo')
|
49
|
-
mail.subject.should include('foo')
|
50
|
-
end
|
51
|
-
|
52
|
-
it "extracts the subject from the given data hash when the key is a string" do
|
53
|
-
mail = Chatterbox::Mailer.create_exception_notification(:environment => {}, 'summary' => 'foo')
|
54
|
-
mail.subject.should include('foo')
|
55
|
-
end
|
56
|
-
|
57
|
-
it "includes the given prefix" do
|
58
|
-
Chatterbox::Mailer.email_prefix = '[super important email]'
|
59
|
-
mail = Chatterbox::Mailer.create_exception_notification(:environment => {})
|
60
|
-
mail.subject.should match(/\[super important email\]/)
|
61
|
-
end
|
62
|
-
|
63
|
-
end
|
64
|
-
|
65
|
-
end
|