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.
Files changed (56) hide show
  1. data/CHANGELOG.textile +6 -0
  2. data/README.textile +26 -17
  3. data/TODO.textile +43 -6
  4. data/config/scaffold.yml +14 -6
  5. data/generators/dry_model/USAGE +2 -5
  6. data/generators/dry_model/dry_model_generator.rb +68 -145
  7. data/generators/dry_model/prototypes/active_record_migration.rb +1 -1
  8. data/generators/dry_model/prototypes/active_record_model.rb +2 -2
  9. data/generators/dry_model/prototypes/fixture_data/active_record_fixtures.yml +3 -0
  10. data/generators/dry_model/prototypes/fixture_data/factory_girl_factories.rb +4 -0
  11. data/generators/dry_model/prototypes/fixture_data/machinist_blueprints.rb +8 -0
  12. data/generators/dry_model/prototypes/tests/shoulda/unit_test.rb +20 -0
  13. data/generators/dry_model/prototypes/tests/test_unit/unit_test.rb +8 -2
  14. data/generators/dry_model/templates/models/active_record_migration.rb +2 -2
  15. data/generators/dry_model/templates/models/{test_data → fixture_data}/active_record_fixtures.yml +1 -1
  16. data/generators/dry_model/templates/models/fixture_data/factory_girl_factories.rb +5 -0
  17. data/generators/dry_model/templates/models/fixture_data/machinist_blueprints.rb +9 -0
  18. data/generators/dry_model/templates/models/tests/shoulda/unit_test.rb +23 -0
  19. data/generators/dry_model/templates/models/tests/test_unit/unit_test.rb +10 -2
  20. data/generators/dry_scaffold/USAGE +4 -5
  21. data/generators/dry_scaffold/dry_scaffold_generator.rb +145 -151
  22. data/generators/dry_scaffold/prototypes/controllers/action_controller.rb +53 -52
  23. data/generators/dry_scaffold/prototypes/controllers/inherited_resources_controller.rb +5 -4
  24. data/generators/dry_scaffold/prototypes/controllers/tests/shoulda/functional_test.rb +107 -0
  25. data/generators/dry_scaffold/prototypes/controllers/tests/test_unit/functional_test.rb +76 -0
  26. data/generators/dry_scaffold/prototypes/helpers/helper.rb +1 -1
  27. data/generators/dry_scaffold/prototypes/helpers/tests/shoulda/unit_test.rb +9 -0
  28. data/generators/dry_scaffold/prototypes/helpers/tests/test_unit/unit_test.rb +6 -2
  29. data/generators/dry_scaffold/prototypes/views/builder/index.atom.builder +9 -9
  30. data/generators/dry_scaffold/prototypes/views/builder/index.rss.builder +7 -7
  31. data/generators/dry_scaffold/prototypes/views/haml/_item.html.haml +6 -6
  32. data/generators/dry_scaffold/prototypes/views/haml/edit.html.haml +3 -3
  33. data/generators/dry_scaffold/prototypes/views/haml/index.html.haml +5 -5
  34. data/generators/dry_scaffold/prototypes/views/haml/layout.html.haml +1 -2
  35. data/generators/dry_scaffold/prototypes/views/haml/new.html.haml +3 -3
  36. data/generators/dry_scaffold/prototypes/views/haml/show.html.haml +6 -6
  37. data/generators/dry_scaffold/templates/controllers/action_controller.rb +7 -6
  38. data/generators/dry_scaffold/templates/controllers/inherited_resources_controller.rb +2 -2
  39. data/generators/dry_scaffold/templates/controllers/tests/shoulda/functional_test.rb +90 -0
  40. data/generators/dry_scaffold/templates/controllers/tests/test_unit/functional_test.rb +46 -37
  41. data/generators/dry_scaffold/templates/helpers/tests/shoulda/unit_test.rb +9 -0
  42. data/generators/dry_scaffold/templates/helpers/tests/test_unit/unit_test.rb +4 -0
  43. data/generators/dry_scaffold/templates/views/haml/_item.html.haml +3 -3
  44. data/generators/dry_scaffold/templates/views/haml/edit.html.haml +1 -1
  45. data/generators/dry_scaffold/templates/views/haml/index.html.haml +1 -1
  46. data/generators/dry_scaffold/templates/views/haml/new.html.haml +1 -1
  47. data/generators/dry_scaffold/templates/views/haml/show.html.haml +2 -2
  48. data/lib/dry_generator.rb +176 -0
  49. data/tasks/dry_scaffold.rake +5 -1
  50. metadata +16 -9
  51. data/generators/dry_model/prototypes/test_data/active_record_fixtures.yml +0 -3
  52. data/generators/dry_model/prototypes/test_data/factory_girl_factories.rb +0 -4
  53. data/generators/dry_model/prototypes/test_data/machinist_factories.rb +0 -8
  54. data/generators/dry_model/templates/models/test_data/factory_girl_factories.rb +0 -5
  55. data/generators/dry_model/templates/models/test_data/machinist_factories.rb +0 -9
  56. data/generators/dry_scaffold/prototypes/controllers/tests/unit_test/functional_test.rb +0 -64
