diff --git a/lib/couchrest/core/document.rb b/lib/couchrest/core/document.rb index 59e09f1..abd2df7 100644 --- a/lib/couchrest/core/document.rb +++ b/lib/couchrest/core/document.rb @@ -14,7 +14,7 @@ module CouchRest end class Document < Response - include CouchRest::Mixins::Views + include CouchRest::Mixins::Attachments attr_accessor :database @@database = nil @@ -38,6 +38,36 @@ module CouchRest self['_rev'] end + # returns true if the document has never been saved + def new_document? + !rev + end + + # Saves the document to the db using create or update. Also runs the :save + # callbacks. Sets the _id and _rev fields based on + # CouchDB's response. + # If bulk is true (defaults to false) the document is cached for bulk save. + def save(bulk = false) + raise ArgumentError, "doc.database required for saving" unless database + result = database.save_doc self, bulk + result['ok'] + end + + # Deletes the document from the database. Runs the :delete callbacks. + # Removes the _id and _rev fields, preparing the + # document to be saved to a new _id. + # If bulk is true (defaults to false) the document won't + # actually be deleted from the db until bulk save. + def destroy(bulk = false) + raise ArgumentError, "doc.database required to destroy" unless database + result = database.delete_doc(self, bulk) + if result['ok'] + self['_rev'] = nil + self['_id'] = nil + end + result['ok'] + end + # copies the document to a new id. If the destination id currently exists, a rev must be provided. # dest can take one of two forms if overwriting: "id_to_overwrite?rev=revision" or the actual doc # hash with a '_rev' key @@ -73,29 +103,6 @@ module CouchRest @database || self.class.database end - # saves an attachment directly to couchdb - def put_attachment(name, file, options={}) - raise ArgumentError, "doc must be saved" unless self.rev - raise ArgumentError, "doc.database required to put_attachment" unless database - result = database.put_attachment(self, name, file, options) - self['_rev'] = result['rev'] - result['ok'] - end - - # returns an attachment's data - def fetch_attachment(name) - raise ArgumentError, "doc must be saved" unless self.rev - raise ArgumentError, "doc.database required to put_attachment" unless database - database.fetch_attachment(self, name) - end - - # deletes an attachment directly from couchdb - def delete_attachment(name) - raise ArgumentError, "doc.database required to delete_attachment" unless database - result = database.delete_attachment(self, name) - self['_rev'] = result['rev'] - result['ok'] - end end end diff --git a/lib/couchrest/mixins.rb b/lib/couchrest/mixins.rb index e482ffb..6a5198e 100644 --- a/lib/couchrest/mixins.rb +++ b/lib/couchrest/mixins.rb @@ -1,3 +1,3 @@ mixins_dir = File.join(File.dirname(__FILE__), 'mixins') -require File.join(mixins_dir, 'views') \ No newline at end of file +require File.join(mixins_dir, 'attachments') \ No newline at end of file diff --git a/lib/couchrest/mixins/attachments.rb b/lib/couchrest/mixins/attachments.rb new file mode 100644 index 0000000..f009b3e --- /dev/null +++ b/lib/couchrest/mixins/attachments.rb @@ -0,0 +1,31 @@ +module CouchRest + module Mixins + module Attachments + + # saves an attachment directly to couchdb + def put_attachment(name, file, options={}) + raise ArgumentError, "doc must be saved" unless self.rev + raise ArgumentError, "doc.database required to put_attachment" unless database + result = database.put_attachment(self, name, file, options) + self['_rev'] = result['rev'] + result['ok'] + end + + # returns an attachment's data + def fetch_attachment(name) + raise ArgumentError, "doc must be saved" unless self.rev + raise ArgumentError, "doc.database required to put_attachment" unless database + database.fetch_attachment(self, name) + end + + # deletes an attachment directly from couchdb + def delete_attachment(name) + raise ArgumentError, "doc.database required to delete_attachment" unless database + result = database.delete_attachment(self, name) + self['_rev'] = result['rev'] + result['ok'] + end + + end + end +end \ No newline at end of file diff --git a/lib/couchrest/mixins/views.rb b/lib/couchrest/mixins/views.rb deleted file mode 100644 index 36eebf0..0000000 --- a/lib/couchrest/mixins/views.rb +++ /dev/null @@ -1,59 +0,0 @@ -module CouchRest - module Mixins - module Views - - # alias for self['_id'] - def id - self['_id'] - end - - # alias for self['_rev'] - def rev - self['_rev'] - end - - # returns true if the document has never been saved - def new_document? - !rev - end - - # Saves the document to the db using create or update. Also runs the :save - # callbacks. Sets the _id and _rev fields based on - # CouchDB's response. - # If bulk is true (defaults to false) the document is cached for bulk save. - def save(bulk = false) - raise ArgumentError, "doc.database required for saving" unless database - result = database.save_doc self, bulk - result['ok'] - end - - # Deletes the document from the database. Runs the :delete callbacks. - # Removes the _id and _rev fields, preparing the - # document to be saved to a new _id. - # If bulk is true (defaults to false) the document won't - # actually be deleted from the db until bulk save. - def destroy(bulk = false) - raise ArgumentError, "doc.database required to destroy" unless database - result = database.delete_doc(self, bulk) - if result['ok'] - self['_rev'] = nil - self['_id'] = nil - end - result['ok'] - end - - def copy(dest) - raise ArgumentError, "doc.database required to copy" unless database - result = database.copy_doc(self, dest) - result['ok'] - end - - def move(dest) - raise ArgumentError, "doc.database required to copy" unless database - result = database.move_doc(self, dest) - result['ok'] - end - - end - end -end \ No newline at end of file diff --git a/spec/couchrest/core/database_spec.rb b/spec/couchrest/core/database_spec.rb index 7e621c2..6863e6d 100644 --- a/spec/couchrest/core/database_spec.rb +++ b/spec/couchrest/core/database_spec.rb @@ -244,7 +244,7 @@ describe CouchRest::Database do } } } - @db.save(@doc) + @db.save_doc(@doc) end it "should get the attachment with the doc's _id" do @@ -366,7 +366,7 @@ describe CouchRest::Database do } } } - @db.save(doc) + @db.save_doc(doc) @doc = @db.get('mydocwithattachment') end it "should delete the attachment" do @@ -672,7 +672,7 @@ describe CouchRest::Database do describe "replicating a database" do before do - @db.save({'_id' => 'test_doc', 'some-value' => 'foo'}) + @db.save_doc({'_id' => 'test_doc', 'some-value' => 'foo'}) @other_db = @cr.database 'couchrest-test-replication' @other_db.delete! rescue nil @other_db = @cr.create_db 'couchrest-test-replication' diff --git a/spec/couchrest/core/document_spec.rb b/spec/couchrest/core/document_spec.rb index c165f4e..dfb2ab9 100644 --- a/spec/couchrest/core/document_spec.rb +++ b/spec/couchrest/core/document_spec.rb @@ -142,10 +142,6 @@ describe CouchRest::Document do end end - describe "bulk saving" do - before :all do - @db = reset_test_db! - end describe "destroying a document from a db using bulk save" do before(:all) do @@ -247,12 +243,13 @@ describe CouchRest::Document do end end end +end describe "dealing with attachments" do before do @db = reset_test_db! @attach = "My Doc

Has words.

" - response = @db.save({'key' => 'value'}) + response = @db.save_doc({'key' => 'value'}) @doc = @db.get(response['id']) end diff --git a/spec/couchrest/more/property_spec.rb b/spec/couchrest/more/property_spec.rb index 780e587..6e22c25 100644 --- a/spec/couchrest/more/property_spec.rb +++ b/spec/couchrest/more/property_spec.rb @@ -33,4 +33,10 @@ describe "ExtendedDocument properties" do @card.family_name.should == @card.last_name end + it "should be able to be validated" do + pending("need to add validation") do + @card.should be_valid + end + end + end \ No newline at end of file