freeform 2.0.1 → 2.0.2
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 +8 -8
- data/Gemfile.lock +1 -1
- data/lib/freeform/form/property.rb +5 -10
- data/lib/freeform/version.rb +1 -1
- data/spec/acceptance_spec.rb +1 -1
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/form/persistence_spec.rb +207 -1
- data/spec/form/property_spec.rb +85 -1
- data/spec/form/validation_spec.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YjBhNTViMmQwZDkyOTM5ZTU0N2Q0OGU0YmNhYjcyNmRhZDc4ZDI2MQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZDI2ZDk5NGEzNDk4MmFmMmU0ZDlmZjJjMzI0NmZkMjUxZGU0NmYzZQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NDk3MjViNGU5NWFhMmMyNGQyMTI4MTdlMDIzMjcwOWU1YjRkN2JkNGQzMTVh
|
10
|
+
MWY4ZmQwOTAzM2NkNzQyMTliOWRkM2RhZWE0NDdiOGQyZmQ1NDA2ZTIxOGMw
|
11
|
+
MDZjZGNmMTY2MDE0ODc3ZTQ2ZGUyOThjMzI2OGEzNzZhMTM0OWM=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZjIzNTA2NmY1MjNlYmVkOGViNjlhNjFkMTA1MDE0OGMxODRiZTU2NDY3MjZh
|
14
|
+
MDgxMzVlNWVkZmMzZmRjZThlMDY4YmRlN2U5ODY4NzFlZGE5ZjBlNjU1ZGZm
|
15
|
+
YjY1OTFkNjBjMGUxZjBiNGYyZDRkZjBiYzQ5Y2Y1NzMwYTk0Nzg=
|
data/Gemfile.lock
CHANGED
@@ -55,13 +55,14 @@ module FreeForm
|
|
55
55
|
end
|
56
56
|
|
57
57
|
def assign_params(params)
|
58
|
+
formatted_params = params.stringify_keys
|
58
59
|
self.tap do |s|
|
59
|
-
FreeForm::DateParamsFilter.new.call(
|
60
|
-
before_assign_params(
|
61
|
-
|
60
|
+
FreeForm::DateParamsFilter.new.call(formatted_params)
|
61
|
+
before_assign_params(formatted_params)
|
62
|
+
formatted_params.each_pair do |attribute, value|
|
62
63
|
assign_attribute(attribute, value)
|
63
64
|
end
|
64
|
-
after_assign_params(
|
65
|
+
after_assign_params(formatted_params)
|
65
66
|
end
|
66
67
|
end
|
67
68
|
alias_method :assign_attributes, :assign_params
|
@@ -70,15 +71,9 @@ module FreeForm
|
|
70
71
|
|
71
72
|
def before_assign_params(params)
|
72
73
|
end
|
73
|
-
alias_method :before_assign_attributes, :before_assign_params
|
74
|
-
alias_method :before_populate, :before_assign_params
|
75
|
-
alias_method :before_fill, :before_assign_params
|
76
74
|
|
77
75
|
def after_assign_params(params)
|
78
76
|
end
|
79
|
-
alias_method :after_assign_attributes, :after_assign_params
|
80
|
-
alias_method :after_populate, :after_assign_params
|
81
|
-
alias_method :after_fill, :after_assign_params
|
82
77
|
|
83
78
|
def model_property_mappings
|
84
79
|
self.class.property_mappings
|
data/lib/freeform/version.rb
CHANGED
data/spec/acceptance_spec.rb
CHANGED
@@ -390,7 +390,7 @@ describe FreeForm::Form do
|
|
390
390
|
task_1.reload.start_date.should eq(Date.new(2012, 1, 2))
|
391
391
|
end
|
392
392
|
|
393
|
-
it "destroys the second task model"
|
393
|
+
it "destroys the second task model" do
|
394
394
|
form.save
|
395
395
|
task_2.should_not exist_in_database
|
396
396
|
end
|
data/spec/dummy/db/test.sqlite3
CHANGED
Binary file
|
@@ -185,7 +185,7 @@ describe FreeForm::Form do
|
|
185
185
|
end
|
186
186
|
|
187
187
|
describe "#save" do
|
188
|
-
it "should return true on 'save'"
|
188
|
+
it "should return true on 'save'" do
|
189
189
|
form.save.should be_true
|
190
190
|
end
|
191
191
|
|
@@ -261,6 +261,212 @@ describe FreeForm::Form do
|
|
261
261
|
end
|
262
262
|
end
|
263
263
|
|
264
|
+
describe "before and after save hooks", :hooks => true do
|
265
|
+
describe "before save", :before_save => true do
|
266
|
+
let(:form_class) do
|
267
|
+
klass = Class.new(FreeForm::Form) do
|
268
|
+
form_input_key :task
|
269
|
+
form_models :task
|
270
|
+
validate_models
|
271
|
+
allow_destroy_on_save
|
272
|
+
|
273
|
+
property :name, :on => :task
|
274
|
+
property :start_date, :on => :task
|
275
|
+
property :end_date, :on => :task
|
276
|
+
validates :name, :presence => true
|
277
|
+
|
278
|
+
has_many :milestones do
|
279
|
+
form_input_key :milestone
|
280
|
+
form_model :milestone
|
281
|
+
validate_models
|
282
|
+
allow_destroy_on_save
|
283
|
+
|
284
|
+
property :name, :on => :milestone
|
285
|
+
end
|
286
|
+
|
287
|
+
def milestone_initializer
|
288
|
+
{ :milestone => task.milestones.build }
|
289
|
+
end
|
290
|
+
|
291
|
+
def before_save
|
292
|
+
task.project.update_attribute(:name, "DummyProject")
|
293
|
+
end
|
294
|
+
end
|
295
|
+
# This wrapper just avoids CONST warnings
|
296
|
+
v, $VERBOSE = $VERBOSE, nil
|
297
|
+
Module.const_set("AcceptanceForm", klass)
|
298
|
+
$VERBOSE = v
|
299
|
+
klass
|
300
|
+
end
|
301
|
+
|
302
|
+
let(:company) { Company.create!(:name => "Demo Corporation") }
|
303
|
+
let(:project) { Project.create!(:owner => company, :name => "Widget", :due_date => Date.new(2014, 1, 1)) }
|
304
|
+
let(:task) { Task.new(:project => project) }
|
305
|
+
|
306
|
+
let(:form) do
|
307
|
+
form_class.new( :task => task ).tap do |f|
|
308
|
+
f.build_milestone
|
309
|
+
end
|
310
|
+
end
|
311
|
+
|
312
|
+
context "with invalid attributes" do
|
313
|
+
let(:attributes) do {
|
314
|
+
:name => nil,
|
315
|
+
"start_date(1i)" => "2012",
|
316
|
+
"start_date(2i)" => "1",
|
317
|
+
"start_date(3i)" => "2",
|
318
|
+
"end_date(1i)" => "2011",
|
319
|
+
"end_date(2i)" => "12",
|
320
|
+
"end_date(3i)" => "15",
|
321
|
+
:milestones_attributes => {
|
322
|
+
"0" => {
|
323
|
+
:name => "milestone_1",
|
324
|
+
},
|
325
|
+
"1310201" => {
|
326
|
+
:name => "milestone_2",
|
327
|
+
}
|
328
|
+
} }
|
329
|
+
end
|
330
|
+
|
331
|
+
before(:each) { form.fill(attributes) }
|
332
|
+
|
333
|
+
it "does not run before_save on save" do
|
334
|
+
form.save
|
335
|
+
project.reload.name.should_not eq("DummyProject")
|
336
|
+
end
|
337
|
+
end
|
338
|
+
|
339
|
+
context "with valid attributes" do
|
340
|
+
let(:attributes) do {
|
341
|
+
:name => "taskname",
|
342
|
+
"start_date(1i)" => "2012",
|
343
|
+
"start_date(2i)" => "1",
|
344
|
+
"start_date(3i)" => "2",
|
345
|
+
"end_date(1i)" => "2011",
|
346
|
+
"end_date(2i)" => "12",
|
347
|
+
"end_date(3i)" => "15",
|
348
|
+
:milestones_attributes => {
|
349
|
+
"0" => {
|
350
|
+
:name => "milestone_1",
|
351
|
+
},
|
352
|
+
"1310201" => {
|
353
|
+
:name => "milestone_2",
|
354
|
+
}
|
355
|
+
} }
|
356
|
+
end
|
357
|
+
|
358
|
+
before(:each) { form.fill(attributes) }
|
359
|
+
|
360
|
+
it "runs before_save on save" do
|
361
|
+
form.save
|
362
|
+
project.reload.name.should eq("DummyProject")
|
363
|
+
end
|
364
|
+
end
|
365
|
+
end
|
366
|
+
|
367
|
+
describe "after save", :after_save => true do
|
368
|
+
let(:form_class) do
|
369
|
+
klass = Class.new(FreeForm::Form) do
|
370
|
+
form_input_key :task
|
371
|
+
form_models :task
|
372
|
+
validate_models
|
373
|
+
allow_destroy_on_save
|
374
|
+
|
375
|
+
property :name, :on => :task
|
376
|
+
property :start_date, :on => :task
|
377
|
+
property :end_date, :on => :task
|
378
|
+
validates :name, :presence => true
|
379
|
+
|
380
|
+
has_many :milestones do
|
381
|
+
form_input_key :milestone
|
382
|
+
form_model :milestone
|
383
|
+
validate_models
|
384
|
+
allow_destroy_on_save
|
385
|
+
|
386
|
+
property :name, :on => :milestone
|
387
|
+
end
|
388
|
+
|
389
|
+
def milestone_initializer
|
390
|
+
{ :milestone => task.milestones.build }
|
391
|
+
end
|
392
|
+
|
393
|
+
def after_save
|
394
|
+
task.project.update_attribute(:name, "DummyProject")
|
395
|
+
end
|
396
|
+
end
|
397
|
+
# This wrapper just avoids CONST warnings
|
398
|
+
v, $VERBOSE = $VERBOSE, nil
|
399
|
+
Module.const_set("AcceptanceForm", klass)
|
400
|
+
$VERBOSE = v
|
401
|
+
klass
|
402
|
+
end
|
403
|
+
|
404
|
+
let(:company) { Company.create!(:name => "Demo Corporation") }
|
405
|
+
let(:project) { Project.create!(:owner => company, :name => "Widget", :due_date => Date.new(2014, 1, 1)) }
|
406
|
+
let(:task) { Task.new(:project => project) }
|
407
|
+
|
408
|
+
let(:form) do
|
409
|
+
form_class.new( :task => task ).tap do |f|
|
410
|
+
f.build_milestone
|
411
|
+
end
|
412
|
+
end
|
413
|
+
|
414
|
+
context "with invalid attributes" do
|
415
|
+
let(:attributes) do {
|
416
|
+
:name => nil,
|
417
|
+
"start_date(1i)" => "2012",
|
418
|
+
"start_date(2i)" => "1",
|
419
|
+
"start_date(3i)" => "2",
|
420
|
+
"end_date(1i)" => "2011",
|
421
|
+
"end_date(2i)" => "12",
|
422
|
+
"end_date(3i)" => "15",
|
423
|
+
:milestones_attributes => {
|
424
|
+
"0" => {
|
425
|
+
:name => "milestone_1",
|
426
|
+
},
|
427
|
+
"1310201" => {
|
428
|
+
:name => "milestone_2",
|
429
|
+
}
|
430
|
+
} }
|
431
|
+
end
|
432
|
+
|
433
|
+
before(:each) { form.fill(attributes) }
|
434
|
+
|
435
|
+
it "does not run after_save on save" do
|
436
|
+
form.save
|
437
|
+
project.reload.name.should_not eq("DummyProject")
|
438
|
+
end
|
439
|
+
end
|
440
|
+
|
441
|
+
context "with valid attributes" do
|
442
|
+
let(:attributes) do {
|
443
|
+
:name => "taskname",
|
444
|
+
"start_date(1i)" => "2012",
|
445
|
+
"start_date(2i)" => "1",
|
446
|
+
"start_date(3i)" => "2",
|
447
|
+
"end_date(1i)" => "2011",
|
448
|
+
"end_date(2i)" => "12",
|
449
|
+
"end_date(3i)" => "15",
|
450
|
+
:milestones_attributes => {
|
451
|
+
"0" => {
|
452
|
+
:name => "milestone_1",
|
453
|
+
},
|
454
|
+
"1310201" => {
|
455
|
+
:name => "milestone_2",
|
456
|
+
}
|
457
|
+
} }
|
458
|
+
end
|
459
|
+
|
460
|
+
before(:each) { form.fill(attributes) }
|
461
|
+
|
462
|
+
it "runs after_save on save" do
|
463
|
+
form.save
|
464
|
+
project.reload.name.should eq("DummyProject")
|
465
|
+
end
|
466
|
+
end
|
467
|
+
end
|
468
|
+
end
|
469
|
+
|
264
470
|
describe "destroying", :destroying => true do
|
265
471
|
context "without nested forms" do
|
266
472
|
let(:task) { Task.create!(:project => project, :name => "mytask", :start_date => Date.new(2011, 1, 1), :end_date => Date.new(2012, 1, 1)) }
|
data/spec/form/property_spec.rb
CHANGED
@@ -179,7 +179,6 @@ describe FreeForm::Property do
|
|
179
179
|
end
|
180
180
|
|
181
181
|
it "handles individiual date components" do
|
182
|
-
#TODO: should pass with symbols too!!
|
183
182
|
form.assign_attributes({
|
184
183
|
"attribute_1(3i)" => 5,
|
185
184
|
"attribute_1(2i)" => 6,
|
@@ -189,6 +188,91 @@ describe FreeForm::Property do
|
|
189
188
|
end
|
190
189
|
end
|
191
190
|
|
191
|
+
describe "before_assign_params", :before_assign_params => true do
|
192
|
+
let(:form_class) do
|
193
|
+
Class.new(Module) do
|
194
|
+
include FreeForm::Model
|
195
|
+
include FreeForm::Property
|
196
|
+
declared_model :first_model
|
197
|
+
declared_model :second_model
|
198
|
+
|
199
|
+
property :attribute_1, :on => :first_model
|
200
|
+
property :attribute_2, :on => :first_model, :ignore_blank => true
|
201
|
+
property :attribute_3, :on => :second_model, :ignore_blank => true
|
202
|
+
property :attribute_4, :on => :second_model
|
203
|
+
|
204
|
+
def initialize(h)
|
205
|
+
h.each {|k,v| send("#{k}=",v)}
|
206
|
+
end
|
207
|
+
|
208
|
+
def before_assign_params(params)
|
209
|
+
params.delete("attribute_1")
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
let(:form) do
|
215
|
+
form_class.new(
|
216
|
+
:first_model => OpenStruct.new(:attribute_1 => "first", :attribute_2 => "second"),
|
217
|
+
:second_model => OpenStruct.new(:attribute_3 => "third", :attribute_4 => "fourth"),
|
218
|
+
)
|
219
|
+
end
|
220
|
+
|
221
|
+
it "deletes attribute_1 from params" do
|
222
|
+
form.assign_attributes({
|
223
|
+
:attribute_1 => "changed", :attribute_2 => 182.34,
|
224
|
+
:attribute_3 => 45, :attribute_4 => Date.new(2013, 10, 10) })
|
225
|
+
|
226
|
+
form.attribute_1.should_not eq("changed")
|
227
|
+
form.attribute_2.should eq(182.34)
|
228
|
+
form.attribute_3.should eq(45)
|
229
|
+
form.attribute_4.should eq(Date.new(2013, 10, 10))
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
describe "after_assign_params", :after_assign_params => true do
|
234
|
+
let(:form_class) do
|
235
|
+
Class.new(Module) do
|
236
|
+
include FreeForm::Model
|
237
|
+
include FreeForm::Property
|
238
|
+
declared_model :first_model
|
239
|
+
declared_model :second_model
|
240
|
+
|
241
|
+
property :attribute_1, :on => :first_model
|
242
|
+
property :attribute_2, :on => :first_model, :ignore_blank => true
|
243
|
+
property :attribute_3, :on => :second_model, :ignore_blank => true
|
244
|
+
property :attribute_4, :on => :second_model
|
245
|
+
|
246
|
+
def initialize(h)
|
247
|
+
h.each {|k,v| send("#{k}=",v)}
|
248
|
+
end
|
249
|
+
|
250
|
+
def after_assign_params(params)
|
251
|
+
params.delete("attribute_1")
|
252
|
+
assign_attribute("attribute_3", "overwritten")
|
253
|
+
end
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
let(:form) do
|
258
|
+
form_class.new(
|
259
|
+
:first_model => OpenStruct.new(:attribute_1 => "first", :attribute_2 => "second"),
|
260
|
+
:second_model => OpenStruct.new(:attribute_3 => "third", :attribute_4 => "fourth"),
|
261
|
+
)
|
262
|
+
end
|
263
|
+
|
264
|
+
it "deletes attribute_1 from params" do
|
265
|
+
form.assign_attributes({
|
266
|
+
:attribute_1 => "changed", :attribute_2 => 182.34,
|
267
|
+
:attribute_3 => 45, :attribute_4 => Date.new(2013, 10, 10) })
|
268
|
+
|
269
|
+
form.attribute_1.should eq("changed")
|
270
|
+
form.attribute_2.should eq(182.34)
|
271
|
+
form.attribute_3.should eq("overwritten")
|
272
|
+
form.attribute_4.should eq(Date.new(2013, 10, 10))
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
192
276
|
describe "model_property_mappings", :model_property_mappings => true do
|
193
277
|
let(:form_class) do
|
194
278
|
Class.new(Module) do
|
@@ -160,7 +160,7 @@ describe FreeForm::Validation do
|
|
160
160
|
form.errors[:form_property].should eq(["can't be blank"])
|
161
161
|
end
|
162
162
|
|
163
|
-
it "has error on address street"
|
163
|
+
it "has error on address street" do
|
164
164
|
form.valid?
|
165
165
|
form.addresses.first.errors[:street].should eq(["can't be blank"])
|
166
166
|
end
|