rid 0.5.2 → 1.0.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.
- data/LICENSE +1 -1
- data/README +14 -0
- data/Rakefile +18 -33
- data/VERSION +1 -0
- data/bin/rid +3 -6
- data/lib/rid/app.rb +49 -0
- data/lib/rid/attachments.rb +6 -2
- data/lib/rid/commands.rb +61 -39
- data/lib/rid/core_ext/hash.rb +1 -1
- data/lib/rid/database.rb +69 -0
- data/lib/rid/document.rb +99 -0
- data/lib/rid.rb +14 -41
- data/rid.gemspec +49 -78
- data/spec/mock_app/_database +1 -0
- data/spec/rid/app_spec.rb +59 -0
- data/spec/rid/attachments_spec.rb +2 -2
- data/spec/rid/commands_spec.rb +14 -0
- data/spec/rid/database_spec.rb +25 -0
- data/spec/rid/document_spec.rb +36 -0
- data/spec/spec_helper.rb +6 -0
- metadata +127 -86
- data/.gitmodules +0 -3
- data/README.rdoc +0 -92
- data/lib/rid/actions/base.rb +0 -15
- data/lib/rid/actions/pull.rb +0 -28
- data/lib/rid/actions/push.rb +0 -53
- data/lib/rid/actions/routes.rb +0 -44
- data/lib/rid/commands/destroy.rb +0 -9
- data/lib/rid/commands/generate.rb +0 -9
- data/lib/rid/commands/pull.rb +0 -4
- data/lib/rid/commands/push.rb +0 -4
- data/lib/rid/commands/routes.rb +0 -4
- data/lib/rid/design_document.rb +0 -149
- data/lib/rid/generators/application/USAGE +0 -10
- data/lib/rid/generators/application/application_generator.rb +0 -56
- data/lib/rid/generators/application/templates/README +0 -1
- data/lib/rid/generators/application/templates/_attachments/index.html +0 -11
- data/lib/rid/generators/application/templates/_attachments/stylesheets/application.css +0 -25
- data/lib/rid/generators/application/templates/_id +0 -1
- data/lib/rid/generators/application/templates/gitignore +0 -0
- data/lib/rid/generators/application/templates/lib/mustache.js +0 -305
- data/lib/rid/generators/application/templates/lib/path.js +0 -5
- data/lib/rid/generators/application/templates/lib/templates/layout.mustache +0 -14
- data/lib/rid/generators/application/templates/ridrc +0 -1
- data/lib/rid/generators/application/templates/validate_doc_update.js +0 -3
- data/lib/rid/generators/base.rb +0 -66
- data/lib/rid/generators/list/USAGE +0 -8
- data/lib/rid/generators/list/list_generator.rb +0 -10
- data/lib/rid/generators/list/templates/index.mustache +0 -23
- data/lib/rid/generators/list/templates/list.js +0 -34
- data/lib/rid/generators/named_base.rb +0 -22
- data/lib/rid/generators/scaffold/USAGE +0 -10
- data/lib/rid/generators/scaffold/scaffold_generator.rb +0 -32
- data/lib/rid/generators/show/USAGE +0 -8
- data/lib/rid/generators/show/show_generator.rb +0 -13
- data/lib/rid/generators/show/templates/delete.mustache +0 -20
- data/lib/rid/generators/show/templates/deleted.mustache +0 -3
- data/lib/rid/generators/show/templates/form.mustache +0 -22
- data/lib/rid/generators/show/templates/show.js +0 -48
- data/lib/rid/generators/show/templates/show.mustache +0 -13
- data/lib/rid/generators/update/USAGE +0 -8
- data/lib/rid/generators/update/templates/update.js +0 -48
- data/lib/rid/generators/update/update_generator.rb +0 -9
- data/lib/rid/generators/validation/USAGE +0 -9
- data/lib/rid/generators/validation/templates/validate_doc_update.js +0 -3
- data/lib/rid/generators/validation/validation_generator.rb +0 -34
- data/lib/rid/generators/view/USAGE +0 -8
- data/lib/rid/generators/view/templates/map.js +0 -5
- data/lib/rid/generators/view/view_generator.rb +0 -17
- data/lib/rid/generators.rb +0 -63
- data/lib/rid/makros.rb +0 -114
- data/lib/rid/version.rb +0 -3
- data/spec/rid/design_document_spec.rb +0 -220
- data/spec/rid/makros_spec.rb +0 -94
- data/spec/rid_spec.rb +0 -7
@@ -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 "&";
|
215
|
-
case "\\": return "\\\\";;
|
216
|
-
case '"': return '\"';;
|
217
|
-
case "<": return "<";
|
218
|
-
case ">": return ">";
|
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
|
-
}();
|
@@ -1,14 +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}}</title>
|
6
|
-
<link rel="stylesheet" href="{{path}}/stylesheets/application.css" type="text/css" media="screen" charset="utf-8">
|
7
|
-
</head>
|
8
|
-
<body>
|
9
|
-
<h1><%= app_title %></h1>
|
10
|
-
<h2>{{title}}</h2>
|
11
|
-
<p class="notice">{{notice}}</p>
|
12
|
-
{{>body}}
|
13
|
-
</body>
|
14
|
-
</html>
|
@@ -1 +0,0 @@
|
|
1
|
-
database: "http://127.0.0.1:5984/<%= app_name %>"
|
data/lib/rid/generators/base.rb
DELETED
@@ -1,66 +0,0 @@
|
|
1
|
-
require 'thor/group'
|
2
|
-
require 'active_support/inflector'
|
3
|
-
|
4
|
-
module Rid
|
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
|
-
@_rid_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 Rid default banner.
|
48
|
-
#
|
49
|
-
def self.banner
|
50
|
-
"rid 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
|
-
# Rid::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,10 +0,0 @@
|
|
1
|
-
require 'rid/generators/named_base'
|
2
|
-
|
3
|
-
module Rid::Generators
|
4
|
-
class ListGenerator < NamedBase
|
5
|
-
def create_templates
|
6
|
-
template "list.js", "lists/#{pluralized_model_name}.js"
|
7
|
-
template "index.mustache", "lib/templates/#{pluralized_model_name}/index.mustache"
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
<p><a href="{{path}}/_show/<%= model_name %>/">New <%= model_name.humanize %></a></p>
|
2
|
-
<table>
|
3
|
-
<tr>
|
4
|
-
<th>ID</th>
|
5
|
-
<% attributes.each do |attribute| -%>
|
6
|
-
<th><%= attribute.humanize %></th>
|
7
|
-
<% end -%>
|
8
|
-
<th></th>
|
9
|
-
<th></th>
|
10
|
-
<th></th>
|
11
|
-
</tr>
|
12
|
-
{{#rows}}
|
13
|
-
<tr>
|
14
|
-
<td>{{id}}</td>
|
15
|
-
<% attributes.each do |attribute| -%>
|
16
|
-
<td>{{<%= attribute %>}}</td>
|
17
|
-
<% end -%>
|
18
|
-
<td><a href="{{path}}/_show/<%= model_name %>/{{id}}">Show</a></td>
|
19
|
-
<td><a href="{{path}}/_show/<%= model_name %>/{{id}}?edit">Edit</a></td>
|
20
|
-
<td><a href="{{path}}/_show/<%= model_name %>/{{id}}?delete">Delete</a></td>
|
21
|
-
</tr>
|
22
|
-
{{/rows}}
|
23
|
-
</table>
|
@@ -1,34 +0,0 @@
|
|
1
|
-
function(head, req) {
|
2
|
-
// !code path.js
|
3
|
-
// !code mustache.js
|
4
|
-
// !json templates/layout.mustache
|
5
|
-
// !json templates/<%= pluralized_model_name %>/index.mustache
|
6
|
-
|
7
|
-
provides("html", function() {
|
8
|
-
var view = {
|
9
|
-
path: path(),
|
10
|
-
title: "Listing <%= pluralized_model_name.humanize %>",
|
11
|
-
body: {
|
12
|
-
path: path(),
|
13
|
-
rows: function() {
|
14
|
-
var rows = [];
|
15
|
-
var row;
|
16
|
-
while (row = getRow()) {
|
17
|
-
rows.push({
|
18
|
-
<% attributes.each do |attribute| -%>
|
19
|
-
<%= attribute %>: row.value['<%= attribute %>'],
|
20
|
-
<% end -%>
|
21
|
-
id: row.id
|
22
|
-
});
|
23
|
-
}
|
24
|
-
|
25
|
-
return rows;
|
26
|
-
}
|
27
|
-
}
|
28
|
-
};
|
29
|
-
|
30
|
-
Mustache.to_html(templates.layout, view, { body: templates.<%= pluralized_model_name %>.index }, function(line) {
|
31
|
-
send(line + "\n");
|
32
|
-
});
|
33
|
-
});
|
34
|
-
}
|
@@ -1,22 +0,0 @@
|
|
1
|
-
require 'thor/group'
|
2
|
-
require 'active_support/inflector'
|
3
|
-
|
4
|
-
module Rid
|
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
|
-
rid 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,32 +0,0 @@
|
|
1
|
-
require 'rid/generators/named_base'
|
2
|
-
|
3
|
-
module Rid::Generators
|
4
|
-
class ScaffoldGenerator < NamedBase
|
5
|
-
def create_view_function
|
6
|
-
Rid::Generators.invoke :view, *invokation_options
|
7
|
-
end
|
8
|
-
|
9
|
-
def inject_validations
|
10
|
-
Rid::Generators.invoke :validation, *invokation_options
|
11
|
-
end
|
12
|
-
|
13
|
-
def create_list_function
|
14
|
-
Rid::Generators.invoke :list, *invokation_options
|
15
|
-
end
|
16
|
-
|
17
|
-
def create_show_function
|
18
|
-
Rid::Generators.invoke :show, *invokation_options
|
19
|
-
end
|
20
|
-
|
21
|
-
def create_update_function
|
22
|
-
Rid::Generators.invoke :update, *invokation_options
|
23
|
-
end
|
24
|
-
|
25
|
-
protected
|
26
|
-
|
27
|
-
# TODO: add default options, like --help, --force etc
|
28
|
-
def invokation_options
|
29
|
-
[[name] + attributes, { :behavior => behavior }]
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require 'rid/generators/named_base'
|
2
|
-
|
3
|
-
module Rid::Generators
|
4
|
-
class ShowGenerator < NamedBase
|
5
|
-
def create_show_function
|
6
|
-
template "show.js", "shows/#{model_name}.js"
|
7
|
-
template "show.mustache", "lib/templates/#{pluralized_model_name}/show.mustache"
|
8
|
-
template "form.mustache", "lib/templates/#{pluralized_model_name}/form.mustache"
|
9
|
-
template "delete.mustache", "lib/templates/#{pluralized_model_name}/delete.mustache"
|
10
|
-
template "deleted.mustache", "lib/templates/#{pluralized_model_name}/deleted.mustache"
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
<p>
|
2
|
-
<a href="{{path}}/_list/<%= pluralized_model_name %>/<%= pluralized_model_name %>">List <%= pluralized_model_name.humanize %></a> |
|
3
|
-
<a href="{{path}}/_show/<%= model_name %>/{{id}}">Show <%= model_name.humanize %></a> |
|
4
|
-
<a href="{{path}}/_show/<%= model_name %>/{{id}}?edit">Edit <%= model_name.humanize %></a>
|
5
|
-
</p>
|
6
|
-
<h3>Are you sure you want to delete that <%= model_name.humanize %>?</h3>
|
7
|
-
<dl>
|
8
|
-
<dt>ID</dt>
|
9
|
-
<dd>{{id}}</dd>
|
10
|
-
<% attributes.each do |attribute| -%>
|
11
|
-
<dt><%= attribute.humanize %></dt>
|
12
|
-
<dd>{{<%= attribute %>}}</dd>
|
13
|
-
<% end -%>
|
14
|
-
</dl>
|
15
|
-
<form action="{{path}}/_update/<%= pluralized_model_name %>" method="post" accept-charset="utf-8">
|
16
|
-
<input type="hidden" name="rev" value="{{rev}}" id="rev" />
|
17
|
-
<input type="hidden" name="id" value="{{id}}" id="id" />
|
18
|
-
<input type="hidden" name="delete" value="true" id="delete" />
|
19
|
-
<p><input type="submit" value="Yes, delete <%= model_name.humanize %>"></p>
|
20
|
-
</form>
|
@@ -1,22 +0,0 @@
|
|
1
|
-
<p>
|
2
|
-
<a href="{{path}}/_list/<%= pluralized_model_name %>/<%= pluralized_model_name %>">List <%= pluralized_model_name.humanize %></a>
|
3
|
-
{{#rev}}
|
4
|
-
| <a href="{{path}}/_show/<%= model_name %>/{{id}}">Show <%= model_name.humanize %></a>
|
5
|
-
{{/rev}}
|
6
|
-
</p>
|
7
|
-
<form action="{{path}}/_update/<%= pluralized_model_name %>" method="post" accept-charset="utf-8">
|
8
|
-
{{#rev}}
|
9
|
-
<input type="hidden" name="rev" value="{{rev}}" id="rev" />
|
10
|
-
{{/rev}}
|
11
|
-
<p>
|
12
|
-
<label for="id">ID</label><br/>
|
13
|
-
<input type="text" name="id" value="{{id}}" id="id" />
|
14
|
-
</p>
|
15
|
-
<% attributes.each do |attribute| -%>
|
16
|
-
<p>
|
17
|
-
<label for="<%= attribute %>"><%= attribute.humanize %></label><br/>
|
18
|
-
<input type="text" name="<%= attribute %>" value="{{<%= attribute %>}}" id="<%= attribute %>" />
|
19
|
-
</p>
|
20
|
-
<% end -%>
|
21
|
-
<p><input type="submit" value="Save <%= model_name.humanize %>"></p>
|
22
|
-
</form>
|
@@ -1,48 +0,0 @@
|
|
1
|
-
function(doc, req) {
|
2
|
-
// !code path.js
|
3
|
-
// !code mustache.js
|
4
|
-
// !json templates/layout.mustache
|
5
|
-
// !json templates/<%= pluralized_model_name %>/show.mustache
|
6
|
-
// !json templates/<%= pluralized_model_name %>/form.mustache
|
7
|
-
// !json templates/<%= pluralized_model_name %>/delete.mustache
|
8
|
-
|
9
|
-
provides("html", function() {
|
10
|
-
var view = {
|
11
|
-
path: path(),
|
12
|
-
body: {
|
13
|
-
path: path()
|
14
|
-
}
|
15
|
-
};
|
16
|
-
var partial;
|
17
|
-
|
18
|
-
if(doc) {
|
19
|
-
<% attributes.each do |attribute| -%>
|
20
|
-
view.body['<%= attribute %>'] = doc['<%= attribute %>'];
|
21
|
-
<% end -%>
|
22
|
-
view.body.id = doc._id;
|
23
|
-
|
24
|
-
if (req.query.edit != undefined) {
|
25
|
-
// edit
|
26
|
-
view.title = "Editing <%= model_name.humanize %>";
|
27
|
-
partial = "form";
|
28
|
-
} else {
|
29
|
-
view.body.rev = doc._rev;
|
30
|
-
if (req.query['delete'] != undefined) {
|
31
|
-
// delete
|
32
|
-
view.title = "Deleting <%= model_name.humanize %>";
|
33
|
-
partial = "delete";
|
34
|
-
} else {
|
35
|
-
// show
|
36
|
-
view.title = "Showing <%= model_name.humanize %>";
|
37
|
-
partial = "show";
|
38
|
-
}
|
39
|
-
}
|
40
|
-
} else {
|
41
|
-
// new
|
42
|
-
view.title = "New <%= model_name.humanize %>";
|
43
|
-
partial = "form";
|
44
|
-
}
|
45
|
-
|
46
|
-
return Mustache.to_html(templates.layout, view, { body: templates.<%= pluralized_model_name %>[partial] });
|
47
|
-
});
|
48
|
-
}
|