relaxo-query-server 0.1.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
[](http://travis-ci.org/ioquatix/relaxo-query-server)
|
7
|
+
[](https://codeclimate.com/github/ioquatix/relaxo-query-server)
|
8
|
+
[](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
|