simple_form 2.0.0 → 3.5.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.

Potentially problematic release.


This version of simple_form might be problematic. Click here for more details.

Files changed (103) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +97 -198
  3. data/MIT-LICENSE +1 -1
  4. data/README.md +572 -296
  5. data/lib/generators/simple_form/install_generator.rb +17 -7
  6. data/lib/generators/simple_form/templates/README +3 -4
  7. data/lib/generators/simple_form/templates/_form.html.erb +1 -0
  8. data/lib/generators/simple_form/templates/_form.html.haml +1 -0
  9. data/lib/generators/simple_form/templates/config/initializers/{simple_form.rb.tt → simple_form.rb} +57 -63
  10. data/lib/generators/simple_form/templates/config/initializers/simple_form_bootstrap.rb +155 -0
  11. data/lib/generators/simple_form/templates/config/initializers/simple_form_foundation.rb +111 -0
  12. data/lib/generators/simple_form/templates/config/locales/simple_form.en.yml +14 -7
  13. data/lib/simple_form/action_view_extensions/builder.rb +5 -305
  14. data/lib/simple_form/action_view_extensions/form_helper.rb +18 -20
  15. data/lib/simple_form/components/errors.rb +30 -3
  16. data/lib/simple_form/components/hints.rb +10 -3
  17. data/lib/simple_form/components/html5.rb +17 -3
  18. data/lib/simple_form/components/label_input.rb +21 -2
  19. data/lib/simple_form/components/labels.rb +16 -11
  20. data/lib/simple_form/components/maxlength.rb +19 -12
  21. data/lib/simple_form/components/min_max.rb +4 -2
  22. data/lib/simple_form/components/minlength.rb +48 -0
  23. data/lib/simple_form/components/pattern.rb +5 -4
  24. data/lib/simple_form/components/placeholders.rb +3 -2
  25. data/lib/simple_form/components/readonly.rb +3 -2
  26. data/lib/simple_form/components.rb +15 -11
  27. data/lib/simple_form/error_notification.rb +4 -3
  28. data/lib/simple_form/form_builder.rb +283 -105
  29. data/lib/simple_form/helpers/autofocus.rb +1 -0
  30. data/lib/simple_form/helpers/disabled.rb +1 -0
  31. data/lib/simple_form/helpers/readonly.rb +1 -0
  32. data/lib/simple_form/helpers/required.rb +1 -0
  33. data/lib/simple_form/helpers/validators.rb +4 -3
  34. data/lib/simple_form/helpers.rb +7 -6
  35. data/lib/simple_form/i18n_cache.rb +1 -0
  36. data/lib/simple_form/inputs/base.rb +76 -23
  37. data/lib/simple_form/inputs/block_input.rb +3 -2
  38. data/lib/simple_form/inputs/boolean_input.rb +55 -16
  39. data/lib/simple_form/inputs/collection_check_boxes_input.rb +2 -1
  40. data/lib/simple_form/inputs/collection_input.rb +41 -18
  41. data/lib/simple_form/inputs/collection_radio_buttons_input.rb +11 -19
  42. data/lib/simple_form/inputs/collection_select_input.rb +5 -2
  43. data/lib/simple_form/inputs/date_time_input.rb +23 -12
  44. data/lib/simple_form/inputs/file_input.rb +5 -2
  45. data/lib/simple_form/inputs/grouped_collection_select_input.rb +16 -3
  46. data/lib/simple_form/inputs/hidden_input.rb +5 -2
  47. data/lib/simple_form/inputs/numeric_input.rb +4 -8
  48. data/lib/simple_form/inputs/password_input.rb +6 -4
  49. data/lib/simple_form/inputs/priority_input.rb +5 -2
  50. data/lib/simple_form/inputs/range_input.rb +2 -1
  51. data/lib/simple_form/inputs/string_input.rb +6 -4
  52. data/lib/simple_form/inputs/text_input.rb +6 -3
  53. data/lib/simple_form/inputs.rb +20 -17
  54. data/lib/simple_form/map_type.rb +1 -0
  55. data/lib/simple_form/railtie.rb +15 -0
  56. data/lib/simple_form/tags.rb +69 -0
  57. data/lib/simple_form/version.rb +2 -1
  58. data/lib/simple_form/wrappers/builder.rb +12 -35
  59. data/lib/simple_form/wrappers/leaf.rb +29 -0
  60. data/lib/simple_form/wrappers/many.rb +12 -7
  61. data/lib/simple_form/wrappers/root.rb +7 -4
  62. data/lib/simple_form/wrappers/single.rb +12 -3
  63. data/lib/simple_form/wrappers.rb +3 -1
  64. data/lib/simple_form.rb +118 -63
  65. data/test/action_view_extensions/builder_test.rb +230 -164
  66. data/test/action_view_extensions/form_helper_test.rb +107 -39
  67. data/test/components/label_test.rb +105 -87
  68. data/test/form_builder/association_test.rb +131 -62
  69. data/test/form_builder/button_test.rb +15 -14
  70. data/test/form_builder/error_notification_test.rb +11 -10
  71. data/test/form_builder/error_test.rb +188 -34
  72. data/test/form_builder/general_test.rb +247 -102
  73. data/test/form_builder/hint_test.rb +59 -32
  74. data/test/form_builder/input_field_test.rb +138 -25
  75. data/test/form_builder/label_test.rb +84 -13
  76. data/test/form_builder/wrapper_test.rb +236 -33
  77. data/test/generators/simple_form_generator_test.rb +15 -4
  78. data/test/inputs/boolean_input_test.rb +147 -13
  79. data/test/inputs/collection_check_boxes_input_test.rb +166 -71
  80. data/test/inputs/collection_radio_buttons_input_test.rb +229 -113
  81. data/test/inputs/collection_select_input_test.rb +222 -85
  82. data/test/inputs/datetime_input_test.rb +134 -47
  83. data/test/inputs/disabled_test.rb +62 -21
  84. data/test/inputs/discovery_test.rb +70 -10
  85. data/test/inputs/file_input_test.rb +4 -3
  86. data/test/inputs/general_test.rb +90 -26
  87. data/test/inputs/grouped_collection_select_input_test.rb +88 -23
  88. data/test/inputs/hidden_input_test.rb +7 -5
  89. data/test/inputs/numeric_input_test.rb +56 -46
  90. data/test/inputs/priority_input_test.rb +31 -16
  91. data/test/inputs/readonly_test.rb +68 -27
  92. data/test/inputs/required_test.rb +63 -18
  93. data/test/inputs/string_input_test.rb +76 -51
  94. data/test/inputs/text_input_test.rb +21 -8
  95. data/test/simple_form_test.rb +9 -0
  96. data/test/support/discovery_inputs.rb +39 -2
  97. data/test/support/misc_helpers.rb +176 -20
  98. data/test/support/mock_controller.rb +13 -7
  99. data/test/support/models.rb +187 -71
  100. data/test/test_helper.rb +38 -39
  101. metadata +53 -39
  102. data/lib/simple_form/core_ext/hash.rb +0 -16
  103. data/test/support/mock_response.rb +0 -14
