Merge branch 'master' of github.com:couchrest/couchrest_model

This commit is contained in:
Sam Lown 2011-06-05 11:21:12 +02:00
commit 634fdf8b2f
11 changed files with 119 additions and 11 deletions

View file

@ -50,6 +50,12 @@ module CouchRest::Model
super
end
def build(*args)
obj = casted_by_property.build(*args)
self.push(obj)
obj
end
protected
def instantiate_and_cast(obj, change = true)

View file

@ -87,7 +87,14 @@ module CouchRest
doc
end
alias :find :get
def get!(id)
doc = @klass.get!(id, @database)
doc.database = @database if doc && doc.respond_to?(:database)
doc
end
alias :find! :get!
# Views
def has_view?(view)

View file

@ -86,9 +86,12 @@ module CouchRest
# id<String, Integer>:: Document ID
# db<Database>:: optional option to pass a custom database to use
def get!(id, db = database)
raise "Missing or empty document ID" if id.to_s.empty?
raise CouchRest::Model::DocumentNotFound if id.blank?
doc = db.get id
build_from_database(doc)
rescue RestClient::ResourceNotFound
raise CouchRest::Model::DocumentNotFound
end
alias :find! :get!

View file

@ -19,5 +19,7 @@ module CouchRest
end
end
end
class DocumentNotFound < Errors::CouchRestModelError; end
end
end

View file

@ -21,8 +21,8 @@ module CouchRest
# Creates the document in the db. Raises an exception
# if the document is not created properly.
def create!
self.class.fail_validate!(self) unless self.create
def create!(options = {})
self.class.fail_validate!(self) unless self.create(options)
end
# Trigger the callbacks (before, after, around)
@ -120,8 +120,8 @@ module CouchRest
#
# ==== Returns
# returns the reloaded document
def create(attributes = {})
instance = new(attributes)
def create(attributes = {}, &block)
instance = new(attributes, &block)
instance.create
instance
end
@ -130,8 +130,8 @@ module CouchRest
#
# ==== Returns
# returns the reloaded document or raises an exception
def create!(attributes = {})
instance = new(attributes)
def create!(attributes = {}, &block)
instance = new(attributes, &block)
instance.create!
instance
end

View file

@ -64,6 +64,18 @@ module CouchRest::Model
end
end
# Initialize a new instance of a property's type ready to be
# used. If a proc is defined for the init method, it will be used instead of
# a normal call to the class.
def build(*args)
raise StandardError, "Cannot build property without a class" if @type_class.nil?
if @init_method.is_a?(Proc)
@init_method.call(*args)
else
@type_class.send(@init_method, *args)
end
end
private
def associate_casted_value_to_parent(parent, value)

View file

@ -14,8 +14,7 @@ module CouchRest
elsif [String, TrueClass, Integer, Float, BigDecimal, DateTime, Time, Date, Class].include?(klass)
send('typecast_to_'+klass.to_s.downcase, value)
else
# Allow the init_method to be defined as a Proc for advanced conversion
property.init_method.is_a?(Proc) ? property.init_method.call(value) : klass.send(property.init_method, value)
property.build(value)
end
end