simple_form 3.0.2 → 3.1.0.rc1

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.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +32 -32
  3. data/MIT-LICENSE +1 -1
  4. data/README.md +146 -71
  5. data/lib/generators/simple_form/install_generator.rb +2 -2
  6. data/lib/generators/simple_form/templates/README +3 -4
  7. data/lib/generators/simple_form/templates/config/initializers/simple_form.rb +19 -3
  8. data/lib/generators/simple_form/templates/config/initializers/simple_form_bootstrap.rb +83 -22
  9. data/lib/generators/simple_form/templates/config/initializers/simple_form_foundation.rb +1 -1
  10. data/lib/generators/simple_form/templates/config/locales/simple_form.en.yml +7 -2
  11. data/lib/simple_form/action_view_extensions/form_helper.rb +1 -1
  12. data/lib/simple_form/components/errors.rb +30 -2
  13. data/lib/simple_form/components/hints.rb +2 -2
  14. data/lib/simple_form/components/html5.rb +1 -1
  15. data/lib/simple_form/components/label_input.rb +20 -2
  16. data/lib/simple_form/components/labels.rb +9 -5
  17. data/lib/simple_form/components/maxlength.rb +1 -1
  18. data/lib/simple_form/components/min_max.rb +1 -1
  19. data/lib/simple_form/components/pattern.rb +1 -1
  20. data/lib/simple_form/components/placeholders.rb +2 -2
  21. data/lib/simple_form/components/readonly.rb +1 -1
  22. data/lib/simple_form/form_builder.rb +92 -57
  23. data/lib/simple_form/helpers.rb +5 -5
  24. data/lib/simple_form/inputs/base.rb +33 -11
  25. data/lib/simple_form/inputs/block_input.rb +1 -1
  26. data/lib/simple_form/inputs/boolean_input.rb +23 -13
  27. data/lib/simple_form/inputs/collection_input.rb +32 -9
  28. data/lib/simple_form/inputs/collection_radio_buttons_input.rb +6 -11
  29. data/lib/simple_form/inputs/collection_select_input.rb +4 -2
  30. data/lib/simple_form/inputs/date_time_input.rb +12 -2
  31. data/lib/simple_form/inputs/file_input.rb +4 -2
  32. data/lib/simple_form/inputs/grouped_collection_select_input.rb +15 -3
  33. data/lib/simple_form/inputs/hidden_input.rb +4 -2
  34. data/lib/simple_form/inputs/numeric_input.rb +5 -4
  35. data/lib/simple_form/inputs/password_input.rb +4 -2
  36. data/lib/simple_form/inputs/priority_input.rb +4 -2
  37. data/lib/simple_form/inputs/range_input.rb +1 -1
  38. data/lib/simple_form/inputs/string_input.rb +4 -2
  39. data/lib/simple_form/inputs/text_input.rb +4 -2
  40. data/lib/simple_form/railtie.rb +7 -0
  41. data/lib/simple_form/tags.rb +7 -0
  42. data/lib/simple_form/version.rb +1 -1
  43. data/lib/simple_form/wrappers/builder.rb +5 -5
  44. data/lib/simple_form/wrappers/leaf.rb +28 -0
  45. data/lib/simple_form/wrappers/many.rb +5 -6
  46. data/lib/simple_form/wrappers/root.rb +1 -1
  47. data/lib/simple_form/wrappers/single.rb +5 -3
  48. data/lib/simple_form/wrappers.rb +1 -0
  49. data/lib/simple_form.rb +38 -6
  50. data/test/action_view_extensions/builder_test.rb +2 -2
  51. data/test/components/label_test.rb +1 -1
  52. data/test/form_builder/association_test.rb +17 -0
  53. data/test/form_builder/error_notification_test.rb +1 -1
  54. data/test/form_builder/error_test.rb +61 -0
  55. data/test/form_builder/input_field_test.rb +25 -1
  56. data/test/form_builder/label_test.rb +24 -1
  57. data/test/form_builder/wrapper_test.rb +67 -0
  58. data/test/generators/simple_form_generator_test.rb +2 -2
  59. data/test/inputs/boolean_input_test.rb +50 -2
  60. data/test/inputs/collection_check_boxes_input_test.rb +40 -11
  61. data/test/inputs/collection_radio_buttons_input_test.rb +76 -17
  62. data/test/inputs/collection_select_input_test.rb +108 -3
  63. data/test/inputs/datetime_input_test.rb +105 -38
  64. data/test/inputs/discovery_test.rb +12 -1
  65. data/test/inputs/grouped_collection_select_input_test.rb +36 -0
  66. data/test/inputs/string_input_test.rb +20 -0
  67. data/test/simple_form_test.rb +8 -0
  68. data/test/support/discovery_inputs.rb +12 -2
  69. data/test/support/misc_helpers.rb +49 -5
  70. data/test/support/models.rb +49 -24
  71. metadata +6 -5
@@ -46,12 +46,12 @@ module MiscHelpers
46
46
  end
47
47
  end
48
48
 
