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,63 +0,0 @@
1
- require 'couch'
2
- require 'couch/generators/base'
3
-
4
- module Couch
5
- module Generators
6
- # Receives a name, arguments and the behavior to invoke the generator.
7
- # It's used as the default entry point for generate and destroy commands.
8
- def self.invoke(name, args = ARGV, config = {})
9
- if klass = lookup(name.to_s)
10
- args << "--help" if args.empty? && klass.arguments.any? { |a| a.required? }
11
- klass.start(args, config)
12
- else
13
- puts "Could not find generator #{name}."
14
- end
15
- end
16
-
17
- # Show help message with available generators.
18
- def self.help(command = 'generate')
19
- path = File.expand_path("../generators/*/*_generator.rb", __FILE__)
20
- generators = Dir.glob(path)
21
- generators.sort!
22
- generators.map! { |f| File.basename(f) }
23
- generators.map! { |n| n.sub!(/_generator\.rb$/, '') }
24
- longest_name_size = generators.map { |g| g.size }.sort.last
25
- generators.map! { |g| "%s # %s" % [g.ljust(longest_name_size), lookup(g).info] }
26
-
27
- puts "Usage: couch #{command} GENERATOR [args] [options]"
28
- puts
29
- puts "General options:"
30
- puts " -h, [--help] # Print generators options and usage"
31
- puts " -p, [--pretend] # Run but do not make any changes"
32
- puts " -f, [--force] # Overwrite files that already exist"
33
- puts " -s, [--skip] # Skip files that already exist"
34
- puts " -q, [--quiet] # Supress status output"
35
- puts
36
- puts "Please choose a generator below:"
37
- puts
38
- puts generators
39
- end
40
-
41
- protected
42
-
43
- def self.lookup(name)
44
- # real path
45
- path = File.expand_path("../generators/#{name}/#{name}_generator.rb", __FILE__)
46
- # no matches?
47
- unless File.exists?(path)
48
- # try to find by prefix
49
- found = Dir.glob(File.expand_path("../generators/#{name}*/#{name}*_generator.rb", __FILE__))
50
- if found.size == 1
51
- path = found.first
52
- name = File.basename(path).sub(/_generator\.rb$/, '')
53
- end
54
- end
55
- require path
56
- const_get "#{name.classify}Generator"
57
- rescue LoadError => e
58
- raise unless e.message =~ /#{Regexp.escape(path)}$/
59
- rescue Exception => e
60
- warn "[WARNING] Could not load generator #{path.inspect}. Error: #{e.message}.\n#{e.backtrace.join("\n")}"
61
- end
62
- end
63
- end
@@ -1,10 +0,0 @@
1
- Description:
2
- The 'application' generator creates a new Couch application
3
- with a default directory structure and configuration
4
- at the path you specify.
5
-
6
- Example:
7
- couch generate application ~/couch/weblog
8
-
9
- This generates a skeletal Couch installation in ~/couch/weblog.
10
- See the README in the newly created application to get going.
@@ -1,51 +0,0 @@
1
- module Couch::Generators
2
- class ApplicationGenerator < Base
3
- argument :app_path, :type => :string
4
-
5
- def create_root
6
- self.destination_root = File.expand_path(app_path, destination_root)
7
-
8
- empty_directory '.'
9
- FileUtils.cd(destination_root) if File.directory?(destination_root)
10
- end
11
-
12
- def create_root_files
13
- template "couchrc", ".couchrc"
14
- copy_file "README"
15
- copy_file "gitignore", ".gitignore" unless options[:skip_git]
16
- template "_id"
17
- copy_file "validate_doc_update.js"
18
- empty_directory "lists"
19
- empty_directory "shows"
20
- empty_directory "updates"
21
- empty_directory "views"
22
- end
23
-
24
- def create_attachments_files
25
- empty_directory "_attachments"
26
- inside "_attachments" do
27
- empty_directory "images"
28
- empty_directory "javascripts"
29
- directory "stylesheets"
30
- template "index.html"
31
- end
32
- end
33
-
34
- def create_lib_files
35
- empty_directory "lib"
36
- inside "lib" do
37
- copy_file "mustache.js"
38
- end
39
- end
40
-
41
- protected
42
-
43
- def app_name
44
- @app_name ||= File.basename(destination_root)
45
- end
46
-
47
- def app_title
48
- @app_title ||= app_name.humanize
49
- end
50
- end
51
- end
@@ -1 +0,0 @@
1
- # Welcome to Couch!
@@ -1,11 +0,0 @@
1
- <!DOCTYPE HTML>
2
- <html>
3
- <head>
4
- <meta http-equiv="content-type" content="text/html; charset=utf-8">
5
- <title><%= app_title %></title>
6
- <link rel="stylesheet" href="stylesheets/application.css" type="text/css" media="screen" charset="utf-8">
7
- </head>
8
- <body>
9
- <h1>Welcome to <%= app_title %>!</h1>
10
- </body>
11
- </html>
@@ -1,25 +0,0 @@
1
- body {
2
- background-color: #fff;
3
- color: #333;
4
- margin: 1cm 1.618cm;
5
- }
6
-
7
- body, p, ol, ul, td {
8
- font-family: verdana, arial, helvetica, sans-serif;
9
- font-size: 13px;
10
- line-height: 18px;
11
- }
12
-
13
- pre {
14
- background-color: #eee;
15
- padding: 10px;
16
- font-size: 11px;
17
- }
18
-
19
- a { color: #000; }
20
- a:visited { color: #666; }
21
- a:hover { color: #fff; background-color:#000; }
22
-
23
- .notice {
24
- color: green;
25
- }
@@ -1 +0,0 @@
1
- _design/<%= app_name %>
@@ -1 +0,0 @@
1
- database: "http://127.0.0.1:5984/<%= app_name %>"
@@ -1,305 +0,0 @@
1
- /*
2
- Shameless port of http://github.com/defunkt/mustache
3
- by Jan Lehnardt <jan@apache.org>,
4
- Alexander Lang <alex@upstream-berlin.com>,
5
- Sebastian Cohnen <sebastian.cohnen@googlemail.com>
6
-
7
- Thanks @defunkt for the awesome code.
8
-
9
- See http://github.com/defunkt/mustache for more info.
10
- */
11
-
12
- var Mustache = function() {
13
- var Renderer = function() {};
14
-
15
- Renderer.prototype = {
16
- otag: "{{",
17
- ctag: "}}",
18
- pragmas: {},
19
- buffer: [],
20
- pragmas_parsed: false,
21
- pragmas_implemented: {
22
- "IMPLICIT-ITERATOR": true
23
- },
24
-
25
- render: function(template, context, partials, in_recursion) {
26
- // fail fast
27
- if(template.indexOf(this.otag) == -1) {
28
- if(in_recursion) {
29
- return template;
30
- } else {
31
- this.send(template);
32
- return;
33
- }
34
- }
35
-
36
- if(!in_recursion) {
37
- this.buffer = [];
38
- }
39
-
40
- if(!this.pragmas_parsed) {
41
- template = this.render_pragmas(template);
42
- }
43
- var html = this.render_section(template, context, partials);
44
- if(in_recursion) {
45
- return this.render_tags(html, context, partials, in_recursion);
46
- }
47
-
48
- this.render_tags(html, context, partials, in_recursion);
49
- },
50
-
51
- /*
52
- Sends parsed lines
53
- */
54
- send: function(line) {
55
- if(line != "") {
56
- this.buffer.push(line);
57
- }
58
- },
59
-
60
- /*
61
- Looks for %PRAGMAS
62
- */
63
- render_pragmas: function(template) {
64
- this.pragmas_parsed = true;
65
- // no pragmas
66
- if(template.indexOf(this.otag + "%") == -1) {
67
- return template;
68
- }
69
-
70
- var that = this;
71
- var regex = new RegExp(this.otag + "%([\\w_-]+) ?([\\w]+=[\\w]+)?"
72
- + this.ctag);
73
- return template.replace(regex, function(match, pragma, options) {
74
- if(!that.pragmas_implemented[pragma]) {
75
- throw({message: "This implementation of mustache doesn't understand the '"
76
- + pragma + "' pragma"});
77
- }
78
- that.pragmas[pragma] = {};
79
- if(options) {
80
- var opts = options.split("=");
81
- that.pragmas[pragma][opts[0]] = opts[1];
82
- }
83
- return "";
84
- // ignore unknown pragmas silently
85
- });
86
- },
87
-
88
- /*
89
- Tries to find a partial in the global scope and render it
90
- */
91
- render_partial: function(name, context, partials) {
92
- if(typeof(context[name]) != "object") {
93
- throw({message: "subcontext for '" + name + "' is not an object"});
94
- }
95
- if(!partials || !partials[name]) {
96
- throw({message: "unknown_partial '" + name + "'"});
97
- }
98
- return this.render(partials[name], context[name], partials, true);
99
- },
100
-
101
- /*
102
- Renders boolean and enumerable sections
103
- */
104
- render_section: function(template, context, partials) {
105
- if(template.indexOf(this.otag + "#") == -1) {
106
- return template;
107
- }
108
- var that = this;
109
- // CSW - Added "+?" so it finds the tighest bound, not the widest
110
- var regex = new RegExp(this.otag + "\\#(.+)" + this.ctag +
111
- "\\s*([\\s\\S]+?)" + this.otag + "\\/\\1" + this.ctag + "\\s*", "mg");
112
-
113
- // for each {{#foo}}{{/foo}} section do...
114
- return template.replace(regex, function(match, name, content) {
115
- var value = that.find(name, context);
116
- if(that.is_array(value)) { // Enumerable, Let's loop!
117
- return that.map(value, function(row) {
118
- return that.render(content, that.merge(context,
119
- that.create_context(row)), partials, true);
120
- }).join("");
121
- } else if(value) { // boolean section
122
- return that.render(content, context, partials, true);
123
- } else {
124
- return "";
125
- }
126
- });
127
- },
128
-
129
- /*
130
- Replace {{foo}} and friends with values from our view
131
- */
132
- render_tags: function(template, context, partials, in_recursion) {
133
- // tit for tat
134
- var that = this;
135
-
136
- var new_regex = function() {
137
- return new RegExp(that.otag + "(=|!|>|\\{|%)?([^\/#]+?)\\1?" +
138
- that.ctag + "+", "g");
139
- };
140
-
141
- var regex = new_regex();
142
- var lines = template.split("\n");
143
- for (var i=0; i < lines.length; i++) {
144
- lines[i] = lines[i].replace(regex, function(match, operator, name) {
145
- switch(operator) {
146
- case "!": // ignore comments
147
- return match;
148
- case "=": // set new delimiters, rebuild the replace regexp
149
- that.set_delimiters(name);
150
- regex = new_regex();
151
- return "";
152
- case ">": // render partial
153
- return that.render_partial(name, context, partials);
154
- case "{": // the triple mustache is unescaped
155
- return that.find(name, context);
156
- default: // escape the value
157
- return that.escape(that.find(name, context));
158
- }
159
- }, this);
160
- if(!in_recursion) {
161
- this.send(lines[i]);
162
- }
163
- }
164
-
165
- if(in_recursion) {
166
- return lines.join("\n");
167
- }
168
- },
169
-
170
- set_delimiters: function(delimiters) {
171
- var dels = delimiters.split(" ");
172
- this.otag = this.escape_regex(dels[0]);
173
- this.ctag = this.escape_regex(dels[1]);
174
- },
175
-
176
- escape_regex: function(text) {
177
- // thank you Simon Willison
178
- if(!arguments.callee.sRE) {
179
- var specials = [
180
- '/', '.', '*', '+', '?', '|',
181
- '(', ')', '[', ']', '{', '}', '\\'
182
- ];
183
- arguments.callee.sRE = new RegExp(
184
- '(\\' + specials.join('|\\') + ')', 'g'
185
- );
186
- }
187
- return text.replace(arguments.callee.sRE, '\\$1');
188
- },
189
-
190
- /*
191
- find `name` in current `context`. That is find me a value
192
- from the view object
193
- */
194
- find: function(name, context) {
195
- name = this.trim(name);
196
- if(typeof context[name] === "function") {
197
- return context[name].apply(context);
198
- }
199
- if(context[name] !== undefined) {
200
- return context[name];
201
- }
202
- // silently ignore unkown variables
203
- return "";
204
- },
205
-
206
- // Utility methods
207
-
208
- /*
209
- Does away with nasty characters
210
- */
211
- escape: function(s) {
212
- return ((s == null) ? "" : s).toString().replace(/[&"<>\\]/g, function(s) {
213
- switch(s) {
214
- case "&": return "&amp;";
215
- case "\\": return "\\\\";;
216
- case '"': return '\"';;
217
- case "<": return "&lt;";
218
- case ">": return "&gt;";
219
- default: return s;
220
- }
221
- });
222
- },
223
-
224
- /*
225
- Merges all properties of object `b` into object `a`.
226
- `b.property` overwrites a.property`
227
- */
228
- merge: function(a, b) {
229
- var _new = {};
230
- for(var name in a) {
231
- if(a.hasOwnProperty(name)) {
232
- _new[name] = a[name];
233
- }
234
- };
235
- for(var name in b) {
236
- if(b.hasOwnProperty(name)) {
237
- _new[name] = b[name];
238
- }
239
- };
240
- return _new;
241
- },
242
-
243
- // by @langalex, support for arrays of strings
244
- create_context: function(_context) {
245
- if(this.is_object(_context)) {
246
- return _context;
247
- } else if(this.pragmas["IMPLICIT-ITERATOR"]) {
248
- var iterator = this.pragmas["IMPLICIT-ITERATOR"].iterator || ".";
249
- var ctx = {};
250
- ctx[iterator] = _context
251
- return ctx;
252
- }
253
- },
254
-
255
- is_object: function(a) {
256
- return a && typeof a == "object";
257
- },
258
-
259
- is_array: function(a) {
260
- return Object.prototype.toString.call(a) === '[object Array]';
261
- },
262
-
263
- /*
264
- Gets rid of leading and trailing whitespace
265
- */
266
- trim: function(s) {
267
- return s.replace(/^\s*|\s*$/g, "");
268
- },
269
-
270
- /*
271
- Why, why, why? Because IE. Cry, cry cry.
272
- */
273
- map: function(array, fn) {
274
- if (typeof array.map == "function") {
275
- return array.map(fn)
276
- } else {
277
- var r = [];
278
- var l = array.length;
279
- for(i=0;i<l;i++) {
280
- r.push(fn(array[i]));
281
- }
282
- return r;
283
- }
284
- }
285
- };
286
-
287
- return({
288
- name: "mustache.js",
289
- version: "0.2.3-dev",
290
-
291
- /*
292
- Turns a template and view into HTML
293
- */
294
- to_html: function(template, view, partials, send_fun) {
295
- var renderer = new Renderer();
296
- if(send_fun) {
297
- renderer.send = send_fun;
298
- }
299
- renderer.render(template, view, partials);
300
- if(!send_fun) {
301
- return renderer.buffer.join("\n");
302
- }
303
- }
304
- });
305
- }();