akitaonrails-dry_scaffold 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. data/CHANGELOG.textile +43 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.textile +445 -0
  4. data/Rakefile +48 -0
  5. data/TODO.textile +40 -0
  6. data/bin/dmodel +3 -0
  7. data/bin/dry_model +3 -0
  8. data/bin/dry_scaffold +3 -0
  9. data/bin/dscaffold +3 -0
  10. data/config/scaffold.yml +31 -0
  11. data/generators/dmodel/dmodel_generator.rb +15 -0
  12. data/generators/dry_model/USAGE +9 -0
  13. data/generators/dry_model/dry_model_generator.rb +134 -0
  14. data/generators/dry_model/prototypes/active_record_migration.rb +17 -0
  15. data/generators/dry_model/prototypes/active_record_model.rb +9 -0
  16. data/generators/dry_model/prototypes/fixture_data/active_record_fixtures.yml +3 -0
  17. data/generators/dry_model/prototypes/fixture_data/factory_girl_factories.rb +4 -0
  18. data/generators/dry_model/prototypes/fixture_data/machinist_blueprints.rb +8 -0
  19. data/generators/dry_model/prototypes/tests/rspec/unit_test.rb +9 -0
  20. data/generators/dry_model/prototypes/tests/shoulda/unit_test.rb +20 -0
  21. data/generators/dry_model/prototypes/tests/test_unit/unit_test.rb +15 -0
  22. data/generators/dry_model/templates/models/active_record_migration.rb +23 -0
  23. data/generators/dry_model/templates/models/active_record_model.rb +15 -0
  24. data/generators/dry_model/templates/models/fixture_data/active_record_fixtures.yml +6 -0
  25. data/generators/dry_model/templates/models/fixture_data/factory_girl_factories.rb +5 -0
  26. data/generators/dry_model/templates/models/fixture_data/machinist_blueprints.rb +9 -0
  27. data/generators/dry_model/templates/models/tests/rspec/unit_test.rb +11 -0
  28. data/generators/dry_model/templates/models/tests/shoulda/unit_test.rb +23 -0
  29. data/generators/dry_model/templates/models/tests/test_unit/unit_test.rb +17 -0
  30. data/generators/dry_scaffold/USAGE +11 -0
  31. data/generators/dry_scaffold/dry_scaffold_generator.rb +401 -0
  32. data/generators/dry_scaffold/prototypes/controllers/action_controller.rb +135 -0
  33. data/generators/dry_scaffold/prototypes/controllers/inherited_resources_controller.rb +25 -0
  34. data/generators/dry_scaffold/prototypes/controllers/tests/rspec/functional_test.rb +56 -0
  35. data/generators/dry_scaffold/prototypes/controllers/tests/shoulda/functional_test.rb +67 -0
  36. data/generators/dry_scaffold/prototypes/controllers/tests/test_unit/functional_test.rb +70 -0
  37. data/generators/dry_scaffold/prototypes/helpers/helper.rb +3 -0
  38. data/generators/dry_scaffold/prototypes/helpers/tests/rspec/unit_test.rb +9 -0
  39. data/generators/dry_scaffold/prototypes/helpers/tests/shoulda/unit_test.rb +9 -0
  40. data/generators/dry_scaffold/prototypes/helpers/tests/test_unit/unit_test.rb +9 -0
  41. data/generators/dry_scaffold/prototypes/views/builder/index.atom.builder +20 -0
  42. data/generators/dry_scaffold/prototypes/views/builder/index.rss.builder +21 -0
  43. data/generators/dry_scaffold/prototypes/views/haml/_form.html.haml +3 -0
  44. data/generators/dry_scaffold/prototypes/views/haml/_item.html.haml +9 -0
  45. data/generators/dry_scaffold/prototypes/views/haml/edit.html.haml +10 -0
  46. data/generators/dry_scaffold/prototypes/views/haml/index.html.haml +17 -0
  47. data/generators/dry_scaffold/prototypes/views/haml/layout.html.haml +18 -0
  48. data/generators/dry_scaffold/prototypes/views/haml/new.html.haml +10 -0
  49. data/generators/dry_scaffold/prototypes/views/haml/show.html.haml +13 -0
  50. data/generators/dry_scaffold/templates/controllers/action_controller.rb +250 -0
  51. data/generators/dry_scaffold/templates/controllers/inherited_resources_controller.rb +26 -0
  52. data/generators/dry_scaffold/templates/controllers/tests/rspec/functional_test.rb +58 -0
  53. data/generators/dry_scaffold/templates/controllers/tests/shoulda/functional_test.rb +90 -0
  54. data/generators/dry_scaffold/templates/controllers/tests/test_unit/functional_test.rb +87 -0
  55. data/generators/dry_scaffold/templates/helpers/helper.rb +3 -0
  56. data/generators/dry_scaffold/templates/helpers/tests/rspec/unit_test.rb +9 -0
  57. data/generators/dry_scaffold/templates/helpers/tests/shoulda/unit_test.rb +9 -0
  58. data/generators/dry_scaffold/templates/helpers/tests/test_unit/unit_test.rb +9 -0
  59. data/generators/dry_scaffold/templates/views/builder/index.atom.builder +20 -0
  60. data/generators/dry_scaffold/templates/views/builder/index.rss.builder +21 -0
  61. data/generators/dry_scaffold/templates/views/haml/_form.html.haml +13 -0
  62. data/generators/dry_scaffold/templates/views/haml/_item.html.haml +10 -0
  63. data/generators/dry_scaffold/templates/views/haml/edit.html.haml +18 -0
  64. data/generators/dry_scaffold/templates/views/haml/index.html.haml +20 -0
  65. data/generators/dry_scaffold/templates/views/haml/layout.html.haml +19 -0
  66. data/generators/dry_scaffold/templates/views/haml/new.html.haml +18 -0
  67. data/generators/dry_scaffold/templates/views/haml/show.html.haml +13 -0
  68. data/generators/dscaffold/dscaffold_generator.rb +15 -0
  69. data/lib/dry_generator.rb +192 -0
  70. data/lib/setup_helper.rb +36 -0
  71. data/rails/init.rb +3 -0
  72. data/tasks/dry_scaffold.rake +95 -0
  73. metadata +129 -0
