scaffolding_extensions 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. data/LICENSE +19 -0
  2. data/README +144 -0
  3. data/contrib/scaffold_associations_tree/README +9 -0
  4. data/contrib/scaffold_associations_tree/bullet.gif +0 -0
  5. data/contrib/scaffold_associations_tree/minus.gif +0 -0
  6. data/contrib/scaffold_associations_tree/plus.gif +0 -0
  7. data/contrib/scaffold_associations_tree/scaffold_associations_tree.css +20 -0
  8. data/contrib/scaffold_associations_tree/scaffold_associations_tree.js +57 -0
  9. data/contrib/scaffold_auto_complete_style/README +8 -0
  10. data/contrib/scaffold_auto_complete_style/auto_complete.css +23 -0
  11. data/contrib/scaffold_form_focus/README +12 -0
  12. data/contrib/scaffold_form_focus/scaffold_form_focus.js +21 -0
  13. data/contrib/scaffold_jquery_autocomplete/README +8 -0
  14. data/contrib/scaffold_jquery_autocomplete/jquery.ui.se_autocomplete.css +22 -0
  15. data/contrib/scaffold_jquery_autocomplete/jquery.ui.se_autocomplete.js +121 -0
  16. data/doc/advanced.txt +154 -0
  17. data/doc/camping.txt +25 -0
  18. data/doc/controller_spec.txt +20 -0
  19. data/doc/conversion.txt +102 -0
  20. data/doc/model_spec.txt +54 -0
  21. data/doc/ramaze.txt +20 -0
  22. data/doc/sinatra.txt +20 -0
  23. data/doc/testing.txt +12 -0
  24. data/lib/scaffolding_extensions.rb +89 -0
  25. data/lib/scaffolding_extensions/controller.rb +79 -0
  26. data/lib/scaffolding_extensions/controller/action_controller.rb +116 -0
  27. data/lib/scaffolding_extensions/controller/camping.rb +150 -0
  28. data/lib/scaffolding_extensions/controller/ramaze.rb +116 -0
  29. data/lib/scaffolding_extensions/controller/sinatra.rb +183 -0
  30. data/lib/scaffolding_extensions/helper.rb +304 -0
  31. data/lib/scaffolding_extensions/jquery_helper.rb +58 -0
  32. data/lib/scaffolding_extensions/meta_controller.rb +337 -0
  33. data/lib/scaffolding_extensions/meta_model.rb +571 -0
  34. data/lib/scaffolding_extensions/model.rb +30 -0
  35. data/lib/scaffolding_extensions/model/active_record.rb +184 -0
  36. data/lib/scaffolding_extensions/model/ardm.rb +47 -0
  37. data/lib/scaffolding_extensions/model/data_mapper.rb +190 -0
  38. data/lib/scaffolding_extensions/overridable.rb +67 -0
  39. data/lib/scaffolding_extensions/prototype_helper.rb +59 -0
  40. data/scaffolds/edit.rhtml +12 -0
  41. data/scaffolds/habtm.rhtml +24 -0
  42. data/scaffolds/index.rhtml +6 -0
  43. data/scaffolds/layout.rhtml +82 -0
  44. data/scaffolds/list.rhtml +13 -0
  45. data/scaffolds/listtable.rhtml +46 -0
  46. data/scaffolds/manage.rhtml +15 -0
  47. data/scaffolds/merge.rhtml +23 -0
  48. data/scaffolds/new.rhtml +5 -0
  49. data/scaffolds/search.rhtml +11 -0
  50. data/scaffolds/show.rhtml +19 -0
  51. data/test/scaffolding_extensions_test.rb +44 -0
  52. metadata +106 -0
