simple_params 1.3.4 → 1.3.5

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 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