Gaveteiro/intelipost-rb

View on GitHub
lib/intelipost/client.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'intelipost/mash'

module Intelipost
  class Client
    HOST        = 'api.intelipost.com.br'
    SERVICE     = 'api/'
    API_VERSION = 'v1'
    attr_reader :uri, :options, :connection, :api_key, :platform

    def initialize(options)
      @options = { ssl: true }
      @options.merge! options
      uri = @options[:ssl] ? 'https://' : 'http://'
      uri.concat HOST

      @uri = URI.join uri, SERVICE, API_VERSION
      @api_key = @options[:api_key]
      @platform = @options[:platform]

      @connection = connection
    end

    def connection
      raise ArgumentError, 'an api_key is required to connect' if api_key.nil?

      Faraday.new(url: @uri.to_s) do |conn|
        conn.request :json

        conn.response :mashify, { mash_class: Intelipost::Mash }
        conn.response :json

        conn.headers["api_key"] = api_key
        conn.headers["platform"] = platform unless platform.nil?
        conn.adapter :net_http
        conn.use :gzip
        conn.proxy @options[:proxy]
      end
    end

    def get(endpoint, args={})
      connection.get(endpoint, args).body
    end

    def post(endpoint, args = {})
      connection.post(endpoint, args).body
    end

    def method_missing(method, *args, &block)
      method = camelize method
      if Intelipost.const_defined? method
        return Intelipost.const_get(method).new self
      else
        super
      end
    end

    def camelize(term)
      string = term.to_s
      string = string.sub(/^[a-z\d]*/) { $&.capitalize }
      string.gsub!(/(?:_|(\/))([a-z\d]*)/i) { "#{$1}#{$2.capitalize}" }
      string.gsub!("/", "::")
      string
    end
  end
end