michel-dry_scaffold 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. data/CHANGELOG.textile +51 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.textile +461 -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 +34 -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 +415 -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 +36 -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 +38 -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/rails/init.rb +3 -0
  73. data/tasks/dry_scaffold.rake +95 -0
  74. metadata +132 -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,415 @@
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-search]",
15
+ "[--skip-resourceful]",
16
+ "[--skip-formtastic]",
17
+ "[--skip-views]",
18
+ "[--skip-builders]",
19
+ "[--skip-helpers]",
20
+ "[--layout]",
21
+ DryModelGenerator::BANNER_OPTIONS
22
+ ].freeze
23
+
24
+ # Paths.
25
+ CONTROLLERS_PATH = File.join('app', 'controllers').freeze
26
+ HELPERS_PATH = File.join('app', 'helpers').freeze
27
+ VIEWS_PATH = File.join('app', 'views').freeze
28
+ LAYOUTS_PATH = File.join(VIEWS_PATH, 'layouts').freeze
29
+
30
+ ROUTES_FILE_PATH = File.join(RAILS_ROOT, 'config', 'routes.rb').freeze
31
+
32
+ # Formats.
33
+ DEFAULT_RESPOND_TO_FORMATS = [:html, :xml, :json].freeze
34
+ ENHANCED_RESPOND_TO_FORMATS = [:yml, :yaml, :txt, :text, :atom, :rss].freeze
35
+ RESPOND_TO_FEED_FORMATS = [:atom, :rss].freeze
36
+
37
+ # Actions.
38
+ DEFAULT_MEMBER_ACTIONS = [:show, :new, :edit, :create, :update, :destroy].freeze
39
+ DEFAULT_MEMBER_AUTOLOAD_ACTIONS = (DEFAULT_MEMBER_ACTIONS - [:new, :create])
40
+ DEFAULT_COLLECTION_ACTIONS = [:index].freeze
41
+ DEFAULT_COLLECTION_AUTOLOAD_ACTIONS = DEFAULT_COLLECTION_ACTIONS
42
+ DEFAULT_CONTROLLER_ACTIONS = (DEFAULT_COLLECTION_ACTIONS + DEFAULT_MEMBER_ACTIONS)
43
+
44
+ DEFAULT_VIEW_TEMPLATE_FORMAT = :haml
45
+
46
+ RESOURCEFUL_COLLECTION_NAME = 'collection'.freeze
47
+ RESOURCEFUL_SINGULAR_NAME = 'resource'.freeze
48
+
49
+ # :{action} => [:{partial}, ...]
50
+ ACTION_VIEW_TEMPLATES = {
51
+ :index => [:item],
52
+ :show => [],
53
+ :new => [:form],
54
+ :edit => [:form]
55
+ }.freeze
56
+
57
+ ACTION_FORMAT_BUILDERS = {
58
+ :index => [:atom, :rss]
59
+ }
60
+
61
+ attr_reader :controller_name,
62
+ :controller_class_path,
63
+ :controller_file_path,
64
+ :controller_class_nesting,
65
+ :controller_class_nesting_depth,
66
+ :controller_class_name,
67
+ :controller_underscore_name,
68
+ :controller_singular_name,
69
+ :controller_plural_name,
70
+ :collection_name,
71
+ :model_singular_name,
72
+ :model_plural_name,
73
+ :view_template_format,
74
+ :actions,
75
+ :formats,
76
+ :config
77
+
78
+ alias_method :controller_file_name, :controller_underscore_name
79
+ alias_method :controller_table_name, :controller_plural_name
80
+
81
+ def initialize(runtime_args, runtime_options = {})
82
+ super(runtime_args, runtime_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
+ @options = DEFAULT_OPTIONS.merge(options)
130
+ end
131
+
132
+ def manifest
133
+ record do |m|
134
+ # Check for class naming collisions.
135
+ m.class_collisions "#{controller_class_name}Controller", "#{controller_class_name}ControllerTest"
136
+ m.class_collisions "#{controller_class_name}Helper", "#{controller_class_name}HelperTest"
137
+
138
+ # Controllers.
139
+ controller_template = options[:resourceful] ? 'inherited_resources' : 'action'
140
+ m.directory File.join(CONTROLLERS_PATH, controller_class_path)
141
+ m.template File.join('controllers', "#{controller_template}_controller.rb"),
142
+ File.join(CONTROLLERS_PATH, controller_class_path, "#{controller_file_name}_controller.rb")
143
+
144
+ # Controller Tests.
145
+ unless options[:skip_tests] || options[:skip_controller_tests]
146
+ controller_tests_path = File.join(TEST_PATHS[test_framework], FUNCTIONAL_TESTS_PATH[test_framework])
147
+ m.directory File.join(controller_tests_path, controller_class_path)
148
+ m.template File.join('controllers', 'tests', "#{test_framework}", 'functional_test.rb'),
149
+ File.join(controller_tests_path, controller_class_path, "#{controller_file_name}_controller_#{TEST_POST_FIX[test_framework]}.rb")
150
+ end
151
+
152
+ # Helpers.
153
+ unless options[:skip_helpers]
154
+ m.directory File.join(HELPERS_PATH, controller_class_path)
155
+ m.template File.join('helpers', 'helper.rb'),
156
+ File.join(HELPERS_PATH, controller_class_path, "#{controller_file_name}_helper.rb")
157
+
158
+ # Helper Tests
159
+ unless options[:skip_tests]
160
+ helper_tests_path = File.join(TEST_PATHS[test_framework], 'helpers')
161
+ m.directory File.join(helper_tests_path, controller_class_path)
162
+ m.template File.join('helpers', 'tests', "#{test_framework}", 'unit_test.rb'),
163
+ File.join(helper_tests_path, controller_class_path, "#{controller_file_name}_helper_#{TEST_POST_FIX[test_framework]}.rb")
164
+ end
165
+ end
166
+
167
+ # Views.
168
+ unless options[:skip_views]
169
+ m.directory File.join(VIEWS_PATH, controller_class_path, controller_file_name)
170
+ # View template for each action.
171
+ (actions & ACTION_VIEW_TEMPLATES.keys).each do |action|
172
+ m.template File.join('views', "#{view_template_format}", "#{action}.html.#{view_template_format}"),
173
+ File.join(VIEWS_PATH, controller_file_name, "#{action}.html.#{view_template_format}")
174
+
175
+ # View template for each partial - if not already copied.
176
+ (ACTION_VIEW_TEMPLATES[action] || []).each do |partial|
177
+ m.template File.join('views', "#{view_template_format}", "_#{partial}.html.#{view_template_format}"),
178
+ File.join(VIEWS_PATH, controller_file_name, "_#{partial}.html.#{view_template_format}")
179
+ end
180
+ end
181
+ end
182
+
183
+ # Builders.
184
+ unless options[:skip_builders]
185
+ m.directory File.join(VIEWS_PATH, controller_class_path, controller_file_name)
186
+ (actions & ACTION_FORMAT_BUILDERS.keys).each do |action|
187
+ (formats & ACTION_FORMAT_BUILDERS[action] || []).each do |format|
188
+ m.template File.join('views', 'builder', "#{action}.#{format}.builder"),
189
+ File.join(VIEWS_PATH, controller_file_name, "#{action}.#{format}.builder")
190
+ end
191
+ end
192
+ end
193
+
194
+ # Layout.
195
+ if options[:layout]
196
+ m.directory File.join(LAYOUTS_PATH)
197
+ m.template File.join('views', "#{view_template_format}", "layout.html.#{view_template_format}"),
198
+ File.join(LAYOUTS_PATH, "#{controller_file_name}.html.#{view_template_format}")
199
+ end
200
+
201
+ # Routes.
202
+ unless resource_route_exists?
203
+ # TODO: Override Rails default method to not generate route if it's already defined.
204
+ m.route_resources controller_file_name
205
+ end
206
+
207
+ # Models - use Rails default generator.
208
+ m.dependency 'dry_model', [name] + @args_for_model, options.merge(:collision => :skip)
209
+ end
210
+ end
211
+
212
+ ### Fixture/Factory Helpers.
213
+
214
+ def build_object
215
+ case options[:factory_framework]
216
+ when :factory_girl then
217
+ "Factory(:#{singular_name})"
218
+ when :machinist then
219
+ "#{class_name}.make"
220
+ when :object_daddy then
221
+ "#{class_name}.generate"
222
+ else #:fixtures
223
+ "#{table_name}(:basic)"
224
+ end
225
+ end
226
+
227
+ ### Link Helpers.
228
+
229
+ def collection_instance
230
+ "@#{collection_name}"
231
+ end
232
+
233
+ def resource_instance
234
+ "@#{singular_name}"
235
+ end
236
+
237
+ def index_path
238
+ "#{collection_name}_path"
239
+ end
240
+
241
+ def new_path
242
+ "new_#{singular_name}_path"
243
+ end
244
+
245
+ def show_path(object_name = resource_instance)
246
+ "#{singular_name}_path(#{object_name})"
247
+ end
248
+
249
+ def edit_path(object_name = resource_instance)
250
+ "edit_#{show_path(object_name)}"
251
+ end
252
+
253
+ def destroy_path(object_name = resource_instance)
254
+ "#{object_name}"
255
+ end
256
+
257
+ def index_url
258
+ "#{collection_name}_url"
259
+ end
260
+
261
+ def new_url
262
+ "new_#{singular_name}_url"
263
+ end
264
+
265
+ def show_url(object_name = resource_instance)
266
+ "#{singular_name}_url(#{object_name})"
267
+ end
268
+
269
+ def edit_url(object_name = resource_instance)
270
+ "edit_#{show_url(object_name)}"
271
+ end
272
+
273
+ def destroy_url(object_name = resource_instance)
274
+ "#{object_name}"
275
+ end
276
+
277
+ ### Feed Helpers.
278
+
279
+ def feed_link(format)
280
+ case format
281
+ when :atom then
282
+ ":href => #{plural_name}_url(:#{format}), :rel => 'self'"
283
+ when :rss then
284
+ "#{plural_name}_url(#{singular_name}, :#{format})"
285
+ end
286
+ end
287
+
288
+ def feed_entry_link(format)
289
+ case format
290
+ when :atom then
291
+ ":href => #{singular_name}_url(#{singular_name}, :#{format})"
292
+ when :rss then
293
+ "#{singular_name}_url(#{singular_name}, :#{format})"
294
+ end
295
+ end
296
+
297
+ def feed_date(format)
298
+ case format
299
+ when :atom then
300
+ "(#{collection_instance}.first.created_at rescue Time.now.utc).strftime('%Y-%m-%dT%H:%M:%SZ')"
301
+ when :rss then
302
+ "(#{collection_instance}.first.created_at rescue Time.now.utc).to_s(:rfc822)"
303
+ end
304
+ end
305
+
306
+ def feed_entry_date(format)
307
+ case format
308
+ when :atom then
309
+ "#{singular_name}.try(:updated_at).strftime('%Y-%m-%dT%H:%M:%SZ')"
310
+ when :rss then
311
+ "#{singular_name}.try(:updated_at).to_s(:rfc822)"
312
+ end
313
+ end
314
+
315
+ protected
316
+
317
+ def resource_route_exists?
318
+ route_exp = "map.resources :#{controller_file_name}"
319
+ File.read(ROUTES_FILE_PATH) =~ /(#{route_exp.strip}|#{route_exp.strip.tr('\'', '\"')})/
320
+ end
321
+
322
+ def assign_names!(name)
323
+ super(name)
324
+ @model_singular_name = @singular_name
325
+ @model_plural_name = @plural_name
326
+ @collection_name = options[:resourceful] ? RESOURCEFUL_COLLECTION_NAME : @model_plural_name
327
+ @singular_name = options[:resourceful] ? RESOURCEFUL_SINGULAR_NAME : @model_singular_name
328
+ @plural_name = options[:resourceful] ? RESOURCEFUL_SINGULAR_NAME.pluralize : @model_plural_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-search',
350
+ "Controller/View: Skip 'searchlogic' for collections in controllers and views. Requires gem 'searchlogic'.") do |v|
351
+ options[:search] = !v
352
+ end
353
+
354
+ opt.on('--skip-formtastic',
355
+ "View: Skip 'formtastic' style forms. Requires gem 'justinfrench-formtastic'.") do |v|
356
+ options[:formtastic] = !v
357
+ end
358
+
359
+ opt.on("--skip-controller-tests", "Controller: Skip generation of tests for controller.") do |v|
360
+ options[:skip_controller_tests] = v
361
+ end
362
+
363
+ opt.on('--skip-views', "View: Skip generation of views.") do |v|
364
+ options[:skip_views] = v
365
+ end
366
+
367
+ opt.on('--skip-builders', "View: Skip generation of builders.") do |v|
368
+ options[:skip_builders] = v
369
+ end
370
+
371
+ opt.on('--layout', "View: Generate layout.") do |v|
372
+ options[:layout] = v
373
+ end
374
+
375
+ opt.on('--skip-helper', "Helper: Skip generation of helpers.") do |v|
376
+ options[:skip_helpers] = v
377
+ end
378
+
379
+ ### MODEL
380
+
381
+ opt.separator ' '
382
+ opt.separator 'Model Options:'
383
+
384
+ opt.on("--skip-timestamps", "Model: Don't add timestamps to the migration file.") do |v|
385
+ options[:skip_timestamps] = v
386
+ end
387
+
388
+ opt.on("--skip-migration", "Model: Skip generation of migration file.") do |v|
389
+ options[:skip_migration] = v
390
+ end
391
+
392
+ opt.on("--skip-tests", "Model: Skip generation of tests.") do |v|
393
+ options[:skip_tests] = v
394
+ end
395
+
396
+ opt.on("--skip-controller tests", "Controller: Skip generation of tests for controller.") do |v|
397
+ options[:skip_controller_tests] = v
398
+ end
399
+
400
+ opt.separator ' '
401
+ end
402
+
403
+ def banner_args
404
+ [BANNER_ARGS, super].flatten.join(' ')
405
+ end
406
+
407
+ def banner_options
408
+ [BANNER_OPTIONS, super].flatten.join(' ')
409
+ end
410
+
411
+ def banner
412
+ [super, banner_args, banner_options].join(' ')
413
+ end
414
+
415
+ end