dry_scaffold 0.3.6

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 +55 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.textile +473 -0
  4. data/Rakefile +54 -0
  5. data/TODO.textile +36 -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 +33 -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 +410 -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 +57 -0
  35. data/generators/dry_scaffold/prototypes/controllers/tests/shoulda/functional_test.rb +99 -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 +85 -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 +197 -0
  70. data/lib/dry_scaffold/tasks.rb +5 -0
  71. data/lib/setup_helper.rb +36 -0
  72. data/tasks/dry_scaffold.rake +95 -0
  73. metadata +140 -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
+ <%= class_name %>.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,410 @@
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
+ @options = DEFAULT_OPTIONS.merge(options)
82
+ super(runtime_args, runtime_options.merge(@options))
83
+
84
+ @controller_name = @name.pluralize
85
+ base_name, @controller_class_path, @controller_file_path, @controller_class_nesting, @controller_class_nesting_depth = extract_modules(@controller_name)
86
+ @controller_class_name_without_nesting, @controller_underscore_name, @controller_plural_name = inflect_names(base_name)
87
+ @controller_singular_name = base_name.singularize
88
+
89
+ if @controller_class_nesting.empty?
90
+ @controller_class_name = @controller_class_name_without_nesting
91
+ else
92
+ @controller_class_name = "#{@controller_class_nesting}::#{@controller_class_name_without_nesting}"
93
+ end
94
+
95
+ @view_template_format = options[:view_template_format] || DEFAULT_VIEW_TEMPLATE_FORMAT
96
+
97
+ @attributes ||= []
98
+ @args_for_model ||= []
99
+
100
+ # Non-attribute args, i.e. "_actions:new,create".
101
+ @args.each do |arg|
102
+ arg_entities = arg.split(':')
103
+ if arg =~ /^#{NON_ATTR_ARG_KEY_PREFIX}/
104
+ if arg =~ /^#{NON_ATTR_ARG_KEY_PREFIX}action/
105
+ # Replace quantifiers with default actions.
106
+ arg_entities[1].gsub!(/\*/, DEFAULT_CONTROLLER_ACTIONS.join(','))
107
+ arg_entities[1].gsub!(/new\+/, [:new, :create].join(','))
108
+ arg_entities[1].gsub!(/edit\+/, [:edit, :update].join(','))
109
+
110
+ arg_actions = arg_entities[1].split(',').compact.uniq
111
+ @actions = arg_actions.collect { |action| action.downcase.to_sym }
112
+ elsif arg =~ /^#{NON_ATTR_ARG_KEY_PREFIX}(format|respond_to)/
113
+ # Replace quantifiers with default respond_to-formats.
114
+ arg_entities[1].gsub!(/\*/, DEFAULT_RESPOND_TO_FORMATS.join(','))
115
+
116
+ arg_formats = arg_entities[1].split(',').compact.uniq
117
+ @formats = arg_formats.collect { |format| format.downcase.to_sym }
118
+ elsif arg =~ /^#{NON_ATTR_ARG_KEY_PREFIX}index/
119
+ @args_for_model << arg
120
+ end
121
+ else
122
+ @attributes << Rails::Generator::GeneratedAttribute.new(*arg_entities)
123
+ @args_for_model << arg
124
+ end
125
+ end
126
+
127
+ @actions ||= DEFAULT_ARGS[:actions] || DEFAULT_CONTROLLER_ACTIONS
128
+ @formats ||= DEFAULT_ARGS[:formats] || DEFAULT_RESPOND_TO_FORMATS
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] || options[:skip_controller_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
+ puts options[:resourceful], @collection_name
329
+ end
330
+
331
+ def add_options!(opt)
332
+ super(opt)
333
+
334
+ ### CONTROLLER + VIEW + HELPER
335
+
336
+ opt.separator ' '
337
+ opt.separator 'Scaffold Options:'
338
+
339
+ opt.on('--skip-resourceful',
340
+ "Controller: Skip 'inherited_resources' style controllers and views. Requires gem 'josevalim-inherited_resources'.") do |v|
341
+ options[:resourceful] = !v
342
+ end
343
+
344
+ opt.on('--skip-pagination',
345
+ "Controller/View: Skip 'will_paginate' for collections in controllers and views. Requires gem 'mislav-will_paginate'.") do |v|
346
+ options[:pagination] = !v
347
+ end
348
+
349
+ opt.on('--skip-formtastic',
350
+ "View: Skip 'formtastic' style forms. Requires gem 'justinfrench-formtastic'.") do |v|
351
+ options[:formtastic] = !v
352
+ end
353
+
354
+ opt.on("--skip-controller-tests", "Controller: Skip generation of tests for controller.") do |v|
355
+ options[:skip_controller_tests] = v
356
+ end
357
+
358
+ opt.on('--skip-views', "View: Skip generation of views.") do |v|
359
+ options[:skip_views] = v
360
+ end
361
+
362
+ opt.on('--skip-builders', "View: Skip generation of builders.") do |v|
363
+ options[:skip_builders] = v
364
+ end
365
+
366
+ opt.on('--layout', "View: Generate layout.") do |v|
367
+ options[:layout] = v
368
+ end
369
+
370
+ opt.on('--skip-helper', "Helper: Skip generation of helpers.") do |v|
371
+ options[:skip_helpers] = v
372
+ end
373
+
374
+ ### MODEL
375
+
376
+ opt.separator ' '
377
+ opt.separator 'Model Options:'
378
+
379
+ opt.on("--skip-timestamps", "Model: Don't add timestamps to the migration file.") do |v|
380
+ options[:skip_timestamps] = v
381
+ end
382
+
383
+ opt.on("--skip-migration", "Model: Skip generation of migration file.") do |v|
384
+ options[:skip_migration] = v
385
+ end
386
+
387
+ opt.on("--skip-tests", "Model: Skip generation of tests.") do |v|
388
+ options[:skip_tests] = v
389
+ end
390
+
391
+ opt.on("--skip-controller tests", "Controller: Skip generation of tests for controller.") do |v|
392
+ options[:skip_controller_tests] = v
393
+ end
394
+
395
+ opt.separator ' '
396
+ end
397
+
398
+ def banner_args
399
+ [BANNER_ARGS, super].flatten.join(' ')
400
+ end
401
+
402
+ def banner_options
403
+ [BANNER_OPTIONS, super].flatten.join(' ')
404
+ end
405
+
406
+ def banner
407
+ [super, banner_args, banner_options].join(' ')
408
+ end
409
+
410
+ end