You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@couchdb.apache.org by "Matt Lyon (JIRA)" <ji...@apache.org> on 2010/04/12 07:55:41 UTC
[jira] Created: (COUCHDB-732) ruby versions of the query server
spec functions
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
[jira] Updated: (COUCHDB-732) ruby versions of the query server
spec functions
Posted by "Paul Joseph Davis (JIRA)" <ji...@apache.org>.
[ 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.