simple_params 1.3.4 → 1.3.5

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
- NmJmMzBhZmYzODAzOTdlOTA1M2EzYThlNTdhNGY2YzFmNTBmYTk0YQ==
4
+ OGI2NjkyN2FkNzY5NDVjYjQ0NmNlYjBhMzllYjFlNTk3ZWMwZWE4MA==
5
5
  data.tar.gz: !binary |-
6
- N2JjMDczZDgyMTdlNWZkN2YzNDM1NDUxOWFhN2NlZjY5NTFlY2RkNw==
6
+ ZWNhNzhlZDVlYzJhZjU5OTFiNTU4ZGYxYWRlMDcxMGJkMjg3MWZjZA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MTcyOTg0YmE1MDZkNTYwZWU0NzdmMTY5OGQ4NTRkZTYwY2ZlNWIyYWNmMzAz
10
- M2Q2YWRhNzQ4OWRhNjY2ZjVlYzIzYzdiNTQwMWU5YzhiZDY5MzdmMjgyYjJk
11
- NzQ4OTgxY2NjNWFlYTE3YWM2NGIyYTQ0MTFmNzhjMjBiOTc0YjU=
9
+ NWFlMTkxZDdkMGNiZjA3NWE1ZTgxZTFlMTdiMDU5YjY2M2NkM2M3ZmU1ZjU0
10
+ YTUyOWY2Mzc1Mjg3MjEzY2I5MGYwYWEwOTFmMmYxNDQxNmUyM2ZlZTAwYzFk
11
+ ZGU3NGY4OTkyZDgxNTBjNjM1MjE1YTIzNGUxMjIzODcyYTYxMWE=
12
12
  data.tar.gz: !binary |-
13
- NTcyMmIxOGFkNTBhOWZmZDkzZjEyODJiYmY0N2I3YWFkMDdlMjY4MWYxYWE3
14
- ZTk5YWMyNWJiMzc3MTNjNzFiOTMyMzhmY2VhMzhjZWVhODAxMWE2MjBlZjk1
15
- MTg5NmE0Nzk1Yzk5ZmFiMDA5MjM2ODk5NmQxNDMxMWRjZGIxMTM=
13
+ YzQxM2QxZjFjZjEwOGJjODY1MDg5N2M2YWYwYTJhZjAzNGFhMGJmNmQxMzc1
14
+ NzEyMjRhZWNkOThjNjk4MWQyNTMxYmNhNmQ3MThmMDQwODE4OGNmZDNjMDgx
15
+ NGJjMjEwMWYzZDI4NjViMmU2MzhmYjE0ZjI2M2RhYWY2NDQ5M2M=
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- simple_params (1.3.3)
4
+ simple_params (1.3.4)
5
5
  activemodel (>= 3.0, < 5.0)
6
6
  shoulda-matchers (~> 2.8)
7
7
  virtus (>= 1.0.0)
data/lib/simple_params.rb CHANGED
@@ -10,8 +10,8 @@ require 'simple_params/concerns/rails_helpers'
10
10
  require 'simple_params/concerns/strict_params'
11
11
  require 'simple_params/concerns/validations'
12
12
  require 'simple_params/params'
13
- require 'simple_params/nil_params'
14
13
  require 'simple_params/nested_params'
14
+ require 'simple_params/nil_params'
15
15
  require 'simple_params/simple_params_error'
16
16
  require 'simple_params/type_mappings'
17
17
  require 'simple_params/api_pie_doc'
@@ -4,13 +4,39 @@ module SimpleParams
4
4
  module RailsHelpers
5
5
  extend ActiveSupport::Concern
6
6
  included do
7
+ def to_model
8
+ self
9
+ end
10
+ def name_came_from_user?; end
11
+ def _destroy_came_from_user?; end
12
+
7
13
  # Required for ActiveModel
8
14
  def persisted?
9
15
  false
10
16
  end
17
+
18
+ # Needed for nested_model helpers that try to iterate over
19
+ # all associations
20
+ def each
21
+ self
22
+ end
23
+
24
+ def marked_for_destruction?
25
+ _destroy.eql?(true)
26
+ end
11
27
  end
12
28
 
13
29
  module ClassMethods
30
+ attr_accessor :rails_helpers
31
+
32
+ def with_rails_helpers
33
+ @rails_helpers = true
34
+ end
35
+
36
+ def using_rails_helpers?
37
+ @rails_helpers||= false
38
+ !!@rails_helpers
39
+ end
14
40
  # http://apidock.com/rails/ActiveRecord/Reflection/AssociationReflection/klass
15
41
  # class Author < ActiveRecord::Base
16
42
  # has_many :books
@@ -22,16 +48,20 @@ module SimpleParams
22
48
  nested_classes[assoc_sym]
23
49
  end
24
50
 
25
- # Used with reflect_on_association
51
+ # # Used with reflect_on_association
26
52
  def klass
27
53
  self
28
54
  end
29
55
 
30
56
  def define_rails_helpers(name, klass)
57
+ # define a _destroy param (Boolean, default: false)
58
+ unless method_defined?(:_destroy_attribute)
59
+ define_attribute(:_destroy, {type: :boolean, default: false})
60
+ end
61
+
31
62
  # E.g. if we have a nested_class named :phones, then we need:
32
63
  # - a method called :phones_attributes that also sets :phones
33
64
  # - a method called :build_phone
34
-
35
65
  define_method("#{name}_attributes=") do |value|
36
66
  send("#{name}=", value)
37
67
  end
@@ -31,7 +31,16 @@ module SimpleParams
31
31
  def define_new_class(parent, name, options, &block)
32
32
  klass_name = name.to_s.split('_').collect(&:capitalize).join
33
33
  Class.new(self).tap do |klass|
34
+ parent.send(:remove_const, klass_name) if parent.const_defined?(klass_name)
34
35
  parent.const_set(klass_name, klass)
36
+ klass.instance_eval <<-DEF
37
+ def parent_class
38
+ #{parent}
39
+ end
40
+ DEF
41
+ if klass.parent_class.using_rails_helpers?
42
+ klass.instance_eval("with_rails_helpers")
43
+ end
35
44
  extend ActiveModel::Naming
36
45
  klass.class_eval(&block)
37
46
  klass.class_eval("self.options = #{options}")
@@ -45,7 +54,7 @@ module SimpleParams
45
54
  end
46
55
 
47
56
  def id
48
- @id
57
+ @id ||= nil
49
58
  end
50
59
 
51
60
  def set_accessors(params={})
@@ -1,7 +1,27 @@
1
1
  module SimpleParams
2
- class NilParams < Params
3
- def initialize(params = {}, mocked_object = nil)
4
- @mocked_object = mocked_object
2
+ class NilParams < NestedParams
3
+ class << self
4
+ def define_nil_class(parent)
5
+ define_new_class(parent, :nil_params, {}) do
6
+ end
7
+ end
8
+
9
+ def nested_classes
10
+ if respond_to?(:parent_class) && parent_class.present?
11
+ parent_class.nested_classes
12
+ else
13
+ {}
14
+ end
15
+ end
16
+ end
17
+
18
+ def initialize(params = {})
19
+ self.class.options ||= {}
20
+ @mocked_object = if parent_class
21
+ parent_class.new
22
+ else
23
+ nil
24
+ end
5
25
  super(params)
6
26
  end
7
27
 
@@ -32,5 +52,14 @@ module SimpleParams
32
52
  super
33
53
  end
34
54
  end
55
+
56
+ private
57
+ def parent_class
58
+ if self.class.respond_to?(:parent_class)
59
+ self.class.parent_class
60
+ else
61
+ nil
62
+ end
63
+ end
35
64
  end
36
65
  end
@@ -6,12 +6,12 @@ module SimpleParams
6
6
  include Virtus.model
7
7
  include ActiveModel::Validations
8
8
  extend ActiveModel::Naming
9
+ include SimpleParams::RailsHelpers
9
10
  include SimpleParams::Validations
10
11
  include SimpleParams::HasAttributes
11
12
  include SimpleParams::HasTypedParams
12
13
  include SimpleParams::HashHelpers
13
14
  include SimpleParams::DateTimeHelpers
14
- include SimpleParams::RailsHelpers
15
15
  include SimpleParams::StrictParams
16
16
 
17
17
  class << self
@@ -59,7 +59,9 @@ module SimpleParams
59
59
  @nested_classes ||= {}
60
60
  @nested_classes[name.to_sym] = klass
61
61
  define_nested_accessor(name, klass, opts)
62
- define_rails_helpers(name, klass)
62
+ if using_rails_helpers?
63
+ define_rails_helpers(name, klass)
64
+ end
63
65
  end
64
66
 
65
67
  def define_nested_accessor(name, klass, opts)
@@ -70,7 +72,11 @@ module SimpleParams
70
72
  # This logic basically sets the nested class to an instance of itself, unless
71
73
  # it is optional.
72
74
  klass_instance = klass.new({}, self)
73
- init_value = opts[:optional] ? NilParams.new({}, klass_instance) : klass_instance
75
+ init_value = if opts[:optional]
76
+ NilParams.define_nil_class(klass).new
77
+ else
78
+ klass_instance
79
+ end
74
80
  init_value = klass.hash? ? init_value : [init_value]
75
81
  instance_variable_set("@#{name}", init_value)
76
82
  end
@@ -1,3 +1,3 @@
1
1
  module SimpleParams
2
- VERSION = "1.3.4"
2
+ VERSION = "1.3.5"
3
3
  end
@@ -193,11 +193,11 @@ describe SimpleParams::Params do
193
193
  "current_time(6i)" => "56",
194
194
  "current_time(5i)" => "11",
195
195
  "current_time(4i)" => "9",
196
- "current_time(3i)" => "31",
196
+ "current_time(3i)" => "29",
197
197
  "current_time(2i)" => "10",
198
198
  "current_time(1i)" => "2015"
199
199
  )
200
- params.current_time.should eq(DateTime.new(2015, 10, 31, 9, 11, 56))
200
+ params.current_time.should eq(DateTime.new(2015, 10, 29, 9, 11, 56))
201
201
  end
202
202
  end
203
203
 
@@ -2,11 +2,6 @@ require 'spec_helper'
2
2
  require 'fixtures/dummy_params'
3
3
 
4
4
  describe SimpleParams::NestedParams do
5
- # Turn off Constant Redefined errors
6
- before(:each) do
7
- $VERBOSE = nil
8
- end
9
-
10
5
  class DummyParentClass < SimpleParams::Params
11
6
  end
12
7
 
@@ -33,6 +28,10 @@ describe SimpleParams::NestedParams do
33
28
  defined_class.name.should eq("DummyParentClass::MySpecialParams")
34
29
  end
35
30
 
31
+ it "has correct parent class" do
32
+ defined_class.parent_class.should eq(DummyParentClass)
33
+ end
34
+
36
35
  it "has correct options" do
37
36
  defined_class.options.should eq(
38
37
  {
@@ -1,58 +1,135 @@
1
1
  require 'spec_helper'
2
- require 'fixtures/dummy_params'
3
2
 
4
- describe SimpleParams::NilParams do
5
- # Turn off Constant Redefined errors
6
- before(:each) do
7
- $VERBOSE = nil
3
+ class DummyPersonParams < SimpleParams::Params
4
+ param :name
5
+ param :age, type: :integer
6
+ nested_hash :address do
7
+ param :street
8
+ param :city
9
+ end
10
+ nested_array :phones do
11
+ param :phone_number
12
+ end
13
+ end
14
+
15
+ class DummyDogParams < SimpleParams::Params
16
+ param :name
17
+ param :age, type: :integer
18
+ nested_hash :owners_address do
19
+ param :street
20
+ param :city
8
21
  end
22
+ nested_array :puppies do
23
+ param :name
24
+ param :age
25
+ end
26
+ end
9
27
 
10
- let!(:mocked_params) { DummyParams.new }
28
+ describe SimpleParams::NilParams do
29
+ describe "class methods", class_methods: true do
30
+ describe "define_nil_class" do
31
+ let(:defined_class) do
32
+ described_class.define_nil_class(DummyPersonParams)
33
+ end
11
34
 
12
- describe "#valid" do
13
- let(:instance) { described_class.new({}, mocked_params)}
35
+ it "has correct name" do
36
+ defined_class.name.should eq("DummyPersonParams::NilParams")
37
+ end
14
38
 
15
- it "is valid" do
16
- instance.should be_valid
39
+ it "has correct parent class" do
40
+ defined_class.parent_class.should eq(DummyPersonParams)
41
+ end
42
+
43
+ it "has correct nested_classes" do
44
+ defined_class.nested_classes.should eq({
45
+ address: DummyPersonParams::Address,
46
+ phones: DummyPersonParams::Phones
47
+ })
48
+ end
17
49
  end
18
50
  end
19
51
 
20
- describe "#errors" do
21
- let(:instance) { described_class.new({}, mocked_params)}
52
+ describe "public methods", public_methods: true do
53
+ context "with no parent_class" do
54
+ let!(:instance) { described_class.new({})}
22
55
 
23
- it "has no errors" do
24
- instance.errors.should be_empty
25
- end
56
+ describe "#valid" do
57
+ it "is valid" do
58
+ instance.should be_valid
59
+ end
60
+ end
26
61
 
27
- it "can clear errors" do
28
- instance.valid?
29
- instance.errors.clear.should eq([])
30
- end
62
+ describe "#errors" do
63
+ it "has no errors" do
64
+ instance.errors.should be_empty
65
+ end
31
66
 
32
- it "has no error messages" do
33
- instance.valid?
34
- instance.errors.messages.should be_empty
35
- end
36
- end
67
+ it "can clear errors" do
68
+ instance.valid?
69
+ instance.errors.clear.should eq([])
70
+ end
37
71
 
38
- describe "#to_hash" do
39
- let(:instance) { described_class.new({}, mocked_params)}
72
+ it "has no error messages" do
73
+ instance.valid?
74
+ instance.errors.messages.should be_empty
75
+ end
76
+ end
40
77
 
41
- it "is empty" do
42
- instance.to_hash.should be_empty
78
+ describe "#to_hash" do
79
+ it "is empty" do
80
+ instance.to_hash.should be_empty
81
+ end
82
+ end
83
+
84
+ describe "#mocked_params accessors" do
85
+ it "does not respond to random accessors" do
86
+ instance.should_not respond_to(:name)
87
+ instance.should_not respond_to(:age)
88
+ end
89
+ end
43
90
  end
44
- end
45
91
 
46
- describe "#mocked_params accessors" do
47
- let(:instance) { described_class.new({}, mocked_params)}
92
+ context "with parent class" do
93
+ let!(:instance) { described_class.define_nil_class(DummyPersonParams).new({})}
94
+
95
+ describe "#valid" do
96
+ it "is valid" do
97
+ instance.should be_valid
98
+ end
99
+ end
100
+
101
+ describe "#errors" do
102
+ it "has no errors" do
103
+ instance.errors.should be_empty
104
+ end
105
+
106
+ it "can clear errors" do
107
+ instance.valid?
108
+ instance.errors.clear.should eq([])
109
+ end
110
+
111
+ it "has no error messages" do
112
+ instance.valid?
113
+ instance.errors.messages.should be_empty
114
+ end
115
+ end
116
+
117
+ describe "#to_hash" do
118
+ it "is empty" do
119
+ instance.to_hash.should be_empty
120
+ end
121
+ end
48
122
 
49
- it "responds to mocked_params" do
50
- instance.name.should be_nil
51
- instance.age.should be_nil
52
- instance.name = "Amy"
53
- instance.age = 33
54
- instance.name.should eq("Amy")
55
- instance.age.should eq(33)
123
+ describe "#mocked_params accessors" do
124
+ it "responds to parent class instance's accessors" do
125
+ instance.name.should be_nil
126
+ instance.age.should be_nil
127
+ instance.name = "Amy"
128
+ instance.age = 33
129
+ instance.name.should eq("Amy")
130
+ instance.age.should eq(33)
131
+ end
132
+ end
56
133
  end
57
134
  end
58
135
  end
@@ -1,6 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  class RailsIntegrationParams < SimpleParams::Params
4
+ with_rails_helpers
5
+
4
6
  param :name
5
7
  param :age, type: :integer, optional: true, validations: { inclusion: { in: 18..100 } }
6
8
  param :current_time, type: :datetime, optional: true
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.3.4
4
+ version: 1.3.5
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-30 00:00:00.000000000 Z
11
+ date: 2015-09-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel