I was given some encouragement at CouchConf to announce my little REST library 
that's been working beautifully for CouchDB clients (and more):
https://github.com/andyet/fermata (single <script> include with no compile, 
and/or `npm install fermata`)


Why did I bother building yet another JavaScipt HTTP library? I grew tired of 
building URL strings like `var url = "http://"; + myServer + '/' + myApp + 
"_view/by_date?reduce=false&startkey=" + 
encodeURIComponent(JSON.stringify([2001,1])) + "&limit=" + myLimit` — and then 
this spring I finally noticed that JavaScript's object/method syntax matches 
REST so much better than passing strings/dictionaries to functions like 
`$.ajax()`.

With Fermata it's really easy to access CouchDB from a browser:

    var photoDB = fermata.api({url:"http://localhost:5984"})('photos');
    var photosIndexed = photoDB(['_design/shutterstem', '_view']);
    
    photosIndexed('by_date')({group_level:3}).get(function (err,data) {
        console.log(data.rows);
        // ...
    });
    
    photosIndexed('by_date')({reduce:false, limit:500, 
include_docs:true}).get(function (e,d) {
        var thumbs = d3.select('#content').selectAll('.frame').data(d.rows);
        thumbs.enter().append('div').classed('frame', 
true).append('img').classed('photo', true)
            .attr('src', function (d) { return photoDB([d.id, 
'thumbnail/64.jpg'])(); });
    });

In node.js the syntax is even cleaner, thanks to Harmony Proxy objects:
    
    var myCouch = fermata.api({url:"http://localhost:5984"});
    var indexedPhotos = myCouch.photos[appName]._view;
    
    indexedPhotos.by_date({reduce:false, $startkey=[2011,1], 
$endkey=[2012]}).get(function (e,d) { console.log(d); });

Of course the "broswer" syntax works in node.js server code too, but it's 
pretty fun to pretend that any REST API is just a local JavaScript object. (The 
dot syntax does actually work in Firefox and soon Chrome, but for clientside or 
mixed code I recommend sticking to parentheses for compatibility.) My teammates 
at @andyet keep encouraging me that Fermata's subtle differences really are a 
big deal in practice: we can assign, extend and access URLs throughout our code 
as if they were (virtual) nested JavaScript objects.

I'm currently working on plugin support (for sending XML, OAuth signatures, 
etc.) but that's getting off-topic for this list: Fermata already works great 
with CouchDB and I hope some of you will find it as useful as we have. Would 
love to hear your feedback!

regards,
-natevw

p.s. are many people using CouchDB from Python? ;-)

Reply via email to