An open API service indexing awesome lists of open source software.

https://github.com/carwow/restful_resource

Simple and reliable ruby gem to retrieve structured Ruby objects out of JSON APIs
https://github.com/carwow/restful_resource

api-client caching rails validations

Last synced: 6 months ago
JSON representation

Simple and reliable ruby gem to retrieve structured Ruby objects out of JSON APIs

Awesome Lists containing this project

README

          

# RestfulResource ![build status](https://circleci.com/gh/carwow/restful_resource.svg?style=shield&circle-token=0558310359000e8786d1fe42774b0e30b2b0e12c) [![Maintainability](https://api.codeclimate.com/v1/badges/61c85db718d559aa97c5/maintainability)](https://codeclimate.com/github/carwow/restful_resource/maintainability)

Provides an ActiveResource like interface to JSON API's

## Caching

Caching using [faraday-http-cache](https://github.com/plataformatec/faraday-http-cache)

Enabled by passing an initialsed cache object (eg Rails.cache)

```
RestfulResource::Base.configure(
base_url: "http://my.api.com/",
cache_store: Rails.cache
)
```

### Bypassing the cache

To make requests that bypass the local HTTP cache use the `no_cache: true` option eg:

```
Object.find(1, no_cache: true)
```

## Metrics

### HTTP Metrics

Http requests are automatically instrumented using ActiveSupport::Notifications

A Metrics class can be provided that RestfulResource will use to emit metrics. This class needs to respond to `count, sample, measure` methods.

eg

```
RestfulResource::Base.configure(
base_url: "http://my.api.com/",
instrumentation: {
metric_class: Metrics, # Required
app_name: 'rails_site', # Required
api_name: 'api' # Optional, defaults to 'api'
}
)
```

Where the `Metrics` class has in interface like:

```
class Metrics
module_function

def count(name, i)
end

def sample(name, i)
end

def measure(name, i)
end
end
```

This will call the methods on the Metrics class with:
```
Metrics.measure('rails_site.api.time', 215.161237) # Time taken
Metrics.sample('rails_site.api.status', 200) # HTTP status code
Metrics.count('rails_site.api.called, 1)
```

Note: To customize the names we can specify `:app_name` and `:api_name` options to `RestfulResource::Base.configure`

### HTTP Cache Metrics

Enable Http caching:

```
RestfulResource::Base.configure(
base_url: "http://my.api.com/",
cache_store: Rails.cache,
instrumentation: {
metric_class: Metrics,
app_name: 'rails_site',
api_name: 'api'
}
)
```

This will call the methods on the Metrics class with:
```
Metrics.sample('rails_site.api.cache_hit', 1) # When a request is served from the cache
Metrics.sample('rails_site.api.cache_miss', 1) # When a request is fetched from the remote API
Metrics.sample('rails_site.api.cache_bypass', 1) # When a request did not go through the cache at all
```

## Contributing

1. Fork it
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 new Pull Request

## Releasing new version

1. Amend the `version.rb` to your desired version on your Pull Request & get it merged
2. Pull latest `main` & create a matching tag e.g.: `git tag -a v2.15.0 -m "Bump Faraday to a minimum 1.10"`
3. Push the tag e.g.: ` git push origin v2.15.0`
4. Run `bundle exec rake release`
- You'll need to authenticate with RubyGems, the credentials are in [Bitwarden](https://vault.bitwarden.com/#/vault?search=ruby&itemId=54601528-29be-494f-ba3c-aa3300d5dd18)

## Planned Features

### Core
- Test that has_many and has_one pick correct class for children (if defined)
- Make base_url resilient when missing trailing slash
- Implement http authentication

### Active record style validation

### Constraints(mandatory fields)