michel-dry_scaffold 0.3.5
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.textile +51 -0
- data/MIT-LICENSE +20 -0
- data/README.textile +461 -0
- data/Rakefile +48 -0
- data/TODO.textile +40 -0
- data/bin/dmodel +3 -0
- data/bin/dry_model +3 -0
- data/bin/dry_scaffold +3 -0
- data/bin/dscaffold +3 -0
- data/config/scaffold.yml +34 -0
- data/generators/dmodel/dmodel_generator.rb +15 -0
- data/generators/dry_model/USAGE +9 -0
- data/generators/dry_model/dry_model_generator.rb +134 -0
- data/generators/dry_model/prototypes/active_record_migration.rb +17 -0
- data/generators/dry_model/prototypes/active_record_model.rb +9 -0
- data/generators/dry_model/prototypes/fixture_data/active_record_fixtures.yml +3 -0
- data/generators/dry_model/prototypes/fixture_data/factory_girl_factories.rb +4 -0
- data/generators/dry_model/prototypes/fixture_data/machinist_blueprints.rb +8 -0
- data/generators/dry_model/prototypes/tests/rspec/unit_test.rb +9 -0
- data/generators/dry_model/prototypes/tests/shoulda/unit_test.rb +20 -0
- data/generators/dry_model/prototypes/tests/test_unit/unit_test.rb +15 -0
- data/generators/dry_model/templates/models/active_record_migration.rb +23 -0
- data/generators/dry_model/templates/models/active_record_model.rb +15 -0
- data/generators/dry_model/templates/models/fixture_data/active_record_fixtures.yml +6 -0
- data/generators/dry_model/templates/models/fixture_data/factory_girl_factories.rb +5 -0
- data/generators/dry_model/templates/models/fixture_data/machinist_blueprints.rb +9 -0
- data/generators/dry_model/templates/models/tests/rspec/unit_test.rb +11 -0
- data/generators/dry_model/templates/models/tests/shoulda/unit_test.rb +23 -0
- data/generators/dry_model/templates/models/tests/test_unit/unit_test.rb +17 -0
- data/generators/dry_scaffold/USAGE +11 -0
- data/generators/dry_scaffold/dry_scaffold_generator.rb +415 -0
- data/generators/dry_scaffold/prototypes/controllers/action_controller.rb +135 -0
- data/generators/dry_scaffold/prototypes/controllers/inherited_resources_controller.rb +25 -0
- data/generators/dry_scaffold/prototypes/controllers/tests/rspec/functional_test.rb +57 -0
- data/generators/dry_scaffold/prototypes/controllers/tests/shoulda/functional_test.rb +99 -0
- data/generators/dry_scaffold/prototypes/controllers/tests/test_unit/functional_test.rb +70 -0
- data/generators/dry_scaffold/prototypes/helpers/helper.rb +3 -0
- data/generators/dry_scaffold/prototypes/helpers/tests/rspec/unit_test.rb +9 -0
- data/generators/dry_scaffold/prototypes/helpers/tests/shoulda/unit_test.rb +9 -0
- data/generators/dry_scaffold/prototypes/helpers/tests/test_unit/unit_test.rb +9 -0
- data/generators/dry_scaffold/prototypes/views/builder/index.atom.builder +20 -0
- data/generators/dry_scaffold/prototypes/views/builder/index.rss.builder +21 -0
- data/generators/dry_scaffold/prototypes/views/haml/_form.html.haml +3 -0
- data/generators/dry_scaffold/prototypes/views/haml/_item.html.haml +9 -0
- data/generators/dry_scaffold/prototypes/views/haml/edit.html.haml +10 -0
- data/generators/dry_scaffold/prototypes/views/haml/index.html.haml +17 -0
- data/generators/dry_scaffold/prototypes/views/haml/layout.html.haml +18 -0
- data/generators/dry_scaffold/prototypes/views/haml/new.html.haml +10 -0
- data/generators/dry_scaffold/prototypes/views/haml/show.html.haml +13 -0
- data/generators/dry_scaffold/templates/controllers/action_controller.rb +250 -0
- data/generators/dry_scaffold/templates/controllers/inherited_resources_controller.rb +36 -0
- data/generators/dry_scaffold/templates/controllers/tests/rspec/functional_test.rb +85 -0
- data/generators/dry_scaffold/templates/controllers/tests/shoulda/functional_test.rb +90 -0
- data/generators/dry_scaffold/templates/controllers/tests/test_unit/functional_test.rb +87 -0
- data/generators/dry_scaffold/templates/helpers/helper.rb +3 -0
- data/generators/dry_scaffold/templates/helpers/tests/rspec/unit_test.rb +9 -0
- data/generators/dry_scaffold/templates/helpers/tests/shoulda/unit_test.rb +9 -0
- data/generators/dry_scaffold/templates/helpers/tests/test_unit/unit_test.rb +9 -0
- data/generators/dry_scaffold/templates/views/builder/index.atom.builder +20 -0
- data/generators/dry_scaffold/templates/views/builder/index.rss.builder +21 -0
- data/generators/dry_scaffold/templates/views/haml/_form.html.haml +13 -0
- data/generators/dry_scaffold/templates/views/haml/_item.html.haml +10 -0
- data/generators/dry_scaffold/templates/views/haml/edit.html.haml +18 -0
- data/generators/dry_scaffold/templates/views/haml/index.html.haml +38 -0
- data/generators/dry_scaffold/templates/views/haml/layout.html.haml +19 -0
- data/generators/dry_scaffold/templates/views/haml/new.html.haml +18 -0
- data/generators/dry_scaffold/templates/views/haml/show.html.haml +13 -0
- data/generators/dscaffold/dscaffold_generator.rb +15 -0
- data/lib/dry_generator.rb +197 -0
- data/lib/dry_scaffold/tasks.rb +5 -0
- data/lib/setup_helper.rb +36 -0
- data/rails/init.rb +3 -0
- data/tasks/dry_scaffold.rake +95 -0
- metadata +132 -0
@@ -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,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
|