whoops 0.2.4 → 0.3

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.
@@ -146,4 +146,21 @@ ul.detail {
146
146
  font-weight:normal;
147
147
  color:$blue;
148
148
  }
149
+ }
150
+
151
+ /* Notification rules! */
152
+ #new-notification-rule {
153
+ textarea {
154
+ height: 100px;
155
+ width:190px;
156
+ }
157
+ }
158
+
159
+ .topbar .documentation {
160
+ float: right;
161
+ @extend .brand;
162
+ }
163
+
164
+ header form {
165
+ float:right;
149
166
  }
@@ -5,6 +5,7 @@ class EventGroupsController < ApplicationController
5
5
 
6
6
  def index
7
7
  query_document = event_group_filter.to_query_document
8
+ query_document.merge!(:archived => false) unless params[:show_archived]
8
9
  query_document.merge!(:_id.in => Whoops::Event.where(:keywords => /#{params[:query]}/i).distinct(:event_group_id)) unless params[:query].blank?
9
10
 
10
11
  @event_groups = Whoops::EventGroup.where(query_document).desc(:last_recorded_at).page(params[:page]).per(30)
@@ -30,5 +31,11 @@ class EventGroupsController < ApplicationController
30
31
  def event_group_filter=(filter)
31
32
  session[:event_group_filter] = Whoops::Filter.new_from_params(filter)
32
33
  end
34
+
35
+ def update
36
+ @event_group = Whoops::EventGroup.find(params[:id])
37
+ @event_group.update_attributes(:archived => params[:event_group][:archived] == "true")
38
+ redirect_to whoops_event_group_events_path(@event_group)
39
+ end
33
40
 
34
41
  end
@@ -0,0 +1,29 @@
1
+ class NotificationRulesController < ApplicationController
2
+ layout 'whoops'
3
+
4
+ def index
5
+ @notification_rule = Whoops::NotificationRule.new
6
+ @notification_rules = Whoops::NotificationRule.asc(:email)
7
+ end
8
+
9
+ def create
10
+ Whoops::NotificationRule.add_rules(params[:notification_rule])
11
+ redirect_to whoops_notification_rules_path
12
+ end
13
+
14
+ def edit
15
+ @notification_rule = Whoops::NotificationRule.find(params[:id])
16
+ end
17
+
18
+ def update
19
+ @notification_rule = Whoops::NotificationRule.find(params[:id])
20
+ @notification_rule.update_attributes(params[:notification_rule])
21
+ notification_rules = Whoops::NotificationRule.asc(:email)
22
+ redirect_to whoops_notification_rules_path
23
+ end
24
+
25
+ def destroy
26
+ Whoops::NotificationRule.find(params[:id]).destroy
27
+ redirect_to whoops_notification_rules_path
28
+ end
29
+ end
@@ -1,10 +1,12 @@
1
1
  class Whoops::NotificationMailer < ActionMailer::Base
2
- def event_notification(event_group, *addresses)
2
+ def event_notification(event_group, addresses)
3
3
  @event_group = event_group
4
4
  @addresses = addresses
5
5
  mail(
6
6
  :to => addresses.join(", "),
7
- :subject => "Whoops Notification | #{event_group.service}: #{event_group.environment}: #{event_group.message}"
7
+ :from => Rails.application.config.whoops_sender,
8
+ :subject => "Whoops Notification | #{event_group.service}: #{event_group.environment}: #{event_group.message}",
9
+ :body => "#{event_group.service}: #{event_group.environment}: #{event_group.message}"
8
10
  )
9
11
  end
10
- end
12
+ end
@@ -31,6 +31,7 @@ class Whoops::EventGroup
31
31
  end
32
32
 
33
33
  if event_group.valid?
34
+ event_group.event_count += 1
34
35
  event_group.send_notifications
35
36
  event_group.save
36
37
  end
@@ -62,13 +63,13 @@ class Whoops::EventGroup
62
63
  self.notify_on_next_occurrence = true
63
64
  end
64
65
  end
66
+ true
65
67
  end
66
68
 
67
-
68
69
  def send_notifications
69
- return unless self.notify_on_next_occurrence
70
+ return if !self.notify_on_next_occurrence || !Rails.application.config.whoops_sender
70
71
  matcher = Whoops::NotificationRule::Matcher.new(self)
71
- Whoops::NotificationMailer.event_notification(self, matcher.matches).deliver unless matcher.matches.empty?
72
+ Whoops::NotificationMailer.event_notification(self, matcher.matches.collect(&:email)).deliver unless matcher.matches.empty?
72
73
  self.notify_on_next_occurrence = false
73
74
  end
74
75
  end
@@ -4,6 +4,8 @@ class Whoops::NotificationRule
4
4
  field :email, :type => String
5
5
  field :matchers, :type => Array
6
6
 
7
+ validates_presence_of :email
8
+
7
9
  # This might come in handy in the future?
8
10
  # class << self.fields["matchers"]
9
11
  # def set(object)
@@ -19,11 +21,26 @@ class Whoops::NotificationRule
19
21
  end
20
22
 
21
23
  def matchers=(matchers)
22
- write_attribute(:matchers, matchers.split("\n").collect{ |m| m.strip })
24
+ write_attribute(:matchers, split_matchers(matchers).sort)
23
25
  end
24
-
25
- def self.matches(event)
26
-
26
+
27
+ def add_matchers(new_matchers)
28
+ split = split_matchers(new_matchers)
29
+ write_attribute(:matchers, (self.matchers | split).sort)
30
+ self.save
31
+ end
32
+
33
+ def split_matchers(new_matchers)
34
+ new_matchers.split("\n").collect{ |m| m.strip }
35
+ end
36
+
37
+ def self.add_rules(params)
38
+ params[:email] = params[:email].downcase
39
+ if rule = first(:conditions => {:email => params[:email]})
40
+ rule.add_matchers(params[:matchers])
41
+ else
42
+ create(params)
43
+ end
27
44
  end
28
45
 
29
46
  class Matcher
@@ -42,4 +59,4 @@ class Whoops::NotificationRule
42
59
  @matches ||= Whoops::NotificationRule.where(:matchers => /^#{event_group.service}/)
43
60
  end
44
61
  end
45
- end
62
+ end
@@ -24,7 +24,15 @@
24
24
 
25
25
  %article
26
26
  %header
27
- %h3= @event_group.message
27
+ = form_for :event_group, :url => whoops_event_group_path(@event_group), :method => :put do |f|
28
+ - if @event_group.archived
29
+ = f.hidden_field :archived, :value => false
30
+ = f.submit :class => "btn", :value => "unarchive"
31
+ - else
32
+ = f.hidden_field :archived, :value => true
33
+ = f.submit :class => "btn", :value => "archive"
34
+ %h3
35
+ = @event_group.message
28
36
  %table.span8.bordered-table
29
37
  %thead
30
38
  %tr
@@ -14,9 +14,12 @@
14
14
  .topbar
15
15
  .listfill
16
16
  .container-fluid
17
- = link_to "Whoops", whoops_event_groups_path, :class => "brand"
17
+ = link_to "Event Groups", whoops_event_groups_path, :class => "brand"
18
+ = link_to "Notification Rules", whoops_notification_rules_path, :class => "brand"
19
+ = link_to "Whoops Documentation", "http://www.whoopsapp.com/", :class => "documentation"
18
20
  .container-fluid
19
21
  .sidebar
20
22
  = yield :sidebar
21
23
  .content
22
- = yield
24
+ = yield
25
+
@@ -0,0 +1,15 @@
1
+ %h3 New
2
+ - options = @notification_rule.new_record? ? {:url => whoops_notification_rules_path, :method => :post} : {:url => whoops_notification_rule_path(@notification_rule), :method => :put}
3
+ = form_for :notification_rule, options do |f|
4
+ #new-notification-rule
5
+ %p
6
+ Email
7
+ %br
8
+ =f.text_field :email
9
+ %p
10
+ Matchers
11
+ %br
12
+ = f.text_area :matchers, :value => @notification_rule.matchers.to_a.join("\n")
13
+ %p= f.submit(:class => "primary btn", :value => "Save Notification Rule")
14
+
15
+ %p= link_to "Back to notification rules", whoops_notification_rules_path
@@ -0,0 +1,8 @@
1
+ %h3 Edit Notification Rules for #{@notification_rule.email}
2
+
3
+ = render :partial => "form"
4
+
5
+ %h4 Delete This Rule
6
+
7
+ = form_for :notification_rule, :method => :delete, :url => whoops_notification_rule_path(@notification_rule) do |f|
8
+ = f.submit :class => "btn", :value => "Delete it Forever! There's no going back!"
@@ -0,0 +1,21 @@
1
+ %h3 Notification Rules
2
+
3
+ - content_for :sidebar do
4
+ .space
5
+ = render :partial => "form"
6
+
7
+
8
+
9
+ %table
10
+ %tr
11
+ %th Email Address
12
+ %th Services to Monitor
13
+ %th
14
+
15
+ - @notification_rules.each do |nr|
16
+ %tr
17
+ %td= nr.email
18
+ %td= nr.matchers.sort.join(", ")
19
+ %td= link_to "update", edit_whoops_notification_rule_path(nr)
20
+
21
+
data/config/routes.rb CHANGED
@@ -4,4 +4,5 @@ Rails.application.routes.draw do
4
4
  end
5
5
 
6
6
  resources :events, :as => "whoops_events"
7
- end
7
+ resources :notification_rules, :as => "whoops_notification_rules"
8
+ end
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: whoops
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
4
+ hash: 13
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 2
9
- - 4
10
- version: 0.2.4
8
+ - 3
9
+ version: "0.3"
11
10
  platform: ruby
12
11
  authors:
13
12
  - Daniel Higginbotham
@@ -15,7 +14,7 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2012-07-03 00:00:00 Z
17
+ date: 2012-07-04 00:00:00 Z
19
18
  dependencies:
20
19
  - !ruby/object:Gem::Dependency
21
20
  name: rails
@@ -186,6 +185,7 @@ files:
186
185
  - app/assets/stylesheets/whoops.css.scss
187
186
  - app/controllers/event_groups_controller.rb
188
187
  - app/controllers/events_controller.rb
188
+ - app/controllers/notification_rules_controller.rb
189
189
  - app/helpers/event_groups_helper.rb
190
190
  - app/helpers/events_helper.rb
191
191
  - app/helpers/notifications_helper.rb
@@ -202,6 +202,9 @@ files:
202
202
  - app/views/events/_details.html.haml
203
203
  - app/views/events/index.html.haml
204
204
  - app/views/layouts/whoops.html.haml
205
+ - app/views/notification_rules/_form.html.haml
206
+ - app/views/notification_rules/edit.html.haml
207
+ - app/views/notification_rules/index.html.haml
205
208
  - lib/tasks/whoops.rake
206
209
  - lib/whoops/engine.rb
207
210
  - lib/whoops.rb