49
- def swap_wrapper(name=:default, wrapper=self.custom_wrapper)
50
- old = SimpleForm.wrappers[name]
51
- SimpleForm.wrappers[name] = wrapper
49
+ def swap_wrapper(name = :default, wrapper = self.custom_wrapper)
50
+ old = SimpleForm.wrappers[name.to_s]
51
+ SimpleForm.wrappers[name.to_s] = wrapper
52
52
  yield
53
53
  ensure
54
- SimpleForm.wrappers[name] = old
54
+ SimpleForm.wrappers[name.to_s] = old
55
55
  end
56
56
 
57
57
  def custom_wrapper
@@ -68,6 +68,32 @@ module MiscHelpers
68
68
  end
69
69
  end
70
70
 
71
+ def custom_wrapper_with_input_class
72
+ SimpleForm.build tag: :div, class: "custom_wrapper" do |b|
73
+ b.use :label
74
+ b.use :input, class: 'inline-class'
75
+ end
76
+ end
77
+
78
+ def custom_wrapper_with_label_class
79
+ SimpleForm.build tag: :div, class: "custom_wrapper" do |b|
80
+ b.use :label, class: 'inline-class'
81
+ b.use :input
82
+ end
83
+ end
84
+
85
+ def custom_wrapper_with_input_attributes
86
+ SimpleForm.build tag: :div, class: "custom_wrapper" do |b|
87
+ b.use :input, data: { modal: true }
88
+ end
89
+ end
90
+
91
+ def custom_wrapper_with_label_input_class
92
+ SimpleForm.build tag: :div, class: "custom_wrapper" do |b|
93
+ b.use :label_input, class: 'inline-class'
94
+ end
95
+ end
96
+
71
97
  def custom_wrapper_with_wrapped_input
72
98
  SimpleForm.build tag: :div, class: "custom_wrapper" do |b|
73
99
  b.wrapper tag: :div, class: 'elem' do |component|
@@ -112,6 +138,24 @@ module MiscHelpers
112
138
  end
113
139
  end
114
140
 
141
+ def custom_wrapper_with_additional_attributes
142
+ SimpleForm.build tag: :div, class: 'custom_wrapper', html: { data: { wrapper: :test }, title: 'some title' } do |b|
143
+ b.use :label_input
144
+ end
145
+ end
146
+
147
+ def custom_wrapper_with_full_error
148
+ SimpleForm.build tag: :div, class: 'custom_wrapper' do |b|
149
+ b.use :full_error, wrap_with: { tag: :span, class: :error }
150
+ end
151
+ end
152
+
153
+ def custom_wrapper_with_label_text
154
+ SimpleForm.build :label_text => proc { |label, required| "**#{label}**" } do |b|
155
+ b.use :label_input
156
+ end
157
+ end
158
+
115
159
  def custom_form_for(object, *args, &block)
116
160
  simple_form_for(object, *args, { builder: CustomFormBuilder }, &block)
117
161
  end
@@ -142,7 +186,7 @@ module MiscHelpers
142
186
  end
143
187
  end
144
188
 
145
- def with_input_for(object, attribute_name, type, options={})
189
+ def with_input_for(object, attribute_name, type, options = {})
146
190
  with_concat_form_for(object) do |f|
147
191
  f.input(attribute_name, options.merge(as: type))
148
192
  end
@@ -1,4 +1,4 @@
1
- Association = Struct.new(:klass, :name, :macro, :options)
1
+ Association = Struct.new(:klass, :name, :macro, :scope, :options)
2
2
 
3
3
  Column = Struct.new(:name, :type, :limit) do
4
4
  # Returns +true+ if the column is either of type integer, float or decimal.
@@ -7,16 +7,36 @@ Column = Struct.new(:name, :type, :limit) do
7
7
  end
8
8
  end
9
9
 
10
- Relation = Struct.new(:all) do
10
+ Relation = Struct.new(:records) do
11
+ delegate :each, to: :records
12
+
11
13
  def where(conditions = nil)
12
- self.class.new conditions ? all.first : all
14
+ self.class.new conditions ? records.first : records
13
15
  end
14
16
 
15
17
  def order(conditions = nil)
16
- self.class.new conditions ? all.last : all
18
+ self.class.new conditions ? records.last : records
17
19
  end
18
20
 
19
- alias_method :to_a, :all
21
+ alias_method :to_a, :records
22
+ alias_method :to_ary, :records
23
+ end
24
+
25
+ Picture = Struct.new(:id, :name) do
26
+ extend ActiveModel::Naming
27
+ include ActiveModel::Conversion
28
+
29
+ def self.where(conditions = nil)
30
+ if conditions.is_a?(Hash) && conditions[:name]
31
+ all.to_a.last
32
+ else
33
+ all
34
+ end
35
+ end
36
+
37
+ def self.all
38
+ Relation.new((1..3).map { |i| new(i, "#{name} #{i}") })
39
+ end
20
40
  end
21
41
 
22
42
  Company = Struct.new(:id, :name) do
@@ -28,11 +48,11 @@ Company = Struct.new(:id, :name) do
28
48
  end
29
49
 
30
50
  def self._relation
31
- Relation.new(all)
51
+ all
32
52
  end
33
53
 
34
54
  def self.all