@@ -1,8 +1,9 @@
1
+ # frozen_string_literal: true
1
2
  module SimpleForm
2
3
  module Components
3
4
  # Needs to be enabled in order to do automatic lookups.
4
5
  module Maxlength
5
- def maxlength
6
+ def maxlength(wrapper_options = nil)
6
7
  input_html_options[:maxlength] ||= maximum_length_from_validation || limit
7
8
  nil
8
9
  end
@@ -15,25 +16,31 @@ module SimpleForm
15
16
  maxlength
16
17
  else
17
18
  length_validator = find_length_validator
18
-
19
- if length_validator && !has_tokenizer?(length_validator)
20
- length_validator.options[:is] || length_validator.options[:maximum]
21
- end
19
+ maximum_length_value_from(length_validator)
22
20
  end
23
21
  end
24
22
 
25
23
  def find_length_validator
26
- find_validator(ActiveModel::Validations::LengthValidator)
24
+ find_validator(:length)
27
25
  end
28
26
 
29
27
  def has_tokenizer?(length_validator)
30
- tokenizer = length_validator.options[:tokenizer]
28
+ length_validator.options[:tokenizer]
29
+ end
31
30
 
32
- # TODO: Remove this check when we drop Rails 3.0 support
33
- if ActiveModel::Validations::LengthValidator.const_defined?(:DEFAULT_TOKENIZER)
34
- tokenizer && tokenizer != ActiveModel::Validations::LengthValidator::DEFAULT_TOKENIZER
35
- else
36
- tokenizer
31
+ # Use validation with tokenizer if version of Rails is less than 5,
32
+ # if not validate without the tokenizer, if version is greater than Rails 4.
33
+ if ActionPack::VERSION::STRING < '5'
34
+ def maximum_length_value_from(length_validator)
35
+ if length_validator && !has_tokenizer?(length_validator)
36
+ length_validator.options[:is] || length_validator.options[:maximum]
37
+ end
38
+ end
39
+ elsif ActionPack::VERSION::STRING >= '5'
40
+ def maximum_length_value_from(length_validator)
41
+ if length_validator
42
+ length_validator.options[:is] || length_validator.options[:maximum]
43
+ end
37
44
  end
