couch 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/README.rdoc +6 -88
  2. data/Rakefile +3 -54
  3. data/bin/couch +1 -7
  4. data/couch.gemspec +6 -72
  5. data/lib/couch.rb +0 -41
  6. metadata +9 -127
  7. data/.gitmodules +0 -3
  8. data/LICENSE +0 -20
  9. data/lib/couch/actions/base.rb +0 -15
  10. data/lib/couch/actions/pull.rb +0 -28
  11. data/lib/couch/actions/push.rb +0 -53
  12. data/lib/couch/actions/routes.rb +0 -41
  13. data/lib/couch/commands.rb +0 -41
  14. data/lib/couch/commands/destroy.rb +0 -9
  15. data/lib/couch/commands/generate.rb +0 -9
  16. data/lib/couch/commands/pull.rb +0 -4
  17. data/lib/couch/commands/push.rb +0 -4
  18. data/lib/couch/commands/routes.rb +0 -4
  19. data/lib/couch/design_document.rb +0 -314
  20. data/lib/couch/generators.rb +0 -63
  21. data/lib/couch/generators/application/USAGE +0 -10
  22. data/lib/couch/generators/application/application_generator.rb +0 -51
  23. data/lib/couch/generators/application/templates/README +0 -1
  24. data/lib/couch/generators/application/templates/_attachments/index.html +0 -11
  25. data/lib/couch/generators/application/templates/_attachments/stylesheets/application.css +0 -25
  26. data/lib/couch/generators/application/templates/_id +0 -1
  27. data/lib/couch/generators/application/templates/couchrc +0 -1
  28. data/lib/couch/generators/application/templates/gitignore +0 -0
  29. data/lib/couch/generators/application/templates/lib/mustache.js +0 -305
  30. data/lib/couch/generators/application/templates/validate_doc_update.js +0 -3
  31. data/lib/couch/generators/base.rb +0 -66
  32. data/lib/couch/generators/list/USAGE +0 -8
  33. data/lib/couch/generators/list/list_generator.rb +0 -9
  34. data/lib/couch/generators/list/templates/list.js +0 -29
  35. data/lib/couch/generators/named_base.rb +0 -22
  36. data/lib/couch/generators/scaffold/USAGE +0 -10
  37. data/lib/couch/generators/scaffold/scaffold_generator.rb +0 -28
  38. data/lib/couch/generators/show/USAGE +0 -8
  39. data/lib/couch/generators/show/show_generator.rb +0 -9
  40. data/lib/couch/generators/show/templates/show.js +0 -20
  41. data/lib/couch/generators/validation/USAGE +0 -9
  42. data/lib/couch/generators/validation/templates/validate_doc_update.js +0 -3
  43. data/lib/couch/generators/validation/validation_generator.rb +0 -34
  44. data/lib/couch/generators/view/USAGE +0 -8
  45. data/lib/couch/generators/view/templates/map.js +0 -5
  46. data/lib/couch/generators/view/view_generator.rb +0 -17
  47. data/lib/couch/version.rb +0 -3
  48. data/spec/couch/design_document_spec.rb +0 -313
  49. data/spec/couch_spec.rb +0 -7
  50. data/spec/spec.opts +0 -1
  51. data/spec/spec_helper.rb +0 -9
