From dev-return-12149-apmail-couchdb-dev-archive=couchdb.apache.org@couchdb.apache.org Sat Oct 09 01:19:16 2010 Return-Path: Delivered-To: apmail-couchdb-dev-archive@www.apache.org Received: (qmail 9273 invoked from network); 9 Oct 2010 01:19:16 -0000 Received: from unknown (HELO mail.apache.org) (140.211.11.3) by 140.211.11.9 with SMTP; 9 Oct 2010 01:19:16 -0000 Received: (qmail 57132 invoked by uid 500); 9 Oct 2010 01:19:12 -0000 Delivered-To: apmail-couchdb-dev-archive@couchdb.apache.org Received: (qmail 57071 invoked by uid 500); 9 Oct 2010 01:19:12 -0000 Mailing-List: contact dev-help@couchdb.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@couchdb.apache.org Delivered-To: mailing list dev@couchdb.apache.org Received: (qmail 57035 invoked by uid 99); 9 Oct 2010 01:19:12 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 09 Oct 2010 01:19:12 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.22] (HELO thor.apache.org) (140.211.11.22) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 09 Oct 2010 01:19:11 +0000 Received: from thor (localhost [127.0.0.1]) by thor.apache.org (8.13.8+Sun/8.13.8) with ESMTP id o991Ipcw003121 for ; Sat, 9 Oct 2010 01:18:51 GMT Message-ID: <6512096.49441286587131687.JavaMail.jira@thor> Date: Fri, 8 Oct 2010 21:18:51 -0400 (EDT) From: "Paul Joseph Davis (JIRA)" To: dev@couchdb.apache.org Subject: [jira] Updated: (COUCHDB-732) ruby versions of the query server spec functions In-Reply-To: <6795589.17581271051741371.JavaMail.jira@thor> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 [ https://issues.apache.org/jira/browse/COUCHDB-732?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Paul Joseph Davis updated COUCHDB-732: -------------------------------------- Skill Level: New Contributors Level (Easy) > ruby versions of the query server spec functions > ------------------------------------------------ > > Key: COUCHDB-732 > URL: https://issues.apache.org/jira/browse/COUCHDB-732 > Project: CouchDB > Issue Type: Improvement > Components: Test Suite > Reporter: Matt Lyon > Priority: Trivial > > In the process of creating the a ruby version of the query server, I wrote these to determine it was working correctly. Even though the repository for the ruby query server contains its own test suite, I figure these might be welcomed into the main query server specs. If not, no big deal. They assume the ruby query server's repository is in the same parent directory as couchdb. > diff --git a/test/view_server/query_server_spec.rb b/test/view_server/query_server_spec.rb > index 1de8e5b..c427e35 100644 > --- a/test/view_server/query_server_spec.rb > +++ b/test/view_server/query_server_spec.rb > @@ -117,7 +117,8 @@ class QueryServerRunner < OSProcessRunner > > COMMANDS = { > "js" => "#{COUCH_ROOT}/bin/couchjs_dev #{COUCH_ROOT}/share/server/main.js", > - "erlang" => "#{COUCH_ROOT}/test/view_server/run_native_process.es" > + "erlang" => "#{COUCH_ROOT}/test/view_server/run_native_process.es", > + "ruby" => "/usr/bin/env ruby -- #{COUCH_ROOT}/../couchdb-ruby-query-server/bin/couchdb_view_server --safe" > } > > def self.run_command > @@ -137,13 +138,14 @@ end > functions = { > "emit-twice" => { > "js" => %{function(doc){emit("foo",doc.a); emit("bar",doc.a)}}, > - "erlang" => <<-ERLANG > + "erlang" => <<-ERLANG, > fun({Doc}) -> > A = proplists:get_value(<<"a">>, Doc, null), > Emit(<<"foo">>, A), > Emit(<<"bar">>, A) > end. > ERLANG > + "ruby" => "lambda{|doc| emit('foo',doc['a']); emit('bar',doc['a']) }" > }, > "emit-once" => { > "js" => <<-JS, > @@ -151,20 +153,39 @@ functions = { > emit("baz",doc.a) > } > JS > - "erlang" => <<-ERLANG > + "erlang" => <<-ERLANG, > fun({Doc}) -> > A = proplists:get_value(<<"a">>, Doc, null), > Emit(<<"baz">>, A) > end. > ERLANG > + "ruby" => <<-RUBY > + lambda {|doc| emit("baz", doc['a']) } > + RUBY > + }, > + "map-invalid-expression" => { > + "js" => %{function(doc {emit("foo", doc.a);}}, > + "erlang" => %|fun({Doc}|, > + "ruby" => "lambda{" > + }, > + "map-non-function-expression" => { > + "js" => "3", > + "erlang" => "3", > + "ruby" => "3" > + }, > + "map-logging" => { > + "js" => %{function(doc){ log(doc); emit("logged", doc.a);}}, > + "ruby" => %{lambda{|doc| log(doc); emit("logged", doc['a']) }} > }, > "reduce-values-length" => { > "js" => %{function(keys, values, rereduce) { return values.length; }}, > - "erlang" => %{fun(Keys, Values, ReReduce) -> length(Values) end.} > + "erlang" => %{fun(Keys, Values, ReReduce) -> length(Values) end.}, > + "ruby" => %{lambda{|keys, values, rereduce| values.size }} > }, > "reduce-values-sum" => { > "js" => %{function(keys, values, rereduce) { return sum(values); }}, > - "erlang" => %{fun(Keys, Values, ReReduce) -> lists:sum(Values) end.} > + "erlang" => %{fun(Keys, Values, ReReduce) -> lists:sum(Values) end.}, > + "ruby" => %{lambda{|keys, values, rereduce| values.inject(0){|sum, val| sum += val} }} > }, > "validate-forbidden" => { > "js" => <<-JS, > @@ -173,7 +194,7 @@ functions = { > throw({forbidden:"bad doc"}); "foo bar"; > } > JS > - "erlang" => <<-ERLANG > + "erlang" => <<-ERLANG, > fun({NewDoc}, _OldDoc, _UserCtx) -> > case proplists:get_value(<<"bad">>, NewDoc) of > undefined -> 1; > @@ -181,6 +202,13 @@ functions = { > end > end. > ERLANG > + "ruby" => <<-RUBY > + lambda{|new_doc, old_doc, user_ctx| > + if (new_doc['bad']) > + throw(:forbidden, "bad doc") > + end > + } > + RUBY > }, > "show-simple" => { > "js" => <<-JS, > @@ -189,7 +217,7 @@ functions = { > return [doc.title, doc.body].join(' - '); > } > JS > - "erlang" => <<-ERLANG > + "erlang" => <<-ERLANG, > fun({Doc}, Req) -> > Title = proplists:get_value(<<"title">>, Doc), > Body = proplists:get_value(<<"body">>, Doc), > @@ -197,6 +225,9 @@ functions = { > {[{<<"body">>, Resp}]} > end. > ERLANG > + "ruby" => <<-RUBY > + lambda{|doc, req| [doc['title'], doc['body']].join(' - ') } > + RUBY > }, > "show-headers" => { > "js" => <<-JS, > @@ -206,7 +237,7 @@ functions = { > return resp; > } > JS > - "erlang" => <<-ERLANG > + "erlang" => <<-ERLANG, > fun({Doc}, Req) -> > Title = proplists:get_value(<<"title">>, Doc), > Body = proplists:get_value(<<"body">>, Doc), > @@ -218,6 +249,12 @@ functions = { > ]} > end. > ERLANG > + "ruby" => <<-RUBY > + lambda {|doc, req| > + resp = {"code" => 200, "headers" => {"X-Plankton" => "Rusty"}} > + resp.update("body" => [doc["title"], doc["body"]].join(" - ")) > + } > + RUBY > }, > "show-sends" => { > "js" => <<-JS, > @@ -228,7 +265,7 @@ functions = { > return "tail"; > }; > JS > - "erlang" => <<-ERLANG > + "erlang" => <<-ERLANG, > fun(Head, Req) -> > Resp = {[ > {<<"headers">>, {[{<<"Content-Type">>, <<"text/plain">>}]}} > @@ -239,6 +276,14 @@ functions = { > <<"tail">> > end. > ERLANG > + "ruby" => <<-RUBY > + lambda {|head, req| > + start({"headers" => {"Content-Type" => "text/plain"}}) > + send "first chunk" > + send 'second "chunk"' > + "tail" > + } > + RUBY > }, > "show-while-get-rows" => { > "js" => <<-JS, > @@ -265,6 +310,16 @@ functions = { > <<"tail">> > end. > ERLANG > + "ruby" => <<-RUBY > + lambda{|head, req| > + send "first chunk" > + send req['q'] > + while row = get_row do > + send row['key'] > + end > + "tail" > + } > + RUBY > }, > "show-while-get-rows-multi-send" => { > "js" => <<-JS, > @@ -291,6 +346,16 @@ functions = { > <<"tail">> > end. > ERLANG > + "ruby" => <<-RUBY > + lambda{|head, req| > + send "bacon" > + while row = get_row do > + send row["key"] > + send "eggs" > + end > + "tail" > + } > + RUBY > }, > "list-simple" => { > "js" => <<-JS, > @@ -316,6 +381,16 @@ functions = { > <<"early">> > end. > ERLANG > + "ruby" => <<-RUBY > + lambda{|head, req| > + send("first chunk") > + send(req['q']) > + while row = get_row do > + send(row['key']) > + end > + return "early" > + } > + RUBY > }, > "list-chunky" => { > "js" => <<-JS, > @@ -348,6 +423,14 @@ functions = { > Tail > end. > ERLANG > + "ruby" => <<-RUBY > + lambda {|head, req| > + send("first chunk") > + send(req['q']) > + 3.times { send get_row['key'] } > + "early tail" > + } > + RUBY > }, > "list-old-style" => { > "js" => <<-JS, > @@ -390,6 +473,13 @@ functions = { > Tail > end. > ERLANG > + "ruby" => <<-RUBY > + lambda{|head, req| > + send "bacon" > + 3.times { send get_row['key'] } > + "early" > + } > + RUBY > }, > "list-raw" => { > "js" => <<-JS, > @@ -417,6 +507,16 @@ functions = { > <<"tail">> > end. > ERLANG > + "ruby" => <<-RUBY > + lambda{|head, req| > + send "first chunk" > + send req["q"] > + while row = get_row do > + send row["key"] > + end > + return "tail" > + } > + RUBY > }, > "filter-basic" => { > "js" => <<-JS, > @@ -431,6 +531,9 @@ functions = { > proplists:get_value(<<"good">>, Doc) > end. > ERLANG > + "ruby" => <<-RUBY > + lambda{|doc, req| doc["good"] } > + RUBY > }, > "update-basic" => { > "js" => <<-JS, > @@ -446,6 +549,12 @@ functions = { > [{Doc2}, {[{<<"body">>, <<"hello doc">>}]}] > end. > ERLANG > + "ruby" => <<-RUBY > + lambda{|doc, req| > + doc["world"] = "hello" > + [doc, "hello doc"] > + } > + RUBY > }, > "error" => { > "js" => <<-JS, > @@ -453,11 +562,14 @@ functions = { > throw(["error","error_key","testing"]); > } > JS > - "erlang" => <<-ERLANG > + "erlang" => <<-ERLANG, > fun(A, B) -> > throw([<<"error">>,<<"error_key">>,<<"testing">>]) > end. > ERLANG > + "ruby" => <<-RUBY > + lambda{|doc, req| throw :error, "error_key", "testing" } > + RUBY > }, > "fatal" => { > "js" => <<-JS, > @@ -465,11 +577,14 @@ functions = { > throw(["fatal","error_key","testing"]); > } > JS > - "erlang" => <<-ERLANG > + "erlang" => <<-ERLANG, > fun(A, B) -> > throw([<<"fatal">>,<<"error_key">>,<<"testing">>]) > end. > ERLANG > + "ruby" => <<-RUBY > + lambda{|h,r| throw :fatal, ["error_key", "testing"] } > + RUBY > } > } -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.