samflores-couchrest 0.2.1 → 0.12.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. data/README.md +10 -34
  2. data/Rakefile +5 -2
  3. data/bin/couchdir +20 -0
  4. data/examples/model/example.rb +13 -19
  5. data/examples/word_count/word_count.rb +24 -3
  6. data/examples/word_count/word_count_query.rb +6 -7
  7. data/lib/couchrest/core/database.rb +49 -126
  8. data/lib/couchrest/core/document.rb +25 -58
  9. data/lib/couchrest/core/model.rb +612 -0
  10. data/lib/couchrest/core/server.rb +10 -47
  11. data/lib/couchrest/core/validations.rb +328 -0
  12. data/lib/couchrest/monkeypatches.rb +0 -95
  13. data/lib/couchrest.rb +10 -57
  14. data/spec/couchrest/core/database_spec.rb +68 -183
  15. data/spec/couchrest/core/design_spec.rb +1 -1
  16. data/spec/couchrest/core/document_spec.rb +104 -285
  17. data/spec/couchrest/core/model_spec.rb +855 -0
  18. data/spec/couchrest/helpers/pager_spec.rb +1 -1
  19. data/spec/spec_helper.rb +7 -13
  20. metadata +17 -83
  21. data/examples/word_count/word_count_views.rb +0 -26
  22. data/lib/couchrest/core/response.rb +0 -16
  23. data/lib/couchrest/mixins/attachments.rb +0 -31
  24. data/lib/couchrest/mixins/callbacks.rb +0 -483
  25. data/lib/couchrest/mixins/design_doc.rb +0 -64
  26. data/lib/couchrest/mixins/document_queries.rb +0 -48
  27. data/lib/couchrest/mixins/extended_attachments.rb +0 -68
  28. data/lib/couchrest/mixins/extended_document_mixins.rb +0 -6
  29. data/lib/couchrest/mixins/properties.rb +0 -125
  30. data/lib/couchrest/mixins/validation.rb +0 -234
  31. data/lib/couchrest/mixins/views.rb +0 -168
  32. data/lib/couchrest/mixins.rb +0 -4
  33. data/lib/couchrest/more/casted_model.rb +0 -28
  34. data/lib/couchrest/more/extended_document.rb +0 -217
  35. data/lib/couchrest/more/property.rb +0 -40
  36. data/lib/couchrest/support/blank.rb +0 -42
  37. data/lib/couchrest/support/class.rb +0 -191
  38. data/lib/couchrest/validation/auto_validate.rb +0 -163
  39. data/lib/couchrest/validation/contextual_validators.rb +0 -78
  40. data/lib/couchrest/validation/validation_errors.rb +0 -118
  41. data/lib/couchrest/validation/validators/absent_field_validator.rb +0 -74
  42. data/lib/couchrest/validation/validators/confirmation_validator.rb +0 -99
  43. data/lib/couchrest/validation/validators/format_validator.rb +0 -117
  44. data/lib/couchrest/validation/validators/formats/email.rb +0 -66
  45. data/lib/couchrest/validation/validators/formats/url.rb +0 -43
  46. data/lib/couchrest/validation/validators/generic_validator.rb +0 -120
  47. data/lib/couchrest/validation/validators/length_validator.rb +0 -134
  48. data/lib/couchrest/validation/validators/method_validator.rb +0 -89
  49. data/lib/couchrest/validation/validators/numeric_validator.rb +0 -104
  50. data/lib/couchrest/validation/validators/required_field_validator.rb +0 -109
  51. data/spec/couchrest/core/server_spec.rb +0 -35
  52. data/spec/couchrest/more/casted_extended_doc_spec.rb +0 -40
  53. data/spec/couchrest/more/casted_model_spec.rb +0 -98
  54. data/spec/couchrest/more/extended_doc_attachment_spec.rb +0 -130
  55. data/spec/couchrest/more/extended_doc_spec.rb +0 -509
  56. data/spec/couchrest/more/extended_doc_view_spec.rb +0 -207
  57. data/spec/couchrest/more/property_spec.rb +0 -130
  58. data/spec/couchrest/support/class_spec.rb +0 -59
  59. data/spec/fixtures/more/article.rb +0 -34
  60. data/spec/fixtures/more/card.rb +0 -20
  61. data/spec/fixtures/more/course.rb +0 -14
  62. data/spec/fixtures/more/event.rb +0 -6
  63. data/spec/fixtures/more/invoice.rb +0 -17
  64. data/spec/fixtures/more/person.rb +0 -8
  65. data/spec/fixtures/more/question.rb +0 -6
  66. data/spec/fixtures/more/service.rb +0 -12