38
45
  end
39
46
  end
@@ -1,12 +1,14 @@
1
+ # frozen_string_literal: true
1
2
  module SimpleForm
2
3
  module Components
3
4
  module MinMax
4
- def min_max
5
+ def min_max(wrapper_options = nil)
5
6
  if numeric_validator = find_numericality_validator
6
7
  validator_options = numeric_validator.options
7
8
  input_html_options[:min] ||= minimum_value(validator_options)
8
9
  input_html_options[:max] ||= maximum_value(validator_options)
9
10
  end
11
+ nil
10
12
  end
11
13
 
12
14
  private
@@ -32,7 +34,7 @@ module SimpleForm
32
34
  end
33
35
 
34
36
  def find_numericality_validator
35
- find_validator(ActiveModel::Validations::NumericalityValidator)
37
+ find_validator(:numericality)
36
38
  end
37
39
 
38
40
  def evaluate_numericality_validator_option(option)
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+ module SimpleForm
3
+ module Components
4
+ # Needs to be enabled in order to do automatic lookups.
5
+ module Minlength
6
+ def minlength(wrapper_options = nil)
7
+ input_html_options[:minlength] ||= minimum_length_from_validation
8
+ nil
9
+ end
10
+
11
+ private
12
+
13
+ def minimum_length_from_validation
14
+ minlength = options[:minlength]
15
+ if minlength.is_a?(String) || minlength.is_a?(Integer)
16
+ minlength
17
+ else
18
+ length_validator = find_length_validator
19
+ minimum_length_value_from(length_validator)
20
+ end
21
+ end
22
+
23
+ def find_length_validator
24
+ find_validator(:length)
25
+ end
26
+
27
+ def has_tokenizer?(length_validator)
28
+ length_validator.options[:tokenizer]
29
+ end
30
+
31
+ # Use validation with tokenizer if version of Rails is less than 5,
32
+ # if not validate without the tokenizer, if version is greater than Rails 4.
33
+ if ActionPack::VERSION::STRING < '5'
34
+ def minimum_length_value_from(length_validator)
35
+ if length_validator && !has_tokenizer?(length_validator)
36
+ length_validator.options[:is] || length_validator.options[:minimum]
37
+ end
38
+ end
39
+ elsif ActionPack::VERSION::STRING >= '5'
40
+ def minimum_length_value_from(length_validator)
41
+ if length_validator
42
+ length_validator.options[:is] || length_validator.options[:minimum]
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -1,8 +1,9 @@
1
+ # frozen_string_literal: true
1
2
  module SimpleForm
2
3
  module Components
3
4
  # Needs to be enabled in order to do automatic lookups.
4
5
  module Pattern
5
- def pattern
6
+ def pattern(wrapper_options = nil)
6
7
  input_html_options[:pattern] ||= pattern_source
7
8
  nil
8
9
  end
@@ -13,13 +14,13 @@ module SimpleForm
13
14
  pattern = options[:pattern]
14
15
  if pattern.is_a?(String)
15
16
  pattern
16
- elsif pattern_validator = find_pattern_validator
17
- evaluate_format_validator_option(pattern_validator.options[:with]).source
17
+ elsif (pattern_validator = find_pattern_validator) && (with = pattern_validator.options[:with])
18
+ evaluate_format_validator_option(with).source
18
19
  end
19
20
  end
20
21
 
21
22
  def find_pattern_validator
