jchris-couchrest 0.9.12 → 0.12.2

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 (37) hide show
  1. data/{README.rdoc → README.md} +10 -8
  2. data/Rakefile +60 -39
  3. data/THANKS.md +18 -0
  4. data/examples/word_count/markov +1 -1
  5. data/examples/word_count/views/word_count/count-reduce.js +2 -2
  6. data/examples/word_count/word_count.rb +2 -2
  7. data/examples/word_count/word_count_query.rb +2 -2
  8. data/lib/couchrest/commands/push.rb +8 -4
  9. data/lib/couchrest/core/database.rb +95 -14
  10. data/lib/couchrest/core/design.rb +89 -0
  11. data/lib/couchrest/core/document.rb +63 -0
  12. data/lib/couchrest/core/model.rb +203 -120
  13. data/lib/couchrest/core/server.rb +1 -1
  14. data/lib/couchrest/core/view.rb +4 -0
  15. data/lib/couchrest/helper/pager.rb +10 -10
  16. data/lib/couchrest/monkeypatches.rb +1 -1
  17. data/lib/couchrest.rb +20 -2
  18. data/spec/couchrest/core/couchrest_spec.rb +33 -23
  19. data/spec/couchrest/core/database_spec.rb +163 -8
  20. data/spec/couchrest/core/design_spec.rb +131 -0
  21. data/spec/couchrest/core/document_spec.rb +130 -0
  22. data/spec/couchrest/core/model_spec.rb +319 -35
  23. data/spec/couchrest/helpers/pager_spec.rb +2 -2
  24. data/spec/fixtures/attachments/README +3 -0
  25. data/spec/spec_helper.rb +17 -3
  26. data/utils/remap.rb +2 -2
  27. data/utils/subset.rb +2 -2
  28. metadata +24 -33
  29. data/THANKS +0 -15
  30. data/bin/couchapp +0 -55
  31. data/bin/couchview +0 -48
  32. data/lib/couchrest/helper/file_manager.rb +0 -285
  33. data/lib/couchrest/helper/templates/example-map.js +0 -8
  34. data/lib/couchrest/helper/templates/example-reduce.js +0 -10
  35. data/lib/couchrest/helper/templates/index.html +0 -26
  36. data/spec/couchapp_spec.rb +0 -82
  37. data/spec/couchrest/helpers/file_manager_spec.rb +0 -170
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jchris-couchrest
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.12
4
+ version: 0.12.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - J. Chris Anderson
@@ -9,8 +9,8 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-10-14 00:00:00 -07:00
13
- default_executable:
12
+ date: 2008-11-22 00:00:00 -08:00
13
+ default_executable: couchdir
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: json
@@ -30,6 +30,15 @@ dependencies:
30
30
  - !ruby/object:Gem::Version
31
31
  version: "0.5"
32
32
  version:
33
+ - !ruby/object:Gem::Dependency
34
+ name: mime-types
35
+ version_requirement:
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: "1.15"
41
+ version:
33
42
  - !ruby/object:Gem::Dependency
34
43
  name: extlib
35
44
  version_requirement:
@@ -40,25 +49,21 @@ dependencies:
40
49
  version: 0.9.6
41
50
  version:
42
51
  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.
43
- email: jchris@grabb.it
52
+ email: jchris@apache.org
44
53
  executables:
45
- - couchview
46
54
  - couchdir
47
- - couchapp
48
55
  extensions: []
49
56
 
50
57
  extra_rdoc_files:
51
- - README.rdoc
58
+ - README.md
52
59
  - LICENSE
53
- - THANKS
60
+ - THANKS.md
54
61
  files:
55
62
  - LICENSE
56
- - README.rdoc
63
+ - README.md
57
64
  - Rakefile
58
- - THANKS
59
- - bin/couchapp
65
+ - THANKS.md
60
66
  - bin/couchdir
61
- - bin/couchview
62
67
  - examples/model
63
68
  - examples/model/example.rb
64
69
  - examples/word_count
@@ -81,45 +86,31 @@ files:
81
86
  - lib/couchrest/commands/push.rb
82
87
  - lib/couchrest/core
83
88
  - lib/couchrest/core/database.rb
89
+ - lib/couchrest/core/design.rb
90
+ - lib/couchrest/core/document.rb
84
91
  - lib/couchrest/core/model.rb
85
92
  - lib/couchrest/core/server.rb
93
+ - lib/couchrest/core/view.rb
86
94
  - lib/couchrest/helper
