From dev-return-9627-apmail-couchdb-dev-archive=couchdb.apache.org@couchdb.apache.org Mon Apr 12 05:56:07 2010 Return-Path: Delivered-To: apmail-couchdb-dev-archive@www.apache.org Received: (qmail 28881 invoked from network); 12 Apr 2010 05:56:07 -0000 Received: from unknown (HELO mail.apache.org) (140.211.11.3) by 140.211.11.9 with SMTP; 12 Apr 2010 05:56:07 -0000 Received: (qmail 90862 invoked by uid 500); 12 Apr 2010 05:56:07 -0000 Delivered-To: apmail-couchdb-dev-archive@couchdb.apache.org Received: (qmail 90825 invoked by uid 500); 12 Apr 2010 05:56:06 -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 90817 invoked by uid 99); 12 Apr 2010 05:56:06 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 12 Apr 2010 05:56:06 +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; Mon, 12 Apr 2010 05:56:03 +0000 Received: from thor (localhost [127.0.0.1]) by thor.apache.org (8.13.8+Sun/8.13.8) with ESMTP id o3C5tf8o022850 for ; Mon, 12 Apr 2010 01:55:41 -0400 (EDT) Message-ID: <6795589.17581271051741371.JavaMail.jira@thor> Date: Mon, 12 Apr 2010 01:55:41 -0400 (EDT) From: "Matt Lyon (JIRA)" To: dev@couchdb.apache.org Subject: [jira] Created: (COUCHDB-732) ruby versions of the query server spec functions MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 X-Virus-Checked: Checked by ClamAV on apache.org 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. - If you think it was sent incorrectly contact one of the administrators: https://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira