vileda-generators 0.1.0

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 (51) hide show
  1. data/CHANGELOG +2 -0
  2. data/lib/generators/vileda/layout/USAGE +25 -0
  3. data/lib/generators/vileda/layout/layout_generator.rb +36 -0
  4. data/lib/generators/vileda/layout/templates/apple-touch-icon.png +0 -0
  5. data/lib/generators/vileda/layout/templates/error_messages_helper.rb +23 -0
  6. data/lib/generators/vileda/layout/templates/favicon.ico +0 -0
  7. data/lib/generators/vileda/layout/templates/flash.css +52 -0
  8. data/lib/generators/vileda/layout/templates/forms.css +22 -0
  9. data/lib/generators/vileda/layout/templates/handheld.css +8 -0
  10. data/lib/generators/vileda/layout/templates/js/dd_belatedpng.js +13 -0
  11. data/lib/generators/vileda/layout/templates/js/jquery.js +154 -0
  12. data/lib/generators/vileda/layout/templates/js/modernizr-1.5.min.js +28 -0
  13. data/lib/generators/vileda/layout/templates/js/plugins.js +40 -0
  14. data/lib/generators/vileda/layout/templates/js/profiling/charts.swf +0 -0
  15. data/lib/generators/vileda/layout/templates/js/profiling/config.js +59 -0
  16. data/lib/generators/vileda/layout/templates/js/profiling/yahoo-profiling.css +7 -0
  17. data/lib/generators/vileda/layout/templates/js/profiling/yahoo-profiling.min.js +39 -0
  18. data/lib/generators/vileda/layout/templates/js/script.js +26 -0
  19. data/lib/generators/vileda/layout/templates/layout.html.erb +100 -0
  20. data/lib/generators/vileda/layout/templates/layout_helper.rb +22 -0
  21. data/lib/generators/vileda/layout/templates/style.css +279 -0
  22. data/lib/generators/vileda/scaffold/USAGE +51 -0
  23. data/lib/generators/vileda/scaffold/scaffold_generator.rb +230 -0
  24. data/lib/generators/vileda/scaffold/templates/actions/create.rb +9 -0
  25. data/lib/generators/vileda/scaffold/templates/actions/destroy.rb +6 -0
  26. data/lib/generators/vileda/scaffold/templates/actions/edit.rb +3 -0
  27. data/lib/generators/vileda/scaffold/templates/actions/index.rb +3 -0
  28. data/lib/generators/vileda/scaffold/templates/actions/new.rb +3 -0
  29. data/lib/generators/vileda/scaffold/templates/actions/show.rb +3 -0
  30. data/lib/generators/vileda/scaffold/templates/actions/update.rb +9 -0
  31. data/lib/generators/vileda/scaffold/templates/controller.rb +3 -0
  32. data/lib/generators/vileda/scaffold/templates/fixtures.yml +9 -0
  33. data/lib/generators/vileda/scaffold/templates/helper.rb +2 -0
  34. data/lib/generators/vileda/scaffold/templates/migration.rb +16 -0
  35. data/lib/generators/vileda/scaffold/templates/model.rb +3 -0
  36. data/lib/generators/vileda/scaffold/templates/tests/testunit/actions/create.rb +11 -0
  37. data/lib/generators/vileda/scaffold/templates/tests/testunit/actions/destroy.rb +6 -0
  38. data/lib/generators/vileda/scaffold/templates/tests/testunit/actions/edit.rb +4 -0
  39. data/lib/generators/vileda/scaffold/templates/tests/testunit/actions/index.rb +4 -0
  40. data/lib/generators/vileda/scaffold/templates/tests/testunit/actions/new.rb +4 -0
  41. data/lib/generators/vileda/scaffold/templates/tests/testunit/actions/show.rb +4 -0
  42. data/lib/generators/vileda/scaffold/templates/tests/testunit/actions/update.rb +11 -0
  43. data/lib/generators/vileda/scaffold/templates/tests/testunit/controller.rb +5 -0
  44. data/lib/generators/vileda/scaffold/templates/tests/testunit/model.rb +7 -0
  45. data/lib/generators/vileda/scaffold/templates/views/erb/_form.html.erb +11 -0
  46. data/lib/generators/vileda/scaffold/templates/views/erb/edit.html.erb +14 -0
  47. data/lib/generators/vileda/scaffold/templates/views/erb/index.html.erb +29 -0
  48. data/lib/generators/vileda/scaffold/templates/views/erb/new.html.erb +7 -0
  49. data/lib/generators/vileda/scaffold/templates/views/erb/show.html.erb +20 -0
  50. data/lib/generators/vileda.rb +15 -0
  51. metadata +115 -0
@@ -0,0 +1,279 @@
1
+ /*
2
+ style.css contains a reset, font normalization and some base styles.
3
+
4
+ credit is left where credit is due.
5
+ additionally, much inspiration was taken from these projects:
6
+ yui.yahooapis.com/2.8.1/build/base/base.css
7
+ camendesign.com/design/
8
+ praegnanz.de/weblog/htmlcssjs-kickstart
9
+ */
10
+
11
+ /*
12
+ html5doctor.com Reset Stylesheet (Eric Meyer's Reset Reloaded + HTML5 baseline)
13
+ v1.4 2009-07-27 | Authors: Eric Meyer & Richard Clark
14
+ html5doctor.com/html-5-reset-stylesheet/
15
+ */
16
+
17
+ html, body, div, span, object, iframe,
18
+ h1, h2, h3, h4, h5, h6, p, blockquote, pre,
19
+ abbr, address, cite, code,
20
+ del, dfn, em, img, ins, kbd, q, samp,
21
+ small, strong, sub, sup, var,
22
+ b, i,
23
+ dl, dt, dd, ol, ul, li,
24
+ fieldset, form, label, legend,
25
+ table, caption, tbody, tfoot, thead, tr, th, td,
26
+ article, aside, canvas, details, figcaption, figure,
27
+ footer, header, hgroup, menu, nav, section, summary,
28
+ time, mark, audio, video {
29
+ margin:0;
30
+ padding:0;
31
+ border:0;
32
+ outline:0;
33
+ font-size:100%;
34
+ vertical-align:baseline;
35
+ background:transparent;
36
+ }
37
+
38
+ article, aside, details, figcaption, figure,
39
+ footer, header, hgroup, menu, nav, section {
40
+ display:block;
41
+ }
42
+
43
+ nav ul { list-style:none; }
44
+
45
+ blockquote, q { quotes:none; }
46
+
47
+ blockquote:before, blockquote:after,
48
+ q:before, q:after { content:''; content:none; }
49
+
50
+ a { margin:0; padding:0; font-size:100%; vertical-align:baseline; background:transparent; }
51
+
52
+ ins { background-color:#ff9; color:#000; text-decoration:none; }
53
+
54
+ mark { background-color:#ff9; color:#000; font-style:italic; font-weight:bold; }
55
+
56
+ del { text-decoration: line-through; }
57
+
58
+ abbr[title], dfn[title] { border-bottom:1px dotted; cursor:help; }
59
+
60
+ /* tables still need cellspacing="0" in the markup */
61
+ table { border-collapse:collapse; border-spacing:0; }
62
+
63
+ hr { display:block; height:1px; border:0; border-top:1px solid #ccc; margin:1em 0; padding:0; }
64
+
65
+ input, select { vertical-align:middle; }
66
+ /* END RESET CSS */
67
+
68
+
69
+ /* fonts.css from the YUI Library: developer.yahoo.com/yui/
70
+ Please refer to developer.yahoo.com/yui/fonts/ for font sizing percentages
71
+
72
+ There are three custom edits:
73
+ * remove arial, helvetica from explicit font stack
74
+ * we normalize monospace styles ourselves
75
+ * table font-size is reset in the HTML5 reset above so there is no need to repeat
76
+ */
77
+ body { font:13px/1.231 sans-serif; *font-size:small; } /* hack retained to preserve specificity */
78
+
79
+ select, input, textarea, button { font:99% sans-serif; }
80
+
81
+ /* normalize monospace sizing
82
+ * en.wikipedia.org/wiki/MediaWiki_talk:Common.css/Archive_11#Teletype_style_fix_for_Chrome
83
+ */
84
+ pre, code, kbd, samp { font-family: monospace, sans-serif; }
85
+
86
+
87
+ /*
88
+ * minimal base styles
89
+ */
90
+
91
+
92
+ body, select, input, textarea {
93
+ /* #444 looks better than black: twitter.com/H_FJ/statuses/11800719859 */
94
+ color: #444;
95
+ /* set your base font here, to apply evenly
96
+ /* font-family: Georgia, serif; */
97
+ }
98
+
99
+ /* Headers (h1,h2,etc) have no default font-size or margin,
100
+ you'll want to define those yourself. */
101
+ h1,h2,h3,h4,h5,h6 { font-weight: bold; }
102
+
103
+ /* always force a scrollbar in non-IE */
104
+ html { overflow-y: scroll; }
105
+
106
+
107
+ /* Accessible focus treatment: people.opera.com/patrickl/experiments/keyboard/test */
108
+ a:hover, a:active { outline: none; }
109
+
110
+ a, a:active, a:visited { color: #607890; }
111
+ a:hover { color: #036; }
112
+
113
+
114
+ ul, ol { margin-left: 1.8em; }
115
+ ol { list-style-type: decimal; }
116
+
117
+ small { font-size: 85%; }
118
+ strong, th { font-weight: bold; }
119
+
120
+ td, td img { vertical-align: top; }
121
+
122
+ sub { vertical-align: sub; font-size: smaller; }
123
+ sup { vertical-align: super; font-size: smaller; }
124
+
125
+ pre {
126
+ padding: 15px;
127
+
128
+ /* www.pathf.com/blogs/2008/05/formatting-quoted-code-in-blog-posts-css21-white-space-pre-wrap/ */
129
+ white-space: pre; /* CSS2 */
130
+ white-space: pre-wrap; /* CSS 2.1 */
131
+ white-space: pre-line; /* CSS 3 (and 2.1 as well, actually) */
132
+ word-wrap: break-word; /* IE */
133
+ }
134
+
135
+ textarea { overflow: auto; } /* thnx ivannikolic! www.sitepoint.com/blogs/2010/08/20/ie-remove-textarea-scrollbars/ */
136
+
137
+ .ie6 legend, .ie7 legend { margin-left: -7px; } /* thnx ivannikolic! */
138
+
139
+ /* align checkboxes, radios, text inputs with their label
140
+ by: Thierry Koblentz tjkdesign.com/ez-css/css/base.css */
141
+ input[type="radio"] { vertical-align: text-bottom; }
142
+ input[type="checkbox"] { vertical-align: bottom; }
143
+ .ie7 input[type="checkbox"] { vertical-align: baseline; }
144
+ .ie6 input { vertical-align: text-bottom; }
145
+
146
+ /* hand cursor on clickable input elements */
147
+ label, input[type=button], input[type=submit], button { cursor: pointer; }
148
+
149
+ /* webkit browsers add a 2px margin outside the chrome of form elements */
150
+ button, input, select, textarea { margin: 0; }
151
+
152
+ /* colors for form validity */
153
+ input:valid, textarea:valid { }
154
+ input:invalid, textarea:invalid {
155
+ border-radius: 1px;
156
+ -moz-box-shadow: 0px 0px 5px red;
157
+ -webkit-box-shadow: 0px 0px 5px red;
158
+ box-shadow: 0px 0px 5px red;
159
+ }
160
+ .no-boxshadow input:invalid,
161
+ .no-boxshadow textarea:invalid { background-color: #f0dddd; }
162
+
163
+
164
+ /* These selection declarations have to be separate.
165
+ No text-shadow: twitter.com/miketaylr/status/12228805301
166
+ Also: hot pink. */
167
+ ::-moz-selection{ background: #FF5E99; color:#fff; text-shadow: none; }
168
+ ::selection { background:#FF5E99; color:#fff; text-shadow: none; }
169
+
170
+ /* j.mp/webkit-tap-highlight-color */
171
+ a:link { -webkit-tap-highlight-color: #FF5E99; }
172
+
173
+ /* make buttons play nice in IE:
174
+ www.viget.com/inspire/styling-the-button-element-in-internet-explorer/ */
175
+ button { width: auto; overflow: visible; }
176
+
177
+ /* bicubic resizing for non-native sized IMG:
178
+ code.flickr.com/blog/2008/11/12/on-ui-quality-the-little-things-client-side-image-resizing/ */
179
+ .ie7 img { -ms-interpolation-mode: bicubic; }
180
+
181
+
182
+
183
+ /*
184
+ * Non-semantic helper classes
185
+ */
186
+
187
+ /* for image replacement */
188
+ .ir { display: block; text-indent: -999em; overflow: hidden; background-repeat: no-repeat; text-align: left; direction: ltr; }
189
+
190
+ /* Hide for both screenreaders and browsers
191
+ css-discuss.incutio.com/wiki/Screenreader_Visibility */
192
+ .hidden { display: none; visibility: hidden; }
193
+
194
+ /* Hide only visually, but have it available for screenreaders
195
+ www.webaim.org/techniques/css/invisiblecontent/
196
+ Solution from: j.mp/visuallyhidden - Thanks Jonathan Neal! */
197
+ .visuallyhidden { position: absolute !important;
198
+ clip: rect(1px 1px 1px 1px); /* IE6, IE7 */
199
+ clip: rect(1px, 1px, 1px, 1px); }
200
+
201
+ /* Hide visually and from screenreaders, but maintain layout */
202
+ .invisible { visibility: hidden; }
203
+
204
+ /* >> The Magnificent CLEARFIX << j.mp/phayesclearfix */
205
+ .clearfix:after { content: "\0020"; display: block; height: 0; clear: both; visibility: hidden; }
206
+ /* Fix clearfix: blueprintcss.lighthouseapp.com/projects/15318/tickets/5-extra-margin-padding-bottom-of-page */
207
+ .clearfix { zoom: 1; }
208
+
209
+
210
+
211
+
212
+
213
+
214
+ /* Primary Styles
215
+ Author:
216
+ */
217
+
218
+ #container {
219
+ margin: 0 auto;
220
+ width: 960px;
221
+ }
222
+
223
+
224
+
225
+
226
+ /*
227
+ * print styles
228
+ * inlined to avoid required HTTP connection www.phpied.com/delay-loading-your-print-css/
229
+ */
230
+ @media print {
231
+ * { background: transparent !important; color: #444 !important; text-shadow: none !important; }
232
+
233
+ a, a:visited { color: #444 !important; text-decoration: underline; }
234
+
235
+ a:after { content: " (" attr(href) ")"; }
236
+
237
+ abbr:after { content: " (" attr(title) ")"; }
238
+
239
+ .ir a:after { content: ""; } /* Don't show links for images */
240
+
241
+ pre, blockquote { border: 1px solid #999; page-break-inside: avoid; }
242
+
243
+ thead { display: table-header-group; } /* css-discuss.incutio.com/wiki/Printing_Tables */
244
+
245
+ tr, img { page-break-inside: avoid; }
246
+
247
+ @page { margin: 0.5cm; }
248
+
249
+ p, h2, h3 { orphans: 3; widows: 3; }
250
+
251
+ h2, h3{ page-break-after: avoid; }
252
+ }
253
+
254
+
255
+
256
+ /*
257
+ * Media queries for responsive design
258
+ */
259
+
260
+ @media all and (orientation:portrait) {
261
+ /* Style adjustments for portrait mode goes here */
262
+
263
+ }
264
+
265
+ @media all and (orientation:landscape) {
266
+ /* Style adjustments for landscape mode goes here */
267
+
268
+ }
269
+
270
+ /* Grade-A Mobile Browsers (Opera Mobile, iPhone Safari, Android Chrome)
271
+ Consider this: www.cloudfour.com/css-media-query-for-mobile-is-fools-gold/ */
272
+ @media screen and (max-device-width: 480px) {
273
+
274
+
275
+ /* Uncomment if you don't want iOS and WinMobile to mobile-optimize the text for you
276
+ j.mp/textsizeadjust
277
+ html { -webkit-text-size-adjust:none; -ms-text-size-adjust:none; } */
278
+ }
279
+
@@ -0,0 +1,51 @@
1
+ Description:
2
+ Scaffolds an entire resource, from model and migration to controller and
3
+ views. The resource is ready to use as a starting point for your restful,
4
+ resource-oriented application. Tests or specs are also generated depending
5
+ on if you have a "spec" directory or not.
6
+
7
+ IMPORTANT: This generator uses the "title" helper method which is generated
8
+ by the vileda_layout generator. You may want to run that generator first.
9
+
10
+ Usage:
11
+ Pass the name of the model, either CamelCased or under_scored, as the first
12
+ argument along with an optional list of attribute pairs and controller actions.
13
+
14
+ If no controller actions are specified, they will default to index, show,
15
+ new, create, edit, update, and destroy.
16
+
17
+ IMPORTANT: If no attribute pairs are specified, no model will be generated.
18
+ It will try to determine the attributes from an existing model.
19
+
20
+ Attribute pairs are column_name:sql_type arguments specifying the
21
+ model's attributes. Timestamps are added by default, so you don't have to
22
+ specify them by hand as 'created_at:datetime updated_at:datetime'.
23
+
24
+ For example, `vileda_scaffold post name:string content:text hidden:boolean`
25
+ gives you a model with those three attributes, a controller that handles
26
+ the create/show/update/destroy, forms to create and edit your posts, and
27
+ an index that lists them all, as well as a map.resources :posts
28
+ declaration in config/routes.rb.
29
+
30
+ Adding an "!" in the mix of arguments will invert the passed controller
31
+ actions. This will include all 7 controller actitons except the ones
32
+ mentioned. This option doesn't affect model attributes.
33
+
34
+ Examples:
35
+ rails generate vileda:scaffold post
36
+
37
+ Will create a controller called "posts" it will contain all seven
38
+ CRUD actions along with the views. A model will NOT be created,
39
+ instead it will look for an existing model and use those attributes.
40
+
41
+ rails generate vileda:scaffold post name:string content:text index new edit
42
+
43
+ Will create a Post model and migration file with the name and content
44
+ attributes. It will also create a controller with index, new, create,
45
+ edit, and update actions. Notice the create and update actions are
46
+ added automatically with new and edit.
47
+
48
+ rails generate vileda:scaffold post ! show new
49
+
50
+ Creates a posts controller (no model) with index, edit, update, and
51
+ destroy actions.
@@ -0,0 +1,230 @@
1
+ require 'generators/vileda'
2
+ require 'rails/generators/migration'
3
+ require 'rails/generators/generated_attribute'
4
+
5
+ module Vileda
6
+ module Generators
7
+ class ScaffoldGenerator < Base
8
+ include Rails::Generators::Migration
9
+ no_tasks { attr_accessor :model_name, :model_attributes, :controller_actions }
10
+
11
+ argument :model_name, :type => :string, :required => true, :banner => 'ModelName'
12
+ argument :args_for_c_m, :type => :array, :default => [], :banner => 'controller_actions and model:attributes'
13
+
14
+ class_option :skip_model, :desc => 'Don\'t generate a model or migration file.', :type => :boolean
15
+ class_option :skip_migration, :desc => 'Dont generate migration file for model.', :type => :boolean
16
+ class_option :skip_timestamps, :desc => 'Don\'t add timestamps to migration file.', :type => :boolean
17
+ class_option :skip_controller, :desc => 'Don\'t generate controller, helper, or views.', :type => :boolean
18
+ class_option :invert, :desc => 'Generate all controller actions except these mentioned.', :type => :boolean
19
+
20
+ class_option :testunit, :desc => 'Use test/unit for test files.', :group => 'Test framework', :type => :boolean
21
+
22
+ def initialize(*args, &block)
23
+ super
24
+
25
+ @controller_actions = []
26
+ @model_attributes = []
27
+
28
+ args_for_c_m.each do |arg|
29
+ if arg == '!'
30
+ options[:invert] = true
31
+ elsif arg.include?(':')
32
+ @model_attributes << Rails::Generators::GeneratedAttribute.new(*arg.split(':'))
33
+ else
34
+ @controller_actions << arg
35
+ @controller_actions << 'create' if arg == 'new'
36
+ @controller_actions << 'update' if arg == 'edit'
37
+ end
38
+ end
39
+
40
+ @controller_actions.uniq!
41
+ @model_attributes.uniq!
42
+
43
+ if options.invert? || @controller_actions.empty?
44
+ @controller_actions = all_actions - @controller_actions
45
+ end
46
+
47
+ if @model_attributes.empty?
48
+ options[:skip_model] = true # default to skipping model if no attributes passed
49
+ if model_exists?
50
+ model_columns_for_attributes.each do |column|
51
+ @model_attributes << Rails::Generators::GeneratedAttribute.new(column.name.to_s, column.type.to_s)
52
+ end
53
+ else
54
+ @model_attributes << Rails::Generators::GeneratedAttribute.new('name', 'string')
55
+ end
56
+ end
57
+ end
58
+
59
+ def create_model
60
+ unless options.skip_model?
61
+ template 'model.rb', "app/models/#{singular_name}.rb"
62
+ if options.rspec?
63
+ template "tests/rspec/model.rb", "spec/models/#{singular_name}_spec.rb"
64
+ template 'fixtures.yml', "spec/fixtures/#{plural_name}.yml"
65
+ else
66
+ template "tests/#{test_framework}/model.rb", "test/unit/#{singular_name}_test.rb"
67
+ template 'fixtures.yml', "test/fixtures/#{plural_name}.yml"
68
+ end
69
+ end
70
+ end
71
+
72
+ def create_migration
73
+ unless options.skip_model? || options.skip_migration?
74
+ migration_template 'migration.rb', "db/migrate/create_#{plural_name}.rb"
75
+ end
76
+ end
77
+
78
+ def create_controller
79
+ unless options.skip_controller?
80
+ template 'controller.rb', "app/controllers/#{plural_name}_controller.rb"
81
+
82
+ template 'helper.rb', "app/helpers/#{plural_name}_helper.rb"
83
+
84
+ controller_actions.each do |action|
85
+ if %w[index show new edit].include?(action) # Actions with templates
86
+ template "views/#{view_language}/#{action}.html.#{view_language}", "app/views/#{plural_name}/#{action}.html.#{view_language}"
87
+ end
88
+ end
89
+
90
+ if form_partial?
91
+ template "views/#{view_language}/_form.html.#{view_language}", "app/views/#{plural_name}/_form.html.#{view_language}"
92
+ end
93
+
94
+ route "resources #{plural_name.to_sym.inspect}"
95
+
96
+ template "tests/#{test_framework}/controller.rb", "test/functional/#{plural_name}_controller_test.rb"
97
+ end
98
+ end
99
+
100
+ private
101
+
102
+ def form_partial?
103
+ actions? :new, :edit
104
+ end
105
+
106
+ def all_actions
107
+ %w[index show new create edit update destroy]
108
+ end
109
+
110
+ def action?(name)
111
+ controller_actions.include? name.to_s
112
+ end
113
+
114
+ def actions?(*names)
115
+ names.all? { |name| action? name }
116
+ end
117
+
118
+ def singular_name
119
+ model_name.underscore
120
+ end
121
+
122
+ def plural_name
123
+ model_name.underscore.pluralize
124
+ end
125
+
126
+ def class_name
127
+ model_name.camelize
128
+ end
129
+
130
+ def plural_class_name
131
+ plural_name.camelize
132
+ end
133
+
134
+ def controller_methods(dir_name)
135
+ controller_actions.map do |action|
136
+ read_template("#{dir_name}/#{action}.rb")
137
+ end.join(" \n").strip
138
+ end
139
+
140
+ def render_form
141
+ if form_partial?
142
+ if options.haml?
143
+ "= render 'form'"
144
+ else
145
+ "<%= render 'form' %>"
146
+ end
147
+ else
148
+ read_template("views/#{view_language}/_form.html.#{view_language}")
149
+ end
150
+ end
151
+
152
+ def items_path(suffix = 'path')
153
+ if action? :index
154
+ "#{plural_name}_#{suffix}"
155
+ else
156
+ "root_#{suffix}"
157
+ end
158
+ end
159
+
160
+ def item_path(suffix = 'path')
161
+ if action? :show
162
+ "@#{singular_name}"
163
+ else
164
+ items_path(suffix)
165
+ end
166
+ end
167
+
168
+ def item_path_for_spec(suffix = 'path')
169
+ if action? :show
170
+ "#{singular_name}_#{suffix}(assigns[:#{singular_name}])"
171
+ else
172
+ items_path(suffix)
173
+ end
174
+ end
175
+
176
+ def item_path_for_test(suffix = 'path')
177
+ if action? :show
178
+ "#{singular_name}_#{suffix}(assigns(:#{singular_name}))"
179
+ else
180
+ items_path(suffix)
181
+ end
182
+ end
183
+
184
+ def model_columns_for_attributes
185
+ class_name.constantize.columns.reject do |column|
186
+ column.name.to_s =~ /^(id|created_at|updated_at)$/
187
+ end
188
+ end
189
+
190
+ def view_language
191
+ options.haml? ? 'haml' : 'erb'
192
+ end
193
+
194
+ def test_framework
195
+ return @test_framework if defined?(@test_framework)
196
+ if options.testunit?
197
+ return @test_framework = :testunit
198
+ else
199
+ return @test_framework = default_test_framework
200
+ end
201
+ end
202
+
203
+ def default_test_framework
204
+ :testunit
205
+ end
206
+
207
+ def model_exists?
208
+ File.exist? destination_path("app/models/#{singular_name}.rb")
209
+ end
210
+
211
+ def read_template(relative_path)
212
+ ERB.new(File.read(find_in_source_paths(relative_path)), nil, '-').result(binding)
213
+ end
214
+
215
+ def destination_path(path)
216
+ File.join(destination_root, path)
217
+ end
218
+
219
+ # FIXME: Should be proxied to ActiveRecord::Generators::Base
220
+ # Implement the required interface for Rails::Generators::Migration.
221
+ def self.next_migration_number(dirname) #:nodoc:
222
+ if ActiveRecord::Base.timestamped_migrations
223
+ Time.now.utc.strftime("%Y%m%d%H%M%S")
224
+ else
225
+ "%.3d" % (current_migration_number(dirname) + 1)
226
+ end
227
+ end
228
+ end
229
+ end
230
+ end
@@ -0,0 +1,9 @@
1
+ def create
2
+ @<%= singular_name %> = <%= class_name %>.new(params[:<%= singular_name %>])
3
+ if @<%= singular_name %>.save
4
+ flash[:notice] = "Successfully created <%= model_name.underscore.humanize.downcase %>."
5
+ redirect_to <%= item_path('url') %>
6
+ else
7
+ render :action => 'new'
8
+ end
9
+ end
@@ -0,0 +1,6 @@
1
+ def destroy
2
+ @<%= singular_name %> = <%= class_name %>.find(params[:id])
3
+ @<%= singular_name %>.destroy
4
+ flash[:notice] = "Successfully destroyed <%= model_name.underscore.humanize.downcase %>."
5
+ redirect_to <%= items_path('url') %>
6
+ end
@@ -0,0 +1,3 @@
1
+ def edit
2
+ @<%= singular_name %> = <%= class_name %>.find(params[:id])
3
+ end
@@ -0,0 +1,3 @@
1
+ def index
2
+ @<%= plural_name %> = <%= class_name %>.all
3
+ end
@@ -0,0 +1,3 @@
1
+ def new
2
+ @<%= singular_name %> = <%= class_name %>.new
3
+ end
@@ -0,0 +1,3 @@
1
+ def show
2
+ @<%= singular_name %> = <%= class_name %>.find(params[:id])
3
+ end
@@ -0,0 +1,9 @@
1
+ def update
2
+ @<%= singular_name %> = <%= class_name %>.find(params[:id])
3
+ if @<%= singular_name %>.update_attributes(params[:<%= singular_name %>])
4
+ flash[:notice] = "Successfully updated <%= model_name.underscore.humanize.downcase %>."
5
+ redirect_to <%= item_path('url') %>
6
+ else
7
+ render :action => 'edit'
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ class <%= plural_class_name %>Controller < ApplicationController
2
+ <%= controller_methods :actions %>
3
+ end
@@ -0,0 +1,9 @@
1
+ one:
2
+ <%- for attribute in model_attributes -%>
3
+ <%= attribute.name %>: <%= attribute.default %>
4
+ <%- end -%>
5
+
6
+ two:
7
+ <%- for attribute in model_attributes -%>
8
+ <%= attribute.name %>: <%= attribute.default %>
9
+ <%- end -%>
@@ -0,0 +1,2 @@
1
+ module <%= plural_class_name %>Helper
2
+ end
@@ -0,0 +1,16 @@
1
+ class Create<%= plural_class_name %> < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :<%= plural_name %> do |t|
4
+ <%- for attribute in model_attributes -%>
5
+ t.<%= attribute.type %> :<%= attribute.name %>
6
+ <%- end -%>
7
+ <%- unless options[:skip_timestamps] -%>
8
+ t.timestamps
9
+ <%- end -%>
10
+ end
11
+ end
12
+
13
+ def self.down
14
+ drop_table :<%= plural_name %>
15
+ end
16
+ end
@@ -0,0 +1,3 @@
1
+ class <%= class_name %> < ActiveRecord::Base
2
+ attr_accessible <%= model_attributes.map { |a| ":#{a.name}" }.join(", ") %>
3
+ end
@@ -0,0 +1,11 @@
1
+ def test_create_invalid
2
+ <%= class_name %>.any_instance.stubs(:valid?).returns(false)
3
+ post :create
4
+ assert_template 'new'
5
+ end
6
+
7
+ def test_create_valid
8
+ <%= class_name %>.any_instance.stubs(:valid?).returns(true)
9
+ post :create
10
+ assert_redirected_to <%= item_path_for_test('url') %>
11
+ end
@@ -0,0 +1,6 @@
1
+ def test_destroy
2
+ <%= singular_name %> = <%= class_name %>.first
3
+ delete :destroy, :id => <%= singular_name %>
4
+ assert_redirected_to <%= items_path('url') %>
5
+ assert !<%= class_name %>.exists?(<%= singular_name %>.id)
6
+ end
@@ -0,0 +1,4 @@
1
+ def test_edit
2
+ get :edit, :id => <%= class_name %>.first
3
+ assert_template 'edit'
4
+ end
@@ -0,0 +1,4 @@
1
+ def test_index
2
+ get :index
3
+ assert_template 'index'
4
+ end
@@ -0,0 +1,4 @@
1
+ def test_new
2
+ get :new
3
+ assert_template 'new'
4
+ end