Ecosyste.ms: Awesome

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

Awesome Lists | Featured Topics | Projects

https://github.com/jo/docuri

Rich document ids for CouchDB
https://github.com/jo/docuri

Last synced: about 2 months ago
JSON representation

Rich document ids for CouchDB

Awesome Lists containing this project

README

        

# DocURI [![Build Status](https://travis-ci.org/jo/docuri.svg?branch=master)](https://travis-ci.org/jo/docuri)
Rich document ids for CouchDB:

```js
'movie/blade-runner/gallery-image/12/medium'
```

### Advantages
* You can access the doc type everywhere (eg. in changes feed, response, view results...)
* They sort well in Futon and` _all_docs`
* DocURIs can tell a lot about the document
* You can rely on a schema and construct ids of dependend documents (eg. a specific version of an image)
* Easily delete related documents (eg. by requesting a range from `_all_docs`)

_Give DocURIs a try!_

## Usage
Define methods for certain DocURI fragments and provide a routes hash that pairs routes to methods.
DocURI is inspired by [Backbone.Router](http://backbonejs.org/#Router).

Routes can contain parameter parts, `:param`, which match a single DocURI component
between slashes; and splat parts `*splat`, which can match any number of DocURI
components. Part of a route can be made optional by surrounding it in
parentheses `(/:optional)`.

For example, a route of `'movie/:movie_id/gallery-image'` will generate a function which parses
```js
'movie/blade-runner/gallery-image/12'
// =>
{
movie_id: 'blade-runner',
id: '12'
}
```
and vice versa.

A route of `'movie/:movie_id/:type/*path'` will generate a function which parses
```js
'movie/blade-runner/gallery-image/12'
// =>
{
movie_id: 'blade-runner',
type: 'gallery-image',
path: ['12']
}
// and
'movie/blade-runner/gallery-image/12/medium'
// =>
{
movie_id: 'blade-runner',
type: 'gallery-image',
path: ['12', 'medium']
}
```

The route `'movie/:movie_id/gallery-image/:id(/:version)'` will generate a
function which parses
```js
'movie/blade-runner/gallery-image/12'
// =>
{
movie_id: 'blade-runner',
id: '12'
}
// as well as
'movie/blade-runner/gallery-image/12/medium'
// =>
{
movie_id: 'blade-runner',
id: '12',
version: 'medium'
}
```

### `docuri.route(route)`
Create a single route. The `route` argument must be a routing string.

```js
// parses 'page/home' as { id: 'home' }:
var page = docuri.route('page/:id');
```

### `route(strOrObj, [obj])`
The functions generated by DocURI can have a different behaviour, depending on
the type and number of the supplied arguments:

* `route(str)`: parse DocURI string to object
* `route(obj)`: generate DocURI string from object
* `route(str, obj)`: change DocURI string parts with values provided by object returning a string

The function returns `false` if a string can not be parsed, enabling type
checks.

#### Example
```js
movie('movie/blade-runner');
// { id: 'blade-runner' }
movieAsset('movie/blade-runner');
// false
galleryImage({ movie_id: 'blade-runner', id: 12 });
// 'movie/blade-runner/gallery-image/12'
galleryImage('movie/blade-runner/gallery-image/12', { version: 'large' });
// 'movie/blade-runner/gallery-image/12/large'
```

## Browser support
To use DocURI in your client-side application, browserify it like this:
```shell
browserify -s DocURI path/to/docuri/index.js > path/to/your/assets
```
Or grab it from [browserify-as-a-service: docuri@latest](http://www.modulefarm.com/standalone/docuri@latest).

## Development
To run the unit tests:
```shell
npm test
```

## License
Copyright (c) 2014 Johannes J. Schmidt, null2 GmbH
Licensed under the Apache 2.0 license.