@@ -1,4 +1,4 @@
1
- class CreateResources < ActiveRecord::Migration
1
+ class CreateDucks < ActiveRecord::Migration
2
2
  def self.up
3
3
  create_table :resources, :force => true do |t|
4
4
  t.string :name
@@ -1,6 +1,6 @@
1
- class Resource < ActiveRecord::Base
1
+ class Duck < ActiveRecord::Base
2
2
 
3
- belongs_to :user
3
+ belongs_to :owner
4
4
 
5
5
  # object_daddy
6
6
  generator_for(:name) { "AString" }
@@ -0,0 +1,3 @@
1
+ default:
2
+ name: "AString"
3
+ description: "SomeText"
@@ -0,0 +1,4 @@
1
+ Factory.define :duck, :class => Duck do |f|
2
+ f.name "AString"
3
+ f.description "SomeText"
4
+ end
@@ -0,0 +1,8 @@
1
+ Sham.define do
2
+
3
+ end
4
+
5
+ Resource.blueprint do
6
+ name { "AString" }
7
+ description { "SomeText" }
8
+ end
@@ -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,8 +1,14 @@
1
1
  require 'test_helper'
2
2
 
3
- class ResourceTest < ActiveSupport::TestCase
3
+ class DuckTest < ActiveRecord::TestCase
4
4
 
5
- test "something" do
5
+ fixtures :ducks
6
+
7
+ setup do
8
+
9
+ end
10
+
11
+ test 'something' do
6
12
  assert true
7
13
  end
8
14
 
@@ -1,6 +1,6 @@
1
1
  class <%= migration_name %> < ActiveRecord::Migration
2
2
  def self.up
3
- create_table :<%= table_name %>, :force => true do |t|
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 -%>
@@ -1,5 +1,5 @@
1
1
  <% unless attributes.empty? -%>
2
- <%= singular_name %>_1:
2
+ basic:
3
3
  <% attributes.each do |attribute| -%>
4
4
  <%= attribute.name %>: <%= attribute.default_for_fixture %>
5
5
  <% 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,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 < ActiveSupport::TestCase
3
+ class <%= class_name %>Test < ActiveRecord::TestCase
4
4
 