22
- find_validator(ActiveModel::Validations::FormatValidator)
23
+ find_validator(:format)
23
24
  end
24
25
 
25
26
  def evaluate_format_validator_option(option)
@@ -1,15 +1,16 @@
1
+ # frozen_string_literal: true
1
2
  module SimpleForm
2
3
  module Components
3
4
  # Needs to be enabled in order to do automatic lookups.
4
5
  module Placeholders
5
- def placeholder
6
+ def placeholder(wrapper_options = nil)
6
7
  input_html_options[:placeholder] ||= placeholder_text
7
8
  nil
8
9
  end
9
10
 
10
11
  def placeholder_text
11
12
  placeholder = options[:placeholder]
12
- placeholder.is_a?(String) ? placeholder : translate(:placeholders)
13
+ placeholder.is_a?(String) ? placeholder : translate_from_namespace(:placeholders)
13
14
  end
14
15
  end
15
16
  end
@@ -1,8 +1,9 @@
1
+ # frozen_string_literal: true
1
2
  module SimpleForm
2
3
  module Components
3
4
  # Needs to be enabled in order to do automatic lookups.
4
5
  module Readonly
5
- def readonly
6
+ def readonly(wrapper_options = nil)
6
7
  if readonly_attribute? && !has_readonly?
7
8
  input_html_options[:readonly] ||= true
8
9
  input_html_classes << :readonly
@@ -15,7 +16,7 @@ module SimpleForm
15
16
  def readonly_attribute?
16
17
  object.class.respond_to?(:readonly_attributes) &&
17
18
  object.persisted? &&
18
- object.class.readonly_attributes.include?(attribute_name)
19
+ object.class.readonly_attributes.include?(attribute_name.to_s)
19
20
  end
20
21
  end
21
22
  end
@@ -1,20 +1,24 @@
1
+ # frozen_string_literal: true
1
2
  module SimpleForm
2
3
  # Components are a special type of helpers that can work on their own.
3
4
  # For example, by using a component, it will automatically change the
4
5
  # output under given circumstances without user input. For example,
5
- # the disabled helper always need a :disabled => true option given
6
+ # the disabled helper always need a disabled: true option given
6
7
  # to the input in order to be enabled. On the other hand, things like
7
8
  # hints can generate output automatically by doing I18n lookups.
8
9
  module Components
9
- autoload :Errors, 'simple_form/components/errors'
10
- autoload :Hints, 'simple_form/components/hints'
11
- autoload :HTML5, 'simple_form/components/html5'
12
- autoload :LabelInput, 'simple_form/components/label_input'
13
- autoload :Labels, 'simple_form/components/labels'
14
- autoload :MinMax, 'simple_form/components/min_max'
15
- autoload :Maxlength, 'simple_form/components/maxlength'
16
- autoload :Pattern, 'simple_form/components/pattern'
17
- autoload :Placeholders, 'simple_form/components/placeholders'
18
- autoload :Readonly, 'simple_form/components/readonly'
10
+ extend ActiveSupport::Autoload
11
+
12
+ autoload :Errors
13
+ autoload :Hints
14
+ autoload :HTML5
15
+ autoload :LabelInput
16
+ autoload :Labels
17
+ autoload :MinMax
18
+ autoload :Maxlength
19
+ autoload :Minlength
20
+ autoload :Pattern
21
+ autoload :Placeholders
22
+ autoload :Readonly
19
23
  end
20
24
  end
@@ -1,6 +1,7 @@
1
+ # frozen_string_literal: true
1
2
  module SimpleForm
2
3
  class ErrorNotification
3
- delegate :object, :object_name, :template, :to => :@builder
4
+ delegate :object, :object_name, :template, to: :@builder
4
5
 
5
6
  def initialize(builder, options)
6
7
  @builder = builder
@@ -41,8 +42,8 @@ module SimpleForm
41
42
  lookups = []
42
43
  lookups << :"#{object_name}"
43
44
  lookups << :default_message
44
- lookups << "Some errors were found, please take a look:"
45
- I18n.t(lookups.shift, :scope => :"simple_form.error_notification", :default => lookups)
45
+ lookups << "Please review the problems below:"
46
+ I18n.t(lookups.shift, scope: :"simple_form.error_notification", default: lookups)
46
47
  end
47
48
  end
48
49
  end