simple_form 1.3.0 → 1.3.1

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 ADDED
@@ -0,0 +1,2 @@
1
+ .bundle/
2
+ pkg/
data/.gitmodules ADDED
@@ -0,0 +1,3 @@
1
+ [submodule "test/support/country_select"]
2
+ path = test/support/country_select
3
+ url = git://github.com/rails/country_select
data/CHANGELOG.rdoc ADDED
@@ -0,0 +1,85 @@
1
+ * enhancements
2
+ * Add :autofocus HTML5 attribute support (by github.com/jpzwarte)
3
+ * Add possibility to specify custom builder and inherit mappings (by github.com/rejeep)
4
+ * Make custom mappings work with all attributes types (by github.com/rafaelfranca)
5
+ * Add support for procs/lambdas in text/value methods for collection_select
6
+
7
+ * deprecation
8
+ * removed the deprecated :remote_form_for
9
+
10
+ * bug fix
11
+ * Only add the "required" HTML 5 attribute for valid inputs, disable in selects (not allowed)
12
+ * Fix error when using hints without an attribute (by github.com/butsjoh and github.com/rafaelfranca)
13
+ * Fix messy html output for hint, error and label components (by github.com/butsjoh and github.com/rafaelfranca)
14
+ * Allow direct setting of for attribute on label (by github.com/Bertg)
15
+
16
+ == 1.3.0
17
+
18
+ * enhancements
19
+ * Allow collection input to accept a collection of symbols
20
+ * Add default css class to button
21
+ * Allow forms for objects that don't respond to the "errors" method
22
+ * collection_check_boxes and collection_radio now wrap the input in the label
23
+ * Automatic add min/max values for numeric attributes based on validations and step for integers - HTML5 (by github.com/dasch)
24
+ * Add :placeholder option for string inputs, allowing customization through I18n - HTML5 (by github.com/jonathan)
25
+ * Add :search and :tel input types, with :tel mapping automatically from attributes matching "phone" - HTML5
26
+ * Add :required html attribute for required inputs - HTML5
27
+ * Add optional :components option to input to control component rendering (by github.com/khoan)
28
+ * Add SimpleForm.translate as an easy way to turn off SimpleForm internal translations
29
+ * Add :disabled option for all inputs (by github.com/fabiob)
30
+ * Add collection wrapper tag and item wrapper tag to wrap elements in collection helpers - radio / check boxes
31
+ * Add SimpleForm.input_mappings to allow configuring custom mappings for inputs (by github.com/TMaYaD)
32
+
33
+ * bug fix
34
+ * Search for validations on both association and attribute
35
+ * Use controller.action_name to lookup action only when available, to fix issue with Rspec views tests (by github.com/rafaelfranca)
36
+
37
+ == 1.2.2
38
+
39
+ * enhancements
40
+ * Compatibility with Rails 3 RC
41
+
42
+ == 1.2.1
43
+
44
+ * enhancements
45
+ * Added haml generator support (by github.com/grimen)
46
+ * Added error_notification message to form builder
47
+ * Added required by default as configuration option
48
+ * Added label_input as component, allowing boolean to change its order (input appearing first than label)
49
+ * Added error_method to tidy up how errors are exhibited
50
+ * Added error class on wrappers (by github.com/jduff)
51
+ * Changed numeric types to have type=number for HTML5
52
+
53
+ == 1.2.0
54
+
55
+ * deprecation
56
+ * Changed simple_form_install generator to simple_form:install
57
+
58
+ * enhancements
59
+ * Added support to presence validation to check if attribute is required or not (by github.com/gcirne)
60
+ * Added .input as class to wrapper tag
61
+ * Added config options for hint and error tags (by github.com/tjogin)
62
+
63
+ == 1.1.3
64
+
65
+ * deprecation
66
+ * removed :conditions, :order, :joins and :include support in f.association
67
+
68
+ == 1.1.2
69
+
70
+ * bug fix
71
+ * Ensure type is set to "text" and not "string"
72
+
73
+ == 1.1.1
74
+
75
+ * bug fix
76
+ * Fix some escaping issues
77
+
78
+ == 1.1.0
79
+
80
+ * enhancements
81
+ * Rails 3 support with generators, templates and HTML 5
82
+
83
+ == 1.0
84
+
85
+ * First release
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem "rails", "~> 3.0.0"
4
+
5
+ group :test do
6
+ gem "mocha", :require => false
7
+
8
+ if RUBY_VERSION < "1.9"
9
+ gem "ruby-debug", :require => false
10
+ else
11
+ gem "test-unit", :require => false
12
+ end
13
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,82 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ abstract (1.0.0)
5
+ actionmailer (3.0.3)
6
+ actionpack (= 3.0.3)
7
+ mail (~> 2.2.9)
8
+ actionpack (3.0.3)
9
+ activemodel (= 3.0.3)
10
+ activesupport (= 3.0.3)
11
+ builder (~> 2.1.2)
12
+ erubis (~> 2.6.6)
13
+ i18n (~> 0.4)
14
+ rack (~> 1.2.1)
15
+ rack-mount (~> 0.6.13)
16
+ rack-test (~> 0.5.6)
17
+ tzinfo (~> 0.3.23)
18
+ activemodel (3.0.3)
19
+ activesupport (= 3.0.3)
20
+ builder (~> 2.1.2)
21
+ i18n (~> 0.4)
22
+ activerecord (3.0.3)
23
+ activemodel (= 3.0.3)
24
+ activesupport (= 3.0.3)
25
+ arel (~> 2.0.2)
26
+ tzinfo (~> 0.3.23)
27
+ activeresource (3.0.3)
28
+ activemodel (= 3.0.3)
29
+ activesupport (= 3.0.3)
30
+ activesupport (3.0.3)
31
+ arel (2.0.6)
32
+ builder (2.1.2)
33
+ columnize (0.3.2)
34
+ erubis (2.6.6)
35
+ abstract (>= 1.0.0)
36
+ i18n (0.5.0)
37
+ linecache (0.43)
38
+ mail (2.2.12)
39
+ activesupport (>= 2.3.6)
40
+ i18n (>= 0.4.0)
41
+ mime-types (~> 1.16)
42
+ treetop (~> 1.4.8)
43
+ mime-types (1.16)
44
+ mocha (0.9.10)
45
+ rake
46
+ polyglot (0.3.1)
47
+ rack (1.2.1)
48
+ rack-mount (0.6.13)
49
+ rack (>= 1.0.0)
50
+ rack-test (0.5.6)
51
+ rack (>= 1.0)
52
+ rails (3.0.3)
53
+ actionmailer (= 3.0.3)
54
+ actionpack (= 3.0.3)
55
+ activerecord (= 3.0.3)
56
+ activeresource (= 3.0.3)
57
+ activesupport (= 3.0.3)
58
+ bundler (~> 1.0)
59
+ railties (= 3.0.3)
60
+ railties (3.0.3)
61
+ actionpack (= 3.0.3)
62
+ activesupport (= 3.0.3)
63
+ rake (>= 0.8.7)
64
+ thor (~> 0.14.4)
65
+ rake (0.8.7)
66
+ ruby-debug (0.10.4)
67
+ columnize (>= 0.1)
68
+ ruby-debug-base (~> 0.10.4.0)
69
+ ruby-debug-base (0.10.4)
70
+ linecache (>= 0.3)
71
+ thor (0.14.6)
72
+ treetop (1.4.9)
73
+ polyglot (>= 0.3.1)
74
+ tzinfo (0.3.23)
75
+
76
+ PLATFORMS
77
+ ruby
78
+
79
+ DEPENDENCIES
80
+ mocha
81
+ rails (~> 3.0.0)
82
+ ruby-debug
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010 PlataformaTec http://blog.plataformatec.com.br/
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc CHANGED
@@ -370,9 +370,23 @@ SimpleForm has several configuration values. You can read and change them in the
370
370
 
