couchrest_model 1.1.0.beta5 → 1.1.0.rc1
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 +9 -12
- data/VERSION +1 -1
- data/couchrest_model.gemspec +6 -6
- data/history.md +23 -0
- data/lib/couchrest/model/associations.rb +50 -54
- data/lib/couchrest/model/base.rb +10 -15
- data/lib/couchrest/model/casted_array.rb +16 -0
- data/lib/couchrest/model/class_proxy.rb +8 -1
- data/lib/couchrest/model/collection.rb +1 -0
- data/lib/couchrest/model/design_doc.rb +0 -2
- data/lib/couchrest/model/document_queries.rb +8 -8
- data/lib/couchrest/model/errors.rb +2 -0
- data/lib/couchrest/model/persistence.rb +20 -15
- data/lib/couchrest/model/properties.rb +17 -29
- data/lib/couchrest/model/property.rb +23 -7
- data/lib/couchrest/model/proxyable.rb +11 -4
- data/lib/couchrest/model/support/couchrest_database.rb +13 -0
- data/lib/couchrest/model/support/couchrest_design.rb +1 -1
- data/lib/couchrest/model/typecast.rb +1 -2
- data/lib/couchrest/model/validations/uniqueness.rb +29 -14
- data/lib/couchrest_model.rb +1 -1
- data/spec/couchrest/assocations_spec.rb +28 -1
- data/spec/couchrest/base_spec.rb +64 -26
- data/spec/couchrest/class_proxy_spec.rb +29 -0
- data/spec/couchrest/collection_spec.rb +6 -7
- data/spec/couchrest/design_doc_spec.rb +5 -1
- data/spec/couchrest/dirty_spec.rb +52 -0
- data/spec/couchrest/inherited_spec.rb +23 -30
- data/spec/couchrest/persistence_spec.rb +40 -18
- data/spec/couchrest/property_spec.rb +90 -4
- data/spec/couchrest/proxyable_spec.rb +14 -7
- data/spec/couchrest/validations_spec.rb +18 -1
- data/spec/fixtures/base.rb +4 -3
- data/spec/fixtures/more/article.rb +1 -0
- data/spec/fixtures/more/cat.rb +4 -0
- data/spec/fixtures/more/key_chain.rb +5 -0
- metadata +22 -21
@@ -1,5 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require File.expand_path('../../spec_helper', __FILE__)
|
3
|
+
require File.join(FIXTURE_PATH, 'more', 'article')
|
3
4
|
require File.join(FIXTURE_PATH, 'more', 'cat')
|
4
5
|
require File.join(FIXTURE_PATH, 'more', 'person')
|
5
6
|
require File.join(FIXTURE_PATH, 'more', 'card')
|
@@ -8,6 +9,7 @@ require File.join(FIXTURE_PATH, 'more', 'service')
|
|
8
9
|
require File.join(FIXTURE_PATH, 'more', 'event')
|
9
10
|
require File.join(FIXTURE_PATH, 'more', 'user')
|
10
11
|
require File.join(FIXTURE_PATH, 'more', 'course')
|
12
|
+
require File.join(FIXTURE_PATH, "more", "key_chain")
|
11
13
|
|
12
14
|
|
13
15
|
describe "Model properties" do
|
@@ -71,6 +73,24 @@ describe "Model properties" do
|
|
71
73
|
@card.updated_at.should_not be_nil
|
72
74
|
end
|
73
75
|
|
76
|
+
describe "#as_json" do
|
77
|
+
|
78
|
+
it "should provide a simple hash from model" do
|
79
|
+
@card.as_json.class.should eql(Hash)
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should remove properties from Hash if value is nil" do
|
83
|
+
@card.last_name = nil
|
84
|
+
@card.as_json.keys.include?('last_name').should be_false
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should pass options to Active Support's as_json" do
|
88
|
+
@card.last_name = "Aimonetti"
|
89
|
+
@card.as_json(:only => 'last_name').should eql('last_name' => 'Aimonetti')
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
74
94
|
describe '#read_attribute' do
|
75
95
|
it "should let you use read_attribute method" do
|
76
96
|
@card.last_name = "Aimonetti"
|
@@ -220,6 +240,16 @@ describe "Model properties" do
|
|
220
240
|
|
221
241
|
end
|
222
242
|
|
243
|
+
describe "properties of hash of casted models" do
|
244
|
+
it "should be able to assign a casted hash to a hash property" do
|
245
|
+
chain = KeyChain.new
|
246
|
+
keys = {"House" => "8==$", "Office" => "<>==U"}
|
247
|
+
chain.keys = keys
|
248
|
+
chain.keys = chain.keys
|
249
|
+
chain.keys.should == keys
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
223
253
|
describe "properties of array of casted models" do
|
224
254
|
|
225
255
|
before(:each) do
|
@@ -246,9 +276,9 @@ describe "properties of array of casted models" do
|
|
246
276
|
end
|
247
277
|
|
248
278
|
it "should allow attribute to be set from hash with ordered keys and sub-hashes" do
|
249
|
-
@course.questions = { '0' => {:q => "Test1"}, '1' => {:q => 'Test2'} }
|
250
|
-
@course.questions.length.should eql(
|
251
|
-
@course.questions.last.q.should eql('
|
279
|
+
@course.questions = { '10' => {:q => 'Test10'}, '0' => {:q => "Test1"}, '1' => {:q => 'Test2'} }
|
280
|
+
@course.questions.length.should eql(3)
|
281
|
+
@course.questions.last.q.should eql('Test10')
|
252
282
|
@course.questions.last.class.should eql(Question)
|
253
283
|
end
|
254
284
|
|
@@ -265,7 +295,7 @@ describe "properties of array of casted models" do
|
|
265
295
|
it "should raise an error if attempting to set single value for array type" do
|
266
296
|
lambda {
|
267
297
|
@course.questions = Question.new(:q => 'test1')
|
268
|
-
}.should raise_error
|
298
|
+
}.should raise_error(/Expecting an array/)
|
269
299
|
end
|
270
300
|
|
271
301
|
|
@@ -296,6 +326,28 @@ describe "a casted model retrieved from the database" do
|
|
296
326
|
end
|
297
327
|
end
|
298
328
|
|
329
|
+
describe "nested models (not casted)" do
|
330
|
+
before(:each) do
|
331
|
+
reset_test_db!
|
332
|
+
@cat = ChildCat.new(:name => 'Stimpy')
|
333
|
+
@cat.mother = {:name => 'Stinky'}
|
334
|
+
@cat.siblings = [{:name => 'Feather'}, {:name => 'Felix'}]
|
335
|
+
@cat.save
|
336
|
+
@cat = ChildCat.get(@cat.id)
|
337
|
+
end
|
338
|
+
|
339
|
+
it "should correctly save single relation" do
|
340
|
+
@cat.mother.name.should eql('Stinky')
|
341
|
+
@cat.mother.casted_by.should eql(@cat)
|
342
|
+
end
|
343
|
+
|
344
|
+
it "should correctly save collection" do
|
345
|
+
@cat.siblings.first.name.should eql("Feather")
|
346
|
+
@cat.siblings.last.casted_by.should eql(@cat)
|
347
|
+
end
|
348
|
+
|
349
|
+
end
|
350
|
+
|
299
351
|
describe "Property Class" do
|
300
352
|
|
301
353
|
it "should provide name as string" do
|
@@ -339,6 +391,28 @@ describe "Property Class" do
|
|
339
391
|
property.init_method.should eql('parse')
|
340
392
|
end
|
341
393
|
|
394
|
+
describe "#build" do
|
395
|
+
it "should allow instantiation of new object" do
|
396
|
+
property = CouchRest::Model::Property.new(:test, Date)
|
397
|
+
obj = property.build(2011, 05, 21)
|
398
|
+
obj.should eql(Date.new(2011, 05, 21))
|
399
|
+
end
|
400
|
+
it "should use init_method if provided" do
|
401
|
+
property = CouchRest::Model::Property.new(:test, Date, :init_method => 'parse')
|
402
|
+
obj = property.build("2011-05-21")
|
403
|
+
obj.should eql(Date.new(2011, 05, 21))
|
404
|
+
end
|
405
|
+
it "should use init_method Proc if provided" do
|
406
|
+
property = CouchRest::Model::Property.new(:test, Date, :init_method => Proc.new{|v| Date.parse(v)})
|
407
|
+
obj = property.build("2011-05-21")
|
408
|
+
obj.should eql(Date.new(2011, 05, 21))
|
409
|
+
end
|
410
|
+
it "should raise error if no class" do
|
411
|
+
property = CouchRest::Model::Property.new(:test)
|
412
|
+
lambda { property.build }.should raise_error(StandardError, /Cannot build/)
|
413
|
+
end
|
414
|
+
end
|
415
|
+
|
342
416
|
## Property Casting method. More thoroughly tested in typecast_spec.
|
343
417
|
|
344
418
|
describe "casting" do
|
@@ -367,6 +441,18 @@ describe "Property Class" do
|
|
367
441
|
property.cast(parent, ["2010-06-01", "2010-06-02"]).class.should eql(CouchRest::Model::CastedArray)
|
368
442
|
end
|
369
443
|
|
444
|
+
it "should allow instantion of model via CastedArray#build" do
|
445
|
+
property = CouchRest::Model::Property.new(:dates, [Date])
|
446
|
+
parent = Article.new
|
447
|
+
ary = property.cast(parent, [])
|
448
|
+
obj = ary.build(2011, 05, 21)
|
449
|
+
ary.length.should eql(1)
|
450
|
+
ary.first.should eql(Date.new(2011, 05, 21))
|
451
|
+
obj = ary.build(2011, 05, 22)
|
452
|
+
ary.length.should eql(2)
|
453
|
+
ary.last.should eql(Date.new(2011, 05, 22))
|
454
|
+
end
|
455
|
+
|
370
456
|
it "should raise and error if value is array when type is not" do
|
371
457
|
property = CouchRest::Model::Property.new(:test, Date)
|
372
458
|
parent = mock("FooClass")
|
@@ -87,7 +87,7 @@ describe "Proxyable" do
|
|
87
87
|
DummyProxyable.proxy_for(:cats)
|
88
88
|
@obj = DummyProxyable.new
|
89
89
|
CouchRest::Model::Proxyable::ModelProxy.should_receive(:new).with(Cat, @obj, 'dummy_proxyable', 'db').and_return(true)
|
90
|
-
@obj.should_receive(
|
90
|
+
@obj.should_receive(:proxy_database).and_return('db')
|
91
91
|
@obj.cats
|
92
92
|
end
|
93
93
|
|
@@ -165,15 +165,13 @@ describe "Proxyable" do
|
|
165
165
|
end
|
166
166
|
|
167
167
|
it "should proxy new call" do
|
168
|
-
|
169
|
-
@obj.
|
170
|
-
@obj.new
|
168
|
+
@obj.should_receive(:proxy_block_update).with(:new, 'attrs', 'opts')
|
169
|
+
@obj.new('attrs', 'opts')
|
171
170
|
end
|
172
171
|
|
173
172
|
it "should proxy build_from_database" do
|
174
|
-
|
175
|
-
@obj.
|
176
|
-
@obj.build_from_database
|
173
|
+
@obj.should_receive(:proxy_block_update).with(:build_from_database, 'attrs', 'opts')
|
174
|
+
@obj.build_from_database('attrs', 'opts')
|
177
175
|
end
|
178
176
|
|
179
177
|
describe "#method_missing" do
|
@@ -313,6 +311,15 @@ describe "Proxyable" do
|
|
313
311
|
@obj.send(:proxy_update_all, docs)
|
314
312
|
end
|
315
313
|
|
314
|
+
describe "#proxy_block_update" do
|
315
|
+
it "should proxy block updates" do
|
316
|
+
doc = { }
|
317
|
+
@obj.model.should_receive(:new).and_yield(doc)
|
318
|
+
@obj.should_receive(:proxy_update).with(doc)
|
319
|
+
@obj.send(:proxy_block_update, :new)
|
320
|
+
end
|
321
|
+
end
|
322
|
+
|
316
323
|
end
|
317
324
|
|
318
325
|
end
|
@@ -16,7 +16,11 @@ describe "Validations" do
|
|
16
16
|
before(:all) do
|
17
17
|
@objs = ['title 1', 'title 2', 'title 3'].map{|t| WithUniqueValidation.create(:title => t)}
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
|
+
it "should create a new view if none defined before performing" do
|
21
|
+
WithUniqueValidation.has_view?(:by_title).should be_true
|
22
|
+
end
|
23
|
+
|
20
24
|
it "should validate a new unique document" do
|
21
25
|
@obj = WithUniqueValidation.create(:title => 'title 4')
|
22
26
|
@obj.new?.should_not be_true
|
@@ -35,6 +39,7 @@ describe "Validations" do
|
|
35
39
|
@obj.should be_valid
|
36
40
|
end
|
37
41
|
|
42
|
+
|
38
43
|
it "should allow own view to be specified" do
|
39
44
|
# validates_uniqueness_of :code, :view => 'all'
|
40
45
|
WithUniqueValidationView.create(:title => 'title 1', :code => '1234')
|
@@ -50,6 +55,13 @@ describe "Validations" do
|
|
50
55
|
}.should raise_error
|
51
56
|
end
|
52
57
|
|
58
|
+
it "should not try to create a defined view" do
|
59
|
+
WithUniqueValidationView.validates_uniqueness_of :title, :view => 'fooobar'
|
60
|
+
WithUniqueValidationView.has_view?('fooobar').should be_false
|
61
|
+
WithUniqueValidationView.has_view?('by_title').should be_false
|
62
|
+
end
|
63
|
+
|
64
|
+
|
53
65
|
it "should not try to create new view when already defined" do
|
54
66
|
@obj = @objs[1]
|
55
67
|
@obj.class.should_not_receive('view_by')
|
@@ -60,6 +72,11 @@ describe "Validations" do
|
|
60
72
|
end
|
61
73
|
|
62
74
|
context "with a proxy parameter" do
|
75
|
+
|
76
|
+
it "should create a new view despite proxy" do
|
77
|
+
WithUniqueValidationProxy.has_view?(:by_title).should be_true
|
78
|
+
end
|
79
|
+
|
63
80
|
it "should be used" do
|
64
81
|
@obj = WithUniqueValidationProxy.new(:title => 'test 6')
|
65
82
|
proxy = @obj.should_receive('proxy').and_return(@obj.class)
|
data/spec/fixtures/base.rb
CHANGED
@@ -86,15 +86,16 @@ end
|
|
86
86
|
class WithTemplateAndUniqueID < CouchRest::Model::Base
|
87
87
|
use_database TEST_SERVER.default_database
|
88
88
|
unique_id do |model|
|
89
|
-
model
|
89
|
+
model.slug
|
90
90
|
end
|
91
|
+
property :slug
|
91
92
|
property :preset, :default => 'value'
|
92
93
|
property :has_no_default
|
93
94
|
end
|
94
95
|
|
95
96
|
class WithGetterAndSetterMethods < CouchRest::Model::Base
|
96
97
|
use_database TEST_SERVER.default_database
|
97
|
-
|
98
|
+
|
98
99
|
property :other_arg
|
99
100
|
def arg
|
100
101
|
other_arg
|
@@ -107,7 +108,7 @@ end
|
|
107
108
|
|
108
109
|
class WithAfterInitializeMethod < CouchRest::Model::Base
|
109
110
|
use_database TEST_SERVER.default_database
|
110
|
-
|
111
|
+
|
111
112
|
property :some_value
|
112
113
|
|
113
114
|
def after_initialize
|
data/spec/fixtures/more/cat.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: couchrest_model
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 977940566
|
5
5
|
prerelease: true
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 1
|
9
9
|
- 0
|
10
|
-
-
|
11
|
-
version: 1.1.0.
|
10
|
+
- rc1
|
11
|
+
version: 1.1.0.rc1
|
12
12
|
platform: ruby
|
13
13
|
authors:
|
14
14
|
- J. Chris Anderson
|
@@ -31,13 +31,13 @@ dependencies:
|
|
31
31
|
requirements:
|
32
32
|
- - "="
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
hash: -
|
34
|
+
hash: -1876988186
|
35
35
|
segments:
|
36
36
|
- 1
|
37
37
|
- 1
|
38
38
|
- 0
|
39
|
-
-
|
40
|
-
version: 1.1.0.
|
39
|
+
- pre3
|
40
|
+
version: 1.1.0.pre3
|
41
41
|
type: :runtime
|
42
42
|
version_requirements: *id001
|
43
43
|
- !ruby/object:Gem::Dependency
|
@@ -67,8 +67,7 @@ dependencies:
|
|
67
67
|
segments:
|
68
68
|
- 3
|
69
69
|
- 0
|
70
|
-
|
71
|
-
version: 3.0.0
|
70
|
+
version: "3.0"
|
72
71
|
type: :runtime
|
73
72
|
version_requirements: *id003
|
74
73
|
- !ruby/object:Gem::Dependency
|
@@ -88,35 +87,35 @@ dependencies:
|
|
88
87
|
type: :runtime
|
89
88
|
version_requirements: *id004
|
90
89
|
- !ruby/object:Gem::Dependency
|
91
|
-
name:
|
90
|
+
name: rspec
|
92
91
|
prerelease: false
|
93
92
|
requirement: &id005 !ruby/object:Gem::Requirement
|
94
93
|
none: false
|
95
94
|
requirements:
|
96
95
|
- - ~>
|
97
96
|
- !ruby/object:Gem::Version
|
98
|
-
hash:
|
97
|
+
hash: 23
|
99
98
|
segments:
|
100
|
-
-
|
101
|
-
-
|
99
|
+
- 2
|
100
|
+
- 6
|
102
101
|
- 0
|
103
|
-
version:
|
104
|
-
type: :
|
102
|
+
version: 2.6.0
|
103
|
+
type: :development
|
105
104
|
version_requirements: *id005
|
106
105
|
- !ruby/object:Gem::Dependency
|
107
|
-
name:
|
106
|
+
name: json
|
108
107
|
prerelease: false
|
109
108
|
requirement: &id006 !ruby/object:Gem::Requirement
|
110
109
|
none: false
|
111
110
|
requirements:
|
112
|
-
- -
|
111
|
+
- - ~>
|
113
112
|
- !ruby/object:Gem::Version
|
114
|
-
hash:
|
113
|
+
hash: 1
|
115
114
|
segments:
|
116
|
-
-
|
117
|
-
-
|
118
|
-
-
|
119
|
-
version:
|
115
|
+
- 1
|
116
|
+
- 5
|
117
|
+
- 1
|
118
|
+
version: 1.5.1
|
120
119
|
type: :development
|
121
120
|
version_requirements: *id006
|
122
121
|
- !ruby/object:Gem::Dependency
|
@@ -184,6 +183,7 @@ files:
|
|
184
183
|
- lib/couchrest/model/property.rb
|
185
184
|
- lib/couchrest/model/property_protection.rb
|
186
185
|
- lib/couchrest/model/proxyable.rb
|
186
|
+
- lib/couchrest/model/support/couchrest_database.rb
|
187
187
|
- lib/couchrest/model/support/couchrest_design.rb
|
188
188
|
- lib/couchrest/model/typecast.rb
|
189
189
|
- lib/couchrest/model/validations.rb
|
@@ -232,6 +232,7 @@ files:
|
|
232
232
|
- spec/fixtures/more/course.rb
|
233
233
|
- spec/fixtures/more/event.rb
|
234
234
|
- spec/fixtures/more/invoice.rb
|
235
|
+
- spec/fixtures/more/key_chain.rb
|
235
236
|
- spec/fixtures/more/person.rb
|
236
237
|
- spec/fixtures/more/question.rb
|
237
238
|
- spec/fixtures/more/sale_entry.rb
|