trestle_generator 1.0.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/USAGE CHANGED
@@ -4,17 +4,17 @@ Description:
4
4
  model does not exist, it creates the model as well. The generated code is
5
5
  equivalent to the "scaffold :model" declaration, making it easy to migrate
6
6
  when you wish to customize your controller and views.
7
-
7
+
8
8
  The generator takes a model name, an optional controller name, and a
9
9
  list of views as arguments. Trestle actions and views are created
10
10
  automatically. Any views left over generate empty stubs.
11
-
11
+
12
12
  The trestle actions are:
13
- index, new, edit, destroy
14
-
13
+ list, new, show, edit, destroy
14
+
15
15
  The trestle views are:
16
- _index_without_id, _index_with_id, new, edit
17
-
16
+ list, new, show, edit
17
+
18
18
  If a controller name is not given, the plural form of the model name
19
19
  will be used. The model and controller names may be given in CamelCase
20
20
  or under_score and should not be suffixed with 'Model' or 'Controller'.
@@ -23,13 +23,13 @@ Description:
23
23
 
24
24
  Example:
25
25
  ./script/generate trestle Account Bank debit credit
26
-
26
+
27
27
  This will generate an Account model and BankController with a full test
28
28
  suite and a basic user interface. Now create the accounts table in your
29
29
  database and browse to http://localhost/bank/ -- voila, you're on Rails!
30
30
 
31
31
  Modules Example:
32
32
  ./script/generate trestle CreditCard 'admin/credit_card' suspend late_fee
33
-
33
+
34
34
  This will generate a CreditCard model and CreditCardController controller
35
35
  in the admin module.
@@ -1,56 +1,54 @@
1
1
  class <%= controller_class_name %>Controller < ApplicationController
2
- verify :only => [ 'destroy<%= suffix %>', 'edit<%= suffix %>' ],
2
+ verify :only => [ 'show<%= suffix %>', 'edit<%= suffix %>', 'destroy<%= suffix %>' ],
3
3
  :params => :id,
4
4
  :add_flash => { :notice => 'Missing <%= singular_name %> ID.' },
5
- :redirect_to => { :action => '<%= suffix || 'index' %>' }
6
-
5
+ :redirect_to => { :action => 'list<%= suffix %>' }
6
+
7
7
  <% for action in nontrestle_actions -%>
8
8
  def <%= action %><%= suffix %>
9
9
  end
10
-
10
+
11
11
  <% end -%>
12
12
  def destroy<%= suffix %>
13
13
  if request.post?
14
14
  <%= model_name %>.find(params[:id]).destroy
15
15
  flash[:notice] = 'The <%= singular_name %> was successfully destroyed.'
16
- redirect_to :action => '<%= suffix || 'index' %>'
16
+ redirect_to :action => 'list<%= suffix %>'
17
17
  else
18
18
  flash[:notice] = 'Click Destroy to destroy the <%= singular_name %>.'
19
19
  redirect_to :action => 'edit<%= suffix %>', :id => params[:id]
20
20
  end
21
21
  end
22
-
22
+
23
23
  def edit<%= suffix %>
24
24
  if request.post?
25
25
  @<%= singular_name %> = <%= model_name %>.find(params[:id])
26
26
  if @<%= singular_name %>.update_attributes(params[:<%= singular_name %>])
27
27
  flash[:notice] = 'The <%= singular_name %> was successfully edited.'
28
- redirect_to :action => '<%= suffix || 'index' %>', :id => @<%= singular_name %>
28
+ redirect_to :action => 'show<%= suffix %>', :id => @<%= singular_name %>
29
29
  end
30
30
  else
31
31
  @<%= singular_name %> = <%= model_name %>.find(params[:id])
32
32
  end
33
33
  end
