adhearsion-reporter 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 55eccb6f3f9822e1bb2fcfb3bf543dba08da7d9f
4
- data.tar.gz: 8f9a673465445f6bd37e65a694f54f298496d08c
3
+ metadata.gz: 2f64fe44bf22a4f443f8ea106405880fd6b8a072
4
+ data.tar.gz: a6066fc3c57366b8c92f043d108397bf34ce73a7
5
5
  SHA512:
6
- metadata.gz: af79d4b1a6c6664347b609e24fef1cf88d10b36bec698cdc637a1ad248bab2485bd45a2ef3a01cfb5263c6da1ebde5466e423223842bf20c8fb9f688b3b13f3e
7
- data.tar.gz: f69ff9fdfe2ba9265e42d95729ca8a9105b51380b9752bd876a93dc68196e99dd7855681da2aa9d3cb7c8c3b5628da0d8e8229ec8d78e3a876a0db7a1726a530
6
+ metadata.gz: 16cde73a7ca5a67970bd2beacc160b46155d2b54a4426bf0ff16c62fc8ce28de77cd7e590c4e82f1efcc6db1855a70d465efcc064edc2185aacca98521997da2
7
+ data.tar.gz: 4f0091592f7ede2c3000e312e3d6a59cdbc7ece490a9f55eabd449ca77264ba0c7e6c83147045a91ded58930d53d5c00564c4408a52e868379acc68c637bf909
@@ -1,4 +1,6 @@
1
1
  # develop
2
+ * New notifiers: EmailNotifier and SentryNotifier
3
+ * Allow configuring multiple notifiers as a list. The `notifier` option is deprecated in favour of `notifiers`, which can be used the same for a single notifier.
2
4
 
3
5
  # v2.1.0
4
6
  * Bugfix: record the correct environment with each notification
data/Guardfile CHANGED
@@ -1,24 +1,9 @@
1
1
  # A sample Guardfile
2
2
  # More info at https://github.com/guard/guard#readme
3
3
 
4
- guard :rspec do
4
+ guard 'rspec', cmd: 'bundle exec rspec' do
5
5
  watch(%r{^spec/.+_spec\.rb$})
