Merge branch 'improve_associations'
This commit is contained in:
commit
ff00dd3b50
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -2,4 +2,3 @@
|
|||
html/*
|
||||
pkg
|
||||
*.swp
|
||||
*.gemspec
|
||||
|
|
19
README.md
19
README.md
|
@ -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
|
||||
|
||||
|
|
2
Rakefile
2
Rakefile
|
@ -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
155
couchrest_model.gemspec
Normal 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
|
||||
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -178,12 +178,15 @@ 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)
|
||||
lambda {
|
||||
@invoice.entries << entry
|
||||
@invoice.save.should be_true
|
||||
SaleEntry.find_by_description('test entry').should_not be_nil
|
||||
}.should raise_error
|
||||
# In the future maybe?
|
||||
# @invoice.save.should be_true
|
||||
# SaleEntry.find_by_description('test entry').should_not be_nil
|
||||
end
|
||||
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue