simple_params 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NjYyNWJhNWU2ZmNkMGMxZWFjMmEzMjM3OWQyNWY0ZWZhNzY2N2ZhNw==
4
+ NzM2MTE0ZTVmMmFkMDNlOGQ5YjZiMDQ5MDc2NGIxNDIzOGU0YTI0ZA==
5
5
  data.tar.gz: !binary |-
6
- NzllYWUzNDJjMDRkNTM5YzIwODMyYWRiYzhmOTU4M2NkNTczNGE0NA==
6
+ OTFiZGUxYTM0MzI4MWQyZGE3OWZiMDFkNzk3YzNmNmM5YTQ2OWYwZA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZTNkMzU1YjhkMjdjNzg0MWFkZDhmNTUzYmU3OGVhZmNlOTBiYjM0NWRiMjRl
10
- YWRiMTkzNTBiNjY3MDBiODAzOGUxYzk0MDY0YzJiNTUwNGRlNThmMTM0ODg0
11
- MDc5MGU5MTgxNjQzMWY4ZjQ0MTc2OWQ5MTI3ZjUyNmVjM2ZiZTk=
9
+ MjgyZWJhMDE2OTcxMjc1ZTA0NzM0NDYwYzU3MDI0NTZmNTdhYmZiYjU5ZDc3
10
+ ODQxNDQ0NTkzMTQ0MTIyMjAxZjZjYzEzOWE3NDJjYWIyZGZkYzcyY2JhYzIw
11
+ MTA3MDBiNjJjMGQyMWM3ZjQyNzViODczOTJjYjdiN2M5NjUwMDU=
12
12
  data.tar.gz: !binary |-
13
- N2ExNzhkZjk0MmM4YTM4ZWQ2YjYwZGVjZTJlMDBiNjVmMGVkYzE1NWVlMDA0
14
- Y2IwMWFjNjAyMjE1MWE2MDk5ZDY4NWNlODAxMDEyOGNiZjgxMTJlYzg4ZWZk
15
- ZTE5N2E2ZTFhZTcxZDY0OWJiZjViNzZiOGE0NTNjMTZmNWZlNzY=
13
+ ZDEwNzA0MDVjMzVkNjY4NzNmNjFjZDVhZTliNzFiNWYzZGZmNGFjZDJiMDNl
14
+ Mzk5ZGRmM2Q0MDk4ZDUyY2M4MDZlODBhYWQzNmRiOWJkNTg0Njk1M2Y3MWE2
15
+ ODM2NmRmODhjYWE2YjAwYjRlNjA0NzJiYTNhODE4MmRjNjM3YTQ=
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- simple_params (1.1.2)
4
+ simple_params (1.2.0)
5
5
  activemodel (>= 3.0, < 5.0)
6
6
  shoulda-matchers (~> 2.8)
7
7
  virtus (>= 1.0.0)
@@ -5,10 +5,28 @@ module SimpleParams
5
5
  extend ActiveSupport::Concern
6
6
  included do
7
7
  # Required for ActiveModel
8
- def persisted?; false end
8
+ def persisted?
9
+ false
10
+ end
9
11
  end
10
12
 
11
13
  module ClassMethods
14
+ # http://apidock.com/rails/ActiveRecord/Reflection/AssociationReflection/klass
15
+ # class Author < ActiveRecord::Base
16
+ # has_many :books
17
+ # end
18
+
19
+ # Author.reflect_on_association(:books).klass
20
+ # # => Book
21
+ def reflect_on_association(assoc_sym)
22
+ nested_classes[assoc_sym]
23
+ end
24
+
25
+ # Used with reflect_on_association
26
+ def klass
27
+ self
28
+ end
29
+
12
30
  def define_rails_helpers(name, klass)
13
31
  # E.g. if we have a nested_class named :phones, then we need:
14
32
  # - a method called :phones_attributes that also sets :phones
@@ -34,7 +34,7 @@ module SimpleParams
34
34
  # necessarily call valid? on every object
35
35
  nested_class.map(&:valid?).all?
36
36
  else
37
- nested_class.valid?
37
+ nested_class.present? ? nested_class.valid? : true
38
38
  end
39
39
  end
40
40
  end
@@ -35,14 +35,20 @@ module SimpleParams
35
35
  def clear
36
36
  super
37
37
  @nested_classes.map do |attribute, klass|
38
- run_or_mapped_run(klass) { |k| k.errors.clear }
38
+ run_or_mapped_run(klass) do |k|
39
+ if k.present?
40
+ k.errors.clear
41
+ end
42
+ end
39
43
  end
40
44
  end
41
45
 
42
46
  def empty?
43
47
  super &&
44
48
  @nested_classes.all? do |attribute, klass|
45
- run_or_mapped_run(klass) { |k| k.errors.empty? }
49
+ run_or_mapped_run(klass) do |k|
50
+ k.nil? || k.errors.empty?
51
+ end
46
52
  end
47
53
  end
48
54
  alias_method :blank?, :empty?
@@ -80,7 +86,11 @@ module SimpleParams
80
86
  msgs = get_messages(self, full_messages)
81
87
 
82
88
  @nested_classes.map do |attribute, klass|
83
- nested_msgs = run_or_mapped_run(klass) { |k| get_messages(k.errors, full_messages) }
89
+ nested_msgs = run_or_mapped_run(klass) do |k|
90
+ unless k.nil?
91
+ get_messages(k.errors, full_messages)
92
+ end
93
+ end
84
94
  unless empty_messages?(nested_msgs)
85
95
  msgs.merge!(attribute.to_sym => nested_msgs)
86
96
  end
@@ -104,7 +114,7 @@ module SimpleParams
104
114
 
105
115
  def set_nested(attribute)
106
116
  klass = nested_class(attribute)
107
- errors = run_or_mapped_run(klass) { |k| k.errors }
117
+ errors = run_or_mapped_run(klass) { |k| k.errors if k.present? }
108
118
  set(attribute.to_sym, errors)
109
119
  end
110
120
 
@@ -44,30 +44,33 @@ module SimpleParams
44
44
 
45
45
  def nested_hash(name, opts={}, &block)
46
46
  klass = NestedParams.define_new_hash_class(self, name, opts, &block)
47
- add_nested_class(name, klass)
47
+ add_nested_class(name, klass, opts)
48
48
  end
49
49
  alias_method :nested_param, :nested_hash
50
50
  alias_method :nested, :nested_hash
51
51
 
52
52
  def nested_array(name, opts={}, &block)
53
53
  klass = NestedParams.define_new_array_class(self, name, opts, &block)
54
- add_nested_class(name, klass)
54
+ add_nested_class(name, klass, opts)
55
55
  end
56
56
 
57
57
  private
58
- def add_nested_class(name, klass)
58
+ def add_nested_class(name, klass, opts)
59
59
  @nested_classes ||= {}
60
60
  @nested_classes[name.to_sym] = klass
61
- define_nested_accessor(name, klass)
61
+ define_nested_accessor(name, klass, opts)
62
62
  define_rails_helpers(name, klass)
63
63
  end
64
64
 
65
- def define_nested_accessor(name, klass)
65
+ def define_nested_accessor(name, klass, opts)
66
66
  define_method("#{name}") do
67
67
  if instance_variable_defined?("@#{name}")
68
68
  instance_variable_get("@#{name}")
69
69
  else
70
- init_value = klass.hash? ? klass.new({}, self) : []
70
+ # This logic basically sets the nested class to an instance of itself, unless
71
+ # it is optional.
72
+ init_value = opts[:optional] ? nil : klass.new({}, self)
73
+ init_value = klass.hash? ? init_value : [init_value]
71
74
  instance_variable_set("@#{name}", init_value)
72
75
  end
73
76
  end
@@ -1,3 +1,3 @@
1
1
  module SimpleParams
2
- VERSION = "1.2.0"
2
+ VERSION = "1.3.0"
3
3
  end
@@ -19,6 +19,10 @@ class AcceptanceParams < SimpleParams::Params
19
19
  param :company, optional: true
20
20
  end
21
21
 
22
+ nested_hash :phone, optional: true do
23
+ param :phone_number
24
+ end
25
+
22
26
  nested_array :dogs do
23
27
  param :name
24
28
  param :age, type: :integer, validations: { inclusion: { in: 1..20 } }
@@ -40,6 +44,18 @@ describe SimpleParams::Params do
40
44
  end
41
45
  end
42
46
 
47
+ describe "reflect_on_association", reflect_on_association: true do
48
+ it "can get hash association classes" do
49
+ klass = AcceptanceParams.reflect_on_association(:address).klass
50
+ klass.should eq(AcceptanceParams::Address)
51
+ end
52
+
53
+ it "can get array association classes" do
54
+ klass = AcceptanceParams.reflect_on_association(:dogs).klass
55
+ klass.should eq(AcceptanceParams::Dogs)
56
+ end
57
+ end
58
+
43
59
  describe "original_params", original_params: true do
44
60
  it "returns symbolized params hash" do
45
61
  params = AcceptanceParams.new(name: "Tom", address: { "street" => "1 Main St."} )
@@ -89,6 +105,7 @@ describe SimpleParams::Params do
89
105
  state: "North Carolina",
90
106
  company: nil
91
107
  },
108
+ phone: nil,
92
109
  dogs: [
93
110
  {
94
111
  name: "Spot",
@@ -187,7 +204,7 @@ describe SimpleParams::Params do
187
204
  describe "attributes", attributes: true do
188
205
  it "returns array of attribute symbols" do
189
206
  params = AcceptanceParams.new
190
- params.attributes.should eq([:reference, :name, :date_of_birth, :current_time, :age, :color, :sibling_names, :address, :dogs])
207
+ params.attributes.should eq([:reference, :name, :date_of_birth, :current_time, :age, :color, :sibling_names, :address, :phone, :dogs])
191
208
  end
192
209
 
193
210
  it "returns array of attribute symbols for nested class" do
@@ -308,36 +325,79 @@ describe SimpleParams::Params do
308
325
 
309
326
  it "raises error with validation descriptions" do
310
327
  expect { params.validate! }.to raise_error(SimpleParamsError,
311
- "{:name=>[\"can't be blank\"], :address=>{:street=>[\"can't be blank\"], :city=>[\"is too short (minimum is 4 characters)\", \"can't be blank\"]}}"
328
+ "{:name=>[\"can't be blank\"], :address=>{:street=>[\"can't be blank\"], :city=>[\"is too short (minimum is 4 characters)\", \"can't be blank\"]}, :dogs=>[{:name=>[\"can't be blank\"], :age=>[\"is not included in the list\", \"can't be blank\"]}]}"
312
329
  )
313
330
  end
314
331
  end
315
332
 
316
333
  describe "acceptance cases" do
317
- let(:params) do
318
- {
319
- name: "Tom",
320
- age: 41,
321
- address: {
322
- street: "1 Main St.",
323
- city: "Chicago",
324
- state: "IL",
325
- zip_code: 33440
334
+ context "without phone" do
335
+ let(:params) do
336
+ {
337
+ name: "Tom",
338
+ age: 41,
339
+ address: {
340
+ street: "1 Main St.",
341
+ city: "Chicago",
342
+ state: "IL",
343
+ zip_code: 33440
344
+ },
345
+ dogs: [
346
+ name: "Spot",
347
+ age: 6
348
+ ]
326
349
  }
327
- }
328
- end
350
+ end
329
351
 
330
- it "is valid after multiple times" do
331
- acceptance_params = AcceptanceParams.new(params)
332
- acceptance_params.should be_valid
333
- acceptance_params.should be_valid
352
+ it "is valid after multiple times", failing: true do
353
+ acceptance_params = AcceptanceParams.new(params)
354
+ acceptance_params.valid?
355
+ acceptance_params.should be_valid
356
+ acceptance_params.should be_valid
357
+ end
358
+
359
+ it "is invalidated if validity changes after initial assignment" do
360
+ acceptance_params = AcceptanceParams.new(params)
361
+ acceptance_params.should be_valid
362
+ acceptance_params.name = nil
363
+ acceptance_params.should_not be_valid
364
+ end
334
365
  end
335
366
 
336
- it "is invalidated if validity changes after initial assignment" do
337
- acceptance_params = AcceptanceParams.new(params)
338
- acceptance_params.should be_valid
339
- acceptance_params.name = nil
340
- acceptance_params.should_not be_valid
367
+ context "with phone" do
368
+ let(:params) do
369
+ {
370
+ name: "Tom",
371
+ age: 41,
372
+ address: {
373
+ street: "1 Main St.",
374
+ city: "Chicago",
375
+ state: "IL",
376
+ zip_code: 33440
377
+ },
378
+ phone: {
379
+ phone_number: "234"
380
+ },
381
+ dogs: [
382
+ name: "Spot",
383
+ age: 6
384
+ ]
385
+ }
386
+ end
387
+
388
+ it "is valid after multiple times", failing: true do
389
+ acceptance_params = AcceptanceParams.new(params)
390
+ acceptance_params.valid?
391
+ acceptance_params.should be_valid
392
+ acceptance_params.should be_valid
393
+ end
394
+
395
+ it "is invalidated if validity changes after initial assignment" do
396
+ acceptance_params = AcceptanceParams.new(params)
397
+ acceptance_params.should be_valid
398
+ acceptance_params.name = nil
399
+ acceptance_params.should_not be_valid
400
+ end
341
401
  end
342
402
  end
343
403
  end
@@ -380,6 +440,9 @@ describe SimpleParams::Params do
380
440
  param :state, String, desc: '', required: false
381
441
  param :company, String, desc: '', required: false
382
442
  end
443
+ param :phone, Hash, desc: '', required: false do
444
+ param :phone_number, String, desc: '', required: true
445
+ end
383
446
  param :dogs, Array, desc: '', required: true do
384
447
  param :name, String, desc: '', required: true
385
448
  param :age, Integer, desc: '', required: true
data/spec/params_spec.rb CHANGED
@@ -77,23 +77,21 @@ describe SimpleParams::Params do
77
77
 
78
78
  describe "nested arrays", nested: true do
79
79
  it "can access nested arrays as arrays" do
80
- params.dogs.should respond_to(:first)
81
- params.dogs.first.should be_nil
80
+ params.dogs[0].should_not be_nil
81
+ params.dogs[0].name.should be_nil
82
+ params.dogs[0].age.should be_nil
82
83
  end
83
84
 
84
85
  it "can access nested arrays as arrays with data" do
85
86
  params = DummyParams.new(dogs: [{ name: "Spot", age: 20 }])
86
- params.dogs.should respond_to(:first)
87
- params.dogs.first.should_not be_nil
88
- params.dogs.first.name.should eq("SPOT")
87
+ params.dogs[0].name.should eq("SPOT")
89
88
  end
90
89
 
91
90
  it "can set nested arrays with arrays" do
92
91
  params.dogs = [{ name: "Spot", age: 20 }]
93
92
  params.dogs.count.should eq(1)
94
- params.dogs.first.should_not be_nil
95
- params.dogs.first.name.should eq("SPOT")
96
- params.dogs.first.age.should eq(20)
93
+ params.dogs[0].name.should eq("SPOT")
94
+ params.dogs[0].age.should eq(20)
97
95
  end
98
96
  end
99
97
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_params
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - brycesenz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-28 00:00:00.000000000 Z
11
+ date: 2015-08-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel