formtastic-rails3 0.9.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.textile +558 -0
  3. data/Rakefile +103 -0
  4. data/generators/form/USAGE +16 -0
  5. data/generators/form/form_generator.rb +120 -0
  6. data/generators/form/templates/view__form.html.erb +5 -0
  7. data/generators/form/templates/view__form.html.haml +4 -0
  8. data/generators/formtastic/formtastic_generator.rb +24 -0
  9. data/generators/formtastic/templates/formtastic.css +144 -0
  10. data/generators/formtastic/templates/formtastic.rb +54 -0
  11. data/generators/formtastic/templates/formtastic_changes.css +10 -0
  12. data/generators/formtastic_stylesheets/formtastic_stylesheets_generator.rb +16 -0
  13. data/lib/formtastic.rb +1724 -0
  14. data/lib/formtastic/i18n.rb +32 -0
  15. data/lib/formtastic/layout_helper.rb +10 -0
  16. data/lib/generators/formtastic/form/form_generator.rb +85 -0
  17. data/lib/generators/formtastic/form/templates/_form.html.erb +5 -0
  18. data/lib/generators/formtastic/form/templates/_form.html.haml +4 -0
  19. data/lib/generators/formtastic/install/install_generator.rb +23 -0
  20. data/lib/generators/formtastic/install/templates/formtastic.css +144 -0
  21. data/lib/generators/formtastic/install/templates/formtastic.rb +58 -0
  22. data/lib/generators/formtastic/install/templates/formtastic_changes.css +10 -0
  23. data/lib/locale/en.yml +8 -0
  24. data/spec/buttons_spec.rb +149 -0
  25. data/spec/commit_button_spec.rb +377 -0
  26. data/spec/custom_builder_spec.rb +62 -0
  27. data/spec/custom_macros.rb +460 -0
  28. data/spec/defaults_spec.rb +20 -0
  29. data/spec/error_proc_spec.rb +27 -0
  30. data/spec/errors_spec.rb +85 -0
  31. data/spec/form_helper_spec.rb +110 -0
  32. data/spec/i18n_spec.rb +131 -0
  33. data/spec/include_blank_spec.rb +70 -0
  34. data/spec/input_spec.rb +632 -0
  35. data/spec/inputs/boolean_input_spec.rb +93 -0
  36. data/spec/inputs/check_boxes_input_spec.rb +167 -0
  37. data/spec/inputs/country_input_spec.rb +80 -0
  38. data/spec/inputs/currency_input_spec.rb +80 -0
  39. data/spec/inputs/date_input_spec.rb +143 -0
  40. data/spec/inputs/datetime_input_spec.rb +259 -0
  41. data/spec/inputs/file_input_spec.rb +33 -0
  42. data/spec/inputs/hidden_input_spec.rb +52 -0
  43. data/spec/inputs/numeric_input_spec.rb +44 -0
  44. data/spec/inputs/password_input_spec.rb +46 -0
  45. data/spec/inputs/radio_input_spec.rb +152 -0
  46. data/spec/inputs/select_input_spec.rb +470 -0
  47. data/spec/inputs/string_input_spec.rb +47 -0
  48. data/spec/inputs/text_input_spec.rb +33 -0
  49. data/spec/inputs/time_input_spec.rb +128 -0
  50. data/spec/inputs/time_zone_input_spec.rb +102 -0
  51. data/spec/inputs_spec.rb +395 -0
  52. data/spec/label_spec.rb +48 -0
  53. data/spec/layout_helper_spec.rb +42 -0
  54. data/spec/semantic_errors_spec.rb +98 -0
  55. data/spec/semantic_fields_for_spec.rb +44 -0
  56. data/spec/spec.opts +2 -0
  57. data/spec/spec_helper.rb +238 -0
  58. metadata +205 -0
