relaxdb 0.5 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.textile +3 -0
- data/Rakefile +2 -3
- data/lib/relaxdb.rb +0 -1
- data/lib/relaxdb/document.rb +5 -5
- data/lib/relaxdb/extlib.rb +1 -1
- data/lib/relaxdb/net_http_server.rb +1 -19
- metadata +14 -28
- data/spec/all_delegator_spec.rb +0 -52
- data/spec/qpaginate_spec.rb +0 -88
- data/spec/view_by_spec.rb +0 -84
data/README.textile
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
h3. What's New?
|
2
2
|
|
3
|
+
* 2010-05-04
|
4
|
+
** RelaxDB 0.5 released. This is a leaner version of RelaxDB with significant performance improvements and breaking changes. See the "release notes":http://github.com/paulcarey/relaxdb/blob/master/RELEASE_NOTES.textile for upgrading notes.
|
5
|
+
|
3
6
|
* 2010-04-10
|
4
7
|
** RelaxDB 0.4 released. Supports Ruby 1.9.1 and CouchDB 0.11.0.
|
5
8
|
** Auto-generated views no longer emit the document as a value by default
|
data/Rakefile
CHANGED
@@ -22,9 +22,8 @@ spec = Gem::Specification.new do |s|
|
|
22
22
|
s.email = EMAIL
|
23
23
|
s.homepage = HOMEPAGE
|
24
24
|
|
25
|
-
s.add_dependency "extlib", "
|
26
|
-
s.add_dependency "json"
|
27
|
-
s.add_dependency "uuid"
|
25
|
+
s.add_dependency "extlib", "~> 0.9.4"
|
26
|
+
s.add_dependency "json", "~> 1.4"
|
28
27
|
|
29
28
|
s.require_path = 'lib'
|
30
29
|
s.autorequire = PLUGIN
|
data/lib/relaxdb.rb
CHANGED
data/lib/relaxdb/document.rb
CHANGED
@@ -125,11 +125,11 @@ module RelaxDB
|
|
125
125
|
if writers
|
126
126
|
writers.each do |prop, writer|
|
127
127
|
current_val = send(prop)
|
128
|
-
|
128
|
+
begin
|
129
129
|
send("#{prop}=", writer.call(current_val, self))
|
130
|
-
|
131
|
-
|
132
|
-
|
130
|
+
rescue => e
|
131
|
+
RelaxDB.logger.error "Deriving #{prop} from #{source} raised #{e}"
|
132
|
+
end
|
133
133
|
end
|
134
134
|
end
|
135
135
|
end
|
@@ -192,7 +192,7 @@ module RelaxDB
|
|
192
192
|
|
193
193
|
alias_method :to_s, :inspect
|
194
194
|
|
195
|
-
def to_json
|
195
|
+
def to_json(*args)
|
196
196
|
ref_rels = self.class.references_rels.map { |k, v| k.to_s }
|
197
197
|
@data.delete_if { |k,v| ref_rels.include? k }
|
198
198
|
|
data/lib/relaxdb/extlib.rb
CHANGED
@@ -16,7 +16,7 @@ class Time
|
|
16
16
|
# Ensure that all Times are stored as UTC
|
17
17
|
# Times in the following format may be passed directly to
|
18
18
|
# Date.new in a JavaScript runtime
|
19
|
-
def to_json(
|
19
|
+
def to_json(*args)
|
20
20
|
utc
|
21
21
|
%Q("#{strftime "%Y/%m/%d %H:%M:%S +0000"}")
|
22
22
|
end
|
@@ -5,7 +5,6 @@ module RelaxDB
|
|
5
5
|
def initialize(host, port)
|
6
6
|
@host = host
|
7
7
|
@port = port
|
8
|
-
@cx = Net::HTTP.start(@host, @port)
|
9
8
|
end
|
10
9
|
|
11
10
|
def delete(uri)
|
@@ -31,26 +30,9 @@ module RelaxDB
|
|
31
30
|
end
|
32
31
|
|
33
32
|
def request(req)
|
34
|
-
res = Net::HTTP.start(@host, @port) {
|
33
|
+
res = Net::HTTP.start(@host, @port) {|http|
|
35
34
|
http.request(req)
|
36
35
|
}
|
37
|
-
|
38
|
-
#
|
39
|
-
# When using this chunk of code, as opposed to the one above, CouchDB
|
40
|
-
# started throwing emfile errors. I can't imagine they're related,
|
41
|
-
# but worth noting nonetheless. On second thoughts, I think they are!
|
42
|
-
#
|
43
|
-
# The tests don't close the cx after they run - just open new ones, this
|
44
|
-
# could be causing CouchDB to run out of handles.
|
45
|
-
#
|
46
|
-
# begin
|
47
|
-
# # @cx = Net::HTTP.start(@host, @port) unless @cx.active?
|
48
|
-
# res = @cx.request(req)
|
49
|
-
# rescue
|
50
|
-
# @cx = Net::HTTP.start(@host, @port)
|
51
|
-
# res = @cx.request(req)
|
52
|
-
# end
|
53
|
-
|
54
36
|
if (not res.kind_of?(Net::HTTPSuccess))
|
55
37
|
handle_error(req, res)
|
56
38
|
end
|
metadata
CHANGED
@@ -5,7 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 5
|
8
|
-
|
8
|
+
- 1
|
9
|
+
version: 0.5.1
|
9
10
|
platform: ruby
|
10
11
|
authors:
|
11
12
|
- Paul Carey
|
@@ -13,7 +14,7 @@ autorequire: relaxdb
|
|
13
14
|
bindir: bin
|
14
15
|
cert_chain: []
|
15
16
|
|
16
|
-
date: 2010-04
|
17
|
+
date: 2010-05-04 00:00:00 +01:00
|
17
18
|
default_executable:
|
18
19
|
dependencies:
|
19
20
|
- !ruby/object:Gem::Dependency
|
@@ -21,7 +22,7 @@ dependencies:
|
|
21
22
|
prerelease: false
|
22
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
23
24
|
requirements:
|
24
|
-
- -
|
25
|
+
- - ~>
|
25
26
|
- !ruby/object:Gem::Version
|
26
27
|
segments:
|
27
28
|
- 0
|
@@ -35,64 +36,51 @@ dependencies:
|
|
35
36
|
prerelease: false
|
36
37
|
requirement: &id002 !ruby/object:Gem::Requirement
|
37
38
|
requirements:
|
38
|
-
- -
|
39
|
+
- - ~>
|
39
40
|
- !ruby/object:Gem::Version
|
40
41
|
segments:
|
41
|
-
-
|
42
|
-
|
42
|
+
- 1
|
43
|
+
- 4
|
44
|
+
version: "1.4"
|
43
45
|
type: :runtime
|
44
46
|
version_requirements: *id002
|
45
|
-
|
46
|
-
name: uuid
|
47
|
-
prerelease: false
|
48
|
-
requirement: &id003 !ruby/object:Gem::Requirement
|
49
|
-
requirements:
|
50
|
-
- - ">="
|
51
|
-
- !ruby/object:Gem::Version
|
52
|
-
segments:
|
53
|
-
- 0
|
54
|
-
version: "0"
|
55
|
-
type: :runtime
|
56
|
-
version_requirements: *id003
|
57
|
-
description: RelaxDB provides a simple interface to CouchDB
|
47
|
+
description:
|
58
48
|
email: paul.p.carey@gmail.com
|
59
49
|
executables: []
|
60
50
|
|
61
51
|
extensions: []
|
62
52
|
|
63
|
-
extra_rdoc_files:
|
64
|
-
|
65
|
-
- LICENSE
|
53
|
+
extra_rdoc_files: []
|
54
|
+
|
66
55
|
files:
|
67
56
|
- LICENSE
|
68
57
|
- README.textile
|
69
58
|
- readme.rb
|
70
59
|
- Rakefile
|
71
60
|
- docs/spec_results.html
|
72
|
-
- lib/more/grapher.rb
|
73
61
|
- lib/relaxdb/all_delegator.rb
|
74
62
|
- lib/relaxdb/design_doc.rb
|
75
63
|
- lib/relaxdb/document.rb
|
76
64
|
- lib/relaxdb/extlib.rb
|
65
|
+
- lib/relaxdb/net_http_server.rb
|
77
66
|
- lib/relaxdb/migration.rb
|
78
67
|
- lib/relaxdb/migration_version.rb
|
79
|
-
- lib/relaxdb/net_http_server.rb
|
80
68
|
- lib/relaxdb/paginate_params.rb
|
81
69
|
- lib/relaxdb/paginator.rb
|
82
70
|
- lib/relaxdb/query.rb
|
83
71
|
- lib/relaxdb/references_proxy.rb
|
84
72
|
- lib/relaxdb/relaxdb.rb
|
85
73
|
- lib/relaxdb/server.rb
|
86
|
-
- lib/relaxdb/taf2_curb_server.rb
|
87
74
|
- lib/relaxdb/uuid_generator.rb
|
75
|
+
- lib/relaxdb/taf2_curb_server.rb
|
88
76
|
- lib/relaxdb/validators.rb
|
89
77
|
- lib/relaxdb/view_by_delegator.rb
|
90
78
|
- lib/relaxdb/view_object.rb
|
91
79
|
- lib/relaxdb/view_result.rb
|
92
80
|
- lib/relaxdb/view_uploader.rb
|
93
81
|
- lib/relaxdb/views.rb
|
82
|
+
- lib/more/grapher.rb
|
94
83
|
- lib/relaxdb.rb
|
95
|
-
- spec/all_delegator_spec.rb
|
96
84
|
- spec/callbacks_spec.rb
|
97
85
|
- spec/derived_properties_spec.rb
|
98
86
|
- spec/design_doc_spec.rb
|
@@ -102,7 +90,6 @@ files:
|
|
102
90
|
- spec/migration_version_spec.rb
|
103
91
|
- spec/paginate_params_spec.rb
|
104
92
|
- spec/paginate_spec.rb
|
105
|
-
- spec/qpaginate_spec.rb
|
106
93
|
- spec/query_spec.rb
|
107
94
|
- spec/references_proxy_spec.rb
|
108
95
|
- spec/relaxdb_spec.rb
|
@@ -111,7 +98,6 @@ files:
|
|
111
98
|
- spec/spec_helper.rb
|
112
99
|
- spec/spec_models.rb
|
113
100
|
- spec/uuid_generator_spec.rb
|
114
|
-
- spec/view_by_spec.rb
|
115
101
|
- spec/view_docs_by_spec.rb
|
116
102
|
- spec/view_object_spec.rb
|
117
103
|
has_rdoc: true
|
data/spec/all_delegator_spec.rb
DELETED
@@ -1,52 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
-
require File.dirname(__FILE__) + '/spec_models.rb'
|
3
|
-
|
4
|
-
describe RelaxDB::AllDelegator do
|
5
|
-
|
6
|
-
before(:all) do
|
7
|
-
setup_test_db
|
8
|
-
end
|
9
|
-
|
10
|
-
describe "size" do
|
11
|
-
|
12
|
-
it "should return the total count for a given class" do
|
13
|
-
docs = (1..101).map { |i| Primitives.new :num => i }
|
14
|
-
RelaxDB.bulk_save! *docs
|
15
|
-
Primitives.all.size.should == 101
|
16
|
-
end
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
describe "all" do
|
21
|
-
|
22
|
-
it "should return the ids for the given class" do
|
23
|
-
docs = (1..3).map { |i| Primitives.new :_id => "p#{i}" }
|
24
|
-
RelaxDB.bulk_save! *docs
|
25
|
-
Primitives.all.should == %w(p1 p2 p3)
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
|
-
describe "load" do
|
31
|
-
|
32
|
-
it "should load all docs for the given class" do
|
33
|
-
docs = (1..3).map { |i| Primitives.new :num => i }
|
34
|
-
RelaxDB.bulk_save! *docs
|
35
|
-
pms = Primitives.all.load!
|
36
|
-
pms.map { |p| p.num }.inject(&:+).should == 6
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|
40
|
-
|
41
|
-
describe "destroy" do
|
42
|
-
|
43
|
-
it "should destroy all docs for the given class" do
|
44
|
-
docs = (1..3).map { |i| Primitives.new :num => i }
|
45
|
-
RelaxDB.bulk_save! *docs
|
46
|
-
Primitives.all.destroy!
|
47
|
-
Primitives.all.load!.should == []
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
end
|
data/spec/qpaginate_spec.rb
DELETED
@@ -1,88 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
-
require File.dirname(__FILE__) + '/spec_models.rb'
|
3
|
-
|
4
|
-
describe "RelaxDB Pagination" do
|
5
|
-
|
6
|
-
before(:each) do
|
7
|
-
setup_test_db
|
8
|
-
|
9
|
-
letters = [
|
10
|
-
["a", 1], ["a", 2], ["a", 3],
|
11
|
-
["b", 1], ["b", 2], ["b", 3], ["b", 4], ["b", 5],
|
12
|
-
["c", 1], ["c", 2]
|
13
|
-
].map { |o| Letter.new :letter => o[0], :number => o[1], :_id => "#{o[0]}#{o[1]}" }
|
14
|
-
|
15
|
-
RelaxDB.bulk_save *letters
|
16
|
-
end
|
17
|
-
|
18
|
-
# helper function
|
19
|
-
def s(letters)
|
20
|
-
letters.map { |l| "#{l.letter}#{l.number}"}.join(", ")
|
21
|
-
end
|
22
|
-
|
23
|
-
def n(letters)
|
24
|
-
letters.map { |l| "#{l.number}"}.join(", ")
|
25
|
-
end
|
26
|
-
|
27
|
-
describe "functional tests" do
|
28
|
-
|
29
|
-
it "should navigate through a series" do
|
30
|
-
query = lambda do |page_params|
|
31
|
-
RelaxDB.qpaginate_view "Letter_by_letter_and_number", :page_params => page_params,
|
32
|
-
:startkey => ["a"], :endkey => ["a",{}], :limit => 2,
|
33
|
-
:attributes => [:letter, :number]
|
34
|
-
end
|
35
|
-
|
36
|
-
letters = query.call({})
|
37
|
-
s(letters).should == "a1, a2"
|
38
|
-
letters.prev_params.should be_false
|
39
|
-
|
40
|
-
letters = query.call(letters.next_params)
|
41
|
-
s(letters).should == "a3"
|
42
|
-
letters.next_params.should be_false
|
43
|
-
|
44
|
-
letters = query.call(letters.prev_params)
|
45
|
-
s(letters).should == "a1, a2"
|
46
|
-
letters.next_params.should be
|
47
|
-
end
|
48
|
-
|
49
|
-
end
|
50
|
-
|
51
|
-
describe "Non emitted docs" do
|
52
|
-
|
53
|
-
before(:each) do
|
54
|
-
map = <<-FUNC
|
55
|
-
function (doc) {
|
56
|
-
if (doc.relaxdb_class === "Letter") {
|
57
|
-
emit([doc.letter, doc.number], null);
|
58
|
-
}
|
59
|
-
}
|
60
|
-
FUNC
|
61
|
-
|
62
|
-
view_name = "Letter_by_letter_and_number_v2"
|
63
|
-
RelaxDB::DesignDocument.get(RelaxDB.dd).add_map_view(view_name, map).save
|
64
|
-
end
|
65
|
-
|
66
|
-
it "should navigate through a series when 1 emitted as val" do
|
67
|
-
query = lambda do |page_params|
|
68
|
-
RelaxDB.qpaginate_docs "Letter_by_letter_and_number_v2", :page_params => page_params,
|
69
|
-
:startkey => ["a"], :endkey => ["a",{}], :limit => 2,
|
70
|
-
:attributes => [:letter, :number]
|
71
|
-
end
|
72
|
-
|
73
|
-
letters = query.call({})
|
74
|
-
s(letters).should == "a1, a2"
|
75
|
-
letters.prev_params.should be_false
|
76
|
-
|
77
|
-
letters = query.call(letters.next_params)
|
78
|
-
s(letters).should == "a3"
|
79
|
-
letters.next_params.should be_false
|
80
|
-
|
81
|
-
letters = query.call(letters.prev_params)
|
82
|
-
s(letters).should == "a1, a2"
|
83
|
-
letters.next_params.should be
|
84
|
-
end
|
85
|
-
|
86
|
-
end
|
87
|
-
|
88
|
-
end
|
data/spec/view_by_spec.rb
DELETED
@@ -1,84 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
-
require File.dirname(__FILE__) + '/spec_models.rb'
|
3
|
-
|
4
|
-
describe "view_by" do
|
5
|
-
|
6
|
-
before(:each) do
|
7
|
-
setup_test_db
|
8
|
-
|
9
|
-
docs = (1..10).map { |i| Primitives.new :_id => "id#{i}", :str => i.to_s }
|
10
|
-
RelaxDB.bulk_save! *docs
|
11
|
-
end
|
12
|
-
|
13
|
-
it "should return an array of doc ids for a key" do
|
14
|
-
docs = Primitives.by_str :key => "5"
|
15
|
-
docs.first.should == "id5"
|
16
|
-
end
|
17
|
-
|
18
|
-
it "should obey startkey and endkey directives" do
|
19
|
-
docs = Primitives.by_str :startkey => "3", :endkey => "6"
|
20
|
-
docs.should == %w(id3 id4 id5 id6)
|
21
|
-
end
|
22
|
-
|
23
|
-
it "should return all when none specified" do
|
24
|
-
docs = Primitives.by_str
|
25
|
-
docs.size.should == 10
|
26
|
-
end
|
27
|
-
|
28
|
-
it "should return arrays that behave normally" do
|
29
|
-
p1 = Primitives.by_str :key => "1"
|
30
|
-
p2 = Primitives.by_str :key => "2"
|
31
|
-
RelaxDB.load!(p1 + p2).map { |p| p.str }.join.should == "12"
|
32
|
-
end
|
33
|
-
|
34
|
-
describe "delegator" do
|
35
|
-
|
36
|
-
it "should load the returned doc ids" do
|
37
|
-
docs = Primitives.by_str :key => "5"
|
38
|
-
docs.load!.first.str.should == "5"
|
39
|
-
end
|
40
|
-
|
41
|
-
it "should load the doc for a single param" do
|
42
|
-
res = Primitives.by_str "8"
|
43
|
-
res.str.should == "8"
|
44
|
-
end
|
45
|
-
|
46
|
-
it "should return the delegator when no params given" do
|
47
|
-
docs = Primitives.by_str.load!
|
48
|
-
docs.map { |d| d.str }.join.length.should == 11
|
49
|
-
end
|
50
|
-
|
51
|
-
end
|
52
|
-
|
53
|
-
describe "request count" do
|
54
|
-
|
55
|
-
before(:each) do
|
56
|
-
RelaxDB.db.reset_req_count
|
57
|
-
end
|
58
|
-
|
59
|
-
it "should not issue any requests before accessingn the delegator" do
|
60
|
-
doc_ids = Primitives.by_str
|
61
|
-
RelaxDB.db.req_count.should == 0
|
62
|
-
end
|
63
|
-
|
64
|
-
it "should issue a single request when retrieving ids only" do
|
65
|
-
doc_ids = Primitives.by_str
|
66
|
-
doc_ids[0]
|
67
|
-
RelaxDB.db.req_count.should == 1
|
68
|
-
end
|
69
|
-
|
70
|
-
it "should make two requests when loading docs after touching ids" do
|
71
|
-
doc_ids = Primitives.by_str
|
72
|
-
doc_ids[0].should == "id1"
|
73
|
-
doc_ids.load!
|
74
|
-
RelaxDB.db.req_count.should == 2
|
75
|
-
end
|
76
|
-
|
77
|
-
it "should issue a single request when retrieving docs directly" do
|
78
|
-
Primitives.by_str.load!
|
79
|
-
RelaxDB.db.req_count.should == 1
|
80
|
-
end
|
81
|
-
|
82
|
-
end
|
83
|
-
|
84
|
-
end
|