This commit is contained in:
Marcos Tapajós 2011-01-16 22:56:01 -02:00
commit 93cce72a2f
7 changed files with 56 additions and 4 deletions

2
.gitignore vendored
View file

@ -6,3 +6,5 @@ Gemfile*
.rvmrc .rvmrc
.bundle .bundle
couchdb.std* couchdb.std*
*.*~

View file

@ -75,6 +75,12 @@ module CouchRest
doc doc
end end
def last(opts = {})
doc = @klass.last({:database => @database}.merge(opts))
doc.database = @database if doc && doc.respond_to?(:database)
doc
end
def get(id) def get(id)
doc = @klass.get(id, @database) doc = @klass.get(id, @database)
doc.database = @database if doc && doc.respond_to?(:database) doc.database = @database if doc && doc.respond_to?(:database)

View file

@ -38,6 +38,22 @@ module CouchRest
first_instance.empty? ? nil : first_instance.first first_instance.empty? ? nil : first_instance.first
end end
# Load the last document that have the model_type_key's field equal to
# the name of the current class.
# It's similar to method first, just adds :descending => true
#
# ==== Returns
# Object:: The last object instance available
# or
# Nil:: if no instances available
#
# ==== Parameters
# opts<Hash>::
# View options, see <tt>CouchRest::Database#view</tt> options for more info.
def last(opts = {})
first(opts.merge!(:descending => true))
end
# Load a document from the database by id # Load a document from the database by id
# No exceptions will be raised if the document isn't found # No exceptions will be raised if the document isn't found
# #

View file

@ -18,6 +18,16 @@ module CouchRest
self.class.properties self.class.properties
end end
# Returns the Class properties with their values
#
# ==== Returns
# Array:: the list of properties with their values
def properties_with_values
props = {}
properties.each { |property| props[property.name] = read_attribute(property.name) }
props
end
# Read the casted value of an attribute defined with a property. # Read the casted value of an attribute defined with a property.
# #
# ==== Returns # ==== Returns
@ -35,7 +45,7 @@ module CouchRest
# Takes a hash as argument, and applies the values by using writer methods # Takes a hash as argument, and applies the values by using writer methods
# for each key. It doesn't save the document at the end. Raises a NoMethodError if the corresponding methods are # for each key. It doesn't save the document at the end. Raises a NoMethodError if the corresponding methods are
# missing. In case of error, no attributes are changed. # missing. In case of error, no attributes are changed.
def update_attributes_without_saving(hash) def update_attributes_without_saving(hash)
# Remove any protected and update all the rest. Any attributes # Remove any protected and update all the rest. Any attributes
# which do not have a property will simply be ignored. # which do not have a property will simply be ignored.
@ -47,7 +57,6 @@ module CouchRest
private private
# The following methods should be accessable by the Model::Base Class, but not by anything else! # The following methods should be accessable by the Model::Base Class, but not by anything else!
def apply_all_property_defaults def apply_all_property_defaults
return if self.respond_to?(:new?) && (new? == false) return if self.respond_to?(:new?) && (new? == false)
# TODO: cache the default object # TODO: cache the default object
@ -59,7 +68,7 @@ module CouchRest
def prepare_all_attributes(doc = {}, options = {}) def prepare_all_attributes(doc = {}, options = {})
apply_all_property_defaults apply_all_property_defaults
if options[:directly_set_attributes] if options[:directly_set_attributes]
directly_set_read_only_attributes(doc) directly_set_read_only_attributes(doc)
else else
doc = remove_protected_attributes(doc) doc = remove_protected_attributes(doc)
end end
@ -97,7 +106,7 @@ module CouchRest
end end
end end
end end
def set_attributes(hash) def set_attributes(hash)
attrs = remove_protected_attributes(hash) attrs = remove_protected_attributes(hash)
directly_set_attributes(attrs) directly_set_attributes(attrs)
@ -206,3 +215,4 @@ module CouchRest
end end
end end
end end

View file

@ -87,6 +87,12 @@ describe "Proxy Class" do
u = @us.first u = @us.first
u.title.should =~ /\A...\z/ u.title.should =~ /\A...\z/
end end
it "should get last" do
u = @us.last
u.title.should == "aaa"
end
it "should set database on first retreived document" do it "should set database on first retreived document" do
u = @us.first u = @us.first
u.database.should === DB u.database.should === DB

View file

@ -22,6 +22,11 @@ describe "Model properties" do
@card.properties.map{|p| p.name}.should include("first_name") @card.properties.map{|p| p.name}.should include("first_name")
end end
it "should list object properties with values" do
@card.properties_with_values.should be_an_instance_of(Hash)
@card.properties_with_values["first_name"].should == "matt"
end
it "should let you access a property value (getter)" do it "should let you access a property value (getter)" do
@card.first_name.should == "matt" @card.first_name.should == "matt"
end end
@ -869,3 +874,4 @@ describe "Property Class" do
end end
end end

View file

@ -273,6 +273,12 @@ describe "Model views" do
u = Unattached.first :database=>@db u = Unattached.first :database=>@db
u.title.should =~ /\A...\z/ u.title.should =~ /\A...\z/
end end
it "should get last" do
u = Unattached.last :database=>@db
u.title.should == "aaa"
end
it "should barf on all_design_doc_versions if no database given" do it "should barf on all_design_doc_versions if no database given" do
lambda{Unattached.all_design_doc_versions}.should raise_error lambda{Unattached.all_design_doc_versions}.should raise_error
end end