airbadger 0.0.4 → 0.1.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: c5d1f63130dcbd9664e66c98ebd2881c3f8093d8
4
- data.tar.gz: 4563077ce8f0b11f7ff3e2cb2031a0e7c3e3bc15
3
+ metadata.gz: 1de42cf567b6d7ddab5665c3c13f751bd2f6b832
4
+ data.tar.gz: 3311757fd84cb7805f33f1cab39a7ad464b4e5b3
5
5
  SHA512:
6
- metadata.gz: f104a615416232818187a6f391ef89939ad5eec0cb62ad36bdd4e5cf8d3bb5bd98ec06135e1665e3b88d01172b468980898bce10d4b8c8a7a7e3d637ef567973
7
- data.tar.gz: b089057607c5bb3655d2ad350b9d673253bd4697cf77fb454cefd73a4f8a79b665f1cf34138371cee34a7ed1a67603e16854554596775d4b311a2dff9405e900
6
+ metadata.gz: 1c1e021b6a988b19b89279e9e01402cfd0ad59a4f6b8e9b874553c21aef91b5ebca8dd780514f3e0fbe715edea07afdc486e5ccf792d00799e2604ef77590d2e
7
+ data.tar.gz: 9ac06114fab252695124859d4b2252e149beed93b05209e8f08e704cc7eb56353b83f3ad13ae874751dc57cd171ec47f4a6e2a3969e1bd2cf98244aca23aa88a
@@ -1,30 +1,14 @@
1
1
  require 'airbadger/version'
2
2
 
3
- require 'airbadger/warning_suppression'
4
- require 'airbadger/airbrake_loader'
5
- require 'airbadger/configuration'
3
+ require 'airbadger/proxying_error_collector'
6
4
 
7
- module Airbadger
8
- def self.configure(&block)
9
- configuration.instance_eval(&block)
10
- configuration.setup_proxy!
11
- end
12
-
13
- def self.method_missing(method_name, *args, &block)
14
- if PROXIED_METHODS.include? method_name
15
- configuration.loaded_endpoints.each do |endpoint|
16
- endpoint.send(method_name, *args, &block)
17
- end
18
- return nil
19
- end
20
- super
21
- end
22
-
23
- private
5
+ require 'airbrake'
6
+ require 'honeybadger'
24
7
 
25
- PROXIED_METHODS = [:notify, :notify_or_ignore]
8
+ module Airbadger
9
+ ERROR_COLLECTORS = [Airbrake, Honeybadger]
26
10
 
27
- def self.configuration
28
- @configuration ||= Configuration.new
11
+ ERROR_COLLECTORS.each do |error_collector|
12
+ error_collector.extend(ProxyingErrorCollector)
29
13
  end
30
14
  end
@@ -0,0 +1,18 @@
1
+ module Airbadger::ProxyingErrorCollector
2
+ PROXY_METHODS = [:notify, :notify_or_ignore]
3
+
4
+ def self.extend_object(error_collector)
5
+ class << error_collector
6
+ Airbadger::ProxyingErrorCollector::PROXY_METHODS.each do |method_name|
7
+ define_method "#{method_name}_with_proxy" do |*args|
8
+ Airbadger::ERROR_COLLECTORS.each do |proxied_collector|
9
+ proxied_collector.send("#{method_name}_without_proxy", *args)
10
+ end
11
+ end
12
+
13
+ alias_method "#{method_name}_without_proxy", method_name
14
+ alias_method method_name, "#{method_name}_with_proxy"
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,3 +1,3 @@
1
1
  module Airbadger
2
- VERSION = '0.0.4'
2
+ VERSION = '0.1.0'
3
3
  end
@@ -1,63 +1,26 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Airbadger do
4
- ['#notify', '#notify_or_ignore'].each do |proxied_method|
5
- describe proxied_method do
6
- it 'proxies calls to all configured modules' do
7
- proxied_method.sub!('#', '')
8
-
9
- Airbadger.configure do
10
- endpoint :raygun do |config|
11
- config.test_mode = true
12
- end
13
- endpoint :errbit do |config|
3
+ [Airbrake, Honeybadger].each do |error_api|
4
+ describe error_api do
5
+ ['#notify', '#notify_or_ignore'].each do |proxied_method|
6
+ describe proxied_method do
7
+ before :all do
8
+ Airbrake.configure do |config|
14
9
  config.test_mode = true
