casted_by is now set on assignment to a document.
This commit is contained in:
parent
3e4c90f104
commit
efeb654114
|
@ -44,13 +44,14 @@ module CouchRest
|
||||||
target = property.type
|
target = property.type
|
||||||
if target.is_a?(Array)
|
if target.is_a?(Array)
|
||||||
klass = ::CouchRest.constantize(target[0])
|
klass = ::CouchRest.constantize(target[0])
|
||||||
self[property.name] = self[key].collect do |value|
|
arr = self[key].collect do |value|
|
||||||
# Auto parse Time objects
|
# Auto parse Time objects
|
||||||
obj = ( (property.init_method == 'new') && klass == Time) ? Time.parse(value) : klass.send(property.init_method, value)
|
obj = ( (property.init_method == 'new') && klass == Time) ? Time.parse(value) : klass.send(property.init_method, value)
|
||||||
obj.casted_by = self if obj.respond_to?(:casted_by)
|
obj.casted_by = self if obj.respond_to?(:casted_by)
|
||||||
obj.document_saved = true if obj.respond_to?(:document_saved)
|
obj.document_saved = true if obj.respond_to?(:document_saved)
|
||||||
obj
|
obj
|
||||||
end
|
end
|
||||||
|
self[property.name] = target[0] != 'String' ? CastedArray.new(arr) : arr
|
||||||
else
|
else
|
||||||
# Auto parse Time objects
|
# Auto parse Time objects
|
||||||
self[property.name] = if ((property.init_method == 'new') && target == 'Time')
|
self[property.name] = if ((property.init_method == 'new') && target == 'Time')
|
||||||
|
@ -63,6 +64,7 @@ module CouchRest
|
||||||
self[property.name].casted_by = self if self[property.name].respond_to?(:casted_by)
|
self[property.name].casted_by = self if self[property.name].respond_to?(:casted_by)
|
||||||
self[property.name].document_saved = true if self[property.name].respond_to?(:document_saved)
|
self[property.name].document_saved = true if self[property.name].respond_to?(:document_saved)
|
||||||
end
|
end
|
||||||
|
self[property.name].casted_by = self if self[property.name].respond_to?(:casted_by)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -109,6 +111,14 @@ module CouchRest
|
||||||
meth = property.name
|
meth = property.name
|
||||||
class_eval <<-EOS
|
class_eval <<-EOS
|
||||||
def #{meth}=(value)
|
def #{meth}=(value)
|
||||||
|
if #{property.casted} && value.is_a?(Array)
|
||||||
|
arr = CastedArray.new
|
||||||
|
arr.casted_by = self
|
||||||
|
value.each { |v| arr << v }
|
||||||
|
value = arr
|
||||||
|
elsif #{property.casted}
|
||||||
|
value.casted_by = self if value.respond_to?(:casted_by)
|
||||||
|
end
|
||||||
self['#{meth}'] = value
|
self['#{meth}'] = value
|
||||||
end
|
end
|
||||||
EOS
|
EOS
|
||||||
|
|
|
@ -38,3 +38,22 @@ module CouchRest
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class CastedArray < Array
|
||||||
|
attr_accessor :casted_by
|
||||||
|
|
||||||
|
def << obj
|
||||||
|
obj.casted_by = self.casted_by if obj.respond_to?(:casted_by)
|
||||||
|
super(obj)
|
||||||
|
end
|
||||||
|
|
||||||
|
def push(obj)
|
||||||
|
obj.casted_by = self.casted_by if obj.respond_to?(:casted_by)
|
||||||
|
super(obj)
|
||||||
|
end
|
||||||
|
|
||||||
|
def []= index, obj
|
||||||
|
obj.casted_by = self.casted_by if obj.respond_to?(:casted_by)
|
||||||
|
super(index, obj)
|
||||||
|
end
|
||||||
|
end
|
|
@ -3,6 +3,7 @@ require File.join(FIXTURE_PATH, 'more', 'card')
|
||||||
require File.join(FIXTURE_PATH, 'more', 'invoice')
|
require File.join(FIXTURE_PATH, 'more', 'invoice')
|
||||||
require File.join(FIXTURE_PATH, 'more', 'service')
|
require File.join(FIXTURE_PATH, 'more', 'service')
|
||||||
require File.join(FIXTURE_PATH, 'more', 'event')
|
require File.join(FIXTURE_PATH, 'more', 'event')
|
||||||
|
require File.join(FIXTURE_PATH, 'more', 'cat')
|
||||||
|
|
||||||
|
|
||||||
describe "ExtendedDocument properties" do
|
describe "ExtendedDocument properties" do
|
||||||
|
@ -131,6 +132,70 @@ describe "ExtendedDocument properties" do
|
||||||
@event['occurs_at'].should be_an_instance_of(Time)
|
@event['occurs_at'].should be_an_instance_of(Time)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "a newly created casted model" do
|
||||||
|
before(:each) do
|
||||||
|
reset_test_db!
|
||||||
|
@cat = Cat.new(:name => 'Toonces')
|
||||||
|
@squeaky_mouse = CatToy.new(:name => 'Squeaky')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "assigned assigned to a casted property" do
|
||||||
|
it "should have casted_by set to its parent" do
|
||||||
|
@squeaky_mouse.casted_by.should be_nil
|
||||||
|
@cat.favorite_toy = @squeaky_mouse
|
||||||
|
@squeaky_mouse.casted_by.should === @cat
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "appended to a casted collection" do
|
||||||
|
it "should have casted_by set to its parent" do
|
||||||
|
@squeaky_mouse.casted_by.should be_nil
|
||||||
|
@cat.toys << @squeaky_mouse
|
||||||
|
@squeaky_mouse.casted_by.should === @cat
|
||||||
|
@cat.save
|
||||||
|
@cat.toys.first.casted_by.should === @cat
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "list assigned to a casted collection" do
|
||||||
|
it "should have casted_by set on all elements" do
|
||||||
|
toy1 = CatToy.new(:name => 'Feather')
|
||||||
|
toy2 = CatToy.new(:name => 'Mouse')
|
||||||
|
@cat.toys = [toy1, toy2]
|
||||||
|
toy1.casted_by.should === @cat
|
||||||
|
toy2.casted_by.should === @cat
|
||||||
|
@cat.save
|
||||||
|
@cat = Cat.get(@cat.id)
|
||||||
|
@cat.toys[0].casted_by.should === @cat
|
||||||
|
@cat.toys[1].casted_by.should === @cat
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "a casted model retrieved from the database" do
|
||||||
|
before(:each) do
|
||||||
|
reset_test_db!
|
||||||
|
@cat = Cat.new(:name => 'Stimpy')
|
||||||
|
@cat.favorite_toy = CatToy.new(:name => 'Stinky')
|
||||||
|
@cat.toys << CatToy.new(:name => 'Feather')
|
||||||
|
@cat.toys << CatToy.new(:name => 'Mouse')
|
||||||
|
@cat.save
|
||||||
|
@cat = Cat.get(@cat.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "as a casted property" do
|
||||||
|
it "should already be casted_by its parent" do
|
||||||
|
@cat.favorite_toy.casted_by.should === @cat
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "from a casted collection" do
|
||||||
|
it "should already be casted_by its parent" do
|
||||||
|
@cat.toys[0].casted_by.should === @cat
|
||||||
|
@cat.toys[1].casted_by.should === @cat
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue