reform 2.2.3 → 2.2.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b1b845d6f45f5131183408c9cea079d554d6983c
4
- data.tar.gz: 2cc7e0c7444007024bcd4e7eab8b6d2f18c7868e
3
+ metadata.gz: 851795d3f1959935496c4a582f24dffc6020b848
4
+ data.tar.gz: f62755eb2d9e6302a00790b703698149838474af
5
5
  SHA512:
6
- metadata.gz: b9e001d2215c2923d99d75c69db17615f65c7b896b1d815e90bfa0fc86b4fb13ef037a2aa6342f1fc13794b0a0171a628be2655a91307cd197c656a3180ea4a6
7
- data.tar.gz: f919c2d2f8e8f9f21258bcc467613d1734f7c365ef81cf9b13b076321de33e5286a5307ed4c1ec4f4d09189fca0690d82f49777103bb03e287de9201742be26a
6
+ metadata.gz: 865c755aea555fedc28f61ae04a7903544ad637c621e656c68a64fc9f952b0a105906f4abc77571dce490099227224cd966c12ccc802b8ae7e830c0b27d108f3
7
+ data.tar.gz: a90c092125bd9f2a7db2a6092267ba3ac439c6d92bd3b2e657a50156128c4de5b8f28e3f62cc2eefc47b6a8f36b1e8d5f94e393f31ab115cf297a60210fc58c4
data/CHANGES.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## 2.2.4
2
+
3
+ * Always require `disposable` >= 0.4.1.
4
+
5
+ The only difference here is that `Form#sync`/`#save` with a block will include `nil` properties into the nested hash.
6
+ * Remove `uber` dependency.
7
+
1
8
  ## 2.2.3
2
9
 
3
10
  * Add `Form#call` as an alias for `validate` and the `Result` object.
data/Gemfile CHANGED
@@ -15,5 +15,5 @@ gemspec
15
15
  gem "minitest-line"
16
16
  gem 'byebug'
17
17
 
18
- gem "uber", path: "../uber"
18
+ # gem "uber", path: "../uber"
19
19
  gem "representable", ">= 3.0.1"
@@ -5,11 +5,9 @@
5
5
  #
6
6
  # For collections, the entire collection and the currently deserialised index is passed in.
7
7
  class Reform::Form::Populator
8
- include Uber::Callable
9
-
10
8
  def initialize(user_proc)
11
9
  @user_proc = user_proc # the actual `populator: ->{}` block from the user, via ::property.
12
- @value = Uber::Options::Value.new(user_proc) # we can now process Callable, procs, :symbol.
10
+ @value = Declarative::Option(user_proc, instance_exec: true) # we can now process Callable, procs, :symbol.
13
11
  end
14
12
 
15
13
  def call(input, options)
@@ -12,7 +12,7 @@ private
12
12
  def prepopulate_local!(options)
13
13
  schema.each do |dfn|
14
14
  next unless block = dfn[:prepopulator]
15
- Uber::Options::Value.new(block).evaluate(self, options)
15
+ Declarative::Option(block, instance_exec: true).(self, options)
16
16
  end
17
17
  end
18
18
 
@@ -1,3 +1,3 @@
1
1
  module Reform
2
- VERSION = "2.2.3"
2
+ VERSION = "2.2.4"
3
3
  end
@@ -17,9 +17,8 @@ Gem::Specification.new do |spec|
17
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
18
  spec.require_paths = ["lib"]
19
19
 
20
- spec.add_dependency "disposable", ">= 0.3.0", "< 0.4.0"
21
- spec.add_dependency "uber", ">= 0.0.15", "< 0.2.0"
22
- spec.add_dependency "representable", ">= 2.4.0", "< 3.1.0"
20
+ spec.add_dependency "disposable", ">= 0.4.1"
21
+ spec.add_dependency "representable", ">= 2.4.0", "< 3.1.0"
23
22
 
24
23
  spec.add_development_dependency "bundler"
25
24
  spec.add_development_dependency "rake"
@@ -1,165 +1,165 @@
1
- # require "test_helper"
2
-
3
- # class ErrorsTest < MiniTest::Spec
4
- # class AlbumForm < Reform::Form
5
- # property :title
6
-
7
- # property :hit do
8
- # property :title
9
- # validation do
10
- # key(:title).required
11
- # end
12
- # end
13
-
14
- # collection :songs do
15
- # property :title
16
- # validation do
17
- # key(:title).required
18
- # end
19
- # end
20
-
21
- # property :band do # yepp, people do crazy stuff like that.
22
- # property :name
23
- # property :label do
24
- # property :name
25
- # validation do
26
- # key(:name).required
27
- # end
28
- # end
29
- # # TODO: make band a required object.
30
-
31
- # validation do
32
- # key(:name).required(:music_taste_ok?)
33
-
34
- # configure do
35
- # config.messages_file = "test/validation/errors.yml"
36
-
37
- # def music_taste_ok?(value)
38
- # value != "Nickelback"
39
- # # errors.add(:base, "You are a bad person") if name == "Nickelback"
40
- # end
41
- # end
42
- # end
43
- # # validate :music_taste_ok?
44
-
45
- # # private
46
- # # def music_taste_ok?
47
- # # errors.add(:base, "You are a bad person") if name == "Nickelback"
48
- # # end
49
- # end
50
-
51
- # validation do
52
- # key(:title).required
53
- # end
54
- # end
55
-
56
- # let (:album) do
57
- # OpenStruct.new(
58
- # :title => "Blackhawks Over Los Angeles",
59
- # :hit => song,
60
- # :songs => songs, # TODO: document this requirement,
61
-
62
- # :band => Struct.new(:name, :label).new("Epitaph", OpenStruct.new),
63
- # )
64
- # end
65
- # let (:song) { OpenStruct.new(:title => "Downtown") }
66
- # let (:songs) { [song=OpenStruct.new(:title => "Calling"), song] }
67
- # let (:form) { AlbumForm.new(album) }
68
-
69
-
70
- # describe "incorrect #validate" do
71
- # before { form.validate(
72
- # "hit" =>{"title" => ""},
73
- # "title" => "",
74
- # "songs" => [{"title" => ""}, {"title" => ""}]) } # FIXME: what happens if item is missing?
75
-
76
- # it do
77
- # form.errors.messages.must_equal({
78
- # :title => ["must be filled"],
79
- # :"hit.title"=>["must be filled"],
80
- # :"songs.title"=>["must be filled"],
81
- # :"band.label.name"=>["is missing"]
82
- # })
83
- # end
84
-
85
- # it do
86
- # #form.errors.must_equal({:title => ["must be filled"]})
87
- # # TODO: this should only contain local errors?
88
- # end
89
-
90
- # # nested forms keep their own Errors:
91
- # it { form.hit.errors.messages.must_equal({:title=>["must be filled"]}) }
92
- # it { form.songs[0].errors.messages.must_equal({:title=>["must be filled"]}) }
93
-
94
- # it do
95
- # form.errors.messages.must_equal({
96
- # :title => ["must be filled"],
97
- # :"hit.title" => ["must be filled"],
98
- # :"songs.title"=> ["must be filled"],
99
- # :"band.label.name"=>["is missing"]
100
- # })
101
- # end
102
- # end
103
-
104
-
105
- # describe "#validate with main form invalid" do
106
- # it do
107
- # form.validate("title"=>"", "band"=>{"label"=>{:name => "Fat Wreck"}}).must_equal false
108
- # form.errors.messages.must_equal({:title=>["must be filled"]})
109
- # end
110
- # end
111
-
112
-
113
- # describe "#validate with middle nested form invalid" do
114
- # before { @result = form.validate("hit"=>{"title" => ""}, "band"=>{"label"=>{:name => "Fat Wreck"}}) }
115
-
116
- # it { @result.must_equal false }
117
- # it { form.errors.messages.must_equal({:"hit.title"=>["must be filled"]}) }
118
- # end
119
-
120
-
121
- # describe "#validate with collection form invalid" do
122
- # before { @result = form.validate("songs"=>[{"title" => ""}], "band"=>{"label"=>{:name => "Fat Wreck"}}) }
123
-
124
- # it { @result.must_equal false }
125
- # it { form.errors.messages.must_equal({:"songs.title"=>["must be filled"]}) }
126
- # end
127
-
128
-
129
- # describe "#validate with collection and 2-level-nested invalid" do
130
- # before { @result = form.validate("songs"=>[{"title" => ""}], "band" => {"label" => {}}) }
131
-
132
- # it { @result.must_equal false }
133
- # it { form.errors.messages.must_equal({:"songs.title"=>["must be filled"], :"band.label.name"=>["is missing"]}) }
134
- # end
135
-
136
- # describe "#validate with nested form using :base invalid" do
137
- # it do
138
- # result = form.validate("songs"=>[{"title" => "Someday"}], "band" => {"name" => "Nickelback", "label" => {"name" => "Roadrunner Records"}})
139
- # result.must_equal false
140
- # form.errors.messages.must_equal({:"band.name"=>["You are a bad person"]})
141
- # end
142
- # end
143
-
144
- # describe "correct #validate" do
145
- # before { @result = form.validate(
146
- # "hit" => {"title" => "Sacrifice"},
147
- # "title" => "Second Heat",
148
- # "songs" => [{"title"=>"Heart Of A Lion"}],
149
- # "band" => {"label"=>{:name => "Fat Wreck"}}
150
- # ) }
151
-
152
- # it { @result.must_equal true }
153
- # it { form.hit.title.must_equal "Sacrifice" }
154
- # it { form.title.must_equal "Second Heat" }
155
- # it { form.songs.first.title.must_equal "Heart Of A Lion" }
156
- # end
157
-
158
-
159
- # describe "Errors#to_s" do
160
- # before { form.validate("songs"=>[{"title" => ""}], "band" => {"label" => {}}) }
161
-
162
- # # to_s is aliased to messages
163
- # it { form.errors.to_s.must_equal "{:\"songs.title\"=>[\"must be filled\"], :\"band.label.name\"=>[\"is missing\"]}" }
164
- # end
165
- # end
1
+ require "test_helper"
2
+
3
+ class ErrorsTest < MiniTest::Spec
4
+ class AlbumForm < Reform::Form
5
+ property :title
6
+
7
+ property :hit do
8
+ property :title
9
+ validation do
10
+ required(:title).filled
11
+ end
12
+ end
13
+
14
+ collection :songs do
15
+ property :title
16
+ validation do
17
+ required(:title).filled
18
+ end
19
+ end
20
+
21
+ property :band do # yepp, people do crazy stuff like that.
22
+ property :name
23
+ property :label do
24
+ property :name
25
+ validation do
26
+ required(:name).filled
27
+ end
28
+ end
29
+ # TODO: make band a required object.
30
+
31
+ validation do
32
+ # required(:name).filled(:music_taste_ok?)
33
+
34
+ configure do
35
+ config.messages_file = "test/validation/errors.yml"
36
+
37
+ def music_taste_ok?(value)
38
+ value != "Nickelback"
39
+ # errors.add(:base, "You are a bad person") if name == "Nickelback"
40
+ end
41
+ end
42
+ end
43
+ # validate :music_taste_ok?
44
+
45
+ # private
46
+ # def music_taste_ok?
47
+ # errors.add(:base, "You are a bad person") if name == "Nickelback"
48
+ # end
49
+ end
50
+
51
+ validation do
52
+ required(:title).filled
53
+ end
54
+ end
55
+
56
+ let (:album) do
57
+ OpenStruct.new(
58
+ :title => "Blackhawks Over Los Angeles",
59
+ :hit => song,
60
+ :songs => songs, # TODO: document this requirement,
61
+
62
+ :band => Struct.new(:name, :label).new("Epitaph", OpenStruct.new),
63
+ )
64
+ end
65
+ let (:song) { OpenStruct.new(:title => "Downtown") }
66
+ let (:songs) { [song=OpenStruct.new(:title => "Calling"), song] }
67
+ let (:form) { AlbumForm.new(album) }
68
+
69
+
70
+ describe "incorrect #validate" do
71
+ before { form.validate(
72
+ "hit" =>{"title" => ""},
73
+ "title" => "",
74
+ "songs" => [{"title" => ""}, {"title" => ""}]) } # FIXME: what happens if item is missing?
75
+
76
+ it do
77
+ form.errors.messages.must_equal({
78
+ :title => ["must be filled"],
79
+ :"hit.title"=>["must be filled"],
80
+ :"songs.title"=>["must be filled"],
81
+ :"band.label.name"=>["is missing"]
82
+ })
83
+ end
84
+
85
+ it do
86
+ #form.errors.must_equal({:title => ["must be filled"]})
87
+ # TODO: this should only contain local errors?
88
+ end
89
+
90
+ # nested forms keep their own Errors:
91
+ it { form.hit.errors.messages.must_equal({:title=>["must be filled"]}) }
92
+ it { form.songs[0].errors.messages.must_equal({:title=>["must be filled"]}) }
93
+
94
+ it do
95
+ form.errors.messages.must_equal({
96
+ :title => ["must be filled"],
97
+ :"hit.title" => ["must be filled"],
98
+ :"songs.title"=> ["must be filled"],
99
+ :"band.label.name"=>["is missing"]
100
+ })
101
+ end
102
+ end
103
+
104
+
105
+ describe "#validate with main form invalid" do
106
+ it do
107
+ form.validate("title"=>"", "band"=>{"label"=>{:name => "Fat Wreck"}}).must_equal false
108
+ form.errors.messages.must_equal({:title=>["must be filled"]})
109
+ end
110
+ end
111
+
112
+
113
+ describe "#validate with middle nested form invalid" do
114
+ before { @result = form.validate("hit"=>{"title" => ""}, "band"=>{"label"=>{:name => "Fat Wreck"}}) }
115
+
116
+ it { @result.must_equal false }
117
+ it { form.errors.messages.must_equal({:"hit.title"=>["must be filled"]}) }
118
+ end
119
+
120
+
121
+ describe "#validate with collection form invalid" do
122
+ before { @result = form.validate("songs"=>[{"title" => ""}], "band"=>{"label"=>{:name => "Fat Wreck"}}) }
123
+
124
+ it { @result.must_equal false }
125
+ it { form.errors.messages.must_equal({:"songs.title"=>["must be filled"]}) }
126
+ end
127
+
128
+
129
+ describe "#validate with collection and 2-level-nested invalid" do
130
+ before { @result = form.validate("songs"=>[{"title" => ""}], "band" => {"label" => {}}) }
131
+
132
+ it { @result.must_equal false }
133
+ it { form.errors.messages.must_equal({:"songs.title"=>["must be filled"], :"band.label.name"=>["is missing"]}) }
134
+ end
135
+
136
+ describe "#validate with nested form using :base invalid" do
137
+ it do
138
+ result = form.validate("songs"=>[{"title" => "Someday"}], "band" => {"name" => "Nickelback", "label" => {"name" => "Roadrunner Records"}})
139
+ result.must_equal false
140
+ form.errors.messages.must_equal({:"band.name"=>["You are a bad person"]})
141
+ end
142
+ end
143
+
144
+ describe "correct #validate" do
145
+ before { @result = form.validate(
146
+ "hit" => {"title" => "Sacrifice"},
147
+ "title" => "Second Heat",
148
+ "songs" => [{"title"=>"Heart Of A Lion"}],
149
+ "band" => {"label"=>{:name => "Fat Wreck"}}
150
+ ) }
151
+
152
+ it { @result.must_equal true }
153
+ it { form.hit.title.must_equal "Sacrifice" }
154
+ it { form.title.must_equal "Second Heat" }
155
+ it { form.songs.first.title.must_equal "Heart Of A Lion" }
156
+ end
157
+
158
+
159
+ describe "Errors#to_s" do
160
+ before { form.validate("songs"=>[{"title" => ""}], "band" => {"label" => {}}) }
161
+
162
+ # to_s is aliased to messages
163
+ it { form.errors.to_s.must_equal "{:\"songs.title\"=>[\"must be filled\"], :\"band.label.name\"=>[\"is missing\"]}" }
164
+ end
165
+ end
@@ -1,352 +1,352 @@
1
- # require "test_helper"
2
- # require "reform/form/dry"
3
-
4
- # class DryValidationDefaultGroupTest < Minitest::Spec
5
- # Session = Struct.new(:username, :email, :password, :confirm_password)
6
-
7
- # class SessionForm < Reform::Form
8
- # include Reform::Form::Dry
9
-
10
- # property :username
11
- # property :email
12
- # property :password
13
- # property :confirm_password
14
-
15
- # validation do
16
- # key(:username).required
17
- # key(:email).required
18
- # end
19
- # end
20
-
21
- # let (:form) { SessionForm.new(Session.new) }
22
-
23
- # # valid.
24
- # it do
25
- # form.validate(username: "Helloween",
26
- # email: "yep").must_equal true
27
- # form.errors.messages.inspect.must_equal "{}"
28
- # end
29
- # end
30
-
31
- # class ValidationGroupsTest < MiniTest::Spec
32
- # describe "basic validations" do
33
- # Session = Struct.new(:username, :email, :password, :confirm_password)
34
-
35
- # class SessionForm < Reform::Form
36
- # include Reform::Form::Dry::Validations
37
-
38
- # property :username
39
- # property :email
40
- # property :password
41
- # property :confirm_password
42
-
43
- # validation :default do
44
- # key(:username).required
45
- # key(:email).required
46
- # end
47
-
48
- # validation :email, if: :default do
49
- # key(:email).required(min_size?: 3)
50
- # end
51
-
52
- # validation :nested, if: :default do
53
- # key(:password).required(min_size?: 2)
54
- # end
55
-
56
- # validation :confirm, if: :default, after: :email do
57
- # key(:confirm_password).required(min_size?: 2)
58
- # end
59
- # end
60
-
61
- # let (:form) { SessionForm.new(Session.new) }
62
-
63
- # # valid.
64
- # it do
65
- # form.validate({ username: "Helloween",
66
- # email: "yep",
67
- # password: "99",
68
- # confirm_password: "99" }).must_equal true
69
- # form.errors.messages.inspect.must_equal "{}"
70
- # end
71
-
72
- # # invalid.
73
- # it do
74
- # form.validate({}).must_equal false
75
- # form.errors.messages.inspect.must_equal "{:username=>[\"is missing\"], :email=>[\"is missing\"]}"
76
- # end
77
-
78
- # # partially invalid.
79
- # # 2nd group fails.
80
- # it do
81
- # form.validate(username: "Helloween", email: "yo", confirm_password:"9").must_equal false
82
- # form.errors.messages.inspect.must_equal "{:email=>[\"size cannot be less than 3\"], :confirm_password=>[\"size cannot be less than 2\"], :password=>[\"is missing\", \"size cannot be less than 2\"]}"
83
- # end
84
- # # 3rd group fails.
85
- # it do
86
- # form.validate(username: "Helloween", email: "yo!", confirm_password:"9").must_equal false
87
- # form.errors.messages.inspect
88
- # .must_equal "{:confirm_password=>[\"size cannot be less than 2\"], :password=>[\"is missing\", \"size cannot be less than 2\"]}"
89
- # end
90
- # # 4th group with after: fails.
91
- # it do
92
- # form.validate(username: "Helloween", email: "yo!", password: "", confirm_password: "9").must_equal false
93
- # form.errors.messages.inspect.must_equal "{:confirm_password=>[\"size cannot be less than 2\"], :password=>[\"must be filled\", \"size cannot be less than 2\"]}"
94
- # end
95
- # end
96
-
97
- # describe "Nested validations" do
98
- # class AlbumForm < Reform::Form
99
- # include Reform::Form::Dry::Validations
100
-
101
- # property :title
102
-
103
- # property :hit do
104
- # property :title
105
-
106
- # # FIX ME: this doesn't work now, @apotonick said he knows why
107
- # # The error is that this validation block act as an AM:V instead of the Dry one.
108
- # # validation :default do
109
- # # key(:title, &:filled?)
110
- # # end
111
- # end
112
-
113
- # collection :songs do
114
- # property :title
115
- # end
116
-
117
- # property :band do
118
- # property :name
119
- # property :label do
120
- # property :name
121
- # end
122
- # end
123
-
124
- # validation :default do
125
-
126
- # key(:title).required
127
-
128
- # key(:band).schema do
129
- # key(:name).required
130
- # key(:label).schema do
131
- # key(:name).required
132
- # end
133
- # end
134
-
135
- # configure do
136
- # option :form
137
- # # message need to be defined on fixtures/dry_error_messages
138
- # # d-v expects you to define your custome messages on the .yml file
139
- # def good_musical_taste?(value)
140
- # value != 'Nickelback'
141
- # end
142
-
143
- # def form_access_validation?(value)
144
- # form.title == 'Reform'
145
- # end
146
- # end
147
-
148
- # key(:title).required(:good_musical_taste?)
149
- # key(:title).required(:form_access_validation?)
150
- # end
151
- # end
152
-
153
- # let (:album) do
154
- # OpenStruct.new(
155
- # :title => "Blackhawks Over Los Angeles",
156
- # :hit => song,
157
- # :songs => songs,
158
- # :band => Struct.new(:name, :label).new("Epitaph", OpenStruct.new),
159
- # )
160
- # end
161
- # let (:song) { OpenStruct.new(:title => "Downtown") }
162
- # let (:songs) { [ song = OpenStruct.new(:title => "Calling"), song ] }
163
- # let (:form) { AlbumForm.new(album) }
164
-
165
- # # correct #validate.
166
- # it do
167
- # result = form.validate(
168
- # "title" => "Reform",
169
- # "songs" => [
170
- # {"title" => "Fallout"},
171
- # {"title" => "Roxanne", "composer" => {"name" => "Sting"}}
172
- # ],
173
- # "band" => {"label" => {"name" => "Epitaph"}},
174
- # )
175
-
176
- # result.must_equal true
177
- # form.errors.messages.inspect.must_equal "{}"
178
- # end
179
- # end
180
-
181
-
182
- # describe "fails with :validate, :validates and :validates_with" do
183
-
184
- # it "throws a goddamn error" do
185
- # e = proc do
186
- # class FailingForm < Reform::Form
187
- # include Reform::Form::Dry::Validations
188
-
189
- # property :username
190
-
191
- # validation :email do
192
- # validates(:email, &:filled?)
193
- # end
194
- # end
195
- # end.must_raise(NoMethodError)
196
- # # e.message.must_equal 'validates() is not supported by Dry Validation backend.'
197
-
198
- # e = proc do
199
- # class FailingForm < Reform::Form
200
- # include Reform::Form::Dry::Validations
201
-
202
- # property :username
203
-
204
- # validation :email do
205
- # validate(:email, &:filled?)
206
- # end
207
- # end
208
- # end.must_raise(NoMethodError)
209
- # # e.message.must_equal 'validate() is not supported by Dry Validation backend.'
210
-
211
- # e = proc do
212
- # class FailingForm < Reform::Form
213
- # include Reform::Form::Dry::Validations
214
-
215
- # property :username
216
-
217
- # validation :email do
218
- # validates_with(:email, &:filled?)
219
- # end
220
- # end
221
- # end.must_raise(NoMethodError)
222
- # # e.message.must_equal (NoMethodError)'validates_with() is not supported by Dry Validation backend.'
223
- # end
224
- # end
225
-
226
-
227
- # # describe "same-named group" do
228
- # # class OverwritingForm < Reform::Form
229
- # # include Reform::Form::Dry::Validations
230
-
231
- # # property :username
232
- # # property :email
233
-
234
- # # validation :email do # FIX ME: is this working for other validator or just bugging here?
235
- # # key(:email, &:filled?) # it's not considered, overitten
236
- # # end
237
-
238
- # # validation :email do # just another group.
239
- # # key(:username, &:filled?)
240
- # # end
241
- # # end
242
-
243
- # # let (:form) { OverwritingForm.new(Session.new) }
244
-
245
- # # # valid.
246
- # # it do
247
- # # form.validate({username: "Helloween"}).must_equal true
248
- # # end
249
-
250
- # # # invalid.
251
- # # it "whoo" do
252
- # # form.validate({}).must_equal false
253
- # # form.errors.messages.inspect.must_equal "{:username=>[\"username can't be blank\"]}"
254
- # # end
255
- # # end
256
-
257
-
258
- # describe "inherit: true in same group" do
259
- # class InheritSameGroupForm < Reform::Form
260
- # include Reform::Form::Dry::Validations
261
-
262
- # property :username
263
- # property :email
264
-
265
- # validation :email do
266
- # key(:email).required
267
- # end
268
-
269
- # validation :email, inherit: true do # extends the above.
270
- # key(:username).required
271
- # end
272
- # end
273
-
274
- # let (:form) { InheritSameGroupForm.new(Session.new) }
275
-
276
- # # valid.
277
- # it do
278
- # form.validate({username: "Helloween", email: 9}).must_equal true
279
- # end
280
-
281
- # # invalid.
282
- # it do
283
- # form.validate({}).must_equal false
284
- # form.errors.messages.inspect.must_equal "{:email=>[\"is missing\"], :username=>[\"is missing\"]}"
285
- # end
286
- # end
287
-
288
-
289
- # describe "if: with lambda" do
290
- # class IfWithLambdaForm < Reform::Form
291
- # include Reform::Form::Dry::Validations # ::build_errors.
292
-
293
- # property :username
294
- # property :email
295
- # property :password
296
-
297
- # validation :email do
298
- # key(:email).required
299
- # end
300
-
301
- # # run this is :email group is true.
302
- # validation :after_email, if: lambda { |results| results[:email]==true } do # extends the above.
303
- # key(:username).required
304
- # end
305
-
306
- # # block gets evaled in form instance context.
307
- # validation :password, if: lambda { |results| email == "john@trb.org" } do
308
- # key(:password).required
309
- # end
310
- # end
311
-
312
- # let (:form) { IfWithLambdaForm.new(Session.new) }
313
-
314
- # # valid.
315
- # it do
316
- # form.validate({username: "Strung Out", email: 9}).must_equal true
317
- # end
318
-
319
- # # invalid.
320
- # it do
321
- # form.validate({email: 9}).must_equal false
322
- # form.errors.messages.inspect.must_equal "{:username=>[\"is missing\"]}"
323
- # end
324
- # end
325
-
326
-
327
- # # Currenty dry-v don't support that option, it doesn't make sense
328
- # # I've talked to @solnic and he plans to add a "hint" feature to show
329
- # # more errors messages than only those that have failed.
330
- # #
331
- # # describe "multiple errors for property" do
332
- # # class MultipleErrorsForPropertyForm < Reform::Form
333
- # # include Reform::Form::Dry::Validations
334
-
335
- # # property :username
336
-
337
- # # validation :default do
338
- # # key(:username) do |username|
339
- # # username.filled? | (username.min_size?(2) & username.max_size?(3))
340
- # # end
341
- # # end
342
- # # end
343
-
344
- # # let (:form) { MultipleErrorsForPropertyForm.new(Session.new) }
345
-
346
- # # # valid.
347
- # # it do
348
- # # form.validate({username: ""}).must_equal false
349
- # # form.errors.messages.inspect.must_equal "{:username=>[\"username must be filled\", \"username is not proper size\"]}"
350
- # # end
351
- # # end
352
- # end
1
+ require "test_helper"
2
+ require "reform/form/dry"
3
+
4
+ class DryValidationDefaultGroupTest < Minitest::Spec
5
+ Session = Struct.new(:username, :email, :password, :confirm_password)
6
+
7
+ class SessionForm < Reform::Form
8
+ include Reform::Form::Dry
9
+
10
+ property :username
11
+ property :email
12
+ property :password
13
+ property :confirm_password
14
+
15
+ validation do
16
+ key(:username).required
17
+ key(:email).required
18
+ end
19
+ end
20
+
21
+ let (:form) { SessionForm.new(Session.new) }
22
+
23
+ # valid.
24
+ it do
25
+ form.validate(username: "Helloween",
26
+ email: "yep").must_equal true
27
+ form.errors.messages.inspect.must_equal "{}"
28
+ end
29
+ end
30
+
31
+ class ValidationGroupsTest < MiniTest::Spec
32
+ describe "basic validations" do
33
+ Session = Struct.new(:username, :email, :password, :confirm_password)
34
+
35
+ class SessionForm < Reform::Form
36
+ include Reform::Form::Dry::Validations
37
+
38
+ property :username
39
+ property :email
40
+ property :password
41
+ property :confirm_password
42
+
43
+ validation :default do
44
+ key(:username).required
45
+ key(:email).required
46
+ end
47
+
48
+ validation :email, if: :default do
49
+ key(:email).required(min_size?: 3)
50
+ end
51
+
52
+ validation :nested, if: :default do
53
+ key(:password).required(min_size?: 2)
54
+ end
55
+
56
+ validation :confirm, if: :default, after: :email do
57
+ key(:confirm_password).required(min_size?: 2)
58
+ end
59
+ end
60
+
61
+ let (:form) { SessionForm.new(Session.new) }
62
+
63
+ # valid.
64
+ it do
65
+ form.validate({ username: "Helloween",
66
+ email: "yep",
67
+ password: "99",
68
+ confirm_password: "99" }).must_equal true
69
+ form.errors.messages.inspect.must_equal "{}"
70
+ end
71
+
72
+ # invalid.
73
+ it do
74
+ form.validate({}).must_equal false
75
+ form.errors.messages.inspect.must_equal "{:username=>[\"is missing\"], :email=>[\"is missing\"]}"
76
+ end
77
+
78
+ # partially invalid.
79
+ # 2nd group fails.
80
+ it do
81
+ form.validate(username: "Helloween", email: "yo", confirm_password:"9").must_equal false
82
+ form.errors.messages.inspect.must_equal "{:email=>[\"size cannot be less than 3\"], :confirm_password=>[\"size cannot be less than 2\"], :password=>[\"is missing\", \"size cannot be less than 2\"]}"
83
+ end
84
+ # 3rd group fails.
85
+ it do
86
+ form.validate(username: "Helloween", email: "yo!", confirm_password:"9").must_equal false
87
+ form.errors.messages.inspect
88
+ .must_equal "{:confirm_password=>[\"size cannot be less than 2\"], :password=>[\"is missing\", \"size cannot be less than 2\"]}"
89
+ end
90
+ # 4th group with after: fails.
91
+ it do
92
+ form.validate(username: "Helloween", email: "yo!", password: "", confirm_password: "9").must_equal false
93
+ form.errors.messages.inspect.must_equal "{:confirm_password=>[\"size cannot be less than 2\"], :password=>[\"must be filled\", \"size cannot be less than 2\"]}"
94
+ end
95
+ end
96
+
97
+ describe "Nested validations" do
98
+ class AlbumForm < Reform::Form
99
+ include Reform::Form::Dry::Validations
100
+
101
+ property :title
102
+
103
+ property :hit do
104
+ property :title
105
+
106
+ # FIX ME: this doesn't work now, @apotonick said he knows why
107
+ # The error is that this validation block act as an AM:V instead of the Dry one.
108
+ # validation :default do
109
+ # key(:title, &:filled?)
110
+ # end
111
+ end
112
+
113
+ collection :songs do
114
+ property :title
115
+ end
116
+
117
+ property :band do
118
+ property :name
119
+ property :label do
120
+ property :name
121
+ end
122
+ end
123
+
124
+ validation :default do
125
+
126
+ key(:title).required
127
+
128
+ key(:band).schema do
129
+ key(:name).required
130
+ key(:label).schema do
131
+ key(:name).required
132
+ end
133
+ end
134
+
135
+ configure do
136
+ option :form
137
+ # message need to be defined on fixtures/dry_error_messages
138
+ # d-v expects you to define your custome messages on the .yml file
139
+ def good_musical_taste?(value)
140
+ value != 'Nickelback'
141
+ end
142
+
143
+ def form_access_validation?(value)
144
+ form.title == 'Reform'
145
+ end
146
+ end
147
+
148
+ key(:title).required(:good_musical_taste?)
149
+ key(:title).required(:form_access_validation?)
150
+ end
151
+ end
152
+
153
+ let (:album) do
154
+ OpenStruct.new(
155
+ :title => "Blackhawks Over Los Angeles",
156
+ :hit => song,
157
+ :songs => songs,
158
+ :band => Struct.new(:name, :label).new("Epitaph", OpenStruct.new),
159
+ )
160
+ end
161
+ let (:song) { OpenStruct.new(:title => "Downtown") }
162
+ let (:songs) { [ song = OpenStruct.new(:title => "Calling"), song ] }
163
+ let (:form) { AlbumForm.new(album) }
164
+
165
+ # correct #validate.
166
+ it do
167
+ result = form.validate(
168
+ "title" => "Reform",
169
+ "songs" => [
170
+ {"title" => "Fallout"},
171
+ {"title" => "Roxanne", "composer" => {"name" => "Sting"}}
172
+ ],
173
+ "band" => {"label" => {"name" => "Epitaph"}},
174
+ )
175
+
176
+ result.must_equal true
177
+ form.errors.messages.inspect.must_equal "{}"
178
+ end
179
+ end
180
+
181
+
182
+ describe "fails with :validate, :validates and :validates_with" do
183
+
184
+ it "throws a goddamn error" do
185
+ e = proc do
186
+ class FailingForm < Reform::Form
187
+ include Reform::Form::Dry::Validations
188
+
189
+ property :username
190
+
191
+ validation :email do
192
+ validates(:email, &:filled?)
193
+ end
194
+ end
195
+ end.must_raise(NoMethodError)
196
+ # e.message.must_equal 'validates() is not supported by Dry Validation backend.'
197
+
198
+ e = proc do
199
+ class FailingForm < Reform::Form
200
+ include Reform::Form::Dry::Validations
201
+
202
+ property :username
203
+
204
+ validation :email do
205
+ validate(:email, &:filled?)
206
+ end
207
+ end
208
+ end.must_raise(NoMethodError)
209
+ # e.message.must_equal 'validate() is not supported by Dry Validation backend.'
210
+
211
+ e = proc do
212
+ class FailingForm < Reform::Form
213
+ include Reform::Form::Dry::Validations
214
+
215
+ property :username
216
+
217
+ validation :email do
218
+ validates_with(:email, &:filled?)
219
+ end
220
+ end
221
+ end.must_raise(NoMethodError)
222
+ # e.message.must_equal (NoMethodError)'validates_with() is not supported by Dry Validation backend.'
223
+ end
224
+ end
225
+
226
+
227
+ # describe "same-named group" do
228
+ # class OverwritingForm < Reform::Form
229
+ # include Reform::Form::Dry::Validations
230
+
231
+ # property :username
232
+ # property :email
233
+
234
+ # validation :email do # FIX ME: is this working for other validator or just bugging here?
235
+ # key(:email, &:filled?) # it's not considered, overitten
236
+ # end
237
+
238
+ # validation :email do # just another group.
239
+ # key(:username, &:filled?)
240
+ # end
241
+ # end
242
+
243
+ # let (:form) { OverwritingForm.new(Session.new) }
244
+
245
+ # # valid.
246
+ # it do
247
+ # form.validate({username: "Helloween"}).must_equal true
248
+ # end
249
+
250
+ # # invalid.
251
+ # it "whoo" do
252
+ # form.validate({}).must_equal false
253
+ # form.errors.messages.inspect.must_equal "{:username=>[\"username can't be blank\"]}"
254
+ # end
255
+ # end
256
+
257
+
258
+ describe "inherit: true in same group" do
259
+ class InheritSameGroupForm < Reform::Form
260
+ include Reform::Form::Dry::Validations
261
+
262
+ property :username
263
+ property :email
264
+
265
+ validation :email do
266
+ key(:email).required
267
+ end
268
+
269
+ validation :email, inherit: true do # extends the above.
270
+ key(:username).required
271
+ end
272
+ end
273
+
274
+ let (:form) { InheritSameGroupForm.new(Session.new) }
275
+
276
+ # valid.
277
+ it do
278
+ form.validate({username: "Helloween", email: 9}).must_equal true
279
+ end
280
+
281
+ # invalid.
282
+ it do
283
+ form.validate({}).must_equal false
284
+ form.errors.messages.inspect.must_equal "{:email=>[\"is missing\"], :username=>[\"is missing\"]}"
285
+ end
286
+ end
287
+
288
+
289
+ describe "if: with lambda" do
290
+ class IfWithLambdaForm < Reform::Form
291
+ include Reform::Form::Dry::Validations # ::build_errors.
292
+
293
+ property :username
294
+ property :email
295
+ property :password
296
+
297
+ validation :email do
298
+ key(:email).required
299
+ end
300
+
301
+ # run this is :email group is true.
302
+ validation :after_email, if: lambda { |results| results[:email]==true } do # extends the above.
303
+ key(:username).required
304
+ end
305
+
306
+ # block gets evaled in form instance context.
307
+ validation :password, if: lambda { |results| email == "john@trb.org" } do
308
+ key(:password).required
309
+ end
310
+ end
311
+
312
+ let (:form) { IfWithLambdaForm.new(Session.new) }
313
+
314
+ # valid.
315
+ it do
316
+ form.validate({username: "Strung Out", email: 9}).must_equal true
317
+ end
318
+
319
+ # invalid.
320
+ it do
321
+ form.validate({email: 9}).must_equal false
322
+ form.errors.messages.inspect.must_equal "{:username=>[\"is missing\"]}"
323
+ end
324
+ end
325
+
326
+
327
+ # Currenty dry-v don't support that option, it doesn't make sense
328
+ # I've talked to @solnic and he plans to add a "hint" feature to show
329
+ # more errors messages than only those that have failed.
330
+ #
331
+ # describe "multiple errors for property" do
332
+ # class MultipleErrorsForPropertyForm < Reform::Form
333
+ # include Reform::Form::Dry::Validations
334
+
335
+ # property :username
336
+
337
+ # validation :default do
338
+ # key(:username) do |username|
339
+ # username.filled? | (username.min_size?(2) & username.max_size?(3))
340
+ # end
341
+ # end
342
+ # end
343
+
344
+ # let (:form) { MultipleErrorsForPropertyForm.new(Session.new) }
345
+
346
+ # # valid.
347
+ # it do
348
+ # form.validate({username: ""}).must_equal false
349
+ # form.errors.messages.inspect.must_equal "{:username=>[\"username must be filled\", \"username is not proper size\"]}"
350
+ # end
351
+ # end
352
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reform
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.3
4
+ version: 2.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Sutterer
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-12-04 00:00:00.000000000 Z
12
+ date: 2017-01-31 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: disposable
@@ -17,40 +17,14 @@ dependencies:
17
17
  requirements:
