Hi All,

I'd like to announce version 0.01 of CouchDB::ExternalProcess, a Perl
module that makes writing CouchDB External Processes easier.

http://search.cpan.org/~fansipans/CouchDB-ExternalProcess-0.01/lib/CouchDB/ExternalProcess.pm

All the work of reading input, parsing JSON, serializing a JSON
response, and writing output is managed, and can be overridden as
needed.

All that's needed to create a your own External Process is:

   use base qw/CouchDB::ExternalProcess/;

And then all subroutines marked with the ":Action" attribute can be
requested as a path component after the External Process' URL.

All :Action subroutines receive a parsed data structure from the
original JSON input, and simply return a Perl data structure in the same
structure as described by

   http://wiki.apache.org/couchdb/ExternalProcesses

So, with the following code in "Party.pm", in the directory "/mydir":

   package Party;
   use base qw/CouchDB::ExternalProcess/;

   my @styles = qw/ Ska Mosh Tango Hokey-Pokey /;

   sub dance :Action {
       my ($self, $req) = @_;

       my $style = $req->{query}->{style};

       die "Can't dance without a dance style!"
           unless $style;

       die "Invalid dance style specified"
           unless grep { $style eq $_ } @styles;

       my $response = {
           body => "<b>Dancing enabled!</b>";
       };

       return $response;
   }

   sub dance_styles :Action {
       return {
           json => {
               styles => \...@styles
           }
       };
   }

And the following configuration in your CouchDB's local.ini:

 [external]
 party = perl -I/mydir -MParty -e 'Party->new->run'

 [httpd_db_handlers]
 _party = {couch_httpd_external, handle_external_req, <<"party">>}


Now for any database DATABASE on your server SERVER you can get a JSON
data structure of allowed dance styles at:

   http://SERVER/DATABASE/_party/dance_styles

And you can get an HTML confirmation of dancing at:

   http://SERVER/DATABASE/_party/dance?style=Ska

Errors and exceptions from die() are captured and returned in a JSON
data structure containing the error message.

Pre/post request processing is allowed by defining _before and _after,
respectively. See the tests in the t/ directory of the distribution.

The logic that extracts the name of the Action to execute can be
overridden, currently the third path component is used:

   /database/external/ACTION_NAME

That can be overridden to use a CGI::Application style "rm" request
parameter with just:

   sub _extract_action_name {
       my ($self,$req) = @_;
       return $req->{query}->{rm};
   }

Also there's preliminary support for self-documentation of provided
services. :Action subroutines can also use the following attributes:

   :Description("...")
   :Args(...)

Then if the "Action" "_meta" is requested, a JSON document is returned
describing all services and their arguments.

Any comments / criticisms are welcome. Obviously this is 0.01 and I've
got a few things to improve. I do kindly request that all flames and
threats be submitted in haiku format.

Thanks and props to the CouchDB team! You guys are working on a
really cool project :)

-Mike

Reply via email to