Merge branch 'improve_associations'
This commit is contained in:
commit
ff00dd3b50
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -2,4 +2,3 @@
|
||||||
html/*
|
html/*
|
||||||
pkg
|
pkg
|
||||||
*.swp
|
*.swp
|
||||||
*.gemspec
|
|
||||||
|
|
19
README.md
19
README.md
|
@ -13,7 +13,24 @@ CouchRest Model only supports CouchDB 0.10.0 or newer.
|
||||||
|
|
||||||
## Install
|
## 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
|
## General Usage
|
||||||
|
|
||||||
|
|
2
Rakefile
2
Rakefile
|
@ -26,7 +26,7 @@ begin
|
||||||
gemspec.extra_rdoc_files = %w( README.md LICENSE THANKS.md )
|
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.files = %w( LICENSE README.md Rakefile THANKS.md history.txt couchrest.gemspec) + Dir["{examples,lib,spec}/**/*"] - Dir["spec/tmp"]
|
||||||
gemspec.has_rdoc = true
|
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("mime-types", ">= 1.15")
|
||||||
gemspec.add_dependency("activesupport", ">= 2.3.5")
|
gemspec.add_dependency("activesupport", ">= 2.3.5")
|
||||||
gemspec.add_dependency("activemodel", ">= 3.0.0.beta4")
|
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!
|
(array ||= []).compact!
|
||||||
casted_by[property.to_s] = [] # replace the original array!
|
casted_by[property.to_s] = [] # replace the original array!
|
||||||
array.compact.each do |obj|
|
array.compact.each do |obj|
|
||||||
|
check_obj(obj)
|
||||||
casted_by[property.to_s] << obj.id
|
casted_by[property.to_s] << obj.id
|
||||||
end
|
end
|
||||||
super(array)
|
super(array)
|
||||||
end
|
end
|
||||||
|
|
||||||
def << obj
|
def << obj
|
||||||
|
check_obj(obj)
|
||||||
casted_by[property.to_s] << obj.id
|
casted_by[property.to_s] << obj.id
|
||||||
super(obj)
|
super(obj)
|
||||||
end
|
end
|
||||||
|
|
||||||
def push(obj)
|
def push(obj)
|
||||||
|
check_obj(obj)
|
||||||
casted_by[property.to_s].push obj.id
|
casted_by[property.to_s].push obj.id
|
||||||
super(obj)
|
super(obj)
|
||||||
end
|
end
|
||||||
|
|
||||||
def unshift(obj)
|
def unshift(obj)
|
||||||
|
check_obj(obj)
|
||||||
casted_by[property.to_s].unshift obj.id
|
casted_by[property.to_s].unshift obj.id
|
||||||
super(obj)
|
super(obj)
|
||||||
end
|
end
|
||||||
|
|
||||||
def []= index, obj
|
def []= index, obj
|
||||||
|
check_obj(obj)
|
||||||
casted_by[property.to_s][index] = obj.id
|
casted_by[property.to_s][index] = obj.id
|
||||||
super(index, obj)
|
super(index, obj)
|
||||||
end
|
end
|
||||||
|
@ -205,6 +210,13 @@ module CouchRest
|
||||||
casted_by[property.to_s].shift
|
casted_by[property.to_s].shift
|
||||||
super
|
super
|
||||||
end
|
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
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -178,16 +178,19 @@ describe "Assocations" do
|
||||||
@invoice.entry_ids.first.should eql(@entries[1].id)
|
@invoice.entry_ids.first.should eql(@entries[1].id)
|
||||||
end
|
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
|
SaleEntry.find_by_description('test entry').should be_nil
|
||||||
entry = SaleEntry.new(:description => 'test entry', :price => 500)
|
entry = SaleEntry.new(:description => 'test entry', :price => 500)
|
||||||
@invoice.entries << entry
|
lambda {
|
||||||
@invoice.save.should be_true
|
@invoice.entries << entry
|
||||||
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
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue