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 group -
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
-
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