@@ -0,0 +1,6 @@
1
+ <% unless attributes.empty? -%>
2
+ basic:
3
+ <% attributes.each do |attribute| -%>
4
+ <%= attribute.name %>: <%= attribute.default_for_fixture %>
5
+ <% end -%>
6
+ <% end -%>
@@ -0,0 +1,5 @@
1
+ Factory.define :<%= singular_name %>, :class => <%= class_name %> do |f|
2
+ <% attributes.each do |attribute| -%>
3
+ f.<%= attribute.name %> "<%= attribute.default_for_factory %>"
4
+ <% end -%>
5
+ end
@@ -0,0 +1,9 @@
1
+ Sham.define do
2
+
3
+ end
4
+
5
+ <%= class_name %>.blueprint do
6
+ <% attributes.each do |attribute| -%>
7
+ <%= attribute.name %> { "<%= attribute.default_for_factory %>" }
8
+ <% end -%>
9
+ end
@@ -0,0 +1,11 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe <%= class_name %> do
4
+ <% if options[:fixtures] -%>
5
+ fixtures :<%= table_name %>
6
+
7
+ <% end -%>
8
+ it "should be valid" do
9
+ Comment.new.should be_valid
10
+ end
11
+ end
@@ -0,0 +1,23 @@
1
+ require 'test_helper'
2
+
3
+ class <%= class_name %>Test < ActiveRecord::TestCase
4
+
5
+ <% if options[:fixtures] -%>
6
+ fixtures :<%= plural_name %>
7
+
8
+ <% end -%>
9
+ <% attributes.each do |attribute| -%>
10
+ should_have_db_column :<%= attribute.name %>
11
+ <% end -%>
12
+
13
+ context "A test context" do
14
+ setup do
15
+
16
+ end
17
+
18
+ should 'test something' do
19
+ assert true
20
+ end
21
+ end
22
+
23
+ end
@@ -0,0 +1,17 @@
1
+ require 'test_helper'
2
+
3
+ class <%= class_name %>Test < ActiveRecord::TestCase
4
+
5
+ <% if options[:fixtures] -%>
6
+ fixtures :<%= table_name %>
7
+
8
+ <% end -%>
9
+ setup do
10
+
11
+ end
12
+
13
+ test 'something' do
14
+ assert true
15
+ end
16
+
17
+ end
@@ -0,0 +1,11 @@
1
+ NAME
2
+ dry_scaffold/dscaffold - A Rails scaffold generator that generates DRYer, cleaner, and more useful code.
3
+
4
+ DESCRIPTION
5
+ A replacement for the Rails scaffold generator that generates code that most people end up deleting or rewriting anyway because of the unusable code. The scaffold concept is powerful, but it has more potential than generating messy and almost useless code. The goal with dry_scaffold is to generate DRY, beautiful, and standards compliant code based on common patterns without adding a lot of magic.
6
+
7
+ EXAMPLE
8
+ ./script/generate dry_scaffold Zebra name:string about:text --skip-resourceful
9
+ ./script/generate dscaffold Kangaroo name:string about:text --skip-formtastic
10
+ ./script/generate dscaffold Duck name:string about:text _actions:new,create,index,quack
11
+ ./script/generate dscaffold Parrot name:string about:text _formats:html,xml,yml
@@ -0,0 +1,401 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'lib', 'dry_generator'))
2
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'dry_model', 'dry_model_generator'))
3
+
4
+ class DryScaffoldGenerator < DryGenerator
5
+
6
+ # Banner: Generator arguments and options.
7
+ BANNER_ARGS = [
8
+ "[_actions:new,create,...]",
9
+ "[_formats:html,json,...]",
10
+ DryModelGenerator::BANNER_ARGS
11
+ ].freeze
12
+ BANNER_OPTIONS = [
13
+ "[--skip-pagination]",
14
+ "[--skip-resourceful]",
15
+ "[--skip-formtastic]",
16
+ "[--skip-views]",
17
+ "[--skip-builders]",
18
+ "[--skip-helpers]",
19
+ "[--layout]",
20
+ DryModelGenerator::BANNER_OPTIONS
21
+ ].freeze
22
+
23
+ # Paths.
24
+ CONTROLLERS_PATH = File.join('app', 'controllers').freeze
25
+ HELPERS_PATH = File.join('app', 'helpers').freeze
26
+ VIEWS_PATH = File.join('app', 'views').freeze
27
+ LAYOUTS_PATH = File.join(VIEWS_PATH, 'layouts').freeze
28
+
29
+ ROUTES_FILE_PATH = File.join(RAILS_ROOT, 'config', 'routes.rb').freeze
30
+
31
+ # Formats.
32
+ DEFAULT_RESPOND_TO_FORMATS = [:html, :xml, :json].freeze
33
+ ENHANCED_RESPOND_TO_FORMATS = [:yml, :yaml, :txt, :text, :atom, :rss].freeze
34
+ RESPOND_TO_FEED_FORMATS = [:atom, :rss].freeze
35
+
36
+ # Actions.
37
+ DEFAULT_MEMBER_ACTIONS = [:show, :new, :edit, :create, :update, :destroy].freeze
38
+ DEFAULT_MEMBER_AUTOLOAD_ACTIONS = (DEFAULT_MEMBER_ACTIONS - [:new, :create])
39
+ DEFAULT_COLLECTION_ACTIONS = [:index].freeze
40
+ DEFAULT_COLLECTION_AUTOLOAD_ACTIONS = DEFAULT_COLLECTION_ACTIONS
41
+ DEFAULT_CONTROLLER_ACTIONS = (DEFAULT_COLLECTION_ACTIONS + DEFAULT_MEMBER_ACTIONS)
42
+
43
+ DEFAULT_VIEW_TEMPLATE_FORMAT = :haml
44
+
45
+ RESOURCEFUL_COLLECTION_NAME = 'collection'.freeze
46
+ RESOURCEFUL_SINGULAR_NAME = 'resource'.freeze
47
+
48
+ # :{action} => [:{partial}, ...]
49
+ ACTION_VIEW_TEMPLATES = {
50
+ :index => [:item],
51
+ :show => [],
52
+ :new => [:form],
53
+ :edit => [:form]
54
+ }.freeze
55
+
56
+ ACTION_FORMAT_BUILDERS = {
57
+ :index => [:atom, :rss]
58
+ }
59
+
60
+ attr_reader :controller_name,
61
+ :controller_class_path,
62
+ :controller_file_path,
63
+ :controller_class_nesting,
64
+ :controller_class_nesting_depth,
65
+ :controller_class_name,
66
+ :controller_underscore_name,
67
+ :controller_singular_name,
68
+ :controller_plural_name,
69
+ :collection_name,
70
+ :model_singular_name,
71
+ :model_plural_name,
72
+ :view_template_format,
73
+ :actions,
74
+ :formats,
75
+ :config
76
+
77
+ alias_method :controller_file_name, :controller_underscore_name
78
+ alias_method :controller_table_name, :controller_plural_name
79
+
80
+ def initialize(runtime_args, runtime_options = {})
81
+ super(runtime_args, runtime_options)
82
+
83
+ @controller_name = @name.pluralize
84
+ base_name, @controller_class_path, @controller_file_path, @controller_class_nesting, @controller_class_nesting_depth = extract_modules(@controller_name)
85
+ @controller_class_name_without_nesting, @controller_underscore_name, @controller_plural_name = inflect_names(base_name)
86
+ @controller_singular_name = base_name.singularize
87
+
88
+ if @controller_class_nesting.empty?
89
+ @controller_class_name = @controller_class_name_without_nesting
90
+ else
91
+ @controller_class_name = "#{@controller_class_nesting}::#{@controller_class_name_without_nesting}"
92
+ end
93
+
94
+ @view_template_format = options[:view_template_format] || DEFAULT_VIEW_TEMPLATE_FORMAT
95
+
96
+ @attributes ||= []
97
+ @args_for_model ||= []
98
+
99
+ # Non-attribute args, i.e. "_actions:new,create".
100
+ @args.each do |arg|
101
+ arg_entities = arg.split(':')
102
+ if arg =~ /^#{NON_ATTR_ARG_KEY_PREFIX}/
103
+ if arg =~ /^#{NON_ATTR_ARG_KEY_PREFIX}action/
104
+ # Replace quantifiers with default actions.
105
+ arg_entities[1].gsub!(/\*/, DEFAULT_CONTROLLER_ACTIONS.join(','))
106
+ arg_entities[1].gsub!(/new\+/, [:new, :create].join(','))
107
+ arg_entities[1].gsub!(/edit\+/, [:edit, :update].join(','))
108
+
109
+ arg_actions = arg_entities[1].split(',').compact.uniq
110
+ @actions = arg_actions.collect { |action| action.downcase.to_sym }
111
+ elsif arg =~ /^#{NON_ATTR_ARG_KEY_PREFIX}(format|respond_to)/
112
+ # Replace quantifiers with default respond_to-formats.
113
+ arg_entities[1].gsub!(/\*/, DEFAULT_RESPOND_TO_FORMATS.join(','))
114
+
115
+ arg_formats = arg_entities[1].split(',').compact.uniq
116
+ @formats = arg_formats.collect { |format| format.downcase.to_sym }
117
+ elsif arg =~ /^#{NON_ATTR_ARG_KEY_PREFIX}index/
118
+ @args_for_model << arg
119
+ end
120
+ else
121
+ @attributes << Rails::Generator::GeneratedAttribute.new(*arg_entities)
122
+ @args_for_model << arg
123
+ end
124
+ end
125
+
126
+ @actions ||= DEFAULT_ARGS[:actions] || DEFAULT_CONTROLLER_ACTIONS
127
+ @formats ||= DEFAULT_ARGS[:formats] || DEFAULT_RESPOND_TO_FORMATS
128
+ @options = DEFAULT_OPTIONS.merge(options)
129
+ end
130
+
131
+ def manifest
132
+ record do |m|
133
+ # Check for class naming collisions.
134
+ m.class_collisions "#{controller_class_name}Controller", "#{controller_class_name}ControllerTest"
135
+ m.class_collisions "#{controller_class_name}Helper", "#{controller_class_name}HelperTest"
136
+
137
+ # Controllers.
138
+ controller_template = options[:resourceful] ? 'inherited_resources' : 'action'
139
+ m.directory File.join(CONTROLLERS_PATH, controller_class_path)
140
+ m.template File.join('controllers', "#{controller_template}_controller.rb"),
141
+ File.join(CONTROLLERS_PATH, controller_class_path, "#{controller_file_name}_controller.rb")
142
+
143
+ # Controller Tests.
144
+ unless options[:skip_tests]
145
+ controller_tests_path = File.join(TEST_PATHS[test_framework], FUNCTIONAL_TESTS_PATH[test_framework])
146
+ m.directory File.join(controller_tests_path, controller_class_path)
147
+ m.template File.join('controllers', 'tests', "#{test_framework}", 'functional_test.rb'),
148
+ File.join(controller_tests_path, controller_class_path, "#{controller_file_name}_controller_#{TEST_POST_FIX[test_framework]}.rb")
149
+ end
150
+
151
+ # Helpers.
152
+ unless options[:skip_helpers]
153
+ m.directory File.join(HELPERS_PATH, controller_class_path)
154
+ m.template File.join('helpers', 'helper.rb'),
155
+ File.join(HELPERS_PATH, controller_class_path, "#{controller_file_name}_helper.rb")
156
+
157
+ # Helper Tests
158
+ unless options[:skip_tests]
159
+ helper_tests_path = File.join(TEST_PATHS[test_framework], 'helpers')
160
+ m.directory File.join(helper_tests_path, controller_class_path)
161
+ m.template File.join('helpers', 'tests', "#{test_framework}", 'unit_test.rb'),
162
+ File.join(helper_tests_path, controller_class_path, "#{controller_file_name}_helper_#{TEST_POST_FIX[test_framework]}.rb")
163
+ end
164
+ end
165
+
166
+ # Views.
167
+ unless options[:skip_views]
168
+ m.directory File.join(VIEWS_PATH, controller_class_path, controller_file_name)
169
+ # View template for each action.
170
+ (actions & ACTION_VIEW_TEMPLATES.keys).each do |action|
171
+ m.template File.join('views', "#{view_template_format}", "#{action}.html.#{view_template_format}"),
172
+ File.join(VIEWS_PATH, controller_file_name, "#{action}.html.#{view_template_format}")
173
+
174
+ # View template for each partial - if not already copied.
175
+ (ACTION_VIEW_TEMPLATES[action] || []).each do |partial|
176
+ m.template File.join('views', "#{view_template_format}", "_#{partial}.html.#{view_template_format}"),
177
+ File.join(VIEWS_PATH, controller_file_name, "_#{partial}.html.#{view_template_format}")
178
+ end
179
+ end
180
+ end
181
+
182
+ # Builders.
183
+ unless options[:skip_builders]
184
+ m.directory File.join(VIEWS_PATH, controller_class_path, controller_file_name)
185
+ (actions & ACTION_FORMAT_BUILDERS.keys).each do |action|
186
+ (formats & ACTION_FORMAT_BUILDERS[action] || []).each do |format|
187
+ m.template File.join('views', 'builder', "#{action}.#{format}.builder"),
188
+ File.join(VIEWS_PATH, controller_file_name, "#{action}.#{format}.builder")
189
+ end
190
+ end
191
+ end
192
+
193
+ # Layout.
194
+ if options[:layout]
195
+ m.directory File.join(LAYOUTS_PATH)
196
+ m.template File.join('views', "#{view_template_format}", "layout.html.#{view_template_format}"),
197
+ File.join(LAYOUTS_PATH, "#{controller_file_name}.html.#{view_template_format}")
198
+ end
199
+
200
+ # Routes.
201
+ unless resource_route_exists?
202
+ # TODO: Override Rails default method to not generate route if it's already defined.
203
+ m.route_resources controller_file_name
204
+ end
205
+
206
+ # Models - use Rails default generator.
207
+ m.dependency 'dry_model', [name] + @args_for_model, options.merge(:collision => :skip)
208
+ end
209
+ end
210
+
211
+ ### Fixture/Factory Helpers.
212
+
213
+ def build_object
214
+ case options[:factory_framework]
215
+ when :factory_girl then
216
+ "Factory(:#{singular_name})"
217
+ when :machinist then
218
+ "#{class_name}.make"
219
+ when :object_daddy then
220
+ "#{class_name}.generate"
221
+ else #:fixtures
222
+ "#{table_name}(:basic)"
223
+ end
224
+ end
225
+
226
+ ### Link Helpers.
227
+
228
+ def collection_instance
229
+ "@#{collection_name}"
230
+ end
231
+
232
+ def resource_instance
233
+ "@#{singular_name}"
234
+ end
235
+
236
+ def index_path
237
+ "#{collection_name}_path"
238
+ end
239
+
240
+ def new_path
241
+ "new_#{singular_name}_path"
242
+ end
243
+
244
+ def show_path(object_name = resource_instance)
245
+ "#{singular_name}_path(#{object_name})"
246
+ end
247
+
248
+ def edit_path(object_name = resource_instance)
249
+ "edit_#{show_path(object_name)}"
250
+ end
251
+
252
+ def destroy_path(object_name = resource_instance)
253
+ "#{object_name}"
254
+ end
255
+
256
+ def index_url
257
+ "#{collection_name}_url"
258
+ end
259
+
260
+ def new_url
261
+ "new_#{singular_name}_url"
262
+ end
263
+
264
+ def show_url(object_name = resource_instance)
265
+ "#{singular_name}_url(#{object_name})"
266
+ end
267
+
268
+ def edit_url(object_name = resource_instance)
269
+ "edit_#{show_url(object_name)}"
270
+ end
271
+
272
+ def destroy_url(object_name = resource_instance)
273
+ "#{object_name}"
274
+ end
275
+
276
+ ### Feed Helpers.
277
+
278
+ def feed_link(format)
279
+ case format
280
+ when :atom then
281
+ ":href => #{plural_name}_url(:#{format}), :rel => 'self'"
282
+ when :rss then
283
+ "#{plural_name}_url(#{singular_name}, :#{format})"
284
+ end
285
+ end
286
+
287
+ def feed_entry_link(format)
288
+ case format
289
+ when :atom then
290
+ ":href => #{singular_name}_url(#{singular_name}, :#{format})"
291
+ when :rss then
292
+ "#{singular_name}_url(#{singular_name}, :#{format})"
293
+ end
294
+ end
295
+
296
+ def feed_date(format)
297
+ case format
298
+ when :atom then
299
+ "(#{collection_instance}.first.created_at rescue Time.now.utc).strftime('%Y-%m-%dT%H:%M:%SZ')"
300
+ when :rss then
301
+ "(#{collection_instance}.first.created_at rescue Time.now.utc).to_s(:rfc822)"
302
+ end
303
+ end
304
+
305
+ def feed_entry_date(format)
306
+ case format
307
+ when :atom then
308
+ "#{singular_name}.try(:updated_at).strftime('%Y-%m-%dT%H:%M:%SZ')"
309
+ when :rss then
310
+ "#{singular_name}.try(:updated_at).to_s(:rfc822)"
311
+ end
312
+ end
313
+
314
+ protected
315
+
316
+ def resource_route_exists?
317
+ route_exp = "map.resources :#{controller_file_name}"
318
+ File.read(ROUTES_FILE_PATH) =~ /(#{route_exp.strip}|#{route_exp.strip.tr('\'', '\"')})/
319
+ end
320
+
321
+ def assign_names!(name)
322
+ super(name)
323
+ @model_singular_name = @singular_name
324
+ @model_plural_name = @plural_name
325
+ @collection_name = options[:resourceful] ? RESOURCEFUL_COLLECTION_NAME : @model_plural_name
326
+ @singular_name = options[:resourceful] ? RESOURCEFUL_SINGULAR_NAME : @model_singular_name
327
+ @plural_name = options[:resourceful] ? RESOURCEFUL_SINGULAR_NAME.pluralize : @model_plural_name
328
+ end
329
+
330
+ def add_options!(opt)
331
+ super(opt)
332
+
333
+ ### CONTROLLER + VIEW + HELPER
334
+
335
+ opt.separator ' '
336
+ opt.separator 'Scaffold Options:'
337
+
338
+ opt.on('--skip-resourceful',
339
+ "Controller: Skip 'inherited_resources' style controllers and views. Requires gem 'josevalim-inherited_resources'.") do |v|
340
+ options[:resourceful] = !v
341
+ end
342
+
343
+ opt.on('--skip-pagination',
344
+ "Controller/View: Skip 'will_paginate' for collections in controllers and views. Requires gem 'mislav-will_paginate'.") do |v|
345
+ options[:pagination] = !v
346
+ end
347
+
348
+ opt.on('--skip-formtastic',
349
+ "View: Skip 'formtastic' style forms. Requires gem 'justinfrench-formtastic'.") do |v|
350
+ options[:formtastic] = !v
351
+ end
352
+
353
+ opt.on('--skip-views', "View: Skip generation of views.") do |v|
354
+ options[:skip_views] = v
355
+ end
356
+
357
+ opt.on('--skip-builders', "View: Skip generation of builders.") do |v|
358
+ options[:skip_builders] = v
359
+ end
360
+
361
+ opt.on('--layout', "View: Generate layout.") do |v|
362
+ options[:layout] = v
363
+ end
364
+
365
+ opt.on('--skip-helper', "Helper: Skip generation of helpers.") do |v|
366
+ options[:skip_helpers] = v
367
+ end
368
+
369
+ ### MODEL
370
+
371
+ opt.separator ' '
372
+ opt.separator 'Model Options:'
373
+
374
+ opt.on("--skip-timestamps", "Model: Don't add timestamps to the migration file.") do |v|
375
+ options[:skip_timestamps] = v
376
+ end
377
+
378
+ opt.on("--skip-migration", "Model: Skip generation of migration file.") do |v|
379
+ options[:skip_migration] = v
380
+ end
381
+
382
+ opt.on("--skip-tests", "Model: Skip generation of tests.") do |v|
383
+ options[:skip_tests] = v
384
+ end
385
+
386
+ opt.separator ' '
387
+ end
388
+
389
+ def banner_args
390
+ [BANNER_ARGS, super].flatten.join(' ')
391
+ end
392
+
393
+ def banner_options
394
+ [BANNER_OPTIONS, super].flatten.join(' ')
395
+ end
396
+
397
+ def banner
398
+ [super, banner_args, banner_options].join(' ')
399
+ end
400
+
401
+ end