relaxo-query-server 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +6 -14
- data/.simplecov +9 -0
- data/.travis.yml +4 -7
- data/Gemfile +3 -2
- data/README.md +6 -5
- data/Rakefile +8 -0
- data/bin/relaxo-query-server +1 -1
- data/lib/relaxo/query_server/version.rb +1 -1
- data/relaxo-query-server.gemspec +6 -5
- data/spec/relaxo/query_server/filters_spec.rb +28 -0
- data/{test/test_libraries.rb → spec/relaxo/query_server/libraries_spec.rb} +16 -13
- data/spec/relaxo/query_server/lists_spec.rb +49 -0
- data/spec/relaxo/query_server/map_spec.rb +23 -0
- data/spec/relaxo/query_server/reduce_spec.rb +42 -0
- data/spec/relaxo/query_server/shows_spec.rb +54 -0
- data/spec/relaxo/query_server/spec_helper.rb +6 -0
- data/spec/relaxo/query_server/updates_spec.rb +29 -0
- data/{test/test_validations.rb → spec/relaxo/query_server/validations_spec.rb} +15 -5
- data/spec/relaxo/query_server/view_spec.rb +27 -0
- metadata +73 -59
- data/rakefile.rb +0 -9
- data/test/helper.rb +0 -38
- data/test/test_filters.rb +0 -24
- data/test/test_lists.rb +0 -46
- data/test/test_map.rb +0 -20
- data/test/test_reduce.rb +0 -38
- data/test/test_shows.rb +0 -53
- data/test/test_updates.rb +0 -19
- data/test/test_views.rb +0 -17
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
YTgxMjllODIyMjhmM2JmYzA2ODMxZmM0M2I2YWQ1MjRhYzE0ZDgyYmFhMjQy
|
10
|
-
ZGVjYzEwMzQ5MDBiOTNkNjIwYmM1NTJiZDc0MDg4OGFkNGM3NmNkNmIzNjA3
|
11
|
-
ZjY1ZjRiYzJhMzQxOGQ5MmZjMWQzNzJlMGVkYjZmMTNkOTMzNzY=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
YmJhZjVhNmU4ZmRiM2FiMTc1NWU2Nzg4MDRmYTgwNDU1MDYyODE2YmU4ZDIy
|
14
|
-
M2UwZTJhOTI1NDBlNWFmMWFiMzYyNWNiMDI5NDljMzNhYTIyNDllNmZiOTli
|
15
|
-
MGQ1YzcxOTZkOTAzZDlhMjY3NGUyZWMyYmIyY2M5M2ExYTAxNmY=
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 78944e73c0640d81426a896195caf1dac016cccf
|
4
|
+
data.tar.gz: 32d6f60802a40842fbea80820c1914f06e6409cf
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 5df2161444eee230a5eff87830986c5b060ea38d53e3823c48bc94c3a54969760c6ba91bd7bcb23a30673afafe654901305476efa7aec2c956b3e8c58a941f32
|
7
|
+
data.tar.gz: 403b146fb25f50a0dfc71b6d8cc845159c86d0491954d505af9f08419f64db569d0598ca68386c526779a1a0a96bdd0f887b4d42fa65492c728406f110038728
|
data/.simplecov
ADDED
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -2,11 +2,10 @@
|
|
2
2
|
|
3
3
|
The Relaxo Query Server implements the CouchDB Query Server protocol for CouchDB 1.1.0+. It provides a comprehensive Ruby-style view server along with full support for Design Document based processing.
|
4
4
|
|
5
|
-
For more information and examples please see the main [project page][1].
|
6
|
-
|
7
|
-
[1]: http://www.codeotaku.com/projects/relaxo/query-server
|
8
5
|
|
9
6
|
[![Build Status](https://secure.travis-ci.org/ioquatix/relaxo-query-server.png)](http://travis-ci.org/ioquatix/relaxo-query-server)
|
7
|
+
[![Code Climate](https://codeclimate.com/github/ioquatix/relaxo-query-server.png)](https://codeclimate.com/github/ioquatix/relaxo-query-server)
|
8
|
+
[![Coverage Status](https://coveralls.io/repos/ioquatix/relaxo-query-server/badge.svg)](https://coveralls.io/r/ioquatix/relaxo-query-server)
|
10
9
|
|
11
10
|
## Installation
|
12
11
|
|
@@ -23,7 +22,7 @@ Make sure the `relaxo-query-server` executable is accessible from `$PATH`.
|
|
23
22
|
|
24
23
|
`relaxo-query-server` includes a variety of 3rd party modules by default, but it can include other libraries by specifying them on the command line:
|
25
24
|
|
26
|
-
relaxo-ruby =
|
25
|
+
relaxo-ruby = ruby -rdate -rbigdecimal relaxo-query-server
|
27
26
|
|
28
27
|
(You can also load code by specifying libraries in your design documents and views.)
|
29
28
|
|
@@ -116,7 +115,9 @@ The previous `design.yaml` document can be loaded using the `relaxo` client comm
|
|
116
115
|
|
117
116
|
## License
|
118
117
|
|
119
|
-
|
118
|
+
Released under the MIT license.
|
119
|
+
|
120
|
+
Copyright, 2015, by [Samuel G. D. Williams](http://www.codeotaku.com/samuel-williams).
|
120
121
|
|
121
122
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
122
123
|
of this software and associated documentation files (the "Software"), to deal
|
data/Rakefile
ADDED
data/bin/relaxo-query-server
CHANGED
@@ -17,7 +17,7 @@ ARGV.options do |o|
|
|
17
17
|
o.separator ""
|
18
18
|
o.separator "Help and Copyright information"
|
19
19
|
|
20
|
-
o.on("--safe [level]", "Set the ruby $SAFE level to
|
20
|
+
o.on("--safe [level]", "Set the ruby $SAFE level to protect the execution environment.") do |level|
|
21
21
|
OPTIONS[:safe] = level.to_i
|
22
22
|
end
|
23
23
|
|
data/relaxo-query-server.gemspec
CHANGED
@@ -23,11 +23,12 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
24
24
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
25
25
|
spec.require_paths = ["lib"]
|
26
|
-
|
27
|
-
spec.add_development_dependency "bundler", "~> 1.3"
|
28
|
-
spec.add_development_dependency "rake"
|
29
26
|
|
30
|
-
spec.add_dependency "relaxo", "~> 0.4.
|
31
|
-
spec.add_dependency "json", "~> 1.
|
27
|
+
spec.add_dependency "relaxo", "~> 0.4.4"
|
28
|
+
spec.add_dependency "json", "~> 1.8"
|
32
29
|
spec.add_dependency "rest-client"
|
30
|
+
|
31
|
+
spec.add_development_dependency "rspec", "~> 3.1.0"
|
32
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
33
|
+
spec.add_development_dependency "rake"
|
33
34
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
|
2
|
+
require_relative 'spec_helper'
|
3
|
+
|
4
|
+
RSpec.describe "Relaxo Filters" do
|
5
|
+
before :all do
|
6
|
+
@shell = Relaxo::QueryServer::MockShell.new
|
7
|
+
@context = Relaxo::QueryServer::Context.new(@shell, safe: 2)
|
8
|
+
end
|
9
|
+
|
10
|
+
def run_filter(opts={})
|
11
|
+
opts[:docs] ||= []
|
12
|
+
opts[:req] ||= {}
|
13
|
+
|
14
|
+
@context.run ["ddoc", "foo", ["filters", "basic"], [opts[:docs], opts[:req]]]
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should apply filters" do
|
18
|
+
basic = "lambda{|doc, req| doc['good'] == true}"
|
19
|
+
@context.run ["ddoc", "new", "foo", {"filters" => {"basic" => basic}}]
|
20
|
+
|
21
|
+
docs = (1..3).map do |i|
|
22
|
+
{"good" => i.odd?}
|
23
|
+
end
|
24
|
+
|
25
|
+
results = run_filter({:docs => docs})
|
26
|
+
expect(results).to be == [true, [true, false, true]]
|
27
|
+
end
|
28
|
+
end
|
@@ -1,12 +1,18 @@
|
|
1
1
|
|
2
|
-
require 'helper'
|
3
2
|
require 'relaxo/query_server/library'
|
4
3
|
|
5
4
|
require 'bigdecimal'
|
6
5
|
require 'bigdecimal/util'
|
7
6
|
|
8
|
-
|
9
|
-
|
7
|
+
require_relative 'spec_helper'
|
8
|
+
|
9
|
+
RSpec.describe "Libraries" do
|
10
|
+
before :all do
|
11
|
+
@shell = Relaxo::QueryServer::MockShell.new
|
12
|
+
@context = Relaxo::QueryServer::Context.new(@shell, safe: 2)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should load a library" do
|
10
16
|
root = {
|
11
17
|
'lib' => {
|
12
18
|
'all' => %q{
|
@@ -24,18 +30,15 @@ class LibrariesTest < ContextualTestCase
|
|
24
30
|
}
|
25
31
|
|
26
32
|
object = Relaxo::QueryServer::Library.for(root, 'lib/bar')
|
27
|
-
|
28
|
-
|
29
|
-
assert object.respond_to? :bar
|
30
|
-
|
31
|
-
assert_equal "10".to_d, object.bar
|
33
|
+
expect(object).to be_respond_to :bar
|
34
|
+
expect(object.bar).to be == "10".to_d
|
32
35
|
|
33
36
|
# For efficiency, the same object is returned both times
|
34
37
|
same_object = Relaxo::QueryServer::Library.for(root, 'lib/bar')
|
35
|
-
|
38
|
+
expect(same_object).to be object
|
36
39
|
end
|
37
40
|
|
38
|
-
|
41
|
+
it "should use library functions for map/reduce" do
|
39
42
|
library_code = %q{
|
40
43
|
def check_bar(doc)
|
41
44
|
yield doc if doc['bar'] == true
|
@@ -51,12 +54,12 @@ class LibrariesTest < ContextualTestCase
|
|
51
54
|
}
|
52
55
|
|
53
56
|
response = @context.run ['add_lib', {'foo' => library_code}]
|
54
|
-
|
57
|
+
expect(response).to be true
|
55
58
|
|
56
59
|
response = @context.run ['add_fun', map_function_code]
|
57
|
-
|
60
|
+
expect(response).to be true
|
58
61
|
|
59
62
|
response = @context.run ['map_doc', {'bar' => true}]
|
60
|
-
|
63
|
+
expect(response).to be == [[[true, nil]]]
|
61
64
|
end
|
62
65
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
|
2
|
+
require_relative 'spec_helper'
|
3
|
+
|
4
|
+
RSpec.describe "Lists" do
|
5
|
+
before :all do
|
6
|
+
@shell = Relaxo::QueryServer::MockShell.new
|
7
|
+
@context = Relaxo::QueryServer::Context.new(@shell, safe: 2)
|
8
|
+
end
|
9
|
+
|
10
|
+
def create_design_document name, attributes
|
11
|
+
@context.run ['ddoc', 'new', name, attributes]
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should list all items" do
|
15
|
+
create_design_document "test", {
|
16
|
+
'lists' => {
|
17
|
+
'entire' => <<-EOF
|
18
|
+
lambda{|head,request|
|
19
|
+
send "<ul>"
|
20
|
+
each do |row|
|
21
|
+
send "<li>" + row['count'] + "</li>"
|
22
|
+
end
|
23
|
+
send "</ul>"
|
24
|
+
}
|
25
|
+
EOF
|
26
|
+
}
|
27
|
+
}
|
28
|
+
|
29
|
+
rows = [
|
30
|
+
["list_row", {"count"=>"Neko"}],
|
31
|
+
["list_row", {"count"=>"Nezumi"}],
|
32
|
+
["list_row", {"count"=>"Zoe"}],
|
33
|
+
["list_end"]
|
34
|
+
]
|
35
|
+
|
36
|
+
rows.each {|row| @shell.input << row}
|
37
|
+
|
38
|
+
result = @context.run ['ddoc', 'test', ['lists', 'entire'], [{}, {}]]
|
39
|
+
|
40
|
+
expect(@shell.output).to be == [
|
41
|
+
["start", ["<ul>"], {:headers=>{}}],
|
42
|
+
["chunks", ["<li>Neko</li>"]],
|
43
|
+
["chunks", ["<li>Nezumi</li>"]],
|
44
|
+
["chunks", ["<li>Zoe</li>"]]
|
45
|
+
]
|
46
|
+
|
47
|
+
expect(result).to be == ["end", ["</ul>"]]
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
|
2
|
+
require_relative 'spec_helper'
|
3
|
+
|
4
|
+
RSpec.describe "Map Functions" do
|
5
|
+
before :all do
|
6
|
+
@shell = Relaxo::QueryServer::MockShell.new
|
7
|
+
@context = Relaxo::QueryServer::Context.new(@shell, safe: 2)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should map values using a function" do
|
11
|
+
response = @context.run ["add_fun", "lambda{|doc| emit('foo', doc['a']); emit('bar', doc['a'])}"]
|
12
|
+
expect(response).to be true
|
13
|
+
|
14
|
+
response = @context.run ["add_fun", "lambda{|doc| emit('baz', doc['a'])}"]
|
15
|
+
expect(response).to be true
|
16
|
+
|
17
|
+
response = @context.run(["map_doc", {"a" => "b"}])
|
18
|
+
expect(response).to be == [
|
19
|
+
[["foo", "b"], ["bar", "b"]],
|
20
|
+
[["baz", "b"]]
|
21
|
+
]
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
|
2
|
+
require_relative 'spec_helper'
|
3
|
+
|
4
|
+
RSpec.describe "Reduce Functions" do
|
5
|
+
before :all do
|
6
|
+
@shell = Relaxo::QueryServer::MockShell.new
|
7
|
+
@context = Relaxo::QueryServer::Context.new(@shell, safe: 2)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should reduce values" do
|
11
|
+
sum = "lambda{|k,v,r| v.inject &:+ }"
|
12
|
+
concat = "lambda{|k,v,r| r ? v.join('_') : v.join(':') }"
|
13
|
+
|
14
|
+
response = @context.run ["reduce", [sum, concat], (0...10).map{|i|[i,i*2]}]
|
15
|
+
expect(response).to be == [true, [90, "0:2:4:6:8:10:12:14:16:18"]]
|
16
|
+
|
17
|
+
response = @context.run ["rereduce", [sum, concat], (0...10).map{|i|i}]
|
18
|
+
expect(response).to be == [true, [45, "0_1_2_3_4_5_6_7_8_9"]]
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should reduce using library functions" do
|
22
|
+
library_code = %q{
|
23
|
+
def sum(values)
|
24
|
+
values.inject(&:+)
|
25
|
+
end
|
26
|
+
}
|
27
|
+
|
28
|
+
reduce_function = %q{
|
29
|
+
foo = load('foo')
|
30
|
+
|
31
|
+
lambda {|k,v,r|
|
32
|
+
foo.sum(v)
|
33
|
+
}
|
34
|
+
}
|
35
|
+
|
36
|
+
response = @context.run ['add_lib', {'foo' => library_code}]
|
37
|
+
expect(response).to be true
|
38
|
+
|
39
|
+
response = @context.run ['reduce', [reduce_function], (0...10).map{|i|[i,i]}]
|
40
|
+
expect(response).to be == [true, [45]]
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
#!/usr/bin/env rspec
|
2
|
+
|
3
|
+
require_relative 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe "Document Shows" do
|
6
|
+
STRING = "lambda{|doc, req| [doc['title'], doc['body']].join(' - ') }"
|
7
|
+
|
8
|
+
HASH = <<-EOF
|
9
|
+
lambda{|doc, req|
|
10
|
+
resp = {"code" => 200, "headers" => {"X-Foo" => "Bar"}}
|
11
|
+
resp["body"] = [doc['title'], doc['body']].join(' - ')
|
12
|
+
resp
|
13
|
+
}
|
14
|
+
EOF
|
15
|
+
|
16
|
+
ERROR = "lambda{|doc,req| raise StandardError.new('error message') }"
|
17
|
+
|
18
|
+
before :all do
|
19
|
+
@shell = Relaxo::QueryServer::MockShell.new
|
20
|
+
@context = Relaxo::QueryServer::Context.new(@shell, safe: 2)
|
21
|
+
|
22
|
+
@context.run ["ddoc", "new", "foo", {
|
23
|
+
"shows" => {
|
24
|
+
"string" => STRING,
|
25
|
+
"hash" => HASH,
|
26
|
+
"error" => ERROR
|
27
|
+
}
|
28
|
+
}
|
29
|
+
]
|
30
|
+
end
|
31
|
+
|
32
|
+
def run_show(opts={})
|
33
|
+
opts[:doc] ||= {"title" => "foo", "body" => "bar"}
|
34
|
+
opts[:req] ||= {}
|
35
|
+
opts[:design] ||= "string"
|
36
|
+
|
37
|
+
@context.run(["ddoc", "foo", ["shows", opts[:design]], [opts[:doc], opts[:req]]])
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should process string" do
|
41
|
+
result = run_show
|
42
|
+
expect(result).to be == ["resp", {"body" => "foo - bar"}]
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should process hash" do
|
46
|
+
result = run_show({:design => "hash"})
|
47
|
+
expect(result).to be == ["resp", {"body" => "foo - bar", "headers" => {"X-Foo" => "Bar"}, "code" => 200}]
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should give an error" do
|
51
|
+
result = run_show({:design => "error"})
|
52
|
+
expect(result[0...3]).to be == ["error", "StandardError", "error message"]
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env rspec
|
2
|
+
|
3
|
+
require_relative 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe "Document Validations" do
|
6
|
+
before :all do
|
7
|
+
@shell = Relaxo::QueryServer::MockShell.new
|
8
|
+
@context = Relaxo::QueryServer::Context.new(@shell, safe: 2)
|
9
|
+
end
|
10
|
+
|
11
|
+
def create_design_document name, attributes
|
12
|
+
@context.run ['ddoc', 'new', name, attributes]
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should run update function" do
|
16
|
+
create_design_document "test", {
|
17
|
+
"updates" => {
|
18
|
+
"bar" => %q{
|
19
|
+
lambda{|doc, request| doc['updated'] = true; [doc, 'OK']}
|
20
|
+
}
|
21
|
+
}
|
22
|
+
}
|
23
|
+
|
24
|
+
document = {"foo" => "bar"}
|
25
|
+
response = @context.run ['ddoc', 'test', ['updates', 'bar'], [document, {'method' => 'POST'}]]
|
26
|
+
|
27
|
+
expect(response).to be == ["up", document.update('updated' => true), {'body' => 'OK'}]
|
28
|
+
end
|
29
|
+
end
|
@@ -1,8 +1,18 @@
|
|
1
|
+
#!/usr/bin/env rspec
|
1
2
|
|
2
|
-
|
3
|
+
require_relative 'spec_helper'
|
3
4
|
|
4
|
-
|
5
|
-
|
5
|
+
RSpec.describe "Document Validations" do
|
6
|
+
before :all do
|
7
|
+
@shell = Relaxo::QueryServer::MockShell.new
|
8
|
+
@context = Relaxo::QueryServer::Context.new(@shell, safe: 2)
|
9
|
+
end
|
10
|
+
|
11
|
+
def create_design_document name, attributes
|
12
|
+
@context.run ['ddoc', 'new', name, attributes]
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should validate document updates" do
|
6
16
|
create_design_document "test", {
|
7
17
|
"validate_doc_update" => %q{
|
8
18
|
lambda{|new_document, old_document, user_context|
|
@@ -14,9 +24,9 @@ class ValidationsTest < ContextualTestCase
|
|
14
24
|
}
|
15
25
|
|
16
26
|
response = @context.run ['ddoc', 'test', ['validate_doc_update'], [{'good' => true}, {'good' => true}, {}]]
|
17
|
-
|
27
|
+
expect(response).to be == 1
|
18
28
|
|
19
29
|
response = @context.run ['ddoc', 'test', ['validate_doc_update'], [{'bad' => true}, {'good' => true}, {}]]
|
20
|
-
|
30
|
+
expect(response).to be == {'forbidden' => 'bad'}
|
21
31
|
end
|
22
32
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#!/usr/bin/env rspec
|
2
|
+
|
3
|
+
require_relative 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe "View Functions" do
|
6
|
+
before :all do
|
7
|
+
@shell = Relaxo::QueryServer::MockShell.new
|
8
|
+
@context = Relaxo::QueryServer::Context.new(@shell, safe: 2)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should compile function" do
|
12
|
+
response = @context.run ["add_fun", "lambda {|doc| emit(nil, nil)}"]
|
13
|
+
expect(response).to be true
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should have syntax error" do
|
17
|
+
response = @context.run ["add_fun", "lambda {"]
|
18
|
+
expect(response[0]).to be == "error"
|
19
|
+
expect(response[1]).to be == "SyntaxError"
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should fail on non-function" do
|
23
|
+
response = @context.run ["add_fun", "10"]
|
24
|
+
expect(response[0]).to be == "error"
|
25
|
+
expect(response[1]).to be == "Relaxo::QueryServer::CompilationError"
|
26
|
+
end
|
27
|
+
end
|
metadata
CHANGED
@@ -1,90 +1,103 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: relaxo-query-server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Williams
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-04-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: relaxo
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
20
|
-
type: :
|
19
|
+
version: 0.4.4
|
20
|
+
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 0.4.4
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: json
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.8'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.8'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rest-client
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
32
46
|
- !ruby/object:Gem::Version
|
33
47
|
version: '0'
|
34
|
-
type: :
|
48
|
+
type: :runtime
|
35
49
|
prerelease: false
|
36
50
|
version_requirements: !ruby/object:Gem::Requirement
|
37
51
|
requirements:
|
38
|
-
- -
|
52
|
+
- - ">="
|
39
53
|
- !ruby/object:Gem::Version
|
40
54
|
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
56
|
+
name: rspec
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
|
-
- - ~>
|
59
|
+
- - "~>"
|
46
60
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
48
|
-
type: :
|
61
|
+
version: 3.1.0
|
62
|
+
type: :development
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
|
-
- - ~>
|
66
|
+
- - "~>"
|
53
67
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
68
|
+
version: 3.1.0
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
70
|
+
name: bundler
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
|
-
- - ~>
|
73
|
+
- - "~>"
|
60
74
|
- !ruby/object:Gem::Version
|
61
|
-
version: 1.
|
62
|
-
type: :
|
75
|
+
version: '1.3'
|
76
|
+
type: :development
|
63
77
|
prerelease: false
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
66
|
-
- - ~>
|
80
|
+
- - "~>"
|
67
81
|
- !ruby/object:Gem::Version
|
68
|
-
version: 1.
|
82
|
+
version: '1.3'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
84
|
+
name: rake
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
|
-
- -
|
87
|
+
- - ">="
|
74
88
|
- !ruby/object:Gem::Version
|
75
89
|
version: '0'
|
76
|
-
type: :
|
90
|
+
type: :development
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
80
|
-
- -
|
94
|
+
- - ">="
|
81
95
|
- !ruby/object:Gem::Version
|
82
96
|
version: '0'
|
83
|
-
description:
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
servers.\n"
|
97
|
+
description: "\tRelaxo Query Server is a query server for CouchDB which provides full\n\tsupport
|
98
|
+
for map/reduce functionality using Ruby code. It's main purpose\n\tis to provide
|
99
|
+
a consistent backend for Ruby based clients to CouchDB.\n\tIn practice, it allows
|
100
|
+
code to be shared between Ruby based client \n\tapplications and CouchDB servers.\n"
|
88
101
|
email:
|
89
102
|
- samuel.williams@oriontransfer.co.nz
|
90
103
|
executables:
|
@@ -92,10 +105,12 @@ executables:
|
|
92
105
|
extensions: []
|
93
106
|
extra_rdoc_files: []
|
94
107
|
files:
|
95
|
-
- .gitignore
|
96
|
-
- .
|
108
|
+
- ".gitignore"
|
109
|
+
- ".simplecov"
|
110
|
+
- ".travis.yml"
|
97
111
|
- Gemfile
|
98
112
|
- README.md
|
113
|
+
- Rakefile
|
99
114
|
- bin/relaxo-query-server
|
100
115
|
- lib/relaxo/query_server.rb
|
101
116
|
- lib/relaxo/query_server/context.rb
|
@@ -106,18 +121,17 @@ files:
|
|
106
121
|
- lib/relaxo/query_server/reducer.rb
|
107
122
|
- lib/relaxo/query_server/shell.rb
|
108
123
|
- lib/relaxo/query_server/version.rb
|
109
|
-
- rakefile.rb
|
110
124
|
- relaxo-query-server.gemspec
|
111
|
-
-
|
112
|
-
-
|
113
|
-
-
|
114
|
-
-
|
115
|
-
-
|
116
|
-
-
|
117
|
-
-
|
118
|
-
-
|
119
|
-
-
|
120
|
-
-
|
125
|
+
- spec/relaxo/query_server/filters_spec.rb
|
126
|
+
- spec/relaxo/query_server/libraries_spec.rb
|
127
|
+
- spec/relaxo/query_server/lists_spec.rb
|
128
|
+
- spec/relaxo/query_server/map_spec.rb
|
129
|
+
- spec/relaxo/query_server/reduce_spec.rb
|
130
|
+
- spec/relaxo/query_server/shows_spec.rb
|
131
|
+
- spec/relaxo/query_server/spec_helper.rb
|
132
|
+
- spec/relaxo/query_server/updates_spec.rb
|
133
|
+
- spec/relaxo/query_server/validations_spec.rb
|
134
|
+
- spec/relaxo/query_server/view_spec.rb
|
121
135
|
homepage: ''
|
122
136
|
licenses:
|
123
137
|
- MIT
|
@@ -128,29 +142,29 @@ require_paths:
|
|
128
142
|
- lib
|
129
143
|
required_ruby_version: !ruby/object:Gem::Requirement
|
130
144
|
requirements:
|
131
|
-
- -
|
145
|
+
- - ">="
|
132
146
|
- !ruby/object:Gem::Version
|
133
147
|
version: '0'
|
134
148
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
135
149
|
requirements:
|
136
|
-
- -
|
150
|
+
- - ">="
|
137
151
|
- !ruby/object:Gem::Version
|
138
152
|
version: '0'
|
139
153
|
requirements: []
|
140
154
|
rubyforge_project:
|
141
|
-
rubygems_version: 2.
|
155
|
+
rubygems_version: 2.2.2
|
142
156
|
signing_key:
|
143
157
|
specification_version: 4
|
144
158
|
summary: Relaxo Query Server provides support for executing CouchDB functions using
|
145
159
|
Ruby.
|
146
160
|
test_files:
|
147
|
-
-
|
148
|
-
-
|
149
|
-
-
|
150
|
-
-
|
151
|
-
-
|
152
|
-
-
|
153
|
-
-
|
154
|
-
-
|
155
|
-
-
|
156
|
-
-
|
161
|
+
- spec/relaxo/query_server/filters_spec.rb
|
162
|
+
- spec/relaxo/query_server/libraries_spec.rb
|
163
|
+
- spec/relaxo/query_server/lists_spec.rb
|
164
|
+
- spec/relaxo/query_server/map_spec.rb
|
165
|
+
- spec/relaxo/query_server/reduce_spec.rb
|
166
|
+
- spec/relaxo/query_server/shows_spec.rb
|
167
|
+
- spec/relaxo/query_server/spec_helper.rb
|
168
|
+
- spec/relaxo/query_server/updates_spec.rb
|
169
|
+
- spec/relaxo/query_server/validations_spec.rb
|
170
|
+
- spec/relaxo/query_server/view_spec.rb
|
data/rakefile.rb
DELETED
data/test/helper.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
|
2
|
-
$LOAD_PATH.unshift File.expand_path("../../lib/", __FILE__)
|
3
|
-
|
4
|
-
require 'rubygems'
|
5
|
-
require 'test/unit'
|
6
|
-
require 'stringio'
|
7
|
-
|
8
|
-
require "relaxo/json"
|
9
|
-
require "relaxo/query_server"
|
10
|
-
|
11
|
-
class Test::Unit::TestCase
|
12
|
-
def self.abstract_test_case!
|
13
|
-
self.class_eval do
|
14
|
-
def test_default
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
class ContextualTestCase < Test::Unit::TestCase
|
21
|
-
abstract_test_case!
|
22
|
-
|
23
|
-
def setup_context(options)
|
24
|
-
@shell = Relaxo::QueryServer::MockShell.new
|
25
|
-
@context = Relaxo::QueryServer::Context.new(@shell, options)
|
26
|
-
end
|
27
|
-
|
28
|
-
def create_design_document name, attributes
|
29
|
-
@context.run ['ddoc', 'new', name, attributes]
|
30
|
-
end
|
31
|
-
|
32
|
-
def setup
|
33
|
-
setup_context :safe => 2
|
34
|
-
end
|
35
|
-
|
36
|
-
def teardown
|
37
|
-
end
|
38
|
-
end
|
data/test/test_filters.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
|
2
|
-
require 'helper'
|
3
|
-
|
4
|
-
class FiltersTest < ContextualTestCase
|
5
|
-
BASIC = "lambda{|doc, req| doc['good'] == true}"
|
6
|
-
|
7
|
-
def run_filter(opts={})
|
8
|
-
opts[:docs] ||= []
|
9
|
-
opts[:req] ||= {}
|
10
|
-
|
11
|
-
@context.run ["ddoc", "foo", ["filters", "basic"], [opts[:docs], opts[:req]]]
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_filters_updated
|
15
|
-
@context.run ["ddoc", "new", "foo", {"filters" => {"basic" => BASIC}}]
|
16
|
-
|
17
|
-
docs = (1..3).map do |i|
|
18
|
-
{"good" => i.odd?}
|
19
|
-
end
|
20
|
-
|
21
|
-
results = run_filter({:docs => docs})
|
22
|
-
assert_equal [true, [true, false, true]], results
|
23
|
-
end
|
24
|
-
end
|
data/test/test_lists.rb
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
|
2
|
-
require 'helper'
|
3
|
-
|
4
|
-
class ListsTest < ContextualTestCase
|
5
|
-
ENTIRE = <<-RUBY
|
6
|
-
lambda{|head,request|
|
7
|
-
send "<ul>"
|
8
|
-
each do |row|
|
9
|
-
send "<li>" + row['count'] + "</li>"
|
10
|
-
end
|
11
|
-
send "</ul>"
|
12
|
-
}
|
13
|
-
RUBY
|
14
|
-
|
15
|
-
def setup
|
16
|
-
super
|
17
|
-
|
18
|
-
@rows = [
|
19
|
-
["list_row", {"count"=>"Neko"}],
|
20
|
-
["list_row", {"count"=>"Nezumi"}],
|
21
|
-
["list_row", {"count"=>"Zoe"}],
|
22
|
-
["list_end"]
|
23
|
-
]
|
24
|
-
end
|
25
|
-
|
26
|
-
def test_lists_rows
|
27
|
-
create_design_document "test", {
|
28
|
-
'lists' => {
|
29
|
-
'entire' => ENTIRE
|
30
|
-
}
|
31
|
-
}
|
32
|
-
|
33
|
-
@rows.each {|row| @shell.input << row}
|
34
|
-
|
35
|
-
result = @context.run ['ddoc', 'test', ['lists', 'entire'], [{}, {}]]
|
36
|
-
|
37
|
-
assert_equal [
|
38
|
-
["start", ["<ul>"], {:headers=>{}}],
|
39
|
-
["chunks", ["<li>Neko</li>"]],
|
40
|
-
["chunks", ["<li>Nezumi</li>"]],
|
41
|
-
["chunks", ["<li>Zoe</li>"]]
|
42
|
-
], @shell.output
|
43
|
-
|
44
|
-
assert_equal ["end", ["</ul>"]], result
|
45
|
-
end
|
46
|
-
end
|
data/test/test_map.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
|
2
|
-
require 'helper'
|
3
|
-
|
4
|
-
class MapTest < ContextualTestCase
|
5
|
-
def test_map
|
6
|
-
response = @context.run ["add_fun", "lambda{|doc| emit('foo', doc['a']); emit('bar', doc['a'])}"]
|
7
|
-
assert_equal true, response
|
8
|
-
|
9
|
-
response = @context.run ["add_fun", "lambda{|doc| emit('baz', doc['a'])}"]
|
10
|
-
assert_equal true, response
|
11
|
-
|
12
|
-
response = @context.run(["map_doc", {"a" => "b"}])
|
13
|
-
expected = [
|
14
|
-
[["foo", "b"], ["bar", "b"]],
|
15
|
-
[["baz", "b"]]
|
16
|
-
]
|
17
|
-
|
18
|
-
assert_equal expected, response
|
19
|
-
end
|
20
|
-
end
|
data/test/test_reduce.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
|
2
|
-
require 'helper'
|
3
|
-
|
4
|
-
class ReduceTest < ContextualTestCase
|
5
|
-
SUM = "lambda{|k,v,r| v.inject &:+ }"
|
6
|
-
CONCAT = "lambda{|k,v,r| r ? v.join('_') : v.join(':') }"
|
7
|
-
|
8
|
-
def test_reduce
|
9
|
-
response = @context.run ["reduce", [SUM, CONCAT], (0...10).map{|i|[i,i*2]}]
|
10
|
-
assert_equal [true, [90, "0:2:4:6:8:10:12:14:16:18"]], response
|
11
|
-
|
12
|
-
response = @context.run ["rereduce", [SUM, CONCAT], (0...10).map{|i|i}]
|
13
|
-
assert_equal [true, [45, "0_1_2_3_4_5_6_7_8_9"]], response
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_reduce_libraries
|
17
|
-
library_code = %q{
|
18
|
-
def sum(values)
|
19
|
-
values.inject(&:+)
|
20
|
-
end
|
21
|
-
}
|
22
|
-
|
23
|
-
reduce_function = %q{
|
24
|
-
foo = load('foo')
|
25
|
-
|
26
|
-
lambda {|k,v,r|
|
27
|
-
puts v.inspect
|
28
|
-
foo.sum(v)
|
29
|
-
}
|
30
|
-
}
|
31
|
-
|
32
|
-
response = @context.run ['add_lib', {'foo' => library_code}]
|
33
|
-
assert_equal true, response
|
34
|
-
|
35
|
-
response = @context.run ['reduce', [reduce_function], (0...10).map{|i|[i,i]}]
|
36
|
-
assert_equal [true, [45]], response
|
37
|
-
end
|
38
|
-
end
|
data/test/test_shows.rb
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
|
2
|
-
require 'helper'
|
3
|
-
|
4
|
-
class ShowsTest < ContextualTestCase
|
5
|
-
STRING = "lambda{|doc, req| [doc['title'], doc['body']].join(' - ') }"
|
6
|
-
HASH = <<-EOF
|
7
|
-
lambda{|doc, req|
|
8
|
-
resp = {"code" => 200, "headers" => {"X-Foo" => "Bar"}}
|
9
|
-
resp["body"] = [doc['title'], doc['body']].join(' - ')
|
10
|
-
resp
|
11
|
-
}
|
12
|
-
EOF
|
13
|
-
ERROR = "lambda{|doc,req| raise StandardError.new('error message') }"
|
14
|
-
|
15
|
-
def setup
|
16
|
-
super
|
17
|
-
|
18
|
-
@context.run ["ddoc", "new", "foo", {
|
19
|
-
"shows" => {
|
20
|
-
"string" => STRING,
|
21
|
-
"hash" => HASH,
|
22
|
-
"error" => ERROR
|
23
|
-
}
|
24
|
-
}
|
25
|
-
]
|
26
|
-
end
|
27
|
-
|
28
|
-
def run_show(opts={})
|
29
|
-
opts[:doc] ||= {"title" => "foo", "body" => "bar"}
|
30
|
-
opts[:req] ||= {}
|
31
|
-
opts[:design] ||= "string"
|
32
|
-
|
33
|
-
@context.run(["ddoc", "foo", ["shows", opts[:design]], [opts[:doc], opts[:req]]])
|
34
|
-
end
|
35
|
-
|
36
|
-
def test_string
|
37
|
-
result = run_show
|
38
|
-
expected = ["resp", {"body" => "foo - bar"}]
|
39
|
-
assert_equal expected, result
|
40
|
-
end
|
41
|
-
|
42
|
-
def test_hash
|
43
|
-
result = run_show({:design => "hash"})
|
44
|
-
expected = ["resp", {"body" => "foo - bar", "headers" => {"X-Foo" => "Bar"}, "code" => 200}]
|
45
|
-
assert_equal expected, result
|
46
|
-
end
|
47
|
-
|
48
|
-
def test_error
|
49
|
-
result = run_show({:design => "error"})
|
50
|
-
expected = ["error", "StandardError", "error message"]
|
51
|
-
assert_equal expected, result[0...3]
|
52
|
-
end
|
53
|
-
end
|
data/test/test_updates.rb
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
|
2
|
-
require 'helper'
|
3
|
-
|
4
|
-
class UpdatesTest < ContextualTestCase
|
5
|
-
def test_compiles_functions
|
6
|
-
create_design_document "test", {
|
7
|
-
"updates" => {
|
8
|
-
"bar" => %q{
|
9
|
-
lambda{|doc, request| doc['updated'] = true; [doc, 'OK']}
|
10
|
-
}
|
11
|
-
}
|
12
|
-
}
|
13
|
-
|
14
|
-
document = {"foo" => "bar"}
|
15
|
-
response = @context.run ['ddoc', 'test', ['updates', 'bar'], [document, {'method' => 'POST'}]]
|
16
|
-
|
17
|
-
assert_equal ["up", document.update('updated' => true), {'body' => 'OK'}], response
|
18
|
-
end
|
19
|
-
end
|
data/test/test_views.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
|
2
|
-
require 'helper'
|
3
|
-
|
4
|
-
class ViewsTest < ContextualTestCase
|
5
|
-
def test_compiles_functions
|
6
|
-
response = @context.run ["add_fun", "lambda {|doc| emit(nil, nil)}"]
|
7
|
-
assert_equal true, response
|
8
|
-
|
9
|
-
response = @context.run ["add_fun", "lambda {"]
|
10
|
-
assert_equal "error", response[0]
|
11
|
-
assert_equal "SyntaxError", response[1]
|
12
|
-
|
13
|
-
response = @context.run ["add_fun", "10"]
|
14
|
-
assert_equal "error", response[0]
|
15
|
-
assert_equal "Relaxo::QueryServer::CompilationError", response[1]
|
16
|
-
end
|
17
|
-
end
|