data/README.md CHANGED
@@ -6,7 +6,8 @@ which I find to be concise, clear, and well designed. CouchRest lightly wraps
6
6
  CouchDB's HTTP API, managing JSON serialization, and remembering the URI-paths
7
7
  to CouchDB's API endpoints so you don't have to.
8
8
 
9
- CouchRest is designed to make a simple base for application and framework-specific object oriented APIs. CouchRest is Object-Mapper agnostic, the parsed JSON it returns from CouchDB shows up as subclasses of Ruby's Hash. Naked JSON, just as it was mean to be.
9
+ CouchRest's lighweight is designed to make a simple base for application and
10
+ framework-specific object oriented APIs.
10
11
 
11
12
  ## Easy Install
12
13
 
@@ -31,7 +32,7 @@ Quick Start:
31
32
 
32
33
  # with !, it creates the database if it doesn't already exist
33
34
  @db = CouchRest.database!("http://127.0.0.1:5984/couchrest-test")
34
- response = @db.save_doc({:key => 'value', 'another key' => 'another value'})
35
+ response = @db.save({:key => 'value', 'another key' => 'another value'})
35
36
  doc = @db.get(response['id'])
36
37
  puts doc.inspect
37
38
 
@@ -47,7 +48,7 @@ Bulk Save:
47
48
 
48
49
  Creating and Querying Views:
49
50
 
50
- @db.save_doc({
51
+ @db.save({
51
52
  "_id" => "_design/first",
52
53
  :views => {
53
54
  :test => {
@@ -59,35 +60,10 @@ Creating and Querying Views:
59
60
 
60
61
  ## CouchRest::Model
61
62
 
62
- CouchRest::Model has been deprecated and replaced by CouchRest::ExtendedDocument
63
-
64
-
65
- ## CouchRest::ExtendedDocument
66
-
67
- ### Callbacks
68
-
69
- `CouchRest::ExtendedDocuments` instances have 2 callbacks already defined for you:
70
- `create_callback`, `save_callback`, `update_callback` and `destroy_callback`
71
-
72
- In your document inherits from `CouchRest::ExtendedDocument`, define your callback as follows:
73
-
74
- save_callback :before, :generate_slug_from_name
75
-
76
- CouchRest uses a mixin you can find in lib/mixins/callbacks which is extracted from Rails 3, here are some simple usage examples:
77
-
78
- save_callback :before, :before_method
79
- save_callback :after, :after_method, :if => :condition
80
- save_callback :around {|r| stuff; yield; stuff }
81
-
82
- Check the mixin or the ExtendedDocument class to see how to implement your own callbacks.
83
-
84
- ### Casting
85
-
86
- Often, you will want to store multiple objects within a document, to be able to retrieve your objects when you load the document,
87
- you can define some casting rules.
88
-
89
- property :casted_attribute, :cast_as => 'WithCastedModelMixin'
90
- property :keywords, :cast_as => ["String"]
91
-
92
- If you want to cast an array of instances from a specific Class, use the trick shown above ["ClassName"]
63
+ CouchRest::Model is a module designed along the lines of DataMapper::Resource.
64
+ By subclassing, suddenly you get all sorts of powerful sugar, so that working
65
+ with CouchDB in your Rails or Merb app is no harder than working with the
66
+ standard SQL alternatives. See the CouchRest::Model documentation for an
67
+ example article class that illustrates usage.
93
68
 
69
+ CouchRest::Model will be removed from this package.
data/Rakefile CHANGED
@@ -23,15 +23,18 @@ spec = Gem::Specification.new do |s|
23
23
  s.homepage = "http://github.com/jchris/couchrest"
24
24
  s.description = "CouchRest provides a simple interface on top of CouchDB's RESTful HTTP API, as well as including some utility scripts for managing views and attachments."
25
25
  s.has_rdoc = true
26
- s.authors = ["J. Chris Anderson", "Matt Aimonetti"]
26
+ s.authors = ["J. Chris Anderson"]
27
27
  s.files = %w( LICENSE README.md Rakefile THANKS.md ) +
28
- Dir["{examples,lib,spec,utils}/**/*"] -
28
+ Dir["{bin,examples,lib,spec,utils}/**/*"] -
29
29
  Dir["spec/tmp"]
30
30
  s.extra_rdoc_files = %w( README.md LICENSE THANKS.md )
31
31
  s.require_path = "lib"
32
+ s.bindir = 'bin'
33
+ s.executables << 'couchdir'
32
34
  s.add_dependency("json", ">= 1.1.2")
33
35
  s.add_dependency("rest-client", ">= 0.5")
34
36
  s.add_dependency("mime-types", ">= 1.15")
37
+ s.add_dependency("extlib", ">= 0.9.6")
35
38
  end
36
39
 
37
40
 
data/bin/couchdir ADDED
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ unless ARGV.length >= 2
4
+ puts "usage: couchdir path/to/directory db-name [docid]"
5
+ exit
6
+ end
7
+
8
+ require 'rubygems'
9
+ require 'couchrest'
10
+
11
+ dirname = ARGV[0]
12
+ dbname = ARGV[1]
13
+ docid = ARGV[2]
14
+
15
+ puts "Create attachments for the files in #{dirname} in database #{dbname}."
16
+
17
+ fm = CouchRest::FileManager.new(dbname)
18
+ fm.loud = true
19
+ puts "Pushing views from directory #{dirname} to database #{fm.db}"
20
+ fm.push_directory(dirname, docid)
@@ -1,38 +1,31 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', 'lib', 'couchrest')
1
+ require 'rubygems'
2
+ require 'couchrest'
2
3
 
3
4
  def show obj
4
5
  puts obj.inspect
5
6
  puts
6
7
  end
7
8
 
8
- SERVER = CouchRest.new
9
- SERVER.default_database = 'couchrest-extendeddoc-example'
9
+ CouchRest::Model.default_database = CouchRest.database!('couchrest-model-example')
10
10
 
11
- class Author < CouchRest::ExtendedDocument
12
- use_database SERVER.default_database
13
- property :name
14
-
11
+ class Author < CouchRest::Model
12
+ key_accessor :name
15
13
  def drink_scotch
16
14
  puts "... glug type glug ... I'm #{name} ... type glug glug ..."
17
15
  end
18
16
  end
19
17
 
20
- class Post < CouchRest::ExtendedDocument
21
- use_database SERVER.default_database
22
-
23
- property :title
24
- property :body
25
- property :author, :cast_as => 'Author'
18
+ class Post < CouchRest::Model
19
+ key_accessor :title, :body, :author
20
+
21
+ cast :author, :as => 'Author'
26
22
 
27
23
  timestamps!
28
24
  end
29
25
 
30
- class Comment < CouchRest::ExtendedDocument
31
- use_database SERVER.default_database
32
-
33
- property :commenter, :cast_as => 'Author'
34
- timestamps!
35
-
26
+ class Comment < CouchRest::Model
27
+ cast :commenter, :as => 'Author'
28
+
36
29
  def post= post
37
30
  self["post_id"] = post.id
38
31
  end
@@ -40,6 +33,7 @@ class Comment < CouchRest::ExtendedDocument
40
33
  Post.get(self['post_id']) if self['post_id']
41
34
  end
42
35
 
36
+ timestamps!
43
37
  end
44
38
 
45
39
  puts "Act I: CRUD"
@@ -1,5 +1,4 @@
1
- require 'rubygems'
2
- require 'couchrest'
1
+ require File.dirname(__FILE__) + '/../../couchrest'
3
2
 
4
3
  couch = CouchRest.new("http://127.0.0.1:5984")
5
4
  db = couch.database('word-count-example')
@@ -40,7 +39,29 @@ books.keys.each do |book|
40
39
  end
41
40
  end
42
41
  end
42
+
43
+ # word_count = {
44
+ # :map => 'function(doc){
45
+ # var words = doc.text.split(/\W/);
46
+ # words.forEach(function(word){
47
+ # if (word.length > 0) emit([word,doc.title],1);
48
+ # });
49
+ # }',
50
+ # :reduce => 'function(key,combine){
51
+ # return sum(combine);
52
+ # }'
53
+ # }
54
+ #
55
+ # db.delete db.get("_design/word_count") rescue nil
56
+ #
57
+ # db.save({
58
+ # "_id" => "_design/word_count",
59
+ # :views => {
60
+ # :count => word_count,
61
+ # :words => {:map => word_count[:map]}
62
+ # }
63
+ # })
43
64
 
44
65
  # puts "The books have been stored in your CouchDB. To initiate the MapReduce process, visit http://127.0.0.1:5984/_utils/ in your browser and click 'word-count-example', then select view 'words' or 'count'. The process could take about 15 minutes on an average MacBook."
45
-
66
+ #
46
67
 
@@ -1,23 +1,22 @@
1
- require 'rubygems'
2
- require 'couchrest'
1
+ require File.dirname(__FILE__) + '/../../couchrest'
3
2
 
4
3
  couch = CouchRest.new("http://127.0.0.1:5984")
5
4
  db = couch.database('word-count-example')
6
5
 
7
6
  puts "Now that we've parsed all those books into CouchDB, the queries we can run are incredibly flexible."
8
7
  puts "\nThe simplest query we can run is the total word count for all words in all documents:"
9
- puts "this will take a few minutes the first time. if it times out, just rerun this script in a few few minutes."
10
- puts db.view('word_count/words').inspect
8
+
9
+ puts db.view('word_count/count').inspect
11
10
 
12
11
  puts "\nWe can also narrow the query down to just one word, across all documents. Here is the count for 'flight' in all three books:"
13
12
 
14
13
  word = 'flight'
15
14
  params = {
16
15
  :startkey => [word],
17
- :endkey => [word,{}]
16
+ :endkey => [word,'Z']
18
17
  }
19
18
 
20
- puts db.view('word_count/words',params).inspect
19
+ puts db.view('word_count/count',params).inspect
21
20
 
22
21
  puts "\nWe scope the query using startkey and endkey params to take advantage of CouchDB's collation ordering. Here are the params for the last query:"
23
22
  puts params.inspect
@@ -29,7 +28,7 @@ params = {
29
28
  :key => [word, title]
30
29
  }
31
30
 
32
- puts db.view('word_count/words',params).inspect
31
+ puts db.view('word_count/count',params).inspect
33
32
 
34
33
 
35
34
  puts "\nHere are the params for 'flight' in the da-vinci book:"
@@ -3,7 +3,7 @@ require "base64"
3
3
 
4
4
  module CouchRest
5
5
  class Database
6
- attr_reader :server, :host, :name, :root, :uri
6
+ attr_reader :server, :host, :name, :root
7
7
  attr_accessor :bulk_save_cache_limit
8
8
 
9
9
  # Create a CouchRest::Database adapter for the supplied CouchRest::Server
@@ -13,30 +13,30 @@ module CouchRest
13
13
  # server<CouchRest::Server>:: database host
14
14
  # name<String>:: database name
15
15
  #
16
- def initialize(server, name)
16
+ def initialize server, name
17
17
  @name = name
18
18
  @server = server
19
19
  @host = server.uri
20
- @uri = @root = "#{host}/#{name}"
20
+ @root = "#{host}/#{name}"
21
21
  @streamer = Streamer.new(self)
22
22
  @bulk_save_cache = []
23
- @bulk_save_cache_limit = 500 # must be smaller than the uuid count
23
+ @bulk_save_cache_limit = 50
24
24
  end
25
25
 
26
26
  # returns the database's uri
27
27
  def to_s
28
- @uri
28
+ @root
29
29
  end
30
30
 
31
31
  # GET the database info from CouchDB
32
32
  def info
33
- CouchRest.get @uri
33
+ CouchRest.get @root
34
34
  end
35
35
 
36
36
  # Query the <tt>_all_docs</tt> view. Accepts all the same arguments as view.
37
- def documents(params = {})
37
+ def documents params = {}
38
38
  keys = params.delete(:keys)
39
- url = CouchRest.paramify_url "#{@uri}/_all_docs", params
39
+ url = CouchRest.paramify_url "#{@root}/_all_docs", params
40
40
  if keys
41
41
  CouchRest.post(url, {:keys => keys})
42
42
  else
@@ -47,10 +47,10 @@ module CouchRest
47
47
  # POST a temporary view function to CouchDB for querying. This is not
48
48
  # recommended, as you don't get any performance benefit from CouchDB's
49
49
  # materialized views. Can be quite slow on large databases.
50
- def slow_view(funcs, params = {})
50
+ def slow_view funcs, params = {}
51
51
  keys = params.delete(:keys)
52
52
  funcs = funcs.merge({:keys => keys}) if keys
53
- url = CouchRest.paramify_url "#{@uri}/_temp_view", params
53
+ url = CouchRest.paramify_url "#{@root}/_slow_view", params
54
54
  JSON.parse(RestClient.post(url, funcs.to_json, {"Content-Type" => 'application/json'}))
55
55
  end
56
56
 
@@ -59,17 +59,14 @@ module CouchRest
59
59
 
60
60
  # Query a CouchDB view as defined by a <tt>_design</tt> document. Accepts
61
61
  # paramaters as described in http://wiki.apache.org/couchdb/HttpViewApi
62
- def view(name, params = {}, &block)
62
+ def view name, params = {}, &block
63
63
  keys = params.delete(:keys)
64
- name = name.split('/') # I think this will always be length == 2, but maybe not...
65
- dname = name.shift
66
- vname = name.join('/')
67
- url = CouchRest.paramify_url "#{@uri}/_design/#{dname}/_view/#{vname}", params
64
+ url = CouchRest.paramify_url "#{@root}/_view/#{name}", params
68
65
  if keys
69
66
  CouchRest.post(url, {:keys => keys})
70
67
  else
71
68
  if block_given?
72
- @streamer.view("_design/#{dname}/_view/#{vname}", params, &block)
69
+ @streamer.view(name, params, &block)
73
70
  else
74
71
  CouchRest.get url
75
72
  end
@@ -77,9 +74,9 @@ module CouchRest
77
74
  end
78
75
 
79
76
  # GET a document from CouchDB, by id. Returns a Ruby Hash.
80
- def get(id)
77
+ def get id
81
78
  slug = escape_docid(id)
82
- hash = CouchRest.get("#{@uri}/#{slug}")
79
+ hash = CouchRest.get("#{@root}/#{slug}")
83
80
  doc = if /^_design/ =~ hash["_id"]
84
81
  Design.new(hash)
85
82
  else
@@ -90,29 +87,25 @@ module CouchRest
90
87
  end
91
88
 
92
89
  # GET an attachment directly from CouchDB
93
- def fetch_attachment(doc, name)
94
- # slug = escape_docid(docid)
95
- # name = CGI.escape(name)
96
- uri = uri_for_attachment(doc, name)
97
- RestClient.get uri
98
- # "#{@uri}/#{slug}/#{name}"
90
+ def fetch_attachment docid, name
91
+ slug = escape_docid(docid)
92
+ name = CGI.escape(name)
93
+ RestClient.get "#{@root}/#{slug}/#{name}"
99
94
  end
100
95
 
101
96
  # PUT an attachment directly to CouchDB
102
- def put_attachment(doc, name, file, options = {})
97
+ def put_attachment doc, name, file, options = {}
103
98
  docid = escape_docid(doc['_id'])
104
99
  name = CGI.escape(name)
105
- uri = uri_for_attachment(doc, name)
100
+ uri = if doc['_rev']
101
+ "#{@root}/#{docid}/#{name}?rev=#{doc['_rev']}"
102
+ else
103
+ "#{@root}/#{docid}/#{name}"
104
+ end
105
+
106
106
  JSON.parse(RestClient.put(uri, file, options))
107
107
  end
108
108
 
109
- # DELETE an attachment directly from CouchDB
110
- def delete_attachment doc, name
111
- uri = uri_for_attachment(doc, name)
112
- # this needs a rev
113
- JSON.parse(RestClient.delete(uri))
114
- end
115
-
116
109
  # Save a document to CouchDB. This will use the <tt>_id</tt> field from
117
110
  # the document as the id for PUT, or request a new UUID from CouchDB, if
118
111
  # no <tt>_id</tt> is present on the document. IDs are attached to
@@ -122,7 +115,7 @@ module CouchRest
122
115
  #
123
116
  # If <tt>bulk</tt> is true (false by default) the document is cached for bulk-saving later.
124
117
  # Bulk saving happens automatically when #bulk_save_cache limit is exceded, or on the next non bulk save.
125
- def save_doc(doc, bulk = false)
118
+ def save (doc, bulk = false)
126
119
  if doc['_attachments']
127
120
  doc['_attachments'] = encode_attachments(doc['_attachments'])
128
121
  end
@@ -135,13 +128,13 @@ module CouchRest
135
128
  end
136
129
  result = if doc['_id']
137
130
  slug = escape_docid(doc['_id'])
138
- CouchRest.put "#{@uri}/#{slug}", doc
131
+ CouchRest.put "#{@root}/#{slug}", doc
139
132
  else
140
133
  begin
141
134
  slug = doc['_id'] = @server.next_uuid
142
- CouchRest.put "#{@uri}/#{slug}", doc
135
+ CouchRest.put "#{@root}/#{slug}", doc
143
136
  rescue #old version of couchdb
144
- CouchRest.post @uri, doc
137
+ CouchRest.post @root, doc
145
138
  end
146
139
  end
147
140
  if result['ok']
@@ -152,40 +145,30 @@ module CouchRest
152
145
  result
153
146
  end
154
147
 
155
- ### DEPRECATION NOTICE
156
- def save(doc, bulk=false)
157
- puts "CouchRest::Database's save method is being deprecated, please use save_doc instead"
158
- save_doc(doc, bulk)
159
- end
160
-
161
-
162
148
  # POST an array of documents to CouchDB. If any of the documents are
163
149
  # missing ids, supply one from the uuid cache.
164
150
  #
165
151
  # If called with no arguments, bulk saves the cache of documents to be bulk saved.
166
- def bulk_save(docs = nil, use_uuids = true)
152
+ def bulk_save (docs = nil)
167
153
  if docs.nil?
168
154
  docs = @bulk_save_cache
169
155
  @bulk_save_cache = []
170
156
  end
171
- if (use_uuids)
172
- ids, noids = docs.partition{|d|d['_id']}
173
- uuid_count = [noids.length, @server.uuid_batch_count].max
174
- noids.each do |doc|
175
- nextid = @server.next_uuid(uuid_count) rescue nil
176
- doc['_id'] = nextid if nextid
177
- end
157
+ ids, noids = docs.partition{|d|d['_id']}
158
+ uuid_count = [noids.length, @server.uuid_batch_count].max
159
+ noids.each do |doc|
160
+ nextid = @server.next_uuid(uuid_count) rescue nil
161
+ doc['_id'] = nextid if nextid
178
162
  end
179
- CouchRest.post "#{@uri}/_bulk_docs", {:docs => docs}
163
+ CouchRest.post "#{@root}/_bulk_docs", {:docs => docs}
180
164
  end
181
- alias :bulk_delete :bulk_save
182
165
 
183
166
  # DELETE the document from CouchDB that has the given <tt>_id</tt> and
184
167
  # <tt>_rev</tt>.
185
168
  #
186
169
  # If <tt>bulk</tt> is true (false by default) the deletion is recorded for bulk-saving (bulk-deletion :) later.
187
170
  # Bulk saving happens automatically when #bulk_save_cache limit is exceded, or on the next non bulk save.
188
- def delete_doc(doc, bulk = false)
171
+ def delete (doc, bulk = false)
189
172
  raise ArgumentError, "_id and _rev required for deleting" unless doc['_id'] && doc['_rev']
190
173
  if bulk
191
174
  @bulk_save_cache << { '_id' => doc['_id'], '_rev' => doc['_rev'], '_deleted' => true }
@@ -193,19 +176,13 @@ module CouchRest
193
176
  return { "ok" => true } # Mimic the non-deferred version
194
177
  end
195
178
  slug = escape_docid(doc['_id'])
196
- CouchRest.delete "#{@uri}/#{slug}?rev=#{doc['_rev']}"
197
- end
198
-
199
- ### DEPRECATION NOTICE
200
- def delete(doc, bulk=false)
201
- puts "CouchRest::Database's delete method is being deprecated, please use delete_doc instead"
202
- delete_doc(doc, bulk)
179
+ CouchRest.delete "#{@root}/#{slug}?rev=#{doc['_rev']}"
203
180
  end
204
181
 
205
182
  # COPY an existing document to a new id. If the destination id currently exists, a rev must be provided.
206
183
  # <tt>dest</tt> can take one of two forms if overwriting: "id_to_overwrite?rev=revision" or the actual doc
207
184
  # hash with a '_rev' key
208
- def copy_doc(doc, dest)
185
+ def copy doc, dest
209
186
  raise ArgumentError, "_id is required for copying" unless doc['_id']
210
187
  slug = escape_docid(doc['_id'])
211
188
  destination = if dest.respond_to?(:has_key?) && dest['_id'] && dest['_rev']
@@ -213,19 +190,13 @@ module CouchRest
213
190
  else
214
191
  dest
215
192
  end
216
- CouchRest.copy "#{@uri}/#{slug}", destination
217
- end
218
-
219
- ### DEPRECATION NOTICE
220
- def copy(doc, dest)
221
- puts "CouchRest::Database's copy method is being deprecated, please use copy_doc instead"
222
- copy_doc(doc, dest)
193
+ CouchRest.copy "#{@root}/#{slug}", destination
223
194
  end
224
195
 
225
196
  # MOVE an existing document to a new id. If the destination id currently exists, a rev must be provided.
226
197
  # <tt>dest</tt> can take one of two forms if overwriting: "id_to_overwrite?rev=revision" or the actual doc
227
198
  # hash with a '_rev' key
228
- def move_doc(doc, dest)
199
+ def move doc, dest
229
200
  raise ArgumentError, "_id and _rev are required for moving" unless doc['_id'] && doc['_rev']
230
201
  slug = escape_docid(doc['_id'])
231
202
  destination = if dest.respond_to?(:has_key?) && dest['_id'] && dest['_rev']
@@ -233,75 +204,27 @@ module CouchRest
233
204
  else
234
205
  dest
235
206
  end
236
- CouchRest.move "#{@uri}/#{slug}?rev=#{doc['_rev']}", destination
237
- end
238
-
239
- ### DEPRECATION NOTICE
240
- def move(doc, dest)
241
- puts "CouchRest::Database's move method is being deprecated, please use move_doc instead"
242
- move_doc(doc, dest)
207
+ CouchRest.move "#{@root}/#{slug}?rev=#{doc['_rev']}", destination
243
208
  end
244
209
 
245
210
  # Compact the database, removing old document revisions and optimizing space use.
246
211
  def compact!
247
- CouchRest.post "#{@uri}/_compact"
248
- end
249
-
250
- # Create the database
251
- def create!
252
- bool = server.create_db(@name) rescue false
253
- bool && true
254
- end
255
-
256
- # Delete and re create the database
257
- def recreate!
258
- delete!
259
- create!
260
- rescue RestClient::ResourceNotFound
261
- ensure
262
- create!
263
- end
264
-
265
- # Replicates via "pulling" from another database to this database. Makes no attempt to deal with conflicts.
266
- def replicate_from other_db
267
- raise ArgumentError, "must provide a CouchReset::Database" unless other_db.kind_of?(CouchRest::Database)
268
- CouchRest.post "#{@host}/_replicate", :source => other_db.root, :target => name
269
- end
270
-
271
- # Replicates via "pushing" to another database. Makes no attempt to deal with conflicts.
272
- def replicate_to other_db
273
- raise ArgumentError, "must provide a CouchReset::Database" unless other_db.kind_of?(CouchRest::Database)
274
- CouchRest.post "#{@host}/_replicate", :target => other_db.root, :source => name
212
+ CouchRest.post "#{@root}/_compact"
275
213
  end
276
-
214
+
277
215
  # DELETE the database itself. This is not undoable and could be rather
278
216
  # catastrophic. Use with care!
279
217
  def delete!
280
- CouchRest.delete @uri
218
+ CouchRest.delete @root
281
219
  end
282
220
 
283
221
  private
284
-
285
- def uri_for_attachment(doc, name)
286
- if doc.is_a?(String)
287
- puts "CouchRest::Database#fetch_attachment will eventually require a doc as the first argument, not a doc.id"
288
- docid = doc
289
- rev = nil
290
- else
291
- docid = doc['_id']
292
- rev = doc['_rev']
293
- end
294
- docid = escape_docid(docid)
295
- name = CGI.escape(name)
296
- rev = "?rev=#{doc['_rev']}" if rev
297
- "#{@root}/#{docid}/#{name}#{rev}"
298
- end
299
-
222
+
300
223
  def escape_docid id
301
224
  /^_design\/(.*)/ =~ id ? "_design/#{CGI.escape($1)}" : CGI.escape(id)
302
225
  end
303
226
 
304
- def encode_attachments(attachments)
227
+ def encode_attachments attachments
305
228
  attachments.each do |k,v|
306
229
  next if v['stub']
307
230
  v['data'] = base64(v['data'])
@@ -309,7 +232,7 @@ module CouchRest
309
232
  attachments
310
233
  end
311
234
 
312
- def base64(data)
235
+ def base64 data
313
236
  Base64.encode64(data).gsub(/\s/,'')
314
237
  end
315
238
  end