@@ -1,3 +0,0 @@
1
- function (newDoc, oldDoc, userCtx) {
2
- // validation code goes here
3
- }
@@ -1,66 +0,0 @@
1
- require 'thor/group'
2
- require 'active_support/inflector'
3
-
4
- module Couch
5
- module Generators
6
- class Error < Thor::Error
7
- end
8
-
9
- class Base < Thor::Group
10
- include Thor::Actions
11
-
12
- add_runtime_options!
13
-
14
- class_option :skip_git, :type => :boolean, :aliases => "-G", :default => false,
15
- :desc => "Skip Git ignores and keeps"
16
-
17
- # Automatically sets the source root based on the class name.
18
- #
19
- def self.source_root
20
- @_couch_source_root ||= begin
21
- if generator_name
22
- File.expand_path(File.join("../generators", generator_name, 'templates'), File.dirname(__FILE__))
23
- end
24
- end
25
- end
26
-
27
- # Tries to get the description from a USAGE file one folder above the source
28
- # root otherwise uses a default description.
29
- #
30
- def self.desc(description=nil)
31
- return super if description
32
- usage = File.expand_path(File.join(source_root, "..", "USAGE"))
33
-
34
- @desc ||= if File.exist?(usage)
35
- File.read(usage)
36
- else
37
- "Description:\n Create files for #{generator_name} generator."
38
- end
39
- end
40
-
41
- def self.info
42
- desc.split(/\n+/)[1].strip
43
- end
44
-
45
- protected
46
-
47
- # Use Couch default banner.
48
- #
49
- def self.banner
50
- "couch generate|destroy #{generator_name} #{self.arguments.map{ |a| a.usage }.join(' ')} [options]"
51
- end
52
-
53
- # Removes the namespaces and get the generator name. For example,
54
- # Couch::Generators::MetalGenerator will return "metal" as generator name.
55
- #
56
- def self.generator_name
57
- @generator_name ||= begin
58
- if generator = name.to_s.split('::').last
59
- generator.sub!(/Generator$/, '')
60
- generator.underscore
61
- end
62
- end
63
- end
64
- end
65
- end
66
- end
@@ -1,8 +0,0 @@
1
- Description:
2
- The 'show' generator creates a scaffold show function
3
- for the name you specify
4
-
5
- Example:
6
- couch generate show post
7
-
8
- This generates a skeletal post show function
@@ -1,9 +0,0 @@
1
- require 'couch/generators/named_base'
2
-
3
- module Couch::Generators
4
- class ListGenerator < NamedBase
5
- def create_list_function
6
- template "list.js", "lists/#{pluralized_model_name}.js"
7
- end
8
- end
9
- end
@@ -1,29 +0,0 @@
1
- function(head, req) {
2
- provides("html", function() {
3
- var header = '<html><head><link rel="stylesheet" href="../../stylesheets/application.css" type="text/css" media="screen" charset="utf-8"></head><body><h1>Listing <%= pluralized_model_name.humanize %></h1>';
4
-
5
- header += '<p><a href="../../_show/<%= model_name %>/">New <%= model_name.humanize %></a></p>';
6
-
7
- header += '<table><tr>';
8
- <% attributes.each do |attribute| -%>
9
- header += '<th><%= attribute.humanize %></th>';
10
- <% end -%>
11
- header += '<th></th>';
12
- header += '</tr>';
13
- send(header);
14
-
15
- var row;
16
- while (row = getRow()) {
17
- var body = '<tr>';
18
- <% attributes.each do |attribute| -%>
19
- body += '<td>' + row.value['<%= attribute %>'] + '</td>';
20
- <% end -%>
21
- body += '<td><a href="../../_show/<%= model_name %>/' + row.id + '" alt="Show <%= model_name.humanize %>">Show</a></td>';
22
- body += '</tr>';
23
- send(body);
24
- }
25
-
26
- var tail = '</table></body></html>';
27
- return tail;
28
- });
29
- }
@@ -1,22 +0,0 @@
1
- require 'thor/group'
2
- require 'active_support/inflector'
3
-
4
- module Couch
5
- module Generators
6
- class NamedBase < Base
7
- argument :name, :type => :string
8
- argument :attributes, :type => :array, :default => []
9
-
10
- protected
11
-
12
- # force underscored and singularized model name
13
- def model_name
14
- @model_name ||= name.underscore.singularize
15
- end
16
-
17
- def pluralized_model_name
18
- model_name.pluralize
19
- end
20
- end
21
- end
22
- end
@@ -1,10 +0,0 @@
1
- Description:
2
- The 'scaffold' generator creates a scaffold skelet
3
- with a default show function, list function
4
- of the name and attributes you specify
5
-
6
- Example:
7
- couch generate scaffold post title body
8
-
9
- This generates a skeletal model post with a posts list view,
10
- post show function and validation.
@@ -1,28 +0,0 @@
1
- require 'couch/generators/named_base'
2
-
3
- module Couch::Generators
4
- class ScaffoldGenerator < NamedBase
5
- def create_view_function
6
- Couch::Generators.invoke :view, *invokation_options
7
- end
8
-
9
- def inject_validations
10
- Couch::Generators.invoke :validation, *invokation_options
11
- end
12
-
13
- def create_list_function
14
- Couch::Generators.invoke :list, *invokation_options
15
- end
16
-
17
- def create_show_function
18
- Couch::Generators.invoke :show, *invokation_options
19
- end
20
-
21
- protected
22
-
23
- # TODO: add default options, like --help, --force etc
24
- def invokation_options
25
- [[name] + attributes, { :behavior => behavior }]
26
- end
27
- end
28
- end
@@ -1,8 +0,0 @@
1
- Description:
2
- The 'show' generator creates a scaffold show function
3
- for the name you specify
4
-
5
- Example:
6
- couch generate show post
7
-
8
- This generates a skeletal post show function
@@ -1,9 +0,0 @@
1
- require 'couch/generators/named_base'
2
-
3
- module Couch::Generators
4
- class ShowGenerator < NamedBase
5
- def create_show_function
6
- template "show.js", "shows/#{model_name}.js"
7
- end
8
- end
9
- end
@@ -1,20 +0,0 @@
1
- function(doc, req) {
2
- var head = '<html><head><link rel="stylesheet" href="../../stylesheets/application.css" type="text/css" media="screen" charset="utf-8"></head><body>';
3
- var body = '';
4
- var tail = '</body></html>';
5
- if(doc) {
6
- body += '<p><a href="../../_list/<%= pluralized_model_name %>/<%= pluralized_model_name %>">List <%= pluralized_model_name.humanize %></a></p>';
7
- <% attributes.each do |attribute| -%>
8
- if(doc['<%= attribute %>']) {
9
- body += '<p><strong><%= attribute.humanize %></strong>: ' + doc['<%= attribute %>'] + '</p>';
10
- }
11
- <% end -%>
12
- return head + '<h1>Showing <%= model_name.humanize %></h1>' + body + tail;
13
- } else {
14
- <% attributes.each do |attribute| -%>
15
- body += '<p><label><%= attribute.humanize %></label>: <input type="text" name="<%= model_name %>[<%= attribute %>]" id="<%= model_name %>_<%= attribute %>" /></p>';
16
- <% end -%>
17
- body += '<p><input type="submit" /> <a href="../../_list/<%= pluralized_model_name %>/<%= pluralized_model_name %>">Cancel</a></p>';
18
- return head + '<h1>New <%= model_name.humanize %></h1>' + body + tail;
19
- }
20
- }
@@ -1,9 +0,0 @@
1
- Description:
2
- The 'validation' generator creates a validation function
3
- for the model name and attributes you specify
4
-
5
- Example:
6
- couch generate validation post title body
7
-
8
- This generates a skeletal model validation for post
9
- with validations of presence for title and body
@@ -1,3 +0,0 @@
1
- function (newDoc, oldDoc, userCtx) {
2
- // your validation code goes here
3
- }
@@ -1,34 +0,0 @@
1
- require 'couch/generators/named_base'
2
-
3
- module Couch::Generators
4
- class ValidationGenerator < NamedBase
5
- def create_validate_doc_update
6
- return if File.exists?(File.join(destination_root, "validate_doc_update.js"))
7
- template "validate_doc_update.js"
8
- end
9
-
10
- def inject_validations
11
- inject_into_file "validate_doc_update.js", model_validations, :after => "function (newDoc, oldDoc, userCtx) {\n"
12
- end
13
-
14
- protected
15
-
16
- def model_validations
17
- str = <<-STR
18
- if(newDoc.type == '#{model_name}') {
19
- // validations for #{model_name}
20
- STR
21
-
22
- attributes.each do |attribute|
23
- str << <<-STR
24
- if (typeof(newDoc['#{attribute}']) === 'undefined') {
25
- throw({ forbidden: '#{attribute} is required' });
26
- }
27
- STR
28
- end
29
-
30
- str << " }\n"
31
- str
32
- end
33
- end
34
- end
@@ -1,8 +0,0 @@
1
- Description:
2
- The 'view' generator creates a scaffold view function
3
- for the name you specify
4
-
5
- Example:
6
- couch generate view post
7
-
8
- This generates a skeletal posts list function
@@ -1,5 +0,0 @@
1
- function(doc) {
2
- if(doc.type && doc.type == '<%= model_name %>') {
3
- emit(doc._id, <%= mydoc %>);
4
- }
5
- }
@@ -1,17 +0,0 @@
1
- require 'couch/generators/named_base'
2
-
3
- module Couch::Generators
4
- class ViewGenerator < NamedBase
5
- def create_view_function
6
- path = "views/#{pluralized_model_name}"
7
- empty_directory path
8
- template "map.js", "#{path}/map.js"
9
- end
10
-
11
- protected
12
-
13
- def mydoc
14
- "{ %s }" % attributes.map { |a| '"%s": doc["%s"]' % [a,a] }.join(", ")
15
- end
16
- end
17
- end
@@ -1,3 +0,0 @@
1
- module Couch
2
- VERSION = "0.2.0"
3
- end
@@ -1,313 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
- require 'couch/design_document'
3
-
4
- describe "DesignDocument" do
5
- before do
6
- @doc = Couch::DesignDocument.new
7
- end
8
-
9
- describe "read" do
10
- it "should assign key-value pair" do
11
- @doc.read("key") do |filename|
12
- "value"
13
- end
14
- @doc.hash.should == { "key" => "value" }
15
- end
16
-
17
- it "should assign two key-value pairs" do
18
- @doc.read("key1", "key2") do |filename|
19
- "value"
20
- end
21
- @doc.hash.should == { "key1" => "value", "key2" => "value" }
22
- end
23
-
24
- it "should assign an array of two key-value pairs" do
25
- @doc.read(["key1", "key2"]) do |filename|
26
- "value"
27
- end
28
- @doc.hash.should == { "key1" => "value", "key2" => "value" }
29
- end
30
-
31
- it "should assign nested hash" do
32
- @doc.read("hash/key") do |filename|
33
- "value"
34
- end
35
- @doc.hash.should == { "hash" => { "key" => "value" } }
36
- end
37
-
38
- it "should assign deep nested hash" do
39
- @doc.read("hash/hash/key") do |filename|
40
- "value"
41
- end
42
- @doc.hash.should == { "hash" => { "hash" => { "key" => "value" } } }
43
- end
44
-
45
- describe "_attachments encoding and content_type" do
46
- it "should proper encode and add plain text content type" do
47
- @doc.read("_attachments/key") do |filename|
48
- "value"
49
- end
50
- @doc.hash.should == { "_attachments" => { "key" => { "data" => "dmFsdWU=", "content_type" => "text/plain" } } }
51
- end
52
-
53
- it "should proper encode and add html content type" do
54
- @doc.read("_attachments/key.html") do |filename|
55
- "value"
56
- end
57
- @doc.hash.should == { "_attachments" => { "key.html" => { "data" => "dmFsdWU=", "content_type" => "text/html" } } }
58
- end
59
-
60
- it "should proper encode nested keys" do
61
- @doc.read("_attachments/hash/key") do |filename|
62
- "value"
63
- end
64
- @doc.hash.should == { "_attachments" => { "hash/key" => { "data" => "dmFsdWU=", "content_type" => "text/plain" } } }
65
- end
66
- end
67
-
68
- describe "exclude files should not be mapped" do
69
- it "should not map README" do
70
- @doc.read("README") do |filename|
71
- "value"
72
- end
73
- @doc.hash.should == {}
74
- end
75
- end
76
-
77
- describe "javascript files should be stripped off extension" do
78
- it "should strip validate_doc_update extension" do
79
- @doc.read("validate_doc_update.js") do |filename|
80
- "value"
81
- end
82
- @doc.hash.should == { "validate_doc_update" => "value" }
83
- end
84
-
85
- it "should strip lists/my_list.js" do
86
- @doc.read("lists/my_list.js") do |filename|
87
- "value"
88
- end
89
- @doc.hash.should == { "lists" => { "my_list" => "value" } }
90
- end
91
-
92
- it "should strip views/my_view/map.js" do
93
- @doc.read("views/my_view/map.js") do |filename|
94
- "value"
95
- end
96
- @doc.hash.should == { "views" => { "my_view" => { "map" => "value" } } }
97
- end
98
- end
99
-
100
- describe "code makro" do
101
- it "should expand code" do
102
- idx = 0
103
- @doc.read("key", "lib/code.js") do |filename|
104
- case idx += 1
105
- when 1
106
- "// !code code.js"
107
- when 2
108
- "value"
109
- end
110
- end
111
- @doc.hash.should == { "key" => "value", "lib" => { "code.js" => "value" } }
112
- end
113
- end
114
-
115
- describe "json makro" do
116
- it "should expand json" do
117
- idx = 0
118
- @doc.read("key", "lib/json.json") do |filename|
119
- case idx += 1
120
- when 1
121
- "// !json json.json"
122
- when 2
123
- "value"
124
- end
125
- end
126
- @doc.hash.should == { "key" => "var json = \"value\";", "lib" => { "json.json" => "value" } }
127
- end
128
- end
129
- end
130
-
131
- describe "write" do
132
- it "should return key-value pair" do
133
- @doc.hash = { "key" => "value" }
134
- filename, content = nil, nil
135
- @doc.write do |key, value|
136
- filename, content = key, value
137
- end
138
- filename.should == "key"
139
- content.should == "value"
140
- end
141
-
142
- it "should return subdirectory for nested hash" do
143
- @doc.hash = { "hash" => { "key" => "value" } }
144
- filename, content = nil, nil
145
- @doc.write do |key, value|
146
- filename, content = key, value
147
- end
148
- filename.should == "hash/key"
149
- content.should == "value"
150
- end
151
-
152
- it "should return subdirectory for nested hash" do
153
- @doc.hash = { "hash" => { "hash" => { "key" => "value" } } }
154
- filename, content = nil, nil
155
- @doc.write do |key, value|
156
- filename, content = key, value
157
- end
158
- filename.should == "hash/hash/key"
159
- content.should == "value"
160
- end
161
-
162
- it "should return decoded _attachments data" do
163
- @doc.hash = { "_attachments" => { "key" => { "data" => "dmFsdWU=" } } }
164
- filename, content = nil, nil
165
- @doc.write do |key, value|
166
- filename, content = key, value
167
- end
168
- filename.should == "_attachments/key"
169
- content.should == "value"
170
- end
171
-
172
- describe "javascript extensions" do
173
- it "should append validate_doc_update" do
174
- @doc.hash = { "validate_doc_update" => "value" }
175
- filename = nil
176
- @doc.write do |key, value|
177
- filename = key
178
- end
179
- filename.should == "validate_doc_update.js"
180
- end
181
-
182
- it "should append lists/my_list" do
183
- @doc.hash = { "lists" => { "my_list" => "value" } }
184
- filename = nil
185
- @doc.write do |key, value|
186
- filename = key
187
- end
188
- filename.should == "lists/my_list.js"
189
- end
190
-
191
- it "should append views/my_view/map" do
192
- @doc.hash = { "views" => { "my_view" => { "map" => "value" } } }
193
- filename = nil
194
- @doc.write do |key, value|
195
- filename = key
196
- end
197
- filename.should == "views/my_view/map.js"
198
- end
199
- end
200
-
201
- describe "code makro" do
202
- it "should reject code" do
203
- @doc.hash = { "key" => "value", "lib" => { "code.js" => "value" } }
204
- content = nil
205
- @doc.write do |key, value|
206
- content = value
207
- end
208
- @doc.hash.should == { "key" => "// !code code.js", "lib" => { "code.js" => "value" } }
209
- content.should == "// !code code.js"
210
- end
211
- end
212
-
213
- describe "json makro" do
214
- it "should reject json" do
215
- @doc.hash = { "key" => "var json = \"value\";", "lib" => { "json.json" => "value" } }
216
- content = nil
217
- @doc.write do |key, value|
218
- content = value
219
- end
220
- @doc.hash.should == { "key" => "// !json json.json", "lib" => { "json.json" => "value" } }
221
- content.should == "// !json json.json"
222
- end
223
- end
224
- end
225
-
226
- describe "json" do
227
- it "should convert key-value pair" do
228
- @doc.hash = { "key" => "value" }
229
- @doc.json.should == '{"key":"value"}'
230
- end
231
-
232
- it "should convert nested hash" do
233
- @doc.hash = { "hash" => { "key" => "value" } }
234
- @doc.json.should == '{"hash":{"key":"value"}}'
235
- end
236
- end
237
-
238
- describe "json=" do
239
- it "should read key-value pair" do
240
- @doc.json = '{"key":"value"}'
241
- @doc.hash.should == { "key" => "value" }
242
- end
243
-
244
- it "should read nested hash" do
245
- @doc.json = '{"hash":{"key":"value"}}'
246
- @doc.hash.should == { "hash" => { "key" => "value" } }
247
- end
248
- end
249
-
250
- describe "id accessor" do
251
- it "should return id from hash" do
252
- @doc.hash = { "_id" => "my_id" }
253
- @doc.id.should == "my_id"
254
- end
255
-
256
- it "should return id from couch" do
257
- Couch.stub!(:id).and_return("my_id")
258
- @doc.hash = {}
259
- @doc.id.should == "my_id"
260
- end
261
- end
262
-
263
- describe "rev accessor" do
264
- it "should return rev from hash" do
265
- @doc.hash = { "_rev" => "my_rev" }
266
- @doc.rev.should == "my_rev"
267
- end
268
-
269
- it "should return rev from couch" do
270
- Couch.stub!(:rev).and_return("my_rev")
271
- @doc.hash = {}
272
- @doc.rev.should == "my_rev"
273
- end
274
-
275
- it "should update rev in hash" do
276
- @doc.hash = {}
277
- @doc.rev = "my_rev"
278
- @doc.hash.should == { "_rev" => "my_rev" }
279
- end
280
- end
281
-
282
- describe "database accessor" do
283
- it "should return database couch" do
284
- Couch.stub!(:database).and_return("my_db")
285
- @doc.database.should == "my_db"
286
- end
287
- end
288
-
289
- describe "base url" do
290
- it "should combine database and id" do
291
- @doc.should_receive(:id).and_return("my_id")
292
- @doc.should_receive(:database).and_return("my_db")
293
- @doc.base_url.should == "my_db/my_id"
294
- end
295
- end
296
-
297
- describe "url" do
298
- it "should return base_url without options" do
299
- @doc.should_receive(:base_url).and_return("my_base_url")
300
- @doc.url.should == "my_base_url"
301
- end
302
-
303
- it "should return base_url with options string" do
304
- @doc.should_receive(:base_url).and_return("my_base_url")
305
- @doc.url(:key => :value).should == "my_base_url?key=value"
306
- end
307
-
308
- it "should return base_url with properly escaped options string" do
309
- @doc.should_receive(:base_url).and_return("my_base_url")
310
- @doc.url(:key => "value value").should == "my_base_url?key=value%20value"
311
- end
312
- end
313
- end