Merge branch 'improve_associations'

This commit is contained in:
Sam Lown 2010-08-11 17:38:47 +02:00
commit ff00dd3b50
6 changed files with 194 additions and 8 deletions

1
.gitignore vendored
View file

@ -2,4 +2,3 @@
html/*
pkg
*.swp
*.gemspec

View file

@ -13,7 +13,24 @@ CouchRest Model only supports CouchDB 0.10.0 or newer.
## Install
$ sudo gem install couchrest_model
### From Gem
CouchRest Model depends on Rails 3's ActiveModel which has not yet been released. You'll need to add
`--pre` to the end of the gem install until the dependencies are stable:
$ sudo gem install couchrest_model --pre
### Bundler
If you're using bundler, just define a line similar to the following in your project's Gemfile:
gem 'couchrest_model'
You might also consider using the latest git repository. All tests should pass in the master code branch
but no guarantees!
gem 'couchrest_model', :git => 'git://github.com/couchrest/couchrest_model.git'
## General Usage

View file

@ -26,7 +26,7 @@ begin
gemspec.extra_rdoc_files = %w( README.md LICENSE THANKS.md )
gemspec.files = %w( LICENSE README.md Rakefile THANKS.md history.txt couchrest.gemspec) + Dir["{examples,lib,spec}/**/*"] - Dir["spec/tmp"]
gemspec.has_rdoc = true
gemspec.add_dependency("couchrest", ">= 1.0.0.beta")
gemspec.add_dependency("couchrest", ">= 1.0.0")
gemspec.add_dependency("mime-types", ">= 1.15")
gemspec.add_dependency("activesupport", ">= 2.3.5")
gemspec.add_dependency("activemodel", ">= 3.0.0.beta4")

155
couchrest_model.gemspec Normal file
View file