87
- - lib/couchrest/helper/file_manager.rb
88
95
  - lib/couchrest/helper/pager.rb
89
96
  - lib/couchrest/helper/streamer.rb
90
- - lib/couchrest/helper/templates
91
- - lib/couchrest/helper/templates/example-map.js
92
- - lib/couchrest/helper/templates/example-reduce.js
93
- - lib/couchrest/helper/templates/index.html
94
97
  - lib/couchrest/monkeypatches.rb
95
98
  - lib/couchrest.rb
96
- - spec/couchapp_spec.rb
97
99
  - spec/couchrest
98
100
  - spec/couchrest/core
99
101
  - spec/couchrest/core/couchrest_spec.rb
100
102
  - spec/couchrest/core/database_spec.rb
103
+ - spec/couchrest/core/design_spec.rb
104
+ - spec/couchrest/core/document_spec.rb
101
105
  - spec/couchrest/core/model_spec.rb
102
106
  - spec/couchrest/helpers
103
- - spec/couchrest/helpers/file_manager_spec.rb
104
107
  - spec/couchrest/helpers/pager_spec.rb
105
108
  - spec/couchrest/helpers/streamer_spec.rb
106
109
  - spec/fixtures
107
110
  - spec/fixtures/attachments
108
111
  - spec/fixtures/attachments/couchdb.png
112
+ - spec/fixtures/attachments/README
109
113
  - spec/fixtures/attachments/test.html
110
- - spec/fixtures/couchapp
111
- - spec/fixtures/couchapp/attachments
112
- - spec/fixtures/couchapp/attachments/index.html
113
- - spec/fixtures/couchapp/views
114
- - spec/fixtures/couchapp/views/example-map.js
115
- - spec/fixtures/couchapp/views/example-reduce.js
116
- - spec/fixtures/couchapp-test
117
- - spec/fixtures/couchapp-test/my-app
118
- - spec/fixtures/couchapp-test/my-app/attachments
119
- - spec/fixtures/couchapp-test/my-app/attachments/index.html
120
- - spec/fixtures/couchapp-test/my-app/views
121
- - spec/fixtures/couchapp-test/my-app/views/example-map.js
122
- - spec/fixtures/couchapp-test/my-app/views/example-reduce.js
123
114
  - spec/fixtures/views
124
115
  - spec/fixtures/views/lib.js
125
116
  - spec/fixtures/views/test_view
@@ -131,7 +122,7 @@ files:
131
122
  - spec/spec_helper.rb
132
123
  - utils/remap.rb
133
124
  - utils/subset.rb
134
- has_rdoc: "true"
125
+ has_rdoc: true
135
126
  homepage: http://github.com/jchris/couchrest
136
127
  post_install_message:
137
128
  rdoc_options: []