34
-
35
- def <%= suffix || 'index' %>
36
- if params[:id]
37
- @<%= singular_name %> = <%= model_name %>.find(params[:id])
38
- render '<%= plural_name %>/_<%= suffix || 'index' %>_with_id'
39
- else
40
- @<%= singular_name %>_pages, @<%= plural_name %> = paginate(:<%= plural_name %>)
41
- render '<%= plural_name %>/_<%= suffix || 'index' %>_without_id'
42
- end
34
+
35
+ def list<%= suffix %>
36
+ @<%= singular_name %>_pages, @<%= plural_name %> = paginate(:<%= plural_name %>)
43
37
  end
44
-
38
+
45
39
  def new<%= suffix %>
46
40
  if request.post?
47
41
  @<%= singular_name %> = <%= model_name %>.new(params[:<%= singular_name %>])
48
42
  if @<%= singular_name %>.save
49
43
  flash[:notice] = 'A new <%= singular_name %> was successfully added.'
50
- redirect_to :action => '<%= suffix || 'index' %>'
44
+ redirect_to :action => 'list<%= suffix %>'
51
45
  end
52
46
  else
53
47
  @<%= singular_name %> = <%= model_name %>.new
54
48
  end
55
49
  end
50
+
51
+ def show<%= suffix %>
52
+ @<%= singular_name %> = <%= model_name %>.find(params[:id])
53
+ end
56
54
  end
@@ -6,99 +6,93 @@ class <%= controller_class_name %>Controller; def rescue_action(e) raise e end;
6
6
 
7
7
  class <%= controller_class_name %>ControllerTest < Test::Unit::TestCase
8
8
  fixtures :<%= table_name %>
9
-
9
+
10
10
  def setup
11
11
  @controller = <%= controller_class_name %>Controller.new
12
12
  @request = ActionController::TestRequest.new
13
13
  @response = ActionController::TestResponse.new
14
14
  end
15
-
15
+
16
16
  <% for action in nontrestle_actions -%>
17
17
  def test_<%= action %>
18
18
  get '<%= action %>'
19
19
  assert_response :success
20
20
  assert_template '<%= action %>'
21
21
  end
22
-
22
+
23
23
  <% end -%>
24
- def test_<%= suffix || 'index' %>
25
- get '<%= suffix || 'index' %>'
26
- assert_response :success
27
- assert_template '<%= plural_name %>/_<%= suffix || 'index' %>_without_id'
28
- end
29
-
30
24
  def test_destroy<%= suffix %>_using_get
31
25
  assert_not_nil <%= model_name %>.find(1)
32
-
26
+
33
27
  get 'destroy<%= suffix %>', :id => 1
34
28
  assert_response :redirect
35
29
  assert_redirected_to :action => 'edit<%= suffix %>'
36
-
30
+
37
31
  assert_not_nil <%= model_name %>.find(1)
38
32
  end
39
-
33
+
40
34
  def test_destroy<%= suffix %>_using_post
41
35
  assert_not_nil <%= model_name %>.find(1)
42
-
36
+
43
37
  post 'destroy<%= suffix %>', :id => 1
44
38
  assert_response :redirect
45
- assert_redirected_to :action => '<%= suffix || 'index' %>'
46
-
39
+ assert_redirected_to :action => 'list<%= suffix %>'
40
+
47
41
  assert_raise(ActiveRecord::RecordNotFound) { <%= model_name %>.find(1) }
48
42
  end
49
-
43
+
50
44
  def test_edit<%= suffix %>_using_get
51
45
  get 'edit<%= suffix %>', :id => 1
52
-
46
+
53
47
  assert_response :success
54
48
  assert_template 'edit<%= suffix %>'
55
-
49
+
56
50
  assert_not_nil assigns(:<%= singular_name %>)
57
51
  assert assigns(:<%= singular_name %>).valid?
58
52
  end
59
-
53
+
60
54
  def test_edit<%= suffix %>_using_post
61
55
  post 'edit<%= suffix %>', :id => 1
62
56
  assert_response :redirect
63
- assert_redirected_to :action => '<%= suffix || 'index' %>', :id => 1
57
+ assert_redirected_to :action => 'show<%= suffix %>', :id => 1
64
58
  end
