README.md in radriar-0.1.0.alpha.2 vs README.md in radriar-0.1.0.alpha.3

- old
+ new

@@ -6,28 +6,146 @@ Add this line to your application's Gemfile: gem 'radriar' -And then execute: +## Conventions and included components - $ bundle +* API based on [Grape](https://github.com/intridea/grape) +* Model representation with [representable](https://github.com/apotonick/representable) +* Use of the `represent` and `represent_each` helpers inside the API, or a Grape formatter + _(coming soon)_. +* Hypermedia features are based on [HAL](http://stateless.co/hal_specification.html) and +require [Roar](https://github.com/apotonick/roar). -Or install it yourself as: +## Key Features - $ gem install radriar +__TODO__: Redact +* Key translation (Snake case to underscore and viceversa). +* Optional field includes (Pass `fields` parameter in URL). +* Conventional error responses. +* Optional inclusion/exclusion of hypermedia (HAL). + ## Usage -TODO: Write usage instructions here +Include the gem in your Gemfile: -## Features +```ruby +gem 'radriar' +``` +Then radriarize your API ;), aka invoke the `#radriarize` method with the specified +options from your API definition. + +``` ruby +class UserAPI < Grape::API + radriarize representer_namespace: 'MyApp::Representers', + hypermedia: true, + translate_keys: true +``` + +### Dynamic APIs + +Assuming you're using the right conventions (to be redacted) this will magically +turn your API from this: + +```javascript +{ + "id": "blackxored", + "first_name": "Adrian", + "last_name": "Perez", + "avatar_url": "...", + "hireable": false, + "registered_at": "...", + "social_urls": { + "github": "https://github.com/blackxored", + "twitter": "https://twitter.com/blackxored" + }, + "comments": [ /* ... */], +} +``` + +To this: + +```javascript +{ + "_links": { + "self": { + "href": "/users/blackxored" + }, + "html": { + "href": "/#/u/blackxored" + }, + "timeline": { + "href": "/users/blackxored/timeline" + }, + }, + "_embedded": { + "total": 2, + "comments": [ /* ... */ ] + }, + "id": "blackxored", + "firstName": "Adrian", + "lastName": "Perez", + "avatarUrl": "...", + "hireable": false, + "registeredAt": "2013-06-18T06:37:39.248Z", + "socialUrls": { + "github": "https://github.com/blackxored", + "twitter": "https://twitter.com/blackxored" + }, +} +``` + +### Partial Responses + +You can request partial responses (ideal for mobile apps). Just hit any endpoint with an optional `fields` attribute. + +(__TODO__: Check that key translation works at the partial response level) + +From the response above: + +```shell +curl $URL?fields=id,firstName,avatarUrl +``` + +Will return the following JSON document: + +```javascript +{ + "id": "blackxored" + "firstName": "Adrian", + "avatarUrl": "..." +} +``` + +### Error Conventions + __TODO__: Redact -* Key translation (Snake case to underscore and viceversa). -* Optional field includes (Pass `fields` parameter in URL). -* Conventional error responses. -* Optional inclusion/exclusion of hypermedia (HAL). + +### Pagination + +__TODO__: Test and implement + +All your collection get automated pagination by default. In the case of hypermedia APIs it also includes pagination links. + +```javascript +{ + "_links": { + "self": "/collection?page=3", + "first": "/collection", + "next": "/collection?page=4" + "prev": "/collection?page=2", + "last": "/collection?page=10" + }, + "_embedded": { + "collection": [ /*...*/] + }, + "total": 250, + "per": 25 +} +``` ## Contributing 1. Fork it ( https://github.com/[my-github-username]/radriar/fork ) 2. Create your feature branch (`git checkout -b my-new-feature`)