[
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.