65
-
66
- def test_<%= suffix || 'index' %>_without_id
67
- get '<%= suffix || 'index' %>'
68
-
59
+
60
+ def test_list<%= suffix %>
61
+ get 'list<%= suffix %>'
62
+
69
63
  assert_response :success
70
- assert_template '<%= plural_name %>/_<%= suffix || 'index' %>_without_id'
71
-
64
+ assert_template '<%= plural_name %>/list<%= suffix %>'
65
+
72
66
  assert_not_nil assigns(:<%= plural_name %>)
73
67
  end
74
-
75
- def test_<%= suffix || 'index' %>_with_id
76
- get '<%= suffix || 'index' %>', :id => 1
77
-
78
- assert_response :success
79
- assert_template '<%= plural_name %>/_<%= suffix || 'index' %>_with_id'
80
-
81
- assert_not_nil assigns(:<%= singular_name %>)
82
- assert assigns(:<%= singular_name %>).valid?
83
- end
84
-
68
+
85
69
  def test_new<%= suffix %>_using_get
86
70
  get 'new<%= suffix %>'
87
-
71
+
88
72
  assert_response :success
89
73
  assert_template 'new<%= suffix %>'
90
-
74
+
91
75
  assert_not_nil assigns(:<%= singular_name %>)
92
76
  end
93
-
77
+
94
78
  def test_new<%= suffix %>_using_post
95
79
  num_<%= plural_name %> = <%= model_name %>.count
96
-
80
+
97
81
  post 'new<%= suffix %>', :<%= singular_name %> => {}
98
-
82
+
99
83
  assert_response :redirect
100
- assert_redirected_to :action => '<%= suffix || 'index' %>'
101
-
84
+ assert_redirected_to :action => 'list<%= suffix %>'
85
+
102
86
  assert_equal num_<%= plural_name %> + 1, <%= model_name %>.count
103
87
  end
88
+
89
+ def test_show<%= suffix %>
90
+ get 'show<%= suffix %>', :id => 1
91
+
92
+ assert_response :success
93
+ assert_template '<%= plural_name %>/show<%= suffix %>'
94
+
95
+ assert_not_nil assigns(:<%= singular_name %>)
96
+ assert assigns(:<%= singular_name %>).valid?
97
+ end
104
98
  end
data/templates/routes.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  ActionController::Routing::Routes.draw do |map|
2
2
  # Add your own custom routes here.
3
3
  # The priority is based upon order of creation: first created -> highest priority.
4
-
4
+
5
5
  # Here's a sample route:
6
6
  # map.connect 'products/:id', :controller => 'catalog', :action => 'view'
7
7
  # Keep in mind you can assign values other than :controller and :action
@@ -15,7 +15,12 @@ ActionController::Routing::Routes.draw do |map|
15
15
  map.connect ':controller/service.wsdl', :action => 'wsdl'
16
16
 
17
17
  # Install the default route as the lowest priority.
18
- map.connect ':controller/:action', :action => 'index', :requirements => { :action => /[^\d]+/ }
19
- map.connect ':controller/:id', :action => 'index', :requirements => { :id => /[\d]+/ }
20
- map.connect ':controller/:id/:action'
18
+ ID_REQUIREMENT = /[\d]+/
19
+ ACTION_REQUIREMENT = /[A-Za-z]\S*/
20
+ map.connect ':controller/:action', :action => 'list<%= suffix %>',
21
+ :requirements => { :action => ACTION_REQUIREMENT }
22
+ map.connect ':controller/:id', :action => 'show<%= suffix %>',
23
+ :requirements => { :id => ID_REQUIREMENT }
24
+ map.connect ':controller/:id/:action', :requirements => { :id => ID_REQUIREMENT,
25
+ :action => ACTION_REQUIREMENT }
21
26
  end
@@ -6,5 +6,5 @@
6
6
  <%%= end_form_tag %>
7
7
  <%%= button_to 'Destroy', { :action => 'destroy<%= suffix %>', :id => @<%= singular_name %> }, :confirm => 'Are you sure you want to destroy this <%= singular_name %>?' %>
8
8
 