18
18
  - - ">="
19
19
  - !ruby/object:Gem::Version
20
- version: 0.3.0
21
- - - "<"
22
- - !ruby/object:Gem::Version
23
- version: 0.4.0
20
+ version: 0.4.1
24
21
  type: :runtime
25
22
  prerelease: false
26
23
  version_requirements: !ruby/object:Gem::Requirement
27
24
  requirements:
28
25
  - - ">="
29
26
  - !ruby/object:Gem::Version
30
- version: 0.3.0
31
- - - "<"
32
- - !ruby/object:Gem::Version
33
- version: 0.4.0
34
- - !ruby/object:Gem::Dependency
35
- name: uber
36
- requirement: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: 0.0.15
41
- - - "<"
42
- - !ruby/object:Gem::Version
43
- version: 0.2.0
44
- type: :runtime
45
- prerelease: false
46
- version_requirements: !ruby/object:Gem::Requirement
47
- requirements:
48
- - - ">="
49
- - !ruby/object:Gem::Version
50
- version: 0.0.15
51
- - - "<"
52
- - !ruby/object:Gem::Version
53
- version: 0.2.0
27
+ version: 0.4.1
54
28
  - !ruby/object:Gem::Dependency
55
29
  name: representable
56
30
  requirement: !ruby/object:Gem::Requirement
@@ -248,7 +222,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
248
222
  version: '0'
249
223
  requirements: []
250
224
  rubyforge_project:
251
- rubygems_version: 2.6.3
225
+ rubygems_version: 2.5.1
252
226
  signing_key:
253
227
  specification_version: 4
254
228
  summary: Form object decoupled from models with validation, population and presentation.