371
371
  rails generate simple_form:install
372
372
 
373
- == TODO
373
+ == Custom form builder
374
374
 
375
- Please refer to TODO file.
375
+ You can create a custom form builder that uses SimpleForm.
376
+
377
+ Create a helper method that calls simple_form_for with a custom builder:
378
+
379
+ def custom_form_for(object, *args, &block)
380
+ simple_form_for(object, *(args << { :builder => CustomFormBuilder }), &block)
381
+ end
382
+
383
+ Create a form builder class that inherits from SimpleForm::FormBuilder.
384
+
385
+ class CustomFormBuilder < SimpleForm::FormBuilder
386
+ def input(attribute_name, *args, &block)
387
+ super(attribute_name, *(args << { :input_html => { :class => 'custom' } }), &block)
388
+ end
389
+ end
376
390
 
377
391
  == Maintainers
378
392
 
data/Rakefile ADDED
@@ -0,0 +1,27 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'bundler'
4
+ Bundler::GemHelper.install_tasks
5
+
6
+ require 'rake/testtask'
7
+ require 'rake/rdoctask'
8
+
9
+ desc 'Default: run unit tests.'
10
+ task :default => :test
11
+
12
+ desc 'Test the simple_form plugin.'
13
+ Rake::TestTask.new(:test) do |t|
14
+ t.libs << 'lib'
15
+ t.libs << 'test'
16
+ t.pattern = 'test/**/*_test.rb'
17
+ t.verbose = true
18
+ end
19
+
20
+ desc 'Generate documentation for the simple_form plugin.'
21
+ Rake::RDocTask.new(:rdoc) do |rdoc|
22
+ rdoc.rdoc_dir = 'rdoc'
23
+ rdoc.title = 'SimpleForm'
24
+ rdoc.options << '--line-numbers' << '--inline-source'
25
+ rdoc.rdoc_files.include('README.rdoc')
26
+ rdoc.rdoc_files.include('lib/**/*.rb')
27
+ end
@@ -6,8 +6,8 @@
6
6
  prohibited this <%= singular_name %> from being saved:
7
7
 
8
8
  %ul
9
- - @<%= singular_name %>.errors.full_messages.each do |msg|
10
- %li= msg
9
+ - @<%= singular_name %>.errors.full_messages.each do |msg|
10
+ %li= msg
11
11
 
12
12
  .inputs
13
13
  <%- attributes.each do |attribute| -%>
@@ -7,7 +7,9 @@ module SimpleForm
7
7
  # Create a collection of radio inputs for the attribute. Basically this
8
8
  # helper will create a radio input associated with a label for each
9
9
  # text/value option in the collection, using value_method and text_method
10
- # to convert these text/value. Based on collection_select.
10
+ # to convert these text/value. You can give a symbol or a proc to both
11
+ # value_method and text_method, that will be evaluated for each item in
12
+ # the collection.
11
13
  #
12
14
  # == Examples
13
15
  #
@@ -42,9 +44,11 @@ module SimpleForm
42
44
  end
43
45
  end
44
46
 
45
- # Creates a collection of check boxes for each item in the collection, associated
46
- # with a clickable label. Use value_method and text_method to convert items in
47
- # the collection for use as text/value in check boxes.
47
+ # Creates a collection of check boxes for each item in the collection,
48
+ # associated with a clickable label. Use value_method and text_method to
49
+ # convert items in the collection for use as text/value in check boxes.
50
+ # You can give a symbol or a proc to both value_method and text_method,
51
+ # that will be evaluated for each item in the collection.
48
52
  #
49
53
  # == Examples
50
54
  #
@@ -154,4 +158,25 @@ module SimpleForm
154
158
  end
155
159
  end
156
160
 
157
- ActionView::Helpers::FormBuilder.send :include, SimpleForm::ActionViewExtensions::Builder
161
+ class ActionView::Helpers::FormBuilder
162
+ include SimpleForm::ActionViewExtensions::Builder
163
+
164
+ # Override default Rails collection_select helper to handle lambdas/procs in
165
+ # text and value methods, so it works the same way as collection_radio and
166
+ # collection_check_boxes in SimpleForm. If none of text/value methods is a
167
+ # callable object, then it just delegates back to original collection select.
168
+ #
169
+ alias :original_collection_select :collection_select
170
+ def collection_select(attribute, collection, value_method, text_method, options={}, html_options={})
171
+ if value_method.respond_to?(:call) || text_method.respond_to?(:call)
172
+ collection = collection.map do |item|
173
+ value = value_for_collection(item, value_method)
174
+ text = value_for_collection(item, text_method)
175
+ [value, text]
176
+ end
177
+ value_method, text_method = :first, :last
178
+ end
179
+
180
+ original_collection_select(attribute, collection, value_method, text_method, options, html_options)
181
+ end
182
+ end
@@ -1,7 +1,6 @@
1
1
  module SimpleForm
2
2
  module ActionViewExtensions
3
- # This modules create simple form wrappers around default form_for,
4
- # fields_for and remote_form_for.
3
+ # This module creates simple form wrappers around default form_for and fields_for.
5
4
  #
6
5
  # Example:
7
6
  #
@@ -30,11 +29,11 @@ module SimpleForm
30
29
  result
31
30
  end
32
31
 
33
- [:form_for, :fields_for, :remote_form_for].each do |helper|
32
+ [:form_for, :fields_for].each do |helper|
34
33
  class_eval <<-METHOD, __FILE__, __LINE__
35
34
  def simple_#{helper}(record_or_name_or_array, *args, &block)
36
35
  options = args.extract_options!
37
- options[:builder] = SimpleForm::FormBuilder
36
+ options[:builder] ||= SimpleForm::FormBuilder
38
37
  css_class = case record_or_name_or_array
39
38
  when String, Symbol then record_or_name_or_array.to_s
40
39
  when Array then dom_class(record_or_name_or_array.last)