9
- <%%= link_to 'Show', :action => '<%= suffix || 'index' %>', :id => @<%= singular_name %> %> |
10
- <%%= link_to 'Back to list', :action => '<%= suffix || 'index' %>' %>
9
+ <%%= link_to 'Show', :action => 'show<%= suffix %>', :id => @<%= singular_name %> %> |
10
+ <%%= link_to 'Back to list', :action => 'list<%= suffix %>' %>
@@ -12,7 +12,7 @@
12
12
  <%% for column in <%= model_name %>.content_columns %>
13
13
  <td><%%=h <%= singular_name %>.send(column.name) %></td>
14
14
  <%% end %>
15
- <td><%%= link_to 'Show', :action => '<%= suffix || 'index' %>', :id => <%= singular_name %> %></td>
15
+ <td><%%= link_to 'Show', :action => 'show<%= suffix %>', :id => <%= singular_name %> %></td>
16
16
  <td><%%= link_to 'Edit', :action => 'edit<%= suffix %>', :id => <%= singular_name %> %></td>
17
17
  <td><%%= link_to 'Destroy', { :action => 'destroy<%= suffix %>', :id => <%= singular_name %> }, :post => true, :confirm => 'Are you sure you want to destroy this <%= singular_name %>?' %>
18
18
  </tr>
@@ -5,4 +5,4 @@
5
5
  <%%= submit_tag 'Save' %>
6
6
  <%%= end_form_tag %>
7
7
 
8
- <%%= link_to 'Back to list', :action => '<%= suffix || 'index' %>' %>
8
+ <%%= link_to 'Back to list', :action => 'list<%= suffix %>' %>
@@ -5,4 +5,4 @@
5
5
  <%% end %>
6
6
 
7
7
  <%%= link_to 'Edit', :action => 'edit<%= suffix %>', :id => @<%= singular_name %> %> |
8
- <%%= link_to 'Back to list', :action => '<%= suffix || 'index' %>' %>
8
+ <%%= link_to 'Back to list', :action => 'list<%= suffix %>' %>
data/trestle_generator.rb CHANGED
@@ -1,12 +1,12 @@
1
1
  class TrestleSandbox
2
2
  include ActionView::Helpers::ActiveRecordHelper
3
-
3
+
4
4
  attr_accessor :form_action, :singular_name, :suffix, :model_instance
5
-
5
+
6
6
  def sandbox_binding
7
7
  binding
8
8
  end
9
-
9
+
10
10
  def default_input_block
11
11
  Proc.new { |record, column| "<p><label for=\"#{record}_#{column.name}\">#{column.human_name}</label><br/>\n#{input(record, column.name)}</p>\n" }
12
12
  end
@@ -17,15 +17,15 @@ class ActionView::Helpers::InstanceTag
17
17
  field_meth = "#{field_type}_field"
18
18
  "<%= #{field_meth} '#{@object_name}', '#{@method_name}' #{options.empty? ? '' : ', '+options.inspect} %>"
19
19
  end
20
-
20
+
21
21
  def to_text_area_tag(options = {})
22
22
  "<%= text_area '#{@object_name}', '#{@method_name}' #{options.empty? ? '' : ', '+ options.inspect} %>"
23
23
  end
24
-
24
+
25
25
  def to_date_select_tag(options = {})
26
26
  "<%= date_select '#{@object_name}', '#{@method_name}' #{options.empty? ? '' : ', '+ options.inspect} %>"
27
27
  end
28
-
28
+
29
29
  def to_datetime_select_tag(options = {})
30
30
  "<%= datetime_select '#{@object_name}', '#{@method_name}' #{options.empty? ? '' : ', '+ options.inspect} %>"
31
31
  end
@@ -45,36 +45,36 @@ class TrestleGenerator < Rails::Generator::NamedBase
45
45
 
46
46
  def initialize(runtime_args, runtime_options = {})
47
47
  super
48
-
48
+
49
49
  # Take controller name from the next argument. Default to the pluralized model name.
50
50
  @controller_name = args.shift
