Commit f471cc6769fc9b1b358a562c0885ee5ca9ce2646

Authored by Nick Recobra
2 parents e989d070 241fa8b9
Exists in master and in 1 other branch production

Merge pull request #165 from mathias/observers

Add Observers to Models
app/models/deploy.rb
... ... @@ -12,16 +12,11 @@ class Deploy
12 12  
13 13 embedded_in :app, :inverse_of => :deploys
14 14  
15   - after_create :deliver_notification, :if => :should_notify?
16 15 after_create :resolve_app_errs, :if => :should_resolve_app_errs?
17 16 after_create :store_cached_attributes_on_problems
18 17  
19 18 validates_presence_of :username, :environment
20 19  
21   - def deliver_notification
22   - Mailer.deploy_notification(self).deliver
23   - end
24   -
25 20 def resolve_app_errs
26 21 app.problems.unresolved.in_env(environment).each {|problem| problem.resolve!}
27 22 end
... ... @@ -32,10 +27,6 @@ class Deploy
32 27  
33 28 protected
34 29  
35   - def should_notify?
36   - app.notify_on_deploys? && app.notification_recipients.any?
37   - end
38   -
39 30 def should_resolve_app_errs?
40 31 app.resolve_errs_on_deploy?
41 32 end
... ...
app/models/deploy_observer.rb 0 → 100644
... ... @@ -0,0 +1,9 @@
  1 +class DeployObserver < Mongoid::Observer
  2 + observe :deploy
  3 +
  4 + def after_create deploy
  5 + return unless deploy.app.notify_on_deploys? && deploy.app.notification_recipients.any?
  6 +
  7 + Mailer.deploy_notification(deploy).deliver
  8 + end
  9 +end
... ...
app/models/notice.rb
... ... @@ -23,7 +23,6 @@ class Notice
23 23 )
24 24  
25 25 after_create :increase_counter_cache, :cache_attributes_on_problem, :unresolve_problem
26   - after_create :deliver_notification, :if => :should_notify?
27 26 before_save :sanitize
28 27 before_destroy :decrease_counter_cache, :remove_cached_attributes_from_problem
29 28  
... ... @@ -93,10 +92,6 @@ class Notice
93 92 request['session'] || {}
94 93 end
95 94  
96   - def deliver_notification
97   - Mailer.err_notification(self).deliver
98   - end
99   -
100 95 # Backtrace containing only files from the app itself (ignore gems)
101 96 def app_backtrace
102 97 backtrace.select { |l| l && l['file'] && l['file'].include?("[PROJECT_ROOT]") }
... ... @@ -104,10 +99,6 @@ class Notice
104 99  
105 100 protected
106 101  
107   - def should_notify?
108   - app.notify_on_errs? && (Errbit::Config.per_app_email_at_notices && app.email_at_notices || Errbit::Config.email_at_notices).include?(problem.notices_count) && app.notification_recipients.any?
109   - end
110   -
111 102 def increase_counter_cache
112 103 problem.inc(:notices_count, 1)
113 104 end
... ...
app/models/notice_observer.rb 0 → 100644
... ... @@ -0,0 +1,19 @@
  1 +class NoticeObserver < Mongoid::Observer
  2 + observe :notice
  3 +
  4 + def after_create notice
  5 + return unless should_notify? notice
  6 +
  7 + Mailer.err_notification(notice).deliver
  8 + end
  9 +
  10 + private
  11 +
  12 + def should_notify? notice
  13 + app = notice.app
  14 + app.notify_on_errs? &&
  15 + (Errbit::Config.per_app_email_at_notices && app.email_at_notices || Errbit::Config.email_at_notices).include?(notice.problem.notices_count) &&
  16 + app.notification_recipients.any?
  17 + end
  18 +
  19 +end
... ...
config/application.rb
... ... @@ -51,6 +51,9 @@ module Errbit
51 51 # IssueTracker subclasses use inheritance, so preloading models provides querying consistency in dev mode.
52 52 config.mongoid.preload_models = true
53 53  
  54 + # Set up observers
  55 + config.mongoid.observers = :deploy_observer, :notice_observer
  56 +
54 57 # Configure the default encoding used in templates for Ruby 1.9.
55 58 config.encoding = "utf-8"
56 59  
... ...
spec/models/deploy_observer_spec.rb 0 → 100644
... ... @@ -0,0 +1,20 @@
  1 +require 'spec_helper'
  2 +
  3 +describe DeployObserver do
  4 + context 'when a Deploy is saved' do
  5 + context 'and the app should notify on deploys' do
  6 + it 'should send an email notification' do
  7 + Mailer.should_receive(:deploy_notification).
  8 + and_return(mock('email', :deliver => true))
  9 + Fabricate(:deploy, :app => Fabricate(:app_with_watcher, :notify_on_deploys => true))
  10 + end
  11 + end
  12 +
  13 + context 'and the app is not set to notify on deploys' do
  14 + it 'should not send an email notification' do
  15 + Mailer.should_not_receive(:deploy_notification)
  16 + Fabricate(:deploy, :app => Fabricate(:app_with_watcher, :notify_on_deploys => false))
  17 + end
  18 + end
  19 + end
  20 +end