15
10
  end
16
11
  end
17
12
 
18
- error = Exception.new('Some serious shit went down')
13
+ it 'proxies calls to Airbrake and Honeybadger' do
14
+ proxied_method.sub!('#', '')
19
15
 
20
- Raygun.should_receive(proxied_method).with(error)
21
- Errbit.should_receive(proxied_method).with(error)
22
-
23
- Airbadger.send(proxied_method, error)
24
- end
25
- end
26
- end
16
+ error = Exception.new('Some serious shit went down')
27
17
 
28
- it 'proxies calls to Airbrake to all loaded modules' do
29
- Airbadger.configure do
30
- endpoint :raygun do |config|
31
- config.test_mode = true
32
- end
33
- endpoint :airbrake do |config|
34
- config.test_mode = true
35
- end
36
- end
18
+ Airbrake.should_receive("#{proxied_method}_without_proxy").with(error)
19
+ Honeybadger.should_receive("#{proxied_method}_without_proxy").with(error)
37
20
 
38
- error = Exception.new('Some serious shit went down')
39
-
40
- Raygun.should_receive(:notify).with(error)
41
- AirbrakeProxied.should_receive(:notify).with(error)
42
-
43
- Airbrake.notify(error)
44
- end
45
-
46
- it 'proxies calls to Honeybadger' do
47
- Airbadger.configure do
48
- endpoint :raygun do |config|
49
- config.test_mode = true
50
- end
51
- endpoint :honeybadger do |config|
52
- config.ignore_only = []
21
+ error_api.send(proxied_method, error)
22
+ end
53
23
  end
54
24
  end
55
-
56
- error = Exception.new('Some serious shit went down')
57
-
58
- Raygun.should_receive(:notify).with(error)
59
- Honeybadger.should_receive(:notify).with(error)
60
-
61
- Airbadger.notify(error)
62
25
  end
63
26
  end
@@ -13,28 +13,10 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
13
13
  $LOAD_PATH.unshift(File.dirname(__FILE__))
14
14
  require 'airbadger'
15
15
 
16
- EXAMPLE_SERVICE_NAMES = [
17
- 'Airbrake',
18
- 'AirbrakeProxied',
19
- 'BasicAirbrake',
20
- 'Errbit',
21
- 'Raygun'
22
- ]
23
-
24
16
  RSpec.configure do |config|
25
17
  # Run specs in random order to surface order dependencies. If you find an
26
18
  # order dependency and want to debug it, you can fix the order by providing
27
19
  # the seed, which is printed after each run.
28
20
  # --seed 1234
29
21
  config.order = 'random'
30
-
31
- config.before :each do
32
- EXAMPLE_SERVICE_NAMES.each do |service_name|
33
- Object.send(:remove_const, service_name) if Object.const_defined?(service_name)
34
- end
35
- end
36
-
37
- config.before :each do
38
- Airbadger.instance_variable_set('@configuration', nil)
39
- end
40
22
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: airbadger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Jordan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-07 00:00:00.000000000 Z
11
+ date: 2013-10-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: airbrake
@@ -112,15 +112,10 @@ files:
112
112
  - Rakefile
113
113
  - airbadger.gemspec
114
114
  - lib/airbadger.rb
115
- - lib/airbadger/airbrake_loader.rb
116
- - lib/airbadger/configuration.rb
115
+ - lib/airbadger/proxying_error_collector.rb
117
116
  - lib/airbadger/version.rb
118
- - lib/airbadger/warning_suppression.rb
119
117
  - spec/airbadger_spec.rb
120
- - spec/airbrake_loader_spec.rb
121
- - spec/configuration_spec.rb
122
118
  - spec/spec_helper.rb
123
- - spec/warning_suppression_spec.rb
124
119
  homepage: http://github.com/joshjordan/airbadger
125
120
  licenses:
126
121
  - MIT
@@ -147,7 +142,4 @@ specification_version: 4
147
142
  summary: Reports errors to multiple Airbrake-compatible endpoints
148
143
  test_files:
149
144
  - spec/airbadger_spec.rb
150
- - spec/airbrake_loader_spec.rb
151
- - spec/configuration_spec.rb
152
145
  - spec/spec_helper.rb
153
- - spec/warning_suppression_spec.rb
@@ -1,52 +0,0 @@
1
- class Airbadger::AirbrakeLoader
2
- def self.load_as(airbrake_alias)
3
- new(airbrake_alias).load_aliased
4
- end
5
-
6
- def load_aliased
7
- without_recording_loaded_features do
8
- load_airbrake!
9
- load_airbrake_rails! if defined?(::Rails)
10
- end
11
- aliased_module.tap do
12
- preserve_namespaced_calls!
13
- remove_airbrake_from_global_namespace!
14
- end
15
- end
16
-
17
- private
18
-
19
- attr_reader :endpoint_alias
20
-
21
- def initialize(endpoint_alias)
22
- @endpoint_alias = endpoint_alias.sub(/^Airbrake$/, 'AirbrakeProxied')
23
- end
24
-
25
- def load_airbrake!
26
- require 'airbrake'
27
- end
28
-
29
- def load_airbrake_rails!
30
- require 'airbrake/rails/controller_methods'
31
- require 'airbrake/rails/javascript_notifier'
32
- end
33
-
34
- def aliased_module
35
- @aliased_module ||= Object.const_set(endpoint_alias, Airbrake)
36
- end
37
-
38
- def preserve_namespaced_calls!
39
- aliased_module.const_set('Airbrake', aliased_module)
40
- end
41
-
42
- def remove_airbrake_from_global_namespace!
43
- Object.send(:remove_const, 'Airbrake')
44
- end
45
-
46
- def without_recording_loaded_features
47
- feature_count = $LOADED_FEATURES.count
48
- yield
49
- ensure
50
- $LOADED_FEATURES.pop while feature_count < $LOADED_FEATURES.count
51
- end
52
- end
@@ -1,35 +0,0 @@
1
- class Airbadger::Configuration
2
- include Airbadger::WarningSuppression
3
-
4
- def endpoint(service_name, &block)
5
- load_endpoint(service_name).configure(&block)
6
- end
7
-
8
- def setup_proxy!
9
- Object.const_set('Airbrake', Airbadger)
10
- end
11
-
12
- def loaded_endpoints
13
- @loaded_modules ||= []
14
- end
15
-
16
- private
17
-
18
- ENDPOINT_LOADERS = Hash.new(::Airbadger::AirbrakeLoader.method(:load_as)).merge({
19
- 'Honeybadger' => Proc.new do
20
- require 'honeybadger'
21
- Honeybadger
22
- end
23
- })
24
-
25
- def load_endpoint(service_name)
26
- service_name = ghetto_classify(service_name)
27
- without_warnings do
28
- ENDPOINT_LOADERS[service_name].call(service_name)
29
- end.tap(&loaded_endpoints.method(:push))
30
- end
31
-
32
- def ghetto_classify(snake_cased)
33
- snake_cased.to_s.split('_').collect{ |str| str[0] = str[0].upcase; str }.join
34
- end
35
- end
@@ -1,9 +0,0 @@
1
- module Airbadger::WarningSuppression
2
- def without_warnings
3
- #TODO: a better approach would be to log this to an Airbadger logger
4
- old_verbose, $VERBOSE = $VERBOSE, nil
5
- yield
6
- ensure
7
- $VERBOSE = old_verbose
8
- end
9
- end
@@ -1,49 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Airbadger::AirbrakeLoader do
4
- include Airbadger::WarningSuppression
5
-
6
- describe '.load_as' do
7
- it 'loads a new Airbrake singleton with the given name' do
8
- without_warnings do
9
- described_class.load_as('Errbit')
10
- described_class.load_as('Raygun')
11
- end
12
-
13
- Errbit.should respond_to :notify
14
- Raygun.should respond_to :notify
15
- Errbit.should_not eq Raygun
16
- end
17
-
18
- it 'produces endpoints singletons capable of receiving error data' do
19
- without_warnings do
20
- described_class.load_as('Errbit')
21
- end
22
- Errbit.configure do |config|
23
- config.test_mode = true
24
- end
25
-
26
- now = DateTime.now.to_s
27
- Errbit.notify(Exception.new(now))
28
-
29
- Errbit.sender.last_notice.should include(now)
30
- end
31
-
32
- it 'eager-loads Rails extensions when Rails is running' do
33
- Rails = Module.new
34
- without_warnings { described_class.load_as('Errbit') }
35
-
36
- defined?(Errbit::Rails::ControllerMethods).should be_true
37
- defined?(Errbit::Rails::JavascriptNotifier).should be_true
38
-
39
- Object.send(:remove_const, 'Rails')
40
- end
41
-
42
- it 'does not load Rails extensions when Rails is not running' do
43
- without_warnings { described_class.load_as('Errbit') }
44
-
45
- defined?(Errbit::Rails::ControllerMethods).should be_false
46
- defined?(Errbit::Rails::JavascriptNotifier).should be_false
47
- end
48
- end
49
- end
@@ -1,46 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Airbadger::Configuration do
4
- describe '#endpoint' do
5
- it 'proxies the configuration block to a named Airbrake singleton' do
6
- subject.endpoint :BasicAirbrake do |config|
7
- config.test_mode = true
8
- end
9
-
10
- subject.endpoint :Errbit do |config|
11
- config.test_mode = true
12
- config.host = 'errbit.example.com'
13
- end
14
-
15
- BasicAirbrake.configuration.host.should eq 'api.airbrake.io'
16
- Errbit.configuration.host.should eq 'errbit.example.com'
17
- end
18
-
19
- it 'accepts snake-cased service names and produces constants with proper class names' do
20
- subject.endpoint :basic_airbrake do |config|
21
- config.test_mode = true
22
- end
23
-
24
- defined?(BasicAirbrake).should be_true
25
- end
26
-
27
- it 'rewrites the name "Airbrake" to "AirbrakeProxied" to avoid collisions' do
28
- subject.endpoint :airbrake do |config|
29
- config.test_mode = true
30
- end
31
-
32
- defined?(Airbrake).should be_false
33
- defined?(AirbrakeProxied).should be_true
34
- end
35
-
36
- it 'supports Honeybadger configuration from the Honeybadger gem rather than the Airbrake gem' do
37
- Airbadger::AirbrakeLoader.should_receive(:load_as).never
38
-
39
- subject.endpoint :honeybadger do |config|
40
- config.ignore_only = []
41
- end
42
-
43
- defined?(Honeybadger).should be_true
44
- end
45
- end
46
- end
@@ -1,39 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Airbadger::WarningSuppression do
4
- include Airbadger::WarningSuppression
5
-
6
- describe '#without_warnings' do
7
- before :each do
8
- @old_version = Airbadger::VERSION
9
- end
10
-
11
- let! :error_stream do
12
- $stderr = StringIO.new
13
- end
14
-
15
- it 'executes the block and does not emit warnings into the stderr stream' do
16
- without_warnings do
17
- Airbadger::VERSION = 42
18
- end
19
-
20
- Airbadger::VERSION.should eq 42
21
- error_stream.string.should be_empty
22
- end
23
-
24
- it 'resumes emitting warnings into the stderr stream after the block' do
25
- without_warnings do
26
- Airbadger::VERSION = 42
27
- end
28
-
29
- Airbadger::VERSION = 43
30
-
31
- error_stream.string.should_not be_empty
32
- end
33
-
34
- after :each do
35
- Airbadger::VERSION = @old_version
36
- $stderr = STDERR
37
- end
38
- end
39
- end