Navigation Menu

Skip to content

Commit

Permalink
add Configuration#middlewares to customize middleware stack
Browse files Browse the repository at this point in the history
  • Loading branch information
Roman Gusev committed Nov 2, 2013
1 parent 719efb7 commit b096a8b
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 12 deletions.
11 changes: 1 addition & 10 deletions lib/airbrake-api/client.rb
@@ -1,9 +1,5 @@
require 'faraday_middleware'
require 'parallel'
require 'airbrake-api/core_ext/hash'
require 'airbrake-api/middleware/scrub_response'
require 'airbrake-api/middleware/raise_server_error'
require 'airbrake-api/middleware/raise_response_error'

module AirbrakeAPI
class Client
Expand Down Expand Up @@ -171,12 +167,7 @@ def connection(options={})
:url => account_path,
}
@connection ||= Faraday.new(default_options.deep_merge(connection_options)) do |builder|
builder.use Faraday::Request::UrlEncoded
builder.use AirbrakeAPI::Middleware::RaiseResponseError
builder.use FaradayMiddleware::Mashify
builder.use FaradayMiddleware::ParseXml
builder.use AirbrakeAPI::Middleware::ScrubResponse
builder.use AirbrakeAPI::Middleware::RaiseServerError
middleware.each { |mw| builder.use *mw }

builder.adapter adapter
end
Expand Down
16 changes: 15 additions & 1 deletion lib/airbrake-api/configuration.rb
@@ -1,4 +1,8 @@
require 'airbrake-api/version'
require 'faraday_middleware'
require 'airbrake-api/middleware/scrub_response'
require 'airbrake-api/middleware/raise_server_error'
require 'airbrake-api/middleware/raise_response_error'

module AirbrakeAPI
module Configuration
Expand All @@ -8,13 +12,21 @@ module Configuration
:secure,
:connection_options,
:adapter,
:user_agent]
:user_agent,
:middleware]

attr_accessor *VALID_OPTIONS_KEYS

DEFAULT_ADAPTER = :net_http
DEFAULT_USER_AGENT = "AirbrakeAPI Ruby Gem #{AirbrakeAPI::VERSION}"
DEFAULT_CONNECTION_OPTIONS = {}
DEFAULT_MIDDLEWARE = [
Faraday::Request::UrlEncoded,
AirbrakeAPI::Middleware::RaiseResponseError,
FaradayMiddleware::Mashify,
FaradayMiddleware::ParseXml,
AirbrakeAPI::Middleware::ScrubResponse,
AirbrakeAPI::Middleware::RaiseServerError]

def self.extended(base)
base.reset
Expand All @@ -24,6 +36,7 @@ def configure(options={})
@account = options[:account] if options.has_key?(:account)
@auth_token = options[:auth_token] if options.has_key?(:auth_token)
@secure = options[:secure] if options.has_key?(:secure)
@middleware = options[:middleware] if options.has_key?(:middleware)
yield self if block_given?
self
end
Expand All @@ -49,6 +62,7 @@ def reset
@adapter = DEFAULT_ADAPTER
@user_agent = DEFAULT_USER_AGENT
@connection_options = DEFAULT_CONNECTION_OPTIONS
@middleware = DEFAULT_MIDDLEWARE
end

end
Expand Down
26 changes: 25 additions & 1 deletion spec/airbrake_api/client_spec.rb
Expand Up @@ -35,7 +35,8 @@
:secure => true,
:connection_options => {},
:adapter => :em_http,
:user_agent => 'Airbrake API Tests'
:user_agent => 'Airbrake API Tests',
:middleware => AirbrakeAPI::Configuration::DEFAULT_MIDDLEWARE
}
end

Expand All @@ -61,6 +62,29 @@
end
end
end

context 'with customized middleware' do
let(:logdev) { StringIO.new }
# Client#connection is a private method.
# Adding logger middleware component with an argument it should receive
# when a connection is initialized
let(:logger_middleware) { [Faraday::Response::Logger, Logger.new(logdev)] }
let(:options) do
{
:account => 'myapp', :auth_token => 'abcdefg123456', :secure => false,
:middleware => AirbrakeAPI::Configuration::DEFAULT_MIDDLEWARE + [logger_middleware]
}
end
let(:api) { AirbrakeAPI::Client.new(options) }

# request something to initialize @connection with middleware
before { api.projects }

it 'splats array to initialize middleware with arguments' do
# check that the logger added above did receive the argument
expect(logdev.string).to include(api.projects_path)
end
end
end

describe 'api requests'do
Expand Down

0 comments on commit b096a8b

Please sign in to comment.