couch 0.1.0 → 0.1.1

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.
@@ -0,0 +1,3 @@
1
+ [submodule "lib/couch/generators/application/templates/lib/mustache"]
2
+ path = lib/couch/generators/application/templates/lib/mustache
3
+ url = git://github.com/janl/mustache.js.git
data/Rakefile CHANGED
@@ -17,7 +17,7 @@ begin
17
17
  gem.add_dependency "rest-client", ">= 1.4.1"
18
18
  gem.add_dependency "json_pure", ">= 1.2.2"
19
19
  gem.add_dependency "activesupport", ">= 3.0.0.beta"
20
- gem.add_development_dependency "rspec", ">= 1.2.9"
20
+ # gem.add_development_dependency "rspec", ">= 1.2.9"
21
21
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
22
22
  end
23
23
  Jeweler::GemcutterTasks.new
data/bin/couch CHANGED
@@ -3,4 +3,5 @@
3
3
  couch_path = File.expand_path('../../lib', __FILE__)
4
4
  $:.unshift(couch_path) if File.directory?(couch_path) && !$:.include?(couch_path)
5
5
 
6
+ require 'couch'
6
7
  require 'couch/commands'
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{couch}
8
- s.version = "0.1.0"
8
+ s.version = "0.1.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Johannes J. Schmidt"]
12
- s.date = %q{2010-03-09}
12
+ s.date = %q{2010-03-10}
13
13
  s.default_executable = %q{couch}
14
14
  s.description = %q{With Couch you can easy build a standalone CouchDB application.}
15
15
  s.email = %q{schmidt@netzmerk.com}
@@ -20,6 +20,7 @@ Gem::Specification.new do |s|
20
20
  ]
21
21
  s.files = [
22
22
  ".gitignore",
23
+ ".gitmodules",
23
24
  "LICENSE",
24
25
  "README.rdoc",
25
26
  "Rakefile",
@@ -27,7 +28,6 @@ Gem::Specification.new do |s|
27
28
  "couch.gemspec",
28
29
  "lib/couch.rb",
29
30
  "lib/couch/actions/base.rb",
30
- "lib/couch/actions/net_base.rb",
31
31
  "lib/couch/actions/pull.rb",
32
32
  "lib/couch/actions/push.rb",
33
33
  "lib/couch/actions/routes.rb",
@@ -37,6 +37,7 @@ Gem::Specification.new do |s|
37
37
  "lib/couch/commands/pull.rb",
38
38
  "lib/couch/commands/push.rb",
39
39
  "lib/couch/commands/routes.rb",
40
+ "lib/couch/design_document.rb",
40
41
  "lib/couch/generators.rb",
41
42
  "lib/couch/generators/application/USAGE",
42
43
  "lib/couch/generators/application/application_generator.rb",
@@ -63,11 +64,7 @@ Gem::Specification.new do |s|
63
64
  "lib/couch/generators/view/USAGE",
64
65
  "lib/couch/generators/view/templates/map.js",
65
66
  "lib/couch/generators/view/view_generator.rb",
66
- "lib/couch/mapper.rb",
67
- "lib/couch/version.rb",
68
- "spec/couch_spec.rb",
69
- "spec/spec.opts",
70
- "spec/spec_helper.rb"
67
+ "lib/couch/version.rb"
71
68
  ]
