ShyCouch 0.5.0 → 0.6.0
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.
- data/Rakefile +2 -3
- data/ShyCouch.gemspec +2 -4
- data/VERSION +1 -1
- data/lib/ShyCouch.rb +64 -40
- data/lib/ShyCouch/data.rb +95 -12
- data/test/test_ShyCouch.rb +22 -0
- data/test/test_couch_document.rb +114 -15
- data/test/test_couchdb_api.rb +1 -1
- data/test/test_design_documents.rb +115 -41
- data/test/test_views.rb +23 -6
- metadata +21 -23
- data/test/old-test.rb +0 -10
- data/test/old-tests.rb +0 -89
data/Rakefile
CHANGED
@@ -31,21 +31,20 @@ Jeweler::RubygemsDotOrgTasks.new
|
|
31
31
|
require 'rake/testtask'
|
32
32
|
Rake::TestTask.new(:test) do |test|
|
33
33
|
test.libs << 'lib' << 'test'
|
34
|
-
test.pattern = 'test
|
34
|
+
test.pattern = 'test/test_ShyCouch.rb'
|
35
35
|
test.verbose = true
|
36
36
|
end
|
37
37
|
|
38
38
|
require 'rcov/rcovtask'
|
39
39
|
Rcov::RcovTask.new do |test|
|
40
40
|
test.libs << 'test'
|
41
|
-
test.pattern = 'test
|
41
|
+
test.pattern = 'test/test_ShyCouch.rb'
|
42
42
|
test.verbose = true
|
43
43
|
test.rcov_opts << '--exclude "gems/*"'
|
44
44
|
end
|
45
45
|
|
46
46
|
task :default => :test
|
47
47
|
|
48
|
-
# require 'rake/rdoctask'
|
49
48
|
require 'rdoc/task'
|
50
49
|
RDoc::Task.new do |rdoc|
|
51
50
|
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
data/ShyCouch.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{ShyCouch}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.6.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = [%q{Shy Inc.}, %q{Daniel Bryan}, %q{Cerales}]
|
12
|
-
s.date = %q{2011-09-
|
12
|
+
s.date = %q{2011-09-24}
|
13
13
|
s.description = %q{Ruby API for CouchDB, designed to work with the Camping micro-framework.}
|
14
14
|
s.email = %q{danbryan@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -30,8 +30,6 @@ Gem::Specification.new do |s|
|
|
30
30
|
"lib/ShyCouch/data.rb",
|
31
31
|
"lib/ShyCouch/fields.rb",
|
32
32
|
"test/helper.rb",
|
33
|
-
"test/old-test.rb",
|
34
|
-
"test/old-tests.rb",
|
35
33
|
"test/test_ShyCouch.rb",
|
36
34
|
"test/test_couch_document.rb",
|
37
35
|
"test/test_couchdb_api.rb",
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.6.0
|
data/lib/ShyCouch.rb
CHANGED
@@ -14,7 +14,6 @@ require 'resolv'
|
|
14
14
|
require 'rest-client'
|
15
15
|
require 'ShyRubyJS'
|
16
16
|
# require everything from the 'ShyCouch' subdirectory
|
17
|
-
# Dir.new(File.dirname(__FILE__)+'/ShyCouch').each { |f| require 'shycouch/' + f.split('.')[0] unless f == '.' or f == '..' }
|
18
17
|
require 'ShyCouch/data'
|
19
18
|
require 'ShyCouch/fields'
|
20
19
|
|
@@ -22,16 +21,18 @@ require 'ShyCouch/fields'
|
|
22
21
|
module ShyCouch
|
23
22
|
class << self
|
24
23
|
def getDB(settings)
|
25
|
-
# this is a wrapper for
|
24
|
+
# this is a wrapper for creating CouchDatabase object and testing that it can connect
|
26
25
|
database = CouchDatabase.new(settings)
|
27
26
|
puts database.connect unless database.connect["ok"] #TODO - hm
|
28
|
-
database.create unless database.
|
27
|
+
database.create! unless database.exists?
|
29
28
|
return database
|
30
29
|
end
|
31
30
|
end
|
32
31
|
attr_accessor :database
|
33
32
|
|
34
33
|
class ShyCouchError < StandardError; end
|
34
|
+
|
35
|
+
class ShyCouchDesignMissing < ShyCouchError; end
|
35
36
|
|
36
37
|
class CouchDatabase
|
37
38
|
def initialize(settings)
|
@@ -39,7 +40,7 @@ module ShyCouch
|
|
39
40
|
init(settings)
|
40
41
|
end
|
41
42
|
|
42
|
-
attr_accessor :server, :name, :host, :port, :design_documents
|
43
|
+
attr_accessor :server, :name, :host, :port, :design_documents, :designs
|
43
44
|
|
44
45
|
def connect
|
45
46
|
@server = CouchServerConnection.new({"host"=>@host, "port"=>@port, "user"=>@user, "password"=>@password, "database" => @name})
|
@@ -49,24 +50,37 @@ module ShyCouch
|
|
49
50
|
return {"ok"=>false, "message"=>"Could not connect to the couch database."}
|
50
51
|
end
|
51
52
|
end
|
52
|
-
def
|
53
|
+
def delete!
|
53
54
|
@server.delete_db(self.name)
|
54
55
|
end
|
55
56
|
def server_responds?; return @server.responds?; end
|
56
57
|
|
57
|
-
|
58
|
-
|
59
|
-
|
58
|
+
def design(design)
|
59
|
+
if design.kind_of?(ShyCouch::Data::Design)
|
60
|
+
return design_by_name(design.name)
|
61
|
+
else
|
62
|
+
return design_by_name(design)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def design_by_name(name)
|
67
|
+
@designs.each { |design| return design if design.name == name.to_s }
|
68
|
+
return nil
|
69
|
+
end
|
60
70
|
|
61
|
-
|
71
|
+
def exists?
|
72
|
+
@server.has_database?(@name)
|
73
|
+
end
|
74
|
+
def create!
|
62
75
|
@server.create_db(@name)
|
63
76
|
end
|
64
77
|
def get_document_by_id(id)
|
65
78
|
@server.get_document_by_id(@name, id)
|
66
79
|
end
|
67
|
-
|
68
|
-
|
69
|
-
|
80
|
+
|
81
|
+
def pull_design(designName)
|
82
|
+
doc = @server.get_document_by_id(@name, designName)
|
83
|
+
return ShyCouch::Data::Design.new(designName).merge! doc
|
70
84
|
end
|
71
85
|
def all_docs
|
72
86
|
get_document_by_id('_all_docs').rows.map { |doc|
|
@@ -78,27 +92,44 @@ module ShyCouch
|
|
78
92
|
end
|
79
93
|
|
80
94
|
def pull_document(document)
|
81
|
-
@server.pull_document(self.name, document)
|
95
|
+
@server.pull_document(self.name, document)
|
82
96
|
end
|
83
97
|
|
84
|
-
def push_document(document)
|
98
|
+
def push_document!(document)
|
85
99
|
@server.push_document(self.name, document)
|
86
100
|
end
|
87
101
|
|
88
|
-
def
|
89
|
-
|
102
|
+
def query_view(design_name, view_name)
|
103
|
+
queryString = "/_design/#{design_name}/_view/#{view_name}"
|
104
|
+
ShyCouch::Data::ViewResult.new(get_document_by_id(queryString))
|
105
|
+
end
|
106
|
+
|
107
|
+
def add_design(design)
|
108
|
+
throw TypeError unless design.kind_of?(ShyCouch::Data::Design)
|
109
|
+
# if the db has already stored the design, update it
|
110
|
+
if design_by_name(design.name) != nil
|
111
|
+
design_by_name(design.name) == design
|
112
|
+
end
|
113
|
+
# otherwise, add it
|
114
|
+
@designs << design
|
90
115
|
end
|
91
116
|
|
92
|
-
def
|
117
|
+
def add_designs_and_push!(*docs)
|
93
118
|
docs.each do |doc|
|
94
|
-
|
119
|
+
add_design(doc)
|
95
120
|
end
|
96
|
-
|
121
|
+
push_designs!
|
122
|
+
end
|
123
|
+
|
124
|
+
def add_design_and_push!(doc)
|
125
|
+
add_design(doc)
|
126
|
+
push_designs!
|
97
127
|
end
|
98
128
|
|
99
|
-
def
|
100
|
-
@
|
101
|
-
|
129
|
+
def push_designs!
|
130
|
+
@designs.each do |design|
|
131
|
+
# push the document and update it with the rev sent by the response
|
132
|
+
design["_rev"] = push_document!(design)["rev"]
|
102
133
|
end
|
103
134
|
end
|
104
135
|
|
@@ -112,7 +143,7 @@ module ShyCouch
|
|
112
143
|
def init(settings, design_documents = [])
|
113
144
|
db_settings = settings["db"]
|
114
145
|
@host, @port, @name, @user, @password = db_settings["host"],db_settings["port"], db_settings["name"],db_settings["user"], db_settings["password"]
|
115
|
-
@
|
146
|
+
@designs = ShyCouch::Data::CouchDocumentCollection.new
|
116
147
|
@server = CouchServerConnection.allocate
|
117
148
|
end
|
118
149
|
|
@@ -142,15 +173,11 @@ module ShyCouch
|
|
142
173
|
rescue RestClient::ResourceNotFound
|
143
174
|
false
|
144
175
|
end
|
145
|
-
|
146
|
-
# def get_database_info(db_name)
|
147
|
-
# get("/#{db+name}/")
|
148
|
-
# end
|
149
176
|
|
150
177
|
def req(kind, uri, data = nil)
|
151
178
|
raise TypeError unless [:get,:delete,:put,:post].include?(kind) # only support these 4 request methods currently
|
152
179
|
res = (@user and @password ? couch_req_with_auth(kind, uri, data) : couch_req_without_auth(kind, uri, data))
|
153
|
-
JSON.parse(res)
|
180
|
+
return JSON.parse(res)
|
154
181
|
end
|
155
182
|
def req_host
|
156
183
|
"http://#{(@user + ':' + @password + '@') if @user and @password}#{@host}:#{@port}"
|
@@ -172,12 +199,6 @@ module ShyCouch
|
|
172
199
|
end
|
173
200
|
|
174
201
|
end
|
175
|
-
|
176
|
-
# this should be done w/ couch key stuff?
|
177
|
-
# def pull_all_design_docs(db_name)
|
178
|
-
# pull_all_doc_ids(db_name).map { get_document_by_id(db_name, id) if id[0,7] == "_design" }
|
179
|
-
# end
|
180
|
-
|
181
202
|
#TODO - this is screwed
|
182
203
|
def pull_all_doc_ids(db_name)
|
183
204
|
req(:get,"/#{db_name}/_all_docs")["rows"].map { |doc| doc["id"] }
|
@@ -188,10 +209,10 @@ module ShyCouch
|
|
188
209
|
end
|
189
210
|
|
190
211
|
def get_document_by_id(db_name, id)
|
191
|
-
document = Data::CouchDocument.new(req(:get,"/#{db_name}/#{id}"))
|
212
|
+
document = Data::CouchDocument.new(:data => req(:get,"/#{db_name}/#{id}"))
|
192
213
|
end
|
193
214
|
def pull_document(db_name, document)
|
194
|
-
document = Data::CouchDocument.new(req(:get,"/#{db_name}/#{document._id}"))
|
215
|
+
document = Data::CouchDocument.new(:data => req(:get,"/#{db_name}/#{document._id}"))
|
195
216
|
end
|
196
217
|
|
197
218
|
def delete_document(db_name, id)
|
@@ -202,12 +223,15 @@ module ShyCouch
|
|
202
223
|
# Haven't decided whether PUT/POST should take a CouchDocument or a JSON string.
|
203
224
|
|
204
225
|
def push_document(db_name, document)
|
205
|
-
raise TypeError unless document.kind_of?(Data::CouchDocument)
|
226
|
+
raise TypeError unless document.kind_of?(ShyCouch::Data::CouchDocument)
|
206
227
|
raise JSON::GeneratorError unless document.valid?
|
207
228
|
if document["_rev"]
|
208
|
-
|
209
|
-
|
210
|
-
|
229
|
+
# puts "/#{db_name}/#{document._id}?rev=#{document._rev}/" #TODO - remove
|
230
|
+
return req(:put, "/#{db_name}/#{document._id}?rev=#{document._rev}/", document.to_json)
|
231
|
+
elsif document["_id"]
|
232
|
+
return req(:put, "/#{db_name}/#{document._id}", document.to_json)
|
233
|
+
else
|
234
|
+
return req(:post, "/#{db_name}/", document.to_json)
|
211
235
|
end
|
212
236
|
end
|
213
237
|
|
data/lib/ShyCouch/data.rb
CHANGED
@@ -8,11 +8,24 @@ module ShyCouch
|
|
8
8
|
end
|
9
9
|
@@needs, @@suggests, @@views = [], [], []
|
10
10
|
|
11
|
-
def initialize(
|
11
|
+
def initialize(opts={})
|
12
12
|
# Assumes that the "kind" is the class name unless explicitly stated otherwise
|
13
13
|
# TODO - maybe just force it to be the class name no matter what tbh
|
14
|
-
|
15
|
-
|
14
|
+
|
15
|
+
# this is messy.
|
16
|
+
# If there's some data given, see whether it has a kind.
|
17
|
+
if opts[:data]
|
18
|
+
if !opts[:data]["kind"]
|
19
|
+
# If there's no kind, give the 'kind' the class name as a value
|
20
|
+
opts[:data]["kind"] = self.class.to_s.split("::").last
|
21
|
+
end
|
22
|
+
else
|
23
|
+
# if there's no data, give it data and a kind
|
24
|
+
opts[:data] = {"kind" => self.class.to_s.split("::").last}
|
25
|
+
end
|
26
|
+
|
27
|
+
merge!(opts[:data])
|
28
|
+
@database = opts[:push_to] if opts[:push_to]
|
16
29
|
raise TypeError unless valid?
|
17
30
|
set_up_views
|
18
31
|
end
|
@@ -56,16 +69,24 @@ module ShyCouch
|
|
56
69
|
return self.class.requirements
|
57
70
|
end
|
58
71
|
|
59
|
-
def pull(
|
60
|
-
|
72
|
+
def pull(db = nil)
|
73
|
+
db ||= @database
|
74
|
+
new_doc = db.pull_document(self)
|
75
|
+
return new_doc
|
76
|
+
end
|
77
|
+
|
78
|
+
def pull!(db = nil)
|
79
|
+
db ||= @database
|
80
|
+
new_doc = pull(db)
|
61
81
|
if new_doc
|
62
82
|
self.clear
|
63
83
|
self.merge! new_doc
|
64
84
|
end
|
65
85
|
end
|
66
86
|
|
67
|
-
def push(database)
|
68
|
-
|
87
|
+
def push!(database=nil)
|
88
|
+
database ||= @database
|
89
|
+
res = database.push_document!(self)
|
69
90
|
self["_id"] = res["id"] unless self["_id"]
|
70
91
|
self["_rev"] = res["rev"]
|
71
92
|
return res
|
@@ -133,16 +154,65 @@ module ShyCouch
|
|
133
154
|
return {"map" => @map, "reduce" => @reduce}
|
134
155
|
end
|
135
156
|
end
|
157
|
+
|
158
|
+
class ViewResult < Array
|
159
|
+
attr_accessor :total_rows, :offset
|
160
|
+
def initialize(res)
|
161
|
+
@total_rows = res["total_rows"]
|
162
|
+
@offset = res["offset"]
|
163
|
+
concat res["rows"]
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
class CouchDocumentCollection < Array
|
168
|
+
def <<(obj)
|
169
|
+
raise TypeError unless obj.kind_of?(ShyCouch::Data::CouchDocument)
|
170
|
+
super
|
171
|
+
end
|
172
|
+
|
173
|
+
def initialize(opts = {})
|
174
|
+
@database = opts[:push_to] if opts[:push_to]
|
175
|
+
end
|
176
|
+
|
177
|
+
def pull_all(db = nil)
|
178
|
+
db ||= @database
|
179
|
+
collection = CouchDocumentCollection.new
|
180
|
+
each do |item|
|
181
|
+
collection << db.pull_document(item)
|
182
|
+
end
|
183
|
+
return collection
|
184
|
+
end
|
185
|
+
|
186
|
+
def pull_all!(db = nil)
|
187
|
+
db ||= @database
|
188
|
+
each do |item|
|
189
|
+
item.pull!(db)
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
def push_all!(db = nil)
|
194
|
+
db ||= @database
|
195
|
+
each do |item|
|
196
|
+
item.push!(db)
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
end
|
136
201
|
|
137
202
|
class Design < CouchDocument
|
138
203
|
# this is used to manage design documents
|
139
204
|
# In practise, the Controllers should be a list of classes corresponding to design documents
|
140
205
|
|
141
|
-
def initialize(name,
|
206
|
+
def initialize(name, opts = {})
|
142
207
|
merge! "_id" => "_design/#{name.to_s}"
|
143
208
|
@parser = ShyRubyJS::ShySexpParser.new
|
144
|
-
|
145
|
-
merge_views
|
209
|
+
views = opts[:views] if opts[:views]
|
210
|
+
merge_views(views) if views
|
211
|
+
@database = opts[:push_to] if opts[:push_to]
|
212
|
+
end
|
213
|
+
|
214
|
+
def name
|
215
|
+
return self["_id"].split("_design/").drop(1).join
|
146
216
|
end
|
147
217
|
|
148
218
|
def add_view(view)
|
@@ -151,15 +221,28 @@ module ShyCouch
|
|
151
221
|
merge_views
|
152
222
|
end
|
153
223
|
|
224
|
+
def query_view(view, db = nil)
|
225
|
+
db ||= @database
|
226
|
+
raise ShyCouchError, "No CouchDB defined" unless db
|
227
|
+
view = view.name if view.kind_of?(ShyCouch::Data::View)
|
228
|
+
#TODO - something
|
229
|
+
db.query_view(self.name, view)
|
230
|
+
end
|
231
|
+
|
154
232
|
def view(view_name, &block)
|
155
233
|
add_view(ShyCouch::Data::View.new(view_name, &block))
|
156
234
|
end
|
235
|
+
def push!(db = nil)
|
236
|
+
db ||= @database
|
237
|
+
raise ShyCouchError, "No CouchDB defined" unless db
|
238
|
+
db.add_design_and_push!(self)
|
239
|
+
end
|
157
240
|
|
158
241
|
private
|
159
242
|
|
160
|
-
def merge_views
|
243
|
+
def merge_views(views)
|
161
244
|
h = { "views" => {}}
|
162
|
-
|
245
|
+
views.each do |view|
|
163
246
|
h["views"][view.name] = view.functions
|
164
247
|
end
|
165
248
|
merge! h
|
data/test/test_ShyCouch.rb
CHANGED
@@ -16,6 +16,28 @@ $settings = {
|
|
16
16
|
},
|
17
17
|
}
|
18
18
|
|
19
|
+
class ShyCouchTestHelper < Test::Unit::TestCase
|
20
|
+
# The majority of the tests in this suite need the setup provided in here
|
21
|
+
# And it means I don't forget to delete the database in their teardown functions
|
22
|
+
def setup
|
23
|
+
valid_settings = $settings
|
24
|
+
@couchdb = ShyCouch.getDB(valid_settings)
|
25
|
+
end
|
26
|
+
def teardown
|
27
|
+
@couchdb.delete!
|
28
|
+
@couchdb = nil
|
29
|
+
end
|
30
|
+
|
31
|
+
def add_some_documents
|
32
|
+
4.times do
|
33
|
+
recipe = Recipe.new(:push_to => @couchdb)
|
34
|
+
recipe.push!
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class Recipe < ShyCouch::Data::CouchDocument; end
|
39
|
+
end
|
40
|
+
|
19
41
|
# test ShyCouch::CouchDBAPI
|
20
42
|
require_relative 'test_couchdb_api'
|
21
43
|
|
data/test/test_couch_document.rb
CHANGED
@@ -9,7 +9,7 @@ class CouchDocumentTests
|
|
9
9
|
@couchdb = ShyCouch.getDB(valid_settings)
|
10
10
|
end
|
11
11
|
def teardown
|
12
|
-
@couchdb.
|
12
|
+
@couchdb.delete!
|
13
13
|
@couchdb = nil
|
14
14
|
end
|
15
15
|
|
@@ -30,7 +30,7 @@ class CouchDocumentTests
|
|
30
30
|
def test_create_from_string
|
31
31
|
# Ensure no doc creation with fixnum argument
|
32
32
|
string = "hehe i'm all over here you know"
|
33
|
-
assert_raises
|
33
|
+
assert_raises TypeError do
|
34
34
|
doc = ShyCouch::Data::CouchDocument.new(string)
|
35
35
|
end
|
36
36
|
end
|
@@ -57,26 +57,25 @@ class CouchDocumentTests
|
|
57
57
|
|
58
58
|
|
59
59
|
@valid_documents = [
|
60
|
-
ShyCouch::Data::CouchDocument.new({"kind"=>"post", "message"=>"BUY TRAMADOL ONLINE!!"}),
|
61
|
-
ShyCouch::Data::CouchDocument.new({"kind"=>"comment",
|
60
|
+
ShyCouch::Data::CouchDocument.new(:data => {"kind"=>"post", "message"=>"BUY TRAMADOL ONLINE!!"}),
|
61
|
+
ShyCouch::Data::CouchDocument.new(:data => {"kind"=>"comment",
|
62
62
|
"message"=>"gry gry online gry gry online gry gry online gry gry online gry gry online "}),
|
63
|
-
ShyCouch::Data::CouchDocument.new({"kind"=>"tag", "name"=>"FREE CANADIAN PRESCRIPTION DRUGS"}),
|
64
|
-
ShyCouch::Data::CouchDocument.new({"kind"=>"helpers",
|
63
|
+
ShyCouch::Data::CouchDocument.new(:data => {"kind"=>"tag", "name"=>"FREE CANADIAN PRESCRIPTION DRUGS"}),
|
64
|
+
ShyCouch::Data::CouchDocument.new(:data => {"kind"=>"helpers",
|
65
65
|
"helpers"=>["helper", "bad helper", "terrible helper", "this isn't helping"],
|
66
66
|
"actually_helpful"=>false, "times_helped"=>0}),
|
67
67
|
]
|
68
68
|
@existing_valid_documents = [
|
69
|
-
ShyCouch::Data::CouchDocument.new("whatever"=>"yep"),
|
70
|
-
ShyCouch::Data::CouchDocument.new("is_a_document"=>true, "number_of_docs_this_is"=>1)
|
69
|
+
ShyCouch::Data::CouchDocument.new(:data => {"whatever"=>"yep"}),
|
70
|
+
ShyCouch::Data::CouchDocument.new(:data => {"is_a_document"=>true, "number_of_docs_this_is"=>1})
|
71
71
|
].each { |doc|
|
72
|
-
doc.push($couchdb)
|
72
|
+
doc.push!($couchdb)
|
73
73
|
}
|
74
74
|
@invalid_documents = nil # make sure user can't set rev maybe? or is that legal?
|
75
75
|
end
|
76
76
|
def teardown
|
77
|
-
$couchdb.
|
77
|
+
$couchdb.delete!
|
78
78
|
$couchdb = nil
|
79
|
-
# delete the database
|
80
79
|
end
|
81
80
|
|
82
81
|
def test_keys_as_attr_accessors
|
@@ -91,7 +90,7 @@ class CouchDocumentTests
|
|
91
90
|
def test_push_new_documents
|
92
91
|
@valid_documents.each { |doc|
|
93
92
|
# put the document on the server, grab the server's response
|
94
|
-
res = doc.push($couchdb)
|
93
|
+
res = doc.push!($couchdb)
|
95
94
|
# check that the server included "ok"=>true in its response
|
96
95
|
assert(res["ok"])
|
97
96
|
# check that the doc now has an id and a rev
|
@@ -116,7 +115,7 @@ class CouchDocumentTests
|
|
116
115
|
doc.buttonCount = 5
|
117
116
|
doc.friends = ["alan", "alex", "all me other mates"]
|
118
117
|
|
119
|
-
res = doc.push($couchdb)
|
118
|
+
res = doc.push!($couchdb)
|
120
119
|
assert(res["ok"])
|
121
120
|
|
122
121
|
# pull it from the database again
|
@@ -133,10 +132,110 @@ class CouchDocumentTests
|
|
133
132
|
@existing_valid_documents.each { |doc|
|
134
133
|
doc._rev = "hurr"
|
135
134
|
assert_raise RestClient::BadRequest do
|
136
|
-
res = doc.push($couchdb)
|
135
|
+
res = doc.push!($couchdb)
|
137
136
|
end
|
138
137
|
}
|
139
138
|
end
|
140
139
|
|
141
140
|
end
|
142
|
-
end
|
141
|
+
end
|
142
|
+
|
143
|
+
class CouchDocumentCollectionPushingAndPulling < ShyCouchTestHelper
|
144
|
+
|
145
|
+
def setup
|
146
|
+
super
|
147
|
+
@collection = ShyCouch::Data::CouchDocumentCollection.new(:push_to => @couchdb)
|
148
|
+
4.times do
|
149
|
+
@collection << Recipe.new
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
def test_push_all_docs
|
154
|
+
assert_nothing_raised Exception do
|
155
|
+
@collection.push_all!
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def test_pull_all_docs
|
160
|
+
@collection.push_all!
|
161
|
+
collection2 = @collection.pull_all
|
162
|
+
@collection.each_with_index do |item, i|
|
163
|
+
assert_equal(item, collection2[i])
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
def test_pull_all_docs_forcefully
|
168
|
+
# tests pulling w/ exclamation yo
|
169
|
+
@collection.push_all!
|
170
|
+
backupCollection = @collection.clone
|
171
|
+
@collection.pull_all!
|
172
|
+
@collection.each_with_index do |item, i|
|
173
|
+
assert_equal(backupCollection[i], item)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
def teardown; super; end
|
178
|
+
|
179
|
+
end
|
180
|
+
|
181
|
+
# class CouchDocumentCollectionTests < ShyCouchTestHelper
|
182
|
+
# # Test for:
|
183
|
+
# # * calling a view returns a document collection
|
184
|
+
# # * treating it like an array gives access to rows
|
185
|
+
# # * the metadata that is returned with a view is accessible as object attributes
|
186
|
+
#
|
187
|
+
# class Leg < ShyCouch::Data::CouchDocument; end #for testing
|
188
|
+
#
|
189
|
+
# def setup
|
190
|
+
# super
|
191
|
+
# @view = ShyCouch::Data::View.new :legs do
|
192
|
+
# map do
|
193
|
+
# emit(doc.key, doc.name) if(doc.kind == "Leg")
|
194
|
+
# end
|
195
|
+
# end
|
196
|
+
# @design = ShyCouch::Data::Design.new :cool, { :views => [@view], :push_to => $couchdb }
|
197
|
+
# @couchdb.add_design_and_push!(@design)
|
198
|
+
# @legDocument = Leg.new(:push_to => @couchdb).push!
|
199
|
+
# @legDocumentTwo = Leg.new(:push_to => @couchdb).push!
|
200
|
+
# end
|
201
|
+
#
|
202
|
+
# def test_view_returns_collection
|
203
|
+
# collection = $couchdb.design(:cool).view(:butts)
|
204
|
+
# assert_kind_of(ShyCouch::Data::DocumentCollection, collection)
|
205
|
+
# end
|
206
|
+
#
|
207
|
+
# def test_view_metadata_are_attrs
|
208
|
+
# collection = $couchdb.design(:cool).view(:butts)
|
209
|
+
# assert(collection.respond_to? :total_rows)
|
210
|
+
# assert(collection.respond_to? :offset)
|
211
|
+
# end
|
212
|
+
#
|
213
|
+
# def test_doc_collection_takes_couch_doc
|
214
|
+
# collection = ShyCouch::Data::CouchDocumentCollection.new
|
215
|
+
# assert_nothing_raised Exception do
|
216
|
+
# collection << ShyCouch::Data::CouchDocument.new
|
217
|
+
# end
|
218
|
+
# end
|
219
|
+
#
|
220
|
+
# def test_doc_collection_rejects_wrong_type
|
221
|
+
# collection = ShyCouch::Data::CouchDocumentCollection.new
|
222
|
+
# assert_raises TypeError do
|
223
|
+
# collection << 1
|
224
|
+
# end
|
225
|
+
# assert_raises TypeError do
|
226
|
+
# collection << "Nice!"
|
227
|
+
# end
|
228
|
+
# end
|
229
|
+
#
|
230
|
+
# def test_document_collection_has_documents
|
231
|
+
# collection = $couchdb.design(:cool).view(:butts)
|
232
|
+
#
|
233
|
+
# assert(collection.has_row_with(:id,legDocument["id"]))
|
234
|
+
# assert(collection.has_row_with(:id,legDocument["id"]))
|
235
|
+
# end
|
236
|
+
#
|
237
|
+
# def teardown
|
238
|
+
# super
|
239
|
+
# end
|
240
|
+
#
|
241
|
+
# end
|
data/test/test_couchdb_api.rb
CHANGED
@@ -2,56 +2,29 @@ require 'test/unit'
|
|
2
2
|
require_relative '../lib/ShyCouch.rb'
|
3
3
|
|
4
4
|
class DesignDocumentTests
|
5
|
-
class
|
6
|
-
Design = ShyCouch::Data::Design
|
7
|
-
CouchDocument = ShyCouch::Data::CouchDocument
|
8
|
-
|
9
|
-
class Recipe < CouchDocument
|
10
|
-
|
11
|
-
end
|
12
|
-
|
5
|
+
class ShyCouchDesignTestHelper < ShyCouchTestHelper
|
13
6
|
def setup
|
14
|
-
|
15
|
-
|
7
|
+
super
|
8
|
+
# add some docs to the database
|
9
|
+
@documents = add_some_documents
|
10
|
+
# make some views
|
16
11
|
@views = setup_views
|
17
|
-
|
12
|
+
# make a design, push it
|
13
|
+
@design = setup_design_document
|
14
|
+
@design.push!
|
18
15
|
end
|
19
16
|
def teardown
|
20
|
-
|
21
|
-
@couchdb = nil
|
22
|
-
end
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
def test_create_design
|
27
|
-
assert_nothing_raised {
|
28
|
-
@design = setup_design_document
|
29
|
-
}
|
30
|
-
end
|
31
|
-
|
32
|
-
def test_push_to_db
|
33
|
-
design = setup_design_document
|
34
|
-
@couchdb.add_design_documents_and_push(design)
|
35
|
-
new_doc = @couchdb.get_design_document_by_id(design._id)
|
36
|
-
assert_equal(design.as_hash, new_doc.as_hash)
|
17
|
+
super
|
37
18
|
end
|
38
|
-
|
39
|
-
def test_call_views
|
40
|
-
design = setup_design_document
|
41
|
-
@couchdb.add_design_documents_and_push(design)
|
42
|
-
add_some_documents
|
43
|
-
# puts design.views["count_recipes"]
|
44
|
-
end
|
45
|
-
|
46
19
|
def setup_views
|
47
20
|
view1 = ShyCouch::Data::View.new :recipes do
|
48
21
|
map do
|
49
|
-
emit(doc.
|
22
|
+
emit(doc.name, null) if doc.kind == "Recipe"
|
50
23
|
end
|
51
24
|
end
|
52
|
-
view2 = ShyCouch::Data::View.new :
|
25
|
+
view2 = ShyCouch::Data::View.new :recipe_count do
|
53
26
|
map do
|
54
|
-
emit(doc.
|
27
|
+
emit(doc.name, null) if doc.kind == "Recipe"
|
55
28
|
end
|
56
29
|
reduce do
|
57
30
|
return sum(values)
|
@@ -59,13 +32,114 @@ class DesignDocumentTests
|
|
59
32
|
end
|
60
33
|
return [view1, view2]
|
61
34
|
end
|
35
|
+
|
62
36
|
def setup_design_document
|
63
|
-
return ShyCouch::Data::Design.new :
|
37
|
+
return ShyCouch::Data::Design.new :food, {:views => @views, :push_to => @couchdb }
|
64
38
|
end
|
39
|
+
|
65
40
|
def add_some_documents
|
66
41
|
4.times do
|
67
|
-
Recipe.new
|
42
|
+
recipe = Recipe.new(:push_to => @couchdb)
|
43
|
+
recipe.push!
|
68
44
|
end
|
69
45
|
end
|
70
46
|
end
|
47
|
+
|
48
|
+
class TestDesignDocument < ShyCouchDesignTestHelper
|
49
|
+
Design = ShyCouch::Data::Design
|
50
|
+
CouchDocument = ShyCouch::Data::CouchDocument
|
51
|
+
|
52
|
+
class Recipe < CouchDocument; end
|
53
|
+
|
54
|
+
def setup
|
55
|
+
super
|
56
|
+
end
|
57
|
+
def teardown
|
58
|
+
super
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_create_design
|
62
|
+
assert_nothing_raised {
|
63
|
+
@design = setup_design_document
|
64
|
+
}
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_create_design_to_db
|
68
|
+
new_doc = @couchdb.pull_design(@design._id)
|
69
|
+
assert_equal(@design.as_hash, new_doc.as_hash)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
class TestDesignsInDatabase < ShyCouchDesignTestHelper
|
74
|
+
def setup
|
75
|
+
super
|
76
|
+
end
|
77
|
+
|
78
|
+
def teardown
|
79
|
+
super
|
80
|
+
end
|
81
|
+
|
82
|
+
# three different ways of calling the design
|
83
|
+
def test_get_design_1
|
84
|
+
result = @couchdb.design(@design.name)
|
85
|
+
assert_equal(@design, result)
|
86
|
+
end
|
87
|
+
def test_get_design_2
|
88
|
+
result = @couchdb.design(@design)
|
89
|
+
assert_equal(@design, result)
|
90
|
+
end
|
91
|
+
def test_get_design_3
|
92
|
+
result = @couchdb.design(:food)
|
93
|
+
assert_equal(@design, result)
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_modify_design_and_push
|
97
|
+
@design.views["recipe_count"].delete("map")
|
98
|
+
@design.push!
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
|
103
|
+
class TestCallViewFromDesign < ShyCouchDesignTestHelper
|
104
|
+
def setup
|
105
|
+
super
|
106
|
+
end
|
107
|
+
|
108
|
+
def teardown
|
109
|
+
super
|
110
|
+
end
|
111
|
+
|
112
|
+
def test_call_view_by_name
|
113
|
+
# for the map view:
|
114
|
+
result = @couchdb.design(@design).query_view(:recipes)
|
115
|
+
# test that we got the right kind of object:
|
116
|
+
assert_kind_of(ShyCouch::Data::ViewResult, result)
|
117
|
+
# test that the object has the expected number of rows:
|
118
|
+
assert_equal(4, result.length)
|
119
|
+
|
120
|
+
# for the reduce view:
|
121
|
+
result = @couchdb.design(@design).query_view(:recipe_count)
|
122
|
+
assert_kind_of(ShyCouch::Data::ViewResult, result)
|
123
|
+
assert_equal(1, result.length)
|
124
|
+
assert_respond_to(result, :total_rows)
|
125
|
+
assert_respond_to(result, :offset)
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_call_view_with_view_object
|
129
|
+
# for the map view:
|
130
|
+
result = @couchdb.design(@design).query_view(@views[0])
|
131
|
+
# test that we got the right kind of object:
|
132
|
+
assert_kind_of(ShyCouch::Data::ViewResult, result)
|
133
|
+
# test that the object has the expected number of rows:
|
134
|
+
assert_equal(4, result.length)
|
135
|
+
# and that it responds to offset and total rows as method calls:
|
136
|
+
assert_respond_to(result, :total_rows)
|
137
|
+
assert_respond_to(result, :offset)
|
138
|
+
|
139
|
+
# for the reduce view:
|
140
|
+
# TODO
|
141
|
+
end
|
142
|
+
|
143
|
+
end
|
144
|
+
|
71
145
|
end
|
data/test/test_views.rb
CHANGED
@@ -15,13 +15,8 @@ class CouchViewTests < Test::Unit::TestCase
|
|
15
15
|
end
|
16
16
|
def teardown; end
|
17
17
|
|
18
|
-
class Leg < ShyCouch::Data::CouchDocument
|
19
|
-
|
20
|
-
end
|
21
18
|
|
22
|
-
|
23
|
-
|
24
|
-
end
|
19
|
+
|
25
20
|
|
26
21
|
# def test_define_map_view
|
27
22
|
# view :five_star_butts do
|
@@ -50,4 +45,26 @@ class CouchViewTests < Test::Unit::TestCase
|
|
50
45
|
# assert_equal(expected_reduce, @couch_views[0].reduce)
|
51
46
|
# end
|
52
47
|
|
48
|
+
end
|
49
|
+
|
50
|
+
class CouchDefaultViewTests < ShyCouchTestHelper
|
51
|
+
# define a class that should have an 'all' method to get all instances of that object
|
52
|
+
class Leg < ShyCouch::Data::CouchDocument; end
|
53
|
+
def setup
|
54
|
+
super
|
55
|
+
# add some instances of the object
|
56
|
+
@test_docs = []
|
57
|
+
@test_docs << Leg.new(:push_to => @couchdb, :data => {"length"=>30}).push!
|
58
|
+
@test_docs << Leg.new(:push_to => @couchdb, :data => {"length"=>18, "broken"=>true}).push!
|
59
|
+
end
|
60
|
+
def teardown
|
61
|
+
super
|
62
|
+
end
|
63
|
+
#
|
64
|
+
# def test_query_all
|
65
|
+
# @all_legs = Leg.all
|
66
|
+
# assert_equal(@test_docs.length, @all_legs.length)
|
67
|
+
# assert_kind_of(ShyCouch::CouchDocumentCollection, @all_legs)
|
68
|
+
# # also test that the doc values worked, and that the response has the docs in it, etc.
|
69
|
+
# end
|
53
70
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ShyCouch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,11 +11,11 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2011-09-
|
14
|
+
date: 2011-09-24 00:00:00.000000000Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: ShyRubyJS
|
18
|
-
requirement: &
|
18
|
+
requirement: &70284357957800 !ruby/object:Gem::Requirement
|
19
19
|
none: false
|
20
20
|
requirements:
|
21
21
|
- - ! '>='
|
@@ -23,10 +23,10 @@ dependencies:
|
|
23
23
|
version: '0'
|
24
24
|
type: :runtime
|
25
25
|
prerelease: false
|
26
|
-
version_requirements: *
|
26
|
+
version_requirements: *70284357957800
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
|
-
requirement: &
|
29
|
+
requirement: &70284357957320 !ruby/object:Gem::Requirement
|
30
30
|
none: false
|
31
31
|
requirements:
|
32
32
|
- - ~>
|
@@ -34,10 +34,10 @@ dependencies:
|
|
34
34
|
version: 1.0.0
|
35
35
|
type: :development
|
36
36
|
prerelease: false
|
37
|
-
version_requirements: *
|
37
|
+
version_requirements: *70284357957320
|
38
38
|
- !ruby/object:Gem::Dependency
|
39
39
|
name: jeweler
|
40
|
-
requirement: &
|
40
|
+
requirement: &70284357956840 !ruby/object:Gem::Requirement
|
41
41
|
none: false
|
42
42
|
requirements:
|
43
43
|
- - ~>
|
@@ -45,10 +45,10 @@ dependencies:
|
|
45
45
|
version: 1.6.4
|
46
46
|
type: :development
|
47
47
|
prerelease: false
|
48
|
-
version_requirements: *
|
48
|
+
version_requirements: *70284357956840
|
49
49
|
- !ruby/object:Gem::Dependency
|
50
50
|
name: rcov
|
51
|
-
requirement: &
|
51
|
+
requirement: &70284357956360 !ruby/object:Gem::Requirement
|
52
52
|
none: false
|
53
53
|
requirements:
|
54
54
|
- - ! '>='
|
@@ -56,10 +56,10 @@ dependencies:
|
|
56
56
|
version: '0'
|
57
57
|
type: :development
|
58
58
|
prerelease: false
|
59
|
-
version_requirements: *
|
59
|
+
version_requirements: *70284357956360
|
60
60
|
- !ruby/object:Gem::Dependency
|
61
61
|
name: sourcify
|
62
|
-
requirement: &
|
62
|
+
requirement: &70284357955880 !ruby/object:Gem::Requirement
|
63
63
|
none: false
|
64
64
|
requirements:
|
65
65
|
- - ~>
|
@@ -67,10 +67,10 @@ dependencies:
|
|
67
67
|
version: 0.5.0
|
68
68
|
type: :development
|
69
69
|
prerelease: false
|
70
|
-
version_requirements: *
|
70
|
+
version_requirements: *70284357955880
|
71
71
|
- !ruby/object:Gem::Dependency
|
72
72
|
name: ShyRubyJS
|
73
|
-
requirement: &
|
73
|
+
requirement: &70284357955400 !ruby/object:Gem::Requirement
|
74
74
|
none: false
|
75
75
|
requirements:
|
76
76
|
- - ! '>='
|
@@ -78,10 +78,10 @@ dependencies:
|
|
78
78
|
version: '0'
|
79
79
|
type: :development
|
80
80
|
prerelease: false
|
81
|
-
version_requirements: *
|
81
|
+
version_requirements: *70284357955400
|
82
82
|
- !ruby/object:Gem::Dependency
|
83
83
|
name: ShyRubyJS
|
84
|
-
requirement: &
|
84
|
+
requirement: &70284357954920 !ruby/object:Gem::Requirement
|
85
85
|
none: false
|
86
86
|
requirements:
|
87
87
|
- - ! '>='
|
@@ -89,10 +89,10 @@ dependencies:
|
|
89
89
|
version: '0'
|
90
90
|
type: :runtime
|
91
91
|
prerelease: false
|
92
|
-
version_requirements: *
|
92
|
+
version_requirements: *70284357954920
|
93
93
|
- !ruby/object:Gem::Dependency
|
94
94
|
name: rest-client
|
95
|
-
requirement: &
|
95
|
+
requirement: &70284357954440 !ruby/object:Gem::Requirement
|
96
96
|
none: false
|
97
97
|
requirements:
|
98
98
|
- - ! '>='
|
@@ -100,10 +100,10 @@ dependencies:
|
|
100
100
|
version: 1.6.7
|
101
101
|
type: :runtime
|
102
102
|
prerelease: false
|
103
|
-
version_requirements: *
|
103
|
+
version_requirements: *70284357954440
|
104
104
|
- !ruby/object:Gem::Dependency
|
105
105
|
name: sourcify
|
106
|
-
requirement: &
|
106
|
+
requirement: &70284357953960 !ruby/object:Gem::Requirement
|
107
107
|
none: false
|
108
108
|
requirements:
|
109
109
|
- - ! '>='
|
@@ -111,7 +111,7 @@ dependencies:
|
|
111
111
|
version: '0'
|
112
112
|
type: :runtime
|
113
113
|
prerelease: false
|
114
|
-
version_requirements: *
|
114
|
+
version_requirements: *70284357953960
|
115
115
|
description: Ruby API for CouchDB, designed to work with the Camping micro-framework.
|
116
116
|
email: danbryan@gmail.com
|
117
117
|
executables: []
|
@@ -133,8 +133,6 @@ files:
|
|
133
133
|
- lib/ShyCouch/data.rb
|
134
134
|
- lib/ShyCouch/fields.rb
|
135
135
|
- test/helper.rb
|
136
|
-
- test/old-test.rb
|
137
|
-
- test/old-tests.rb
|
138
136
|
- test/test_ShyCouch.rb
|
139
137
|
- test/test_couch_document.rb
|
140
138
|
- test/test_couchdb_api.rb
|
@@ -157,7 +155,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
157
155
|
version: '0'
|
158
156
|
segments:
|
159
157
|
- 0
|
160
|
-
hash:
|
158
|
+
hash: -2651663880212191407
|
161
159
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
162
160
|
none: false
|
163
161
|
requirements:
|
data/test/old-test.rb
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
require '~/dev/shycouch/shycouch'
|
2
|
-
require '~/dev/shycouch/shycouchtests'
|
3
|
-
require 'irb'
|
4
|
-
|
5
|
-
ShyCouchTests::test_up
|
6
|
-
ShyCouchTests::test_down
|
7
|
-
message = "Test methods: "
|
8
|
-
message += ShyCouchTests::singleton_methods.map { |m| "ShyCouchTests::#{m}"}.join(', ')
|
9
|
-
puts message
|
10
|
-
IRB.start
|
data/test/old-tests.rb
DELETED
@@ -1,89 +0,0 @@
|
|
1
|
-
require '~/dev/shycouch/shycouch'
|
2
|
-
module ShyCouchTests
|
3
|
-
def self.test_up
|
4
|
-
begin
|
5
|
-
# set everything up
|
6
|
-
$t_database, $t_id, $t_document = ShyCouch::CouchDatabase.allocate, "", ShyCouch::Data::CouchDocument.new
|
7
|
-
|
8
|
-
#set up the database
|
9
|
-
setup_database
|
10
|
-
setup_document
|
11
|
-
test_model
|
12
|
-
test_doc_kinds
|
13
|
-
# check that everything at least exists
|
14
|
-
result = if $t_database and $t_database.server and $t_id and $t_document #and $test_doc_kinds.length == 1
|
15
|
-
{"ok"=>true,"message"=>"Test environment appears to work","database"=>"$t_database",
|
16
|
-
"server connection"=>"$t_database.server","test doc id"=>"$t_id", "test document"=>"$t_doc",
|
17
|
-
"test doc model"=>"$t_model"}
|
18
|
-
else
|
19
|
-
{"ok"=>false,"message"=>"Test environment appears not to be working","database"=>$t_database,
|
20
|
-
"server connection"=>$t_database.server,"test doc id"=>$t_id,"test document"=>$t_doc}
|
21
|
-
end
|
22
|
-
rescue Errno::ECONNREFUSED
|
23
|
-
result = {"ok"=>false, "message"=>"""Server Connection refused.
|
24
|
-
Is CouchDB running at http://#{$t_database.host}:#{$t_database.port} ?"""}
|
25
|
-
end
|
26
|
-
result.each do |k, v| puts "#{k}: #{v}"; end
|
27
|
-
result["ok"]
|
28
|
-
end
|
29
|
-
|
30
|
-
def self.test_down
|
31
|
-
$t_database.server.delete_db('test')
|
32
|
-
$t_database = nil
|
33
|
-
$t_id = nil
|
34
|
-
$t_doc = nil
|
35
|
-
result = {"ok"=>true, "message"=>"Test environment has been brought down."}
|
36
|
-
result.each do|k, v| puts "#{k}: #{v}"; end
|
37
|
-
end
|
38
|
-
|
39
|
-
class TestModel < ShyCouch::Data::CouchDocument
|
40
|
-
def initialize hash
|
41
|
-
requirements = {
|
42
|
-
"me"=>String,
|
43
|
-
"you"=>Array
|
44
|
-
}
|
45
|
-
super hash, requirements
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
private
|
50
|
-
|
51
|
-
def self.setup_database
|
52
|
-
settings = {
|
53
|
-
"db"=> {
|
54
|
-
"host" => "localhost",
|
55
|
-
"port" => 5984,
|
56
|
-
"name" => "test",
|
57
|
-
"user" => "cerales",
|
58
|
-
"password" => "password"
|
59
|
-
},
|
60
|
-
}
|
61
|
-
$t_database = ShyCouch::Create.go(settings)
|
62
|
-
raise Errno::ECONNREFUSED unless $t_database.connect["ok"]
|
63
|
-
$t_database.create_on_server unless $t_database.exists_on_server?
|
64
|
-
end
|
65
|
-
|
66
|
-
def self.setup_document
|
67
|
-
if $t_database.all_docs.length == 0
|
68
|
-
emptyDoc = ShyCouch::Data::CouchDocument.new
|
69
|
-
#$t_id = $t_database.server.push_document($t_database, emptyDoc)["id"]
|
70
|
-
$t_id = $t_database.push_document(emptyDoc)["id"]
|
71
|
-
else
|
72
|
-
$t_id = $t_database.all_docs[0]["id"]
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
def self.test_doc_kinds
|
77
|
-
doc = ShyCouch::Data::CouchDocument.new.merge!("kind"=>"test")
|
78
|
-
doc2 = ShyCouch::Data::CouchDocument.new.merge!("kind"=>"nope")
|
79
|
-
doc3 = ShyCouch::Data::CouchDocument.new.merge!("kind"=>"not me!")
|
80
|
-
$t_database.push_document(doc)
|
81
|
-
$t_database.push_document(doc2)
|
82
|
-
$t_database.push_document(doc3)
|
83
|
-
$t_doc_kind = $t_database.all_docs_with("kind", "not me!")
|
84
|
-
end
|
85
|
-
|
86
|
-
def self.test_model
|
87
|
-
$t_document.merge!($t_database.get_document($t_id))
|
88
|
-
end
|
89
|
-
end
|