diff --git a/.gitignore b/.gitignore index 70d807f..c00c3ee 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ Gemfile* .rvmrc .bundle couchdb.std* +*.*~ + diff --git a/lib/couchrest/model/class_proxy.rb b/lib/couchrest/model/class_proxy.rb index 36200f9..3f988b1 100644 --- a/lib/couchrest/model/class_proxy.rb +++ b/lib/couchrest/model/class_proxy.rb @@ -75,6 +75,12 @@ module CouchRest doc 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) doc = @klass.get(id, @database) doc.database = @database if doc && doc.respond_to?(:database) diff --git a/lib/couchrest/model/document_queries.rb b/lib/couchrest/model/document_queries.rb index 48ec485..575a675 100644 --- a/lib/couchrest/model/document_queries.rb +++ b/lib/couchrest/model/document_queries.rb @@ -38,6 +38,22 @@ module CouchRest first_instance.empty? ? nil : first_instance.first 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:: + # View options, see CouchRest::Database#view options for more info. + def last(opts = {}) + first(opts.merge!(:descending => true)) + end + # Load a document from the database by id # No exceptions will be raised if the document isn't found # diff --git a/lib/couchrest/model/properties.rb b/lib/couchrest/model/properties.rb index 97b4c53..3f021ed 100644 --- a/lib/couchrest/model/properties.rb +++ b/lib/couchrest/model/properties.rb @@ -18,6 +18,16 @@ module CouchRest self.class.properties 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. # # ==== Returns @@ -35,7 +45,7 @@ module CouchRest # 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 - # missing. In case of error, no attributes are changed. + # missing. In case of error, no attributes are changed. def update_attributes_without_saving(hash) # Remove any protected and update all the rest. Any attributes # which do not have a property will simply be ignored. @@ -47,7 +57,6 @@ module CouchRest private # The following methods should be accessable by the Model::Base Class, but not by anything else! - def apply_all_property_defaults return if self.respond_to?(:new?) && (new? == false) # TODO: cache the default object @@ -59,7 +68,7 @@ module CouchRest def prepare_all_attributes(doc = {}, options = {}) apply_all_property_defaults if options[:directly_set_attributes] - directly_set_read_only_attributes(doc) + directly_set_read_only_attributes(doc) else doc = remove_protected_attributes(doc) end @@ -97,7 +106,7 @@ module CouchRest end end end - + def set_attributes(hash) attrs = remove_protected_attributes(hash) directly_set_attributes(attrs) @@ -206,3 +215,4 @@ module CouchRest end end end + diff --git a/spec/couchrest/class_proxy_spec.rb b/spec/couchrest/class_proxy_spec.rb index cba0e38..fc89533 100644 --- a/spec/couchrest/class_proxy_spec.rb +++ b/spec/couchrest/class_proxy_spec.rb @@ -87,6 +87,12 @@ describe "Proxy Class" do u = @us.first u.title.should =~ /\A...\z/ end + + it "should get last" do + u = @us.last + u.title.should == "aaa" + end + it "should set database on first retreived document" do u = @us.first u.database.should === DB diff --git a/spec/couchrest/property_spec.rb b/spec/couchrest/property_spec.rb index 98c0fb5..2c4eab0 100644 --- a/spec/couchrest/property_spec.rb +++ b/spec/couchrest/property_spec.rb @@ -22,6 +22,11 @@ describe "Model properties" do @card.properties.map{|p| p.name}.should include("first_name") 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 @card.first_name.should == "matt" end @@ -869,3 +874,4 @@ describe "Property Class" do end end + diff --git a/spec/couchrest/view_spec.rb b/spec/couchrest/view_spec.rb index 5f1ec64..59ab062 100644 --- a/spec/couchrest/view_spec.rb +++ b/spec/couchrest/view_spec.rb @@ -273,6 +273,12 @@ describe "Model views" do u = Unattached.first :database=>@db u.title.should =~ /\A...\z/ 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 lambda{Unattached.all_design_doc_versions}.should raise_error end