couchrest 0.38 → 1.0.0.beta

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.
Files changed (77) hide show
  1. data/README.md +8 -8
  2. data/Rakefile +3 -4
  3. data/couchrest.gemspec +25 -105
  4. data/history.txt +5 -4
  5. data/lib/couchrest.rb +31 -52
  6. data/lib/couchrest/{core/database.rb → database.rb} +6 -11
  7. data/lib/couchrest/{core/design.rb → design.rb} +2 -2
  8. data/lib/couchrest/{core/document.rb → document.rb} +1 -1
  9. data/lib/couchrest/helper/attachments.rb +29 -0
  10. data/lib/couchrest/middlewares/logger.rb +3 -3
  11. data/lib/couchrest/monkeypatches.rb +1 -71
  12. data/lib/couchrest/{core/response.rb → response.rb} +0 -0
  13. data/lib/couchrest/{core/rest_api.rb → rest_api.rb} +8 -12
  14. data/lib/couchrest/{core/server.rb → server.rb} +0 -2
  15. data/spec/couchrest/{core/couchrest_spec.rb → couchrest_spec.rb} +15 -9
  16. data/spec/couchrest/{core/database_spec.rb → database_spec.rb} +4 -4
  17. data/spec/couchrest/{core/design_spec.rb → design_spec.rb} +2 -2
  18. data/spec/couchrest/{core/document_spec.rb → document_spec.rb} +1 -1
  19. data/spec/couchrest/{core/server_spec.rb → server_spec.rb} +2 -2
  20. data/spec/spec.opts +0 -1
  21. data/spec/spec_helper.rb +0 -4
  22. metadata +32 -133
  23. data/examples/model/example.rb +0 -144
  24. data/lib/couchrest/core/adapters/restclient.rb +0 -35
  25. data/lib/couchrest/core/http_abstraction.rb +0 -48
  26. data/lib/couchrest/core/view.rb +0 -4
  27. data/lib/couchrest/mixins.rb +0 -4
  28. data/lib/couchrest/mixins/attachments.rb +0 -31
  29. data/lib/couchrest/mixins/attribute_protection.rb +0 -74
  30. data/lib/couchrest/mixins/callbacks.rb +0 -532
  31. data/lib/couchrest/mixins/class_proxy.rb +0 -124
  32. data/lib/couchrest/mixins/collection.rb +0 -260
  33. data/lib/couchrest/mixins/design_doc.rb +0 -103
  34. data/lib/couchrest/mixins/document_queries.rb +0 -80
  35. data/lib/couchrest/mixins/extended_attachments.rb +0 -70
  36. data/lib/couchrest/mixins/extended_document_mixins.rb +0 -9
  37. data/lib/couchrest/mixins/properties.rb +0 -158
  38. data/lib/couchrest/mixins/validation.rb +0 -246
  39. data/lib/couchrest/mixins/views.rb +0 -173
  40. data/lib/couchrest/more/casted_model.rb +0 -58
  41. data/lib/couchrest/more/extended_document.rb +0 -310
  42. data/lib/couchrest/more/property.rb +0 -58
  43. data/lib/couchrest/more/typecast.rb +0 -180
  44. data/lib/couchrest/support/blank.rb +0 -42
  45. data/lib/couchrest/support/rails.rb +0 -42
  46. data/lib/couchrest/validation/auto_validate.rb +0 -157
  47. data/lib/couchrest/validation/contextual_validators.rb +0 -78
  48. data/lib/couchrest/validation/validation_errors.rb +0 -125
  49. data/lib/couchrest/validation/validators/absent_field_validator.rb +0 -74
  50. data/lib/couchrest/validation/validators/confirmation_validator.rb +0 -107
  51. data/lib/couchrest/validation/validators/format_validator.rb +0 -122
  52. data/lib/couchrest/validation/validators/formats/email.rb +0 -66
  53. data/lib/couchrest/validation/validators/formats/url.rb +0 -43
  54. data/lib/couchrest/validation/validators/generic_validator.rb +0 -120
  55. data/lib/couchrest/validation/validators/length_validator.rb +0 -139
  56. data/lib/couchrest/validation/validators/method_validator.rb +0 -89
  57. data/lib/couchrest/validation/validators/numeric_validator.rb +0 -109
  58. data/lib/couchrest/validation/validators/required_field_validator.rb +0 -114
  59. data/spec/couchrest/more/attribute_protection_spec.rb +0 -150
  60. data/spec/couchrest/more/casted_extended_doc_spec.rb +0 -73
  61. data/spec/couchrest/more/casted_model_spec.rb +0 -406
  62. data/spec/couchrest/more/extended_doc_attachment_spec.rb +0 -135
  63. data/spec/couchrest/more/extended_doc_inherited_spec.rb +0 -40
  64. data/spec/couchrest/more/extended_doc_spec.rb +0 -807
  65. data/spec/couchrest/more/extended_doc_subclass_spec.rb +0 -98
  66. data/spec/couchrest/more/extended_doc_view_spec.rb +0 -456
  67. data/spec/couchrest/more/property_spec.rb +0 -628
  68. data/spec/fixtures/more/article.rb +0 -35
  69. data/spec/fixtures/more/card.rb +0 -22
  70. data/spec/fixtures/more/cat.rb +0 -20
  71. data/spec/fixtures/more/course.rb +0 -22
  72. data/spec/fixtures/more/event.rb +0 -8
  73. data/spec/fixtures/more/invoice.rb +0 -17
  74. data/spec/fixtures/more/person.rb +0 -9
  75. data/spec/fixtures/more/question.rb +0 -6
  76. data/spec/fixtures/more/service.rb +0 -12
  77. data/spec/fixtures/more/user.rb +0 -22