@@ -37,7 +37,7 @@ module SimpleForm
37
37
 
38
38
  def label_html_options
39
39
  label_options = html_options_for(:label, [input_type, required_class])
40
- label_options[:for] = options[:input_html][:id] if options.key?(:input_html)
40
+ label_options[:for] = options[:input_html][:id] if options.key?(:input_html) && options[:input_html].key?(:id)
41
41
  label_options
42
42
  end
43
43
 
@@ -175,7 +175,7 @@ module SimpleForm
175
175
  # f.error :name, :id => "cool_error"
176
176
  #
177
177
  def error(attribute_name, options={})
178
- options[:error_html] = options
178
+ options[:error_html] = options.dup
179
179
  column = find_attribute_column(attribute_name)
180
180
  input_type = default_input_type(attribute_name, column, options)
181
181
  SimpleForm::Inputs::Base.new(self, attribute_name, column, input_type, options).error
@@ -192,7 +192,7 @@ module SimpleForm
192
192
  # f.hint "Don't forget to accept this"
193
193
  #
194
194
  def hint(attribute_name, options={})
195
- options[:hint_html] = options
195
+ options[:hint_html] = options.dup
196
196
  if attribute_name.is_a?(String)
197
197
  options[:hint] = attribute_name
198
198
  attribute_name, column, input_type = nil, nil, nil
@@ -219,8 +219,8 @@ module SimpleForm
219
219
  def label(attribute_name, *args)
220
220
  return super if args.first.is_a?(String)
221
221
  options = args.extract_options!
222
+ options[:label_html] = options.dup
222
223
  options[:label] = options.delete(:label)
223
- options[:label_html] = options
224
224
  options[:required] = options.delete(:required)
225
225
  column = find_attribute_column(attribute_name)
226
226
  input_type = default_input_type(attribute_name, column, options)
@@ -250,9 +250,9 @@ module SimpleForm
250
250
  def default_input_type(attribute_name, column, options) #:nodoc:
251
251
  return options[:as].to_sym if options[:as]
252
252
  return :select if options[:collection]
253
+ custom_type = find_custom_type(attribute_name.to_s) and return custom_type
253
254
 
254
255
  input_type = column.try(:type)
255
-
256
256
  case input_type
257
257
  when :timestamp
258
258
  :datetime
@@ -264,10 +264,6 @@ module SimpleForm
264
264
  when /email/ then :email
265
265
  when /phone/ then :tel
266
266
  when /url/ then :url
267
- else
268
- SimpleForm.input_mappings.find { |match, type|
269
- attribute_name.to_s =~ match
270
- }.try(:last) if SimpleForm.input_mappings
271
267
  end
272
268
 
273
269
  match || input_type || file_method?(attribute_name) || :string
@@ -276,21 +272,30 @@ module SimpleForm
276
272
  end
277
273
  end
278
274
 
275
+ def find_custom_type(attribute_name)
276
+ SimpleForm.input_mappings.find { |match, type|
277
+ attribute_name =~ match
278
+ }.try(:last) if SimpleForm.input_mappings
279
+ end
280
+
279
281
  # Checks if attribute is a file_method.
280
282
  def file_method?(attribute_name) #:nodoc:
281
283
  file = @object.send(attribute_name) if @object.respond_to?(attribute_name)
282
284
  :file if file && SimpleForm.file_methods.any? { |m| file.respond_to?(m) }
283
285
  end
284
286
 
285
- # Finds the database column for the given attribute
287
+ # Finds the database column for the given attribute.
286
288
  def find_attribute_column(attribute_name) #:nodoc:
287
- @object.column_for_attribute(attribute_name) if @object.respond_to?(:column_for_attribute)
289
+ if @object.respond_to?(:column_for_attribute)
290
+ @object.column_for_attribute(attribute_name)
291
+ end
288
292
  end
289
293
 
290
- # Find reflection related to association
294
+ # Find reflection related to association.
291
295
  def find_association_reflection(association) #:nodoc:
292
- @object.class.reflect_on_association(association) if @object.class.respond_to?(:reflect_on_association)
296
+ if @object.class.respond_to?(:reflect_on_association)
297
+ @object.class.reflect_on_association(association)
298
+ end
293
299
  end
294
-
295
300
  end
296
301
  end
@@ -28,8 +28,9 @@ module SimpleForm
28
28
  @reflection = options.delete(:reflection)
29
29
  @options = options
30
30
  @input_html_options = html_options_for(:input, input_html_classes).tap do |o|
31
- o[:required] = true if attribute_required?
32
- o[:disabled] = true if disabled?
31
+ o[:required] = true if has_required?
32
+ o[:disabled] = true if disabled?
33
+ o[:autofocus] = true if has_autofocus?
33
34
  end
