couchrest 0.31 → 0.32
Sign up to get free protection for your applications and to get access to all the features.
- data/history.txt +15 -0
- data/lib/couchrest/mixins/class_proxy.rb +5 -1
- data/lib/couchrest/mixins/collection.rb +4 -1
- data/lib/couchrest/mixins/design_doc.rb +6 -1
- data/lib/couchrest/mixins/document_queries.rb +31 -0
- data/lib/couchrest/mixins/views.rb +3 -3
- data/lib/couchrest/validation/validation_errors.rb +7 -0
- data/lib/couchrest.rb +1 -1
- data/spec/couchrest/more/extended_doc_spec.rb +10 -1
- data/spec/couchrest/more/extended_doc_view_spec.rb +14 -3
- metadata +1 -1
data/history.txt
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
== 0.32
|
2
|
+
|
3
|
+
* Major enhancements
|
4
|
+
|
5
|
+
* ExtendedDocument.get doesn't raise an exception anymore. If no documents are found nil is returned.
|
6
|
+
* ExtendedDocument.get! works the say #get used to work and will raise an exception if a document isn't found.
|
7
|
+
|
8
|
+
* Minor enhancements
|
9
|
+
|
10
|
+
* Bug fix: Model.all(:keys => [1,2]) was not working (Matt Aimonetti)
|
11
|
+
* Added ValidationErrors#count in order to play nicely with Rails (Peter Wagenet)
|
12
|
+
* Bug fix: class proxy design doc refresh (Daniel Kirsh)
|
13
|
+
* Bug fix: the count method on the proxy collection was missing (Daniel Kirsch)
|
14
|
+
* Added #amount_pages to a paginated collection. (Matt Aimonetti)
|
15
|
+
|
1
16
|
== 0.31
|
2
17
|
|
3
18
|
* Major enhancements
|
@@ -59,6 +59,10 @@ module CouchRest
|
|
59
59
|
@klass.all({:database => @database}.merge(opts), &block)
|
60
60
|
end
|
61
61
|
|
62
|
+
def count(opts = {}, &block)
|
63
|
+
@klass.all({:database => @database, :raw => true, :limit => 0}.merge(opts), &block)['total_rows']
|
64
|
+
end
|
65
|
+
|
62
66
|
def first(opts = {})
|
63
67
|
@klass.first({:database => @database}.merge(opts))
|
64
68
|
end
|
@@ -100,7 +104,7 @@ module CouchRest
|
|
100
104
|
end
|
101
105
|
|
102
106
|
def refresh_design_doc
|
103
|
-
@klass.
|
107
|
+
@klass.refresh_design_doc_on(@database)
|
104
108
|
end
|
105
109
|
|
106
110
|
def save_design_doc
|
@@ -83,6 +83,8 @@ module CouchRest
|
|
83
83
|
|
84
84
|
DEFAULT_PAGE = 1
|
85
85
|
DEFAULT_PER_PAGE = 30
|
86
|
+
|
87
|
+
attr_accessor :amount_pages
|
86
88
|
|
87
89
|
# Create a new CollectionProxy to represent the specified view. If a
|
88
90
|
# container class is specified, the proxy will create an object of the
|
@@ -110,7 +112,8 @@ module CouchRest
|
|
110
112
|
# See Collection.paginate
|
111
113
|
def paginate(options = {})
|
112
114
|
page, per_page = parse_options(options)
|
113
|
-
results = @database.view(@view_name, pagination_options(page, per_page))
|
115
|
+
results = @database.view(@view_name, pagination_options(page, per_page))
|
116
|
+
@amount_pages ||= (results['total_rows'].to_f / per_page.to_f).ceil
|
114
117
|
remember_where_we_left_off(results, page)
|
115
118
|
convert_to_container_array(results)
|
116
119
|
end
|
@@ -35,7 +35,7 @@ module CouchRest
|
|
35
35
|
'all' => {
|
36
36
|
'map' => "function(doc) {
|
37
37
|
if (doc['couchrest-type'] == '#{self.to_s}') {
|
38
|
-
emit(
|
38
|
+
emit(doc['_id'],1);
|
39
39
|
}
|
40
40
|
}"
|
41
41
|
}
|
@@ -48,6 +48,11 @@ module CouchRest
|
|
48
48
|
save_design_doc
|
49
49
|
end
|
50
50
|
|
51
|
+
def refresh_design_doc_on(db)
|
52
|
+
reset_design_doc
|
53
|
+
save_design_doc_on(db)
|
54
|
+
end
|
55
|
+
|
51
56
|
# Save the design doc onto the default database, and update the
|
52
57
|
# design_doc attribute
|
53
58
|
def save_design_doc
|
@@ -39,7 +39,38 @@ module CouchRest
|
|
39
39
|
end
|
40
40
|
|
41
41
|
# Load a document from the database by id
|
42
|
+
# No exceptions will be raised if the document isn't found
|
43
|
+
#
|
44
|
+
# ==== Returns
|
45
|
+
# Object:: if the document was found
|
46
|
+
# or
|
47
|
+
# Nil::
|
48
|
+
#
|
49
|
+
# === Parameters
|
50
|
+
# id<String, Integer>:: Document ID
|
51
|
+
# db<Database>:: optional option to pass a custom database to use
|
42
52
|
def get(id, db = database)
|
53
|
+
begin
|
54
|
+
doc = db.get id
|
55
|
+
rescue
|
56
|
+
nil
|
57
|
+
else
|
58
|
+
new(doc)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Load a document from the database by id
|
63
|
+
# An exception will be raised if the document isn't found
|
64
|
+
#
|
65
|
+
# ==== Returns
|
66
|
+
# Object:: if the document was found
|
67
|
+
# or
|
68
|
+
# Exception
|
69
|
+
#
|
70
|
+
# === Parameters
|
71
|
+
# id<String, Integer>:: Document ID
|
72
|
+
# db<Database>:: optional option to pass a custom database to use
|
73
|
+
def get!(id, db = database)
|
43
74
|
doc = db.get id
|
44
75
|
new(doc)
|
45
76
|
end
|
@@ -95,11 +95,11 @@ module CouchRest
|
|
95
95
|
|
96
96
|
# Dispatches to any named view.
|
97
97
|
def view(name, query={}, &block)
|
98
|
-
|
99
|
-
|
98
|
+
db = query.delete(:database) || database
|
99
|
+
unless design_doc_fresh
|
100
|
+
refresh_design_doc_on(db)
|
100
101
|
end
|
101
102
|
query[:raw] = true if query[:reduce]
|
102
|
-
db = query.delete(:database) || database
|
103
103
|
raw = query.delete(:raw)
|
104
104
|
fetch_view_with_docs(db, name, query, raw, &block)
|
105
105
|
end
|
@@ -104,6 +104,13 @@ module CouchRest
|
|
104
104
|
entries.empty?
|
105
105
|
end
|
106
106
|
|
107
|
+
# Return size of errors hash
|
108
|
+
#
|
109
|
+
# Allows us to play nicely with Rails' helpers
|
110
|
+
def count
|
111
|
+
errors.size
|
112
|
+
end
|
113
|
+
|
107
114
|
def method_missing(meth, *args, &block)
|
108
115
|
errors.send(meth, *args, &block)
|
109
116
|
end
|
data/lib/couchrest.rb
CHANGED
@@ -28,7 +28,7 @@ require 'couchrest/monkeypatches'
|
|
28
28
|
|
29
29
|
# = CouchDB, close to the metal
|
30
30
|
module CouchRest
|
31
|
-
VERSION = '0.
|
31
|
+
VERSION = '0.32' unless self.const_defined?("VERSION")
|
32
32
|
|
33
33
|
autoload :Server, 'couchrest/core/server'
|
34
34
|
autoload :Database, 'couchrest/core/database'
|
@@ -216,6 +216,15 @@ describe "ExtendedDocument" do
|
|
216
216
|
foundart = Article.get @art.id
|
217
217
|
foundart.title.should == "All About Getting"
|
218
218
|
end
|
219
|
+
|
220
|
+
it "should return nil if `get` is used and the document doesn't exist" do
|
221
|
+
foundart = Article.get 'matt aimonetti'
|
222
|
+
foundart.should be_nil
|
223
|
+
end
|
224
|
+
|
225
|
+
it "should raise an error if `get!` is used and the document doesn't exist" do
|
226
|
+
lambda{foundart = Article.get!('matt aimonetti')}.should raise_error
|
227
|
+
end
|
219
228
|
end
|
220
229
|
|
221
230
|
describe "getting a model with a subobjects array" do
|
@@ -507,7 +516,7 @@ describe "ExtendedDocument" do
|
|
507
516
|
end
|
508
517
|
it "should make it go away" do
|
509
518
|
@dobj.destroy
|
510
|
-
lambda{Basic.get(@dobj.id)}.should raise_error
|
519
|
+
lambda{Basic.get!(@dobj.id)}.should raise_error
|
511
520
|
end
|
512
521
|
end
|
513
522
|
|
@@ -168,8 +168,11 @@ describe "ExtendedDocument views" do
|
|
168
168
|
end
|
169
169
|
things[0]["doc"]["title"].should =='aaa'
|
170
170
|
end
|
171
|
-
it "should
|
172
|
-
|
171
|
+
it "should return nil on get if no database given" do
|
172
|
+
Unattached.get("aaa").should be_nil
|
173
|
+
end
|
174
|
+
it "should barf on get! if no database given" do
|
175
|
+
lambda{Unattached.get!("aaa")}.should raise_error
|
173
176
|
end
|
174
177
|
it "should get from specific database" do
|
175
178
|
u = Unattached.get(@first_id, @db)
|
@@ -200,7 +203,7 @@ describe "ExtendedDocument views" do
|
|
200
203
|
before(:all) do
|
201
204
|
reset_test_db!
|
202
205
|
# setup the class default doc to save the design doc
|
203
|
-
Unattached.use_database
|
206
|
+
Unattached.use_database nil # just to be sure it is really unattached
|
204
207
|
@us = Unattached.on(DB)
|
205
208
|
%w{aaa bbb ddd eee}.each do |title|
|
206
209
|
u = @us.new(:title => title)
|
@@ -212,6 +215,9 @@ describe "ExtendedDocument views" do
|
|
212
215
|
rs = @us.all
|
213
216
|
rs.length.should == 4
|
214
217
|
end
|
218
|
+
it "should count" do
|
219
|
+
@us.count.should == 4
|
220
|
+
end
|
215
221
|
it "should make the design doc upon first query" do
|
216
222
|
@us.by_title
|
217
223
|
doc = @us.design_doc
|
@@ -365,6 +371,11 @@ describe "ExtendedDocument views" do
|
|
365
371
|
articles.paginated_each(:per_page => 3) do |a|
|
366
372
|
a.should_not be_nil
|
367
373
|
end
|
374
|
+
end
|
375
|
+
it "should have the amount of paginated pages" do
|
376
|
+
articles = Article.by_date :key => Date.today
|
377
|
+
articles.paginate(:per_page => 3)
|
378
|
+
articles.amount_pages.should == 3
|
368
379
|
end
|
369
380
|
it "should provide a class method to access the collection directly" do
|
370
381
|
articles = Article.collection_proxy_for('Article', 'by_date', :descending => true,
|