35
- (1..3).map { |i| new(i, "#{name} #{i}") }
55
+ Relation.new((1..3).map { |i| new(i, "#{name} #{i}") })
36
56
  end
37
57
 
38
58
  def persisted?
@@ -53,7 +73,8 @@ class User
53
73
  :delivery_time, :born_at, :special_company_id, :country, :tags, :tag_ids,
54
74
  :avatar, :home_picture, :email, :status, :residence_country, :phone_number,
55
75
  :post_count, :lock_version, :amount, :attempts, :action, :credit_card, :gender,
56
- :extra_special_company_id
76
+ :extra_special_company_id, :pictures, :picture_ids, :special_pictures,
77
+ :special_picture_ids
57
78
 
58
79
  def self.build(extra_attributes = {})
59
80
  attributes = {
@@ -66,7 +87,7 @@ class User
66
87
  new attributes
67
88
  end
68
89
 
69
- def initialize(options={})
90
+ def initialize(options = {})
70
91
  @new_record = false
71
92
  options.each do |key, value|
72
93
  send("#{key}=", value)
@@ -108,7 +129,7 @@ class User
108
129
  Column.new(attribute, column_type, limit)
109
130
  end
110
131
 
111
- def self.human_attribute_name(attribute)
132
+ def self.human_attribute_name(attribute, options = {})
112
133
  case attribute
113
134
  when 'name'
114
135
  'Super User Name!'
@@ -117,35 +138,39 @@ class User
117
138
  when 'company'
118
139
  'Company Human Name!'
119
140
  else
120
- attribute.humanize
141
+ attribute.to_s.humanize
121
142
  end
122
143
  end
123
144
 
124
145
  def self.reflect_on_association(association)
125
146
  case association
126
147
  when :company
127
- Association.new(Company, association, :belongs_to, {})
148
+ Association.new(Company, association, :belongs_to, nil, {})
128
149
  when :tags
129
- Association.new(Tag, association, :has_many, {})
150
+ Association.new(Tag, association, :has_many, nil, {})
130
151
  when :first_company
131
- Association.new(Company, association, :has_one, {})
152
+ Association.new(Company, association, :has_one, nil, {})
132
153
  when :special_company
133
- Association.new(Company, association, :belongs_to, { conditions: { id: 1 } })
154
+ Association.new(Company, association, :belongs_to, nil, { conditions: { id: 1 } })
134
155
  when :extra_special_company
135
- Association.new(Company, association, :belongs_to, { conditions: proc { { id: 1 } } })
156
+ Association.new(Company, association, :belongs_to, nil, { conditions: proc { { id: self.id } } })
157
+ when :pictures
158
+ Association.new(Picture, association, :has_many, nil, {})
159
+ when :special_pictures
160
+ Association.new(Picture, association, :has_many, proc { where(name: self.name) }, {})
136
161
  end
137
162
  end
138
163
 
139
164
  def errors
140
165
  @errors ||= begin
141
- hash = Hash.new { |h,k| h[k] = [] }
142
- hash.merge!(
143
- name: ["can't be blank"],
144
- description: ["must be longer than 15 characters"],
145
- age: ["is not a number", "must be greater than 18"],
146
- company: ["company must be present"],
147
- company_id: ["must be valid"]
148
- )
166
+ errors = ActiveModel::Errors.new(self)
167
+ errors.add(:name, "can't be blank")
168
+ errors.add(:description, 'must be longer than 15 characters')
169
+ errors.add(:age, 'is not a number')
170
+ errors.add(:age, 'must be greater than 18')
171
+ errors.add(:company, 'company must be present')
172
+ errors.add(:company_id, 'must be valid')
173
+ errors
149
174
  end
150
175
  end
151
176
 
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: 3.0.2
4
+ version: 3.1.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - José Valim
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2014-04-09 00:00:00.000000000 Z
13
+ date: 2014-04-14 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activemodel
@@ -41,7 +41,7 @@ dependencies:
41
41
  - !ruby/object:Gem::Version
42
42
  version: '4.0'
43
43
  description: Forms made easy!
44
- email: contact@plataformatec.com.br
44
+ email: opensource@plataformatec.com.br
45
45
  executables: []
46
46
  extensions: []
47
47
  extra_rdoc_files: []
@@ -106,6 +106,7 @@ files:
106
106
  - lib/simple_form/version.rb
107
107
  - lib/simple_form/wrappers.rb
108
108
  - lib/simple_form/wrappers/builder.rb
109
+ - lib/simple_form/wrappers/leaf.rb
109
110
  - lib/simple_form/wrappers/many.rb
110
111
  - lib/simple_form/wrappers/root.rb
111
112
  - lib/simple_form/wrappers/single.rb
@@ -160,9 +161,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
160
161
  version: '0'
161
162
  required_rubygems_version: !ruby/object:Gem::Requirement
162
163
  requirements:
163
- - - ">="
164
+ - - ">"
164
165
  - !ruby/object:Gem::Version
165
- version: '0'
166
+ version: 1.3.1
166
167
  requirements: []
167
168
  rubyforge_project: simple_form
168
169
  rubygems_version: 2.2.2