# sourcerer

[![Circle CI](https://circleci.com/gh/chute/sourcerer.svg?style=svg)](https://circleci.com/gh/chute/sourcerer)
[![Code Climate](https://codeclimate.com/github/chute/sourcerer/badges/gpa.svg)](https://codeclimate.com/github/chute/sourcerer)
[![Test Coverage](https://codeclimate.com/github/chute/sourcerer/badges/coverage.svg)](https://codeclimate.com/github/chute/sourcerer/code)
[![bitHound Score](https://www.bithound.io/chute/sourcerer/badges/score.svg?)](https://www.bithound.io/chute/sourcerer)

> Resource abstraction in vanilla JS, inspired by ngResource. For browsers, Node and io.js.

Currently under development but the basic version of the examples shown below is already implemented.

## Features

* Promise-based
* Simple resource route definition
* Only depends on [superagent](https://github.com/visionmedia/superagent)
* Pagination for resource collections
* [TODO] Optionally can return data as [immutables](http://facebook.github.io/immutable-js/)

## Install

As the package is not published yet, install it from the repo directly:

```json
{
  "dependencies": {
    "sourcerer": "chute/sourcerer"
  }
}
```

## Usage

```js
var Resource = require('sourcerer');

// define your resource
var Comment = new Resource('//api.example.com/posts/:post_id/comments');

// fetch list of post's comments
Comment.query({post_id: 1, sort: 'popular'}).then(function(assets) {
  // ...
});
// GET //api.example.com/posts/1/comments?sort=popular

// fetch individual comment
Comment.find({post_id: 1, id: '1234'}).then(function(asset) {
  // ...
});
// GET //api.example.com/posts/1/comments/1234

// create a new comment
Comment.create({text: 'My new world', author_id: 12, post_id: 1});
// POST //api.example.com/posts/1/comments
// {"text": "My new world", "author_id": 12}

// save a comment
var comment = new Comment({text: 'Comment', author_id: 12, post_id: 1});
comment.save();
// POST //api.example.com/posts/1/comments
// {"text": "Comment", "author_id": 12}

// update a comment
Comment.find({post_id: 1, id: '1234'}).then(function(comment) {
  comment.text = 'Updated comment';
  comment.save();
  // PUT //api.example.com/comments/1234
  // {"text": "Updated comment", "author_id": 12}
});

// delete a comment
comment.remove();
// DELETE //api.example.com/posts/1/comments/1234
```

## Test

```sh
npm test
```