... ...
spec/models/deploy_spec.rb
... ... @@ -17,12 +17,6 @@ describe Deploy do
17 17 end
18 18  
19 19 context 'being created' do
20   - it 'should send an email notification' do
21   - Mailer.should_receive(:deploy_notification).
22   - and_return(mock('email', :deliver => true))
23   - Fabricate(:deploy, :app => Fabricate(:app_with_watcher, :notify_on_deploys => true))
24   - end
25   -
26 20 context 'when the app has resolve_errs_on_deploy set to false' do
27 21 it 'should not resolve the apps errs' do
28 22 app = Fabricate(:app, :resolve_errs_on_deploy => false)
... ... @@ -43,12 +37,6 @@ describe Deploy do
43 37 end
44 38 end
45 39  
46   - context 'when the app has deploy notifications set to false' do
47   - it 'should not send an email notification' do
48   - Mailer.should_not_receive(:deploy_notification)
49   - Fabricate(:deploy, :app => Fabricate(:app_with_watcher, :notify_on_deploys => false))
50   - end
51   - end
52 40 end
53 41  
54 42 it "should produce a shortened revision with 7 characters" do
... ...
spec/models/notice_observer_spec.rb 0 → 100644
... ... @@ -0,0 +1,46 @@
  1 +require 'spec_helper'
  2 +
  3 +describe NoticeObserver do
  4 + describe "email notifications (configured individually for each app)" do
  5 + custom_thresholds = [2, 4, 8, 16, 32, 64]
  6 +
  7 + before do
  8 + Errbit::Config.per_app_email_at_notices = true
  9 + @app = Fabricate(:app_with_watcher, :email_at_notices => custom_thresholds)
  10 + @err = Fabricate(:err, :problem => Fabricate(:problem, :app => @app))
  11 + end
  12 +
  13 + after do
  14 + Errbit::Config.per_app_email_at_notices = false
  15 + end
  16 +
  17 + custom_thresholds.each do |threshold|
  18 + it "sends an email notification after #{threshold} notice(s)" do
  19 + @err.problem.stub(:notices_count).and_return(threshold)
  20 + Mailer.should_receive(:err_notification).
  21 + and_return(mock('email', :deliver => true))
  22 + Fabricate(:notice, :err => @err)
  23 + end
  24 + end
  25 + end
  26 +
  27 + describe "email notifications for a resolved issue" do
  28 +
  29 + before do
  30 + Errbit::Config.per_app_email_at_notices = true
  31 + @app = Fabricate(:app_with_watcher, :email_at_notices => [1])
  32 + @err = Fabricate(:err, :problem => Fabricate(:problem, :app => @app, :notices_count => 100))
  33 + end
  34 +
  35 + after do
  36 + Errbit::Config.per_app_email_at_notices = false
  37 + end
  38 +
  39 + it "should send email notification after 1 notice since an error has been resolved" do
  40 + @err.problem.resolve!
  41 + Mailer.should_receive(:err_notification).
  42 + and_return(mock('email', :deliver => true))
  43 + Fabricate(:notice, :err => @err)
  44 + end
  45 + end
  46 +end
... ...
spec/models/notice_spec.rb
... ... @@ -109,51 +109,5 @@ describe Notice do
109 109 notice = Fabricate.build(:notice, :request => {})
110 110 notice.host.should == 'N/A'
111 111 end
112   -
113   - end
114   -
115   -
116   - describe "email notifications (configured individually for each app)" do
117   - custom_thresholds = [2, 4, 8, 16, 32, 64]
118   -
119   - before do
120   - Errbit::Config.per_app_email_at_notices = true
121   - @app = Fabricate(:app_with_watcher, :email_at_notices => custom_thresholds)
122   - @err = Fabricate(:err, :problem => Fabricate(:problem, :app => @app))
123   - end
124   -
125   - after do
126   - Errbit::Config.per_app_email_at_notices = false
127   - end
128   -
129   - custom_thresholds.each do |threshold|
130   - it "sends an email notification after #{threshold} notice(s)" do
131   - @err.problem.stub(:notices_count).and_return(threshold)
132   - Mailer.should_receive(:err_notification).
133   - and_return(mock('email', :deliver => true))
134   - Fabricate(:notice, :err => @err)
135   - end
136   - end
137   - end
138   -
139   - describe "email notifications for a resolved issue" do
140   -
141   - before do
142   - Errbit::Config.per_app_email_at_notices = true
143   - @app = Fabricate(:app_with_watcher, :email_at_notices => [1])
144   - @err = Fabricate(:err, :problem => Fabricate(:problem, :app => @app, :notices_count => 100))
145   - end
146   -
147   - after do
148   - Errbit::Config.per_app_email_at_notices = false
149   - end
150   -
151   - it "should send email notification after 1 notice since an error has been resolved" do
152   - @err.problem.resolve!
153   - Mailer.should_receive(:err_notification).
154   - and_return(mock('email', :deliver => true))
155   - Fabricate(:notice, :err => @err)
156   - end
157 112 end
158 113 end
159   -
... ...