@@ -0,0 +1,32 @@
1
+ module Formtastic
2
+ module I18n
3
+
4
+ DEFAULT_SCOPE = [:formtastic].freeze
5
+ DEFAULT_VALUES = {
6
+ :required => 'required',
7
+ :yes => 'Yes',
8
+ :no => 'No',
9
+ :create => 'Create {{model}}',
10
+ :update => 'Update {{model}}'
11
+ }.freeze
12
+ SCOPES = [
13
+ '{{model}}.{{action}}.{{attribute}}',
14
+ '{{model}}.{{attribute}}',
15
+ '{{attribute}}'
16
+ ]
17
+
18
+ class << self
19
+
20
+ def translate(*args)
21
+ key = args.shift.to_sym
22
+ options = args.extract_options!
23
+ options.reverse_merge!(:default => DEFAULT_VALUES[key])
24
+ options[:scope] = [DEFAULT_SCOPE, options[:scope]].flatten.compact
25
+ ::I18n.translate(key, *(args << options))
26
+ end
27
+ alias :t :translate
28
+
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,10 @@
1
+ module Formtastic
2
+ module LayoutHelper
3
+
4
+ def formtastic_stylesheet_link_tag
5
+ stylesheet_link_tag("formtastic") +
6
+ stylesheet_link_tag("formtastic_changes")
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,85 @@
1
+ # coding: utf-8
2
+ module Formtastic
3
+ class FormGenerator < Rails::Generators::NamedBase
4
+ desc "Generates formtastic form code based on an existing model. By default the " <<
5
+ "generated code will be printed out directly in the terminal, and also copied " <<
6
+ "to clipboard. Can optionally be saved into partial directly."
7
+
8
+ class_option :haml, :type => :boolean, :default => false, :group => :formtastic,
9
+ :desc => "Generate HAML instead of ERB"
10
+
11
+ class_option :partial, :type => :boolean, :default => false, :group => :formtastic,
12
+ :desc => 'Generate a form partial in the model views path, i.e. "_form.html.erb" or "_form.html.haml"'
13
+
14
+ class_option :controller, :type => :string, :default => false, :group => :formtastic,
15
+ :desc => 'Generate for custom controller/view path - in case model and controller namespace is different, i.e. "admin/posts"'
16
+
17
+ def self.source_root
18
+ @source_root ||= File.expand_path("../templates", __FILE__)
19
+ end
20
+
21
+ def self.banner
22
+ "rails generate formtastic:form ExistingModelName [options]"
23
+ end
24
+
25
+ def create_or_show
26
+ if options[:partial]
27
+ empty_directory "app/views/#{controller_path}"
28
+ template "_form.html.#{template_type}", "app/views/#{controller_path}/_form.html.#{template_type}"
29
+ else
30
+ template = File.read("#{self.class.source_root}/_form.html.#{template_type}")
31
+ erb = ERB.new(template, nil, '-')
32
+ generated_code = erb.result(binding).strip rescue nil
33
+
34
+ puts "# ---------------------------------------------------------"
35
+ puts "# GENERATED FORMTASTIC CODE"
36
+ puts "# ---------------------------------------------------------"
37
+ puts
38
+ puts generated_code || "Nothing could be generated - model exists?"
39
+ puts
40
+ puts "# ---------------------------------------------------------"
41
+ puts "Copied to clipboard - just paste it!" if save_to_clipboard(generated_code)
42
+ end
43
+ end
44
+
45
+ protected
46
+
47
+ IGNORED_COLUMNS = [:updated_at, :created_at].freeze
48
+
49
+ def template_type
50
+ @template_type ||= options[:haml] ? :haml : :erb
51
+ end
52
+
53
+ def controller_path
54
+ @controller_path ||= if options[:controller]
55
+ options[:controller].underscore
56
+ else
57
+ name.underscore.pluralize
58
+ end
59
+ end
60
+
61
+ def columns
62
+ @columns ||= self.name.camelize.constantize.content_columns.reject { |column| IGNORED_COLUMNS.include?(column.name.to_sym) }
63
+ end
64
+
65
+ def save_to_clipboard(data)
66
+ return unless data
67
+
68
+ begin
69
+ case RUBY_PLATFORM
70
+ when /win32/
71
+ require 'win32/clipboard'
72
+ ::Win32::Clipboard.data = data
73
+ when /darwin/ # mac
74
+ `echo "#{data}" | pbcopy`
75
+ else # linux/unix
76
+ `echo "#{data}" | xsel --clipboard` || `echo "#{data}" | xclip`
77
+ end
78
+ rescue LoadError
79
+ false
80
+ else
81
+ true
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,5 @@
1
+ <%% f.inputs do %>
2
+ <% columns.each do |column| -%>
3
+ <%%= f.input :<%= column.name %>, :label => '<%= column.name.humanize %>' %>
4
+ <% end -%>
5
+ <%% end %>
@@ -0,0 +1,4 @@
1
+ - f.inputs do
2
+ <% columns.each do |column| -%>
3
+ = f.input :<%= column.name %>, :label => '<%= column.name.humanize %>'
4
+ <% end -%>
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+ module Formtastic
3
+ class InstallGenerator < Rails::Generators::Base
4
+ desc "Copies formtastic.css and formtastic_changes.css to public/stylesheets/ and a config initializer to config/initializers/formtastic_config.rb"
5
+
6
+ def self.source_root
7
+ @source_root ||= File.expand_path("../templates", __FILE__)
8
+ end
9
+
10
+ def self.banner
11
+ "rails generate formtastic:install [options]"
12
+ end
13
+
14
+ def copy_files
15
+ empty_directory 'config/initializers'
16
+ template 'formtastic.rb', 'config/initializers/formtastic.rb'
17
+
18
+ empty_directory 'public/stylesheets'
19
+ template 'formtastic.css', 'public/stylesheets/formtastic.css'
20
+ template 'formtastic_changes.css', 'public/stylesheets/formtastic_changes.css'
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,144 @@
1
+ /* -------------------------------------------------------------------------------------------------
2
+
3
+ It's *strongly* suggested that you don't modify this file. Instead, load a new stylesheet after
4
+ this one in your layouts (eg formtastic_changes.css) and override the styles to suit your needs.
5
+ This will allow you to update formtastic.css with new releases without clobbering your own changes.
6
+
7
+ This stylesheet forms part of the Formtastic Rails Plugin
8
+ (c) 2008 Justin French
9
+
10
+ --------------------------------------------------------------------------------------------------*/
11
+
12
+
13
+ /* NORMALIZE AND RESET - obviously inspired by Yahoo's reset.css, but scoped to just form.formtastic
14
+ --------------------------------------------------------------------------------------------------*/
15
+ form.formtastic, form.formtastic ul, form.formtastic ol, form.formtastic li, form.formtastic fieldset, form.formtastic legend, form.formtastic input, form.formtastic textarea, form.formtastic select, form.formtastic p { margin:0; padding:0; }
16
+ form.formtastic fieldset { border:0; }
17
+ form.formtastic em, form.formtastic strong { font-style:normal; font-weight:normal; }
18
+ form.formtastic ol, form.formtastic ul { list-style:none; }
19
+ form.formtastic abbr, form.formtastic acronym { border:0; font-variant:normal; }
20
+ form.formtastic input, form.formtastic textarea, form.formtastic select { font-family:inherit; font-size:inherit; font-weight:inherit; }
21
+ form.formtastic input, form.formtastic textarea, form.formtastic select { font-size:100%; }
22
+ form.formtastic legend { color:#000; }
23
+
24
+
25
+ /* SEMANTIC ERRORS
26
+ --------------------------------------------------------------------------------------------------*/
27
+ form.formtastic ul.errors { color:#cc0000; margin:0.5em 0 1.5em 25%; list-style:square; }
28
+ form.formtastic ul.errors li { padding:0; border:none; display:list-item; }
29
+
30
+
31
+ /* FIELDSETS & LISTS
32
+ --------------------------------------------------------------------------------------------------*/
33
+ form.formtastic fieldset { }
34
+ form.formtastic fieldset.inputs { }
35
+ form.formtastic fieldset.buttons { padding-left:25%; }
36
+ form.formtastic fieldset ol { }
37
+ form.formtastic fieldset.buttons li { float:left; padding-right:0.5em; }
38
+
39
+ /* clearfixing the fieldsets */
40
+ form.formtastic fieldset { display: inline-block; }
41
+ form.formtastic fieldset:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
42
+ html[xmlns] form.formtastic fieldset { display: block; }
43
+ * html form.formtastic fieldset { height: 1%; }
44
+
45
+
46
+ /* INPUT LIs
47
+ --------------------------------------------------------------------------------------------------*/
48
+ form.formtastic fieldset ol li { margin-bottom:1.5em; }
49
+
50
+ /* clearfixing the li's */
51
+ form.formtastic fieldset ol li { display: inline-block; }
52
+ form.formtastic fieldset ol li:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
53
+ html[xmlns] form.formtastic fieldset ol li { display: block; }
54
+ * html form.formtastic fieldset ol li { height: 1%; }
55
+
56
+ form.formtastic fieldset ol li.required { }
57
+ form.formtastic fieldset ol li.optional { }
58
+ form.formtastic fieldset ol li.error { }
59
+
60
+
61
+ /* LABELS
62
+ --------------------------------------------------------------------------------------------------*/
63
+ form.formtastic fieldset ol li label { display:block; width:25%; float:left; padding-top:.2em; }
64
+ form.formtastic fieldset ol li li label { line-height:100%; padding-top:0; }
65
+ form.formtastic fieldset ol li li label input { line-height:100%; vertical-align:middle; margin-top:-0.1em;}
66
+
67
+
68
+ /* NESTED FIELDSETS AND LEGENDS (radio, check boxes and date/time inputs use nested fieldsets)
69
+ --------------------------------------------------------------------------------------------------*/
70
+ form.formtastic fieldset ol li fieldset { position:relative; }
71
+ form.formtastic fieldset ol li fieldset legend { position:absolute; width:25%; padding-top:0.1em; }
72
+ form.formtastic fieldset ol li fieldset legend span { position:absolute; }
73
+ form.formtastic fieldset ol li fieldset legend.label label { position:absolute; }
74
+ form.formtastic fieldset ol li fieldset ol { float:left; width:74%; margin:0; padding:0 0 0 25%; }
75
+ form.formtastic fieldset ol li fieldset ol li { padding:0; border:0; }
76
+
77
+
78
+ /* INLINE HINTS
79
+ --------------------------------------------------------------------------------------------------*/
80
+ form.formtastic fieldset ol li p.inline-hints { color:#666; margin:0.5em 0 0 25%; }
81
+
82
+
83
+ /* INLINE ERRORS
84
+ --------------------------------------------------------------------------------------------------*/
85
+ form.formtastic fieldset ol li p.inline-errors { color:#cc0000; margin:0.5em 0 0 25%; }
86
+ form.formtastic fieldset ol li ul.errors { color:#cc0000; margin:0.5em 0 0 25%; list-style:square; }
87
+ form.formtastic fieldset ol li ul.errors li { padding:0; border:none; display:list-item; }
88
+
89
+
90
+ /* STRING & NUMERIC OVERRIDES
91
+ --------------------------------------------------------------------------------------------------*/
92
+ form.formtastic fieldset ol li.string input { width:74%; }
93
+ form.formtastic fieldset ol li.password input { width:74%; }
94
+ form.formtastic fieldset ol li.numeric input { width:74%; }
95
+
96
+
97
+ /* TEXTAREA OVERRIDES
98
+ --------------------------------------------------------------------------------------------------*/
99
+ form.formtastic fieldset ol li.text textarea { width:74%; }
100
+
101
+
102
+ /* HIDDEN OVERRIDES
103
+ --------------------------------------------------------------------------------------------------*/
104
+ form.formtastic fieldset ol li.hidden { display:none; }
105
+
106
+
107
+ /* BOOLEAN OVERRIDES
108
+ --------------------------------------------------------------------------------------------------*/
109
+ form.formtastic fieldset ol li.boolean label { padding-left:25%; width:auto; }
110
+ form.formtastic fieldset ol li.boolean label input { margin:0 0.5em 0 0.2em; }
111
+
112
+
113
+ /* RADIO OVERRIDES
114
+ --------------------------------------------------------------------------------------------------*/
115
+ form.formtastic fieldset ol li.radio { }
116
+ form.formtastic fieldset ol li.radio fieldset ol { margin-bottom:-0.6em; }
117
+ form.formtastic fieldset ol li.radio fieldset ol li { margin:0.1em 0 0.5em 0; }
118
+ form.formtastic fieldset ol li.radio fieldset ol li label { float:none; width:100%; }
119
+ form.formtastic fieldset ol li.radio fieldset ol li label input { margin-right:0.2em; }
120
+
121
+
122
+ /* CHECK BOXES (COLLECTION) OVERRIDES
123
+ --------------------------------------------------------------------------------------------------*/
124
+ form.formtastic fieldset ol li.check_boxes { }
125
+ form.formtastic fieldset ol li.check_boxes fieldset ol { margin-bottom:-0.6em; }
126
+ form.formtastic fieldset ol li.check_boxes fieldset ol li { margin:0.1em 0 0.5em 0; }
127
+ form.formtastic fieldset ol li.check_boxes fieldset ol li label { float:none; width:100%; }
128
+ form.formtastic fieldset ol li.check_boxes fieldset ol li label input { margin-right:0.2em; }
129
+
130
+
131
+
132
+ /* DATE & TIME OVERRIDES
133
+ --------------------------------------------------------------------------------------------------*/
134
+ form.formtastic fieldset ol li.date fieldset ol li,
135
+ form.formtastic fieldset ol li.time fieldset ol li,
136
+ form.formtastic fieldset ol li.datetime fieldset ol li { float:left; width:auto; margin:0 .3em 0 0; }
137
+
138
+ form.formtastic fieldset ol li.date fieldset ol li label,
139
+ form.formtastic fieldset ol li.time fieldset ol li label,
140
+ form.formtastic fieldset ol li.datetime fieldset ol li label { display:none; }
141
+
142
+ form.formtastic fieldset ol li.date fieldset ol li label input,
143
+ form.formtastic fieldset ol li.time fieldset ol li label input,
144
+ form.formtastic fieldset ol li.datetime fieldset ol li label input { display:inline; margin:0; padding:0; }
@@ -0,0 +1,58 @@
1
+ # Set the default text field size when input is a string. Default is 50.
2
+ # Formtastic::SemanticFormBuilder.default_text_field_size = 50
3
+
4
+ # Set the default text area height when input is a text. Default is 20.
5
+ # Formtastic::SemanticFormBuilder.default_text_area_height = 5
6
+
7
+ # Should all fields be considered "required" by default?
8
+ # Defaults to true, see ValidationReflection notes below.
9
+ # Formtastic::SemanticFormBuilder.all_fields_required_by_default = true
10
+
11
+ # Should select fields have a blank option/prompt by default?
12
+ # Defaults to true.
13
+ # Formtastic::SemanticFormBuilder.include_blank_for_select_by_default = true
14
+
15
+ # Set the string that will be appended to the labels/fieldsets which are required
16
+ # It accepts string or procs and the default is a localized version of
17
+ # '<abbr title="required">*</abbr>'. In other words, if you configure formtastic.required
18
+ # in your locale, it will replace the abbr title properly. But if you don't want to use
19
+ # abbr tag, you can simply give a string as below
20
+ # Formtastic::SemanticFormBuilder.required_string = "(required)"
21
+
22
+ # Set the string that will be appended to the labels/fieldsets which are optional
23
+ # Defaults to an empty string ("") and also accepts procs (see required_string above)
24
+ # Formtastic::SemanticFormBuilder.optional_string = "(optional)"
25
+
26
+ # Set the way inline errors will be displayed.
27
+ # Defaults to :sentence, valid options are :sentence, :list and :none
28
+ # Formtastic::SemanticFormBuilder.inline_errors = :sentence
29
+
30
+ # Set the method to call on label text to transform or format it for human-friendly
31
+ # reading when formtastic is user without object. Defaults to :humanize.
32
+ # Formtastic::SemanticFormBuilder.label_str_method = :humanize
33
+
34
+ # Set the array of methods to try calling on parent objects in :select and :radio inputs
35
+ # for the text inside each @<option>@ tag or alongside each radio @<input>@. The first method
36
+ # that is found on the object will be used.
37
+ # Defaults to ["to_label", "display_name", "full_name", "name", "title", "username", "login", "value", "to_s"]
38
+ # Formtastic::SemanticFormBuilder.collection_label_methods = [
39
+ # "to_label", "display_name", "full_name", "name", "title", "username", "login", "value", "to_s"]
40
+
41
+ # Formtastic by default renders inside li tags the input, hints and then
42
+ # errors messages. Sometimes you want the hints to be rendered first than
43
+ # the input, in the following order: hints, input and errors. You can
44
+ # customize it doing just as below:
45
+ # Formtastic::SemanticFormBuilder.inline_order = [:input, :hints, :errors]
46
+
47
+ # Formtastic by default renders inside li tags you can customize it to render
48
+ # with div tags if required
49
+ # Formtastic::SemanticFormBuilder.item_separator = :div
50
+
51
+ # Specifies if labels/hints for input fields automatically be looked up using I18n.
52
+ # Default value: false. Overridden for specific fields by setting value to true,
53
+ # i.e. :label => true, or :hint => true (or opposite depending on initialized value)
54
+ # Formtastic::SemanticFormBuilder.i18n_lookups_by_default = false
55
+
56
+ # You can add custom inputs or override parts of Formtastic by subclassing SemanticFormBuilder and
57
+ # specifying that class here. Defaults to SemanticFormBuilder.
58
+ # Formtastic::SemanticFormHelper.builder = MyCustomBuilder
@@ -0,0 +1,10 @@
1
+ /* -------------------------------------------------------------------------------------------------
2
+
3
+ Load this stylesheet after formtastic.css in your layouts to override the CSS to suit your needs.
4
+ This will allow you to update formtastic.css with new releases without clobbering your own changes.
5
+
6
+ For example, to make the inline hint paragraphs a little darker in color than the standard #666:
7
+
8
+ form.formtastic fieldset ol li p.inline-hints { color:#333; }
9
+
10
+ --------------------------------------------------------------------------------------------------*/
data/lib/locale/en.yml ADDED
@@ -0,0 +1,8 @@
1
+ en:
2
+ formtastic:
3
+ :yes: 'Yes'
4
+ :no: 'No'
5
+ create: 'Create'
6
+ save: 'Save'
7
+ submit: 'Submit'
8
+ required: 'Required'
@@ -0,0 +1,149 @@
1
+ # coding: utf-8
2
+ require File.dirname(__FILE__) + '/spec_helper'
3
+
4
+ describe 'SemanticFormBuilder#buttons' do
5
+
6
+ include FormtasticSpecHelper
7
+
8
+ before do
9
+ @output_buffer = ActiveSupport::SafeBuffer.new
10
+ mock_everything
11
+ end
12
+
13
+ describe 'with a block' do
14
+ describe 'when no options are provided' do
15
+ before do
16
+ semantic_form_for(@new_post) do |builder|
17
+ builder.buttons do
18
+ concat('hello')
19
+ end
20
+ end
21
+ end
22
+
23
+ it 'should render a fieldset inside the form, with a class of "inputs"' do
24
+ output_buffer.should have_tag("form fieldset.buttons")
25
+ end
26
+
27
+ it 'should render an ol inside the fieldset' do
28
+ output_buffer.should have_tag("form fieldset.buttons ol")
29
+ end
30
+
31
+ it 'should render the contents of the block inside the ol' do
32
+ output_buffer.should have_tag("form fieldset.buttons ol", /hello/)
33
+ end
34
+
35
+ it 'should not render a legend inside the fieldset' do
36
+ output_buffer.should_not have_tag("form fieldset.buttons legend")
37
+ end
38
+ end
39
+
40
+ describe 'when a :name option is provided' do
41
+ before do
42
+ @legend_text = "Advanced options"
43
+
44
+ semantic_form_for(@new_post) do |builder|
45
+ builder.buttons :name => @legend_text do
46
+ end
47
+ end
48
+ end
49
+ it 'should render a fieldset inside the form' do
50
+ output_buffer.should have_tag("form fieldset legend", /#{@legend_text}/)
51
+ end
52
+ end
53
+
54
+ describe 'when other options are provided' do
55
+ before do
56
+ @id_option = 'advanced'
57
+ @class_option = 'wide'
58
+
59
+ semantic_form_for(@new_post) do |builder|
60
+ builder.buttons :id => @id_option, :class => @class_option do
61
+ end
62
+ end
63
+ end
64
+ it 'should pass the options into the fieldset tag as attributes' do
65
+ output_buffer.should have_tag("form fieldset##{@id_option}")
66
+ output_buffer.should have_tag("form fieldset.#{@class_option}")
67
+ end
68
+ end
69
+
70
+ end
71
+
72
+ describe 'without a block' do
73
+
74
+ describe 'with no args (default buttons)' do
75
+
76
+ before do
77
+ semantic_form_for(@new_post) do |builder|
78
+ concat(builder.buttons)
79
+ end
80
+ end
81
+
82
+ it 'should render a form' do
83
+ output_buffer.should have_tag('form')
84
+ end
85
+
86
+ it 'should render a buttons fieldset inside the form' do
87
+ output_buffer.should have_tag('form fieldset.buttons')
88
+ end
89
+
90
+ it 'should not render a legend in the fieldset' do
91
+ output_buffer.should_not have_tag('form fieldset.buttons legend')
92
+ end
93
+
94
+ it 'should render an ol in the fieldset' do
95
+ output_buffer.should have_tag('form fieldset.buttons ol')
96
+ end
97
+
98
+ it 'should render a list item in the ol for each default button' do
99
+ output_buffer.should have_tag('form fieldset.buttons ol li', :count => 1)
100
+ end
101
+
102
+ it 'should render a commit list item for the commit button' do
103
+ output_buffer.should have_tag('form fieldset.buttons ol li.commit')
104
+ end
105
+
106
+ end
107
+
108
+ describe 'with button names as args' do
109
+
110
+ before do
111
+ semantic_form_for(@new_post) do |builder|
112
+ concat(builder.buttons(:commit))
113
+ end
114
+ end
115
+
116
+ it 'should render a form with a fieldset containing a list item for each button arg' do
117
+ output_buffer.should have_tag('form > fieldset.buttons > ol > li', :count => 1)
118
+ output_buffer.should have_tag('form > fieldset.buttons > ol > li.commit')
119
+ end
120
+
121
+ end
122
+
123
+ describe 'with button names as args and an options hash' do
124
+
125
+ before do
126
+ semantic_form_for(@new_post) do |builder|
127
+ concat(builder.buttons(:commit, :name => "Now click a button", :id => "my-id"))
128
+ end
129
+ end
130
+
131
+ it 'should render a form with a fieldset containing a list item for each button arg' do
132
+ output_buffer.should have_tag('form > fieldset.buttons > ol > li', :count => 1)
133
+ output_buffer.should have_tag('form > fieldset.buttons > ol > li.commit', :count => 1)
134
+ end
135
+
136
+ it 'should pass the options down to the fieldset' do
137
+ output_buffer.should have_tag('form > fieldset#my-id.buttons')
138
+ end
139
+
140
+ it 'should use the special :name option as a text for the legend tag' do
141
+ output_buffer.should have_tag('form > fieldset#my-id.buttons > legend', /Now click a button/)
142
+ end
143
+
144
+ end
145
+
146
+ end
147
+
148
+ end
149
+