eee-c-couch_design_docs 1.0.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,17 @@
1
+ == 1.1.0 / 2009-07-31
2
+
3
+ * Add the ability to upload "normal" documents in addition to design
4
+ documents.
5
+ * <tt>CouchDesignDocs::upload_dir</tt> is aliased as
6
+ <tt>CouchDesignDocs::put_dir</tt> and is DEPRECATED.
7
+ * <tt>CouchDesignDocs::put_dir</tt> now puts both design documents
8
+ and "normal" documents onto the CouchDB database.
9
+ * <tt>CouchDesignDocs::put_design_dir</tt> has been added to put
10
+ design documents
11
+ * <tt>CouchDesignDocs::put_document_dir</tt> has been added to put
12
+ "normal" documents
13
+
14
+
1
15
  == 1.0.2 / 2009-07-13
2
16
 
3
17
  * Round out the API so that it is possible to load an entire directory
data/README.txt CHANGED
@@ -4,24 +4,30 @@ couch_design_docs
4
4
 
5
5
  == DESCRIPTION:
6
6
 
7
- Manage CouchDB views.
7
+ Manage CouchDB views and documents.
8
8
 
9
9
  == FEATURES/PROBLEMS:
10
10
 
11
- * Allows you to store your CouchDB design documents on the file system
12
- with <tt>.js</tt> extensions.
11
+ * Store your CouchDB documents on the filesystem for on-demand
12
+ upload. Design documents are kept in a <tt>_design</tt>
13
+ sub-directory, with <tt>.js</tt> extensions. Normal documents are
14
+ stored with a <tt>.json</tt> extension.
13
15
 
14
16
  == SYNOPSIS:
15
17
 
16
18
  DB_URL = "http://localhost:5984/db"
17
- DIRECTORY = "/repos/db/coudb/_design"
19
+ DIRECTORY = "/repos/db/couchdb/"
18
20
 
19
- # /repos/db/coudb/_design/lucene/transform.js
21
+ # /repos/db/couchdb/_design/lucene/transform.js
22
+ # /repos/db/couchdb/foo.json
20
23
 
21
- CouchDesignDocs.upload_dir(DB_URL, DIRECTORY)
24
+ CouchDesignDocs.put_dir(DB_URL, DIRECTORY)
22
25
 
23
26
  # => lucene design document with a "transform" function containing
24
27
  # the contents of transform.js
28
+ # - AND -
29
+ # a document named "foo" with the JSON contents from the foo.json
30
+ # file
25
31
 
26
32
  == REQUIREMENTS:
27
33
 
data/Rakefile CHANGED
@@ -27,6 +27,9 @@ PROJ.rubyforge.name = 'couch_design_docs'
27
27
 
28
28
  PROJ.spec.opts << '--color'
29
29
 
30
- PROJ.gem.dependencies = %w{json jchris-couchrest}
30
+ PROJ.gem.dependencies = %w{json rest-client}
31
+
32
+ depend_on 'rest-client'
33
+ depend_on 'json'
31
34
 
32
35
  # EOF
@@ -2,24 +2,24 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{couch_design_docs}
5
- s.version = "1.0.2"
5
+ s.version = "1.1.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Chris Strom"]
9
- s.date = %q{2009-07-13}
9
+ s.date = %q{2009-07-31}
10
10
  s.default_executable = %q{couch_design_docs}
11
- s.description = %q{Manage CouchDB views.}
11
+ s.description = %q{Manage CouchDB views and documents.}
12
12
  s.email = %q{chris@eeecooks.com}
13
13
  s.executables = ["couch_design_docs"]
14
14
  s.extra_rdoc_files = ["History.txt", "README.txt", "bin/couch_design_docs"]
15
- s.files = ["History.txt", "README.txt", "Rakefile", "bin/couch_design_docs", "couch_design_docs.gemspec", "fixtures/a/b/c.js", "fixtures/a/b/d.js", "lib/couch_design_docs.rb", "lib/couch_design_docs/directory.rb", "lib/couch_design_docs/store.rb", "spec/couch_design_docs_spec.rb", "spec/spec_helper.rb", "test/test_couch_design_docs.rb"]
15
+ s.files = ["History.txt", "README.txt", "Rakefile", "bin/couch_design_docs", "couch_design_docs.gemspec", "fixtures/_design/a/b/c.js", "fixtures/_design/a/b/d.js", "fixtures/bar.json", "fixtures/foo.json", "lib/couch_design_docs.rb", "lib/couch_design_docs/design_directory.rb", "lib/couch_design_docs/document_directory.rb", "lib/couch_design_docs/store.rb", "spec/couch_design_docs_spec.rb", "spec/spec_helper.rb", "test/test_couch_design_docs.rb"]
16
16
  s.has_rdoc = true