data/THANKS DELETED
@@ -1,15 +0,0 @@
1
- CouchRest THANKS
2
- =====================
3
-
4
- CouchRest was originally developed by J. Chris Anderson <jchris@grabb.it>
5
- and a number of other contributors. Many people further contributed to
6
- CouchRest by reporting problems, suggesting various improvements or submitting
7
- changes. A list of these people is included below.
8
-
9
- * Greg Borenstein <http://ideasfordozens.com>
10
- * Geoffrey Grosenbach <http://nubyonrails.com/>
11
- * Simon Rozet <simon /at/ rozet /dot/ name>
12
-
13
- Patches are welcome. The primary source for this software project is:
14
-
15
- http://github.com/jchris/couchrest/tree/master
data/bin/couchapp DELETED
@@ -1,55 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'optparse'
4
- require File.expand_path(File.dirname(__FILE__)) + '/../lib/couchrest'
5
-
6
- options = {
7
- :loud => true,
8
- }
9
-
10
- opts = OptionParser.new do |opts|
11
- opts.banner = "Usage: #$0 [options] (push|pull|generate)"
12
- opts.on('-q', '--quiet', "Omit extra debug info") do
13
- options[:loud] = false
14
- end
15
- opts.on_tail('-h', '--help', "Display detailed help and exit") do
16
- puts opts
17
- exit
18
- end
19
- end
20
-
21
- opts.parse!(ARGV)
22
-
23
- case ARGV.shift
24
- when /generate/
25
- appname = ARGV.shift
26
- current = Dir.getwd
27
- appdir = File.join(current, appname)
28
- puts "generating couchapp in #{appdir}"
29
- CouchRest::FileManager.generate_app(appdir)
30
-
31
- when /push/
32
- dirname = ARGV.shift
33
- current = Dir.getwd
34
- dir = File.expand_path(File.join(current, dirname))
35
- dirapp = File.split(dir).last
36
- if ARGV.length == 2
37
- appname = ARGV.shift
38
- dbstring = ARGV.shift
39
- elsif ARGV.length == 1
40
- appname = dirapp
41
- dbstring = ARGV.shift
42
- else
43
- puts opts
44
- puts "push dirname [appname] database"
45
- exit(0)
46
- end
47
- dbspec = CouchRest.parse(dbstring)
48
- fm = CouchRest::FileManager.new(dbspec[:database], dbspec[:host])
49
- fm.push_app(dir, appname)
50
- when /pull/
51
-
52
- else
53
- puts opts
54
- puts "please specify a command"
55
- end
data/bin/couchview DELETED
@@ -1,48 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'optparse'
4
- require 'couchrest'
5
-
6
- %w(generate push).each do |file|
7
- require File.dirname(__FILE__) + "/../lib/couchrest/commands/#{file}"
8
- end
9
-
10
- # Set defaults
11
- options = {
12
- :loud => true,
13
- }
14
-
15
- opts = OptionParser.new do |opts|
16
- opts.banner = "Usage: #$0 [options] (push|generate) directory database"
17
- opts.on('-q', '--quiet', "Omit extra debug info") do
18
- options[:loud] = false
19
- end
20
- opts.on_tail('-h', '--help [push|generate]', "Display detailed help and exit") do |help_command|
21
- puts opts
22
- case help_command
23
- when "push"
24
- puts CouchRest::Commands::Push.help
25
- when "generate"
26
- puts CouchRest::Commands::Generate.help
27
- end
28
- exit
29
- end
30
- end
31
- opts.parse!(ARGV)
32
-
33
- options[:command] = ARGV.shift
34
- options[:directory] = ARGV.shift
35
- options[:trailing_args] = ARGV
36
-
37
- # There must be a better way to check for extra required args
38
- unless (["push", "generate"].include?(options[:command]) && options[:directory] && options[:trailing_args])
39
- puts(opts)
40
- exit
41
- end
42
-
43
- case options[:command]
44
- when "push"
45
- CouchRest::Commands::Push.run(options)
46
- when "generate"
47
- CouchRest::Commands::Generate.run(options)
48
- end
@@ -1,285 +0,0 @@
1
- require 'digest/md5'
2
-
3
- module CouchRest
4
- class FileManager
5
- attr_reader :db
6
- attr_accessor :loud
7
-
8
- LANGS = {"rb" => "ruby", "js" => "javascript"}
9
- MIMES = {
10
- "html" => "text/html",
11
- "htm" => "text/html",
12
- "png" => "image/png",
13
- "css" => "text/css",
14
- "js" => "test/javascript"
15
- }
16
- def initialize(dbname, host="http://localhost:5984")
17
- @db = CouchRest.new(host).database(dbname)
18
- end
19
-
20
- def push_directory(push_dir, docid=nil)
21
- docid ||= push_dir.split('/').reverse.find{|part|!part.empty?}
22
-
23
- pushfiles = Dir["#{push_dir}/**/*.*"].collect do |f|
24
- {f.split("#{push_dir}/").last => open(f).read}
25
- end
26
-
27
- return if pushfiles.empty?
28
-
29
- @attachments = {}
30
- @signatures = {}
31
- pushfiles.each do |file|
32
- name = file.keys.first
33
- value = file.values.first
34
- @signatures[name] = md5(value)
35
-
36
- @attachments[name] = {
37
- "data" => value,
38
- "content_type" => MIMES[name.split('.').last]
39
- }
40
- end
41
-
42
- doc = @db.get(docid) rescue nil
43
-
44
- unless doc
45
- say "creating #{docid}"
46
- @db.save({"_id" => docid, "_attachments" => @attachments, "signatures" => @signatures})
47
- return
48
- end
49
-
50
- doc["signatures"] ||= {}
51
- doc["_attachments"] ||= {}
52
- # remove deleted docs
53
- to_be_removed = doc["signatures"].keys.select do |d|
54
- !pushfiles.collect{|p| p.keys.first}.include?(d)
55
- end
56
-
57
- to_be_removed.each do |p|
58
- say "deleting #{p}"
59
- doc["signatures"].delete(p)
60
- doc["_attachments"].delete(p)
61
- end
62
-
63
- # update existing docs:
64
- doc["signatures"].each do |path, sig|
65
- if (@signatures[path] == sig)
66
- say "no change to #{path}. skipping..."
67
- else
68
- say "replacing #{path}"
69
- doc["signatures"][path] = md5(@attachments[path]["data"])
70
- doc["_attachments"][path].delete("stub")
71
- doc["_attachments"][path].delete("length")
72
- doc["_attachments"][path]["data"] = @attachments[path]["data"]
73
- doc["_attachments"][path].merge!({"data" => @attachments[path]["data"]} )
74
- end
75
- end
76
-
77
- # add in new files
78
- new_files = pushfiles.select{|d| !doc["signatures"].keys.include?( d.keys.first) }
79
-
80
- new_files.each do |f|
81
- say "creating #{f}"
82
- path = f.keys.first
83
- content = f.values.first
84
- doc["signatures"][path] = md5(content)
85
-
86
- doc["_attachments"][path] = {
87
- "data" => content,
88
- "content_type" => MIMES[path.split('.').last]
89
- }
90
- end
91
-
92
- begin
93
- @db.save(doc)
94
- rescue Exception => e
95
- say e.message
96
- end
97
- end
98
-
99
- def push_views(view_dir)
100
- designs = {}
101
-
102
- Dir["#{view_dir}/**/*.*"].each do |design_doc|
103
- design_doc_parts = design_doc.split('/')
104
- next if /^lib\..*$/.match design_doc_parts.last
105
- pre_normalized_view_name = design_doc_parts.last.split("-")
106
- view_name = pre_normalized_view_name[0..pre_normalized_view_name.length-2].join("-")
107
-
108
- folder = design_doc_parts[-2]
109
-
110
- designs[folder] ||= {}
111
- designs[folder]["views"] ||= {}
112
- design_lang = design_doc_parts.last.split(".").last
113
- designs[folder]["language"] ||= LANGS[design_lang]
114
-
115
- libs = ""
116
- Dir["#{view_dir}/lib.#{design_lang}"].collect do |global_lib|
117
- libs << open(global_lib).read
118
- libs << "\n"
119
- end
120
- Dir["#{view_dir}/#{folder}/lib.#{design_lang}"].collect do |global_lib|
121
- libs << open(global_lib).read
122
- libs << "\n"
123
- end
124
- if design_doc_parts.last =~ /-map/
125
- designs[folder]["views"]["#{view_name}-map"] ||= {}
126
-
127
- designs[folder]["views"]["#{view_name}-map"]["map"] = read(design_doc, libs)
128
-
129
- designs[folder]["views"]["#{view_name}-reduce"] ||= {}
130
- designs[folder]["views"]["#{view_name}-reduce"]["map"] = read(design_doc, libs)
131
- end
132
-
133
- if design_doc_parts.last =~ /-reduce/
134
- designs[folder]["views"]["#{view_name}-reduce"] ||= {}
135
-
136
- designs[folder]["views"]["#{view_name}-reduce"]["reduce"] = read(design_doc, libs)
137
- end
138
- end
139
-
140
- # cleanup empty maps and reduces
141
- designs.each do |name, props|
142
- props["views"].each do |view, funcs|
143
- next unless view.include?("reduce")
144
- props["views"].delete(view) unless funcs.keys.include?("reduce")
145
- end
146
- end
147
-
148
- designs.each do |k,v|
149
- create_or_update("_design/#{k}", v)
150
- end
151
-
152
- designs
153
- end
154
-
155
- def pull_views(view_dir)
156
- prefix = "_design"
157
- ds = db.documents(:startkey => '#{prefix}/', :endkey => '#{prefix}/ZZZZZZZZZ')
158
- ds['rows'].collect{|r|r['id']}.each do |id|
159
- puts directory = id.split('/').last
160
- FileUtils.mkdir_p(File.join(view_dir,directory))
161
- views = db.get(id)['views']
162
-
163
- vgroups = views.keys.group_by{|k|k.sub(/\-(map|reduce)$/,'')}
164
- vgroups.each do|g,vs|
165
- mapname = vs.find {|v|views[v]["map"]}
166
- if mapname
167
- # save map
168
- mapfunc = views[mapname]["map"]
169
- mapfile = File.join(view_dir, directory, "#{g}-map.js") # todo support non-js views
170
- File.open(mapfile,'w') do |f|
171
- f.write mapfunc
172
- end
173
- end
174
-
175
- reducename = vs.find {|v|views[v]["reduce"]}
176
- if reducename
177
- # save reduce
178
- reducefunc = views[reducename]["reduce"]
179
- reducefile = File.join(view_dir, directory, "#{g}-reduce.js") # todo support non-js views
180
- File.open(reducefile,'w') do |f|
181
- f.write reducefunc
182
- end
183
- end
184
- end
185
- end
186
-
187
- end
188
-
189
- def push_app(appdir, appname)
190
- libs = []
191
- viewdir = File.join(appdir,"views")
192
- attachdir = File.join(appdir,"attachments")
193
- views, lang = read_design_views(viewdir)
194
- # attachments = read_attachments(attachdir)
195
- docid = "_design/#{appname}"
196
- design = @db.get(docid) rescue {}
197
- design['_id'] = docid
198
- design['views'] = views
199
- design['language'] = lang
200
- @db.save(design)
201
- push_directory(attachdir, docid)
202
- # puts views.inspect
203
- end
204
-
205
- # Generate an application in the given directory.
206
- # This is a class method because it doesn't depend on
207
- # specifying a database.
208
- def self.generate_app(app_dir)
209
- FileUtils.mkdir_p(app_dir)
210
- FileUtils.mkdir_p(File.join(app_dir,"attachments"))
211
- FileUtils.mkdir_p(File.join(app_dir,"views"))
212
-
213
- index_template = File.join(File.expand_path(File.dirname(__FILE__)), 'templates','index.html')
214
- index_dest = File.join(app_dir,"attachments","index.html")
215
- FileUtils.cp(index_template, index_dest)
216
-
217
- map_template = File.join(File.expand_path(File.dirname(__FILE__)), 'templates','example-map.js')
218
- map_dest = File.join(app_dir,"views","example-map.js")
219
- FileUtils.cp(map_template, map_dest)
220
-
221
- rereduce_template = File.join(File.expand_path(File.dirname(__FILE__)), 'templates','example-reduce.js')
222
- rereduce_dest = File.join(app_dir,"views","example-reduce.js")
223
- FileUtils.cp(rereduce_template, rereduce_dest)
224
- end
225
-
226
- private
227
-
228
- def read_design_views(viewdir)
229
- libs = []
230
- language = nil
231
- views = {}
232
- Dir["#{viewdir}/*.*"].each do |viewfile|
233
- view_parts = viewfile.split('/')
234
- viewfile_name = view_parts.last
235
- # example-map.js
236
- viewfile_name_parts = viewfile_name.split('.')
237
- viewfile_ext = viewfile_name_parts.last
238
- view_name_parts = viewfile_name_parts.first.split('-')
239
- func_type = view_name_parts.pop
240
- view_name = view_name_parts.join('-')
241
- contents = File.open(viewfile).read
242
- if /^lib\..*$/.match viewfile_name
243
- libs.push(contents)
244
- else
245
- views[view_name] ||= {}
246
- language = LANGS[viewfile_ext]
247
- views[view_name][func_type] = contents.sub(/(\/\/|#)include-lib/,libs.join("\n"))
248
- end
249
- end
250
- [views, language]
251
- end
252
-
253
- def say words
254
- puts words if @loud
255
- end
256
-
257
- def md5 string
258
- Digest::MD5.hexdigest(string)
259
- end
260
-
261
- def read(file, libs=nil)
262
- st = open(file).read
263
- st.sub!(/(\/\/|#)include-lib/,libs) if libs
264
- st
265
- end
266
-
267
- def create_or_update(id, fields)
268
- existing = @db.get(id) rescue nil
269
-
270
- if existing
271
- updated = existing.merge(fields)
272
- if existing != updated
273
- say "replacing #{id}"
274
- db.save(updated)
275
- else
276
- say "skipping #{id}"
277
- end
278
- else
279
- say "creating #{id}"
280
- db.save(fields.merge({"_id" => id}))
281
- end
282
-
283
- end
284
- end
285
- end
@@ -1,8 +0,0 @@
1
- // an example map function, emits the doc id
2
- // and the list of keys it contains
3
-
4
- function(doc) {
5
- var k, keys = []
6
- for (k in doc) keys.push(k);
7
- emit(doc._id, keys);
8
- };
@@ -1,10 +0,0 @@
1
- // example reduce function to count the
2
- // number of rows in a given key range.
3
-
4
- function(keys, values, rereduce) {
5
- if (rereduce) {
6
- return sum(values);
7
- } else {
8
- return values.length;
9
- }
10
- };
@@ -1,26 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>Generated CouchApp</title>
5
- <link rel="stylesheet" href="screen.css" type="text/css">
6
- </head>
7
- <body>
8
- <h1>Generated CouchApp</h1>
9
- <ul id="view"></ul>
10
- </body>
11
- <script src="/_utils/script/json2.js"></script>
12
- <script src="/_utils/script/jquery.js?1.2.6"></script>
13
- <script src="/_utils/script/jquery.couch.js?0.8.0"></script>
14
- <script type="text/javascript" charset="utf-8">
15
- $(function() {
16
- var dbname = document.location.href.split('/')[3];
17
- var design = unescape(document.location.href.split('/')[4]).split('/')[1];
18
- var DB = $.couch.db(dbname);
19
- DB.view(design+"/example",{success: function(json) {
20
- $("#view").html(json.rows.map(function(row) {
21
- return '<li>'+row.key+'</li>';
22
- }).join(''));
23
- }});
24
- });
25
- </script>
26
- </html>
@@ -1,82 +0,0 @@
1
- require File.dirname(__FILE__) + '/spec_helper'
2
-
3
- describe "couchapp" do
4
- before(:all) do
5
- @fixdir = FIXTURE_PATH + '/couchapp-test'
6
- @couchapp = File.expand_path(File.dirname(__FILE__)) + '/../bin/couchapp'
7
- `rm -rf #{@fixdir}`
8
- `mkdir -p #{@fixdir}`
9
- @run = "cd #{@fixdir} && #{@couchapp}"
10
-
11
- end
12
-
13
- describe "--help" do
14
- it "should output the opts" do
15
- `#{@run} --help`.should match(/Usage/)
16
- end
17
- end
18
-
19
- describe "generate my-app" do
20
- it "should create an app directory" do
21
- `#{@run} generate my-app`.should match(/generating/i)
22
- Dir["#{@fixdir}/*"].select{|x|x =~ /my-app/}.length.should == 1
23
- end
24
- it "should create a views directory" do
25
- `#{@run} generate my-app`.should match(/generating/i)
26
- Dir["#{@fixdir}/my-app/*"].select{|x|x =~ /views/}.length.should == 1
27
- end
28
- end
29
-
30
- describe "push my-app #{TESTDB}" do
31
- before(:all) do
32
- @cr = CouchRest.new(COUCHHOST)
33
- @db = @cr.database(TESTDB)
34
- @db.delete! rescue nil
35
- @db = @cr.create_db(TESTDB) rescue nil
36
- `#{@run} generate my-app`
37
- end
38
- it "should create the design document with the app name" do
39
- `#{@run} push my-app #{TESTDB}`
40
- lambda{@db.get("_design/my-app")}.should_not raise_error
41
- end
42
- it "should create the views" do
43
- `#{@run} push my-app #{TESTDB}`
44
- doc = @db.get("_design/my-app")
45
- doc['views']['example']['map'].should match(/function/)
46
- end
47
- it "should create the index" do
48
- `#{@run} push my-app #{TESTDB}`
49
- doc = @db.get("_design/my-app")
50
- doc['_attachments']['index.html']["content_type"].should == 'text/html'
51
- end
52
- end
53
-
54
- describe "push . #{TESTDB}" do
55
- before(:all) do
56
- @cr = CouchRest.new(COUCHHOST)
57
- @db = @cr.database(TESTDB)
58
- @db.delete! rescue nil
59
- @db = @cr.create_db(TESTDB) rescue nil
60
- `#{@run} generate my-app`
61
- end
62
- it "should create the design document" do
63
- `cd #{@fixdir}/my-app && #{@couchapp} push . #{TESTDB}`
64
- lambda{@db.get("_design/my-app")}.should_not raise_error
65
- end
66
- end
67
-
68
- describe "push my-app my-design #{TESTDB}" do
69
- before(:all) do
70
- @cr = CouchRest.new(COUCHHOST)
71
- @db = @cr.database(TESTDB)
72
- @db.delete! rescue nil
73
- @db = @cr.create_db(TESTDB) rescue nil
74
- `#{@run} generate my-app`
75
- end
76
- it "should create the design document" do
77
- `#{@run} push my-app my-design #{TESTDB}`
78
- lambda{@db.get("_design/my-design")}.should_not raise_error
79
- end
80
- end
81
- end
82
-