mLewisLogic/saddle

View on GitHub
README.md

Summary

Maintainability
Test Coverage
# saddle

Giddyup nerd! Wrangle your SOA.

Saddle makes writing service clients as easy as giving high fives. :hand:

It's a full-featured, generic consumer layer for you to build API client implementations with.


## about

Ok, I love high fives, but what does Saddle do for me?

Saddle is a framework that makes it exceptionally easy to write HTTP API clients. It abstracts away a lot of the repetitive work and lets you focus on your business logic. It also provides a simple middleware interface that makes it easy to extend functionality.

Saddle enables you to create beautifully stable and functionaly API clients, in the fewest lines of code possible.


## features

### client
* Specifying default connection settings for your client makes usage simple
* Automatic call tree construction, based upon module/class namespace
* Easily integrate with logging systems (currently supports statsd & Airbrake)
* Support simple testing of your client

### requests
* Post urlencoded or JSON (handles multipart file posts as well)
* Auto-parse JSON responses
* Strictly enforce request timeouts (client-wide or endpoint specific timeouts)

### error handling
* Automatic retries with exponential backoff
* Turns 4xx and 5xx responses into exceptions
* If desired, silently return default values upon exception


## guide

### concrete example
[saddle-example](https://github.com/mLewisLogic/saddle-example)

### client construction
0. For the sake of cleanliness, pick a namespace that everything related to your client should live in. For this example, we'll use __SaddleExample__.
1. Inherit your client class, __SaddleExample::Client__, from __Saddle::Client__.
2. Create an _endpoints_ directory at the same level as your client class file.
3. Create endpoint classes in the _endpoints_ directory that inherit from __Saddle::TraversalEndpoint__ and are under the __SaddleExample::Endpoints__ namespace module.
    1. Give these endpoints methods that call `get` or `post` to perform the actual request
    2. Their module/class namespace determines how they are accessed in the client's call tree. For example, the `get_all` in __SaddleExample::Endpoints::Fish::Guppy__ would be accessed by:

            client.fish.guppy.get_all

    3. If you need REST style endpoints like `client.kitten.by_id('Whiskers').info` then check out __Saddle::ResourceEndpoint__ and how it's used in [saddle-example](https://github.com/mLewisLogic/saddle-example/blob/master/lib/saddle-example/endpoints/kitten.rb)

4. Initialize an instance of your client. ex:

        saddle_example_client = SaddleExample::Client.create



## todo
* xml posting/parsing


## version notes

* Saddle versions 0.2.x supports Ruby 3.x, drops support for 2.6
* Saddle versions 0.1.x are compatible with Faraday versions ~> 0.9.0
* Saddle versions 0.0.x are compatible with Faraday versions ~> 0.8.7

## Appraisal Usage

Appraisal is a gem that allows us to test our library against different versions of dependencies in repeatable scenarios called "appraisals". For more information see
the [Appraisal repository](https://github.com/thoughtbot/appraisal)

First make sure appraisal is installed by running

```
$ bundle install
```

To update the Appraisal's gemfiles run

```
$ bundle exec appraisal generate
```

To test against a specific version of `activesupport` first install the dependencies, ideally we would want to install them by running
```
$ bundle exec appraisal install
```

However, this isn't posible fot the different constraints these versions have. So instead install the dependencies for the desired version we want to test against by running

```
$ BUNDLE_GEMFILE=gemfiles/activesupport_6.0.gemfiles bundle install
```

In this example we want to install the dependencies of `activesupport` version `6.0`. Then to run `rspec` with that constraints we run

```
$ BUNDLE_GEMFILE=gemfiles/activesupport_6.0.gemfiles bundle exec rspec
```

## Code Status

* [![Code Climate](https://codeclimate.com/github/mLewisLogic/saddle.png)](https://codeclimate.com/github/mLewisLogic/saddle)


## License

Saddle is released under the [MIT License](http://www.opensource.org/licenses/MIT).