temescal 0.1.3 → 0.1.4

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: 3f37264d3890ff553dbeeaa4da80089a858abc7b
4
- data.tar.gz: 67e5f482b6fd8c757e881ca1aec281024462dcc1
3
+ metadata.gz: 99d0eb1cb114d96a76bdc45a6f31beb902d05028
4
+ data.tar.gz: 823a730b2904628aa8db967e31fed3d4630faad3
5
5
  SHA512:
6
- metadata.gz: 1b5137c2c6bead9f87c8ef19b173f08658bf9ba0bd567c56bbd17d7f1255cadc241d5c4a02ae9bedf4be041267485564c498eed5326c3244ac888ce7b5c80b83
7
- data.tar.gz: a24d94b23ae58d0765a0381105c8cd6036f12f800cee2aaf6a175d7c6bdf33cd619eb00599c7ca9d6964729aa984dc2a9c3d1ad4e153829f8dd2e091c22af18c
6
+ metadata.gz: 7b43e4795769e8de711b82ba6395d885eb01c8c653f4ad433b7dbbc42c118e55d2d00ae9dd0f96acf4638b05de2660ace17984a5fd90c03265058a75a7afc4df
7
+ data.tar.gz: 5afc871cd1ffa133dacae0eb0e32ae7b8d1b8b8b581a431e02019dee9330cb7a0d531f3aa8dda12efbc6ddb43552e9b8c16e6adfd3824b348beca0850d8984da
data/README.md CHANGED
@@ -43,6 +43,7 @@ The services currently supported are:
43
43
  * [Airbrake](https://airbrake.io/)
44
44
  * [Bugsnag](https://bugsnag.com/)
45
45
  * [New Relic](http://newrelic.com/)
46
+ * [Honeybadger](https://www.honeybadger.io/)
46
47
 
47
48
  If you use a different monitoring service that you'd like to see supported, feel free to submit an issue. Better yet, pull requests are more than welcome!
48
49
 
@@ -51,7 +52,7 @@ Note that you'll need the gem for your monitor installed and configured for your
51
52
  ## Configuration
52
53
  Temescal provides several configuration options for you. You can set these options when configuring the middleware for your application.
53
54
 
54
- `monitors` to set the monitors you'd like to use with Temescal. It takes symbols of monitor names (currently `:airbrake`, `:bugsnag`, and `:new_relic`).
55
+ `monitors` to set the monitors you'd like to use with Temescal. It takes symbols of monitor names (currently `:airbrake`, `:bugsnag`, `:new_relic`, and `:honeybadger`).
55
56
 
56
57
  `raise_errors` to set whether you'd like to override Temescal and raise all errors without rendering a Temescal response. Set to `true` to enable.
57
58
 
@@ -10,6 +10,9 @@ module Temescal
10
10
  # Public: Setter for raise_errors option.
11
11
  attr_writer :raise_errors
12
12
 
13
+ # Public: Setter for meta_key option.
14
+ attr_writer :meta_key
15
+
13
16
  # Public: Getter/Setter for default JSON message.
14
17
  attr_accessor :default_message
15
18
 
@@ -53,6 +56,13 @@ module Temescal
53
56
  @ignored_errors = errors.flatten
54
57
  end
55
58
 
59
+ # Public: Getter for meta_key option.
60
+ #
61
+ # Returns the meta_key option or simply "meta" if null.
62
+ def meta_key
63
+ @meta_key || "meta"
64
+ end
65
+
56
66
  private
57
67
 
58
68
  # Private: Converts a snake cased Symbol to a camel cased String.
@@ -1,6 +1,6 @@
1
1
  module Temescal
2
2
  class Error
3
- NOT_FOUND_ERRORS = ["ActiveRecord::RecordNotFound", "Sinatra::NotFound"]
3
+ NOT_FOUND_ERRORS = %w(ActiveRecord::RecordNotFound Sinatra::NotFound)
4
4
 
5
5
  # Public: Instantiates a new Error.
6
6
  #
@@ -41,5 +41,15 @@ module Temescal
41
41
  ::Bugsnag.notify exception
42
42
  end
43
43
  end
44
+
45
+ # Public: Reporting strategy for Honeybadger.
46
+ class Honeybadger < MonitorsStrategy
47
+ # Public: Reports an exception to Honeybadger.
48
+ #
49
+ # exception - The caught exception.
50
+ def self.report(exception)
51
+ ::Honeybadger.notify exception
52
+ end
53
+ end
44
54
  end
45
55
  end
@@ -1,4 +1,4 @@
1
- require 'json'
1
+ require "json"
2
2
 
3
3
  module Temescal
4
4
  module Response
@@ -11,7 +11,7 @@ module Temescal
11
11
  def self.build(error)
12
12
  [
13
13
  {
14
- meta: {
14
+ $_temescal_configuration.meta_key => {
15
15
  status: error.status,
16
16
  error: error.type,
17
17
  message: error.message
@@ -1,3 +1,3 @@
1
1
  module Temescal
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
@@ -7,8 +7,8 @@ class Temescal::Monitors::FooMonitor; end
7
7
  describe Temescal::Configuration do
8
8
  let(:config) { Temescal::Configuration.new }
9
9
 
10
- context "#monitors=" do
11
- it "should add a list of valid monitor classes to the monitors array from snake-cased arguments" do
10
+ describe "#monitors=" do
11
+ it "adds a list of valid monitor classes to the monitors array from snake-cased arguments" do
12
12
  config.monitors = :monitor, :fake_monitor, :foo_monitor
13
13
 
14
14
  expect(config.monitors).to eq [
@@ -18,7 +18,7 @@ describe Temescal::Configuration do
18
18
  ]
19
19
  end
20
20
 
21
- it "should raise an error if a monitor strategy is invalid" do
21
+ it "raises an error if a monitor strategy is invalid" do
22
22
  expect { config.monitors = :foo }.to raise_error(NameError, /Foo is not a valid monitoring strategy/)
23
23
  end
24
24
  end
@@ -10,70 +10,70 @@ describe Temescal::Error do
10
10
  $_temescal_configuration = Temescal::Configuration.new
11
11
  end
12
12
 
13
- context "#message" do
14
- it "should return the configured default message if it is set in the configuration" do
15
- Temescal::Configuration.any_instance.stub(:default_message).and_return("Some other message.")
13
+ describe "#message" do
14
+ it "returns the configured default message if it is set in the configuration" do
15
+ allow_any_instance_of(Temescal::Configuration).to receive(:default_message).and_return("Some other message.")
16
16
 
17
17
  expect(error.message).to eq "Some other message."
18
18
  end
19
19
 
20
- it "should return the exception's message if the default message is not configured" do
20
+ it "returns the exception's message if the default message is not configured" do
21
21
  expect(error.message).to eq "Foobar"
22
22
  end
23
23
  end
24
24
 
25
- context "#status" do
26
- it "should return 404 if the exception is an ActiveRecord::RecordNotFound" do
25
+ describe "#status" do
26
+ it "returns 404 if the exception is an ActiveRecord::RecordNotFound" do
27
27
  exception = ActiveRecord::RecordNotFound.new
28
28
  error = Temescal::Error.new(exception)
29
29
 
30
30
  expect(error.status).to eq 404
31
31
  end
32
32
 
33
- it "should return 404 if the exception is a Sinatra::NotFound" do
33
+ it "returns 404 if the exception is a Sinatra::NotFound" do
34
34
  exception = Sinatra::NotFound.new
35
35
  error = Temescal::Error.new(exception)
36
36
 
37
37
  expect(error.status).to eq 404
38
38
  end
39
39
 
40
- it "should return the exception's status code if assigned" do
41
- exception.stub(:http_status).and_return(403)
40
+ it "returns the exception's status code if assigned" do
41
+ allow(exception).to receive(:http_status).and_return(403)
42
42
 
43
43
  expect(error.status).to eq 403
44
44
  end
45
45
 
46
- it "should return 500 for all other exceptions" do
46
+ it "returns 500 for all other exceptions" do
47
47
  expect(error.status).to eq 500
48
48
  end
49
49
  end
50
50
 
51
- context "#formatted" do
52
- it "should return a String formatted for log output" do
53
- exception.stub(:backtrace).and_return(["Line 1", "Line 2"])
51
+ describe "#formatted" do
52
+ it "returns a String formatted for log output" do
53
+ allow(exception).to receive(:backtrace).and_return(["Line 1", "Line 2"])
54
54
 
55
55
  expect(error.formatted).to eq "\nStandardError: Foobar\n Line 1\n Line 2\n\n"
56
56
  end
57
57
  end
58
58
 
59
- context "#type" do
60
- it "should return the exception's class name" do
59
+ describe "#type" do
60
+ it "returns the exception's class name" do
61
61
  expect(error.type).to eq "StandardError"
62
62
  end
63
63
  end
64
64
 
65
- context "#ignore?" do
65
+ describe "#ignore?" do
66
66
  before do
67
- Temescal::Configuration.any_instance.stub(:ignored_errors).and_return([TypeError])
67
+ allow_any_instance_of(Temescal::Configuration).to receive(:ignored_errors).and_return([TypeError])
68
68
  end
69
69
 
70
- it "should return true if the exception type is configured as an ignored error" do
70
+ it "returns true if the exception type is configured as an ignored error" do
71
71
  error = Temescal::Error.new(TypeError.new)
72
- expect(error.ignore?).to be_true
72
+ expect(error.ignore?).to be true
73
73
  end
74
74
 
75
- it "should return false if the exception type is not an ignored error" do
76
- expect(error.ignore?).to be_false
75
+ it "returns false if the exception type is not an ignored error" do
76
+ expect(error.ignore?).to be false
77
77
  end
78
78
  end
79
79
  end
@@ -12,7 +12,7 @@ describe Temescal::Middleware do
12
12
  Temescal::Middleware.new(app)
13
13
  end
14
14
 
15
- it "should render the application's response" do
15
+ it "renders the application's response" do
16
16
  code, _, _ = middleware.call env_for('http://foobar.com')
17
17
 
18
18
  expect(code).to eq 200
@@ -21,8 +21,8 @@ describe Temescal::Middleware do
21
21
 
22
22
  context "Bad response" do
23
23
  before do
24
- Temescal::Monitors::NewRelic.stub(:report)
25
- $stderr.stub(:print)
24
+ allow(Temescal::Monitors::NewRelic).to receive(:report)
25
+ allow($stderr).to receive(:print)
26
26
 
27
27
  # Travis automatically sets RACK_ENV=test
28
28
  # Need to override for tests to run correctly.
@@ -38,27 +38,27 @@ describe Temescal::Middleware do
38
38
  end
39
39
  end
40
40
 
41
- it "should respond with a 500 if the exception does not have a http_status attribute" do
41
+ it "responds with a 500 if the exception does not have a http_status attribute" do
42
42
  code, _, _ = middleware.call env_for("http://foobar.com")
43
43
 
44
44
  expect(code).to eq 500
45
45
  end
46
46
 
47
- it "should respond with the appropriate status if the exception has a http_status attribute" do
48
- StandardError.any_instance.stub(:http_status).and_return(403)
47
+ it "responds with the appropriate status if the exception has a http_status attribute" do
48
+ allow_any_instance_of(StandardError).to receive(:http_status).and_return(403)
49
49
 
50
50
  code, _, _ = middleware.call env_for("http://foobar.com")
51
51
 
52
52
  expect(code).to eq 403
53
53
  end
54
54
 
55
- it "should set the correct content type header" do
55
+ it "sets the correct content type header" do
56
56
  _, headers, _ = middleware.call env_for("http://foobar.com")
57
57
 
58
58
  expect(headers["Content-Type"]).to eq "application/json"
59
59
  end
60
60
 
61
- it "should render a JSON response for the error" do
61
+ it "renders a JSON response for the error" do
62
62
  _, _, response = middleware.call env_for("http://foobar.com")
63
63
 
64
64
  json = JSON.parse(response.first)["meta"]
@@ -67,20 +67,20 @@ describe Temescal::Middleware do
67
67
  expect(json["message"]).to eq "Foobar"
68
68
  end
69
69
 
70
- it "should log the error" do
70
+ it "logs the error" do
71
71
  expect($stderr).to receive(:print).with(an_instance_of String)
72
72
 
73
73
  middleware.call env_for("http://foobar.com")
74
74
  end
75
75
 
76
- it "should report the error to the specified monitors" do
76
+ it "reports the error to the specified monitors" do
77
77
  expect(Temescal::Monitors::NewRelic).to receive(:report).with(an_instance_of StandardError)
78
78
 
79
79
  middleware.call env_for("http://foobar.com")
80
80
  end
81
81
 
82
82
  context "with default_message set" do
83
- it "should build a response with the specified message instead of the exception message" do
83
+ it "builds a response with the specified message instead of the exception message" do
84
84
  middleware = Temescal::Middleware.new(app) do |config|
85
85
  config.default_message = "An error has occured - we'll get on it right away!"
86
86
  end
@@ -93,7 +93,7 @@ describe Temescal::Middleware do
93
93
  end
94
94
 
95
95
  context "with a Sinatra::NotFound error" do
96
- it "should build a response with a 404 status code" do
96
+ it "builds a response with a 404 status code" do
97
97
  app = ->(env) { raise Sinatra::NotFound.new }
98
98
  middleware = Temescal::Middleware.new(app)
99
99
 
@@ -104,7 +104,7 @@ describe Temescal::Middleware do
104
104
  end
105
105
 
106
106
  context "with an ActiveRecord::RecordNotFound error" do
107
- it "should build a response with a 404 status code" do
107
+ it "builds a response with a 404 status code" do
108
108
  app = ->(env) { raise ActiveRecord::RecordNotFound.new }
109
109
  middleware = Temescal::Middleware.new(app)
110
110
 
@@ -122,23 +122,39 @@ describe Temescal::Middleware do
122
122
  end
123
123
  end
124
124
 
125
- it "should not log an ignored error type" do
125
+ it "does not log an ignored error type" do
126
126
  expect($stderr).to_not receive(:print).with(an_instance_of String)
127
127
 
128
128
  middleware.call env_for("http://foobar.com")
129
129
  end
130
130
 
131
- it "should not report an ignored error type" do
131
+ it "does not report an ignored error type" do
132
132
  expect(Temescal::Monitors::NewRelic).to_not receive(:report).with(an_instance_of StandardError)
133
133
 
134
134
  middleware.call env_for("http://foobar.com")
135
135
  end
136
136
  end
137
+
138
+ context "with custom meta key set" do
139
+ let(:middleware) do
140
+ Temescal::Middleware.new(app) do |config|
141
+ config.meta_key = "not_meta"
142
+ end
143
+ end
144
+
145
+ it "builds a response with the custom key" do
146
+ _, _, response = middleware.call env_for("http://foobar.com")
147
+
148
+ response = JSON.parse(response.first)
149
+
150
+ expect(response["not_meta"]).to_not be_nil
151
+ end
152
+ end
137
153
  end
138
154
 
139
155
  context "Override middleware to raise exception" do
140
156
  before do
141
- $stderr.stub(:print)
157
+ allow($stderr).to receive(:print)
142
158
  end
143
159
 
144
160
  let(:app) { ->(env) { raise StandardError.new("Foobar") } }
@@ -149,7 +165,7 @@ describe Temescal::Middleware do
149
165
  end
150
166
  end
151
167
 
152
- it "should raise the error" do
168
+ it "raises the error" do
153
169
  expect { middleware.call env_for("http://foobar.com") }.to raise_error StandardError
154
170
  end
155
171
  end
@@ -4,34 +4,52 @@ describe Temescal::Monitors do
4
4
  let(:exception) { StandardError.new }
5
5
 
6
6
  context "MonitorsStrategy" do
7
- it "should raise an error when the report method is called" do
8
- expect { Temescal::Monitors::MonitorsStrategy.report(exception) }.to raise_error(NotImplementedError)
7
+ describe '.report' do
8
+ it "raises an error" do
9
+ expect { Temescal::Monitors::MonitorsStrategy.report(exception) }.to raise_error(NotImplementedError)
10
+ end
9
11
  end
10
12
  end
11
13
 
12
14
  context "Airbrake" do
13
- it "should send the exception to Airbrake when report is called" do
14
- Airbrake.stub(:send_notice)
15
+ describe '.report' do
16
+ it "sends the exception to Airbrake" do
17
+ allow(Airbrake).to receive(:send_notice)
15
18
 
16
- expect(Airbrake).to receive(:notify).with(exception)
19
+ expect(Airbrake).to receive(:notify).with(exception)
17
20
 
18
- Temescal::Monitors::Airbrake.report exception
21
+ Temescal::Monitors::Airbrake.report exception
22
+ end
19
23
  end
20
24
  end
21
25
 
22
26
  context "NewRelic" do
23
- it "should send the exception to New Relic when report is called" do
24
- expect(NewRelic::Agent).to receive(:notice_error).with(exception)
27
+ describe '.report' do
28
+ it "sends the exception to New Relic" do
29
+ expect(NewRelic::Agent).to receive(:notice_error).with(exception)
25
30
 
26
- Temescal::Monitors::NewRelic.report exception
31
+ Temescal::Monitors::NewRelic.report exception
32
+ end
27
33
  end
28
34
  end
29
35
 
30
36
  context 'Bugsnag' do
31
- it "should send the exception to Bugsnag when report is called" do
32
- expect(Bugsnag).to receive(:notify).with(exception)
37
+ describe '.report' do
38
+ it "sends the exception to Bugsnag" do
39
+ expect(Bugsnag).to receive(:notify).with(exception)
33
40
 
34
- Temescal::Monitors::Bugsnag.report exception
41
+ Temescal::Monitors::Bugsnag.report exception
42
+ end
43
+ end
44
+ end
45
+
46
+ context 'Honeybadger' do
47
+ describe '.report' do
48
+ it "sends the exception to Honeybadger" do
49
+ expect(Honeybadger).to receive(:notify).with(exception)
50
+
51
+ Temescal::Monitors::Honeybadger.report exception
52
+ end
35
53
  end
36
54
  end
37
55
  end
data/spec/spec_helper.rb CHANGED
@@ -3,7 +3,7 @@ if ENV["CI"]
3
3
  Coveralls.wear!
4
4
  else
5
5
  require "awesome_print"
6
- require "pry-debugger"
6
+ require "pry-byebug"
7
7
 
8
8
  require "simplecov"
9
9
  SimpleCov.start
@@ -14,6 +14,7 @@ require "rack"
14
14
  require "airbrake"
15
15
  require "newrelic_rpm"
16
16
  require "bugsnag"
17
+ require "honeybadger"
17
18
 
18
19
  require "active_record"
19
20
  require "sinatra"
@@ -21,7 +22,6 @@ require "sinatra"
21
22
  require "temescal"
22
23
 
23
24
  RSpec.configure do |config|
24
- config.treat_symbols_as_metadata_keys_with_true_values = true
25
25
  config.run_all_when_everything_filtered = true
26
26
  config.filter_run :focus
27
27
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: temescal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Todd Bealmear
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-09 00:00:00.000000000 Z
11
+ date: 2014-09-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -81,7 +81,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
81
81
  version: '0'
82
82
  requirements: []
83
83
  rubyforge_project:
84
- rubygems_version: 2.2.0
84
+ rubygems_version: 2.2.2
85
85
  signing_key:
86
86
  specification_version: 4
87
87
  summary: Rack Middleware for gracefully handling exceptions for JSON APIs.