51
51
  @controller_name ||= ActiveRecord::Base.pluralize_table_names ? @name.pluralize : @name
52
-
52
+
53
53
  base_name, @controller_class_path, @controller_file_path, @controller_class_nesting, @controller_class_nesting_depth = extract_modules(@controller_name)
54
54
  @controller_class_name_without_nesting, @controller_singular_name, @controller_plural_name = inflect_names(base_name)
55
-
55
+
56
56
  if @controller_class_nesting.empty?
57
57
  @controller_class_name = @controller_class_name_without_nesting
58
58
  else
59
59
  @controller_class_name = "#{@controller_class_nesting}::#{@controller_class_name_without_nesting}"
60
60
  end
61
61
  end
62
-
62
+
63
63
  def manifest
64
64
  record do |m|
65
65
  # Check for class naming collisions.
66
66
  m.class_collisions controller_class_path, "#{controller_class_name}Controller", "#{controller_class_name}ControllerTest", "#{controller_class_name}Helper"
67
-
67
+
68
68
  # Controller, helper, views, test, and config directories.
69
69
  m.directory File.join('app/controllers', controller_class_path)
70
70
  m.directory File.join('app/helpers', controller_class_path)
71
71
  m.directory File.join('app/views', controller_class_path, controller_file_name)
72
72
  m.directory File.join('test/functional', controller_class_path)
73
73
  m.directory File.join('config', controller_class_path)
74
-
74
+
75
75
  # Depend on model generator but skip if the model exists.
76
76
  m.dependency 'model', [singular_name], :collision => :skip
77
-
77
+
78
78
  # Trestle forms.
79
79
  m.complex_template "form.rhtml",
80
80
  File.join('app/views',
@@ -86,7 +86,7 @@ class TrestleGenerator < Rails::Generator::NamedBase
86
86
  :begin_mark => 'form',
87
87
  :end_mark => 'eoform',
88
88
  :mark_id => singular_name
89
-
89
+
90
90
  # Trestle views.
91
91
  trestle_views.each do |action|
92
92
  m.template "view_#{action}.rhtml",
@@ -96,28 +96,28 @@ class TrestleGenerator < Rails::Generator::NamedBase
96
96
  "#{action}.rhtml"),
97
97
  :assigns => { :action => action }
98
98
  end
99
-
99
+
100
100
  # Controller class, functional test, helper, and views.
101
101
  m.template 'controller.rb',
102
102
  File.join('app/controllers',
103
103
  controller_class_path,
104
104
  "#{controller_file_name}_controller.rb")
105
-
105
+
106
106
  m.template 'functional_test.rb',
107
107
  File.join('test/functional',
108
108
  controller_class_path,
109
109
  "#{controller_file_name}_controller_test.rb")
110
-
110
+
111
111
  m.template 'helper.rb',
112
112
  File.join('app/helpers',
113
113
  controller_class_path,
114
114
  "#{controller_file_name}_helper.rb")
115
-
115
+
116
116
  # Layout and stylesheet.
117
117
  m.template 'layout.rhtml', "app/views/layouts/#{controller_file_name}.rhtml"
118
118
  m.template 'style.css', 'public/stylesheets/trestle.css'
119
-
120
-
119
+
120
+
121
121
  # Non-trestle views.
122
122
  nontrestle_actions.each do |action|