34
35
  end
35
36
 
@@ -71,8 +72,17 @@ module SimpleForm
71
72
  end
72
73
  end
73
74
 
75
+ # Whether this input is valid for HTML 5 required attribute.
76
+ def has_required?
77
+ attribute_required?
78
+ end
79
+
80
+ def has_autofocus?
81
+ options[:autofocus]
82
+ end
83
+
74
84
  def has_validators?
75
- object.class.respond_to?(:validators_on)
85
+ attribute_name && object.class.respond_to?(:validators_on)
76
86
  end
77
87
 
78
88
  def attribute_validators
@@ -31,6 +31,11 @@ module SimpleForm
31
31
  @collection ||= (options.delete(:collection) || self.class.boolean_collection).to_a
32
32
  end
33
33
 
34
+ # Select components does not allow the required html tag.
35
+ def has_required?
36
+ super && input_type != :select
37
+ end
38
+
34
39
  # Check if :include_blank must be included by default.
35
40
  def skip_include_blank?
36
41
  (options.keys & [:prompt, :include_blank, :default, :selected]).any? ||
@@ -7,6 +7,10 @@ module SimpleForm
7
7
 
8
8
  private
9
9
 
10
+ def has_required?
11
+ false
12
+ end
13
+
10
14
  def label_target
11
15
  case input_type
12
16
  when :date, :datetime
@@ -12,9 +12,13 @@ module SimpleForm
12
12
 
13
13
  protected
14
14
 
15
+ def has_required?
16
+ false
17
+ end
18
+
15
19
  def skip_include_blank?
16
20
  super || input_priority.present?
17
21
  end
18
22
  end
19
23
  end
20
- end
24
+ end
@@ -1,7 +1,10 @@
1
+ require 'active_support/core_ext/class/attribute'
2
+
1
3
  module SimpleForm
2
4
  module MapType
3
- def mappings
4
- @mappings ||= {}
5
+ def self.extended(base)
6
+ base.class_attribute :mappings
7
+ base.mappings = {}
5
8
  end
6
9
 
7
10
  def map_type(*types)
@@ -1,3 +1,3 @@
1
1
  module SimpleForm
2
- VERSION = "1.3.0".freeze
2
+ VERSION = "1.3.1".freeze
3
3
  end
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "simple_form/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "simple_form"
7
+ s.version = SimpleForm::VERSION.dup
8
+ s.platform = Gem::Platform::RUBY
9
+ s.summary = "Forms made easy!"
10
+ s.email = "contact@plataformatec.com.br"
11
+ s.homepage = "http://github.com/plataformatec/simple_form"
12
+ s.description = "Forms made easy!"
13
+ s.authors = ['José Valim', 'Carlos Antônio']
14
+
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
+ s.test_files -= Dir["test/support/country_select/**/*"]
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ s.rubyforge_project = "simple_form"
22
+ end
@@ -170,6 +170,16 @@ class LabelTest < ActionView::TestCase
170
170
  assert_select 'label[for=my_new_id]'
171
171
  end
172
172
 
173
+ test 'label should allow overwriting of for attribute' do
174
+ with_label_for @user, :name, :string, :label_html => { :for => 'my_new_id' }
175
+ assert_select 'label[for=my_new_id]'
176
+ end
177
+
178
+ test 'label should allow overwriting of for attribute with input_html not containing id' do
179
+ with_label_for @user, :name, :string, :label_html => { :for => 'my_new_id' }, :input_html => {:class => 'foo'}
180
+ assert_select 'label[for=my_new_id]'
181
+ end
182
+
173
183
  test 'label should use default input id when it was not overridden' do
174
184
  with_label_for @user, :name, :string, :input_html => { :class => 'my_new_id' }
175
185
  assert_select 'label[for=user_name]'
@@ -9,6 +9,12 @@ class FormBuilderTest < ActionView::TestCase
9
9
  end
10
10
  end
11
11
 
12
+ def with_custom_form_for(object, *args, &block)
13
+ with_concat_custom_form_for(object) do |f|
14
+ f.input(*args, &block)
15
+ end
16
+ end
17
+
12
18
  def with_button_for(object, *args)
13
19
  with_concat_form_for(object) do |f|
14
20
  f.button(*args)
@@ -70,6 +76,14 @@ class FormBuilderTest < ActionView::TestCase
70
76
  end
71
77
  end
72
78
 