5
- test "something" do
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 ModelName [attribute:type attribute:type] [_actions:new,create,...] [_formats:html,json,...] [--skip-pagination] [--skip-resourceful] [--skip-formtastic] [--skip-views] [--skip-helpers] [--skip-tests] [--skip-builders] [--layout]
9
-
10
- ...or the shortcut version:
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 'rubygems'
2
- %w(will_paginate formtastic inherited_resources).each do |lib|
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 < Rails::Generator::NamedBase
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
- DEFAULT_ARGS = {
25
- :actions => (CONFIG_ARGS['actions'].split(',').compact.uniq.collect { |v| v.downcase.to_sym } rescue nil),
26
- :formats => (CONFIG_ARGS['formats'].split(',').compact.uniq.collect { |v| v.downcase.to_sym } rescue nil)
27
- }
28
-
29
- DEFAULT_OPTIONS = {
30
- :resourceful => CONFIG_OPTIONS['resourceful'] || INHERITED_RESOURCES,
31
- :formtastic => CONFIG_OPTIONS['formtastic'] || FORMTASTIC,
32
- :pagination => CONFIG_OPTIONS['pagination'] || WILL_PAGINATE,
33
- :skip_tests => !CONFIG_OPTIONS['tests'] || false,
34
- :skip_helpers => !CONFIG_OPTIONS['helpers'] || false,
35
- :skip_views => !CONFIG_OPTIONS['views'] || false,
36
- :layout => CONFIG_OPTIONS['layout'] || false
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
- CONTROLLERS_PATH = File.join('app', 'controllers').freeze
55
- HELPERS_PATH = File.join('app', 'helpers').freeze
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(FUNCTIONAL_TESTS_PATH, controller_class_path, "#{controller_file_name}_controller_test.rb")
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(UNIT_TESTS_PATH, 'helpers', controller_class_path, "#{controller_file_name}_helper_test.rb")
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 index_link
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 new_link
260
+ def new_url
243
261
  "new_#{singular_name}_url"
244
262
  end
245
263
 
246
- def show_link(object_name = resource_instance)
264
+ def show_url(object_name = resource_instance)
247
265
  "#{singular_name}_url(#{object_name})"
248
266
  end
249
267
 
250
- def edit_link(object_name = resource_instance)
251
- "edit_#{show_link(object_name)}"
268
+ def edit_url(object_name = resource_instance)
269
+ "edit_#{show_url(object_name)}"
252
270
  end
253
271
 
254
- def destroy_link(object_name = resource_instance)
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
- when :atom then
261
- ":href => #{plural_name}_url(:#{format}), :rel => 'self'"
262
- when :rss then
263
- "#{plural_name}_url(#{singular_name}, :#{format})"
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
- when :atom then
270
- ":href => #{singular_name}_url(#{singular_name}, :#{format})"
271
- when :rss then
272
- "#{singular_name}_url(#{singular_name}, :#{format})"
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
- when :atom then
279
- "(#{collection_instance}.first.created_at rescue Time.now.utc).strftime('%Y-%m-%dT%H:%M:%SZ')"
280
- when :rss then
281
- "(#{collection_instance}.first.created_at rescue Time.now.utc).to_s(:rfc822)"
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
- when :atom then
288
- "#{singular_name}.try(:updated_at).strftime('%Y-%m-%dT%H:%M:%SZ')"
289
- when :rss then
290
- "#{singular_name}.try(:updated_at).to_s(:rfc822)"
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.separator ''
316
- opt.separator 'Options:'
331
+ super(opt)
317
332
 
318
- ### CONTROLLERS + VIEWS
333
+ ### CONTROLLER + VIEW + HELPER
319
334
 
320
- opt.on('--skip-pagination',
321
- "Skip 'will_paginate' for collections in controllers and views, wich requires gem 'mislav-will_paginate'.") do |v|
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, wich requires gem 'josevalim-inherited_resources'.") do |v|
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-formtastic',
331
- "Skip 'formtastic' style forms, wich requires gem 'justinfrench-formtastic'.") do |v|
332
- options[:formtastic] = !v
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('--layout', "Generate layout.") do |v|
336
- options[:layout] = v
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-helper', "Skip generation of helpers.") do |v|
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
- ### CONTROLLERS + MODELS
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('--fgirl', "Model: Generate \"factory_girl\" factories.") do |v|
364
- options[:factory_girl] = v
365
+ opt.on('--skip-helper', "Helper: Skip generation of helpers.") do |v|
366
+ options[:skip_helpers] = v
365
367
  end
366
368
 
367
- opt.on('--machinist', "Model: Generate \"machinist\" blueprints (factories).") do |v|
368
- options[:machinist] = v
369
- end
369
+ ### MODEL
370
370
 
371
- opt.on('--odaddy', "Model: Generate \"object_daddy\" generator/factory methods.") do |v|
372
- options[:object_daddy] = v
373
- end
371
+ opt.separator ' '
372
+ opt.separator 'Model Options:'
374
373
 
375
- opt.on('--skip-timestamps', "Model: Don't add timestamps to the migration file.") do |v|
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('--skip-migration', "Model: Skip generation of migration file.") do |v|
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
- ["Usage: #{$0} #{spec.name} ModelName",
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