@@ -1,98 +0,0 @@
1
- require File.expand_path("../../../spec_helper", __FILE__)
2
- require File.join(FIXTURE_PATH, 'more', 'card')
3
- require File.join(FIXTURE_PATH, 'more', 'course')
4
-
5
- # add a default value
6
- Card.property :bg_color, :default => '#ccc'
7
-
8
- class BusinessCard < Card
9
- property :extension_code
10
- property :job_title
11
- end
12
-
13
- class DesignBusinessCard < BusinessCard
14
- property :bg_color, :default => '#eee'
15
- end
16
-
17
- class OnlineCourse < Course
18
- property :url
19
- view_by :url
20
- end
21
-
22
- class Animal < CouchRest::ExtendedDocument
23
- use_database TEST_SERVER.default_database
24
- property :name
25
- view_by :name
26
- end
27
-
28
- class Dog < Animal; end
29
-
30
- describe "Subclassing an ExtendedDocument" do
31
-
32
- before(:each) do
33
- @card = BusinessCard.new
34
- end
35
-
36
- it "shouldn't messup the parent's properties" do
37
- Card.properties.should_not == BusinessCard.properties
38
- end
39
-
40
- it "should share the same db default" do
41
- @card.database.uri.should == Card.database.uri
42
- end
43
-
44
- it "should share the same autovalidation details" do
45
- @card.auto_validation.should be_true
46
- end
47
-
48
- it "should have kept the validation details" do
49
- @card.should_not be_valid
50
- end
51
-
52
- it "should have added the new validation details" do
53
- validated_fields = @card.class.validators.contexts[:default].map{|v| v.field_name}
54
- validated_fields.should include(:extension_code)
55
- validated_fields.should include(:job_title)
56
- end
57
-
58
- it "should not add to the parent's validations" do
59
- validated_fields = Card.validators.contexts[:default].map{|v| v.field_name}
60
- validated_fields.should_not include(:extension_code)
61
- validated_fields.should_not include(:job_title)
62
- end
63
-
64
- it "should inherit default property values" do
65
- @card.bg_color.should == '#ccc'
66
- end
67
-
68
- it "should be able to overwrite a default property" do
69
- DesignBusinessCard.new.bg_color.should == '#eee'
70
- end
71
-
72
- it "should have a design doc slug based on the subclass name" do
73
- Course.refresh_design_doc
74
- OnlineCourse.design_doc_slug.should =~ /^OnlineCourse/
75
- end
76
-
77
- it "should have its own design_doc_fresh" do
78
- Animal.refresh_design_doc
79
- Dog.design_doc_fresh.should_not == true
80
- Dog.refresh_design_doc
81
- Dog.design_doc_fresh.should == true
82
- end
83
-
84
- it "should not add views to the parent's design_doc" do
85
- Course.design_doc['views'].keys.should_not include('by_url')
86
- end
87
-
88
- it "should not add the parent's views to its design doc" do
89
- Course.refresh_design_doc
90
- OnlineCourse.refresh_design_doc
91
- OnlineCourse.design_doc['views'].keys.should_not include('by_title')
92
- end
93
-
94
- it "should have an all view with a guard clause for couchrest-type == subclass name in the map function" do
95
- OnlineCourse.design_doc['views']['all']['map'].should =~ /if \(doc\['couchrest-type'\] == 'OnlineCourse'\)/
96
- end
97
- end
98
-
@@ -1,456 +0,0 @@
1
- require File.expand_path("../../../spec_helper", __FILE__)
2
- require File.join(FIXTURE_PATH, 'more', 'article')
3
- require File.join(FIXTURE_PATH, 'more', 'course')
4
-
5
- describe "ExtendedDocument views" do
6
-
7
- class Unattached < CouchRest::ExtendedDocument
8
- # Note: no use_database here
9
- property :title
10
- property :questions
11
- property :professor
12
- view_by :title
13
- end
14
-
15
- describe "a model with simple views and a default param" do
16
- before(:all) do
17
- Article.all.map{|a| a.destroy(true)}
18
- Article.database.bulk_delete
19
- written_at = Time.now - 24 * 3600 * 7
20
- @titles = ["this and that", "also interesting", "more fun", "some junk"]
21
- @titles.each do |title|
22
- a = Article.new(:title => title)
23
- a.date = written_at
24
- a.save
25
- written_at += 24 * 3600
26
- end
27
- end
28
- it "should have a design doc" do
29
- Article.design_doc["views"]["by_date"].should_not be_nil
30
- end
31
- it "should save the design doc" do
32
- Article.by_date #rescue nil
33
- doc = Article.database.get Article.design_doc.id
34
- doc['views']['by_date'].should_not be_nil
35
- end
36
- it "should return the matching raw view result" do
37
- view = Article.by_date :raw => true
38
- view['rows'].length.should == 4
39
- end
40
- it "should not include non-Articles" do
41
- Article.database.save_doc({"date" => 1})
42
- view = Article.by_date :raw => true
43
- view['rows'].length.should == 4
44
- end
45
- it "should return the matching objects (with default argument :descending => true)" do
46
- articles = Article.by_date
47
- articles.collect{|a|a.title}.should == @titles.reverse
48
- end
49
- it "should allow you to override default args" do
50
- articles = Article.by_date :descending => false
51
- articles.collect{|a|a.title}.should == @titles
52
- end
53
- end
54
-
55
- describe "another model with a simple view" do
56
- before(:all) do
57
- reset_test_db!
58
- %w{aaa bbb ddd eee}.each do |title|
59
- Course.new(:title => title).save
60
- end
61
- end
62
- it "should make the design doc upon first query" do
63
- Course.by_title
64
- doc = Course.design_doc
65
- doc['views']['all']['map'].should include('Course')
66
- end
67
- it "should can query via view" do
68
- # register methods with method-missing, for local dispatch. method
69
- # missing lookup table, no heuristics.
70
- view = Course.view :by_title
71
- designed = Course.by_title
72
- view.should == designed
73
- end
74
- it "should get them" do
75
- rs = Course.by_title
76
- rs.length.should == 4
77
- end
78
- it "should yield" do
79
- courses = []
80
- Course.view(:by_title) do |course|
81
- courses << course
82
- end
83
- courses[0]["doc"]["title"].should =='aaa'
84
- end
85
- it "should yield with by_key method" do
86
- courses = []
87
- Course.by_title do |course|
88
- courses << course
89
- end
90
- courses[0]["doc"]["title"].should =='aaa'
91
- end
92
- end
93
-
94
- describe "a ducktype view" do
95
- before(:all) do
96
- reset_test_db!
97
- @id = DB.save_doc({:dept => true})['id']
98
- end
99
- it "should setup" do
100
- duck = Course.get(@id) # from a different db
101
- duck["dept"].should == true
102
- end
103
- it "should make the design doc" do
104
- @as = Course.by_dept
105
- @doc = Course.design_doc
106
- @doc["views"]["by_dept"]["map"].should_not include("couchrest")
107
- end
108
- it "should not look for class" do
109
- @as = Course.by_dept
110
- @as[0]['_id'].should == @id
111
- end
112
- end
113
-
114
- describe "a model class not tied to a database" do
115
- before(:all) do
116
- reset_test_db!
117
- @db = DB
118
- %w{aaa bbb ddd eee}.each do |title|
119
- u = Unattached.new(:title => title)
120
- u.database = @db
121
- u.save
122
- @first_id ||= u.id
123
- end
124
- end
125
- it "should barf on all if no database given" do
126
- lambda{Unattached.all}.should raise_error
127
- end
128
- it "should query all" do
129
- Unattached.cleanup_design_docs!(@db)
130
- rs = Unattached.all :database => @db
131
- rs.length.should == 4
132
- end
133
- it "should barf on query if no database given" do
134
- lambda{Unattached.view :by_title}.should raise_error
135
- end
136
- it "should make the design doc upon first query" do
137
- Unattached.by_title :database => @db
138
- doc = Unattached.design_doc
139
- doc['views']['all']['map'].should include('Unattached')
140
- end
141
- it "should merge query params" do
142
- rs = Unattached.by_title :database=>@db, :startkey=>"bbb", :endkey=>"eee"
143
- rs.length.should == 3
144
- end
145
- it "should query via view" do
146
- view = Unattached.view :by_title, :database=>@db
147
- designed = Unattached.by_title :database=>@db
148
- view.should == designed
149
- end
150
- it "should yield" do
151
- things = []
152
- Unattached.view(:by_title, :database=>@db) do |thing|
153
- things << thing
154
- end
155
- things[0]["doc"]["title"].should =='aaa'
156
- end
157
- it "should yield with by_key method" do
158
- things = []
159
- Unattached.by_title(:database=>@db) do |thing|
160
- things << thing
161
- end
162
- things[0]["doc"]["title"].should =='aaa'
163
- end
164
- it "should return nil on get if no database given" do
165
- Unattached.get("aaa").should be_nil
166
- end
167
- it "should barf on get! if no database given" do
168
- lambda{Unattached.get!("aaa")}.should raise_error
169
- end
170
- it "should get from specific database" do
171
- u = Unattached.get(@first_id, @db)
172
- u.title.should == "aaa"
173
- end
174
- it "should barf on first if no database given" do
175
- lambda{Unattached.first}.should raise_error
176
- end
177
- it "should get first" do
178
- u = Unattached.first :database=>@db
179
- u.title.should =~ /\A...\z/
180
- end
181
- it "should barf on all_design_doc_versions if no database given" do
182
- lambda{Unattached.all_design_doc_versions}.should raise_error
183
- end
184
- it "should be able to cleanup the db/bump the revision number" do
185
- # if the previous specs were not run, the model_design_doc will be blank
186
- Unattached.use_database DB
187
- Unattached.view_by :questions
188
- Unattached.by_questions(:database => @db)
189
- original_revision = Unattached.model_design_doc(@db)['_rev']
190
- Unattached.cleanup_design_docs!(@db)
191
- Unattached.model_design_doc(@db)['_rev'].should_not == original_revision
192
- end
193
- end
194
-
195
- describe "class proxy" do
196
- before(:all) do
197
- reset_test_db!
198
- # setup the class default doc to save the design doc
199
- Unattached.use_database nil # just to be sure it is really unattached
200
- @us = Unattached.on(DB)
201
- %w{aaa bbb ddd eee}.each do |title|
202
- u = @us.new(:title => title)
203
- u.save
204
- @first_id ||= u.id
205
- end
206
- end
207
- it "should query all" do
208
- rs = @us.all
209
- rs.length.should == 4
210
- end
211
- it "should count" do
212
- @us.count.should == 4
213
- end
214
- it "should make the design doc upon first query" do
215
- @us.by_title
216
- doc = @us.design_doc
217
- doc['views']['all']['map'].should include('Unattached')
218
- end
219
- it "should merge query params" do
220
- rs = @us.by_title :startkey=>"bbb", :endkey=>"eee"
221
- rs.length.should == 3
222
- end
223
- it "should query via view" do
224
- view = @us.view :by_title
225
- designed = @us.by_title
226
- view.should == designed
227
- end
228
- it "should yield" do
229
- things = []
230
- @us.view(:by_title) do |thing|
231
- things << thing
232
- end
233
- things[0]["doc"]["title"].should =='aaa'
234
- end
235
- it "should yield with by_key method" do
236
- things = []
237
- @us.by_title do |thing|
238
- things << thing
239
- end
240
- things[0]["doc"]["title"].should =='aaa'
241
- end
242
- it "should get from specific database" do
243
- u = @us.get(@first_id)
244
- u.title.should == "aaa"
245
- end
246
- it "should get first" do
247
- u = @us.first
248
- u.title.should =~ /\A...\z/
249
- end
250
- it "should set database on first retreived document" do
251
- u = @us.first
252
- u.database.should === DB
253
- end
254
- it "should set database on all retreived documents" do
255
- @us.all.each do |u|
256
- u.database.should === DB
257
- end
258
- end
259
- it "should set database on each retreived document" do
260
- rs = @us.by_title :startkey=>"bbb", :endkey=>"eee"
261
- rs.length.should == 3
262
- rs.each do |u|
263
- u.database.should === DB
264
- end
265
- end
266
- it "should set database on document retreived by id" do
267
- u = @us.get(@first_id)
268
- u.database.should === DB
269
- end
270
- it "should not attempt to set database on raw results using :all" do
271
- @us.all(:raw => true).each do |u|
272
- u.respond_to?(:database).should be_false
273
- end
274
- end
275
- it "should not attempt to set database on raw results using view" do
276
- @us.by_title(:raw => true).each do |u|
277
- u.respond_to?(:database).should be_false
278
- end
279
- end
280
- it "should clean up design docs left around on specific database" do
281
- @us.by_title
282
- original_id = @us.model_design_doc['_rev']
283
- Unattached.view_by :professor
284
- @us.by_professor
285
- @us.model_design_doc['_rev'].should_not == original_id
286
- end
287
- end
288
-
289
- describe "a model with a compound key view" do
290
- before(:all) do
291
- Article.by_user_id_and_date.each{|a| a.destroy(true)}
292
- Article.database.bulk_delete
293
- written_at = Time.now - 24 * 3600 * 7
294
- @titles = ["uniq one", "even more interesting", "less fun", "not junk"]
295
- @user_ids = ["quentin", "aaron"]
296
- @titles.each_with_index do |title,i|
297
- u = i % 2
298
- a = Article.new(:title => title, :user_id => @user_ids[u])
299
- a.date = written_at
300
- a.save
301
- written_at += 24 * 3600
302
- end
303
- end
304
- it "should create the design doc" do
305
- Article.by_user_id_and_date rescue nil
306
- doc = Article.design_doc
307
- doc['views']['by_date'].should_not be_nil
308
- end
309
- it "should sort correctly" do
310
- articles = Article.by_user_id_and_date
311
- articles.collect{|a|a['user_id']}.should == ['aaron', 'aaron', 'quentin',
312
- 'quentin']
313
- articles[1].title.should == 'not junk'
314
- end
315
- it "should be queryable with couchrest options" do
316
- articles = Article.by_user_id_and_date :limit => 1, :startkey => 'quentin'
317
- articles.length.should == 1
318
- articles[0].title.should == "even more interesting"
319
- end
320
- end
321
-
322
- describe "with a custom view" do
323
- before(:all) do
324
- @titles = ["very uniq one", "even less interesting", "some fun",
325
- "really junk", "crazy bob"]
326
- @tags = ["cool", "lame"]
327
- @titles.each_with_index do |title,i|
328
- u = i % 2
329
- a = Article.new(:title => title, :tags => [@tags[u]])
330
- a.save
331
- end
332
- end
333
- it "should be available raw" do
334
- view = Article.by_tags :raw => true
335
- view['rows'].length.should == 5
336
- end
337
-
338
- it "should be default to :reduce => false" do
339
- ars = Article.by_tags
340
- ars.first.tags.first.should == 'cool'
341
- end
342
-
343
- it "should be raw when reduce is true" do
344
- view = Article.by_tags :reduce => true, :group => true
345
- view['rows'].find{|r|r['key'] == 'cool'}['value'].should == 3
346
- end
347
- end
348
-
349
- # TODO: moved to Design, delete
350
- describe "adding a view" do
351
- before(:each) do
352
- reset_test_db!
353
- Article.by_date
354
- @original_doc_rev = Article.model_design_doc['_rev']
355
- @design_docs = Article.database.documents :startkey => "_design/", :endkey => "_design/\u9999"
356
- end
357
- it "should not create a design doc on view definition" do
358
- Article.view_by :created_at
359
- newdocs = Article.database.documents :startkey => "_design/", :endkey => "_design/\u9999"
360
- newdocs["rows"].length.should == @design_docs["rows"].length
361
- end
362
- it "should create a new version of the design document on view access" do
363
- ddocs = Article.all_design_doc_versions["rows"].length
364
- Article.view_by :updated_at
365
- Article.by_updated_at
366
- @original_doc_rev.should_not == Article.model_design_doc['_rev']
367
- Article.design_doc["views"].keys.should include("by_updated_at")
368
- end
369
- end
370
-
371
- describe "with a collection" do
372
- before(:all) do
373
- reset_test_db!
374
- titles = ["very uniq one", "really interesting", "some fun",
375
- "really awesome", "crazy bob", "this rocks", "super rad"]
376
- titles.each_with_index do |title,i|
377
- a = Article.new(:title => title, :date => Date.today)
378
- a.save
379
- end
380
-
381
- titles = ["yesterday very uniq one", "yesterday really interesting", "yesterday some fun",
382
- "yesterday really awesome", "yesterday crazy bob", "yesterday this rocks"]
383
- titles.each_with_index do |title,i|
384
- a = Article.new(:title => title, :date => Date.today - 1)
385
- a.save
386
- end
387
- end
388
- require 'date'
389
- it "should return a proxy that looks like an array of 7 Article objects" do
390
- articles = Article.by_date :key => Date.today
391
- articles.class.should == Array
392
- articles.size.should == 7
393
- end
394
- it "should get a subset of articles using paginate" do
395
- articles = Article.by_date :key => Date.today
396
- articles.paginate(:page => 1, :per_page => 3).size.should == 3
397
- articles.paginate(:page => 2, :per_page => 3).size.should == 3
398
- articles.paginate(:page => 3, :per_page => 3).size.should == 1
399
- end
400
- it "should get all articles, a few at a time, using paginated each" do
401
- articles = Article.by_date :key => Date.today
402
- articles.paginated_each(:per_page => 3) do |a|
403
- a.should_not be_nil
404
- end
405
- end
406
- it "should provide a class method to access the collection directly" do
407
- articles = Article.collection_proxy_for('Article', 'by_date', :descending => true,
408
- :key => Date.today, :include_docs => true)
409
- articles.class.should == Array
410
- articles.size.should == 7
411
- end
412
- it "should provide a class method for paginate" do
413
- articles = Article.paginate(:design_doc => 'Article', :view_name => 'by_date',
414
- :per_page => 3, :descending => true, :key => Date.today, :include_docs => true)
415
- articles.size.should == 3
416
-
417
- articles = Article.paginate(:design_doc => 'Article', :view_name => 'by_date',
418
- :per_page => 3, :page => 2, :descending => true, :key => Date.today, :include_docs => true)
419
- articles.size.should == 3
420
-
421
- articles = Article.paginate(:design_doc => 'Article', :view_name => 'by_date',
422
- :per_page => 3, :page => 3, :descending => true, :key => Date.today, :include_docs => true)
423
- articles.size.should == 1
424
- end
425
- it "should provide a class method for paginated_each" do
426
- options = { :design_doc => 'Article', :view_name => 'by_date',
427
- :per_page => 3, :page => 1, :descending => true, :key => Date.today,
428
- :include_docs => true }
429
- Article.paginated_each(options) do |a|
430
- a.should_not be_nil
431
- end
432
- end
433
- it "should provide a class method to get a collection for a view" do
434
- articles = Article.find_all_article_details(:key => Date.today)
435
- articles.class.should == Array
436
- articles.size.should == 7
437
- end
438
- it "should raise an exception if design_doc is not provided" do
439
- lambda{Article.collection_proxy_for(nil, 'by_date')}.should raise_error
440
- lambda{Article.paginate(:view_name => 'by_date')}.should raise_error
441
- end
442
- it "should raise an exception if view_name is not provided" do
443
- lambda{Article.collection_proxy_for('Article', nil)}.should raise_error
444
- lambda{Article.paginate(:design_doc => 'Article')}.should raise_error
445
- end
446
- it "should be able to span multiple keys" do
447
- articles = Article.by_date :startkey => Date.today, :endkey => Date.today - 1
448
- articles.paginate(:page => 1, :per_page => 3).size.should == 3
449
- articles.paginate(:page => 2, :per_page => 3).size.should == 3
450
- articles.paginate(:page => 3, :per_page => 3).size.should == 3
451
- articles.paginate(:page => 4, :per_page => 3).size.should == 3
452
- articles.paginate(:page => 5, :per_page => 3).size.should == 1
453
- end
454
- end
455
-
456
- end