couchrest_model 1.1.2 → 1.2.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.
- data/README.md +8 -2
- data/VERSION +1 -1
- data/couchrest_model.gemspec +2 -1
- data/history.md +8 -0
- data/lib/couchrest/model/base.rb +0 -20
- data/lib/couchrest/model/configuration.rb +2 -0
- data/lib/couchrest/model/core_extensions/time_parsing.rb +35 -9
- data/lib/couchrest/model/designs/design.rb +182 -0
- data/lib/couchrest/model/designs/view.rb +91 -48
- data/lib/couchrest/model/designs.rb +72 -19
- data/lib/couchrest/model/document_queries.rb +15 -45
- data/lib/couchrest/model/properties.rb +43 -2
- data/lib/couchrest/model/proxyable.rb +20 -54
- data/lib/couchrest/model/typecast.rb +1 -1
- data/lib/couchrest/model/validations/uniqueness.rb +7 -6
- data/lib/couchrest_model.rb +1 -5
- data/spec/fixtures/models/article.rb +22 -20
- data/spec/fixtures/models/base.rb +15 -7
- data/spec/fixtures/models/course.rb +7 -4
- data/spec/fixtures/models/project.rb +4 -1
- data/spec/fixtures/models/sale_entry.rb +5 -3
- data/spec/unit/base_spec.rb +51 -5
- data/spec/unit/core_extensions/time_parsing.rb +41 -0
- data/spec/unit/designs/design_spec.rb +291 -0
- data/spec/unit/designs/view_spec.rb +135 -40
- data/spec/unit/designs_spec.rb +341 -30
- data/spec/unit/dirty_spec.rb +67 -0
- data/spec/unit/inherited_spec.rb +2 -2
- data/spec/unit/property_protection_spec.rb +3 -1
- data/spec/unit/property_spec.rb +43 -3
- data/spec/unit/proxyable_spec.rb +57 -98
- data/spec/unit/subclass_spec.rb +14 -5
- data/spec/unit/validations_spec.rb +14 -12
- metadata +172 -129
- data/lib/couchrest/model/class_proxy.rb +0 -135
- data/lib/couchrest/model/collection.rb +0 -273
- data/lib/couchrest/model/design_doc.rb +0 -115
- data/lib/couchrest/model/support/couchrest_design.rb +0 -33
- data/lib/couchrest/model/views.rb +0 -148
- data/spec/unit/class_proxy_spec.rb +0 -167
- data/spec/unit/collection_spec.rb +0 -86
- data/spec/unit/design_doc_spec.rb +0 -212
- data/spec/unit/view_spec.rb +0 -352
data/spec/unit/proxyable_spec.rb
CHANGED
@@ -148,141 +148,101 @@ describe CouchRest::Model::Proxyable do
|
|
148
148
|
@klass = CouchRest::Model::Proxyable::ModelProxy
|
149
149
|
end
|
150
150
|
|
151
|
-
|
152
|
-
@
|
153
|
-
@
|
154
|
-
@
|
155
|
-
@
|
156
|
-
@obj.
|
151
|
+
before :each do
|
152
|
+
@design_doc = mock('Design')
|
153
|
+
@design_doc.stub!(:view_names).and_return(['all', 'by_name'])
|
154
|
+
@model = mock('Cat')
|
155
|
+
@model.stub!(:design_docs).and_return([@design_doc])
|
156
|
+
@obj = @klass.new(@model, 'owner', 'owner_name', 'database')
|
157
157
|
end
|
158
158
|
|
159
|
-
describe "
|
159
|
+
describe "initialization" do
|
160
160
|
|
161
|
-
|
162
|
-
@obj
|
161
|
+
it "should set base attributes" do
|
162
|
+
@obj.model.should eql(@model)
|
163
|
+
@obj.owner.should eql('owner')
|
164
|
+
@obj.owner_name.should eql('owner_name')
|
165
|
+
@obj.database.should eql('database')
|
163
166
|
end
|
164
167
|
|
165
|
-
it "should
|
166
|
-
@obj.
|
167
|
-
@obj.
|
168
|
+
it "should create view methods" do
|
169
|
+
@obj.should respond_to('all')
|
170
|
+
@obj.should respond_to('by_name')
|
171
|
+
@obj.should respond_to('find_all')
|
172
|
+
@obj.should respond_to('find_by_name')
|
168
173
|
end
|
169
174
|
|
170
|
-
it "should proxy
|
171
|
-
@
|
172
|
-
@obj.
|
175
|
+
it "should create 'all' view method that forward to model's view with proxy" do
|
176
|
+
@model.should_receive(:all).with(:proxy => @obj).and_return(nil)
|
177
|
+
@obj.all
|
173
178
|
end
|
174
179
|
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
inst.stub!(:proxy).and_return(inst)
|
180
|
-
@obj.should_receive(:has_view?).with(m).and_return(true)
|
181
|
-
Cat.should_receive(:respond_to?).with(m).and_return(true)
|
182
|
-
Cat.should_receive(:send).with(m).and_return(inst)
|
183
|
-
@obj.method_missing(m).should eql(inst)
|
184
|
-
end
|
180
|
+
it "should create 'by_name' view method that forward to model's view with proxy" do
|
181
|
+
@model.should_receive(:by_name).with(:proxy => @obj).and_return(nil)
|
182
|
+
@obj.by_name
|
183
|
+
end
|
185
184
|
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
185
|
+
it "should create 'find_by_name' view that forwards to normal view" do
|
186
|
+
view = mock('view')
|
187
|
+
view.should_receive('key').with('name').and_return(view)
|
188
|
+
view.should_receive('first').and_return(nil)
|
189
|
+
@obj.should_receive(:by_name).and_return(view)
|
190
|
+
@obj.find_by_name('name')
|
191
|
+
end
|
193
192
|
|
194
|
-
|
195
|
-
m = "find_by_some_property"
|
196
|
-
view = "by_some_property"
|
197
|
-
@obj.should_receive(:has_view?).with(m).and_return(false)
|
198
|
-
@obj.should_receive(:has_view?).with(view).and_return(true)
|
199
|
-
@obj.should_receive(:first_from_view).with(view).and_return('view')
|
200
|
-
@obj.method_missing(m).should eql('view')
|
201
|
-
end
|
193
|
+
end
|
202
194
|
|
195
|
+
describe "instance" do
|
196
|
+
|
197
|
+
it "should proxy new call" do
|
198
|
+
@obj.should_receive(:proxy_block_update).with(:new, 'attrs', 'opts')
|
199
|
+
@obj.new('attrs', 'opts')
|
203
200
|
end
|
204
201
|
|
205
|
-
it "should proxy
|
206
|
-
|
207
|
-
@obj.
|
208
|
-
@obj.all
|
202
|
+
it "should proxy build_from_database" do
|
203
|
+
@obj.should_receive(:proxy_block_update).with(:build_from_database, 'attrs', 'opts')
|
204
|
+
@obj.build_from_database('attrs', 'opts')
|
209
205
|
end
|
210
|
-
|
206
|
+
|
211
207
|
it "should proxy #count" do
|
212
|
-
|
213
|
-
|
208
|
+
view = mock('View')
|
209
|
+
view.should_receive(:count).and_return(nil)
|
210
|
+
@model.should_receive(:all).and_return(view)
|
211
|
+
@obj.count
|
214
212
|
end
|
215
213
|
|
216
214
|
it "should proxy #first" do
|
217
|
-
|
218
|
-
|
215
|
+
view = mock('View')
|
216
|
+
view.should_receive(:first).and_return(nil)
|
217
|
+
@model.should_receive(:all).and_return(view)
|
219
218
|
@obj.first
|
220
219
|
end
|
221
220
|
|
222
221
|
it "should proxy #last" do
|
223
|
-
|
224
|
-
|
222
|
+
view = mock('View')
|
223
|
+
view.should_receive(:last).and_return(nil)
|
224
|
+
@model.should_receive(:all).and_return(view)
|
225
225
|
@obj.last
|
226
226
|
end
|
227
227
|
|
228
228
|
it "should proxy #get" do
|
229
|
-
|
229
|
+
@model.should_receive(:get).with(32, 'database')
|
230
230
|
@obj.should_receive(:proxy_update)
|
231
231
|
@obj.get(32)
|
232
232
|
end
|
233
233
|
it "should proxy #find" do
|
234
|
-
|
234
|
+
@model.should_receive(:get).with(32, 'database')
|
235
235
|
@obj.should_receive(:proxy_update)
|
236
236
|
@obj.find(32)
|
237
237
|
end
|
238
238
|
|
239
|
-
it "should proxy #has_view?" do
|
240
|
-
Cat.should_receive(:has_view?).with('view').and_return(false)
|
241
|
-
@obj.has_view?('view')
|
242
|
-
end
|
243
|
-
|
244
|
-
it "should proxy #view_by" do
|
245
|
-
Cat.should_receive(:view_by).with('name').and_return(false)
|
246
|
-
@obj.view_by('name')
|
247
|
-
end
|
248
|
-
|
249
|
-
it "should proxy #view" do
|
250
|
-
Cat.should_receive(:view).with('view', {:database => 'database'})
|
251
|
-
@obj.should_receive(:proxy_update_all)
|
252
|
-
@obj.view('view')
|
253
|
-
end
|
254
|
-
|
255
|
-
it "should proxy #first_from_view" do
|
256
|
-
Cat.should_receive(:first_from_view).with('view', {:database => 'database'})
|
257
|
-
@obj.should_receive(:proxy_update)
|
258
|
-
@obj.first_from_view('view')
|
259
|
-
end
|
260
|
-
|
261
|
-
it "should proxy design_doc" do
|
262
|
-
Cat.should_receive(:design_doc)
|
263
|
-
@obj.design_doc
|
264
|
-
end
|
265
|
-
|
266
|
-
describe "#save_design_doc" do
|
267
|
-
it "should be proxied without args" do
|
268
|
-
Cat.should_receive(:save_design_doc).with('database')
|
269
|
-
@obj.save_design_doc
|
270
|
-
end
|
271
|
-
|
272
|
-
it "should be proxied with database arg" do
|
273
|
-
Cat.should_receive(:save_design_doc).with('db')
|
274
|
-
@obj.save_design_doc('db')
|
275
|
-
end
|
276
|
-
end
|
277
|
-
|
278
|
-
|
279
239
|
|
280
240
|
### Updating methods
|
281
241
|
|
282
242
|
describe "#proxy_update" do
|
283
243
|
it "should set returned doc fields" do
|
284
244
|
doc = mock(:Document)
|
285
|
-
doc.should_receive(:is_a?).with(
|
245
|
+
doc.should_receive(:is_a?).with(@model).and_return(true)
|
286
246
|
doc.should_receive(:database=).with('database')
|
287
247
|
doc.should_receive(:model_proxy=).with(@obj)
|
288
248
|
doc.should_receive(:send).with('owner_name=', 'owner')
|
@@ -291,7 +251,7 @@ describe CouchRest::Model::Proxyable do
|
|
291
251
|
|
292
252
|
it "should not set anything if matching document not provided" do
|
293
253
|
doc = mock(:DocumentFoo)
|
294
|
-
doc.should_receive(:is_a?).with(
|
254
|
+
doc.should_receive(:is_a?).with(@model).and_return(false)
|
295
255
|
doc.should_not_receive(:database=)
|
296
256
|
doc.should_not_receive(:model_proxy=)
|
297
257
|
doc.should_not_receive(:owner_name=)
|
@@ -343,13 +303,12 @@ describe CouchRest::Model::Proxyable do
|
|
343
303
|
view :by_total
|
344
304
|
end
|
345
305
|
end
|
346
|
-
|
347
|
-
|
348
306
|
@company = ProxyableCompany.create(:slug => 'samco')
|
349
307
|
end
|
350
308
|
|
351
309
|
it "should create the new database" do
|
352
|
-
@company.proxyable_invoices.all
|
310
|
+
view = @company.proxyable_invoices.all
|
311
|
+
view.should be_empty
|
353
312
|
TEST_SERVER.databases.find{|db| db =~ /#{TESTDB}-samco/}.should_not be_nil
|
354
313
|
end
|
355
314
|
|
data/spec/unit/subclass_spec.rb
CHANGED
@@ -17,13 +17,17 @@ end
|
|
17
17
|
|
18
18
|
class OnlineCourse < Course
|
19
19
|
property :url
|
20
|
-
|
20
|
+
design do
|
21
|
+
view :by_url
|
22
|
+
end
|
21
23
|
end
|
22
24
|
|
23
25
|
class Animal < CouchRest::Model::Base
|
24
26
|
use_database TEST_SERVER.default_database
|
25
27
|
property :name
|
26
|
-
|
28
|
+
design do
|
29
|
+
view :by_name
|
30
|
+
end
|
27
31
|
end
|
28
32
|
|
29
33
|
class Dog < Animal; end
|
@@ -67,19 +71,24 @@ describe "Subclassing a Model" do
|
|
67
71
|
end
|
68
72
|
|
69
73
|
it "should have a design doc slug based on the subclass name" do
|
70
|
-
OnlineCourse.
|
74
|
+
OnlineCourse.design_doc['_id'].should =~ /OnlineCourse$/
|
71
75
|
end
|
72
76
|
|
73
77
|
it "should not add views to the parent's design_doc" do
|
74
78
|
Course.design_doc['views'].keys.should_not include('by_url')
|
75
79
|
end
|
76
80
|
|
77
|
-
it "should
|
78
|
-
OnlineCourse.design_doc['views'].keys.
|
81
|
+
it "should add the parent's views to its design doc" do
|
82
|
+
OnlineCourse.design_doc['views'].keys.should include('by_title')
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should add the parent's views but alter the model names in map function" do
|
86
|
+
OnlineCourse.design_doc['views']['by_title']['map'].should =~ /doc\['#{OnlineCourse.model_type_key}'\] == 'OnlineCourse'/
|
79
87
|
end
|
80
88
|
|
81
89
|
it "should have an all view with a guard clause for model == subclass name in the map function" do
|
82
90
|
OnlineCourse.design_doc['views']['all']['map'].should =~ /if \(doc\['#{OnlineCourse.model_type_key}'\] == 'OnlineCourse'\)/
|
83
91
|
end
|
92
|
+
|
84
93
|
end
|
85
94
|
|
@@ -10,7 +10,7 @@ describe CouchRest::Model::Validations do
|
|
10
10
|
end
|
11
11
|
|
12
12
|
it "should create a new view if none defined before performing" do
|
13
|
-
WithUniqueValidation.has_view?(:by_title).should be_true
|
13
|
+
WithUniqueValidation.design_doc.has_view?(:by_title).should be_true
|
14
14
|
end
|
15
15
|
|
16
16
|
it "should validate a new unique document" do
|
@@ -49,16 +49,14 @@ describe CouchRest::Model::Validations do
|
|
49
49
|
|
50
50
|
it "should not try to create a defined view" do
|
51
51
|
WithUniqueValidationView.validates_uniqueness_of :title, :view => 'fooobar'
|
52
|
-
WithUniqueValidationView.has_view?('fooobar').should be_false
|
53
|
-
WithUniqueValidationView.has_view?('by_title').should be_false
|
52
|
+
WithUniqueValidationView.design_doc.has_view?('fooobar').should be_false
|
53
|
+
WithUniqueValidationView.design_doc.has_view?('by_title').should be_false
|
54
54
|
end
|
55
55
|
|
56
56
|
|
57
57
|
it "should not try to create new view when already defined" do
|
58
58
|
@obj = @objs[1]
|
59
|
-
@obj.class.should_not_receive('
|
60
|
-
@obj.class.should_receive('has_view?').and_return(true)
|
61
|
-
@obj.class.should_receive('view').and_return({'rows' => [ ]})
|
59
|
+
@obj.class.design_doc.should_not_receive('create_view')
|
62
60
|
@obj.valid?
|
63
61
|
end
|
64
62
|
end
|
@@ -66,7 +64,7 @@ describe CouchRest::Model::Validations do
|
|
66
64
|
context "with a proxy parameter" do
|
67
65
|
|
68
66
|
it "should create a new view despite proxy" do
|
69
|
-
WithUniqueValidationProxy.has_view?(:by_title).should be_true
|
67
|
+
WithUniqueValidationProxy.design_doc.has_view?(:by_title).should be_true
|
70
68
|
end
|
71
69
|
|
72
70
|
it "should be used" do
|
@@ -77,19 +75,23 @@ describe CouchRest::Model::Validations do
|
|
77
75
|
|
78
76
|
it "should allow specific view" do
|
79
77
|
@obj = WithUniqueValidationProxy.new(:title => 'test 7')
|
80
|
-
@obj.class.should_not_receive('
|
78
|
+
@obj.class.should_not_receive('by_title')
|
79
|
+
view = mock('View')
|
80
|
+
view.stub!(:rows).and_return([])
|
81
81
|
proxy = mock('Proxy')
|
82
|
+
proxy.should_receive('by_title').and_return(view)
|
83
|
+
proxy.should_receive('respond_to?').with('by_title').and_return(true)
|
82
84
|
@obj.should_receive('proxy').and_return(proxy)
|
83
|
-
proxy.should_receive('has_view?').and_return(true)
|
84
|
-
proxy.should_receive('view').and_return({'rows' => [ ]})
|
85
85
|
@obj.valid?
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
89
89
|
context "when proxied" do
|
90
90
|
it "should lookup the model_proxy" do
|
91
|
+
view = mock('View')
|
92
|
+
view.stub!(:rows).and_return([])
|
91
93
|
mp = mock(:ModelProxy)
|
92
|
-
mp.should_receive(:
|
94
|
+
mp.should_receive(:by_title).and_return(view)
|
93
95
|
@obj = WithUniqueValidation.new(:title => 'test 8')
|
94
96
|
@obj.stub!(:model_proxy).twice.and_return(mp)
|
95
97
|
@obj.valid?
|
@@ -103,7 +105,7 @@ describe CouchRest::Model::Validations do
|
|
103
105
|
end
|
104
106
|
|
105
107
|
it "should create the view" do
|
106
|
-
@objs.first.class.has_view?('by_parent_id_and_title')
|
108
|
+
@objs.first.class.design_doc.has_view?('by_parent_id_and_title')
|
107
109
|
end
|
108
110
|
|
109
111
|
it "should validate unique document" do
|