123
123
  path = File.join('app/views',
@@ -127,40 +127,40 @@ class TrestleGenerator < Rails::Generator::NamedBase
127
127
  m.template "controller:view.rhtml", path,
128
128
  :assigns => { :action => action, :path => path}
129
129
  end
130
-
130
+
131
131
  # Routes.
132
132
  m.template 'routes.rb', 'config/routes.rb'
133
133
  end
134
134
  end
135
-
136
-
135
+
136
+
137
137
  protected
138
-
138
+
139
139
  # Override with your own usage banner.
140
140
  def banner
141
141
  "Usage: #{$0} trestle ModelName [ControllerName] [action, ...]"
142
142
  end
143
-
143
+
144
144
  def trestle_views
145
- %w(edit _index_without_id _index_with_id new)
145
+ %w(edit list new show)
146
146
  end
147
-
147
+
148
148
  def trestle_actions
149
- %w(destroy edit index new)
149
+ %w(destroy edit list new show)
150
150
  end
151
-
151
+
152
152
  def model_name
153
153
  class_name.demodulize
154
154
  end
155
-
155
+
156
156
  def nontrestle_actions
157
157
  args - trestle_actions
158
158
  end
159
-
159
+
160
160
  def suffix
161
161
  "_#{singular_name}" if options[:suffix]
162
162
  end
163
-
163
+
164
164
  def create_sandbox
165
165
  sandbox = TrestleSandbox.new
166
166
  sandbox.singular_name = singular_name
@@ -174,7 +174,7 @@ class TrestleGenerator < Rails::Generator::NamedBase
174
174
  sandbox.suffix = suffix
175
175
  sandbox
176
176
  end
177
-
177
+
178
178
  def model_instance
179
179
  base = class_nesting.split('::').inject(Object) do |base, nested|
180
180
  break base.const_get(nested) if base.const_defined?(nested)
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.10
3
3
  specification_version: 1
4
4
  name: trestle_generator
5
5
  version: !ruby/object:Gem::Version
6
- version: 1.0.2
7
- date: 2006-01-27
6
+ version: 1.1.0
7
+ date: 2006-03-14
8
8
  summary: "[Rails] A drop-in replacement for the scaffold generator that produces
9
9
  production-ready controllers that are safe from state-changing HTTP GET requests
10
10
  and that have streamlined URLs."
@@ -21,11 +21,11 @@ description: "Don
21
21
  the HTTP POST method for actions that change data. Well-behaved web applications
22
22
  protect themselves against errant HTTP GET requests such as come from Google Web
23
23
  Accelerator and the like. Scaffolded controllers fail to do this. USABILITY
24
- Trestle controllers have just four actions (index, new, edit, and destroy). The
25
- scaffold generator produces controllers that have eight actions. Fewer actions
26
- exposed to the outside world is better if the behavior of these actions is in
27
- line with the semantics of HTTP GET and HTTP POST. The net effect of this design
28
- improvement is that you will not have to throw away or tweak as much
24
+ Trestle controllers have just five actions (list, new, show, edit, and destroy).
25
+ The scaffold generator produces controllers that have eight actions. Fewer
26
+ actions exposed to the outside world is better if the behavior of these actions
27
+ is in line with the semantics of HTTP GET and HTTP POST. The net effect of this
28
+ design improvement is that you will not have to throw away or tweak as much
29
29
  trestle-generated code as you do scaffold-generated code. Less work for you
30
30
  means your application gets built sooner. Tobias L�tke�s postback_generator
31
31
  RubyGem had the same idea, but trestle goes further. A scaffold for a database
@@ -42,7 +42,7 @@ description: "Don
42
42
  from request parameters /people/99 - GET or POST shows the person record having
43
43
  ID 99 /people/99/edit - GET shows a person form for the person record having ID
44
44
  99 /people/99/edit - POST updates the person record having ID 99 using request
45
- parameters /people/99/destroy - GET redirects to /people/99/edit with a notice
45
+ parameters /people/99/destroy - GET redirects to /people/99/edit with a notice
46
46
  that the user must click the form�s Destroy button in order to destroy a record
47
47
  /people/99/destroy - POST deletes the person record having ID 99 after prompting
48
48
  the user for confirmation Notice the hierarchical nature of trestle URLs.
@@ -79,9 +79,9 @@ files:
79
79
  - templates/routes.rb
80
80
  - templates/style.css
81
81
  - templates/view_edit.rhtml
82
+ - templates/view_list.rhtml
82
83
  - templates/view_new.rhtml
83
- - templates/view__index_without_id.rhtml
84
- - templates/view__index_with_id.rhtml
84
+ - templates/view_show.rhtml
85
85
  test_files: []
86
86
  rdoc_options: []
87
87
  extra_rdoc_files: []