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!
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
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!
Add
gem 'webmock'
to your Gemfile under the test groupAdd 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
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
- Fork it ( https://github.com/[my-github-username]/someapi/fork )
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create a new Pull Request