scaffy 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010 Alastair Brunton
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,46 @@
1
+ !http://scoop.simplyexcited.co.uk/wp-content/uploads/2009/01/scaffy.jpg!
2
+
3
+ h2. Scaffy Generator
4
+
5
+ An opinionated cut down scaffold generator. This uses haml for templates and includes tests in shoulda with factory_girl as the object factory. Nothing fancy, nothing special. Just a really fast way to use scaffolding in an extendable manner.
6
+
7
+ !http://scoop.simplyexcited.co.uk/wp-content/uploads/2009/01/scaff.jpg (scaff)!
8
+
9
+ h2. Install
10
+
11
+ <pre lang="bash">rails plugin install git://github.com/pyrat/scaffy.git</pre>
12
+
13
+ h3. Usage
14
+
15
+ Simple scaffold
16
+
17
+ <pre>
18
+ rails g scaffy post title:string content:text
19
+ </pre>
20
+
21
+ Scaffold with added layout and flash messages.
22
+
23
+ <pre>
24
+ rails g scaffy post title:string content:text --layout=true
25
+ </pre>
26
+
27
+ Scaffold with namespace
28
+
29
+ <pre>
30
+ rails g car make:string model:string year:integer --namespace=admin
31
+ </pre>
32
+
33
+ Then to install the dependent gems:
34
+
35
+ <pre>
36
+ bundle install
37
+ </pre>
38
+
39
+ h3. Dependencies
40
+
41
+ h3. Credits
42
+
43
+ flutie
44
+
45
+
46
+
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Explain the generator
3
+
4
+ Example:
5
+ rails generate scaffy Thing
6
+
7
+ This will create:
8
+ what/will/it/create
@@ -0,0 +1,190 @@
1
+ require 'rails/generators/active_record'
2
+
3
+ class ScaffyGenerator < Rails::Generators::NamedBase
4
+
5
+ include Rails::Generators::Migration
6
+
7
+
8
+ source_root File.expand_path('../templates', __FILE__)
9
+
10
+ # make it a class option
11
+ argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
12
+ class_option :namespace, :type => :string, :default => '', :desc => "Specify a namespace"
13
+ class_option :layout, :type => :string, :desc => "Generate a layout and styles"
14
+
15
+
16
+ def render_controller
17
+ template "controller.rb", "app/controllers" + namespace_directory + "/#{controller_filename}.rb"
18
+ end
19
+
20
+ def render_views
21
+ %w(_form index new show).each do |t|
22
+ template "views/haml/#{t}.html.haml", "app/views" + namespace_directory + "/#{object_plural}/#{t}.html.haml"
23
+ end
24
+ end
25
+
26
+ def render_helper
27
+ template "helper.rb", "app/helpers/#{object_plural}_helper.rb"
28
+ end
29
+
30
+ def add_routes
31
+ if namespace.present?
32
+ # add namespace route
33
+ route "namespace :#{namespace.downcase} do \n resources :#{object_plural} \nend"
34
+ else
35
+ # add standard route
36
+ route "resources :#{object_plural}"
37
+ end
38
+ end
39
+
40
+ def render_migration
41
+ migration_template "migration.rb", "db/migrate/create_#{object_plural}.rb"
42
+ end
43
+
44
+ def render_model
45
+ template "model.rb", "app/models/#{object_singular}.rb"
46
+ end
47
+
48
+ def render_tests
49
+ # need to create factories directory if it doesnt exist?
50
+ template "test/factory_girl/factory.rb", "test/factories/#{object_singular}.rb"
51
+ template "test/shoulda/model_test.rb", "test/unit/#{object_singular}_test.rb"
52
+ template "test/shoulda/controller_test.rb", "test/functional" + namespace_directory + "/#{object_plural}_controller_test.rb"
53
+ end
54
+
55
+ def render_layout
56
+ if options[:layout]
57
+ copy_file "views/haml/layout.html.haml", "app/views/layouts/application.html.haml"
58
+ copy_file "assets/stylesheets/scaffy.css", "public/stylesheets/scaffy.css"
59
+ copy_file "assets/images/alertbad_icon.gif", "public/images/scaffy/alertbad_icon.gif"
60
+ copy_file "assets/images/alertgood_icon.gif", "public/images/scaffy/alertgood_icon.gif"
61
+ copy_file "assets/images/glossy-error-icon.jpg", "public/images/scaffy/glossy-error-icon.gif"
62
+
63
+ inject_into_module "app/helpers/application_helper.rb", ApplicationHelper do
64
+ %(
65
+ # Returns a div for each key passed if there's a flash
66
+ # with that key
67
+ def flash_div *keys
68
+ divs = keys.select { |k| flash[k] }.collect do |k|
69
+ content_tag :div, flash[k], :class => "flash " + k.to_s
70
+ end
71
+ divs.join.html_safe
72
+ end
73
+ )
74
+ end
75
+
76
+ end
77
+ end
78
+
79
+ def remove_index
80
+ remove_file "public/index.html"
81
+ end
82
+
83
+ def add_gems
84
+ gem 'haml'
85
+ gem 'shoulda', :env => :test
86
+ gem 'factory_girl_rails', :env => :test
87
+ end
88
+
89
+ protected
90
+
91
+ class << self
92
+
93
+ def next_migration_number(dirname)
94
+ ActiveRecord::Generators::Base.next_migration_number(dirname)
95
+ end
96
+
97
+ end
98
+
99
+
100
+ def namespace
101
+ options[:namespace]
102
+ end
103
+
104
+ def controller_name
105
+ namespace_prefix + name.capitalize.pluralize
106
+ end
107
+
108
+ def namespace_prefix
109
+ unless options[:namespace].blank?
110
+ namespace.capitalize + "::"
111
+ else
112
+ ''
113
+ end
114
+ end
115
+
116
+ def namespace_directory
117
+ unless options[:namespace].blank?
118
+ "/" + namespace.downcase
119
+ else
120
+ ''
121
+ end
122
+ end
123
+
124
+ def object_singular
125
+ name.downcase
126
+ end
127
+
128
+ def object_plural
129
+ name.downcase.pluralize
130
+ end
131
+
132
+ def class_name
133
+ name.capitalize
134
+ end
135
+
136
+ def index_url
137
+ namespace_url_prefix + object_plural + "_url"
138
+ end
139
+
140
+ def namespace_url_prefix
141
+ if namespace.present?
142
+ namespace.downcase + "_"
143
+ else
144
+ ''
145
+ end
146
+ end
147
+
148
+ def controller_filename
149
+ object_plural + '_controller'
150
+ end
151
+
152
+ def show_url(options = {})
153
+ val = options[:instance] ? "@" : ''
154
+ if namespace.present?
155
+ "[:#{namespace.downcase}, #{val}#{object_singular}]"
156
+ else
157
+ val + object_singular
158
+ end
159
+ end
160
+
161
+
162
+ def new_url
163
+ if namespace.present?
164
+ "polymorphic_url([:#{namespace.downcase}, #{class_name}.new], :action => :new)"
165
+ else
166
+ "polymorphic_url(#{class_name}.new, :action => :new)"
167
+ end
168
+ end
169
+
170
+ def edit_url(options = {})
171
+ val = options[:instance] ? "@" : ''
172
+ if namespace.present?
173
+ "polymorphic_url([:#{namespace.downcase}, #{val}#{object_singular}], :action => :edit)"
174
+ else
175
+ "polymorphic_url(#{val}#{object_singular}, :action => :edit)"
176
+ end
177
+ end
178
+
179
+ def human_name
180
+ name.capitalize.pluralize
181
+ end
182
+
183
+ def inject_into_module(path, mod, *args, &block)
184
+ config = args.last.is_a?(Hash) ? args.pop : {}
185
+ config.merge!(:after => /module #{mod}\n|module #{mod} .*\n/)
186
+ inject_into_file(path, *(args << config), &block)
187
+ end
188
+
189
+
190
+ end
@@ -0,0 +1,427 @@
1
+ /* This is a default stylesheet provided for scaffy scaffolding. Aim is to make it look OK initially. */
2
+
3
+ /* http://meyerweb.com/eric/tools/css/reset/ */
4
+ /* v1.0 | 20080212 */
5
+
6
+ html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p,
7
+ blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em,
8
+ font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var,
9
+ b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table,
10
+ caption, tbody, tfoot, thead, tr, th, td {
11
+ margin: 0;
12
+ padding: 0;
13
+ border: 0;
14
+ outline: 0;
15
+ font-size: 100%;
16
+ vertical-align: baseline;
17
+ background: transparent;
18
+ }
19
+ body {
20
+ line-height: 1;
21
+ }
22
+ ol, ul {
23
+ list-style: none;
24
+ }
25
+ blockquote, q {
26
+ quotes: none;
27
+ }
28
+ blockquote:before, blockquote:after,
29
+ q:before, q:after {
30
+ content: '';
31
+ content: none;
32
+ }
33
+
34
+ /* remember to define focus styles! */
35
+ :focus {
36
+ outline: 0;
37
+ }
38
+
39
+ /* remember to highlight inserts somehow! */
40
+ ins {
41
+ text-decoration: none;
42
+ }
43
+ del {
44
+ text-decoration: line-through;
45
+ }
46
+
47
+ /* tables still need 'cellspacing="0"' in the markup */
48
+ table {
49
+ border-collapse: collapse;
50
+ border-spacing: 0;
51
+ }
52
+
53
+
54
+
55
+ /*-------------------------------------------------
56
+ FLASHES
57
+ -------------------------------------------------*/
58
+
59
+ .flash {
60
+ text-align: left;
61
+ border: 1px solid #ccc;
62
+ padding: 5px 5px 5px 30px;
63
+ font-size: 14px;
64
+ margin: 12px auto;
65
+ margin-right: 7px;
66
+ margin-left : 7px;
67
+ }
68
+
69
+
70
+ .flash.message, .flash.notice {
71
+ border-color: #9c9;
72
+ color: #060;
73
+ background: url(../images/scaffy/alertgood_icon.gif) #E2F9E3 left no-repeat;
74
+ }
75
+
76
+ .flash.warning {
77
+ border-color: #c99;
78
+ color: #fff;
79
+ background: url(../images/scaffy/alertbad_icon.gif) #c00 left no-repeat;
80
+ }
81
+
82
+ /* General styles */
83
+
84
+ body {
85
+ color: #222;
86
+ font-size: 13px;
87
+ font-family: arial, "Helvetica Neue", "Lucida Grande", Helvetica, Arial, Verdana, sans-serif;
88
+ }
89
+
90
+ h1, h2, h3, h4, h5, h6 {
91
+ color: #111;
92
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
93
+ }
94
+
95
+ /* Use a .box to create a padded box inside a column. */
96
+ .box {
97
+ padding: 1.5em;
98
+ margin-bottom: 1.5em;
99
+ background: #eee;
100
+ }
101
+
102
+ /* Use this to create a horizontal ruler across a column. */
103
+ hr {
104
+ background: #ddd;
105
+ color: #ddd;
106
+ clear: both;
107
+ float: none;
108
+ width: 100%;
109
+ height: 1px;
110
+ margin: 0 0 1.4em;
111
+ border: none;
112
+ }
113
+ hr.space {
114
+ background: #fff;
115
+ color: #fff;
116
+ }
117
+
118
+ /* Clearfix hack I love you */
119
+ .clearfix:after {
120
+ content:".";
121
+ display:block;
122
+ height:0;
123
+ clear:both;
124
+ visibility:hidden;
125
+ }
126
+
127
+ .clearfix {display:inline-block;}
128
+ /* Hide from IE Mac \*/
129
+ .clearfix {display:block;}
130
+ /* End hide from IE Mac */
131
+
132
+ /* Forms */
133
+
134
+ input[type="submit"]::-moz-focus-inner {
135
+ border: none;
136
+ } /*removes dotted outline on submit buttons when clicking in firefox */
137
+
138
+ form ol {
139
+ list-style: none;
140
+ margin: 0 0 1em 0;
141
+ }
142
+ form ol ol { margin-left: 0; }
143
+ form ol li { margin: 0 0 1em 0; list-style-position: outside; }
144
+ form ol ol li { margin: 0 0 .25em 0; list-style-position: outside; } /*list-style-position fixes IE label margin bug*/
145
+
146
+ form ol li.error input { background: #FBE3E4; }
147
+ p.inline-errors { color: #D12F19; }
148
+ form ol li.file {
149
+ background: #e1e1e1;
150
+ border: 1px solid #c8c8c8;
151
+ padding: 10px;
152
+ }
153
+
154
+ form abbr { border-bottom: 0; }
155
+
156
+ label { display: block; }
157
+ .required label { font-weight: bold; }
158
+ .checkbox_field label, .radio_field label { font-weight: normal; }
159
+
160
+ a.cancel { color: #7d0d0d; }
161
+ .inline-hints {
162
+ font-size: 0.8em;
163
+ color: #666;
164
+ margin-bottom: 0.25em;
165
+ }
166
+
167
+ /* Fieldsets */
168
+ fieldset {
169
+ margin: 0 0 1.5em 0;
170
+ background: #f1f1f1;
171
+ padding: 1.5em 1.5em 1em 1.5em;
172
+ border: 1px solid #e3e3e3;
173
+ }
174
+ fieldset fieldset, fieldset fieldset fieldset {
175
+ padding: 0;
176
+ border: 0;
177
+ }
178
+ legend { font-weight: bold; }
179
+ fieldset.buttons {
180
+ background: inherit;
181
+ border: 0;
182
+ padding: 0;
183
+ }
184
+ fieldset.buttons li { display: inline; }
185
+ .radio fieldset {
186
+ padding: 0;
187
+ margin: 0;
188
+ }
189
+
190
+ /* Text fields */
191
+ input[type="text"], input[type="password"] {
192
+ width: 300px;
193
+ padding: 3px 2px;
194
+ font-size: inherit;
195
+ }
196
+ input[disabled='disabled'] {
197
+ background-color: #fcfcfc;
198
+ cursor:default;
199
+ }
200
+ input[type="checkbox"] {
201
+ margin: 0 3px 0 0;
202
+ vertical-align: middle;
203
+ position: relative;
204
+ top: -2px;
205
+ }
206
+ input[type="radio"] {
207
+ margin: 0 3px 0 0;
208
+ vertical-align: middle;
209
+ position: relative;
210
+ top: -2px;
211
+ }
212
+ .check_boxes label {
213
+ vertical-align: middle;
214
+ padding: 0;
215
+ display: inline;
216
+ }
217
+ .radio label { padding: 0; }
218
+
219
+ /* Textareas */
220
+ textarea {
221
+ width: 440px;
222
+ height: 200px;
223
+ margin: 0 0.5em 0.5em 0;
224
+ padding: 5px;
225
+ font-size: inherit;
226
+ }
227
+
228
+ /* Select fields */
229
+ fieldset .select select {
230
+ width:200px;
231
+ font-size: 0.9em;
232
+ }
233
+ optgroup { margin: 0 0 .5em 0; }
234
+
235
+ /* Date & Time */
236
+ form ol li.date ol li, form ol li.time ol li {
237
+ display: inline;
238
+ }
239
+ form ol li.datetime ol li {
240
+ display: inline-block;
241
+ }
242
+ form ol li.datetime select, form ol li.date select, form ol li.time select {
243
+ display: inline;
244
+ width: auto;
245
+ }
246
+ form ol li.date label, form ol li.time label {
247
+ display: none;
248
+ }
249
+
250
+ /* Lists */
251
+
252
+ ul, ol {
253
+ margin-bottom: 1.5em;
254
+ list-style-position: inside;
255
+ }
256
+ ul { list-style-type: disc; }
257
+ ol { list-style-type: decimal; }
258
+
259
+ dl {
260
+ margin-bottom: 1.5em;
261
+ line-height: 1.4;
262
+ }
263
+ dl dt {
264
+ font-weight: bold;
265
+ margin-top: 0.5em;
266
+ }
267
+ dl dd { margin-bottom: 0em;}
268
+ dd { margin-left: 0.5em; }
269
+
270
+ li { line-height: 1.4; }
271
+
272
+ ol ol, ol ul, ul ul, ul ol {
273
+ margin-left: 1em;
274
+ }
275
+
276
+ /* Tables */
277
+
278
+ table {
279
+ margin-bottom: 2em;
280
+ width: 100%;
281
+ }
282
+ th {
283
+ border-bottom: 2px solid #ccc;
284
+ font-weight: bold;
285
+ text-align: left;
286
+ }
287
+ td { border-bottom: 1px solid #ddd; }
288
+ caption, th, td {
289
+ padding: 4px 10px 4px 0;
290
+ }
291
+ caption {
292
+ background: #f1f1f1;
293
+ padding: 10px 0;
294
+ margin-bottom: 1em;
295
+ }
296
+
297
+ tr,td,th {
298
+ vertical-align: middle;
299
+ }
300
+
301
+ /* Use this if you use span-x classes on th/td. */
302
+ table .last { padding-right: 0; }
303
+
304
+ /* Headings */
305
+
306
+ h1, h2, h3, h4, h5, h6 { font-weight: bold; }
307
+
308
+ h1 {
309
+ font-size: 2.2em;
310
+ line-height: 1;
311
+ margin-bottom: 0.25em;
312
+ }
313
+ h2 {
314
+ font-size: 1.6em;
315
+ margin-bottom: 0.25em;
316
+ line-height: 1.1;
317
+ }
318
+ h3 {
319
+ font-size: 1.3em;
320
+ line-height: 1;
321
+ margin-bottom: 0.25em;
322
+ }
323
+ h4 {
324
+ font-size: 1.1em;
325
+ line-height: 1.25;
326
+ margin-bottom: 0.25em;
327
+ }
328
+ h5 {
329
+ font-size: 1em;
330
+ margin-bottom: 0.25em;
331
+ }
332
+ h6 {
333
+ font-size: 1em;
334
+ margin-bottom: 0.25em;
335
+ }
336
+
337
+ /* Text elements */
338
+ p { margin-bottom: 0.5em; }
339
+ p.last { margin-bottom: 0; }
340
+ p img {
341
+ float: left;
342
+ margin: 1.5em 1.5em 1.5em 0;
343
+ padding: 0;
344
+ }
345
+ p img.top { margin-top: 0; } /* Use this if the image is at the top of the <p>. */
346
+ img { margin: 0 0 1.5em; }
347
+
348
+ abbr, acronym {
349
+ border-bottom: 1px dotted #666;
350
+ cursor: help;
351
+ }
352
+ address {
353
+ margin-top: 1.5em;
354
+ font-style: italic;
355
+ }
356
+ del { color:#666; }
357
+
358
+ a, a:link {
359
+ color: #1a4882;
360
+ text-decoration: underline;
361
+ }
362
+ a:visited { color: #1a4882; }
363
+ a:hover { color: #052246; }
364
+ a:active, a:focus { color: #1a4882; }
365
+
366
+ blockquote {
367
+ margin: 1.5em 0;
368
+ color: #666;
369
+ font-style: italic;
370
+ padding-left: 1em;
371
+ border-left: 4px solid #d1d1d1;
372
+ }
373
+ strong { font-weight: bold; }
374
+ em, dfn { font-style: italic; }
375
+ dfn { font-weight: bold; }
376
+ pre, code {
377
+ margin: 1.5em 0;
378
+ white-space: pre;
379
+ }
380
+ pre, code, tt {
381
+ font: 1em 'andale mono', 'monotype.com', 'lucida console', monospace;
382
+ line-height: 1.5;
383
+ }
384
+ pre.code {
385
+ background: #000;
386
+ color: #fff;
387
+ padding: 20px;
388
+ }
389
+ tt {
390
+ display: block;
391
+ margin: 1.5em 0;
392
+ line-height: 1.5;
393
+ }
394
+
395
+
396
+ /* App Styles */
397
+
398
+ body {
399
+ background-color:#dadada;
400
+ }
401
+
402
+ .content {
403
+ background:#fff;
404
+ width:880px;
405
+ -moz-border-radius:24px;
406
+ -webkit-border-radius:24px;
407
+ border-radius: 24px;
408
+ margin:40px auto;
409
+ padding:40px;
410
+ }
411
+
412
+
413
+ label.inline {
414
+ display: inline;
415
+ font-weight: bold;
416
+ }
417
+
418
+ .errorExplanation {
419
+ border: red 2px solid;
420
+ padding: 15px;
421
+ margin: 10px 0;
422
+ }
423
+
424
+ p {
425
+ line-height: 18px;
426
+ }
427
+
@@ -0,0 +1,52 @@
1
+ class <%= controller_name %>Controller < ApplicationController
2
+
3
+ def index
4
+ @<%= object_plural %> = <%= class_name %>.all
5
+ end
6
+
7
+ def new
8
+ @<%= object_singular %> = <%= class_name %>.new
9
+ end
10
+
11
+ def create
12
+ @<%= object_singular %> = <%= class_name %>.new(params[:<%= object_singular %>])
13
+ if @<%= object_singular %>.save
14
+ flash[:message] = "Successfully created <%= object_singular.humanize.downcase %>."
15
+ redirect_to <%= index_url %>
16
+ else
17
+ render :action => 'new'
18
+ end
19
+ end
20
+
21
+ def show
22
+ @<%= object_singular %> = <%= class_name %>.find(params[:id])
23
+ end
24
+
25
+
26
+ def edit
27
+ @<%= object_singular %> = <%= class_name %>.find(params[:id])
28
+ render :action => :new
29
+ end
30
+
31
+ def update
32
+ @<%= object_singular %> = <%= class_name %>.find(params[:id])
33
+ if @<%= object_singular %>.update_attributes(params[:<%= object_singular %>])
34
+ flash[:message] = "Successfully updated <%= object_singular.humanize.downcase %>."
35
+ redirect_to <%= index_url %>
36
+ else
37
+ render :action => :new
38
+ end
39
+ end
40
+
41
+ def destroy
42
+ @<%= object_singular %> = <%= class_name %>.find(params[:id])
43
+ begin
44
+ @<%= object_singular %>.destroy
45
+ flash[:message] = "Successfully destroyed <%= object_singular.humanize.downcase %>."
46
+ rescue StandardError => msg
47
+ flash[:warning] = msg.to_s
48
+ end
49
+ redirect_to <%= index_url %>
50
+ end
51
+
52
+ end
@@ -0,0 +1,2 @@
1
+ module <%= human_name %>Helper
2
+ end
@@ -0,0 +1,14 @@
1
+ class Create<%= human_name %> < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :<%= object_plural %> do |t|
4
+ <%- for attribute in attributes -%>
5
+ t.<%= attribute.type %> :<%= attribute.name %>
6
+ <%- end -%>
7
+ t.timestamps
8
+ end
9
+ end
10
+
11
+ def self.down
12
+ drop_table :<%= object_plural %>
13
+ end
14
+ end
@@ -0,0 +1,2 @@
1
+ class <%= class_name %> < ActiveRecord::Base
2
+ end
@@ -0,0 +1,5 @@
1
+ Factory.define :<%= object_singular %> do |o|
2
+ <% attributes.each do |attribute| %>
3
+ o.<%= attribute.name %> '<%= attribute.default %>'
4
+ <% end %>
5
+ end
@@ -0,0 +1,54 @@
1
+ require 'test_helper'
2
+
3
+ class <%= controller_name %>ControllerTest < ActionController::TestCase
4
+
5
+ context "testing controller" do
6
+
7
+ # May want to add some login info here.
8
+ setup do
9
+ @<%= object_singular %> = Factory(:<%= object_singular %>)
10
+ end
11
+
12
+
13
+ should "get index" do
14
+ get :index
15
+ assert_response :success, @response.body
16
+ end
17
+
18
+ should "get new" do
19
+ get :new
20
+ assert_response :success, @response.body
21
+ end
22
+
23
+ should "create successfully" do
24
+ post :create, Factory.attributes_for(:<%= object_singular %>)
25
+ assert_response :redirect, @response.body
26
+ assert_redirected_to <%= index_url %>
27
+ end
28
+
29
+ should "get edit" do
30
+ get :edit, :id => @<%= object_singular %>.id
31
+ assert_response :success, @response.body
32
+ end
33
+
34
+ should "show successfully" do
35
+ get :show, :id => @<%= object_singular %>.id
36
+ assert_response :success, @response.body
37
+ end
38
+
39
+ should "update successfully" do
40
+ put :update, :id => @<%= object_singular %>.id, :<%= object_singular %> => Factory.attributes_for(:<%= object_singular %>)
41
+ assert_response :redirect, @response.body
42
+ assert_redirected_to <%= index_url %>
43
+ end
44
+
45
+ should "destroy successfully" do
46
+ delete :destroy, :id => @<%= object_singular %>.id
47
+ assert_response :redirect, @response.body
48
+ assert_redirected_to <%= index_url %>
49
+ end
50
+
51
+ end
52
+
53
+
54
+ end
@@ -0,0 +1,9 @@
1
+ require 'test_helper'
2
+
3
+ class <%= class_name %>Test < ActiveSupport::TestCase
4
+
5
+ should "create successfully" do
6
+ <%= object_singular %> = Factory(:<%= object_singular %>)
7
+ end
8
+
9
+ end
@@ -0,0 +1,16 @@
1
+ <% unless namespace.blank? %>
2
+ = form_for [:<%= namespace.downcase %>, @<%= singular_name %>] do |f|
3
+ <% else %>
4
+ = form_for @<%= object_singular %> do |f|
5
+ <% end %>
6
+ %fieldset
7
+ = f.error_messages
8
+ <% attributes.each do |attribute| %>
9
+ %p
10
+ = f.label :<%= attribute.name %>
11
+ = f.<%= attribute.field_type %> :<%= attribute.name %>
12
+ <% end %>
13
+ %p
14
+ = f.submit "Save"
15
+ or
16
+ = link_to "Cancel", <%= index_url %>
@@ -0,0 +1,24 @@
1
+ %h1 <%= human_name %>
2
+
3
+ %table
4
+ %thead
5
+ %tr
6
+ <%- for attribute in attributes -%>
7
+ %th <%= attribute.human_name %>
8
+ <%- end -%>
9
+ %th Actions
10
+ %tbody
11
+ - for <%= object_singular %> in @<%= object_plural %>
12
+ %tr
13
+ <%- for attribute in attributes -%>
14
+ %td= <%= object_singular %>.<%= attribute.name %>
15
+ <%- end %>
16
+ %td
17
+ = link_to 'Show', <%= show_url %>
18
+ \|
19
+ = link_to 'Edit', <%= edit_url %>
20
+ \|
21
+ = link_to 'Destroy', <%= show_url %>, :confirm => 'Are you sure?', :method => :delete
22
+
23
+ %p= link_to "New <%= object_singular.titleize %>", <%= new_url %>
24
+
@@ -0,0 +1,12 @@
1
+ !!!
2
+ %html
3
+ %head
4
+ %title Scaffy Scaffolding
5
+ = stylesheet_link_tag 'scaffy'
6
+ = javascript_include_tag :defaults
7
+ = csrf_meta_tag
8
+
9
+ %body
10
+ .content
11
+ = flash_div(:message, :warning)
12
+ = yield
@@ -0,0 +1,4 @@
1
+ %h1 New <%= human_name.singularize %>
2
+
3
+ = render 'form'
4
+
@@ -0,0 +1,13 @@
1
+ = link_to "< back to list", <%= index_url %>
2
+
3
+ %h1 View <%= human_name %>
4
+
5
+ <%- for attribute in attributes -%>
6
+ %p
7
+ %strong <%= attribute.human_name.titleize %>:
8
+ = @<%= object_singular %>.<%= attribute.name %>
9
+ <%- end -%>
10
+
11
+ %p
12
+ = link_to "Edit", <%= edit_url(:instance => true) %>
13
+ = link_to "Delete", <%= show_url(:instance => true) %>, :method => :delete, :confirm => "Are you sure?"
@@ -0,0 +1,3 @@
1
+ module Scaffy
2
+ VERSION = "0.5.0"
3
+ end
metadata ADDED
@@ -0,0 +1,87 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: scaffy
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 5
8
+ - 0
9
+ version: 0.5.0
10
+ platform: ruby
11
+ authors:
12
+ - Alastair Brunton
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-10-25 00:00:00 +02:00
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description: Scaffy generates usable scaffolding for a model with tests, layout, namespacing and haml.
22
+ email:
23
+ - info@simplyexcited.co.uk
24
+ executables: []
25
+
26
+ extensions: []
27
+
28
+ extra_rdoc_files: []
29
+
30
+ files:
31
+ - lib/generators/scaffy/scaffy_generator.rb
32
+ - lib/generators/scaffy/templates/assets/images/alertbad_icon.gif
33
+ - lib/generators/scaffy/templates/assets/images/alertgood_icon.gif
34
+ - lib/generators/scaffy/templates/assets/images/glossy-error-icon.jpg
35
+ - lib/generators/scaffy/templates/assets/stylesheets/scaffy.css
36
+ - lib/generators/scaffy/templates/controller.rb
37
+ - lib/generators/scaffy/templates/helper.rb
38
+ - lib/generators/scaffy/templates/migration.rb
39
+ - lib/generators/scaffy/templates/model.rb
40
+ - lib/generators/scaffy/templates/test/factory_girl/factory.rb
41
+ - lib/generators/scaffy/templates/test/shoulda/controller_test.rb
42
+ - lib/generators/scaffy/templates/test/shoulda/model_test.rb
43
+ - lib/generators/scaffy/templates/views/haml/_form.html.haml
44
+ - lib/generators/scaffy/templates/views/haml/index.html.haml
45
+ - lib/generators/scaffy/templates/views/haml/layout.html.haml
46
+ - lib/generators/scaffy/templates/views/haml/new.html.haml
47
+ - lib/generators/scaffy/templates/views/haml/show.html.haml
48
+ - lib/generators/scaffy/USAGE
49
+ - lib/scaffy/version.rb
50
+ - LICENSE
51
+ - README.textile
52
+ has_rdoc: true
53
+ homepage: http://github.com/pyrat/scaffy
54
+ licenses: []
55
+
56
+ post_install_message:
57
+ rdoc_options: []
58
+
59
+ require_paths:
60
+ - lib
61
+ required_ruby_version: !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ segments:
67
+ - 0
68
+ version: "0"
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ segments:
75
+ - 1
76
+ - 3
77
+ - 1
78
+ version: 1.3.1
79
+ requirements: []
80
+
81
+ rubyforge_project:
82
+ rubygems_version: 1.3.7
83
+ signing_key:
84
+ specification_version: 3
85
+ summary: Opinionated scaffolding generator for rails 3.
86
+ test_files: []
87
+