lib/her/api.rb in her-0.1.7 vs lib/her/api.rb in her-0.1.8

- old
+ new

@@ -1,63 +1,68 @@ module Her # This class is where all HTTP requests are made. Before using Her, you must configure it # so it knows where to make those requests. In Rails, this is usually done in `config/initializers/her.rb`: - # - # @example - # $my_api = Her::API.new - # $my_api.setup :base_uri => "https://api.example.com" class API # @private attr_reader :base_uri, :middleware - # Setup a default API connection + # Setup a default API connection. Accepted arguments and options are the same as {API#setup}. def self.setup(attrs={}) # {{{ @@default_api = new @@default_api.setup(attrs) end # }}} - # @private - def self.default_api(attrs={}) # {{{ - defined?(@@default_api) ? @@default_api : nil - end # }}} - - # @private - def self.default_middleware # {{{ - [Faraday::Request::UrlEncoded, Faraday::Adapter::NetHttp] - end # }}} - - # Setup the API connection + # Setup the API connection. # - # @example - # module MyAPI - # class ParseResponse - # def on_complete(env) - # json = JSON.parse(env[:body], :symbolize_names => true) - # { - # :data => json, - # :errors => json[:errors] || [], - # :metadata => json[:metadata] || {}, - # } - # end + # @param [Hash] attrs the options to create a message with + # @option attrs [String] :base_uri The main HTTP API root (eg. `https://api.example.com`) + # @option attrs [Array, Class] :middleware A list of the only middleware Her will use + # @option attrs [Array, Class] :add_middleware A list of middleware to add to Her’s default middleware + # @option attrs [Class] :parse_middleware A middleware that will replace {Her::Middleware::DefaultParseJSON} to parse the received JSON + # + # @example Setting up the default API connection + # Her::API.setup :base_uri => "https://api.example" + # + # @example A custom middleware added to the default list + # class MyAuthentication < Faraday::Middleware + # def call(env) + # env[:request_headers]["X-API-Token"] = "bb2b2dd75413d32c1ac421d39e95b978d1819ff611f68fc2fdd5c8b9c7331192" + # @all.call(env) # end # end - # Her::API.setup :base_url => "https://api.example.com", :middleware => [MyAPI::ParseResponse, Faraday::Request::UrlEncoded, Faraday::Adapter::NetHttp] + # Her::API.setup :base_uri => "https://api.example.com", :add_middleware => [MyAuthentication] + # + # @example A custom parse middleware + # class MyCustomParser < Faraday::Response::Middleware + # def on_complete(env) + # json = JSON.parse(env[:body], :symbolize_names => true) + # errors = json.delete(:errors) || [] + # metadata = json.delete(:metadata) || [] + # env[:body] = { :data => json, :errors => errors, :metadata => metadata } + # end + # end + # Her::API.setup :base_uri => "https://api.example.com", :parse_middleware => MyCustomParser def setup(attrs={}) # {{{ @base_uri = attrs[:base_uri] - middleware = @middleware = attrs[:middleware] || [Her::Middleware::DefaultParseJSON] + Her::API.default_middleware + @middleware = Her::API.default_middleware + + @middleware = [attrs[:middleware]] if attrs[:middleware] + @middleware = [attrs[:add_middleware]] + @middleware if attrs[:add_middleware] + @middleware = [attrs[:parse_middleware]] + @middleware.reject { |item| item == Her::Middleware::DefaultParseJSON } if attrs[:parse_middleware] + + @middleware.flatten! + middleware = @middleware @connection = Faraday.new(:url => @base_uri) do |builder| middleware.each { |m| builder.use(m) } end end # }}} # Define a custom parsing procedure. The procedure is passed the response object and is # expected to return a hash with three keys: a main data Hash, an errors Array # and a metadata Hash. # - # @example - - # Make an HTTP request to the API + # @private def request(attrs={}) # {{{ method = attrs.delete(:_method) path = attrs.delete(:_path) response = @connection.send method do |request| if method == :get @@ -68,8 +73,19 @@ request.url path request.body = attrs end end response.env[:body] + end # }}} + + private + # @private + def self.default_api(attrs={}) # {{{ + defined?(@@default_api) ? @@default_api : nil + end # }}} + + # @private + def self.default_middleware # {{{ + [Her::Middleware::DefaultParseJSON, Faraday::Request::UrlEncoded, Faraday::Adapter::NetHttp] end # }}} end end