bootstrap_forms 2.0.1 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +1 -0
- data/.travis.yml +1 -0
- data/bootstrap_forms.gemspec +2 -2
- data/lib/bootstrap_forms/form_builder.rb +7 -6
- data/lib/bootstrap_forms/helpers/form_helper.rb +8 -4
- data/lib/bootstrap_forms/helpers/form_tag_helper.rb +5 -6
- data/lib/bootstrap_forms/helpers/wrappers.rb +3 -3
- data/spec/dummy/config/initializers/session_store.rb +1 -1
- data/spec/dummy/config/initializers/wrap_parameters.rb +1 -1
- data/spec/lib/bootstrap_forms/form_builder_spec.rb +37 -142
- data/spec/spec_helper.rb +5 -1
- data/spec/support/shared_context.rb +184 -0
- metadata +9 -9
- data/spec/dummy/log/development.log +0 -0
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/bootstrap_forms.gemspec
CHANGED
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "bootstrap_forms"
|
6
|
-
s.version = "2.0.
|
6
|
+
s.version = "2.0.2"
|
7
7
|
s.author = "Seth Vargo"
|
8
8
|
s.email = "sethvargo@gmail.com"
|
9
9
|
s.homepage = "https://github.com/sethvargo/bootstrap_forms"
|
@@ -15,7 +15,7 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
16
16
|
s.require_paths = ["lib"]
|
17
17
|
|
18
|
-
s.add_development_dependency "rspec-rails", "~> 2.
|
18
|
+
s.add_development_dependency "rspec-rails", "~> 2.10.1"
|
19
19
|
s.add_development_dependency "capybara", "~> 1.1.0"
|
20
20
|
s.add_development_dependency "rake"
|
21
21
|
s.add_development_dependency "rails", "~> 3.2.0"
|
@@ -5,7 +5,7 @@ module BootstrapForms
|
|
5
5
|
delegate :content_tag, :hidden_field_tag, :check_box_tag, :radio_button_tag, :button_tag, :link_to, :to => :@template
|
6
6
|
|
7
7
|
def error_messages
|
8
|
-
if object.errors.full_messages.any?
|
8
|
+
if object.try(:errors) and object.errors.full_messages.any?
|
9
9
|
content_tag(:div, :class => 'alert alert-block alert-error validation-errors') do
|
10
10
|
content_tag(:h4, I18n.t('bootstrap_forms.errors.header', :model => object.class.model_name.human), :class => 'alert-heading') +
|
11
11
|
content_tag(:ul) do
|
@@ -53,16 +53,15 @@ module BootstrapForms
|
|
53
53
|
|
54
54
|
def radio_buttons(name, values = {}, opts = {})
|
55
55
|
@name = name
|
56
|
-
@options = opts
|
57
56
|
@field_options = opts
|
58
57
|
control_group_div do
|
59
58
|
label_field + input_div do
|
60
59
|
values.map do |text, value|
|
61
60
|
if @field_options[:label] == '' || @field_options[:label] == false
|
62
|
-
extras { radio_button(name, value, @
|
61
|
+
extras { radio_button(name, value, @field_options) + text }
|
63
62
|
else
|
64
63
|
label("#{@name}_#{value}", :class => [ 'radio', required_class ].compact.join(' ')) do
|
65
|
-
extras { radio_button(name, value, @
|
64
|
+
extras { radio_button(name, value, @field_options) + text }
|
66
65
|
end
|
67
66
|
end
|
68
67
|
end.join.html_safe
|
@@ -120,8 +119,10 @@ module BootstrapForms
|
|
120
119
|
control_group_div do
|
121
120
|
label_field + input_div do
|
122
121
|
extras do
|
123
|
-
|
124
|
-
|
122
|
+
options = { :class => 'uneditable-input' }
|
123
|
+
options[:id] = @field_options[:id] if @field_options[:id]
|
124
|
+
content_tag(:span, options) do
|
125
|
+
@field_options[:value] || object.send(@name.to_sym) rescue nil
|
125
126
|
end
|
126
127
|
end
|
127
128
|
end
|
@@ -1,17 +1,21 @@
|
|
1
1
|
module BootstrapForms
|
2
2
|
module Helpers
|
3
|
-
module FormHelper
|
3
|
+
module FormHelper
|
4
4
|
def bootstrap_form_for(record, options = {}, &block)
|
5
5
|
options[:builder] = BootstrapForms::FormBuilder
|
6
6
|
form_for(record, options) do |f|
|
7
|
-
f.
|
7
|
+
if f.object.respond_to?(:errors)
|
8
|
+
f.error_messages.html_safe + capture(f, &block).html_safe
|
9
|
+
else
|
10
|
+
capture(f, &block).html_safe
|
11
|
+
end
|
8
12
|
end
|
9
13
|
end
|
10
|
-
|
14
|
+
|
11
15
|
def bootstrap_fields_for(record, options = {}, &block)
|
12
16
|
options[:builder] = BootstrapForms::FormBuilder
|
13
17
|
fields_for(record, nil, options, &block)
|
14
18
|
end
|
15
19
|
end
|
16
20
|
end
|
17
|
-
end
|
21
|
+
end
|
@@ -7,17 +7,16 @@ module BootstrapForms
|
|
7
7
|
form_tag(url_for_options, options, &block)
|
8
8
|
end
|
9
9
|
|
10
|
-
%w(
|
10
|
+
%w(check_box_tag email_field_tag file_field_tag image_submit_tag number_field_tag password_field_tag phone_field_tag radio_button_tag range_field_tag search_field_tag select_tag telephone_field_tag text_area_tag text_field_tag url_field_tag).each do |method_name|
|
11
11
|
# prefix each method with bootstrap_*
|
12
12
|
define_method("bootstrap_#{method_name}") do |name, *args|
|
13
|
-
value = args.shift
|
14
13
|
@name = name
|
15
14
|
@field_options = args.extract_options!
|
16
15
|
@args = args
|
17
16
|
|
18
17
|
control_group_div do
|
19
18
|
label_field + input_div do
|
20
|
-
extras { send(method_name.to_sym, name,
|
19
|
+
extras { send(method_name.to_sym, name, *(@args << @field_options)) }
|
21
20
|
end
|
22
21
|
end
|
23
22
|
end
|
@@ -27,12 +26,12 @@ module BootstrapForms
|
|
27
26
|
@name = name
|
28
27
|
@field_options = args.extract_options!
|
29
28
|
@args = args
|
30
|
-
|
29
|
+
|
31
30
|
control_group_div do
|
32
31
|
label_field + input_div do
|
33
32
|
extras do
|
34
33
|
content_tag(:span, :class => 'uneditable-input') do
|
35
|
-
@field_options[:value]
|
34
|
+
@field_options[:value]
|
36
35
|
end
|
37
36
|
end
|
38
37
|
end
|
@@ -73,4 +72,4 @@ module BootstrapForms
|
|
73
72
|
end
|
74
73
|
end
|
75
74
|
end
|
76
|
-
end
|
75
|
+
end
|
@@ -20,7 +20,7 @@ module BootstrapForms
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def error_string
|
23
|
-
if respond_to?(:object)
|
23
|
+
if respond_to?(:object) and object.respond_to?(:errors)
|
24
24
|
errors = object.errors[@name]
|
25
25
|
if errors.present?
|
26
26
|
errors.map { |e|
|
@@ -31,7 +31,7 @@ module BootstrapForms
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def human_attribute_name
|
34
|
-
object.class.human_attribute_name(@name)
|
34
|
+
object.class.human_attribute_name(@name) rescue @name.titleize
|
35
35
|
end
|
36
36
|
|
37
37
|
def input_div(&block)
|
@@ -61,7 +61,7 @@ module BootstrapForms
|
|
61
61
|
|
62
62
|
def required_class
|
63
63
|
return 'required' if @field_options[:required]
|
64
|
-
if respond_to?(:object)
|
64
|
+
if respond_to?(:object) and object.respond_to?(:errors)
|
65
65
|
return 'required' if object.class.validators_on(@name).any? { |v| v.kind_of? ActiveModel::Validations::PresenceValidator }
|
66
66
|
end
|
67
67
|
nil
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# Be sure to restart your server when you modify this file.
|
2
2
|
|
3
|
-
Dummy::Application.config.session_store :cookie_store, key
|
3
|
+
Dummy::Application.config.session_store :cookie_store, :key => '_dummy_session'
|
4
4
|
|
5
5
|
# Use the database for sessions instead of the cookie-based default,
|
6
6
|
# which shouldn't be used to store highly confidential information
|
@@ -4,7 +4,7 @@
|
|
4
4
|
# is enabled by default.
|
5
5
|
|
6
6
|
# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
|
7
|
-
ActionController::Base.wrap_parameters format
|
7
|
+
ActionController::Base.wrap_parameters :format => [:json] if ActionController::Base.respond_to?(:wrap_parameters)
|
8
8
|
|
9
9
|
# Disable root element in JSON by default.
|
10
10
|
if defined?(ActiveRecord)
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe "BootstrapForms::FormBuilder" do
|
4
4
|
context "given a setup builder" do
|
@@ -9,6 +9,8 @@ describe "BootstrapForms::FormBuilder" do
|
|
9
9
|
@builder = BootstrapForms::FormBuilder.new(:item, @project, @template, {}, proc {})
|
10
10
|
end
|
11
11
|
|
12
|
+
it_behaves_like 'a bootstrap form'
|
13
|
+
|
12
14
|
describe "with no options" do
|
13
15
|
describe "error_messages" do
|
14
16
|
it "returns empty string without errors" do
|
@@ -42,162 +44,55 @@ describe "BootstrapForms::FormBuilder" do
|
|
42
44
|
end
|
43
45
|
end
|
44
46
|
end
|
47
|
+
end
|
45
48
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
it "has textarea input" do
|
52
|
-
@result.should match /textarea/
|
53
|
-
end
|
49
|
+
context "with errors" do
|
50
|
+
before(:each) do
|
51
|
+
@project.errors.add("name")
|
52
|
+
@result = @builder.error_messages
|
54
53
|
end
|
55
54
|
|
56
|
-
|
57
|
-
|
58
|
-
@builder.check_box("name").should == "<div class=\"control-group\"><div class=\"controls\"><label class=\"checkbox\" for=\"item_name\"><input name=\"item[name]\" type=\"hidden\" value=\"0\" /><input id=\"item_name\" name=\"item[name]\" type=\"checkbox\" value=\"1\" />Name</label></div></div>"
|
59
|
-
end
|
60
|
-
|
61
|
-
it "allows custom label" do
|
62
|
-
@builder.check_box("name", :label => "custom label").should match /custom label<\/label>/
|
63
|
-
end
|
64
|
-
|
65
|
-
it "allows no label with :label => false " do
|
66
|
-
@builder.check_box("name", :label => false).should_not match /<\/label>/
|
67
|
-
end
|
68
|
-
it "allows no label with :label => '' " do
|
69
|
-
@builder.check_box("name", :label => '').should_not match /<\/label>/
|
70
|
-
end
|
55
|
+
it "is wrapped in error div" do
|
56
|
+
@result.should match /^<div class="alert alert-block alert-error validation-errors">.*<\/div>$/
|
71
57
|
end
|
72
58
|
|
73
|
-
|
74
|
-
|
75
|
-
@builder.text_field :name, :label => 'Heading', :help_inline => 'Inline help', :help_block => 'Block help'
|
76
|
-
@builder.radio_buttons(:name, {"One"=>"1", "Two"=>"2"}).should == "<div class=\"control-group\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><label class=\"radio\" for=\"item_name_1\"><input id=\"item_name_1\" name=\"item[name]\" type=\"radio\" value=\"1\" />One</label><label class=\"radio\" for=\"item_name_2\"><input id=\"item_name_2\" name=\"item[name]\" type=\"radio\" value=\"2\" />Two</label></div></div>"
|
77
|
-
end
|
78
|
-
|
79
|
-
it "sets field_options" do
|
80
|
-
@builder.radio_buttons(:name, {"One" => "1", "Two" => "2"})
|
81
|
-
@builder.instance_variable_get("@field_options").should == {:error => nil}
|
82
|
-
end
|
83
|
-
|
84
|
-
it "generates wrapped input" do
|
85
|
-
@builder.radio_buttons(:name, {"One" => "1", "Two" => "2"}).should == "<div class=\"control-group\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><label class=\"radio\" for=\"item_name_1\"><input id=\"item_name_1\" name=\"item[name]\" type=\"radio\" value=\"1\" />One</label><label class=\"radio\" for=\"item_name_2\"><input id=\"item_name_2\" name=\"item[name]\" type=\"radio\" value=\"2\" />Two</label></div></div>"
|
86
|
-
end
|
87
|
-
|
88
|
-
it "allows custom label" do
|
89
|
-
@builder.radio_buttons(:name, {"One" => "1", "Two" => "2"}, {:label => "custom label"}).should match /custom label<\/label>/
|
90
|
-
end
|
59
|
+
it "has a list with errors" do
|
60
|
+
@result.should match /<ul><li>Name is invalid<\/li><\/ul>/
|
91
61
|
end
|
92
62
|
|
93
|
-
|
94
|
-
|
95
|
-
context "result" do
|
96
|
-
before(:each) do
|
97
|
-
@result = @builder.send(field, "name")
|
98
|
-
end
|
99
|
-
|
100
|
-
it "is wrapped" do
|
101
|
-
@result.should match /^<div class=\"control-group\"><label class=\"control-label\" for=\"item_name\">Name<\/label><div class=\"controls\">.*<\/div><\/div>$/
|
102
|
-
end
|
103
|
-
|
104
|
-
it "has an input of type: #{type}" do
|
105
|
-
@result.should match /<input.*type=["#{type}"]/
|
106
|
-
end
|
107
|
-
end # result
|
108
|
-
|
109
|
-
context "call expectations" do
|
110
|
-
%w(control_group_div label_field input_div extras).map(&:to_sym).each do |method|
|
111
|
-
it "calls #{method}" do
|
112
|
-
@builder.should_receive(method).and_return("")
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
after(:each) do
|
117
|
-
@builder.send(field, "name")
|
118
|
-
end
|
119
|
-
end # call expectations
|
120
|
-
|
121
|
-
end # field
|
122
|
-
end # fields
|
123
|
-
end # no options
|
124
|
-
|
125
|
-
describe "extras" do
|
126
|
-
context "text_field" do
|
127
|
-
it "adds span for inline help" do
|
128
|
-
@builder.text_field(:name, :help_inline => 'help me!').should == "<div class=\"control-group\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><input id=\"item_name\" name=\"item[name]\" size=\"30\" type=\"text\" /><span class=\"help-inline\">help me!</span></div></div>"
|
129
|
-
end
|
130
|
-
|
131
|
-
it "adds help block" do
|
132
|
-
@builder.text_field(:name, :help_block => 'help me!').should == "<div class=\"control-group\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><input id=\"item_name\" name=\"item[name]\" size=\"30\" type=\"text\" /><p class=\"help-block\">help me!</p></div></div>"
|
133
|
-
end
|
134
|
-
|
135
|
-
it "adds error message and class" do
|
136
|
-
@builder.text_field(:name, :error => 'This is an error!').should == "<div class=\"control-group error\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><input id=\"item_name\" name=\"item[name]\" size=\"30\" type=\"text\" /><span class=\"help-inline\">This is an error!</span></div></div>"
|
137
|
-
end
|
138
|
-
|
139
|
-
it "adds success message and class" do
|
140
|
-
@builder.text_field(:name, :success => 'This checked out OK').should == "<div class=\"control-group success\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><input id=\"item_name\" name=\"item[name]\" size=\"30\" type=\"text\" /><span class=\"help-inline\">This checked out OK</span></div></div>"
|
141
|
-
end
|
142
|
-
|
143
|
-
it "adds warning message and class" do
|
144
|
-
@builder.text_field(:name, :warning => 'Take a look at this...').should == "<div class=\"control-group warning\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><input id=\"item_name\" name=\"item[name]\" size=\"30\" type=\"text\" /><span class=\"help-inline\">Take a look at this...</span></div></div>"
|
145
|
-
end
|
146
|
-
|
147
|
-
it "prepends passed text" do
|
148
|
-
@builder.text_field(:name, :prepend => '@').should == "<div class=\"control-group\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><div class=\"input-prepend\"><span class=\"add-on\">@</span><input id=\"item_name\" name=\"item[name]\" size=\"30\" type=\"text\" /></div></div></div>"
|
149
|
-
end
|
150
|
-
|
151
|
-
it "appends passed text" do
|
152
|
-
@builder.text_field(:name, :append => '@').should == "<div class=\"control-group\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><div class=\"input-append\"><input id=\"item_name\" name=\"item[name]\" size=\"30\" type=\"text\" /><span class=\"add-on\">@</span></div></div></div>"
|
153
|
-
end
|
154
|
-
|
155
|
-
it "prepends and appends passed text" do
|
156
|
-
@builder.text_field(:name, :append => '@', :prepend => '#').should == "<div class=\"control-group\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><div class=\"input-prepend input-append\"><span class=\"add-on\">\#</span><input id=\"item_name\" name=\"item[name]\" size=\"30\" type=\"text\" /><span class=\"add-on\">@</span></div></div></div>"
|
157
|
-
end
|
63
|
+
it "has error title" do
|
64
|
+
@result.should match /<h4 class="alert-heading">#{I18n.t('bootstrap_forms.errors.header', :model => Project.model_name.human)}<\/h4>/
|
158
65
|
end
|
159
|
-
context "label option" do
|
160
|
-
%w(select email_field file_field number_field password_field search_field text_area text_field url_field).each do |method_name|
|
161
|
-
|
162
|
-
it "should not add a label when ''" do
|
163
|
-
@builder.send(method_name.to_sym, 'name', :label => '').should_not match /<\/label>/
|
164
|
-
end
|
165
66
|
|
166
|
-
|
167
|
-
|
168
|
-
end
|
169
|
-
end
|
170
|
-
end
|
171
|
-
end # extras
|
172
|
-
|
173
|
-
describe "form actions" do
|
174
|
-
context "actions" do
|
175
|
-
it "adds additional block content" do
|
176
|
-
@builder.actions do
|
177
|
-
@builder.submit
|
178
|
-
end.should == "<div class=\"form-actions\"><input class=\"btn btn-primary\" name=\"commit\" type=\"submit\" value=\"Create Project\" /></div>"
|
179
|
-
end
|
67
|
+
it "has error message on field" do
|
68
|
+
@builder.text_field("name").should == "<div class=\"control-group error\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><input id=\"item_name\" name=\"item[name]\" size=\"30\" type=\"text\" /><span class=\"help-inline\">Name is invalid</span></div></div>"
|
180
69
|
end
|
181
70
|
|
182
|
-
|
183
|
-
|
184
|
-
@builder.submit.should == "<input class=\"btn btn-primary\" name=\"commit\" type=\"submit\" value=\"Create Project\" />"
|
185
|
-
end
|
71
|
+
it "joins passed error message and validation errors with ', '" do
|
72
|
+
@builder.text_field("name", :error => 'This is an error!').should == "<div class=\"control-group error\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><input id=\"item_name\" name=\"item[name]\" size=\"30\" type=\"text\" /><span class=\"help-inline\">This is an error!, Name is invalid</span></div></div>"
|
186
73
|
end
|
74
|
+
end
|
187
75
|
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
end
|
76
|
+
context 'submit' do
|
77
|
+
it 'checks persistence of object' do
|
78
|
+
@builder.submit.should match('Create Project')
|
192
79
|
end
|
80
|
+
end
|
193
81
|
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
@builder.cancel
|
198
|
-
end
|
82
|
+
context 'button' do
|
83
|
+
it 'checks persistence of object' do
|
84
|
+
@builder.button.should match('Create Project')
|
199
85
|
end
|
200
|
-
end
|
201
|
-
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context "given a setup builder with a symbol" do
|
90
|
+
before(:each) do
|
91
|
+
@template = ActionView::Base.new
|
92
|
+
@template.output_buffer = ""
|
93
|
+
@builder = BootstrapForms::FormBuilder.new(:item, nil, @template, {}, proc {})
|
94
|
+
end
|
202
95
|
|
96
|
+
it_behaves_like 'a bootstrap form'
|
97
|
+
end
|
203
98
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -9,12 +9,16 @@ require File.expand_path("../dummy/config/environment.rb", __FILE__)
|
|
9
9
|
require 'rspec/rails'
|
10
10
|
require 'capybara/rspec'
|
11
11
|
|
12
|
+
require 'active_support/ordered_hash' if RUBY_VERSION < '1.9'
|
13
|
+
|
12
14
|
require File.expand_path(File.join(File.dirname(__FILE__), '../lib/bootstrap_forms'))
|
13
15
|
|
16
|
+
require 'support/shared_context'
|
17
|
+
|
14
18
|
RSpec.configure do |config|
|
15
19
|
config.treat_symbols_as_metadata_keys_with_true_values = true
|
16
20
|
config.run_all_when_everything_filtered = true
|
17
21
|
config.filter_run :focus
|
18
22
|
end
|
19
23
|
|
20
|
-
Rails.backtrace_cleaner.remove_silencers!
|
24
|
+
Rails.backtrace_cleaner.remove_silencers!
|
@@ -0,0 +1,184 @@
|
|
1
|
+
shared_examples "a bootstrap form" do
|
2
|
+
describe "with no options" do
|
3
|
+
describe "error_messages" do
|
4
|
+
it "returns empty string without errors" do
|
5
|
+
@builder.error_messages.should == ""
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "text_area" do
|
10
|
+
before(:each) do
|
11
|
+
@result = @builder.text_area "name"
|
12
|
+
end
|
13
|
+
|
14
|
+
it "has textarea input" do
|
15
|
+
@result.should match /textarea/
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "uneditable_input" do
|
20
|
+
it "generates wrapped input" do
|
21
|
+
@builder.uneditable_input("name").should == "<div class=\"control-group\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><span class=\"uneditable-input\"></span></div></div>"
|
22
|
+
end
|
23
|
+
|
24
|
+
it "allows for an id" do
|
25
|
+
@builder.uneditable_input("name", :id => "myid").should match /<span.*id="myid"/
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "check_box" do
|
30
|
+
it "generates wrapped input" do
|
31
|
+
@builder.check_box("name").should == "<div class=\"control-group\"><div class=\"controls\"><label class=\"checkbox\" for=\"item_name\"><input name=\"item[name]\" type=\"hidden\" value=\"0\" /><input id=\"item_name\" name=\"item[name]\" type=\"checkbox\" value=\"1\" />Name</label></div></div>"
|
32
|
+
end
|
33
|
+
|
34
|
+
it "allows custom label" do
|
35
|
+
@builder.check_box("name", :label => "custom label").should match /custom label<\/label>/
|
36
|
+
end
|
37
|
+
|
38
|
+
it "allows no label with :label => false " do
|
39
|
+
@builder.check_box("name", :label => false).should_not match /<\/label>/
|
40
|
+
end
|
41
|
+
it "allows no label with :label => '' " do
|
42
|
+
@builder.check_box("name", :label => '').should_not match /<\/label>/
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "radio_buttons" do
|
47
|
+
before do
|
48
|
+
if RUBY_VERSION < '1.9'
|
49
|
+
@options = ActiveSupport::OrderedHash.new
|
50
|
+
@options['One'] = '1'
|
51
|
+
@options['Two'] = '2'
|
52
|
+
else
|
53
|
+
@options = {'One' => '1', 'Two' => '2'}
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
it "doesn't use field_options from previously generated field" do
|
58
|
+
@builder.text_field :name, :label => 'Heading', :help_inline => 'Inline help', :help_block => 'Block help'
|
59
|
+
@builder.radio_buttons(:name, @options).should == "<div class=\"control-group\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><label class=\"radio\" for=\"item_name_1\"><input id=\"item_name_1\" name=\"item[name]\" type=\"radio\" value=\"1\" />One</label><label class=\"radio\" for=\"item_name_2\"><input id=\"item_name_2\" name=\"item[name]\" type=\"radio\" value=\"2\" />Two</label></div></div>"
|
60
|
+
end
|
61
|
+
|
62
|
+
it "sets field_options" do
|
63
|
+
@builder.radio_buttons(:name, {"One" => "1", "Two" => "2"})
|
64
|
+
@builder.instance_variable_get("@field_options").should == {:error => nil}
|
65
|
+
end
|
66
|
+
|
67
|
+
it "generates wrapped input" do
|
68
|
+
@builder.radio_buttons(:name, @options).should == "<div class=\"control-group\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><label class=\"radio\" for=\"item_name_1\"><input id=\"item_name_1\" name=\"item[name]\" type=\"radio\" value=\"1\" />One</label><label class=\"radio\" for=\"item_name_2\"><input id=\"item_name_2\" name=\"item[name]\" type=\"radio\" value=\"2\" />Two</label></div></div>"
|
69
|
+
end
|
70
|
+
|
71
|
+
it "allows custom label" do
|
72
|
+
@builder.radio_buttons(:name, @options, {:label => "custom label"}).should match /custom label<\/label>/
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
(%w{email file number password range search text url }.map{|field| ["#{field}_field",field]} + [["telephone_field", "tel"], ["phone_field", "tel"]]).each do |field, type|
|
77
|
+
describe "#{field}" do
|
78
|
+
context "result" do
|
79
|
+
before(:each) do
|
80
|
+
@result = @builder.send(field, "name")
|
81
|
+
end
|
82
|
+
|
83
|
+
it "is wrapped" do
|
84
|
+
@result.should match /^<div class=\"control-group\"><label class=\"control-label\" for=\"item_name\">Name<\/label><div class=\"controls\">.*<\/div><\/div>$/
|
85
|
+
end
|
86
|
+
|
87
|
+
it "has an input of type: #{type}" do
|
88
|
+
@result.should match /<input.*type="#{type}"/
|
89
|
+
end
|
90
|
+
end # result
|
91
|
+
|
92
|
+
context "call expectations" do
|
93
|
+
%w(control_group_div label_field input_div extras).map(&:to_sym).each do |method|
|
94
|
+
it "calls #{method}" do
|
95
|
+
@builder.should_receive(method).and_return("")
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
after(:each) do
|
100
|
+
@builder.send(field, "name")
|
101
|
+
end
|
102
|
+
end # call expectations
|
103
|
+
|
104
|
+
end # field
|
105
|
+
end # fields
|
106
|
+
end # no options
|
107
|
+
|
108
|
+
describe "extras" do
|
109
|
+
context "text_field" do
|
110
|
+
it "adds span for inline help" do
|
111
|
+
@builder.text_field(:name, :help_inline => 'help me!').should == "<div class=\"control-group\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><input id=\"item_name\" name=\"item[name]\" size=\"30\" type=\"text\" /><span class=\"help-inline\">help me!</span></div></div>"
|
112
|
+
end
|
113
|
+
|
114
|
+
it "adds help block" do
|
115
|
+
@builder.text_field(:name, :help_block => 'help me!').should == "<div class=\"control-group\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><input id=\"item_name\" name=\"item[name]\" size=\"30\" type=\"text\" /><p class=\"help-block\">help me!</p></div></div>"
|
116
|
+
end
|
117
|
+
|
118
|
+
it "adds error message and class" do
|
119
|
+
@builder.text_field(:name, :error => 'This is an error!').should == "<div class=\"control-group error\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><input id=\"item_name\" name=\"item[name]\" size=\"30\" type=\"text\" /><span class=\"help-inline\">This is an error!</span></div></div>"
|
120
|
+
end
|
121
|
+
|
122
|
+
it "adds success message and class" do
|
123
|
+
@builder.text_field(:name, :success => 'This checked out OK').should == "<div class=\"control-group success\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><input id=\"item_name\" name=\"item[name]\" size=\"30\" type=\"text\" /><span class=\"help-inline\">This checked out OK</span></div></div>"
|
124
|
+
end
|
125
|
+
|
126
|
+
it "adds warning message and class" do
|
127
|
+
@builder.text_field(:name, :warning => 'Take a look at this...').should == "<div class=\"control-group warning\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><input id=\"item_name\" name=\"item[name]\" size=\"30\" type=\"text\" /><span class=\"help-inline\">Take a look at this...</span></div></div>"
|
128
|
+
end
|
129
|
+
|
130
|
+
it "prepends passed text" do
|
131
|
+
@builder.text_field(:name, :prepend => '@').should == "<div class=\"control-group\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><div class=\"input-prepend\"><span class=\"add-on\">@</span><input id=\"item_name\" name=\"item[name]\" size=\"30\" type=\"text\" /></div></div></div>"
|
132
|
+
end
|
133
|
+
|
134
|
+
it "appends passed text" do
|
135
|
+
@builder.text_field(:name, :append => '@').should == "<div class=\"control-group\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><div class=\"input-append\"><input id=\"item_name\" name=\"item[name]\" size=\"30\" type=\"text\" /><span class=\"add-on\">@</span></div></div></div>"
|
136
|
+
end
|
137
|
+
|
138
|
+
it "prepends and appends passed text" do
|
139
|
+
@builder.text_field(:name, :append => '@', :prepend => '#').should == "<div class=\"control-group\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><div class=\"input-prepend input-append\"><span class=\"add-on\">\#</span><input id=\"item_name\" name=\"item[name]\" size=\"30\" type=\"text\" /><span class=\"add-on\">@</span></div></div></div>"
|
140
|
+
end
|
141
|
+
end
|
142
|
+
context "label option" do
|
143
|
+
%w(select email_field file_field number_field password_field search_field text_area text_field url_field).each do |method_name|
|
144
|
+
|
145
|
+
it "should not add a label when ''" do
|
146
|
+
@builder.send(method_name.to_sym, 'name', :label => '').should_not match /<\/label>/
|
147
|
+
end
|
148
|
+
|
149
|
+
it "should not add a label when false" do
|
150
|
+
@builder.send(method_name.to_sym, 'name', :label => false).should_not match /<\/label>/
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end # extras
|
155
|
+
|
156
|
+
describe "form actions" do
|
157
|
+
context "actions" do
|
158
|
+
it "adds additional block content" do
|
159
|
+
@builder.actions do
|
160
|
+
@builder.submit
|
161
|
+
end.should match(/<div class=\"form-actions\">.*?<\/div>/)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
context "submit" do
|
166
|
+
it "adds btn primary class" do
|
167
|
+
@builder.submit.should match /class=\"btn btn-primary\"/
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
context "button" do
|
172
|
+
it "adds btn primary class" do
|
173
|
+
@builder.button.should match /class=\"btn btn-primary\"/
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
context "cancel" do
|
178
|
+
it "creates link with correct class" do
|
179
|
+
@builder.should_receive(:link_to).with(I18n.t('bootstrap_forms.buttons.cancel'), :back, :class => 'btn cancel').and_return("")
|
180
|
+
@builder.cancel
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end # actions
|
184
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bootstrap_forms
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-07-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec-rails
|
@@ -18,7 +18,7 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 2.
|
21
|
+
version: 2.10.1
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 2.
|
29
|
+
version: 2.10.1
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: capybara
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -167,7 +167,6 @@ files:
|
|
167
167
|
- spec/dummy/db/migrate/20110710143903_initial_tables.rb
|
168
168
|
- spec/dummy/db/schema.rb
|
169
169
|
- spec/dummy/db/test.sqlite3
|
170
|
-
- spec/dummy/log/development.log
|
171
170
|
- spec/dummy/public/404.html
|
172
171
|
- spec/dummy/public/422.html
|
173
172
|
- spec/dummy/public/500.html
|
@@ -178,6 +177,7 @@ files:
|
|
178
177
|
- spec/dummy/tmp/cache/.gitkeep
|
179
178
|
- spec/lib/bootstrap_forms/form_builder_spec.rb
|
180
179
|
- spec/spec_helper.rb
|
180
|
+
- spec/support/shared_context.rb
|
181
181
|
homepage: https://github.com/sethvargo/bootstrap_forms
|
182
182
|
licenses: []
|
183
183
|
post_install_message:
|
@@ -192,7 +192,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
192
192
|
version: '0'
|
193
193
|
segments:
|
194
194
|
- 0
|
195
|
-
hash:
|
195
|
+
hash: 3940498627574462359
|
196
196
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
197
197
|
none: false
|
198
198
|
requirements:
|
@@ -201,10 +201,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
201
201
|
version: '0'
|
202
202
|
segments:
|
203
203
|
- 0
|
204
|
-
hash:
|
204
|
+
hash: 3940498627574462359
|
205
205
|
requirements: []
|
206
206
|
rubyforge_project:
|
207
|
-
rubygems_version: 1.8.
|
207
|
+
rubygems_version: 1.8.24
|
208
208
|
signing_key:
|
209
209
|
specification_version: 3
|
210
210
|
summary: Bootstrap Forms makes Twitter's Bootstrap on Rails easy!
|
@@ -243,7 +243,6 @@ test_files:
|
|
243
243
|
- spec/dummy/db/migrate/20110710143903_initial_tables.rb
|
244
244
|
- spec/dummy/db/schema.rb
|
245
245
|
- spec/dummy/db/test.sqlite3
|
246
|
-
- spec/dummy/log/development.log
|
247
246
|
- spec/dummy/public/404.html
|
248
247
|
- spec/dummy/public/422.html
|
249
248
|
- spec/dummy/public/500.html
|
@@ -254,3 +253,4 @@ test_files:
|
|
254
253
|
- spec/dummy/tmp/cache/.gitkeep
|
255
254
|
- spec/lib/bootstrap_forms/form_builder_spec.rb
|
256
255
|
- spec/spec_helper.rb
|
256
|
+
- spec/support/shared_context.rb
|
File without changes
|