@ -0,0 +1,155 @@
# Generated by jeweler
# DO NOT EDIT THIS FILE DIRECTLY
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
# -*- encoding: utf-8 -*-
Gem::Specification.new do |s|
s.name = %q{couchrest_model}
s.version = "1.0.0.beta7"
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
s.authors = ["J. Chris Anderson", "Matt Aimonetti", "Marcos Tapajos", "Will Leinweber", "Sam Lown"]
s.date = %q{2010-08-11}
s.description = %q{CouchRest Model provides aditional features to the standard CouchRest Document class such as properties, view designs, associations, callbacks, typecasting and validations.}
s.email = %q{jchris@apache.org}
s.extra_rdoc_files = [
"LICENSE",
"README.md",
"THANKS.md"
]
s.files = [
"LICENSE",
"README.md",
"Rakefile",
"THANKS.md",
"examples/model/example.rb",
"history.txt",
"lib/couchrest/model.rb",
"lib/couchrest/model/associations.rb",
"lib/couchrest/model/attribute_protection.rb",
"lib/couchrest/model/attributes.rb",
"lib/couchrest/model/base.rb",
"lib/couchrest/model/callbacks.rb",
"lib/couchrest/model/casted_array.rb",
"lib/couchrest/model/casted_model.rb",
"lib/couchrest/model/class_proxy.rb",
"lib/couchrest/model/collection.rb",
"lib/couchrest/model/design_doc.rb",
"lib/couchrest/model/document_queries.rb",
"lib/couchrest/model/errors.rb",
"lib/couchrest/model/extended_attachments.rb",
"lib/couchrest/model/persistence.rb",
"lib/couchrest/model/properties.rb",
"lib/couchrest/model/property.rb",
"lib/couchrest/model/support/couchrest.rb",
"lib/couchrest/model/support/hash.rb",
"lib/couchrest/model/typecast.rb",
"lib/couchrest/model/validations.rb",
"lib/couchrest/model/validations/casted_model.rb",
"lib/couchrest/model/validations/locale/en.yml",
"lib/couchrest/model/validations/uniqueness.rb",
"lib/couchrest/model/views.rb",
"lib/couchrest_model.rb",
"spec/couchrest/assocations_spec.rb",
"spec/couchrest/attachment_spec.rb",
"spec/couchrest/attribute_protection_spec.rb",
"spec/couchrest/base_spec.rb",
"spec/couchrest/casted_model_spec.rb",
"spec/couchrest/casted_spec.rb",
"spec/couchrest/class_proxy_spec.rb",
"spec/couchrest/inherited_spec.rb",
"spec/couchrest/persistence_spec.rb",
"spec/couchrest/property_spec.rb",
"spec/couchrest/subclass_spec.rb",
"spec/couchrest/validations.rb",
"spec/couchrest/view_spec.rb",
"spec/fixtures/attachments/README",
"spec/fixtures/attachments/couchdb.png",
"spec/fixtures/attachments/test.html",
"spec/fixtures/base.rb",
"spec/fixtures/more/article.rb",
"spec/fixtures/more/card.rb",
"spec/fixtures/more/cat.rb",
"spec/fixtures/more/client.rb",
"spec/fixtures/more/course.rb",
"spec/fixtures/more/event.rb",
"spec/fixtures/more/invoice.rb",
"spec/fixtures/more/person.rb",
"spec/fixtures/more/question.rb",
"spec/fixtures/more/sale_entry.rb",
"spec/fixtures/more/sale_invoice.rb",
"spec/fixtures/more/service.rb",
"spec/fixtures/more/user.rb",
"spec/fixtures/views/lib.js",
"spec/fixtures/views/test_view/lib.js",
"spec/fixtures/views/test_view/only-map.js",
"spec/fixtures/views/test_view/test-map.js",
"spec/fixtures/views/test_view/test-reduce.js",
"spec/spec.opts",
"spec/spec_helper.rb",
"utils/remap.rb",
"utils/subset.rb"
]
s.homepage = %q{http://github.com/couchrest/couchrest_model}
s.rdoc_options = ["--charset=UTF-8"]
s.require_paths = ["lib"]
s.rubygems_version = %q{1.3.6}
s.summary = %q{Extends the CouchRest Document for advanced modelling.}
s.test_files = [
"spec/spec_helper.rb",
"spec/couchrest/property_spec.rb",
"spec/couchrest/casted_spec.rb",
"spec/couchrest/subclass_spec.rb",
"spec/couchrest/persistence_spec.rb",
"spec/couchrest/casted_model_spec.rb",
"spec/couchrest/attribute_protection_spec.rb",
"spec/couchrest/assocations_spec.rb",
"spec/couchrest/validations.rb",
"spec/couchrest/view_spec.rb",
"spec/couchrest/inherited_spec.rb",
"spec/couchrest/attachment_spec.rb",
"spec/couchrest/class_proxy_spec.rb",
"spec/couchrest/base_spec.rb",
"spec/fixtures/base.rb",
"spec/fixtures/more/card.rb",
"spec/fixtures/more/event.rb",
"spec/fixtures/more/user.rb",
"spec/fixtures/more/sale_invoice.rb",
"spec/fixtures/more/article.rb",
"spec/fixtures/more/service.rb",
"spec/fixtures/more/invoice.rb",
"spec/fixtures/more/person.rb",
"spec/fixtures/more/question.rb",
"spec/fixtures/more/cat.rb",
"spec/fixtures/more/client.rb",
"spec/fixtures/more/sale_entry.rb",
"spec/fixtures/more/course.rb",
"examples/model/example.rb"
]
if s.respond_to? :specification_version then
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
s.specification_version = 3
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
s.add_runtime_dependency(%q<couchrest>, [">= 1.0.0"])
s.add_runtime_dependency(%q<mime-types>, [">= 1.15"])
s.add_runtime_dependency(%q<activesupport>, [">= 2.3.5"])
s.add_runtime_dependency(%q<activemodel>, [">= 3.0.0.beta4"])
s.add_runtime_dependency(%q<tzinfo>, [">= 0.3.22"])
else
s.add_dependency(%q<couchrest>, [">= 1.0.0"])
s.add_dependency(%q<mime-types>, [">= 1.15"])
s.add_dependency(%q<activesupport>, [">= 2.3.5"])
s.add_dependency(%q<activemodel>, [">= 3.0.0.beta4"])
s.add_dependency(%q<tzinfo>, [">= 0.3.22"])
end
else
s.add_dependency(%q<couchrest>, [">= 1.0.0"])
s.add_dependency(%q<mime-types>, [">= 1.15"])
s.add_dependency(%q<activesupport>, [">= 2.3.5"])
s.add_dependency(%q<activemodel>, [">= 3.0.0.beta4"])
s.add_dependency(%q<tzinfo>, [">= 0.3.22"])
end
end

View file

@ -171,27 +171,32 @@ module CouchRest
(array ||= []).compact!
casted_by[property.to_s] = [] # replace the original array!
array.compact.each do |obj|
check_obj(obj)
casted_by[property.to_s] << obj.id
end
super(array)
end
def << obj
check_obj(obj)
casted_by[property.to_s] << obj.id
super(obj)
end
def push(obj)
check_obj(obj)
casted_by[property.to_s].push obj.id
super(obj)
end
def unshift(obj)
check_obj(obj)
casted_by[property.to_s].unshift obj.id
super(obj)
end
def []= index, obj
check_obj(obj)
casted_by[property.to_s][index] = obj.id
super(index, obj)
end
@ -205,6 +210,13 @@ module CouchRest
casted_by[property.to_s].shift
super
end
protected
def check_obj(obj)
raise "Object cannot be added to #{casted_by.class.to_s}##{property.to_s} collection unless saved" if obj.new?
end
end

View file

@ -178,16 +178,19 @@ describe "Assocations" do
@invoice.entry_ids.first.should eql(@entries[1].id)
end
it "should save all entries when invoice is saved" do
it "should raise error when adding un-persisted entries" do
SaleEntry.find_by_description('test entry').should be_nil
entry = SaleEntry.new(:description => 'test entry', :price => 500)
@invoice.entries << entry
@invoice.save.should be_true
SaleEntry.find_by_description('test entry').should_not be_nil
lambda {
@invoice.entries << entry
}.should raise_error
# In the future maybe?
# @invoice.save.should be_true
# SaleEntry.find_by_description('test entry').should_not be_nil
end
end
end
end
end