@@ -0,0 +1,67 @@
1
+ module ScaffoldingExtensions
2
+ module Overridable
3
+ private
4
+ # If a method exists matches scaffold_#{action}_#{m}, return a proc that calls it.
5
+ # If not and the instance variable @scaffold_#{action}_#{m} is defined, return a
6
+ # proc that gives that value. Otherwise, return nil.
7
+ def scaffold_method_iv_override(m, action)
8
+ return nil unless action
9
+ meth = "scaffold_#{action}_#{m}"
10
+ if respond_to?(meth)
11
+ Proc.new{send(meth)}
12
+ elsif instance_variable_defined?(meth = "@#{meth}")
13
+ Proc.new{instance_variable_get(meth)}
14
+ end
15
+ end
16
+
17
+ # If a method exists matches scaffold_#{action}_#{m}, return a proc that calls it with
18
+ # the other provided arguments, otherwise return nil.
19
+ def scaffold_method_override(m, action, *args)
20
+ return nil unless action
21
+ meth = "scaffold_#{action}_#{m}"
22
+ Proc.new{send(meth, *args)} if respond_to?(meth)
23
+ end
24
+ end
25
+
26
+ module MetaOverridable
27
+ private
28
+ def scaffold_override_alias_method(meth)
29
+ pub_meth = "scaffold_#{meth}".to_sym
30
+ priv_meth = "_#{pub_meth}".to_sym
31
+ @scaffold_aliased_methods ||= Set.new
32
+ return false if @scaffold_aliased_methods.include?(pub_meth)
33
+ alias_method(priv_meth, pub_meth)
34
+ private(priv_meth)
35
+ @scaffold_aliased_methods.add(pub_meth)
36
+ [pub_meth, priv_meth]
37
+ end
38
+
39
+ def scaffold_override_iv_methods(*meths)
40
+ meths.each do |meth|
41
+ pub_meth, priv_meth = scaffold_override_alias_method(meth)
42
+ return unless pub_meth && priv_meth
43
+ define_method(pub_meth) do |arg|
44
+ if m = scaffold_method_iv_override(meth, arg)
45
+ m.call
46
+ else
47
+ send(priv_meth, arg)
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ def scaffold_override_methods(*meths)
54
+ meths.each do |meth|
55
+ pub_meth, priv_meth = scaffold_override_alias_method(meth)
56
+ return unless pub_meth && priv_meth
57
+ define_method(pub_meth) do |*args|
58
+ if m = scaffold_method_override(meth, *args)
59
+ m.call
60
+ else
61
+ send(priv_meth, *args)
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,59 @@
1
+ module ScaffoldingExtensions
2
+ # Helper methods that require the Prototype Javascript library to work
3
+ module PrototypeHelper
4
+ JS_CHAR_FILTER = {'<'=>'\u003C', '>'=>'\u003E', '"'=>'\\"', "\n"=>'\n'}
5
+
6
+ private
7
+ # Javascript for adding an element to the top of the list of associated records,
8
+ # and setting the autocomplete text box value to blank (if using autocompleting),
9
+ # or removing the item from the select box and showing the blank record instead
10
+ # (if not using autocompleting).
11
+ def scaffold_add_habtm_element
12
+ content = "new Insertion.Top('#{@records_list}', \"#{scaffold_javascript_character_filter(scaffold_habtm_association_line_item(@klass, @association, @record, @associated_record))}\");\n"
13
+ if @auto_complete
14
+ content << "$('#{@element_id}').value = '';\n"
15
+ else
16
+ content << "Element.remove('#{@element_id}_#{@associated_record.scaffold_id}');\n"
17
+ content << "$('#{@element_id}').selectedIndex = 0;\n"
18
+ end
19
+ content
20
+ end
21
+
22
+ # A form tag with an onsubmit attribute that submits the form to the given url via Ajax
23
+ def scaffold_form_remote_tag(url, options)
24
+ u = scaffold_url(url, options)
25
+ "<form method='post' action='#{u}' onsubmit=\"new Ajax.Request('#{u}', {asynchronous:true, evalScripts:true, parameters:Form.serialize(this)}); return false;\">\n#{scaffold_token_tag}\n"
26
+ end
27
+
28
+ # Javascript that takes the given id as the text box to autocomplete for,
29
+ # submitting the autocomplete request to scaffold_auto_complete_for_#{model_name}
30
+ # (with the association if one is given), using the get method, and displaying values
31
+ # in #{id}_scaffold_auto_complete.
32
+ def scaffold_javascript_autocompleter(id, model_name, association)
33
+ "\n<div class='auto_complete' id='#{id}_scaffold_auto_complete'></div>\n" <<
34
+ scaffold_javascript_tag("var #{id}_auto_completer = new Ajax.Autocompleter('#{id}', '#{"#{id}_scaffold_auto_complete"}', '#{scaffold_url("scaffold_auto_complete_for_#{model_name}")}', {paramName:'id', method:'get'#{", parameters:'association=#{association}'" if association}})")
35
+ end
36
+
37
+ # Filters some html entities and replaces them with their javascript equivalents
38
+ # suitable for use inside a javascript quoted string.
39
+ def scaffold_javascript_character_filter(string)
40
+ string.gsub(/[<>"\n]/){|x| JS_CHAR_FILTER[x]}
41
+ end
42
+
43
+ # Div with link inside that requests the associations html for the @scaffold_object
44
+ # via Ajax and replaces the link with the html returned by the request
45
+ def scaffold_load_associations_with_ajax_link
46
+ soid = @scaffold_object.scaffold_id
47
+ divid = "scaffold_ajax_content_#{soid}"
48
+ "<div id='#{divid}'><a href='#{scaffold_url("edit#{@scaffold_suffix}", :id=>soid, :associations=>:show)}' onclick=\"new Ajax.Updater('#{divid}', '#{scaffold_url("associations#{@scaffold_suffix}", :id=>soid)}', {method:'get', asynchronous:true, evalScripts:true}); return false;\">Modify Associations</a></div>"
49
+ end
50
+
51
+ # Javascript that removes @remove_element_id from the page and inserts
52
+ # an option into the appropriate select box (unless @auto_complete).
53
+ def scaffold_remove_existing_habtm_element
54
+ content = "Element.remove('#{@remove_element_id}');\n"
55
+ content << "new Insertion.Bottom('#{@select_id}', \"\\u003Coption value='#{@select_value}' id='#{@select_id}_#{@select_value}'\\u003E#{@select_text}\\u003C/option\\u003E\");\n" unless @auto_complete
56
+ content
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,12 @@
1
+ <% @scaffold_title = "Editing #{@scaffold_options[:singular_lc_human_name]}" %>
2
+
3
+ <%= scaffold_model_form('update', @scaffold_class.scaffold_fields(:edit)) %>
4
+
5
+ <% if @scaffold_class.scaffold_load_associations_with_ajax && !@scaffold_show_associations %>
6
+ <%= scaffold_load_associations_with_ajax_link %>
7
+ <% else %>
8
+ <%= scaffold_habtm_ajax_associations %>
9
+ <%= scaffold_association_links %>
10
+ <% end %>
11
+
12
+ <%= scaffold_manage_link %>
@@ -0,0 +1,24 @@
1
+ <% @scaffold_title = "Update #{sn = h(@scaffold_object.scaffold_name)}'s #{mpn = (so = @scaffold_options )[:aplch_name]}" %>
2
+
3
+ <%= scaffold_form(scaffold_url("update#{@scaffold_suffix}", :id=>(soid=@scaffold_object.scaffold_id))) %>
4
+
5
+ <% if @scaffold_class.scaffold_association_use_auto_complete(assoc = so[:association]) %>
6
+ <h4>Add this <%= so[:aslhc_name] %></h4>
7
+ <%= scaffold_text_field_tag_with_auto_complete('add', so[:singular_name], assoc) %>
8
+ <% elsif @items_to_add.length > 0 %>
9
+ <h4>Add these <%= mpn %></h4>
10
+ <%= scaffold_select_tag('add', @items_to_add, true) %>
11
+ <% end %>
12
+
13
+ <% if @items_to_remove.length > 0 %>
14
+ <h4>Remove these <%= mpn %></h4>
15
+ <%= scaffold_select_tag('remove', @items_to_remove, true) %>
16
+ <% end %>
17
+
18
+ <br /><br />
19
+ <input type='submit' value="Update <%= sn %>'s <%= mpn %>" />
20
+ </form>
21
+
22
+ <% if '' != (edit_link = scaffold_check_link("Edit #{sn}", true, "edit_#{@scaffold_options[:singular_name]}", :id=>soid)) %>
23
+ <h2><%= edit_link %></h2>
24
+ <% end %>
@@ -0,0 +1,6 @@
1
+ <% @scaffold_title = 'Manage Models' %>
2
+ <ul>
3
+ <% @links.each do |link, human_name| -%>
4
+ <li><a href="<%= scaffold_url(link) %>"><%= human_name %></a></li>
5
+ <% end %>
6
+ </ul>
@@ -0,0 +1,82 @@
1
+ <html>
2
+ <head>
3
+ <title>Scaffolding Extensions<%= " - #{@scaffold_title}" if @scaffold_title %></title>
4
+ <style type="text/css">
5
+ body { background-color: #fff; color: #333; }
6
+
7
+ body, p, ol, ul, td {
8
+ font-family: verdana, arial, helvetica, sans-serif;
9
+ font-size: 13px;
10
+ line-height: 18px;
11
+ }
12
+
13
+ h4 { font-size: 16px; }
14
+
15
+ pre {
16
+ background-color: #eee;
17
+ padding: 10px;
18
+ font-size: 11px;
19
+ }
20
+
21
+ a { color: #000; }
22
+ a:visited { color: #666; }
23
+ a:hover { color: #fff; background-color:#000; }
24
+
25
+ div.habtm_ajax_remove_associations form { display: inline; }
26
+
27
+ div.auto_complete {
28
+ width: 350px;
29
+ background: #fff;
30
+ }
31
+ div.auto_complete ul {
32
+ border:1px solid #888;
33
+ margin:0;
34
+ padding:0;
35
+ width:100%;
36
+ list-style-type:none;
37
+ }
38
+ div.auto_complete ul li {
39
+ margin:0;
40
+ padding:3px;
41
+ }
42
+ div.auto_complete ul li.selected {
43
+ background-color: #ffb;
44
+ }
45
+ div.auto_complete ul strong.highlight {
46
+ color: #800;
47
+ margin:0;
48
+ padding:0;
49
+ }
50
+
51
+ ul.se_autocomplete {
52
+ position: absolute;
53
+ overflow: hidden;
54
+ background-color: #fff;
55
+ border: 1px solid #aaa;
56
+ margin: 0px;
57
+ padding: 0;
58
+ list-style: none;
59
+ font: normal .75em/.75em Verdana, Arial, sans-serif;
60
+ color: #333;
61
+ }
62
+ ul.se_autocomplete li {
63
+ display: block;
64
+ padding: .3em .5em .3em .3em;
65
+ overflow: hidden;
66
+ width: 100%;
67
+ }
68
+
69
+ ul.se_autocomplete li.active {
70
+ background-color: #3875d7;
71
+ color: #fff;
72
+ }
73
+ </style>
74
+ </head>
75
+ <body>
76
+ <%= "<h1>#{@scaffold_title}</h1>" if @scaffold_title %>
77
+ <%= "<h4>#{scaffold_flash[:notice]}</h4>" if scaffold_flash[:notice] %>
78
+
79
+ <%= @content %>
80
+
81
+ </body>
82
+ </html>
@@ -0,0 +1,13 @@
1
+ <% @scaffold_title = "Choose #{hn = @scaffold_options[:singular_lc_human_name]} to #{(haction = (action = @scaffold_action).to_s.humanize).downcase}" %>
2
+
3
+ <%= scaffold_form(scaffold_url("#{action}#{@scaffold_suffix}"), :method=>(action == :destroy ? :post : :get)) %>
4
+ <% if @scaffold_class.scaffold_use_auto_complete %>
5
+ <%= scaffold_text_field_tag_with_auto_complete('id', @scaffold_options[:singular_name]) %>
6
+ <% else %>
7
+ <%= scaffold_select_tag('id', @scaffold_objects) %>
8
+ <% end %>
9
+ <br /><br />
10
+ <input type="submit" value="<%= haction %> <%= hn %>" />
11
+ </form>
12
+
13
+ <%= scaffold_manage_link %>
@@ -0,0 +1,46 @@
1
+ <% @scaffold_title = "Listing #{@scaffold_options[:plural_lc_human_name]}" %>
2
+
3
+ <table id="scaffolded" class="<%= @scaffold_class.scaffold_table_class(:list) %>">
4
+ <thead><tr>
5
+ <% @scaffold_class.scaffold_fields(@scaffold_listtable_type).each do |column| -%>
6
+ <th><%=h @scaffold_class.scaffold_column_name(column) %></th>
7
+ <% end %>
8
+ <%= "<th>#{s = 'Show'}</th>" if show = scaffolded_method?(ss = "show#{@scaffold_suffix}") %>
9
+ <%= "<th>#{e = 'Edit'}</th>" if edit = scaffolded_method?(es = "edit#{@scaffold_suffix}") %>
10
+ <%= "<th>#{d = 'Delete'}</th>" if delete = scaffolded_method?(ds = "destroy#{@scaffold_suffix}") %>
11
+ </tr></thead><tbody>
12
+ <% @scaffold_objects.each do |entry| eid = entry.scaffold_id %>
13
+ <tr>
14
+ <% @scaffold_class.scaffold_fields(@scaffold_listtable_type).each do |column| %>
15
+ <td><%=h entry.scaffold_value(column).to_s %></td>
16
+ <% end %>
17
+ <%= "<td>#{scaffold_button_to(s, scaffold_url(ss, :id=>eid), :method=>:get)}</td>" if show %>
18
+ <%= "<td>#{scaffold_button_to(e, scaffold_url(es, :id=>eid), :method=>:get)}</td>" if edit %>
19
+ <%= "<td>#{scaffold_button_to(d, scaffold_url(ds, :id=>eid))}</td>" if delete %>
20
+ </tr>
21
+ <% end %>
22
+ </tbody></table>
23
+
24
+ <% if @scaffold_listtable_type == :browse %>
25
+ <%= "<a href='#{scaffold_url("browse#{@scaffold_suffix}", :page=>(@page-1))}'>Previous Page</a>" if @page > 1 %>
26
+ <%= "<a href='#{scaffold_url("browse#{@scaffold_suffix}", :page=>(@page+1))}'>Next Page</a>" if @next_page %>
27
+ <% end %>
28
+
29
+ <% if @scaffold_listtable_type == :search && @scaffold_search_results_form_params && (@scaffold_search_results_form_params[:page] > 1 || @scaffold_search_results_form_params[:next_page]) %>
30
+ <%= scaffold_form(scaffold_url("results#{@scaffold_suffix}")) %>
31
+ <%= scaffold_field_tag(:hidden, :value=>@scaffold_search_results_form_params[:page], :id=>'page') %>
32
+ <% @scaffold_search_results_form_params[:model].each do |key, value| -%>
33
+ <%= scaffold_field_tag(:hidden, :value=>value, :id=>"#{@scaffold_singular_name}_#{key}", :name=>"#{@scaffold_singular_name}[#{key}]") %>
34
+ <% end %>
35
+ <% @scaffold_search_results_form_params[:notnull].each do |field| -%>
36
+ <%= scaffold_field_tag(:hidden, :value=>field, :name=>"notnull#{scaffold_param_list_suffix}") %>
37
+ <% end %>
38
+ <% @scaffold_search_results_form_params[:null].each do |field| -%>
39
+ <%= scaffold_field_tag(:hidden, :value=>field, :name=>"null#{scaffold_param_list_suffix}") %>
40
+ <% end %>
41
+ <%= '<input type="submit" name="page_previous" value="Previous Page" >' if @scaffold_search_results_form_params[:page] > 1 %>
42
+ <%= '<input type="submit" name="page_next" value="Next Page" >' if @scaffold_search_results_form_params[:next_page] %>
43
+ </form>
44
+ <% end %>
45
+
46
+ <%= scaffold_manage_link %>
@@ -0,0 +1,15 @@
1
+ <% @scaffold_title = "Manage #{plural_name = @scaffold_options[:plural_lc_human_name]}" %>
2
+ <ul>
3
+ <% [["Browse #{plural_name}", :browse],
4
+ ["Create #{singular_name = @scaffold_options[:singular_lc_human_name]}", :new],
5
+ ["Delete #{singular_name}", :delete],
6
+ ["Edit #{singular_name}", :edit],
7
+ ["Merge #{plural_name}", :merge],
8
+ ["Search #{plural_name}", :search],
9
+ ["Show #{singular_name}", :show]].each do |text, action| -%>
10
+ <% link = scaffold_check_link(text, true, "#{action}#{@scaffold_suffix}") -%>
11
+ <%= "<li>#{link}</li>" unless link == '' %>
12
+ <% end %>
13
+ </ul>
14
+
15
+ <%= scaffold_check_link('Manage Models', true, 'index') %>
@@ -0,0 +1,23 @@
1
+ <% @scaffold_title = "Merge two #{@scaffold_options[:plural_lc_human_name]}" %>
2
+
3
+ <%= scaffold_form(scaffold_url("merge_update#{@scaffold_suffix}")) %>
4
+ <p>Merge:
5
+ <% if @scaffold_class.scaffold_use_auto_complete %>
6
+ <%= scaffold_text_field_tag_with_auto_complete('from', @scaffold_options[:singular_name]) %>
7
+ <% else %>
8
+ <%= scaffold_select_tag('from', @scaffold_objects) %>
9
+ <% end %>
10
+ </p>
11
+
12
+ <p>into:
13
+ <% if @scaffold_class.scaffold_use_auto_complete %>
14
+ <%= scaffold_text_field_tag_with_auto_complete('to', @scaffold_options[:singular_name]) %>
15
+ <% else %>
16
+ <%= scaffold_select_tag('to', @scaffold_objects) %>
17
+ <% end %>
18
+ </p>
19
+
20
+ <input type="submit" value="Merge <%= @scaffold_options[:plural_lc_human_name] %>" />
21
+ </form>
22
+
23
+ <%= scaffold_manage_link %>
@@ -0,0 +1,5 @@
1
+ <% @scaffold_title = "Create new #{@scaffold_options[:singular_lc_human_name]}" %>
2
+
3
+ <%= scaffold_model_form('create', @scaffold_class.scaffold_fields(:new)) %>
4
+
5
+ <%= scaffold_manage_link %>
@@ -0,0 +1,11 @@
1
+ <% @scaffold_title = "Search #{@scaffold_options[:plural_lc_human_name]}" %>
2
+
3
+ <%= scaffold_model_form('results', @scaffold_class.scaffold_fields(:search)) do |form|
4
+ form << "<table class='#{@scaffold_class.scaffold_table_class(:form)}'><tbody>"
5
+ form << "<tr><td><label for='null'>Null Fields</label>:</td><td><select name='null#{scaffold_param_list_suffix}' id='null' multiple='multiple'>#{@scaffold_class.scaffold_search_null_options.collect{|name, i| "<option value='#{i}'>#{name}</option>"}.join("\n")}</select></td></tr>\n"
6
+ form << "<tr><td><label for='notnull'>Not Null Fields</label>:</td><td><select name='notnull#{scaffold_param_list_suffix}' id='notnull' multiple='multiple'>#{@scaffold_class.scaffold_search_null_options.collect{|name, i| "<option value='#{i}'>#{name}</option>"}.join("\n")}</select></td></tr>\n"
7
+ form << '</tbody></table>'
8
+ @scaffold_submit_value = @scaffold_title
9
+ end %>
10
+
11
+ <%= scaffold_manage_link %>
@@ -0,0 +1,19 @@
1
+ <% @scaffold_title = "Showing #{@scaffold_options[:singular_lc_human_name]}" %>
2
+ <% if '' != (edit_link = scaffold_check_link('Edit', true, "edit_#{@scaffold_options[:singular_name]}", :id=>@scaffold_object.scaffold_id)) %>
3
+ <h2><%= edit_link %></h2>
4
+ <% end %>
5
+
6
+ <table id="scaffolded" class="<%= @scaffold_class.scaffold_table_class(:show) %>">
7
+ <thead><tr><th>Attribute</th><th>Value</th></tr></thead>
8
+ <tbody>
9
+ <% @scaffold_class.scaffold_fields(:show).each do |column| %>
10
+ <tr>
11
+ <td><%= @scaffold_class.scaffold_column_name(column) %></td>
12
+ <td><%=h @scaffold_object.scaffold_value(column).to_s %></td>
13
+ </tr>
14
+ <% end %>
15
+ </tbody></table>
16
+
17
+ <%= scaffold_association_links %>
18
+
19
+ <%= scaffold_manage_link %>
@@ -0,0 +1,44 @@
1
+ require 'test/unit'
2
+
3
+ # Simple test framework to check that public facing pages without an id respond successfully
4
+ #
5
+ # This is only a basic check, it does not check that all form submittals work, as that
6
+ # requires that you choose an object to test. If you want to be sure that all parts of
7
+ # Scaffolding Extensions work with your applications, you should extend the tests here to do so.
8
+ class Test::Unit::TestCase
9
+ # Test the scaffold_all_models method using the same arguments as the method
10
+ def self.test_scaffold_all_models(options = {})
11
+ ActionController::Base.send(:scaffold_all_models_parse_options, options).each{|model, options| test_scaffold(model, options)}
12
+ end
13
+
14
+ # Test the scaffold method using the same arguments as the method
15
+ def self.test_scaffold(model, options = {})
16
+ define_method("test_scaffold_#{model.scaffold_name}"){scaffold_test(model, options)}
17
+ end
18
+
19
+ # Test that getting all display actions for the scaffold returns success
20
+ def scaffold_test(model, options = {})
21
+ klass = @controller.class
22
+ methods = options[:only] ? klass.scaffold_normalize_options(options[:only]) : ScaffoldingExtensions::DEFAULT_METHODS
23
+ methods -= klass.scaffold_normalize_options(options[:except]) if options[:except]
24
+ methods.each do |action|
25
+ assert_nothing_raised("Error requesting scaffolded action #{action} for model #{model.name}") do
26
+ get "#{action}_#{model.scaffold_name}"
27
+ end
28
+ assert_response :success, "Response for scaffolded action #{action} for model #{model.name} not :success"
29
+ # # The habtm scaffolds can't be tested without an id. If the fixture for the
30
+ # # main scaffolded class is loaded and it has id = 1, you may want to enable
31
+ # # the following code for testing those scaffolds.
32
+ # model.scaffold_habtm_associations.each do |association|
33
+ # scaffold_habtm_test(model, association, 1)
34
+ # end
35
+ end
36
+ end
37
+
38
+ # Test the habtm scaffold for singular class, many class, and the specific id
39
+ def scaffold_habtm_test(model, association, id)
40
+ action = "edit_#{model.scaffold_name}_#{association}", {:id=>id}
41
+ assert_nothing_raised("Error requesting habtm scaffold #{action}"){get action}
42
+ assert_response :success, "Response for habtm scaffold #{action} not :success"
43
+ end
44
+ end