79
+ test 'builder should allow adding custom input mappings for integer input types' do
80
+ swap SimpleForm, :input_mappings => { /lock_version/ => :hidden } do
81
+ with_form_for @user, :lock_version
82
+ assert_no_select 'form input#user_lock_version.integer'
83
+ assert_select 'form input#user_lock_version.hidden'
84
+ end
85
+ end
86
+
73
87
  test 'builder uses the first matching custom input map when more than one match' do
74
88
  swap SimpleForm, :input_mappings => { /count$/ => :integer, /^post_/ => :password } do
75
89
  with_form_for @user, :post_count
@@ -78,6 +92,14 @@ class FormBuilderTest < ActionView::TestCase
78
92
  end
79
93
  end
80
94
 
95
+ test 'builder uses the custom map only for matched attributes' do
96
+ swap SimpleForm, :input_mappings => { /lock_version/ => :hidden } do
97
+ with_form_for @user, :post_count
98
+ assert_no_select 'form input#user_post_count.hidden'
99
+ assert_select 'form input#user_post_count.string'
100
+ end
101
+ end
102
+
81
103
  # INPUT TYPES
82
104
  test 'builder should generate text fields for string columns' do
83
105
  with_form_for @user, :name
@@ -371,6 +393,11 @@ class FormBuilderTest < ActionView::TestCase
371
393
  assert_select 'span.error', "can't be blank"
372
394
  end
373
395
 
396
+ test 'builder should generate an error tag with a clean HTML' do
397
+ with_error_for @user, :name
398
+ assert_no_select 'span.error[error_html]'
399
+ end
400
+
374
401
  test 'builder should allow passing options to error tag' do
375
402
  with_error_for @user, :name, :id => 'name_error'
376
403
  assert_select 'span.error#name_error', "can't be blank"
@@ -384,11 +411,22 @@ class FormBuilderTest < ActionView::TestCase
384
411
  end
385
412
  end
386
413
 
414
+ test 'builder should generate a hint component tag for the given text for a model with ActiveModel::Validations' do
415
+ with_hint_for @validating_user, 'Hello World!'
416
+ assert_select 'span.hint', 'Hello World!'
417
+ end
418
+
387
419
  test 'builder should generate a hint component tag for the given text' do
388
420
  with_hint_for @user, 'Hello World!'
389
421
  assert_select 'span.hint', 'Hello World!'
390
422
  end
391
423
 
424
+ test 'builder should generate a hint componet tag with a clean HTML' do
425
+ with_hint_for @validating_user, 'Hello World!'
426
+ assert_no_select 'span.hint[hint]'
427
+ assert_no_select 'span.hint[hint_html]'
428
+ end
429
+
392
430
  test 'builder should allow passing options to hint tag' do
393
431
  with_hint_for @user, :name, :hint => 'Hello World!', :id => 'name_hint'
394
432
  assert_select 'span.hint#name_hint', 'Hello World!'
@@ -400,6 +438,11 @@ class FormBuilderTest < ActionView::TestCase
400
438
  assert_select 'label.string[for=user_name]', /Name/
401
439
  end
402
440
 
441
+ test 'builder should generate a label componet tag with a clean HTML' do
442
+ with_label_for @user, :name
443
+ assert_no_select 'label.string[label_html]'
444
+ end
445
+
403
446
  test 'builder should add a required class to label if the attribute is required' do
404
447
  with_label_for @validating_user, :name
405
448
  assert_select 'label.string.required[for=validating_user_name]', /Name/
@@ -562,4 +605,10 @@ class FormBuilderTest < ActionView::TestCase
562
605
  assert_select 'form ul', :count => 1
563
606
  assert_select 'form ul li', :count => 3
564
607
  end
608
+
609
+ # CUSTOM FORM BUILDER
610
+ test 'custom builder should inherit mappings' do
611
+ with_custom_form_for @user, :email
612
+ assert_select 'form input[type=email]#user_email.custom'
613
+ end
565
614
  end
data/test/inputs_test.rb CHANGED
@@ -62,6 +62,41 @@ class InputTest < ActionView::TestCase
62
62
  assert_select 'select.datetime:not([disabled])'
63
63
  end
64
64
 
