Added validation callbacks to extended documents and casted models
This commit is contained in:
parent
91cd1d9c7b
commit
b4e2250668
|
@ -68,10 +68,13 @@ CouchRest::Model has been deprecated and replaced by CouchRest::ExtendedDocument
|
||||||
|
|
||||||
### Callbacks
|
### Callbacks
|
||||||
|
|
||||||
`CouchRest::ExtendedDocuments` instances have 2 callbacks already defined for you:
|
`CouchRest::ExtendedDocuments` instances have 4 callbacks already defined for you:
|
||||||
`create_callback`, `save_callback`, `update_callback` and `destroy_callback`
|
`validate_callback`, `create_callback`, `save_callback`, `update_callback` and `destroy_callback`
|
||||||
|
|
||||||
In your document inherits from `CouchRest::ExtendedDocument`, define your callback as follows:
|
`CouchRest::CastedModel` instances have 1 callback already defined for you:
|
||||||
|
`validate_callback`
|
||||||
|
|
||||||
|
Define your callback as follows:
|
||||||
|
|
||||||
save_callback :before, :generate_slug_from_name
|
save_callback :before, :generate_slug_from_name
|
||||||
|
|
||||||
|
|
|
@ -51,6 +51,9 @@ module CouchRest
|
||||||
def self.included(base)
|
def self.included(base)
|
||||||
base.extlib_inheritable_accessor(:auto_validation)
|
base.extlib_inheritable_accessor(:auto_validation)
|
||||||
base.class_eval <<-EOS, __FILE__, __LINE__
|
base.class_eval <<-EOS, __FILE__, __LINE__
|
||||||
|
# Callbacks
|
||||||
|
define_callbacks :validate
|
||||||
|
|
||||||
# Turn off auto validation by default
|
# Turn off auto validation by default
|
||||||
self.auto_validation ||= false
|
self.auto_validation ||= false
|
||||||
|
|
||||||
|
@ -72,6 +75,7 @@ module CouchRest
|
||||||
|
|
||||||
base.extend(ClassMethods)
|
base.extend(ClassMethods)
|
||||||
base.class_eval <<-EOS, __FILE__, __LINE__
|
base.class_eval <<-EOS, __FILE__, __LINE__
|
||||||
|
define_callbacks :validate
|
||||||
if method_defined?(:_run_save_callbacks)
|
if method_defined?(:_run_save_callbacks)
|
||||||
save_callback :before, :check_validations
|
save_callback :before, :check_validations
|
||||||
end
|
end
|
||||||
|
@ -147,7 +151,9 @@ module CouchRest
|
||||||
valid = recursive_valid?(prop, context, valid) && valid
|
valid = recursive_valid?(prop, context, valid) && valid
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
target.class.validators.execute(context, target) && valid
|
target._run_validate_callbacks do
|
||||||
|
target.class.validators.execute(context, target) && valid
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ module CouchRest
|
||||||
module CastedModel
|
module CastedModel
|
||||||
|
|
||||||
def self.included(base)
|
def self.included(base)
|
||||||
|
base.send(:include, CouchRest::Callbacks)
|
||||||
base.send(:include, CouchRest::Mixins::Properties)
|
base.send(:include, CouchRest::Mixins::Properties)
|
||||||
base.send(:attr_accessor, :casted_by)
|
base.send(:attr_accessor, :casted_by)
|
||||||
base.send(:attr_accessor, :document_saved)
|
base.send(:attr_accessor, :document_saved)
|
||||||
|
|
|
@ -23,6 +23,26 @@ class DummyModel < CouchRest::ExtendedDocument
|
||||||
property :keywords, :cast_as => ["String"]
|
property :keywords, :cast_as => ["String"]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class CastedCallbackDoc < CouchRest::ExtendedDocument
|
||||||
|
use_database TEST_SERVER.default_database
|
||||||
|
raise "Default DB not set" if TEST_SERVER.default_database.nil?
|
||||||
|
property :callback_model, :cast_as => 'WithCastedCallBackModel'
|
||||||
|
end
|
||||||
|
class WithCastedCallBackModel < Hash
|
||||||
|
include CouchRest::CastedModel
|
||||||
|
include CouchRest::Validation
|
||||||
|
property :name
|
||||||
|
property :run_before_validate
|
||||||
|
property :run_after_validate
|
||||||
|
|
||||||
|
validate_callback :before do |object|
|
||||||
|
object.run_before_validate = true
|
||||||
|
end
|
||||||
|
validate_callback :after do |object|
|
||||||
|
object.run_after_validate = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe CouchRest::CastedModel do
|
describe CouchRest::CastedModel do
|
||||||
|
|
||||||
describe "A non hash class including CastedModel" do
|
describe "A non hash class including CastedModel" do
|
||||||
|
@ -354,4 +374,25 @@ describe CouchRest::CastedModel do
|
||||||
lambda{@toy.base_doc.save!}.should_not raise_error
|
lambda{@toy.base_doc.save!}.should_not raise_error
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "callbacks" do
|
||||||
|
before(:each) do
|
||||||
|
@doc = CastedCallbackDoc.new
|
||||||
|
@model = WithCastedCallBackModel.new
|
||||||
|
@doc.callback_model = @model
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "validate" do
|
||||||
|
it "should run before_validate before validating" do
|
||||||
|
@model.run_before_validate.should be_nil
|
||||||
|
@model.should be_valid
|
||||||
|
@model.run_before_validate.should be_true
|
||||||
|
end
|
||||||
|
it "should run after_validate after validating" do
|
||||||
|
@model.run_after_validate.should be_nil
|
||||||
|
@model.should be_valid
|
||||||
|
@model.run_after_validate.should be_true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -17,8 +17,11 @@ describe "ExtendedDocument" do
|
||||||
end
|
end
|
||||||
|
|
||||||
class WithCallBacks < CouchRest::ExtendedDocument
|
class WithCallBacks < CouchRest::ExtendedDocument
|
||||||
|
include ::CouchRest::Validation
|
||||||
use_database TEST_SERVER.default_database
|
use_database TEST_SERVER.default_database
|
||||||
property :name
|
property :name
|
||||||
|
property :run_before_validate
|
||||||
|
property :run_after_validate
|
||||||
property :run_before_save
|
property :run_before_save
|
||||||
property :run_after_save
|
property :run_after_save
|
||||||
property :run_before_create
|
property :run_before_create
|
||||||
|
@ -26,6 +29,12 @@ describe "ExtendedDocument" do
|
||||||
property :run_before_update
|
property :run_before_update
|
||||||
property :run_after_update
|
property :run_after_update
|
||||||
|
|
||||||
|
validate_callback :before do |object|
|
||||||
|
object.run_before_validate = true
|
||||||
|
end
|
||||||
|
validate_callback :after do |object|
|
||||||
|
object.run_after_validate = true
|
||||||
|
end
|
||||||
save_callback :before do |object|
|
save_callback :before do |object|
|
||||||
object.run_before_save = true
|
object.run_before_save = true
|
||||||
end
|
end
|
||||||
|
@ -504,6 +513,19 @@ describe "ExtendedDocument" do
|
||||||
@doc = WithCallBacks.new
|
@doc = WithCallBacks.new
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
describe "validate" do
|
||||||
|
it "should run before_validate before validating" do
|
||||||
|
@doc.run_before_validate.should be_nil
|
||||||
|
@doc.should be_valid
|
||||||
|
@doc.run_before_validate.should be_true
|
||||||
|
end
|
||||||
|
it "should run after_validate after validating" do
|
||||||
|
@doc.run_after_validate.should be_nil
|
||||||
|
@doc.should be_valid
|
||||||
|
@doc.run_after_validate.should be_true
|
||||||
|
end
|
||||||
|
end
|
||||||
describe "save" do
|
describe "save" do
|
||||||
it "should run the after filter after saving" do
|
it "should run the after filter after saving" do
|
||||||
@doc.run_after_save.should be_nil
|
@doc.run_after_save.should be_nil
|
||||||
|
|
Loading…
Reference in a new issue