grimen-dry_scaffold 0.2.6 → 0.3.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.
- data/CHANGELOG.textile +6 -0
- data/README.textile +26 -17
- data/TODO.textile +43 -6
- data/config/scaffold.yml +14 -6
- data/generators/dry_model/USAGE +2 -5
- data/generators/dry_model/dry_model_generator.rb +68 -145
- data/generators/dry_model/prototypes/active_record_migration.rb +1 -1
- data/generators/dry_model/prototypes/active_record_model.rb +2 -2
- 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/shoulda/unit_test.rb +20 -0
- data/generators/dry_model/prototypes/tests/test_unit/unit_test.rb +8 -2
- data/generators/dry_model/templates/models/active_record_migration.rb +2 -2
- data/generators/dry_model/templates/models/{test_data → fixture_data}/active_record_fixtures.yml +1 -1
- 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/shoulda/unit_test.rb +23 -0
- data/generators/dry_model/templates/models/tests/test_unit/unit_test.rb +10 -2
- data/generators/dry_scaffold/USAGE +4 -5
- data/generators/dry_scaffold/dry_scaffold_generator.rb +145 -151
- data/generators/dry_scaffold/prototypes/controllers/action_controller.rb +53 -52
- data/generators/dry_scaffold/prototypes/controllers/inherited_resources_controller.rb +5 -4
- data/generators/dry_scaffold/prototypes/controllers/tests/shoulda/functional_test.rb +107 -0
- data/generators/dry_scaffold/prototypes/controllers/tests/test_unit/functional_test.rb +76 -0
- data/generators/dry_scaffold/prototypes/helpers/helper.rb +1 -1
- 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 +6 -2
- data/generators/dry_scaffold/prototypes/views/builder/index.atom.builder +9 -9
- data/generators/dry_scaffold/prototypes/views/builder/index.rss.builder +7 -7
- data/generators/dry_scaffold/prototypes/views/haml/_item.html.haml +6 -6
- data/generators/dry_scaffold/prototypes/views/haml/edit.html.haml +3 -3
- data/generators/dry_scaffold/prototypes/views/haml/index.html.haml +5 -5
- data/generators/dry_scaffold/prototypes/views/haml/layout.html.haml +1 -2
- data/generators/dry_scaffold/prototypes/views/haml/new.html.haml +3 -3
- data/generators/dry_scaffold/prototypes/views/haml/show.html.haml +6 -6
- data/generators/dry_scaffold/templates/controllers/action_controller.rb +7 -6
- data/generators/dry_scaffold/templates/controllers/inherited_resources_controller.rb +2 -2
- 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 +46 -37
- 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 +4 -0
- data/generators/dry_scaffold/templates/views/haml/_item.html.haml +3 -3
- data/generators/dry_scaffold/templates/views/haml/edit.html.haml +1 -1
- data/generators/dry_scaffold/templates/views/haml/index.html.haml +1 -1
- data/generators/dry_scaffold/templates/views/haml/new.html.haml +1 -1
- data/generators/dry_scaffold/templates/views/haml/show.html.haml +2 -2
- data/lib/dry_generator.rb +176 -0
- data/tasks/dry_scaffold.rake +5 -1
- metadata +16 -9
- data/generators/dry_model/prototypes/test_data/active_record_fixtures.yml +0 -3
- data/generators/dry_model/prototypes/test_data/factory_girl_factories.rb +0 -4
- data/generators/dry_model/prototypes/test_data/machinist_factories.rb +0 -8
- data/generators/dry_model/templates/models/test_data/factory_girl_factories.rb +0 -5
- data/generators/dry_model/templates/models/test_data/machinist_factories.rb +0 -9
- data/generators/dry_scaffold/prototypes/controllers/tests/unit_test/functional_test.rb +0 -64
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class DuckTest < ActiveRecord::TestCase
|
4
|
+
|
5
|
+
fixtures :ducks
|
6
|
+
|
7
|
+
should_have_db_column :name
|
8
|
+
should_have_db_column :description
|
9
|
+
|
10
|
+
context "A test context" do
|
11
|
+
setup do
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
should 'test something' do
|
16
|
+
assert true
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
class <%= migration_name %> < ActiveRecord::Migration
|
2
2
|
def self.up
|
3
|
-
create_table :<%= table_name
|
3
|
+
create_table :<%= table_name %> do |t|
|
4
4
|
<% attributes.each do |attribute| -%>
|
5
5
|
t.<%= attribute.type %> :<%= attribute.name %>
|
6
6
|
<% end -%>
|
@@ -10,7 +10,7 @@ class <%= migration_name %> < ActiveRecord::Migration
|
|
10
10
|
<% end -%>
|
11
11
|
end
|
12
12
|
<% unless indexes.blank? -%>
|
13
|
-
|
13
|
+
|
14
14
|
<% indexes.each do |index| -%>
|
15
15
|
add_index :<%= table_name %>, <%= index.is_a?(Array) ? "[:#{index.join(', :')}]" : ":#{index}" %>
|
16
16
|
<% 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
|
@@ -1,8 +1,16 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
class <%= class_name %>Test <
|
3
|
+
class <%= class_name %>Test < ActiveRecord::TestCase
|
4
4
|
|
5
|
-
|
5
|
+
<% if options[:fixtures] -%>
|
6
|
+
fixtures :<%= plural_name %>
|
7
|
+
|
8
|
+
<% end -%>
|
9
|
+
setup do
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
test 'something' do
|
6
14
|
assert true
|
7
15
|
end
|
8
16
|
|
@@ -5,8 +5,7 @@ DESCRIPTION
|
|
5
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
6
|
|
7
7
|
EXAMPLE
|
8
|
-
./script/generate dry_scaffold
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
./script/generate dscaffold ...
|
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
|
@@ -1,41 +1,33 @@
|
|
1
|
-
require '
|
2
|
-
|
3
|
-
begin
|
4
|
-
require lib
|
5
|
-
rescue MissingSourceFile
|
6
|
-
eval("#{lib.upcase} = #{false}")
|
7
|
-
else
|
8
|
-
eval("#{lib.upcase} = #{true}")
|
9
|
-
end
|
10
|
-
end
|
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'))
|
11
3
|
|
12
|
-
class DryScaffoldGenerator <
|
13
|
-
|
14
|
-
# Load defaults from config file - default or custom.
|
15
|
-
begin
|
16
|
-
default_config_file = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'config', 'scaffold.yml'))
|
17
|
-
custom_config_file = File.expand_path(File.join(Rails.root, 'config', 'scaffold.yml'))
|
18
|
-
config_file = File.join(File.exist?(custom_config_file) ? custom_config_file : default_config_file)
|
19
|
-
config = YAML::load(File.open(config_file))
|
20
|
-
CONFIG_ARGS = config['dry_scaffold']['args'] rescue nil
|
21
|
-
CONFIG_OPTIONS = config['dry_scaffold']['options'] rescue nil
|
22
|
-
end
|
4
|
+
class DryScaffoldGenerator < DryGenerator
|
23
5
|
|
24
|
-
|
25
|
-
|
26
|
-
:
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
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
|
38
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
|
+
|
39
31
|
# Formats.
|
40
32
|
DEFAULT_RESPOND_TO_FORMATS = [:html, :xml, :json].freeze
|
41
33
|
ENHANCED_RESPOND_TO_FORMATS = [:yml, :yaml, :txt, :text, :atom, :rss].freeze
|
@@ -49,21 +41,9 @@ class DryScaffoldGenerator < Rails::Generator::NamedBase
|
|
49
41
|
DEFAULT_CONTROLLER_ACTIONS = (DEFAULT_COLLECTION_ACTIONS + DEFAULT_MEMBER_ACTIONS)
|
50
42
|
|
51
43
|
DEFAULT_VIEW_TEMPLATE_FORMAT = :haml
|
52
|
-
DEFAULT_TEST_FRAMEWORK = :test_unit
|
53
44
|
|
54
|
-
|
55
|
-
|
56
|
-
VIEWS_PATH = File.join('app', 'views').freeze
|
57
|
-
LAYOUTS_PATH = File.join(VIEWS_PATH, 'layouts').freeze
|
58
|
-
MODELS_PATH = File.join('app', 'models').freeze
|
59
|
-
FUNCTIONAL_TESTS_PATH = File.join('test', 'functional').freeze
|
60
|
-
UNIT_TESTS_PATH = File.join('test', 'unit').freeze
|
61
|
-
ROUTES_FILE_PATH = File.join(Rails.root, 'config', 'routes.rb').freeze
|
62
|
-
|
63
|
-
RESOURCEFUL_COLLECTION_NAME = 'collection'.freeze
|
64
|
-
RESOURCEFUL_SINGULAR_NAME = 'resource'.freeze
|
65
|
-
|
66
|
-
NON_ATTR_ARG_KEY_PREFIX = '_'.freeze
|
45
|
+
RESOURCEFUL_COLLECTION_NAME = 'collection'.freeze
|
46
|
+
RESOURCEFUL_SINGULAR_NAME = 'resource'.freeze
|
67
47
|
|
68
48
|
# :{action} => [:{partial}, ...]
|
69
49
|
ACTION_VIEW_TEMPLATES = {
|
@@ -72,7 +52,7 @@ class DryScaffoldGenerator < Rails::Generator::NamedBase
|
|
72
52
|
:new => [:form],
|
73
53
|
:edit => [:form]
|
74
54
|
}.freeze
|
75
|
-
|
55
|
+
|
76
56
|
ACTION_FORMAT_BUILDERS = {
|
77
57
|
:index => [:atom, :rss]
|
78
58
|
}
|
@@ -90,7 +70,6 @@ class DryScaffoldGenerator < Rails::Generator::NamedBase
|
|
90
70
|
:model_singular_name,
|
91
71
|
:model_plural_name,
|
92
72
|
:view_template_format,
|
93
|
-
:test_framework,
|
94
73
|
:actions,
|
95
74
|
:formats,
|
96
75
|
:config
|
@@ -99,7 +78,7 @@ class DryScaffoldGenerator < Rails::Generator::NamedBase
|
|
99
78
|
alias_method :controller_table_name, :controller_plural_name
|
100
79
|
|
101
80
|
def initialize(runtime_args, runtime_options = {})
|
102
|
-
super
|
81
|
+
super(runtime_args, runtime_options)
|
103
82
|
|
104
83
|
@controller_name = @name.pluralize
|
105
84
|
base_name, @controller_class_path, @controller_file_path, @controller_class_nesting, @controller_class_nesting_depth = extract_modules(@controller_name)
|
@@ -112,8 +91,7 @@ class DryScaffoldGenerator < Rails::Generator::NamedBase
|
|
112
91
|
@controller_class_name = "#{@controller_class_nesting}::#{@controller_class_name_without_nesting}"
|
113
92
|
end
|
114
93
|
|
115
|
-
@view_template_format = DEFAULT_VIEW_TEMPLATE_FORMAT
|
116
|
-
@test_framework = DEFAULT_TEST_FRAMEWORK
|
94
|
+
@view_template_format = options[:view_template_format] || DEFAULT_VIEW_TEMPLATE_FORMAT
|
117
95
|
|
118
96
|
@attributes ||= []
|
119
97
|
@args_for_model ||= []
|
@@ -123,7 +101,7 @@ class DryScaffoldGenerator < Rails::Generator::NamedBase
|
|
123
101
|
arg_entities = arg.split(':')
|
124
102
|
if arg =~ /^#{NON_ATTR_ARG_KEY_PREFIX}/
|
125
103
|
if arg =~ /^#{NON_ATTR_ARG_KEY_PREFIX}action/
|
126
|
-
# Replace quantifiers with default actions
|
104
|
+
# Replace quantifiers with default actions.
|
127
105
|
arg_entities[1].gsub!(/\*/, DEFAULT_CONTROLLER_ACTIONS.join(','))
|
128
106
|
arg_entities[1].gsub!(/new\+/, [:new, :create].join(','))
|
129
107
|
arg_entities[1].gsub!(/edit\+/, [:edit, :update].join(','))
|
@@ -131,7 +109,7 @@ class DryScaffoldGenerator < Rails::Generator::NamedBase
|
|
131
109
|
arg_actions = arg_entities[1].split(',').compact.uniq
|
132
110
|
@actions = arg_actions.collect { |action| action.downcase.to_sym }
|
133
111
|
elsif arg =~ /^#{NON_ATTR_ARG_KEY_PREFIX}(format|respond_to)/
|
134
|
-
# Replace quantifiers with default respond_to-formats
|
112
|
+
# Replace quantifiers with default respond_to-formats.
|
135
113
|
arg_entities[1].gsub!(/\*/, DEFAULT_RESPOND_TO_FORMATS.join(','))
|
136
114
|
|
137
115
|
arg_formats = arg_entities[1].split(',').compact.uniq
|
@@ -156,38 +134,38 @@ class DryScaffoldGenerator < Rails::Generator::NamedBase
|
|
156
134
|
m.class_collisions "#{controller_class_name}Controller", "#{controller_class_name}ControllerTest"
|
157
135
|
m.class_collisions "#{controller_class_name}Helper", "#{controller_class_name}HelperTest"
|
158
136
|
|
159
|
-
# Directories.
|
160
|
-
m.directory File.join(CONTROLLERS_PATH, controller_class_path)
|
161
|
-
m.directory File.join(HELPERS_PATH, controller_class_path) unless options[:skip_helpers]
|
162
|
-
m.directory File.join(VIEWS_PATH, controller_class_path, controller_file_name) unless options[:skip_views]
|
163
|
-
m.directory File.join(FUNCTIONAL_TESTS_PATH, controller_class_path) unless options[:skip_tests]
|
164
|
-
m.directory File.join(UNIT_TESTS_PATH, 'helpers', controller_class_path) unless options[:skip_tests] || options[:skip_helpers]
|
165
|
-
|
166
137
|
# Controllers.
|
167
138
|
controller_template = options[:resourceful] ? 'inherited_resources' : 'action'
|
139
|
+
m.directory File.join(CONTROLLERS_PATH, controller_class_path)
|
168
140
|
m.template File.join('controllers', "#{controller_template}_controller.rb"),
|
169
141
|
File.join(CONTROLLERS_PATH, controller_class_path, "#{controller_file_name}_controller.rb")
|
170
142
|
|
171
143
|
# Controller Tests.
|
172
144
|
unless options[:skip_tests]
|
145
|
+
controller_tests_path = File.join(TEST_PATHS[test_framework], 'functional')
|
146
|
+
m.directory File.join(controller_tests_path, controller_class_path)
|
173
147
|
m.template File.join('controllers', 'tests', "#{test_framework}", 'functional_test.rb'),
|
174
|
-
File.join(
|
148
|
+
File.join(controller_tests_path, controller_class_path, "#{controller_file_name}_controller_test.rb")
|
175
149
|
end
|
176
150
|
|
177
151
|
# Helpers.
|
178
152
|
unless options[:skip_helpers]
|
153
|
+
m.directory File.join(HELPERS_PATH, controller_class_path)
|
179
154
|
m.template File.join('helpers', 'helper.rb'),
|
180
155
|
File.join(HELPERS_PATH, controller_class_path, "#{controller_file_name}_helper.rb")
|
181
156
|
|
182
157
|
# Helper Tests
|
183
158
|
unless options[:skip_tests]
|
159
|
+
helper_tests_path = File.join(TEST_PATHS[test_framework], 'unit', 'helpers')
|
160
|
+
m.directory File.join(helper_tests_path, controller_class_path)
|
184
161
|
m.template File.join('helpers', 'tests', "#{test_framework}", 'unit_test.rb'),
|
185
|
-
File.join(
|
162
|
+
File.join(helper_tests_path, controller_class_path, "#{controller_file_name}_helper_test.rb")
|
186
163
|
end
|
187
164
|
end
|
188
165
|
|
189
166
|
# Views.
|
190
167
|
unless options[:skip_views]
|
168
|
+
m.directory File.join(VIEWS_PATH, controller_class_path, controller_file_name)
|
191
169
|
# View template for each action.
|
192
170
|
(actions & ACTION_VIEW_TEMPLATES.keys).each do |action|
|
193
171
|
m.template File.join('views', "#{view_template_format}", "#{action}.html.#{view_template_format}"),
|
@@ -203,6 +181,7 @@ class DryScaffoldGenerator < Rails::Generator::NamedBase
|
|
203
181
|
|
204
182
|
# Builders.
|
205
183
|
unless options[:skip_builders]
|
184
|
+
m.directory File.join(VIEWS_PATH, controller_class_path, controller_file_name)
|
206
185
|
(actions & ACTION_FORMAT_BUILDERS.keys).each do |action|
|
207
186
|
(formats & ACTION_FORMAT_BUILDERS[action] || []).each do |format|
|
208
187
|
m.template File.join('views', 'builder', "#{action}.#{format}.builder"),
|
@@ -213,12 +192,14 @@ class DryScaffoldGenerator < Rails::Generator::NamedBase
|
|
213
192
|
|
214
193
|
# Layout.
|
215
194
|
if options[:layout]
|
195
|
+
m.directory File.join(LAYOUTS_PATH)
|
216
196
|
m.template File.join('views', "#{view_template_format}", "layout.html.#{view_template_format}"),
|
217
197
|
File.join(LAYOUTS_PATH, "#{controller_file_name}.html.#{view_template_format}")
|
218
198
|
end
|
219
199
|
|
220
200
|
# Routes.
|
221
201
|
unless resource_route_exists?
|
202
|
+
# TODO: Override Rails default method to not generate route if it's already defined.
|
222
203
|
m.route_resources controller_file_name
|
223
204
|
end
|
224
205
|
|
@@ -227,6 +208,23 @@ class DryScaffoldGenerator < Rails::Generator::NamedBase
|
|
227
208
|
end
|
228
209
|
end
|
229
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
|
+
"#{plural_name}(:basic)"
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
### Link Helpers.
|
227
|
+
|
230
228
|
def collection_instance
|
231
229
|
"@#{collection_name}"
|
232
230
|
end
|
@@ -235,59 +233,81 @@ class DryScaffoldGenerator < Rails::Generator::NamedBase
|
|
235
233
|
"@#{singular_name}"
|
236
234
|
end
|
237
235
|
|
238
|
-
def
|
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
|
239
257
|
"#{collection_name}_url"
|
240
258
|
end
|
241
259
|
|
242
|
-
def
|
260
|
+
def new_url
|
243
261
|
"new_#{singular_name}_url"
|
244
262
|
end
|
245
263
|
|
246
|
-
def
|
264
|
+
def show_url(object_name = resource_instance)
|
247
265
|
"#{singular_name}_url(#{object_name})"
|
248
266
|
end
|
249
267
|
|
250
|
-
def
|
251
|
-
"edit_#{
|
268
|
+
def edit_url(object_name = resource_instance)
|
269
|
+
"edit_#{show_url(object_name)}"
|
252
270
|
end
|
253
271
|
|
254
|
-
def
|
272
|
+
def destroy_url(object_name = resource_instance)
|
255
273
|
"#{object_name}"
|
256
274
|
end
|
257
275
|
|
276
|
+
### Feed Helpers.
|
277
|
+
|
258
278
|
def feed_link(format)
|
259
279
|
case format
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
280
|
+
when :atom then
|
281
|
+
":href => #{plural_name}_url(:#{format}), :rel => 'self'"
|
282
|
+
when :rss then
|
283
|
+
"#{plural_name}_url(#{singular_name}, :#{format})"
|
264
284
|
end
|
265
285
|
end
|
266
286
|
|
267
287
|
def feed_entry_link(format)
|
268
288
|
case format
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
289
|
+
when :atom then
|
290
|
+
":href => #{singular_name}_url(#{singular_name}, :#{format})"
|
291
|
+
when :rss then
|
292
|
+
"#{singular_name}_url(#{singular_name}, :#{format})"
|
273
293
|
end
|
274
294
|
end
|
275
295
|
|
276
296
|
def feed_date(format)
|
277
297
|
case format
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
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)"
|
282
302
|
end
|
283
303
|
end
|
284
304
|
|
285
305
|
def feed_entry_date(format)
|
286
306
|
case format
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
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)"
|
291
311
|
end
|
292
312
|
end
|
293
313
|
|
@@ -298,12 +318,8 @@ class DryScaffoldGenerator < Rails::Generator::NamedBase
|
|
298
318
|
File.read(ROUTES_FILE_PATH) =~ /(#{route_exp.strip}|#{route_exp.strip.tr('\'', '\"')})/
|
299
319
|
end
|
300
320
|
|
301
|
-
def symbol_array_to_expression(array)
|
302
|
-
":#{array.compact.join(', :')}" if array.present?
|
303
|
-
end
|
304
|
-
|
305
321
|
def assign_names!(name)
|
306
|
-
super
|
322
|
+
super(name)
|
307
323
|
@model_singular_name = @singular_name
|
308
324
|
@model_plural_name = @plural_name
|
309
325
|
@collection_name = options[:resourceful] ? RESOURCEFUL_COLLECTION_NAME : @model_plural_name
|
@@ -312,96 +328,74 @@ class DryScaffoldGenerator < Rails::Generator::NamedBase
|
|
312
328
|
end
|
313
329
|
|
314
330
|
def add_options!(opt)
|
315
|
-
opt
|
316
|
-
opt.separator 'Options:'
|
331
|
+
super(opt)
|
317
332
|
|
318
|
-
###
|
333
|
+
### CONTROLLER + VIEW + HELPER
|
319
334
|
|
320
|
-
opt.
|
321
|
-
|
322
|
-
options[:pagination] = !v
|
323
|
-
end
|
335
|
+
opt.separator ' '
|
336
|
+
opt.separator 'Scaffold Options:'
|
324
337
|
|
325
338
|
opt.on('--skip-resourceful',
|
326
|
-
"Skip 'inherited_resources' style controllers and views
|
339
|
+
"Controller: Skip 'inherited_resources' style controllers and views. Requires gem 'josevalim-inherited_resources'.") do |v|
|
327
340
|
options[:resourceful] = !v
|
328
341
|
end
|
329
342
|
|
330
|
-
opt.on('--skip-
|
331
|
-
"Skip '
|
332
|
-
options[:
|
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
|
333
346
|
end
|
334
347
|
|
335
|
-
opt.on('--
|
336
|
-
|
348
|
+
opt.on('--skip-formtastic',
|
349
|
+
"View: Skip 'formtastic' style forms. Requires gem 'justinfrench-formtastic'.") do |v|
|
350
|
+
options[:formtastic] = !v
|
337
351
|
end
|
338
352
|
|
339
|
-
opt.on('--skip-views', "Skip generation of views.") do |v|
|
353
|
+
opt.on('--skip-views', "View: Skip generation of views.") do |v|
|
340
354
|
options[:skip_views] = v
|
341
355
|
end
|
342
356
|
|
343
|
-
opt.on('--skip-
|
344
|
-
options[:skip_helpers] = v
|
345
|
-
end
|
346
|
-
|
347
|
-
opt.on('--skip-builders', "Skip generation of helpers.") do |v|
|
357
|
+
opt.on('--skip-builders', "View: Skip generation of builders.") do |v|
|
348
358
|
options[:skip_builders] = v
|
349
359
|
end
|
350
360
|
|
351
|
-
|
352
|
-
|
353
|
-
opt.on('--skip-tests', "Skip generation of tests.") do |v|
|
354
|
-
options[:skip_tests] = v
|
355
|
-
end
|
356
|
-
|
357
|
-
### MODELS ONLY
|
358
|
-
|
359
|
-
opt.on('--fixtures', "Model: Generate fixtures.") do |v|
|
360
|
-
options[:fixtures] = v
|
361
|
+
opt.on('--layout', "View: Generate layout.") do |v|
|
362
|
+
options[:layout] = v
|
361
363
|
end
|
362
364
|
|
363
|
-
opt.on('--
|
364
|
-
options[:
|
365
|
+
opt.on('--skip-helper', "Helper: Skip generation of helpers.") do |v|
|
366
|
+
options[:skip_helpers] = v
|
365
367
|
end
|
366
368
|
|
367
|
-
|
368
|
-
options[:machinist] = v
|
369
|
-
end
|
369
|
+
### MODEL
|
370
370
|
|
371
|
-
opt.
|
372
|
-
|
373
|
-
end
|
371
|
+
opt.separator ' '
|
372
|
+
opt.separator 'Model Options:'
|
374
373
|
|
375
|
-
opt.on(
|
374
|
+
opt.on("--skip-timestamps", "Model: Don't add timestamps to the migration file.") do |v|
|
376
375
|
options[:skip_timestamps] = v
|
377
376
|
end
|
378
377
|
|
379
|
-
opt.on(
|
378
|
+
opt.on("--skip-migration", "Model: Skip generation of migration file.") do |v|
|
380
379
|
options[:skip_migration] = v
|
381
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(' ')
|
382
395
|
end
|
383
396
|
|
384
397
|
def banner
|
385
|
-
[
|
386
|
-
"[field:type field:type ...]",
|
387
|
-
"[_actions:new,create,...]",
|
388
|
-
"[_formats:html,json,...]",
|
389
|
-
"[_indexes:field,field+field,field,...]",
|
390
|
-
"[--skip-pagination]",
|
391
|
-
"[--skip-resourceful]",
|
392
|
-
"[--skip-formtastic]",
|
393
|
-
"[--skip-views]",
|
394
|
-
"[--skip-helpers]",
|
395
|
-
"[--skip-tests]",
|
396
|
-
"[--skip-builders]",
|
397
|
-
"[--layout]",
|
398
|
-
"[--fixtures]",
|
399
|
-
"[--factory_girl]",
|
400
|
-
"[--machinist]",
|
401
|
-
"[--object_daddy]",
|
402
|
-
"[--skip-timestamps]",
|
403
|
-
"[--skip-migration]"
|
404
|
-
].join(' ')
|
398
|
+
[super, banner_args, banner_options].join(' ')
|
405
399
|
end
|
406
400
|
|
407
401
|
end
|