65
+ test 'input should generate autofocus attribute based on the autofocus option' do
66
+ with_input_for @user, :name, :string, :autofocus => true
67
+ assert_select 'input.string[autofocus]'
68
+ with_input_for @user, :description, :text, :autofocus => true
69
+ assert_select 'textarea.text[autofocus]'
70
+ with_input_for @user, :age, :integer, :autofocus => true
71
+ assert_select 'input.integer[autofocus]'
72
+ with_input_for @user, :born_at, :date, :autofocus => true
73
+ assert_select 'select.date[autofocus]'
74
+ with_input_for @user, :created_at, :datetime, :autofocus => true
75
+ assert_select 'select.datetime[autofocus]'
76
+
77
+ with_input_for @user, :name, :string, :autofocus => false
78
+ assert_select 'input.string:not([autofocus])'
79
+ with_input_for @user, :description, :text, :autofocus => false
80
+ assert_select 'textarea.text:not([autofocus])'
81
+ with_input_for @user, :age, :integer, :autofocus => false
82
+ assert_select 'input.integer:not([autofocus])'
83
+ with_input_for @user, :born_at, :date, :autofocus => false
84
+ assert_select 'select.date:not([autofocus])'
85
+ with_input_for @user, :created_at, :datetime, :autofocus => false
86
+ assert_select 'select.datetime:not([autofocus])'
87
+
88
+ with_input_for @user, :name, :string
89
+ assert_select 'input.string:not([autofocus])'
90
+ with_input_for @user, :description, :text
91
+ assert_select 'textarea.text:not([autofocus])'
92
+ with_input_for @user, :age, :integer
93
+ assert_select 'input.integer:not([autofocus])'
94
+ with_input_for @user, :born_at, :date
95
+ assert_select 'select.date:not([autofocus])'
96
+ with_input_for @user, :created_at, :datetime
97
+ assert_select 'select.datetime:not([autofocus])'
98
+ end
99
+
65
100
  test 'input should render components according to an optional :components option' do
66
101
  with_input_for @user, :name, :string, :components => [:input, :label]
67
102
  assert_select 'input + label'
@@ -321,6 +356,12 @@ class InputTest < ActionView::TestCase
321
356
  assert_no_select 'select option[value=]', /^$/
322
357
  end
323
358
 
359
+ test 'priority input should not generate invalid required html attribute' do
360
+ with_input_for @user, :country, :country
361
+ assert_select 'select.required'
362
+ assert_no_select 'select[required]'
363
+ end
364
+
324
365
  # DateTime input
325
366
  test 'input should generate a datetime select by default for datetime attributes' do
326
367
  with_input_for @user, :created_at, :datetime
@@ -395,6 +436,12 @@ class InputTest < ActionView::TestCase
395
436
  assert_select 'label[for=project_created_at_4i]'
396
437
  end
397
438
 
439
+ test 'date time input should not generate invalid required html attribute' do
440
+ with_input_for @user, :delivery_time, :time, :required => true
441
+ assert_select 'select.required'
442
+ assert_no_select 'select[required]'
443
+ end
444
+
398
445
  # CollectionInput
399
446
  test 'input should generate boolean radio buttons by default for radio types' do
400
447
  with_input_for @user, :active, :radio
@@ -559,6 +606,31 @@ class InputTest < ActionView::TestCase
559
606
  assert_select 'label.collection_radio', 'CARLOS'
560
607
  end
561
608
 
609
+ test 'input should allow overriding label and value method using a lambda for collection selects' do
610
+ with_input_for @user, :name, :select,
611
+ :collection => ['Jose' , 'Carlos'],
612
+ :label_method => lambda { |i| i.upcase },
613
+ :value_method => lambda { |i| i.downcase }
614
+ assert_select 'select option[value=jose]', "JOSE"
615
+ assert_select 'select option[value=carlos]', "CARLOS"
616
+ end
617
+
618
+ test 'input should allow overriding only label but not value method using a lambda for collection select' do
619
+ with_input_for @user, :name, :select,
620
+ :collection => ['Jose' , 'Carlos'],
621
+ :label_method => lambda { |i| i.upcase }
622
+ assert_select 'select option[value=Jose]', "JOSE"
623
+ assert_select 'select option[value=Carlos]', "CARLOS"
624
+ end
625
+
626
+ test 'input should allow overriding only value but not label method using a lambda for collection select' do
627
+ with_input_for @user, :name, :select,
628
+ :collection => ['Jose' , 'Carlos'],
629
+ :value_method => lambda { |i| i.downcase }
630
+ assert_select 'select option[value=jose]', "Jose"
631
+ assert_select 'select option[value=carlos]', "Carlos"
632
+ end
633
+
562
634
  test 'input should allow symbols for collections' do
563
635
  with_input_for @user, :name, :select, :collection => [:jose, :carlos]
564
636
  assert_select 'select.select#user_name'
@@ -566,6 +638,18 @@ class InputTest < ActionView::TestCase
566
638
  assert_select 'select option[value=carlos]', 'carlos'
567
639
  end
568
640
 
