simple_form 5.2.0 → 5.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -1
- data/MIT-LICENSE +1 -1
- data/README.md +3 -4
- data/lib/simple_form/components/label_input.rb +1 -1
- data/lib/simple_form/form_builder.rb +1 -5
- data/lib/simple_form/railtie.rb +4 -0
- data/lib/simple_form/version.rb +1 -1
- data/lib/simple_form/wrappers/leaf.rb +1 -1
- data/lib/simple_form.rb +8 -4
- metadata +5 -85
- data/test/action_view_extensions/builder_test.rb +0 -634
- data/test/action_view_extensions/form_helper_test.rb +0 -172
- data/test/components/custom_components_test.rb +0 -62
- data/test/components/label_test.rb +0 -352
- data/test/form_builder/association_test.rb +0 -252
- data/test/form_builder/button_test.rb +0 -48
- data/test/form_builder/error_notification_test.rb +0 -80
- data/test/form_builder/error_test.rb +0 -281
- data/test/form_builder/general_test.rb +0 -539
- data/test/form_builder/hint_test.rb +0 -150
- data/test/form_builder/input_field_test.rb +0 -195
- data/test/form_builder/label_test.rb +0 -136
- data/test/form_builder/wrapper_test.rb +0 -378
- data/test/generators/simple_form_generator_test.rb +0 -43
- data/test/inputs/boolean_input_test.rb +0 -256
- data/test/inputs/collection_check_boxes_input_test.rb +0 -323
- data/test/inputs/collection_radio_buttons_input_test.rb +0 -446
- data/test/inputs/collection_select_input_test.rb +0 -380
- data/test/inputs/color_input_test.rb +0 -10
- data/test/inputs/country_input_test.rb +0 -36
- data/test/inputs/datetime_input_test.rb +0 -176
- data/test/inputs/disabled_test.rb +0 -92
- data/test/inputs/discovery_test.rb +0 -142
- data/test/inputs/file_input_test.rb +0 -17
- data/test/inputs/general_test.rb +0 -133
- data/test/inputs/grouped_collection_select_input_test.rb +0 -196
- data/test/inputs/hidden_input_test.rb +0 -32
- data/test/inputs/numeric_input_test.rb +0 -177
- data/test/inputs/readonly_test.rb +0 -102
- data/test/inputs/required_test.rb +0 -158
- data/test/inputs/rich_text_area_input_test.rb +0 -15
- data/test/inputs/string_input_test.rb +0 -158
- data/test/inputs/text_input_test.rb +0 -37
- data/test/inputs/time_zone_input_test.rb +0 -36
- data/test/simple_form_test.rb +0 -18
- data/test/support/discovery_inputs.rb +0 -65
- data/test/support/misc_helpers.rb +0 -274
- data/test/support/mock_controller.rb +0 -30
- data/test/support/models.rb +0 -357
- data/test/test_helper.rb +0 -95
data/test/support/models.rb
DELETED
@@ -1,357 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
Association = Struct.new(:klass, :name, :macro, :scope, :options)
|
3
|
-
|
4
|
-
Column = Struct.new(:name, :type, :limit) do
|
5
|
-
end
|
6
|
-
|
7
|
-
Relation = Struct.new(:records) do
|
8
|
-
delegate :each, to: :records
|
9
|
-
|
10
|
-
def where(conditions = nil)
|
11
|
-
self.class.new conditions ? [records.first] : records
|
12
|
-
end
|
13
|
-
|
14
|
-
def order(conditions = nil)
|
15
|
-
self.class.new conditions ? records.last : records
|
16
|
-
end
|
17
|
-
|
18
|
-
alias_method :to_a, :records
|
19
|
-
alias_method :to_ary, :records
|
20
|
-
end
|
21
|
-
|
22
|
-
Decorator = Struct.new(:object) do
|
23
|
-
def to_model
|
24
|
-
object
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
Picture = Struct.new(:id, :name) do
|
29
|
-
extend ActiveModel::Naming
|
30
|
-
include ActiveModel::Conversion
|
31
|
-
|
32
|
-
def self.where(conditions = nil)
|
33
|
-
if conditions.is_a?(Hash) && conditions[:name]
|
34
|
-
all.to_a.last
|
35
|
-
else
|
36
|
-
all
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def self.all
|
41
|
-
Relation.new((1..3).map { |i| new(i, "#{name} #{i}") })
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
Company = Struct.new(:id, :name) do
|
46
|
-
extend ActiveModel::Naming
|
47
|
-
include ActiveModel::Conversion
|
48
|
-
|
49
|
-
class << self
|
50
|
-
delegate :order, :where, to: :_relation
|
51
|
-
end
|
52
|
-
|
53
|
-
def self._relation
|
54
|
-
all
|
55
|
-
end
|
56
|
-
|
57
|
-
def self.all
|
58
|
-
Relation.new((1..3).map { |i| new(i, "#{name} #{i}") })
|
59
|
-
end
|
60
|
-
|
61
|
-
def persisted?
|
62
|
-
true
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
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
|
84
|
-
|
85
|
-
TagGroup = Struct.new(:id, :name, :tags)
|
86
|
-
|
87
|
-
class User
|
88
|
-
extend ActiveModel::Naming
|
89
|
-
include ActiveModel::Conversion
|
90
|
-
|
91
|
-
attr_accessor :id, :name, :company, :company_id, :time_zone, :active, :age,
|
92
|
-
:description, :created_at, :updated_at, :credit_limit, :password, :url,
|
93
|
-
:delivery_time, :born_at, :special_company_id, :country, :tags, :tag_ids,
|
94
|
-
:avatar, :home_picture, :email, :status, :residence_country, :phone_number,
|
95
|
-
:post_count, :lock_version, :amount, :attempts, :action, :credit_card, :gender,
|
96
|
-
:extra_special_company_id, :pictures, :picture_ids, :special_pictures,
|
97
|
-
:special_picture_ids, :uuid, :friends, :friend_ids, :special_tags, :special_tag_ids,
|
98
|
-
:citext, :hstore, :json, :jsonb, :hourly, :favorite_color
|
99
|
-
|
100
|
-
def self.build(extra_attributes = {})
|
101
|
-
attributes = {
|
102
|
-
id: 1,
|
103
|
-
name: 'New in SimpleForm!',
|
104
|
-
description: 'Hello!',
|
105
|
-
created_at: Time.now
|
106
|
-
}.merge! extra_attributes
|
107
|
-
|
108
|
-
new attributes
|
109
|
-
end
|
110
|
-
|
111
|
-
def initialize(options = {})
|
112
|
-
@new_record = false
|
113
|
-
options.each do |key, value|
|
114
|
-
send("#{key}=", value)
|
115
|
-
end if options
|
116
|
-
end
|
117
|
-
|
118
|
-
def new_record!
|
119
|
-
@new_record = true
|
120
|
-
end
|
121
|
-
|
122
|
-
def persisted?
|
123
|
-
!@new_record
|
124
|
-
end
|
125
|
-
|
126
|
-
def company_attributes=(*)
|
127
|
-
end
|
128
|
-
|
129
|
-
def tags_attributes=(*)
|
130
|
-
end
|
131
|
-
|
132
|
-
def column_for_attribute(attribute)
|
133
|
-
column_type, limit = case attribute.to_sym
|
134
|
-
when :name, :status, :password then [:string, 100]
|
135
|
-
when :description then [:text, 200]
|
136
|
-
when :age then :integer
|
137
|
-
when :credit_limit then [:decimal, 15]
|
138
|
-
when :active then :boolean
|
139
|
-
when :born_at then :date
|
140
|
-
when :delivery_time then :time
|
141
|
-
when :created_at then :datetime
|
142
|
-
when :updated_at then :timestamp
|
143
|
-
when :lock_version then :integer
|
144
|
-
when :home_picture then :string
|
145
|
-
when :amount then :integer
|
146
|
-
when :attempts then :integer
|
147
|
-
when :action then :string
|
148
|
-
when :credit_card then :string
|
149
|
-
else attribute.to_sym
|
150
|
-
end
|
151
|
-
Column.new(attribute, column_type, limit)
|
152
|
-
end
|
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
|
-
|
194
|
-
def has_attribute?(attribute)
|
195
|
-
case attribute.to_sym
|
196
|
-
when :name, :status, :password, :description, :age,
|
197
|
-
:credit_limit, :active, :born_at, :delivery_time,
|
198
|
-
:created_at, :updated_at, :lock_version, :home_picture,
|
199
|
-
:amount, :attempts, :action, :credit_card, :uuid,
|
200
|
-
:citext, :hstore, :json, :jsonb then true
|
201
|
-
else false
|
202
|
-
end
|
203
|
-
end
|
204
|
-
|
205
|
-
def self.human_attribute_name(attribute, options = {})
|
206
|
-
case attribute
|
207
|
-
when 'name', :name
|
208
|
-
'Super User Name!'
|
209
|
-
when 'description'
|
210
|
-
'User Description!'
|
211
|
-
when 'company'
|
212
|
-
'Company Human Name!'
|
213
|
-
else
|
214
|
-
attribute.to_s.humanize
|
215
|
-
end
|
216
|
-
end
|
217
|
-
|
218
|
-
def self.reflect_on_association(association)
|
219
|
-
case association
|
220
|
-
when :company
|
221
|
-
Association.new(Company, association, :belongs_to, nil, {})
|
222
|
-
when :tags
|
223
|
-
Association.new(Tag, association, :has_many, nil, {})
|
224
|
-
when :special_tags
|
225
|
-
Association.new(Tag, association, :has_many, ->(user) { where(id: user.id) }, {})
|
226
|
-
when :first_company
|
227
|
-
Association.new(Company, association, :has_one, nil, {})
|
228
|
-
when :special_company
|
229
|
-
Association.new(Company, association, :belongs_to, nil, conditions: { id: 1 })
|
230
|
-
when :extra_special_company
|
231
|
-
Association.new(Company, association, :belongs_to, nil, conditions: proc { { id: self.id } })
|
232
|
-
when :pictures
|
233
|
-
Association.new(Picture, association, :has_many, nil, {})
|
234
|
-
when :special_pictures
|
235
|
-
Association.new(Picture, association, :has_many, proc { where(name: self.name) }, {})
|
236
|
-
when :friends
|
237
|
-
Association.new(Friend, association, :has_many, nil, {})
|
238
|
-
end
|
239
|
-
end
|
240
|
-
|
241
|
-
def errors
|
242
|
-
@errors ||= begin
|
243
|
-
errors = ActiveModel::Errors.new(self)
|
244
|
-
errors.add(:name, "cannot be blank")
|
245
|
-
errors.add(:description, 'must be longer than 15 characters')
|
246
|
-
errors.add(:age, 'is not a number')
|
247
|
-
errors.add(:age, 'must be greater than 18')
|
248
|
-
errors.add(:company, 'company must be present')
|
249
|
-
errors.add(:company_id, 'must be valid')
|
250
|
-
errors
|
251
|
-
end
|
252
|
-
end
|
253
|
-
|
254
|
-
def self.readonly_attributes
|
255
|
-
["credit_card"]
|
256
|
-
end
|
257
|
-
end
|
258
|
-
|
259
|
-
class ValidatingUser < User
|
260
|
-
include ActiveModel::Validations
|
261
|
-
validates :name, presence: true
|
262
|
-
validates :company, presence: true
|
263
|
-
validates :age, presence: true, if: proc { |user| user.name }
|
264
|
-
validates :amount, presence: true, unless: proc { |user| user.age }
|
265
|
-
|
266
|
-
validates :action, presence: true, on: :create
|
267
|
-
validates :credit_limit, presence: true, on: :save
|
268
|
-
validates :phone_number, presence: true, on: :update
|
269
|
-
|
270
|
-
validates_numericality_of :age,
|
271
|
-
greater_than_or_equal_to: 18,
|
272
|
-
less_than_or_equal_to: 99,
|
273
|
-
only_integer: true
|
274
|
-
validates_numericality_of :amount,
|
275
|
-
greater_than: :min_amount,
|
276
|
-
less_than: :max_amount,
|
277
|
-
only_integer: true
|
278
|
-
validates_numericality_of :attempts,
|
279
|
-
greater_than_or_equal_to: :min_attempts,
|
280
|
-
less_than_or_equal_to: :max_attempts,
|
281
|
-
only_integer: true
|
282
|
-
validates_length_of :name, maximum: 25, minimum: 5
|
283
|
-
validates_length_of :description, in: 15..50
|
284
|
-
validates_length_of :home_picture, is: 12
|
285
|
-
|
286
|
-
def min_amount
|
287
|
-
10
|
288
|
-
end
|
289
|
-
|
290
|
-
def max_amount
|
291
|
-
100
|
292
|
-
end
|
293
|
-
|
294
|
-
def min_attempts
|
295
|
-
1
|
296
|
-
end
|
297
|
-
|
298
|
-
def max_attempts
|
299
|
-
100
|
300
|
-
end
|
301
|
-
end
|
302
|
-
|
303
|
-
class OtherValidatingUser < User
|
304
|
-
include ActiveModel::Validations
|
305
|
-
validates_numericality_of :age,
|
306
|
-
greater_than: 17,
|
307
|
-
less_than: 100,
|
308
|
-
only_integer: true
|
309
|
-
validates_numericality_of :amount,
|
310
|
-
greater_than: proc { |user| user.age },
|
311
|
-
less_than: proc { |user| user.age + 100 },
|
312
|
-
only_integer: true
|
313
|
-
validates_numericality_of :attempts,
|
314
|
-
greater_than_or_equal_to: proc { |user| user.age },
|
315
|
-
less_than_or_equal_to: proc { |user| user.age + 100 },
|
316
|
-
only_integer: true
|
317
|
-
|
318
|
-
validates_format_of :country, with: /\w+/
|
319
|
-
validates_format_of :name, with: proc { /\w+/ }
|
320
|
-
validates_format_of :description, without: /\d+/
|
321
|
-
end
|
322
|
-
|
323
|
-
class HashBackedAuthor < Hash
|
324
|
-
extend ActiveModel::Naming
|
325
|
-
include ActiveModel::Conversion
|
326
|
-
|
327
|
-
def persisted?; false; end
|
328
|
-
|
329
|
-
def name
|
330
|
-
'hash backed author'
|
331
|
-
end
|
332
|
-
end
|
333
|
-
|
334
|
-
class UserNumber1And2 < User
|
335
|
-
end
|
336
|
-
|
337
|
-
class UserWithAttachment < User
|
338
|
-
def avatar_attachment
|
339
|
-
OpenStruct.new
|
340
|
-
end
|
341
|
-
|
342
|
-
def avatars_attachments
|
343
|
-
OpenStruct.new
|
344
|
-
end
|
345
|
-
|
346
|
-
def remote_cover_url
|
347
|
-
"/uploads/cover.png"
|
348
|
-
end
|
349
|
-
|
350
|
-
def profile_image_attacher
|
351
|
-
OpenStruct.new
|
352
|
-
end
|
353
|
-
|
354
|
-
def portrait_file_name
|
355
|
-
"portrait.png"
|
356
|
-
end
|
357
|
-
end
|
data/test/test_helper.rb
DELETED
@@ -1,95 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require 'minitest/autorun'
|
3
|
-
|
4
|
-
require 'active_model'
|
5
|
-
require 'action_controller'
|
6
|
-
require 'action_view'
|
7
|
-
|
8
|
-
ActionView::RoutingUrlFor.send(:include, ActionDispatch::Routing::UrlFor)
|
9
|
-
|
10
|
-
require 'action_view/template'
|
11
|
-
require 'action_view/test_case'
|
12
|
-
|
13
|
-
module Rails
|
14
|
-
def self.env
|
15
|
-
ActiveSupport::StringInquirer.new("test")
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
$:.unshift File.expand_path("../../lib", __FILE__)
|
20
|
-
require 'simple_form'
|
21
|
-
|
22
|
-
require "rails/generators/test_case"
|
23
|
-
require 'generators/simple_form/install_generator'
|
24
|
-
|
25
|
-
Dir["#{File.dirname(__FILE__)}/support/*.rb"].each do |file|
|
26
|
-
require file unless file.end_with?('discovery_inputs.rb')
|
27
|
-
end
|
28
|
-
I18n.default_locale = :en
|
29
|
-
|
30
|
-
require 'country_select'
|
31
|
-
|
32
|
-
if defined?(HTMLSelector::NO_STRIP)
|
33
|
-
HTMLSelector::NO_STRIP << "label"
|
34
|
-
else
|
35
|
-
ActionDispatch::Assertions::NO_STRIP << "label"
|
36
|
-
end
|
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
|
-
|
44
|
-
class ActionView::TestCase
|
45
|
-
include MiscHelpers
|
46
|
-
include SimpleForm::ActionViewExtensions::FormHelper
|
47
|
-
|
48
|
-
extend Rails::LineFiltering
|
49
|
-
|
50
|
-
setup :set_controller
|
51
|
-
setup :setup_users
|
52
|
-
|
53
|
-
def set_controller
|
54
|
-
@controller = MockController.new
|
55
|
-
end
|
56
|
-
|
57
|
-
def setup_users(extra_attributes = {})
|
58
|
-
@user = User.build(extra_attributes)
|
59
|
-
@decorated_user = Decorator.new(@user)
|
60
|
-
|
61
|
-
@validating_user = ValidatingUser.build({
|
62
|
-
name: 'Tester McTesterson',
|
63
|
-
description: 'A test user of the most distinguished caliber',
|
64
|
-
home_picture: 'Home picture',
|
65
|
-
age: 19,
|
66
|
-
amount: 15,
|
67
|
-
attempts: 1,
|
68
|
-
company: [1]
|
69
|
-
}.merge!(extra_attributes))
|
70
|
-
|
71
|
-
@other_validating_user = OtherValidatingUser.build({
|
72
|
-
age: 19,
|
73
|
-
company: 1
|
74
|
-
}.merge!(extra_attributes))
|
75
|
-
end
|
76
|
-
|
77
|
-
def protect_against_forgery?
|
78
|
-
false
|
79
|
-
end
|
80
|
-
|
81
|
-
def user_path(*args)
|
82
|
-
'/users'
|
83
|
-
end
|
84
|
-
|
85
|
-
def company_user_path(*args)
|
86
|
-
'/company/users'
|
87
|
-
end
|
88
|
-
|
89
|
-
alias :users_path :user_path
|
90
|
-
alias :super_user_path :user_path
|
91
|
-
alias :validating_user_path :user_path
|
92
|
-
alias :validating_users_path :user_path
|
93
|
-
alias :other_validating_user_path :user_path
|
94
|
-
alias :user_with_attachment_path :user_path
|
95
|
-
end
|