markbates/faraday_bang

View on GitHub
lib/faraday_bang/bang.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Faraday::Bang
  ERROR_CODES = [(400..417).to_a, (500..505).to_a].flatten
  SUPPORTED_HTTP_METHODS = Faraday::Connection::METHODS - [ :options ]

  SUPPORTED_HTTP_METHODS.each do |verb|
    define_method("#{verb}!") do |*args, &block|
      response = self.send(verb, *args, &block)
      handle_response(response)
    end
  end

  def options!(*args, &block)
    url, body, headers = args
    response = run_request(:options, url, body, headers, &block)
    handle_response(response)
  end

  private
  def handle_response(response)
    if response.status >= 400
      err_name = "Response#{response.status}Error"
      if Faraday::Bang.const_defined?(err_name)
        klass = Faraday::Bang.const_get(err_name)
        raise klass.new(response)
      else
        raise Faraday::Bang::ResponseError.new(response)
      end
    end
    response
  end
end

Faraday.extend(Faraday::Bang)
Faraday::Connection.send(:include, Faraday::Bang)