641
+ test 'collection input with radio type should generate required html attribute' do
642
+ with_input_for @user, :name, :radio, :collection => ['Jose' , 'Carlos']
643
+ assert_select 'input[type=radio].required'
644
+ assert_select 'input[type=radio][required]'
645
+ end
646
+
647
+ test 'collection input with select type should not generate invalid required html attribute' do
648
+ with_input_for @user, :name, :select, :collection => ['Jose' , 'Carlos']
649
+ assert_select 'select.required'
650
+ assert_no_select 'select[required]'
651
+ end
652
+
569
653
  # With no object
570
654
  test 'input should be generated properly when object is not present' do
571
655
  with_input_for :project, :name, :string
@@ -28,4 +28,18 @@ module MiscHelpers
28
28
  def with_concat_form_for(object, &block)
29
29
  concat simple_form_for(object, &block)
30
30
  end
31
+
32
+ def with_concat_custom_form_for(object, &block)
33
+ concat custom_form_for(object, &block)
34
+ end
35
+
36
+ def custom_form_for(object, *args, &block)
37
+ simple_form_for(object, *(args << { :builder => CustomFormBuilder }), &block)
38
+ end
39
+ end
40
+
41
+ class CustomFormBuilder < SimpleForm::FormBuilder
42
+ def input(attribute_name, *args, &block)
43
+ super(attribute_name, *(args << { :input_html => { :class => 'custom' } }), &block)
44
+ end
31
45
  end
@@ -40,7 +40,7 @@ class User
40
40
 
41
41
  attr_accessor :id, :name, :company, :company_id, :time_zone, :active, :description, :created_at, :updated_at,
42
42
  :credit_limit, :age, :password, :delivery_time, :born_at, :special_company_id, :country, :url, :tag_ids,
43
- :avatar, :email, :status, :residence_country, :phone_number, :post_count
43
+ :avatar, :email, :status, :residence_country, :phone_number, :post_count, :lock_version
44
44
 
45
45
  def initialize(options={})
46
46
  options.each do |key, value|
@@ -70,6 +70,7 @@ class User
70
70
  when :delivery_time then :time
71
71
  when :created_at then :datetime
72
72
  when :updated_at then :timestamp
73
+ when :lock_version then :integer
73
74
  end
74
75
  Column.new(attribute, column_type, limit)
75
76
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_form
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
5
- prerelease: false
4
+ hash: 25
5
+ prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 3
9
- - 0
10
- version: 1.3.0
9
+ - 1
10
+ version: 1.3.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - "Jos\xC3\xA9 Valim"
@@ -16,34 +16,27 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2010-12-08 00:00:00 -02:00
19
+ date: 2011-02-06 00:00:00 -02:00
20
20
  default_executable:
21
- dependencies:
22
- - !ruby/object:Gem::Dependency
23
- prerelease: false
24
- type: :runtime
25
- name: rails
26
- version_requirements: &id001 !ruby/object:Gem::Requirement
27
- none: false
28
- requirements:
29
- - - ~>
30
- - !ruby/object:Gem::Version
31
- hash: 7
32
- segments:
33
- - 3
34
- - 0
35
- - 0
36
- version: 3.0.0
37
- requirement: *id001
21
+ dependencies: []
22
+
38
23
  description: Forms made easy!
39
24
  email: contact@plataformatec.com.br
40
25
  executables: []
41
26
 
42
27
  extensions: []
43
28
 
44
- extra_rdoc_files:
45
- - README.rdoc
29
+ extra_rdoc_files: []
30
+
46
31
  files:
32
+ - .gitignore
33
+ - .gitmodules
34
+ - CHANGELOG.rdoc
35
+ - Gemfile
36
+ - Gemfile.lock
37
+ - MIT-LICENSE
38
+ - README.rdoc
39
+ - Rakefile
47
40
  - init.rb
48
41
  - lib/generators/simple_form/USAGE
49
42
  - lib/generators/simple_form/install_generator.rb
@@ -78,7 +71,7 @@ files:
78
71
  - lib/simple_form/inputs/string_input.rb
79
72
  - lib/simple_form/map_type.rb
80
73
  - lib/simple_form/version.rb
81
- - README.rdoc
74
+ - simple_form.gemspec
82
75
  - test/action_view_extensions/builder_test.rb
83
76
  - test/action_view_extensions/form_helper_test.rb
84
77
  - test/components/error_test.rb
@@ -123,8 +116,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
123
116
  version: "0"
124
117
  requirements: []
125
118
 
126
- rubyforge_project:
127
- rubygems_version: 1.3.7
119
+ rubyforge_project: simple_form
120
+ rubygems_version: 1.5.0
128
121
  signing_key:
129
122
  specification_version: 3
130
123
  summary: Forms made easy!