simple_form 3.1.0 → 5.0.0
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.
- checksums.yaml +5 -5
- data/CHANGELOG.md +148 -0
- data/MIT-LICENSE +1 -1
- data/README.md +278 -68
- data/lib/generators/simple_form/install_generator.rb +1 -0
- data/lib/generators/simple_form/templates/README +3 -3
- data/lib/generators/simple_form/templates/_form.html.erb +2 -0
- data/lib/generators/simple_form/templates/_form.html.haml +2 -0
- data/lib/generators/simple_form/templates/_form.html.slim +1 -0
- data/lib/generators/simple_form/templates/config/initializers/simple_form.rb +19 -9
- data/lib/generators/simple_form/templates/config/initializers/simple_form_bootstrap.rb +367 -63
- data/lib/generators/simple_form/templates/config/initializers/simple_form_foundation.rb +23 -8
- data/lib/simple_form/action_view_extensions/builder.rb +1 -0
- data/lib/simple_form/action_view_extensions/form_helper.rb +4 -1
- data/lib/simple_form/components/errors.rb +15 -2
- data/lib/simple_form/components/hints.rb +1 -0
- data/lib/simple_form/components/html5.rb +15 -4
- data/lib/simple_form/components/label_input.rb +2 -1
- data/lib/simple_form/components/labels.rb +12 -5
- data/lib/simple_form/components/maxlength.rb +8 -4
- data/lib/simple_form/components/min_max.rb +1 -0
- data/lib/simple_form/components/minlength.rb +38 -0
- data/lib/simple_form/components/pattern.rb +1 -0
- data/lib/simple_form/components/placeholders.rb +2 -1
- data/lib/simple_form/components/readonly.rb +1 -0
- data/lib/simple_form/components.rb +2 -0
- data/lib/simple_form/error_notification.rb +1 -0
- data/lib/simple_form/form_builder.rb +117 -35
- data/lib/simple_form/helpers/autofocus.rb +1 -0
- data/lib/simple_form/helpers/disabled.rb +1 -0
- data/lib/simple_form/helpers/readonly.rb +1 -0
- data/lib/simple_form/helpers/required.rb +1 -0
- data/lib/simple_form/helpers/validators.rb +2 -1
- data/lib/simple_form/helpers.rb +1 -0
- data/lib/simple_form/i18n_cache.rb +1 -0
- data/lib/simple_form/inputs/base.rb +36 -12
- data/lib/simple_form/inputs/block_input.rb +1 -0
- data/lib/simple_form/inputs/boolean_input.rb +14 -3
- data/lib/simple_form/inputs/collection_check_boxes_input.rb +2 -1
- data/lib/simple_form/inputs/collection_input.rb +7 -5
- data/lib/simple_form/inputs/collection_radio_buttons_input.rb +3 -2
- data/lib/simple_form/inputs/collection_select_input.rb +1 -0
- data/lib/simple_form/inputs/color_input.rb +14 -0
- data/lib/simple_form/inputs/date_time_input.rb +13 -8
- data/lib/simple_form/inputs/file_input.rb +1 -0
- data/lib/simple_form/inputs/grouped_collection_select_input.rb +1 -0
- data/lib/simple_form/inputs/hidden_input.rb +1 -0
- data/lib/simple_form/inputs/numeric_input.rb +1 -0
- data/lib/simple_form/inputs/password_input.rb +2 -1
- data/lib/simple_form/inputs/priority_input.rb +1 -4
- data/lib/simple_form/inputs/range_input.rb +1 -0
- data/lib/simple_form/inputs/string_input.rb +3 -2
- data/lib/simple_form/inputs/text_input.rb +2 -1
- data/lib/simple_form/inputs.rb +2 -0
- data/lib/simple_form/map_type.rb +1 -0
- data/lib/simple_form/railtie.rb +1 -0
- data/lib/simple_form/tags.rb +7 -2
- data/lib/simple_form/version.rb +2 -1
- data/lib/simple_form/wrappers/builder.rb +1 -0
- data/lib/simple_form/wrappers/leaf.rb +2 -1
- data/lib/simple_form/wrappers/many.rb +1 -0
- data/lib/simple_form/wrappers/root.rb +2 -0
- data/lib/simple_form/wrappers/single.rb +2 -1
- data/lib/simple_form/wrappers.rb +1 -0
- data/lib/simple_form.rb +79 -14
- data/test/action_view_extensions/builder_test.rb +28 -9
- data/test/action_view_extensions/form_helper_test.rb +3 -2
- data/test/components/custom_components_test.rb +62 -0
- data/test/components/label_test.rb +33 -4
- data/test/form_builder/association_test.rb +33 -2
- data/test/form_builder/button_test.rb +1 -0
- data/test/form_builder/error_notification_test.rb +1 -0
- data/test/form_builder/error_test.rb +44 -9
- data/test/form_builder/general_test.rb +92 -20
- data/test/form_builder/hint_test.rb +6 -0
- data/test/form_builder/input_field_test.rb +76 -70
- data/test/form_builder/label_test.rb +27 -4
- data/test/form_builder/wrapper_test.rb +66 -14
- data/test/generators/simple_form_generator_test.rb +4 -3
- data/test/inputs/boolean_input_test.rb +35 -0
- data/test/inputs/collection_check_boxes_input_test.rb +38 -14
- data/test/inputs/collection_radio_buttons_input_test.rb +48 -24
- data/test/inputs/collection_select_input_test.rb +40 -39
- data/test/inputs/color_input_test.rb +10 -0
- data/test/inputs/datetime_input_test.rb +12 -8
- data/test/inputs/disabled_test.rb +14 -0
- data/test/inputs/discovery_test.rb +23 -0
- data/test/inputs/file_input_test.rb +1 -0
- data/test/inputs/general_test.rb +3 -2
- data/test/inputs/grouped_collection_select_input_test.rb +11 -10
- data/test/inputs/hidden_input_test.rb +1 -0
- data/test/inputs/numeric_input_test.rb +5 -1
- data/test/inputs/priority_input_test.rb +7 -6
- data/test/inputs/readonly_test.rb +1 -0
- data/test/inputs/required_test.rb +45 -0
- data/test/inputs/string_input_test.rb +18 -16
- data/test/inputs/text_input_test.rb +13 -0
- data/test/simple_form_test.rb +1 -0
- data/test/support/discovery_inputs.rb +8 -0
- data/test/support/misc_helpers.rb +44 -2
- data/test/support/mock_controller.rb +7 -1
- data/test/support/models.rb +105 -22
- data/test/test_helper.rb +14 -3
- metadata +42 -36
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# encoding: UTF-8
|
2
3
|
require 'test_helper'
|
3
4
|
|
@@ -7,6 +8,11 @@ class StringInputTest < ActionView::TestCase
|
|
7
8
|
assert_select "input#user_name[type=text][name='user[name]'][value='New in SimpleForm!']"
|
8
9
|
end
|
9
10
|
|
11
|
+
test 'input maps text field to citext attribute' do
|
12
|
+
with_input_for @user, :name, :citext
|
13
|
+
assert_select "input#user_name[type=text][name='user[name]'][value='New in SimpleForm!']"
|
14
|
+
end
|
15
|
+
|
10
16
|
test 'input generates a password field for password attributes' do
|
11
17
|
with_input_for @user, :password, :password
|
12
18
|
assert_select "input#user_password.password[type=password][name='user[password]']"
|
@@ -32,9 +38,9 @@ class StringInputTest < ActionView::TestCase
|
|
32
38
|
assert_select 'input.string[maxlength="25"]'
|
33
39
|
end
|
34
40
|
|
35
|
-
test 'input
|
36
|
-
with_input_for @validating_user, :
|
37
|
-
|
41
|
+
test 'input infers minlength column definition from validation when present' do
|
42
|
+
with_input_for @validating_user, :name, :string
|
43
|
+
assert_select 'input.string[minlength="5"]'
|
38
44
|
end
|
39
45
|
|
40
46
|
test 'input gets maxlength from validation when :is option present' do
|
@@ -42,6 +48,11 @@ class StringInputTest < ActionView::TestCase
|
|
42
48
|
assert_select 'input.string[maxlength="12"]'
|
43
49
|
end
|
44
50
|
|
51
|
+
test 'input gets minlength from validation when :is option present' do
|
52
|
+
with_input_for @validating_user, :home_picture, :string
|
53
|
+
assert_select 'input.string[minlength="12"]'
|
54
|
+
end
|
55
|
+
|
45
56
|
test 'input maxlength is the column limit plus one to make room for decimal point' do
|
46
57
|
with_input_for @user, :credit_limit, :string
|
47
58
|
|
@@ -70,12 +81,12 @@ class StringInputTest < ActionView::TestCase
|
|
70
81
|
|
71
82
|
test 'input infers pattern from attributes' do
|
72
83
|
with_input_for @other_validating_user, :country, :string, pattern: true
|
73
|
-
assert_select '
|
84
|
+
assert_select "input:match('pattern', ?)", /\w+/
|
74
85
|
end
|
75
86
|
|
76
87
|
test 'input infers pattern from attributes using proc' do
|
77
88
|
with_input_for @other_validating_user, :name, :string, pattern: true
|
78
|
-
assert_select '
|
89
|
+
assert_select "input:match('pattern', ?)", /\w+/
|
79
90
|
end
|
80
91
|
|
81
92
|
test 'input does not infer pattern from attributes if root default is false' do
|
@@ -87,7 +98,7 @@ class StringInputTest < ActionView::TestCase
|
|
87
98
|
|
88
99
|
test 'input uses given pattern from attributes' do
|
89
100
|
with_input_for @other_validating_user, :country, :string, input_html: { pattern: "\\d+" }
|
90
|
-
assert_select '
|
101
|
+
assert_select "input:match('pattern', ?)", /\\d+/
|
91
102
|
end
|
92
103
|
|
93
104
|
test 'input does not use pattern if model has :without validation option' do
|
@@ -115,16 +126,7 @@ class StringInputTest < ActionView::TestCase
|
|
115
126
|
end
|
116
127
|
end
|
117
128
|
|
118
|
-
|
119
|
-
store_translations(:en, simple_form: { labels: { user: {
|
120
|
-
name_html: '<b>Name</b>'
|
121
|
-
} } }) do
|
122
|
-
with_input_for @user, :name, :string
|
123
|
-
assert_select 'label b', 'Name'
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
[:email, :url, :search, :tel].each do |type|
|
129
|
+
%i[email url search tel].each do |type|
|
128
130
|
test "input allows type #{type}" do
|
129
131
|
with_input_for @user, :name, type
|
130
132
|
assert_select "input.string.#{type}"
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# encoding: UTF-8
|
2
3
|
require 'test_helper'
|
3
4
|
|
@@ -12,6 +13,13 @@ class TextInputTest < ActionView::TestCase
|
|
12
13
|
assert_select 'textarea.text[placeholder="Put in some text"]'
|
13
14
|
end
|
14
15
|
|
16
|
+
test 'input generates a placeholder from the translations' do
|
17
|
+
store_translations(:en, simple_form: { placeholders: { user: { name: "placeholder from i18n en.simple_form.placeholders.user.name" } } }) do
|
18
|
+
with_input_for @user, :name, :text
|
19
|
+
assert_select 'textarea.text[placeholder="placeholder from i18n en.simple_form.placeholders.user.name"]'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
15
23
|
test 'input gets maxlength from column definition for text attributes' do
|
16
24
|
with_input_for @user, :description, :text
|
17
25
|
assert_select 'textarea.text[maxlength="200"]'
|
@@ -21,4 +29,9 @@ class TextInputTest < ActionView::TestCase
|
|
21
29
|
with_input_for @validating_user, :description, :text
|
22
30
|
assert_select 'textarea.text[maxlength="50"]'
|
23
31
|
end
|
32
|
+
|
33
|
+
test 'input infers minlength column definition from validation when present for text attributes' do
|
34
|
+
with_input_for @validating_user, :description, :text
|
35
|
+
assert_select 'textarea.text[minlength="15"]'
|
36
|
+
end
|
24
37
|
end
|
data/test/simple_form_test.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
class StringInput < SimpleForm::Inputs::StringInput
|
2
3
|
def input(wrapper_options = nil)
|
3
4
|
"<section>#{super}</section>".html_safe
|
@@ -36,6 +37,13 @@ class CollectionSelectInput < SimpleForm::Inputs::CollectionSelectInput
|
|
36
37
|
end
|
37
38
|
end
|
38
39
|
|
40
|
+
class FileInput < SimpleForm::Inputs::FileInput
|
41
|
+
def input_html_classes
|
42
|
+
super.delete_if { |html_class| html_class == :file }
|
43
|
+
super.push('file-upload')
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
39
47
|
module CustomInputs
|
40
48
|
class CustomizedInput < SimpleForm::Inputs::StringInput
|
41
49
|
def input_html_classes
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module MiscHelpers
|
2
3
|
def store_translations(locale, translations, &block)
|
3
4
|
I18n.backend.store_translations locale, translations
|
@@ -46,7 +47,7 @@ module MiscHelpers
|
|
46
47
|
end
|
47
48
|
end
|
48
49
|
|
49
|
-
def swap_wrapper(name = :default, wrapper =
|
50
|
+
def swap_wrapper(name = :default, wrapper = custom_wrapper)
|
50
51
|
old = SimpleForm.wrappers[name.to_s]
|
51
52
|
SimpleForm.wrappers[name.to_s] = wrapper
|
52
53
|
yield
|
@@ -91,6 +92,20 @@ module MiscHelpers
|
|
91
92
|
end
|
92
93
|
end
|
93
94
|
|
95
|
+
def custom_wrapper_with_input_data_modal
|
96
|
+
SimpleForm.build tag: :div, class: "custom_wrapper" do |b|
|
97
|
+
b.use :label
|
98
|
+
b.use :input, data: { modal: 'data-modal', wrapper: 'data-wrapper' }
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def custom_wrapper_with_input_aria_modal
|
103
|
+
SimpleForm.build tag: :div, class: "custom_wrapper" do |b|
|
104
|
+
b.use :label
|
105
|
+
b.use :input, aria: { modal: 'aria-modal', wrapper: 'aria-wrapper' }
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
94
109
|
def custom_wrapper_with_label_class
|
95
110
|
SimpleForm.build tag: :div, class: "custom_wrapper" do |b|
|
96
111
|
b.use :label, class: 'inline-class'
|
@@ -167,7 +182,7 @@ module MiscHelpers
|
|
167
182
|
end
|
168
183
|
|
169
184
|
def custom_wrapper_with_label_text
|
170
|
-
SimpleForm.build :
|
185
|
+
SimpleForm.build label_text: proc { |label, required| "**#{label}**" } do |b|
|
171
186
|
b.use :label_input
|
172
187
|
end
|
173
188
|
end
|
@@ -184,6 +199,27 @@ module MiscHelpers
|
|
184
199
|
end
|
185
200
|
end
|
186
201
|
|
202
|
+
def custom_wrapper_with_required_input
|
203
|
+
SimpleForm.build tag: :span, class: 'custom_wrapper' do |b|
|
204
|
+
b.use :html5
|
205
|
+
b.use :input, required: true
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
def custom_wrapper_with_input_error_class
|
210
|
+
SimpleForm.build tag: :div, class: "custom_wrapper", error_class: :field_with_errors do |b|
|
211
|
+
b.use :label
|
212
|
+
b.use :input, class: 'inline-class', error_class: 'is-invalid'
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
def custom_wrapper_with_input_valid_class
|
217
|
+
SimpleForm.build tag: :div, class: "custom_wrapper", valid_class: :field_without_errors do |b|
|
218
|
+
b.use :label
|
219
|
+
b.use :input, class: 'inline-class', valid_class: 'is-valid'
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
187
223
|
def custom_form_for(object, *args, &block)
|
188
224
|
simple_form_for(object, *args, { builder: CustomFormBuilder }, &block)
|
189
225
|
end
|
@@ -219,6 +255,12 @@ module MiscHelpers
|
|
219
255
|
f.input(attribute_name, options.merge(as: type))
|
220
256
|
end
|
221
257
|
end
|
258
|
+
|
259
|
+
def with_input_field_for(object, *args)
|
260
|
+
with_concat_form_for(object) do |f|
|
261
|
+
f.input_field(*args)
|
262
|
+
end
|
263
|
+
end
|
222
264
|
end
|
223
265
|
|
224
266
|
class CustomFormBuilder < SimpleForm::FormBuilder
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
class MockController
|
2
3
|
attr_writer :action_name
|
3
4
|
|
@@ -9,7 +10,7 @@ class MockController
|
|
9
10
|
defined?(@action_name) ? @action_name : "edit"
|
10
11
|
end
|
11
12
|
|
12
|
-
def url_for(*
|
13
|
+
def url_for(*)
|
13
14
|
"http://example.com"
|
14
15
|
end
|
15
16
|
|
@@ -17,8 +18,13 @@ class MockController
|
|
17
18
|
{}
|
18
19
|
end
|
19
20
|
|
21
|
+
def polymorphic_mappings(*); {}; end
|
22
|
+
|
20
23
|
def hash_for_user_path(*); end
|
24
|
+
|
21
25
|
def hash_for_validating_user_path(*); end
|
26
|
+
|
22
27
|
def hash_for_other_validating_user_path(*); end
|
28
|
+
|
23
29
|
def hash_for_users_path(*); end
|
24
30
|
end
|
data/test/support/models.rb
CHANGED
@@ -1,17 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
Association = Struct.new(:klass, :name, :macro, :scope, :options)
|
2
3
|
|
3
4
|
Column = Struct.new(:name, :type, :limit) do
|
4
|
-
# Returns +true+ if the column is either of type integer, float or decimal.
|
5
|
-
def number?
|
6
|
-
type == :integer || type == :float || type == :decimal
|
7
|
-
end
|
8
5
|
end
|
9
6
|
|
10
7
|
Relation = Struct.new(:records) do
|
11
8
|
delegate :each, to: :records
|
12
9
|
|
13
10
|
def where(conditions = nil)
|
14
|
-
self.class.new conditions ? records.first : records
|
11
|
+
self.class.new conditions ? [records.first] : records
|
15
12
|
end
|
16
13
|
|
17
14
|
def order(conditions = nil)
|
@@ -22,6 +19,12 @@ Relation = Struct.new(:records) do
|
|
22
19
|
alias_method :to_ary, :records
|
23
20
|
end
|
24
21
|
|
22
|
+
Decorator = Struct.new(:object) do
|
23
|
+
def to_model
|
24
|
+
object
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
25
28
|
Picture = Struct.new(:id, :name) do
|
26
29
|
extend ActiveModel::Naming
|
27
30
|
include ActiveModel::Conversion
|
@@ -60,7 +63,24 @@ Company = Struct.new(:id, :name) do
|
|
60
63
|
end
|
61
64
|
end
|
62
65
|
|
63
|
-
|
66
|
+
Friend = Struct.new(:id, :name) do
|
67
|
+
extend ActiveModel::Naming
|
68
|
+
include ActiveModel::Conversion
|
69
|
+
|
70
|
+
def self.all
|
71
|
+
(1..3).map { |i| new(i, "#{name} #{i}") }
|
72
|
+
end
|
73
|
+
|
74
|
+
def persisted?
|
75
|
+
true
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
class Tag < Company
|
80
|
+
def group_method
|
81
|
+
["category-1"]
|
82
|
+
end
|
83
|
+
end
|
64
84
|
|
65
85
|
TagGroup = Struct.new(:id, :name, :tags)
|
66
86
|
|
@@ -74,7 +94,8 @@ class User
|
|
74
94
|
:avatar, :home_picture, :email, :status, :residence_country, :phone_number,
|
75
95
|
:post_count, :lock_version, :amount, :attempts, :action, :credit_card, :gender,
|
76
96
|
:extra_special_company_id, :pictures, :picture_ids, :special_pictures,
|
77
|
-
:special_picture_ids, :uuid
|
97
|
+
:special_picture_ids, :uuid, :friends, :friend_ids, :special_tags, :special_tag_ids,
|
98
|
+
:citext, :hstore, :json, :jsonb, :hourly, :favorite_color
|
78
99
|
|
79
100
|
def self.build(extra_attributes = {})
|
80
101
|
attributes = {
|
@@ -125,24 +146,65 @@ class User
|
|
125
146
|
when :attempts then :integer
|
126
147
|
when :action then :string
|
127
148
|
when :credit_card then :string
|
128
|
-
|
149
|
+
else attribute.to_sym
|
129
150
|
end
|
130
151
|
Column.new(attribute, column_type, limit)
|
131
152
|
end
|
132
153
|
|
154
|
+
begin
|
155
|
+
require 'active_model/type'
|
156
|
+
begin
|
157
|
+
ActiveModel::Type.lookup(:text)
|
158
|
+
rescue ArgumentError # :text is no longer an ActiveModel::Type
|
159
|
+
# But we don't want our tests to depend on ActiveRecord
|
160
|
+
class ::ActiveModel::Type::Text < ActiveModel::Type::String
|
161
|
+
def type; :text; end
|
162
|
+
end
|
163
|
+
ActiveModel::Type.register(:text, ActiveModel::Type::Text)
|
164
|
+
end
|
165
|
+
def type_for_attribute(attribute)
|
166
|
+
column_type, limit = case attribute
|
167
|
+
when 'name', 'status', 'password' then [:string, 100]
|
168
|
+
when 'description' then [:text, 200]
|
169
|
+
when 'age' then :integer
|
170
|
+
when 'credit_limit' then [:decimal, 15]
|
171
|
+
when 'active' then :boolean
|
172
|
+
when 'born_at' then :date
|
173
|
+
when 'delivery_time' then :time
|
174
|
+
when 'created_at' then :datetime
|
175
|
+
when 'updated_at' then :datetime
|
176
|
+
when 'lock_version' then :integer
|
177
|
+
when 'home_picture' then :string
|
178
|
+
when 'amount' then :integer
|
179
|
+
when 'attempts' then :integer
|
180
|
+
when 'action' then :string
|
181
|
+
when 'credit_card' then :string
|
182
|
+
when 'uuid' then :string
|
183
|
+
when 'citext' then :string
|
184
|
+
when 'hstore' then [:text, 200]
|
185
|
+
when 'json' then [:text, 200]
|
186
|
+
when 'jsonb' then [:text, 200]
|
187
|
+
end
|
188
|
+
|
189
|
+
ActiveModel::Type.lookup(column_type, limit: limit)
|
190
|
+
end
|
191
|
+
rescue LoadError
|
192
|
+
end
|
193
|
+
|
133
194
|
def has_attribute?(attribute)
|
134
195
|
case attribute.to_sym
|
135
196
|
when :name, :status, :password, :description, :age,
|
136
197
|
:credit_limit, :active, :born_at, :delivery_time,
|
137
198
|
:created_at, :updated_at, :lock_version, :home_picture,
|
138
|
-
:amount, :attempts, :action, :credit_card, :uuid
|
199
|
+
:amount, :attempts, :action, :credit_card, :uuid,
|
200
|
+
:citext, :hstore, :json, :jsonb then true
|
139
201
|
else false
|
140
202
|
end
|
141
203
|
end
|
142
204
|
|
143
205
|
def self.human_attribute_name(attribute, options = {})
|
144
206
|
case attribute
|
145
|
-
when 'name'
|
207
|
+
when 'name', :name
|
146
208
|
'Super User Name!'
|
147
209
|
when 'description'
|
148
210
|
'User Description!'
|
@@ -159,16 +221,20 @@ class User
|
|
159
221
|
Association.new(Company, association, :belongs_to, nil, {})
|
160
222
|
when :tags
|
161
223
|
Association.new(Tag, association, :has_many, nil, {})
|
224
|
+
when :special_tags
|
225
|
+
Association.new(Tag, association, :has_many, ->(user) { where(id: user.id) }, {})
|
162
226
|
when :first_company
|
163
227
|
Association.new(Company, association, :has_one, nil, {})
|
164
228
|
when :special_company
|
165
|
-
Association.new(Company, association, :belongs_to, nil,
|
229
|
+
Association.new(Company, association, :belongs_to, nil, conditions: { id: 1 })
|
166
230
|
when :extra_special_company
|
167
|
-
Association.new(Company, association, :belongs_to, nil,
|
231
|
+
Association.new(Company, association, :belongs_to, nil, conditions: proc { { id: self.id } })
|
168
232
|
when :pictures
|
169
233
|
Association.new(Picture, association, :has_many, nil, {})
|
170
234
|
when :special_pictures
|
171
235
|
Association.new(Picture, association, :has_many, proc { where(name: self.name) }, {})
|
236
|
+
when :friends
|
237
|
+
Association.new(Friend, association, :has_many, nil, {})
|
172
238
|
end
|
173
239
|
end
|
174
240
|
|
@@ -194,8 +260,8 @@ class ValidatingUser < User
|
|
194
260
|
include ActiveModel::Validations
|
195
261
|
validates :name, presence: true
|
196
262
|
validates :company, presence: true
|
197
|
-
validates :age, presence: true, if:
|
198
|
-
validates :amount, presence: true, unless:
|
263
|
+
validates :age, presence: true, if: proc { |user| user.name }
|
264
|
+
validates :amount, presence: true, unless: proc { |user| user.age }
|
199
265
|
|
200
266
|
validates :action, presence: true, on: :create
|
201
267
|
validates :credit_limit, presence: true, on: :save
|
@@ -213,9 +279,8 @@ class ValidatingUser < User
|
|
213
279
|
greater_than_or_equal_to: :min_attempts,
|
214
280
|
less_than_or_equal_to: :max_attempts,
|
215
281
|
only_integer: true
|
216
|
-
validates_length_of :name, maximum: 25
|
217
|
-
validates_length_of :description,
|
218
|
-
validates_length_of :action, maximum: 10, tokenizer: lambda { |str| str.scan(/\w+/) }
|
282
|
+
validates_length_of :name, maximum: 25, minimum: 5
|
283
|
+
validates_length_of :description, in: 15..50
|
219
284
|
validates_length_of :home_picture, is: 12
|
220
285
|
|
221
286
|
def min_amount
|
@@ -242,16 +307,16 @@ class OtherValidatingUser < User
|
|
242
307
|
less_than: 100,
|
243
308
|
only_integer: true
|
244
309
|
validates_numericality_of :amount,
|
245
|
-
greater_than:
|
246
|
-
less_than:
|
310
|
+
greater_than: proc { |user| user.age },
|
311
|
+
less_than: proc { |user| user.age + 100 },
|
247
312
|
only_integer: true
|
248
313
|
validates_numericality_of :attempts,
|
249
|
-
greater_than_or_equal_to:
|
250
|
-
less_than_or_equal_to:
|
314
|
+
greater_than_or_equal_to: proc { |user| user.age },
|
315
|
+
less_than_or_equal_to: proc { |user| user.age + 100 },
|
251
316
|
only_integer: true
|
252
317
|
|
253
318
|
validates_format_of :country, with: /\w+/
|
254
|
-
validates_format_of :name, with:
|
319
|
+
validates_format_of :name, with: proc { /\w+/ }
|
255
320
|
validates_format_of :description, without: /\d+/
|
256
321
|
end
|
257
322
|
|
@@ -268,3 +333,21 @@ end
|
|
268
333
|
|
269
334
|
class UserNumber1And2 < User
|
270
335
|
end
|
336
|
+
|
337
|
+
class UserWithAttachment < User
|
338
|
+
def avatar_attachment
|
339
|
+
OpenStruct.new
|
340
|
+
end
|
341
|
+
|
342
|
+
def cover_url
|
343
|
+
"/uploads/cover.png"
|
344
|
+
end
|
345
|
+
|
346
|
+
def profile_image_attacher
|
347
|
+
OpenStruct.new
|
348
|
+
end
|
349
|
+
|
350
|
+
def portrait_file_name
|
351
|
+
"portrait.png"
|
352
|
+
end
|
353
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -1,14 +1,13 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
3
2
|
require 'minitest/autorun'
|
4
3
|
|
5
4
|
require 'active_model'
|
6
5
|
require 'action_controller'
|
7
6
|
require 'action_view'
|
7
|
+
|
8
8
|
ActionView::RoutingUrlFor.send(:include, ActionDispatch::Routing::UrlFor)
|
9
9
|
|
10
10
|
require 'action_view/template'
|
11
|
-
|
12
11
|
require 'action_view/test_case'
|
13
12
|
|
14
13
|
module Rails
|
@@ -36,10 +35,18 @@ else
|
|
36
35
|
ActionDispatch::Assertions::NO_STRIP << "label"
|
37
36
|
end
|
38
37
|
|
38
|
+
if ActiveSupport::TestCase.respond_to?(:test_order=)
|
39
|
+
ActiveSupport::TestCase.test_order = :random
|
40
|
+
end
|
41
|
+
|
42
|
+
require "rails/test_unit/line_filtering"
|
43
|
+
|
39
44
|
class ActionView::TestCase
|
40
45
|
include MiscHelpers
|
41
46
|
include SimpleForm::ActionViewExtensions::FormHelper
|
42
47
|
|
48
|
+
extend Rails::LineFiltering
|
49
|
+
|
43
50
|
setup :set_controller
|
44
51
|
setup :setup_users
|
45
52
|
|
@@ -49,8 +56,11 @@ class ActionView::TestCase
|
|
49
56
|
|
50
57
|
def setup_users(extra_attributes = {})
|
51
58
|
@user = User.build(extra_attributes)
|
59
|
+
@decorated_user = Decorator.new(@user)
|
52
60
|
|
53
61
|
@validating_user = ValidatingUser.build({
|
62
|
+
name: 'Tester McTesterson',
|
63
|
+
description: 'A test user of the most distinguised caliber',
|
54
64
|
home_picture: 'Home picture',
|
55
65
|
age: 19,
|
56
66
|
amount: 15,
|
@@ -81,4 +91,5 @@ class ActionView::TestCase
|
|
81
91
|
alias :validating_user_path :user_path
|
82
92
|
alias :validating_users_path :user_path
|
83
93
|
alias :other_validating_user_path :user_path
|
94
|
+
alias :user_with_attachment_path :user_path
|
84
95
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_form
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 5.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- José Valim
|
@@ -10,36 +10,36 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2019-09-27 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activemodel
|
17
17
|
requirement: !ruby/object:Gem::Requirement
|
18
18
|
requirements:
|
19
|
-
- - "
|
19
|
+
- - ">="
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: '
|
21
|
+
version: '5.0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
|
-
- - "
|
26
|
+
- - ">="
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
version: '
|
28
|
+
version: '5.0'
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: actionpack
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
32
32
|
requirements:
|
33
|
-
- - "
|
33
|
+
- - ">="
|
34
34
|
- !ruby/object:Gem::Version
|
35
|
-
version: '
|
35
|
+
version: '5.0'
|
36
36
|
type: :runtime
|
37
37
|
prerelease: false
|
38
38
|
version_requirements: !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
|
-
- - "
|
40
|
+
- - ">="
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: '
|
42
|
+
version: '5.0'
|
43
43
|
description: Forms made easy!
|
44
44
|
email: opensource@plataformatec.com.br
|
45
45
|
executables: []
|
@@ -70,6 +70,7 @@ files:
|
|
70
70
|
- lib/simple_form/components/labels.rb
|
71
71
|
- lib/simple_form/components/maxlength.rb
|
72
72
|
- lib/simple_form/components/min_max.rb
|
73
|
+
- lib/simple_form/components/minlength.rb
|
73
74
|
- lib/simple_form/components/pattern.rb
|
74
75
|
- lib/simple_form/components/placeholders.rb
|
75
76
|
- lib/simple_form/components/readonly.rb
|
@@ -90,6 +91,7 @@ files:
|
|
90
91
|
- lib/simple_form/inputs/collection_input.rb
|
91
92
|
- lib/simple_form/inputs/collection_radio_buttons_input.rb
|
92
93
|
- lib/simple_form/inputs/collection_select_input.rb
|
94
|
+
- lib/simple_form/inputs/color_input.rb
|
93
95
|
- lib/simple_form/inputs/date_time_input.rb
|
94
96
|
- lib/simple_form/inputs/file_input.rb
|
95
97
|
- lib/simple_form/inputs/grouped_collection_select_input.rb
|
@@ -112,6 +114,7 @@ files:
|
|
112
114
|
- lib/simple_form/wrappers/single.rb
|
113
115
|
- test/action_view_extensions/builder_test.rb
|
114
116
|
- test/action_view_extensions/form_helper_test.rb
|
117
|
+
- test/components/custom_components_test.rb
|
115
118
|
- test/components/label_test.rb
|
116
119
|
- test/form_builder/association_test.rb
|
117
120
|
- test/form_builder/button_test.rb
|
@@ -127,6 +130,7 @@ files:
|
|
127
130
|
- test/inputs/collection_check_boxes_input_test.rb
|
128
131
|
- test/inputs/collection_radio_buttons_input_test.rb
|
129
132
|
- test/inputs/collection_select_input_test.rb
|
133
|
+
- test/inputs/color_input_test.rb
|
130
134
|
- test/inputs/datetime_input_test.rb
|
131
135
|
- test/inputs/disabled_test.rb
|
132
136
|
- test/inputs/discovery_test.rb
|
@@ -165,45 +169,47 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
165
169
|
- !ruby/object:Gem::Version
|
166
170
|
version: '0'
|
167
171
|
requirements: []
|
168
|
-
rubyforge_project:
|
169
|
-
rubygems_version: 2.
|
172
|
+
rubyforge_project:
|
173
|
+
rubygems_version: 2.7.3
|
170
174
|
signing_key:
|
171
175
|
specification_version: 4
|
172
176
|
summary: Forms made easy!
|
173
177
|
test_files:
|
174
|
-
- test/action_view_extensions/builder_test.rb
|
175
|
-
- test/action_view_extensions/form_helper_test.rb
|
176
178
|
- test/components/label_test.rb
|
177
|
-
- test/
|
178
|
-
- test/
|
179
|
-
- test/
|
179
|
+
- test/components/custom_components_test.rb
|
180
|
+
- test/support/discovery_inputs.rb
|
181
|
+
- test/support/misc_helpers.rb
|
182
|
+
- test/support/mock_controller.rb
|
183
|
+
- test/support/models.rb
|
184
|
+
- test/test_helper.rb
|
180
185
|
- test/form_builder/error_test.rb
|
181
|
-
- test/form_builder/general_test.rb
|
182
186
|
- test/form_builder/hint_test.rb
|
187
|
+
- test/form_builder/error_notification_test.rb
|
188
|
+
- test/form_builder/general_test.rb
|
189
|
+
- test/form_builder/button_test.rb
|
183
190
|
- test/form_builder/input_field_test.rb
|
184
191
|
- test/form_builder/label_test.rb
|
185
192
|
- test/form_builder/wrapper_test.rb
|
193
|
+
- test/form_builder/association_test.rb
|
186
194
|
- test/generators/simple_form_generator_test.rb
|
187
|
-
- test/
|
195
|
+
- test/action_view_extensions/builder_test.rb
|
196
|
+
- test/action_view_extensions/form_helper_test.rb
|
197
|
+
- test/simple_form_test.rb
|
198
|
+
- test/inputs/string_input_test.rb
|
199
|
+
- test/inputs/numeric_input_test.rb
|
200
|
+
- test/inputs/readonly_test.rb
|
201
|
+
- test/inputs/grouped_collection_select_input_test.rb
|
202
|
+
- test/inputs/text_input_test.rb
|
188
203
|
- test/inputs/collection_check_boxes_input_test.rb
|
189
|
-
- test/inputs/
|
190
|
-
- test/inputs/collection_select_input_test.rb
|
191
|
-
- test/inputs/datetime_input_test.rb
|
204
|
+
- test/inputs/boolean_input_test.rb
|
192
205
|
- test/inputs/disabled_test.rb
|
193
206
|
- test/inputs/discovery_test.rb
|
194
|
-
- test/inputs/
|
207
|
+
- test/inputs/collection_select_input_test.rb
|
195
208
|
- test/inputs/general_test.rb
|
196
|
-
- test/inputs/
|
197
|
-
- test/inputs/hidden_input_test.rb
|
198
|
-
- test/inputs/numeric_input_test.rb
|
199
|
-
- test/inputs/priority_input_test.rb
|
200
|
-
- test/inputs/readonly_test.rb
|
209
|
+
- test/inputs/color_input_test.rb
|
201
210
|
- test/inputs/required_test.rb
|
202
|
-
- test/inputs/
|
203
|
-
- test/inputs/
|
204
|
-
- test/
|
205
|
-
- test/
|
206
|
-
- test/
|
207
|
-
- test/support/mock_controller.rb
|
208
|
-
- test/support/models.rb
|
209
|
-
- test/test_helper.rb
|
211
|
+
- test/inputs/collection_radio_buttons_input_test.rb
|
212
|
+
- test/inputs/priority_input_test.rb
|
213
|
+
- test/inputs/hidden_input_test.rb
|
214
|
+
- test/inputs/file_input_test.rb
|
215
|
+
- test/inputs/datetime_input_test.rb
|