jellymann/someapi

View on GitHub
README.md

Summary

Maintainability
Test Coverage
# SomeAPI
[![Build Status](https://travis-ci.org/jellymann/someapi.svg?branch=master)](https://travis-ci.org/jellymann/someapi)
[![Code Climate](https://codeclimate.com/github/jellymann/someapi.png)](https://codeclimate.com/github/jellymann/someapi)

Built around HTTParty, SomeAPI provides a generic wrapper for your favourite RESTful WebAPI. Simply extend Some::API and apply your usual HTTParty options like base_uri, then call your new API and party harder!

## Get Some

Add this line to your application's Gemfile:

    gem 'someapi'

And then execute:

    $ bundle

Or install it yourself as:

    $ gem install someapi

## Party harder

It's easier than 123!

  1. Create your wrapper:

        class Github < Some::API
          base_uri 'https://api.github.com'
          headers 'User-Agent' => 'p45-dashboard'
          default_params 'client_id' => ENV['GITHUB_CLIENT_ID'],
            'client_secret' => ENV['GITHUB_CLIENT_SECRET']
          format :json
        end

  2. Start using it! Simply string method calls and subscripts together like it's a real API wrapper. Add a bang (`!`) at the end to initiate the HTTP request, returning an HTTParty response, so all your favourite HTTParty features are still intact. Party on!

        github = Guthub.new
        ...
        github.get.users[@username].repos!
        github.post.repos[@username][@repo].pulls! body: { title: "Foo", body: "Pull my Foo", ... }
        github.delete.repos.[@username][@repo].!

## Make a mockery of your tests

Don't stub your toe on external services!

  1. Add `gem 'webmock'` to your Gemfile under the test group

  2. Add the following somewhere in your testing framework's configuration (like `spec_helper.rb`)

        Some::API.include WebMock::API

     NOTE: If you're using Ruby version before 2.1.x, then you'll have to include WebMock like this:

        Some::API.send :include, WebMock::API

  3. Adding `stub` before the HTTP method in a SomeAPI request will instead return a Webmock stub after the bang.

        github = Github.new
        ...
        github.stub.get.users[@username].repos!.
          to_return status: 200, body: @somehash.to_json

Stubs look exactly the same as their corresponding requests except for the presence of `stub`, so you can literally copy-pasta from your controllers to your specs and vice-versa without fiddling.

## Tips and Gotchas

If your request ends in a `[whatever]` remember to put a dot before the bang, as in the examples. Ruby doesn't define the (very odd and mostly useless actually) operator for `[]!`.

Posting hashes can be done more succinctly by using the `<<` operator, as follows (using the post example from above):

    github.post.repos[@username][@repo].pulls << { title: "Foo", body: "Pull my Foo", ... }

CAUTION: Every time you do the following (ie. put the bang at the beginning of a request):

    !github.get.users[@some_user]

a baby seal/platypus/kitten will die a horrific death. Also, it looks really bad and will confuse the crap out of you and your peers.

## Thank you for helping us help you help us all

1. Fork it ( https://github.com/[my-github-username]/someapi/fork )
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create a new Pull Request