6
- watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
7
- watch('spec/spec_helper.rb') { "spec" }
8
-
9
- # Rails example
10
- watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
11
- watch(%r{^app/(.*)(\.erb|\.haml|\.slim)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
12
- watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
13
- watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
14
- watch('config/routes.rb') { "spec/routing" }
15
- watch('app/controllers/application_controller.rb') { "spec/controllers" }
16
-
17
- # Capybara features specs
18
- watch(%r{^app/views/(.+)/.*\.(erb|haml|slim)$}) { |m| "spec/features/#{m[1]}_spec.rb" }
19
-
20
- # Turnip features and steps
21
- watch(%r{^spec/acceptance/(.+)\.feature$})
22
- watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
6
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
7
+ watch('spec/spec_helper.rb') { "spec/" }
23
8
  end
24
9
 
data/README.md CHANGED
@@ -31,6 +31,21 @@ Adhearsion.config do |config|
31
31
  end
32
32
  ```
33
33
 
34
+ Email Notifier
35
+ --------------
36
+ Email notification uses the [pony](https://github.com/benprew/pony) gem.
37
+ The `email` configuration key is passed to Pony on initialization using `Pony.options`.
38
+
39
+ To set the destination address and the sender address, for example, you can use:
40
+
41
+ ```ruby
42
+ Adhearsion::Reporter.config.email = {
43
+ via: :sendmail,
44
+ to: 'recv@domain.ext',
45
+ from: 'send@domain.ext'
46
+ }
47
+ ```
48
+
34
49
  Copyright
35
50
  ---------
36
51
 
@@ -13,9 +13,10 @@ Gem::Specification.new do |s|
13
13
  s.description = <<EOF
14
14
  Report Adhearsion application exceptions and deployments to:
15
15
 
16
- Airbrake
17
- Errbit
18
- This Adhearsion plugin requires Adhearsion 2.0 or later. For Adhearsion 1.0 try the previous version of this gem ahn_hoptoad
16
+ Airbrake / Errbit
17
+ Email
18
+ Newrelic
19
+ Sentry
19
20
  EOF
20
21
  s.files = `git ls-files`.split("\n")
21
22
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -25,6 +26,9 @@ EOF
25
26
  s.add_runtime_dependency "adhearsion", ["~> 2.0"]
26
27
  s.add_runtime_dependency "toadhopper", [">= 1.3.0"]
27
28
  s.add_runtime_dependency "newrelic_rpm", ["~> 3.6"]
29
+ s.add_runtime_dependency "pony", ["~> 1.10"]
30
+ s.add_runtime_dependency "sentry-raven", ["~> 0.15.0"]
28
31
 
29
32
  s.add_development_dependency 'guard-rspec'
33
+ s.add_development_dependency 'timecop'
30
34
  end
@@ -5,6 +5,8 @@ require 'toadhopper'
5
5
  require 'adhearsion'
6
6
  require 'adhearsion/reporter/airbrake_notifier'
7
7
  require 'adhearsion/reporter/newrelic_notifier'
8
+ require 'adhearsion/reporter/email_notifier'
9
+ require 'adhearsion/reporter/sentry_notifier'
8
10
 
9
11
  module Adhearsion
10
12
  class Reporter
@@ -18,10 +20,14 @@ module Adhearsion
18
20
  config :reporter do
19
21
  api_key nil, desc: "The Airbrake/Errbit API key"
20
22
  url "http://airbrake.io", desc: "Base URL for notification service"
23
+ app_name "Adhearsion", desc: "Application name, used for reporting"
21
24
  notifier Adhearsion::Reporter::AirbrakeNotifier,
22
- desc: "The class that will act as the notifier. Built-in classes are Adhearsion::Reporter::AirbrakeNotifier and Adhearsion::Reporter::NewrelicNotifier",
25
+ desc: "The class that will act as the notifier. Built-in classes are Adhearsion::Reporter::AirbrakeNotifier, Adhearsion::Reporter::NewrelicNotifier, and Adhearsion::Reporter::SentryNotifier. This option is deprecated; please specify in `notifiers`.",
23
26
  transform: Proc.new { |v| const_get(v.to_s) }
24
- enable true, desc: "Disables notifications. Useful for testing"
27
+ notifiers [],
28
+ desc: "Collection of classes that will act as notifiers",
29
+ transform: Proc.new { |v| v.split(',').map { |n| n.to_s.constantize } }
30
+ enable true, desc: "Whether to send notifications - set to false to disable all notifications globally (useful for testing)"
25
31
  excluded_environments [:development, :test], desc: "Skip reporting errors for the listed environments (comma delimited when set by environment variable", transform: Proc.new { |v| names = v.split(','); names = names.each.map &:to_sym }
26
32
  newrelic {
27
33
  license_key 'MYKEY', desc: "Your license key for New Relic"
@@ -30,12 +36,26 @@ module Adhearsion
30
36
  developer_mode false, desc: "More information but very high overhead in memory"
31
37
  log_level 'info', desc: "The newrelic's agent log level"
32
38
  }
39
+ email Hash.new(via: :sendmail), desc: "Used to configure the email notifier, with options accepted by the pony (https://github.com/benprew/pony) gem"
40
+ sentry {
41
+ dsn 'https://<user>:<password>@app.getsentry.com/<application>', desc: "The SENTRY_DSN, or client key that has been created in Sentry"
42
+ current_environment 'production', 'The current execution environment'
43
+ environments ['production'], 'The environments for which Sentry is active'
44
+ }
33
45
  end
34
46
 
35
47
  init :reporter do
36
- Reporter.config.notifier.init
37
- Events.register_callback(:exception) do |e, logger|
38
- Reporter.config.notifier.instance.notify e
48
+ # If a collection of multiple notifiers is not set, fall back to the individual option for BC.
49
+ # TODO: Remove the `notifier` option in v3.0
50
+ if Reporter.config.notifiers.empty?
51
+ Reporter.config.notifiers = [Reporter.config.notifier]
52
+ end
53
+
54
+ Reporter.config.notifiers.each do |notifier|
55
+ notifier.init
56
+ Events.register_callback(:exception) do |e, logger|
57
+ notifier.notify e
58
+ end
39
59
  end
40
60
  end
41
61
  end
@@ -0,0 +1,49 @@
1
+ # encoding: utf-8
2
+
3
+ require 'pony'
4
+ require 'socket'
5
+
6
+ module Adhearsion
7
+ class Reporter
8
+ class EmailNotifier
9
+ include Singleton
10
+
11
+ def init
12
+ Pony.options = Adhearsion::Reporter.config.email
13
+ end
14
+
15
+ def notify(ex)
16
+ Pony.mail({
17
+ subject: email_subject(ex),
18
+ body: exception_text(ex),
19
+ from: hostname
20
+ })
21
+ end
22
+
23
+ def self.method_missing(m, *args, &block)
24
+ instance.send m, *args, &block
25
+ end
26
+
27
+ private
28
+ def email_subject(exception)
29
+ "[#{Adhearsion::Reporter.config.app_name}-#{environment}] Exception: #{exception.class} (#{exception.message})"
30
+ end
31
+
32
+ def exception_text(exception)
33
+ backtrace = exception.backtrace || ["EMPTY BACKTRACE"]
34
+ "#{Adhearsion::Reporter.config.app_name} reported an exception at #{Time.now.to_s}" +
35
+ "\n\n#{exception.class} (#{exception.message}):\n" +
36
+ backtrace.join("\n") +
37
+ "\n\n"
38
+ end
39
+
40
+ def environment
41
+ Adhearsion.config.platform.environment.to_s.upcase
42
+ end
43
+
44
+ def hostname
45
+ Socket.gethostname
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,32 @@
1
+ # encoding: utf-8
2
+
3
+ require 'raven'
4
+
5
+ module Adhearsion
6
+ class Reporter
7
+ class SentryNotifier
8
+ include Singleton
9
+
10
+ def init
11
+ Raven.configure do |config|
12
+ Reporter.config.sentry.each do |k,v|
13
+ config.send("#{k}=", v) unless v.nil?
14
+ end
15
+ end
16
+ end
17
+
18
+ def notify(ex)
19
+ Raven.capture_exception(ex)
20
+ rescue Exception => e
21
+ logger.error "Error posting exception to Sentry"
22
+ logger.warn "Original exception message: #{e.message}"
23
+ raise
24
+ end
25
+
26
+ def self.method_missing(m, *args, &block)
27
+ instance.send m, *args, &block
28
+ end
29
+
30
+ end
31
+ end
32
+ end
@@ -1,5 +1,5 @@
1
1
  module Adhearsion
2
2
  class Reporter
3
- VERSION = '2.1.0'
3
+ VERSION = '2.2.0'
4
4
  end
5
5
  end
@@ -4,6 +4,11 @@ describe Adhearsion::Reporter do
4
4
  EventClass = Class.new
5
5
  ExceptionClass = Class.new StandardError
6
6
 
7
+ before do
8
+ Adhearsion::Reporter.config.notifier = nil
9
+ Adhearsion::Reporter.config.notifiers = []
10
+ end
11
+
7
12
  context "with a DummyNotifier" do
8
13
  class DummyNotifier
9
14
  include Singleton
@@ -28,12 +33,12 @@ describe Adhearsion::Reporter do
28
33
  end
29
34
 
30
35
  it "calls init on the notifier instance" do
31
- Adhearsion::Reporter.config.notifier.instance.initialized.should == true
36
+ expect(Adhearsion::Reporter.config.notifier.instance.initialized).to be(true)
32
37
  end
33
38
 
34
39
  it "logs an exception event" do
35
40
  sleep 0.25
36
- Adhearsion::Reporter.config.notifier.instance.notified.class.should == ExceptionClass
41
+ expect(Adhearsion::Reporter.config.notifier.instance.notified.class).to eq(ExceptionClass)
37
42
  end
38
43
  end
39
44
 
@@ -43,16 +48,16 @@ describe Adhearsion::Reporter do
43
48
  end
44
49
 
45
50
  it "should initialize correctly" do
46
- Toadhopper.should_receive(:new).with(Adhearsion::Reporter.config.api_key, notify_host: Adhearsion::Reporter.config.url)
51
+ expect(Toadhopper).to receive(:new).with(Adhearsion::Reporter.config.api_key, notify_host: Adhearsion::Reporter.config.url)
47
52
  Adhearsion::Plugin.init_plugins
48
53
  end
49
54
 
50
55
  context "exceptions" do
51
56
  let(:mock_notifier) { double 'notifier' }
52
57
  let(:event_error) { ExceptionClass.new }
53
- let(:response) { double('response').as_null_object }
58
+ let(:response) { double('response', status: '200').as_null_object }
54
59
 
55
- before { Toadhopper.should_receive(:new).at_least(:once).and_return(mock_notifier) }
60
+ before { expect(Toadhopper).to receive(:new).at_least(:once).and_return(mock_notifier) }
56
61
 
57
62
  after do
58
63
  Adhearsion::Plugin.init_plugins
@@ -60,14 +65,14 @@ describe Adhearsion::Reporter do
60
65
  end
61
66
 
62
67
  it "should notify Airbrake" do
63
- mock_notifier.should_receive(:post!).at_least(:once).with(event_error, hash_including(framework_env: :production)).and_return(response)
68
+ expect(mock_notifier).to receive(:post!).at_least(:once).with(event_error, hash_including(framework_env: :production)).and_return(response)
64
69
  end
65
70
 
66
71
  context "with an environment set" do
67
72
  before { Adhearsion.config.platform.environment = :foo }
68
73
 
69
74
  it "notifies airbrake with that environment" do
70
- mock_notifier.should_receive(:post!).at_least(:once).with(event_error, hash_including(framework_env: :foo)).and_return(response)
75
+ expect(mock_notifier).to receive(:post!).at_least(:once).with(event_error, hash_including(framework_env: :foo)).and_return(response)
71
76
  end
72
77
  end
73
78
 
@@ -77,7 +82,7 @@ describe Adhearsion::Reporter do
77
82
  Adhearsion::Plugin.init_plugins
78
83
  end
79
84
  it "should not report errors for excluded environments" do
80
- mock_notifier.should_not_receive(:post!)
85
+ expect(mock_notifier).to_not receive(:post!)
81
86
  end
82
87
  end
83
88
  end
@@ -89,18 +94,148 @@ describe Adhearsion::Reporter do
89
94
  end
90
95
 
91
96
  it "should initialize correctly" do
92
- NewRelic::Agent.should_receive(:manual_start).with(Adhearsion::Reporter.config.newrelic.to_hash)
97
+ expect(NewRelic::Agent).to receive(:manual_start).with(Adhearsion::Reporter.config.newrelic.to_hash)
93
98
  Adhearsion::Plugin.init_plugins
94
99
  end
95
100
 
96
101
  it "should notify Newrelic" do
97
- NewRelic::Agent.should_receive(:manual_start)
102
+ expect(NewRelic::Agent).to receive(:manual_start)
98
103
 
99
104
  event_error = ExceptionClass.new
100
- NewRelic::Agent.should_receive(:notice_error).at_least(:once).with(event_error)
105
+ expect(NewRelic::Agent).to receive(:notice_error).at_least(:once).with(event_error)
101
106
 
102
107
  Adhearsion::Plugin.init_plugins
103
108
  Adhearsion::Events.trigger_immediately :exception, event_error
104
109
  end
105
110
  end
111
+
112
+ context 'with an EmailNotifier' do
113
+ let(:email_options) do
114
+ {
115
+ via: :sendmail,
116
+ to: 'recv@domain.ext'
117
+ }
118
+ end
119
+
120
+ let(:time_freeze) { Time.parse("2014-07-24 17:30:00") }
121
+
122
+ let(:fake_backtrace) do
123
+ [
124
+ '1: foo',
125
+ '2: bar'
126
+ ]
127
+ end
128
+
129
+ let(:error_message) { "Something bad" }
130
+
131
+ before(:each) do
132
+ Adhearsion::Reporter.config.notifier = Adhearsion::Reporter::EmailNotifier
133
+ Adhearsion::Reporter.config.email = email_options
134
+ end
135
+
136
+ it "should initialize correctly" do
137
+ Adhearsion::Plugin.init_plugins
138
+ expect(Pony.options).to be(email_options)
139
+ end
140
+
141
+ it "should notify via email" do
142
+
143
+ event_error = ExceptionClass.new error_message
144
+ event_error.set_backtrace(fake_backtrace)
145
+
146
+ hostname = Socket.gethostname
147
+ environment = Adhearsion.config.platform.environment.to_s.upcase
148
+
149
+ Timecop.freeze(time_freeze) do
150
+ expect(Pony).to receive(:mail).at_least(:once).with({
151
+ subject: "[#{Adhearsion::Reporter.config.app_name}-#{environment}] Exception: ExceptionClass (#{error_message})",
152
+ body: "#{Adhearsion::Reporter.config.app_name} reported an exception at #{time_freeze.to_s}\n\nExceptionClass (#{error_message}):\n#{event_error.backtrace.join("\n")}\n\n",
153
+ from: hostname
154
+ })
155
+
156
+ Adhearsion::Plugin.init_plugins
157
+ Adhearsion::Events.trigger_immediately :exception, event_error
158
+ end
159
+ end
160
+ end
161
+
162
+ context "with a SentryNotifier" do
163
+ let(:sentry_options) do
164
+ {
165
+ "dsn" => 'https://123abc:def456@app.getsentry.com/98765',
166
+ "environments" => ['production', 'staging'],
167
+ "current_environment" => 'production'
168
+ }
169
+ end
170
+
171
+ before(:each) do
172
+ Adhearsion::Reporter.config.notifier = Adhearsion::Reporter::SentryNotifier
173
+ Adhearsion::Reporter.config.sentry = sentry_options
174
+ end
175
+
176
+ it "should initialize correctly" do
177
+ Adhearsion::Plugin.init_plugins
178
+
179
+ config = Raven.configuration
180
+ sentry_options.each do |k, v|
181
+ if k == "dsn" #There is no getter for this attribute, so we have to get it through it components
182
+ expect("#{config.scheme}://#{config.public_key}:#{config.secret_key}@#{config.host}/#{config.path}#{config.project_id}").to eq v
183
+ else
184
+ expect(Raven.configuration.send("#{k}")).to eq v
185
+ end
186
+ end
187
+ end
188
+
189
+ it "should notify Sentry" do
190
+ expect(Raven).to receive(:configure)
191
+ event_error = ExceptionClass.new
192
+ expect(Raven).to receive(:capture_exception).at_least(:once).with(event_error)
193
+
194
+ Adhearsion::Plugin.init_plugins
195
+ Adhearsion::Events.trigger_immediately :exception, event_error
196
+ end
197
+ end
198
+
199
+ context "with multiple notifiers" do
200
+
201
+ class BaseNotifier
202
+ include Singleton
203
+
204
+ attr_reader :initialized, :notified
205
+
206
+ def init
207
+ @initialized = true
208
+ end
209
+
210
+ def notify(ex)
211
+ @notified = ex
212
+ end
213
+
214
+ def self.method_missing(m, *args, &block)
215
+ instance.send m, *args, &block
216
+ end
217
+ end
218
+
219
+ class MockNotifier < BaseNotifier; end
220
+ class AnotherMockNotifier < BaseNotifier; end
221
+
222
+ before(:each) do
223
+ Adhearsion::Events.clear_handlers(:exception)
224
+ Adhearsion::Reporter::config.notifiers = [MockNotifier, AnotherMockNotifier]
225
+ Adhearsion::Plugin.init_plugins
226
+ Adhearsion::Events.trigger_immediately :exception, ExceptionClass.new
227
+ end
228
+
229
+ it "calls init on each of the notifier instances" do
230
+ Adhearsion::Reporter::config.notifiers.each do |notifier|
231
+ expect(notifier.instance.initialized).to be(true)
232
+ end
233
+ end
234
+
235
+ it "logs an exception in each of the registered notifiers" do
236
+ Adhearsion::Reporter::config.notifiers.each do |notifier|
237
+ expect(notifier.instance.notified.class).to eq(ExceptionClass)
238
+ end
239
+ end
240
+ end
106
241
  end
@@ -1,11 +1,11 @@
1
1
  require 'adhearsion'
2
2
  require 'adhearsion/reporter'
3
3
  require 'socket'
4
+ require 'timecop'
4
5
 
5
6
  ENV['AHN_ENV'] = 'production'
6
7
 
7
8
  RSpec.configure do |config|
8
- config.color_enabled = true
9
9
  config.tty = true
10
10
 
11
11
  config.filter_run :focus => true
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: adhearsion-reporter
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Klang
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-16 00:00:00.000000000 Z
11
+ date: 2016-01-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: adhearsion
@@ -52,6 +52,34 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.6'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pony
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.10'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.10'
69
+ - !ruby/object:Gem::Dependency
70
+ name: sentry-raven
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.15.0
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.15.0
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: guard-rspec
57
85
  requirement: !ruby/object:Gem::Requirement
@@ -66,12 +94,27 @@ dependencies:
66
94
  - - ">="
67
95
  - !ruby/object:Gem::Version
68
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: timecop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
69
111
  description: |
70
112
  Report Adhearsion application exceptions and deployments to:
71
113
 
72
- Airbrake
73
- Errbit
74
- This Adhearsion plugin requires Adhearsion 2.0 or later. For Adhearsion 1.0 try the previous version of this gem ahn_hoptoad
114
+ Airbrake / Errbit
115
+ Email
116
+ Newrelic
117
+ Sentry
75
118
  email:
76
119
  - bklang@mojolingo.com
77
120
  executables: []
@@ -91,7 +134,9 @@ files:
91
134
  - lib/adhearsion-reporter.rb
92
135
  - lib/adhearsion/reporter.rb
93
136
  - lib/adhearsion/reporter/airbrake_notifier.rb
137
+ - lib/adhearsion/reporter/email_notifier.rb
94
138
  - lib/adhearsion/reporter/newrelic_notifier.rb
139
+ - lib/adhearsion/reporter/sentry_notifier.rb
95
140
  - lib/adhearsion/reporter/version.rb
96
141
  - spec/reporter_spec.rb
97
142
  - spec/spec_helper.rb
@@ -114,11 +159,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
114
159
  version: '0'
115
160
  requirements: []
116
161
  rubyforge_project:
117
- rubygems_version: 2.2.1
162
+ rubygems_version: 2.4.5
118
163
  signing_key:
119
164
  specification_version: 4
120
165
  summary: Report Adhearsion application deployments and exceptions
121
166
  test_files:
122
167
  - spec/reporter_spec.rb
123
168
  - spec/spec_helper.rb
124
- has_rdoc: