diff --git a/.gitignore b/.gitignore index f854a69..2318685 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,3 @@ html/* pkg *.swp -*.gemspec diff --git a/README.md b/README.md index 73fc714..c701026 100644 --- a/README.md +++ b/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 diff --git a/Rakefile b/Rakefile index 866c047..6f36f1e 100644 --- a/Rakefile +++ b/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") diff --git a/couchrest_model.gemspec b/couchrest_model.gemspec new file mode 100644 index 0000000..3ccdac5 --- /dev/null +++ b/couchrest_model.gemspec @@ -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, [">= 1.0.0"]) + s.add_runtime_dependency(%q, [">= 1.15"]) + s.add_runtime_dependency(%q, [">= 2.3.5"]) + s.add_runtime_dependency(%q, [">= 3.0.0.beta4"]) + s.add_runtime_dependency(%q, [">= 0.3.22"]) + else + s.add_dependency(%q, [">= 1.0.0"]) + s.add_dependency(%q, [">= 1.15"]) + s.add_dependency(%q, [">= 2.3.5"]) + s.add_dependency(%q, [">= 3.0.0.beta4"]) + s.add_dependency(%q, [">= 0.3.22"]) + end + else + s.add_dependency(%q, [">= 1.0.0"]) + s.add_dependency(%q, [">= 1.15"]) + s.add_dependency(%q, [">= 2.3.5"]) + s.add_dependency(%q, [">= 3.0.0.beta4"]) + s.add_dependency(%q, [">= 0.3.22"]) + end +end + diff --git a/lib/couchrest/model/associations.rb b/lib/couchrest/model/associations.rb index 0f83f3e..889ff5c 100644 --- a/lib/couchrest/model/associations.rb +++ b/lib/couchrest/model/associations.rb @@ -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 diff --git a/spec/couchrest/assocations_spec.rb b/spec/couchrest/assocations_spec.rb index 21ad658..deef3cb 100644 --- a/spec/couchrest/assocations_spec.rb +++ b/spec/couchrest/assocations_spec.rb @@ -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 \ No newline at end of file +end