17
17
  s.homepage = %q{http://github.com/eee-c/couch_design_docs}
18
18
  s.rdoc_options = ["--main", "README.txt"]
19
19
  s.require_paths = ["lib"]
20
20
  s.rubyforge_project = %q{couch_design_docs}
21
21
  s.rubygems_version = %q{1.3.1}
22
- s.summary = %q{Manage CouchDB views}
22
+ s.summary = %q{Manage CouchDB views and documents}
23
23
  s.test_files = ["test/test_couch_design_docs.rb"]
24
24
 
25
25
  if s.respond_to? :specification_version then
@@ -28,16 +28,22 @@ Gem::Specification.new do |s|
28
28
 
29
29
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
30
30
  s.add_runtime_dependency(%q<json>, [">= 0"])
31
- s.add_runtime_dependency(%q<jchris-couchrest>, [">= 0"])
31
+ s.add_runtime_dependency(%q<rest-client>, [">= 0"])
32
+ s.add_runtime_dependency(%q<rest-client>, [">= 0.9.2"])
33
+ s.add_runtime_dependency(%q<json>, [">= 1.1.3"])
32
34
  s.add_development_dependency(%q<bones>, [">= 2.5.1"])
33
35
  else
34
36
  s.add_dependency(%q<json>, [">= 0"])
35
- s.add_dependency(%q<jchris-couchrest>, [">= 0"])
37
+ s.add_dependency(%q<rest-client>, [">= 0"])
38
+ s.add_dependency(%q<rest-client>, [">= 0.9.2"])
39
+ s.add_dependency(%q<json>, [">= 1.1.3"])
36
40
  s.add_dependency(%q<bones>, [">= 2.5.1"])
37
41
  end
38
42
  else
39
43
  s.add_dependency(%q<json>, [">= 0"])
40
- s.add_dependency(%q<jchris-couchrest>, [">= 0"])
44
+ s.add_dependency(%q<rest-client>, [">= 0"])
45
+ s.add_dependency(%q<rest-client>, [">= 0.9.2"])
46
+ s.add_dependency(%q<json>, [">= 1.1.3"])
41
47
  s.add_dependency(%q<bones>, [">= 2.5.1"])
42
48
  end
43
49
  end
File without changes
File without changes
@@ -0,0 +1 @@
1
+ {"bar":"2"}
@@ -0,0 +1 @@
1
+ {"foo":"1"}
@@ -1,9 +1,7 @@
1
- require 'pp'
2
-
3
1
  module CouchDesignDocs
4
2
 
5
3
  # :stopdoc:
6
- VERSION = '1.0.2'
4
+ VERSION = '1.1.0'
7
5
  LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
8
6
  PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
9
7
  # :startdoc:
@@ -18,12 +16,37 @@ module CouchDesignDocs
18
16
  # directory, <tt>dir</tt> containing design documents, creates
19
17
  # design documents in the CouchDB database
20
18
  #
19
+ def self.put_dir(db_uri, dir)
20
+ self.put_design_dir(db_uri, "#{dir}/_design")
21
+ self.put_document_dir(db_uri, dir)
22
+ end
23
+
24
+ # Alias for <tt>put_dir</tt>
21
25
  def self.upload_dir(db_uri, dir)
26
+ self.put_dir(db_uri, dir)
27
+ end
28
+
29
+ # Upload design documents from <tt>dir</tt> to the CouchDB database
30
+ # located at <tt>db_uri</tt>
31
+ #
32
+ def self.put_design_dir(db_uri, dir)
22
33
  store = Store.new(db_uri)
23
- dir = Directory.new(dir)
24
- store.load(dir.to_hash)
34
+ dir = DesignDirectory.new(dir)
35
+ store.put_design_documents(dir.to_hash)
25
36
  end
26
37
 
38
+ # Upload documents from <tt>dir</tt> to the CouchDB database
39
+ # located at <tt>db_uri</tt>
40
+ #
41
+ def self.put_document_dir(db_uri, dir)
42
+ store = Store.new(db_uri)
43
+ dir = DocumentDirectory.new(dir)
44
+ dir.each_document do |name, contents|
45
+ Store.put!("#{db_uri}/#{name}", contents)
46
+ end
47
+ end
48
+
49
+
27
50
  # Returns the library path for the module. If any arguments are given,
28
51
  # they will be joined to the end of the libray path using
29
52
  # <tt>File.join</tt>.
@@ -1,5 +1,3 @@
1
- require 'pp'
2
-
3
1
  class Hash
4
2
  def deep_merge(other)
5
3
  self.merge(other) do |key, oldval, newval|
@@ -9,7 +7,7 @@ class Hash
9
7
  end
10
8
 
11
9
  module CouchDesignDocs
12
- class Directory
10
+ class DesignDirectory
13
11
 
14
12
  attr_accessor :couch_view_dir
15
13
 
@@ -29,7 +27,7 @@ module CouchDesignDocs
29
27
 
30
28
  def to_hash
31
29
  Dir["#{couch_view_dir}/**/*.js"].inject({}) do |memo, filename|
32
- Directory.
30
+ DesignDirectory.
33
31
  a_to_hash(expand_file(filename)).
34
32
  deep_merge(memo)
35
33
  end
@@ -0,0 +1,19 @@
1
+ module CouchDesignDocs
2
+ class DocumentDirectory
3
+
4
+ attr_accessor :couch_doc_dir
5
+
6
+ def initialize(path)
7
+ Dir.new(path)
8
+ @couch_doc_dir = path
9
+ end
10
+
11
+ def each_document
12
+ Dir["#{couch_doc_dir}/*.json"].each do |filename|
13
+ yield [ File.basename(filename, '.json'),
14
+ JSON.parse(File.new(filename).read) ]
15
+
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,3 +1,4 @@
1
+ require 'rubygems'
1
2
  require 'restclient'
2
3
  require 'json'
3
4
 
@@ -12,11 +13,11 @@ module CouchDesignDocs
12
13
  @url = url
13
14
  end
14
15
 
15
- # Loads all supplied designed documents in the current store.
16
+ # Loads all supplied design documents in the current store.
16
17
  # Given a hash <tt>h</tt>, the keys being the CouchDB document
17
18
  # name and values of design documents
18
19
  #
19
- def load(h)
20
+ def put_design_documents(h)
20
21
  h.each_pair do |document_name, doc|
21
22
  Store.put!("#{url}/_design/#{document_name}", doc)
22
23
  end
@@ -1,19 +1,49 @@
1
1
  require File.join(File.dirname(__FILE__), %w[spec_helper])
2
2
 
3
3
  describe CouchDesignDocs do
4
+ it "should be able to load design and normal documents" do
5
+ CouchDesignDocs.
6
+ should_receive(:put_design_dir).
7
+ with("uri", "fixtures/_design")
8
+
9
+ CouchDesignDocs.
10
+ should_receive(:put_document_dir).
11
+ with("uri", "fixtures")
12
+
13
+ CouchDesignDocs.put_dir("uri", "fixtures")
14
+ end
15
+
4
16
  it "should be able to load directory/JS files into CouchDB as design docs" do
5
17
  store = mock("Store")
6
18
  Store.stub!(:new).and_return(store)
7
19
 
8
- dir = mock("Directory")
20
+ dir = mock("Design Directory")
9
21
  dir.stub!(:to_hash).and_return({ "foo" => "bar" })
10
- Directory.stub!(:new).and_return(dir)
22
+ DesignDirectory.stub!(:new).and_return(dir)
11
23
 
12
24
  store.
13
- should_receive(:load).
25
+ should_receive(:put_design_documents).
14
26
  with({ "foo" => "bar" })
15
27
 
16
- CouchDesignDocs.upload_dir("uri", "fixtures")
28
+ CouchDesignDocs.put_design_dir("uri", "fixtures")
29
+ end
30
+
31
+ it "should be able to load documents into CouchDB" do
32
+ store = mock("Store")
33
+ Store.stub!(:new).and_return(store)
34
+
35
+ dir = mock("Document Directory")
36
+ dir.
37
+ stub!(:each_document).
38
+ and_yield('foo', {"foo" => "1"})
39
+
40
+ DocumentDirectory.stub!(:new).and_return(dir)
41
+
42
+ Store.
43
+ should_receive(:put!).
44
+ with('uri/foo', {"foo" => "1"})
45
+
46
+ CouchDesignDocs.put_document_dir("uri", "fixtures")
17
47
  end
18
48
  end
19
49
 
@@ -78,7 +108,7 @@ describe Store do
78
108
  with("uri/_design/a",
79
109
  '{"b":{"c":"function(doc) { return true; }"}}',
80
110
  :content_type => 'application/json')
81
- @it.load(@hash)
111
+ @it.put_design_documents(@hash)
82
112
  end
83
113
 
84
114
  it "should be able to retrieve an existing document" do
@@ -101,20 +131,49 @@ describe Store do
101
131
  end
102
132
  end
103
133
 
104
- describe Directory do
134
+ describe DocumentDirectory do
135
+ it "should require a root directory for instantiation" do
136
+ lambda { DocumentDirectory.new }.
137
+ should raise_error
138
+
139
+ lambda { DocumentDirectory.new("foo") }.
140
+ should raise_error
141
+
142
+ lambda { DocumentDirectory.new("fixtures")}.
143
+ should_not raise_error
144
+ end
145
+
146
+ context "a valid directory" do
147
+ before(:each) do
148
+ @it = DocumentDirectory.new("fixtures")
149
+ end
150
+
151
+ it "should be able to iterate over the documents" do
152
+ everything = []
153
+ @it.each_document do |name, contents|
154
+ everything << [name, contents]
155
+ end
156
+ everything.
157
+ should == [['bar', {"bar" => "2"}],
158
+ ['foo', {"foo" => "1"}]]
159
+ end
160
+ end
161
+ end
162
+
163
+ describe DesignDirectory do
105
164
  it "should require a root directory for instantiation" do
106
- lambda { Directory.new }.
165
+ lambda { DesignDirectory.new }.
107
166
  should raise_error
108
167
 
109
- lambda { Directory.new("foo") }.
168
+ lambda { DesignDirectory.new("foo") }.
110
169
  should raise_error
111
170
 
112
- lambda { Directory.new("fixtures")}.
171
+ lambda { DesignDirectory.new("fixtures/_design")}.
113
172
  should_not raise_error
114
173
  end
115
174
 
116
175
  it "should convert arrays into deep hashes" do
117
- Directory.
176
+ DesignDirectory.
118
177
  a_to_hash(%w{a b c d}).
119
178
  should == {
120
179
  'a' => {
@@ -127,11 +186,11 @@ describe Directory do
127
186
 
128
187
  context "a valid directory" do
129
188
  before(:each) do
130
- @it = Directory.new("fixtures")
189
+ @it = DesignDirectory.new("fixtures/_design")
131
190
  end
132
191
 
133
192
  it "should list dirs, basename and contents of a file" do
134
- @it.expand_file("fixtures/a/b/c.js").
193
+ @it.expand_file("fixtures/_design/a/b/c.js").
135
194
  should == ['a', 'b', 'c', 'function(doc) { return true; }']
136
195
  end
137
196
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eee-c-couch_design_docs
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Strom
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-07-13 00:00:00 -07:00
12
+ date: 2009-07-31 00:00:00 -07:00
13
13
  default_executable: couch_design_docs
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -23,7 +23,7 @@ dependencies:
23
23
  version: "0"
24
24
  version:
25
25
  - !ruby/object:Gem::Dependency
26
- name: jchris-couchrest
26
+ name: rest-client
27
27
  type: :runtime
28
28
  version_requirement:
29
29
  version_requirements: !ruby/object:Gem::Requirement
@@ -32,6 +32,26 @@ dependencies:
32
32
  - !ruby/object:Gem::Version
33
33
  version: "0"
34
34
  version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: rest-client
37
+ type: :runtime
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 0.9.2
44
+ version:
45
+ - !ruby/object:Gem::Dependency
46
+ name: json
47
+ type: :runtime
48
+ version_requirement:
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 1.1.3
54
+ version:
35
55
  - !ruby/object:Gem::Dependency
36
56
  name: bones
37
57
  type: :development
@@ -42,7 +62,7 @@ dependencies:
42
62
  - !ruby/object:Gem::Version
43
63
  version: 2.5.1
44
64
  version:
45
- description: Manage CouchDB views.
65
+ description: Manage CouchDB views and documents.
46
66
  email: chris@eeecooks.com
47
67
  executables:
48
68
  - couch_design_docs
@@ -58,16 +78,20 @@ files:
58
78
  - Rakefile
59
79
  - bin/couch_design_docs
60
80
  - couch_design_docs.gemspec
61
- - fixtures/a/b/c.js
62
- - fixtures/a/b/d.js
81
+ - fixtures/_design/a/b/c.js
82
+ - fixtures/_design/a/b/d.js
83
+ - fixtures/bar.json
84
+ - fixtures/foo.json
63
85
  - lib/couch_design_docs.rb
64
- - lib/couch_design_docs/directory.rb
86
+ - lib/couch_design_docs/design_directory.rb
87
+ - lib/couch_design_docs/document_directory.rb
65
88
  - lib/couch_design_docs/store.rb
66
89
  - spec/couch_design_docs_spec.rb
67
90
  - spec/spec_helper.rb
68
91
  - test/test_couch_design_docs.rb
69
92
  has_rdoc: true
70
93
  homepage: http://github.com/eee-c/couch_design_docs
94
+ licenses:
71
95
  post_install_message:
72
96
  rdoc_options:
73
97
  - --main
@@ -89,9 +113,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
89
113
  requirements: []
90
114
 
91
115
  rubyforge_project: couch_design_docs
92
- rubygems_version: 1.2.0
116
+ rubygems_version: 1.3.5
93
117
  signing_key:
94
118
  specification_version: 2
95
- summary: Manage CouchDB views
119
+ summary: Manage CouchDB views and documents
96
120
  test_files:
97
121
  - test/test_couch_design_docs.rb