72
69
  s.homepage = %q{http://github.com/jo/couch}
73
70
  s.rdoc_options = ["--charset=UTF-8"]
@@ -75,10 +72,6 @@ Gem::Specification.new do |s|
75
72
  s.rubyforge_project = %q{couch}
76
73
  s.rubygems_version = %q{1.3.6}
77
74
  s.summary = %q{Standalone CouchDB Application Development Suite}
78
- s.test_files = [
79
- "spec/spec_helper.rb",
80
- "spec/couch_spec.rb"
81
- ]
82
75
 
83
76
  if s.respond_to? :specification_version then
84
77
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
@@ -89,20 +82,17 @@ Gem::Specification.new do |s|
89
82
  s.add_runtime_dependency(%q<rest-client>, [">= 1.4.1"])
90
83
  s.add_runtime_dependency(%q<json_pure>, [">= 1.2.2"])
91
84
  s.add_runtime_dependency(%q<activesupport>, [">= 3.0.0.beta"])
92
- s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
93
85
  else
94
86
  s.add_dependency(%q<thor>, [">= 0.13.4"])
95
87
  s.add_dependency(%q<rest-client>, [">= 1.4.1"])
96
88
  s.add_dependency(%q<json_pure>, [">= 1.2.2"])
97
89
  s.add_dependency(%q<activesupport>, [">= 3.0.0.beta"])
98
- s.add_dependency(%q<rspec>, [">= 1.2.9"])
99
90
  end
100
91
  else
101
92
  s.add_dependency(%q<thor>, [">= 0.13.4"])
102
93
  s.add_dependency(%q<rest-client>, [">= 1.4.1"])
103
94
  s.add_dependency(%q<json_pure>, [">= 1.2.2"])
104
95
  s.add_dependency(%q<activesupport>, [">= 3.0.0.beta"])
105
- s.add_dependency(%q<rspec>, [">= 1.2.9"])
106
96
  end
107
97
  end
108
98
 
@@ -1,4 +1,6 @@
1
+ require 'rubygems'
1
2
  require 'yaml'
3
+ require 'json'
2
4
 
3
5
  module Couch
4
6
  CONFIG_FILENAME = ".couchrc"
@@ -15,12 +17,12 @@ module Couch
15
17
  @config ||= YAML.load(File.open config_file)
16
18
  end
17
19
 
20
+ private
21
+
18
22
  def self.config_file
19
23
  File.join root, CONFIG_FILENAME
20
24
  end
21
25
 
22
- private
23
-
24
26
  def self.find_root
25
27
  cwd = Dir.pwd
26
28
  return cwd if File.exists?(File.join(cwd, CONFIG_FILENAME))
@@ -1,6 +1,3 @@
1
- require 'couch'
2
-
3
- require 'rubygems'
4
1
  require 'thor/group'
5
2
  require 'active_support/inflector'
6
3
 
@@ -9,21 +6,9 @@ module Couch
9
6
  class Base < Thor::Group
10
7
  include Thor::Actions
11
8
 
12
- class_option :database, :type => :string
13
-
14
9
  def self.banner
15
10
  "couch #{to_s.split('::').last.underscore}"
16
11
  end
17
-
18
- private
19
-
20
- def database
21
- options[:database] || Couch.database
22
- end
23
-
24
- def url_for(id)
25
- File.join database, id
26
- end
27
12
  end
28
13
  end
29
14
  end
@@ -1,47 +1,26 @@
1
- require 'couch/actions/net_base'
1
+ require 'couch/actions/base'
2
+ require 'couch/design_document'
3
+
4
+ require "rest_client"
2
5
 
3
6
  module Couch
4
7
  module Actions
5
- class Pull < NetBase
8
+ class Pull < Base
6
9
  add_runtime_options!
7
10
 
8
11
  def pull
9
- id = mapper.doc["_id"]
10
- url = url_for(id)
11
-
12
- say "Pulling from %s..." % url
13
-
14
- resp = RestClient.get url + "?attachments=true"
15
- response = JSON.parse(resp.body)
16
- map_doc(response)
17
- rev = response["_rev"]
12
+ say "Pulling from %s" % DesignDocument.url
18
13
 
19
- say "Checked out %s" % rev
20
- rescue RestClient::ResourceNotFound
21
- say "Error: Document %s does not exist!" % id
22
- end
14
+ resp = RestClient.get DesignDocument.url(:attachments => true)
15
+ doc = DesignDocument.build_from_json(resp.body)
23
16
 
24
- private
25
-
26
- def map_doc(doc, dirname = destination_root)
27
- doc.each do |key, value|
28
- next if key == "_attachments"
29
- filename = File.join(dirname, key)
30
- if value.is_a?(String)
31
- create_file "#{filename}.js", "#{value}\n"
32
- else
33
- Dir.mkdir(filename) unless File.directory?(filename)
34
- map_doc value, File.join(dirname, key)
35
- end
17
+ doc.write do |filename, content|
18
+ create_file filename, content
36
19
  end
37
- map_doc_attachments(doc["_attachments"], dirname) if doc["_attachments"]
38
- end
39
20
 
40
- def map_doc_attachments(doc, dirname)
41
- doc.each do |key, value|
42
- filename = File.join(dirname, "_attachments", key)
43
- create_file filename, value["data"].unpack("m")
44
- end
21
+ say "Checked out %s" % doc.rev
22
+ rescue RestClient::ResourceNotFound
23
+ say "Error: Document %s does not exist!" % DesignDocument.id
45
24
  end
46
25
  end
47
26
  end
@@ -1,21 +1,22 @@
1
- require 'couch/actions/net_base'
1
+ require 'couch/actions/base'
2
+ require 'couch/design_document'
3
+
4
+ require "rest_client"
2
5
 
3
6
  module Couch
4
7
  module Actions
5
- class Push < NetBase
8
+ class Push < Base
6
9
  def create_database_unless_exists
7
- RestClient.put database, nil
8
- say "Created database %s" % database
10
+ RestClient.put DesignDocument.database, nil
11
+ say "Created database %s" % DesignDocument.database
9
12
  rescue RestClient::PreconditionFailed
10
13
  end
11
14
 
12
15
  def push
13
- doc = mapper.doc
14
- url = url_for(doc["_id"])
15
-
16
- say "Pushing to %s..." % url
16
+ doc = DesignDocument.build_from_filesystem(destination_root)
17
+ say "Pushing to %s" % DesignDocument.url
17
18
 
18
- resp = RestClient.put url, doc.to_json
19
+ resp = RestClient.put DesignDocument.url, doc.to_json
19
20
  response = JSON.parse(resp.body)
20
21
 
21
22
  if response["ok"]
@@ -26,15 +26,15 @@ module Couch
26
26
  protected
27
27
 
28
28
  def attachment_url(file)
29
- File.join(database, '_design', File.basename(database), File.basename(file))
29
+ File.join(Couch.database, '_design', File.basename(Couch.database), File.basename(file))
30
30
  end
31
31
 
32
32
  def list_url(list, view)
33
- File.join(database, '_design', File.basename(database), '_list', File.basename(view), File.basename(list, '.js'))
33
+ File.join(Couch.database, '_design', File.basename(Couch.database), '_list', File.basename(view), File.basename(list, '.js'))
34
34
  end
35
35
 
36
36
  def show_url(show, id = '/')
37
- File.join(database, '_design', File.basename(database), '_show', File.basename(show, '.js'), id)
37
+ File.join(Couch.database, '_design', File.basename(Couch.database), '_show', File.basename(show, '.js'), id)
38
38
  end
39
39
  end
40
40
  end
@@ -0,0 +1,228 @@
1
+ require 'uri'
2
+
3
+ module Couch
4
+ class DesignDocument
5
+ EXT_MIME_MAPPING = {
6
+ ".html" => "text/html",
7
+ ".js" => "text/javascript",
8
+ ".css" => "text/css",
9
+ }
10
+
11
+ # initialize with a hash
12
+ def initialize(hash = {})
13
+ @hash = hash
14
+ end
15
+
16
+ # returns the id of the design document
17
+ def id
18
+ @hash["_id"]
19
+ end
20
+
21
+ # returns the rev of the design document
22
+ def rev
23
+ @hash["_rev"]
24
+ end
25
+
26
+ # converts to json
27
+ def to_json
28
+ hash_with_injected_makros.to_json
29
+ end
30
+
31
+ # write to filesystem
32
+ def write(&block)
33
+ write_doc @hash, nil, block
34
+ end
35
+
36
+ class << self
37
+ # returns new design document object from filesystem
38
+ def build_from_filesystem(root)
39
+ new map(root)
40
+ end
41
+
42
+ # returns new design document object from json string
43
+ def build_from_json(json)
44
+ new reject_makros(JSON.parse(json))
45
+ end
46
+
47
+ # returns the database used to store design document
48
+ def database
49
+ @database ||= Couch.database
50
+ end
51
+
52
+ # returns the id for design document
53
+ def id
54
+ @id ||= File.read(File.join(Couch.root, '_id.js')).strip
55
+ end
56
+
57
+ # returns the url for design document
58
+ def url(options = {})
59
+ File.join(database, id) << build_options_string(options)
60
+ end
61
+
62
+ private
63
+
64
+ def reject_makros(doc)
65
+ # TODO: recursive walk libs
66
+ libs = doc["lib"]
67
+ return doc if libs.nil? || libs.empty?
68
+ # Attention: replace json makros first!
69
+ doc = reject_json_makros(doc, libs)
70
+ doc = reject_code_makros(doc, libs)
71
+ end
72
+
73
+ def reject_code_makros(doc, libs)
74
+ doc = doc.dup
75
+ doc.each do |key, value|
76
+ next if key == "lib"
77
+ if value.is_a?(String)
78
+ libs.each do |name, content|
79
+ # only substitute strings
80
+ next unless content.is_a?(String)
81
+ next unless value.include?(content.strip)
82
+ doc[key] = value.gsub(content.strip, "// !code #{name}.js")
83
+ end
84
+ elsif value.is_a?(Hash)
85
+ doc[key] = reject_code_makros(value, libs)
86
+ end
87
+ end
88
+ doc
89
+ end
90
+
91
+ def reject_json_makros(doc, libs)
92
+ doc.each do |key, value|
93
+ next if key == "lib"
94
+ if value.is_a?(String)
95
+ libs.each do |name, content|
96
+ # only substitute strings
97
+ next unless content.is_a?(String)
98
+ json = 'var %s = %s;' % [name.sub(/\..*$/, ''), content.to_json]
99
+ next unless value.include?(json)
100
+ doc[key] = value.gsub(json, "// !json #{name}")
101
+ end
102
+ elsif value.is_a?(Hash)
103
+ doc[key] = reject_json_makros(value, libs)
104
+ end
105
+ end
106
+ doc
107
+ end
108
+
109
+ def build_options_string(options)
110
+ return '' if options.empty?
111
+ options_array = []
112
+ options.each do |key, value|
113
+ options_array << URI.escape([key, value].join('='))
114
+ end
115
+ '?' + options_array.join("&")
116
+ end
117
+
118
+ def map(dirname, hash = {})
119
+ Dir.entries(dirname).each do |file|
120
+ next if file =~ /^\./
121
+ filename = File.join(dirname, file)
122
+ if file == "_attachments"
123
+ hash['_attachments'] = map_attachments(filename)
124
+ elsif File.directory?(filename)
125
+ hash[file] = map(filename)
126
+ elsif File.extname(filename) =~ /^\.(js|html)$/
127
+ # only .js and .html files are mapped
128
+ # but .js is stripped off the key
129
+ key = file.sub(/\.js$/, '')
130
+ hash[key] = File.read(filename).strip
131
+ end
132
+ end
133
+ hash
134
+ end
135
+
136
+ def map_attachments(dirname, hash = {}, keys = [])
137
+ Dir.entries(dirname).each do |file|
138
+ next if file =~ /^\./
139
+ filename = File.join(dirname, file)
140
+ base = keys + [file]
141
+ if File.directory?(filename)
142
+ map_attachments filename, hash, base
143
+ else
144
+ hash[base.join('/')] = {
145
+ "content_type" => mime_type(filename),
146
+ "data" => base64(File.read(filename)),
147
+ }
148
+ end
149
+ end
150
+ hash
151
+ end
152
+
153
+ # CouchDB needs base64 encodings without spaces
154
+ def base64(data)
155
+ [data].pack("m").gsub(/\s/,'')
156
+ end
157
+
158
+ # detect mime type from filename extension
159
+ def mime_type(filename)
160
+ ext = File.extname(filename)
161
+ EXT_MIME_MAPPING[ext] || 'text/plain'
162
+ end
163
+ end
164
+
165
+ private
166
+
167
+ def write_doc(doc, dirname, block)
168
+ doc.each do |key, value|
169
+ next if key == "_attachments"
170
+ filename = dirname ? File.join(dirname, key) : key.dup
171
+ if value.is_a?(String)
172
+ filename << ".js" unless File.extname(filename) == ".html"
173
+ block.call filename, "#{value}\n"
174
+ else
175
+ write_doc value, filename, block
176
+ end
177
+ end
178
+ write_attachments doc["_attachments"], dirname, block if doc["_attachments"]
179
+ end
180
+
181
+ def write_attachments(doc, dirname, block)
182
+ dirname = dirname ? File.join(dirname, "_attachments") : "_attachments"
183
+
184
+ doc.each do |key, value|
185
+ next unless value["data"]
186
+
187
+ block.call File.join(dirname, key), value["data"].unpack("m")
188
+ end
189
+ end
190
+
191
+ def hash_with_injected_makros
192
+ hash = inject_code_makros(@hash)
193
+ inject_json_makros(hash)
194
+ end
195
+
196
+ def inject_code_makros(doc)
197
+ doc.each do |key, value|
198
+ doc[key] = if value.is_a?(String)
199
+ value.gsub(/\/\/\s*!code.*$/) do |match|
200
+ filename = match.sub(/^.*!code\s*(\S+).*$/, '\1')
201
+ File.read(File.join(Couch.root, 'lib', filename)).strip
202
+ end
203
+ elsif value.is_a?(Hash)
204
+ inject_code_makros(value)
205
+ else
206
+ value
207
+ end
208
+ end
209
+ doc
210
+ end
211
+
212
+ def inject_json_makros(doc)
213
+ doc.each do |key, value|
214
+ doc[key] = if value.is_a?(String)
215
+ value.gsub(/\/\/\s*!json.*$/) do |match|
216
+ filename = match.sub(/^.*!json\s*(\S+).*$/, '\1')
217
+ 'var %s = %s;' % [filename.sub(/\..*$/, ''), File.read(File.join(Couch.root, 'lib', filename)).strip.to_json]
218
+ end
219
+ elsif value.is_a?(Hash)
220
+ inject_json_makros(value)
221
+ else
222
+ value
223
+ end
224
+ end
225
+ doc
226
+ end
227
+ end
228
+ end
@@ -15,22 +15,29 @@ module Couch::Generators
15
15
  copy_file "gitignore", ".gitignore" unless options[:skip_git]
16
16
  template "_id.js"
17
17
  copy_file "validate_doc_update.js"
18
- empty_directory_with_gitkeep "lists"
19
- empty_directory_with_gitkeep "shows"
20
- empty_directory_with_gitkeep "updates"
21
- empty_directory_with_gitkeep "views"
18
+ empty_directory "lists"
19
+ empty_directory "shows"
20
+ empty_directory "updates"
21
+ empty_directory "views"
22
22
  end
23
23
 
24
24
  def create_attachments_files
25
25
  empty_directory "_attachments"
26
26
  inside "_attachments" do
27
- empty_directory_with_gitkeep "images"
28
- empty_directory_with_gitkeep "javascripts"
27
+ empty_directory "images"
28
+ empty_directory "javascripts"
29
29
  directory "stylesheets"
30
30
  template "index.html"
31
31
  end
32
32
  end
33
33
 
34
+ def create_lib_files
35
+ empty_directory "lib"
36
+ inside "lib" do
37
+ copy_file "mustache/mustache.js", "mustache.js"
38
+ end
39
+ end
40
+
34
41
  protected
35
42
 
36
43
  def app_name
@@ -1,4 +1,3 @@
1
- require 'rubygems'
2
1
  require 'thor/group'
3
2
  require 'active_support/inflector'
4
3
 
@@ -62,11 +61,6 @@ module Couch
62
61
  end
63
62
  end
64
63
  end
65
-
66
- def empty_directory_with_gitkeep(destination, config = {})
67
- empty_directory(destination, config)
68
- create_file("#{destination}/.gitkeep") unless options[:skip_git]
69
- end
70
64
  end
71
65
  end
72
66
  end
@@ -1,4 +1,3 @@
1
- require 'rubygems'
2
1
  require 'thor/group'
3
2
  require 'active_support/inflector'
4
3
 
@@ -1,3 +1,3 @@
1
1
  module Couch
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 0
9
- version: 0.1.0
8
+ - 1
9
+ version: 0.1.1
10
10
  platform: ruby
11
11
  authors:
12
12
  - Johannes J. Schmidt
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-03-09 00:00:00 +01:00
17
+ date: 2010-03-10 00:00:00 +01:00
18
18
  default_executable: couch
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -74,20 +74,6 @@ dependencies:
74
74
  version: 3.0.0.beta
75
75
  type: :runtime
76
76
  version_requirements: *id004
77
- - !ruby/object:Gem::Dependency
78
- name: rspec
79
- prerelease: false
80
- requirement: &id005 !ruby/object:Gem::Requirement
81
- requirements:
82
- - - ">="
83
- - !ruby/object:Gem::Version
84
- segments:
85
- - 1
86
- - 2
87
- - 9
88
- version: 1.2.9
89
- type: :development
90
- version_requirements: *id005
91
77
  description: With Couch you can easy build a standalone CouchDB application.
92
78
  email: schmidt@netzmerk.com
93
79
  executables:
@@ -99,6 +85,7 @@ extra_rdoc_files:
99
85
  - README.rdoc
100
86
  files:
101
87
  - .gitignore
88
+ - .gitmodules
102
89
  - LICENSE
103
90
  - README.rdoc
104
91
  - Rakefile
@@ -106,7 +93,6 @@ files:
106
93
  - couch.gemspec
107
94
  - lib/couch.rb
108
95
  - lib/couch/actions/base.rb
109
- - lib/couch/actions/net_base.rb
110
96
  - lib/couch/actions/pull.rb
111
97
  - lib/couch/actions/push.rb
112
98
  - lib/couch/actions/routes.rb
@@ -116,6 +102,7 @@ files:
116
102
  - lib/couch/commands/pull.rb
117
103
  - lib/couch/commands/push.rb
118
104
  - lib/couch/commands/routes.rb
105
+ - lib/couch/design_document.rb
119
106
  - lib/couch/generators.rb
120
107
  - lib/couch/generators/application/USAGE
121
108
  - lib/couch/generators/application/application_generator.rb
@@ -142,11 +129,7 @@ files:
142
129
  - lib/couch/generators/view/USAGE
143
130
  - lib/couch/generators/view/templates/map.js
144
131
  - lib/couch/generators/view/view_generator.rb
145
- - lib/couch/mapper.rb
146
132
  - lib/couch/version.rb
147
- - spec/couch_spec.rb
148
- - spec/spec.opts
149
- - spec/spec_helper.rb
150
133
  has_rdoc: true
151
134
  homepage: http://github.com/jo/couch
152
135
  licenses: []
@@ -177,6 +160,5 @@ rubygems_version: 1.3.6
177
160
  signing_key:
178
161
  specification_version: 3
179
162
  summary: Standalone CouchDB Application Development Suite
180
- test_files:
181
- - spec/spec_helper.rb
182
- - spec/couch_spec.rb
163
+ test_files: []
164
+
@@ -1,21 +0,0 @@
1
- require 'couch'
2
- require 'couch/mapper'
3
- require 'couch/actions/base'
4
-
5
- require 'rubygems'
6
- require "rest_client"
7
- require 'json'
8
-
9
- module Couch
10
- module Actions
11
- class NetBase < Base
12
- attr_reader :mapper
13
-
14
- def initialize(*args)
15
- super
16
- @mapper = Mapper.new(destination_root)
17
- end
18
- end
19
- end
20
- end
21
-
@@ -1,64 +0,0 @@
1
- module Couch
2
- class Mapper
3
- MIME_TYPES = {
4
- ".html" => "text/html",
5
- ".js" => "text/javascript",
6
- ".css" => "text/css",
7
- }
8
-
9
- def initialize(root)
10
- raise "Root invalid" unless root && File.directory?(root)
11
- @root = root
12
- end
13
-
14
- def doc
15
- map @root
16
- end
17
-
18
- private
19
-
20
- def map(dirname, hash = {})
21
- Dir.entries(dirname).each do |file|
22
- next if file =~ /^\./
23
- filename = File.join(dirname, file)
24
- if file == "_attachments"
25
- hash['_attachments'] = map_attachments(filename)
26
- elsif File.directory?(filename)
27
- hash[file] = map(filename)
28
- elsif File.extname(filename) == '.js'
29
- # only .js files are mapped
30
- key = file.sub(/\.js$/, '')
31
- hash[key] = File.read(filename).strip
32
- end
33
- end
34
- hash
35
- end
36
-
37
- def map_attachments(dirname, hash = {}, keys = [])
38
- Dir.entries(dirname).each do |file|
39
- next if file =~ /^\./
40
- filename = File.join(dirname, file)
41
- base = keys + [file]
42
- if File.directory?(filename)
43
- map_attachments filename, hash, base
44
- else
45
- hash[base.join('/')] = {
46
- "content_type" => mime_type(filename),
47
- "data" => base64(File.read(filename)),
48
- }
49
- end
50
- end
51
- hash
52
- end
53
-
54
- # CouchDB needs base64 encodings without spaces
55
- def base64(data)
56
- [data].pack("m").gsub(/\s/,'')
57
- end
58
-
59
- def mime_type(filename)
60
- ext = File.extname(filename)
61
- MIME_TYPES[ext] || 'text/plain'
62
- end
63
- end
64
- end
@@ -1,7 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
-
3
- describe "Couch" do
4
- it "fails" do
5
- fail "hey buddy, you should probably rename this file and start specing for real"
6
- end
7
- end
@@ -1 +0,0 @@
1
- --color
@@ -1,9 +0,0 @@
1
- $LOAD_PATH.unshift(File.dirname(__FILE__))
2
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
- require 'couch'
4
- require 'spec'
5
- require 'spec/autorun'
6
-
7
- Spec::Runner.configure do |config|
8
-
9
- end