Api Wrappers for Ruby
Switch branches/tags
Clone or download

README.md

Dialers

Dialers is a gem that allows to easily create wrappers over external HTTP apis using Faraday.

Installation

Add this line to your Gemfile:

gem "dialers"

And then execute:

$ bundle

Additionally, if you want to use a Faraday adapter different from the default one (net_http, based on the built-in ruby library), you have to install the gem for that. For example, to use patron you have to add gem "patron" to your Gemfile. For simplicity, this readme will use the default net_http adapter.

Usage

We will use the Github API public part as a example. First, you need at least two classes: one to keep your api methods and another one to keep the api connection configuration. Let's start with this:

module Github
  class Api < Dialers::ApiWrapper
  end

  class ApiCaller < Dialers::Caller
  end
end

Now, let's configure our github api. It's important to note that this configuration is the same that Faraday uses (indeed, it's passed to Faraday as it is):

module Github
  class ApiCaller < Dialers::Caller
    TIMEOUT_IN_SECONDS = 5
    GITHUB_API_URL = "https://api.github.com"

    setup_api(url: GITHUB_API_URL) do |faraday|
      faraday.request :json
      faraday.request :request_headers, accept: "application/vnd.github.v3+json"
      faraday.response :json
      faraday.adapter :net_http
      faraday.options.timeout = TIMEOUT_IN_SECONDS
      faraday.options.open_timeout = TIMEOUT_IN_SECONDS
    end
  end
end

If you want to know more about how to configure Faraday to some different and more complex use cases, please check the examples directory. Now that the configuration is over, let's plug the caller into the wrapper to be able to create some methods.

module Github
  class Api < Dialers::ApiWrapper
    api_caller { Github::ApiCaller }

    def user_repos(username)
      api_caller.get("users/#{username}/repos").as_received
    end
  end
end

Let's try this:

github = Github::Api.new
github.user_repos("rails")
# => [ { ... }] # An enormous array of hashes

Now, this sucks for us because we don't have any kind of schema nor classes here. Let's add something to organize this response:

module Github
  class Repository
    attr_accessor :id, :name, :description, :language
  end

  class Api < Dialers::ApiWrapper
    api_caller { Github::ApiCaller }

    def user_repos(username)
      api_caller.get("users/#{username}/repos").transform_to_many(Github::Repository)
    end
  end
end

Using transform_to_many we mapped the response body to many Github::Repository objects. Let's try now:

github = Github::Api.new
repositories = github.user_repos("rails")
repositories.first.name # maybe Rails

You can use post, put, patch, options, get and head on the callers. You can use transform_to_one to make just one object and you can pass a hash to decide which object to instantiate depending on the response's status. For more info, you can check out the caller's documentation.

Some Rails Nice Things

NOTE: This a thing we want to make. It's not done yet but we want it to be this way

In Rails, you can use the next command to generate a dialer wrapper:

$ rails g dialers:api anexternalservice

This will generate the following structure:

dialers/
  anexternalservice/
    api.rb
    api_caller.rb

Everything else is the same. This is just a proposal for a organization friendly to Rails. But, if you want, you can use any class organization you want.

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake false to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.

To run the examples in the examples directory you have to setup some environment variables as defined in .rbenv-vars-example and run the examples like this:

$ ruby -Ilib examples/github/usage.rb

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/platanus/dialers.

License

The gem is available as open source under the terms of the MIT License.