simple_params 0.0.2.pre9 → 0.0.2.pre10
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 +10 -7
- data/README.md +11 -0
- data/lib/simple_params/attribute.rb +0 -14
- data/lib/simple_params/params.rb +1 -1
- data/lib/simple_params/type_mappings.rb +15 -0
- data/lib/simple_params/validation_matchers/coercion_matcher.rb +84 -0
- data/lib/simple_params/validation_matchers/format_matcher.rb +46 -0
- data/lib/simple_params/validation_matchers/optional_parameter_matcher.rb +65 -0
- data/lib/simple_params/validation_matchers/required_parameter_matcher.rb +65 -0
- data/lib/simple_params/validation_matchers/validation_matcher.rb +111 -0
- data/lib/simple_params/version.rb +1 -1
- data/lib/simple_params.rb +6 -0
- data/simple_params.gemspec +1 -0
- data/spec/acceptance_spec.rb +2 -2
- data/spec/fixtures/dummy_params.rb +1 -0
- data/spec/params_spec.rb +19 -1
- data/spec/spec_helper.rb +2 -0
- data/spec/validation_matchers/coercion_matcher_spec.rb +36 -0
- data/spec/validation_matchers/format_matcher_spec.rb +16 -0
- data/spec/validation_matchers/optional_parameter_matcher_spec.rb +19 -0
- data/spec/validation_matchers/required_parameter_matcher_spec.rb +20 -0
- metadata +30 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NDJmMjM3ZGEyNWMwYTFhMzYwODRkNDI2ZGU1ZjRhZGFlZjUzNmVlOA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
Y2Y2Y2I2ZWJlZTI1NTIwZTRkYTE0N2E5YmQ0NDkxNzk3MjRlNWUyOQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
Mjk3ZWYzZGZiMTVhMjJhYzM5Y2NhYjhiMGRiOTljNTM2ODBhYjI3YTVhMWFi
|
10
|
+
MTE0NDY2MWQ2NjJlODA3M2JjMjJkMjYwZjhiNDE2MGMzYmJiN2RjMzIyOTky
|
11
|
+
ODYxNTY2NjY4NTk1MDEwNjkxZDdhNWQ5N2UxMDQ1ZjU0NGNlZTk=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
N2NiYTA1ZTg1NTNhYWU3NzE1NzNkZDZhYzlhYmVjYzQ3NzlmMmU0ODcxZjRj
|
14
|
+
MWU3M2MwMzIwZTE5NWQ0ODMwMzU2ZWQ4MGU2Mzg3ZmZjNTA2MjNjNWMyYmQ5
|
15
|
+
ZjJlZDdiYWJjMmQ1OTMyNjIyNzkyODgyZjM1NWRlNjgyZTA2Zjg=
|
data/Gemfile.lock
CHANGED
@@ -1,17 +1,18 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
simple_params (0.0.2.
|
4
|
+
simple_params (0.0.2.pre9)
|
5
5
|
activemodel (>= 3.0, < 5.0)
|
6
|
+
shoulda-matchers (~> 2.8)
|
6
7
|
virtus (>= 1.0.0)
|
7
8
|
|
8
9
|
GEM
|
9
10
|
remote: https://rubygems.org/
|
10
11
|
specs:
|
11
|
-
activemodel (4.2.
|
12
|
-
activesupport (= 4.2.
|
12
|
+
activemodel (4.2.1)
|
13
|
+
activesupport (= 4.2.1)
|
13
14
|
builder (~> 3.1)
|
14
|
-
activesupport (4.2.
|
15
|
+
activesupport (4.2.1)
|
15
16
|
i18n (~> 0.7)
|
16
17
|
json (~> 1.7, >= 1.7.7)
|
17
18
|
minitest (~> 5.1)
|
@@ -28,12 +29,12 @@ GEM
|
|
28
29
|
descendants_tracker (0.0.4)
|
29
30
|
thread_safe (~> 0.3, >= 0.3.1)
|
30
31
|
diff-lcs (1.2.5)
|
31
|
-
equalizer (0.0.
|
32
|
+
equalizer (0.0.11)
|
32
33
|
i18n (0.7.0)
|
33
34
|
ice_nine (0.11.1)
|
34
35
|
json (1.8.2)
|
35
36
|
method_source (0.8.2)
|
36
|
-
minitest (5.
|
37
|
+
minitest (5.6.0)
|
37
38
|
pry (0.10.1)
|
38
39
|
coderay (~> 1.1.0)
|
39
40
|
method_source (~> 0.8.1)
|
@@ -47,11 +48,13 @@ GEM
|
|
47
48
|
rspec-expectations (2.99.2)
|
48
49
|
diff-lcs (>= 1.1.3, < 2.0)
|
49
50
|
rspec-mocks (2.99.3)
|
51
|
+
shoulda-matchers (2.8.0)
|
52
|
+
activesupport (>= 3.0.0)
|
50
53
|
slop (3.6.0)
|
51
54
|
thread_safe (0.3.5)
|
52
55
|
tzinfo (1.2.2)
|
53
56
|
thread_safe (~> 0.1)
|
54
|
-
virtus (1.0.
|
57
|
+
virtus (1.0.5)
|
55
58
|
axiom-types (~> 0.1)
|
56
59
|
coercible (~> 1.0)
|
57
60
|
descendants_tracker (~> 0.0, >= 0.0.3)
|
data/README.md
CHANGED
@@ -227,6 +227,17 @@ class CreateObjectParams < SimpleParams::Params
|
|
227
227
|
end
|
228
228
|
```
|
229
229
|
|
230
|
+
# RSpec Validation Matchers
|
231
|
+
|
232
|
+
If you would like to use Simple Params built in matchers, make sure you have RSpec
|
233
|
+
installed. Once RSpec is installed add this to your spec_helper.rb file
|
234
|
+
|
235
|
+
```ruby
|
236
|
+
RSpec.configure do |config|
|
237
|
+
config.include(SimpleParams::ValidationMatchers)
|
238
|
+
end
|
239
|
+
```
|
240
|
+
|
230
241
|
## Contributing
|
231
242
|
|
232
243
|
1. Fork it
|
@@ -3,20 +3,6 @@ require "virtus"
|
|
3
3
|
|
4
4
|
module SimpleParams
|
5
5
|
class Attribute
|
6
|
-
TYPE_MAPPINGS = {
|
7
|
-
integer: Integer,
|
8
|
-
string: String,
|
9
|
-
decimal: BigDecimal,
|
10
|
-
datetime: DateTime,
|
11
|
-
date: Date,
|
12
|
-
time: Time,
|
13
|
-
float: Float,
|
14
|
-
boolean: Axiom::Types::Boolean, # See note on Virtus
|
15
|
-
array: Array,
|
16
|
-
hash: Hash,
|
17
|
-
object: Object
|
18
|
-
}
|
19
|
-
|
20
6
|
attr_reader :parent
|
21
7
|
attr_reader :name
|
22
8
|
|
data/lib/simple_params/params.rb
CHANGED
@@ -84,7 +84,7 @@ module SimpleParams
|
|
84
84
|
|
85
85
|
def add_validations(name, opts = {})
|
86
86
|
validations = opts[:validations] || {}
|
87
|
-
validations.merge!(presence: true)
|
87
|
+
opts[:optional] ? validations.merge!(presence: false, allow_nil: true) : validations.merge!(presence: true)
|
88
88
|
validates name, validations unless validations.empty?
|
89
89
|
end
|
90
90
|
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module SimpleParams
|
2
|
+
TYPE_MAPPINGS = {
|
3
|
+
integer: Integer,
|
4
|
+
string: String,
|
5
|
+
decimal: BigDecimal,
|
6
|
+
datetime: DateTime,
|
7
|
+
date: Date,
|
8
|
+
time: Time,
|
9
|
+
float: Float,
|
10
|
+
boolean: Axiom::Types::Boolean, # See note on Virtus
|
11
|
+
array: Array,
|
12
|
+
hash: Hash,
|
13
|
+
object: Object
|
14
|
+
}
|
15
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module SimpleParams
|
2
|
+
module ValidationMatchers
|
3
|
+
def coerce_param(attr)
|
4
|
+
CoercionMatcher.new(attr)
|
5
|
+
end
|
6
|
+
|
7
|
+
class CoercionMatcher < ValidationMatcher
|
8
|
+
attr_accessor :attribute
|
9
|
+
|
10
|
+
def initialize(attribute)
|
11
|
+
super(attribute)
|
12
|
+
@attribute = attribute
|
13
|
+
end
|
14
|
+
|
15
|
+
def into(value)
|
16
|
+
@expected_coerce = value
|
17
|
+
self
|
18
|
+
end
|
19
|
+
|
20
|
+
def matches?(subject)
|
21
|
+
super(subject)
|
22
|
+
|
23
|
+
case @expected_coerce
|
24
|
+
when :integer
|
25
|
+
@subject.send("#{@attribute}=", "100.02")
|
26
|
+
(@subject.send(attribute) == 100) &&
|
27
|
+
(@subject.send(attribute).is_a?(TYPE_MAPPINGS[:integer]))
|
28
|
+
when :string
|
29
|
+
@subject.send("#{@attribute}=", 200)
|
30
|
+
(@subject.send(attribute) == "200") &&
|
31
|
+
(@subject.send(attribute).is_a?(TYPE_MAPPINGS[:string]))
|
32
|
+
when :decimal
|
33
|
+
@subject.send("#{@attribute}=", "100")
|
34
|
+
(@subject.send(attribute) == 100.0) &&
|
35
|
+
(@subject.send(attribute).is_a?(TYPE_MAPPINGS[:decimal]))
|
36
|
+
when :datetime
|
37
|
+
@subject.send("#{@attribute}=", DateTime.new(2014,2,3))
|
38
|
+
@subject.send(attribute).is_a?(TYPE_MAPPINGS[:datetime])
|
39
|
+
when :date
|
40
|
+
@subject.send("#{@attribute}=", Date.new(2014,2,3))
|
41
|
+
@subject.send(attribute).is_a?(TYPE_MAPPINGS[:date])
|
42
|
+
when :time
|
43
|
+
@subject.send("#{@attribute}=", Time.new(2007,11,5,11,21,0, "-05:00"))
|
44
|
+
@subject.send(attribute).is_a?(TYPE_MAPPINGS[:time])
|
45
|
+
when :float
|
46
|
+
@subject.send("#{@attribute}=", "20")
|
47
|
+
(@subject.send(attribute) == 20.0) &&
|
48
|
+
(@subject.send(attribute).is_a?(TYPE_MAPPINGS[:float]))
|
49
|
+
when :boolean
|
50
|
+
@subject.send("#{@attribute}=", 0)
|
51
|
+
(@subject.send(attribute) == false) &&
|
52
|
+
(@subject.send(attribute).is_a?(TrueClass) || @subject.send(attribute).is_a?(FalseClass))
|
53
|
+
when :array
|
54
|
+
@subject.send("#{@attribute}=", ["red, green, blue"])
|
55
|
+
@subject.send(attribute).is_a?(TYPE_MAPPINGS[:array])
|
56
|
+
when :hash
|
57
|
+
@subject.send("#{@attribute}=", { "dog"=>1, "cat"=>2, "fish"=>3 })
|
58
|
+
@subject.send(attribute).is_a?(TYPE_MAPPINGS[:hash])
|
59
|
+
when :object
|
60
|
+
@subject.send("#{@attribute}=", "programmer")
|
61
|
+
@subject.send(attribute).is_a?(TYPE_MAPPINGS[:object])
|
62
|
+
else
|
63
|
+
false
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
def description
|
70
|
+
"Expect #{@attribute} to coerce into #{@expected_coerce}"
|
71
|
+
end
|
72
|
+
|
73
|
+
def failure_message_for_should
|
74
|
+
"Expect #{@attribute} to coerce into #{@expected_coerce}"
|
75
|
+
end
|
76
|
+
|
77
|
+
def failure_message_for_should_not
|
78
|
+
"Expect #{@attribute} to not coerce into #{@expected_coerce}"
|
79
|
+
end
|
80
|
+
|
81
|
+
private
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module SimpleParams
|
2
|
+
module ValidationMatchers
|
3
|
+
def format(attr)
|
4
|
+
FormatMatcher.new(attr)
|
5
|
+
end
|
6
|
+
|
7
|
+
class FormatMatcher < ValidationMatcher
|
8
|
+
attr_accessor :default_value, :attribute
|
9
|
+
|
10
|
+
def initialize(attribute)
|
11
|
+
super(attribute)
|
12
|
+
@unformatted_value = nil
|
13
|
+
end
|
14
|
+
|
15
|
+
def with_value(value)
|
16
|
+
@unformatted_value = value
|
17
|
+
self
|
18
|
+
end
|
19
|
+
|
20
|
+
def into(value)
|
21
|
+
@expected_value = value
|
22
|
+
self
|
23
|
+
end
|
24
|
+
|
25
|
+
def matches?(subject)
|
26
|
+
super(subject)
|
27
|
+
@subject.send("#{@attribute}=", @unformatted_value)
|
28
|
+
@subject.send(attribute) == @expected_value
|
29
|
+
end
|
30
|
+
|
31
|
+
def description
|
32
|
+
"Expect #{@attribute} with_value #{@unformatted_value} to format into #{@expected_value}"
|
33
|
+
end
|
34
|
+
|
35
|
+
def failure_message_for_should
|
36
|
+
"Expect #{@attribute} with_value #{@unformatted_value} to format into #{@expected_value}"
|
37
|
+
end
|
38
|
+
|
39
|
+
def failure_message_for_should_not
|
40
|
+
"Expected #{@attribute} with_value #{@unformatted_value} to not format into #{@expected_value}"
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module SimpleParams
|
2
|
+
module ValidationMatchers
|
3
|
+
def have_optional_parameter(attr)
|
4
|
+
OptionalParameterMatcher.new(attr)
|
5
|
+
end
|
6
|
+
|
7
|
+
class OptionalParameterMatcher < ValidationMatcher
|
8
|
+
attr_accessor :default_value, :attribute, :allowed_values
|
9
|
+
|
10
|
+
def initialize(attribute)
|
11
|
+
super(attribute)
|
12
|
+
@default_value = nil
|
13
|
+
@attribute = attribute
|
14
|
+
@allowed_values = nil
|
15
|
+
end
|
16
|
+
|
17
|
+
def with_default(value)
|
18
|
+
@default_value = value
|
19
|
+
self
|
20
|
+
end
|
21
|
+
|
22
|
+
def with_allowed_values(*values)
|
23
|
+
@allowed_values = values
|
24
|
+
self
|
25
|
+
end
|
26
|
+
|
27
|
+
def matches?(subject)
|
28
|
+
super(subject)
|
29
|
+
|
30
|
+
if @default_value
|
31
|
+
matches_default_value?
|
32
|
+
elsif @allowed_values
|
33
|
+
allows_value_of(nil) && matches_allowed_values?
|
34
|
+
else
|
35
|
+
allows_value_of(nil)
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
def description
|
41
|
+
"allow #{@attribute} to be nil"
|
42
|
+
end
|
43
|
+
|
44
|
+
def failure_message_for_should
|
45
|
+
"Expected #{@default_value} either to be nil or one of #{@allowed_values}"
|
46
|
+
end
|
47
|
+
|
48
|
+
def failure_message_for_should_not
|
49
|
+
"Expected #{@default_value} not to be nil or to be one of #{@allowed_values}"
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def matches_default_value?
|
55
|
+
@subject.send(@attribute) == @default_value
|
56
|
+
end
|
57
|
+
|
58
|
+
def matches_allowed_values?
|
59
|
+
allowed_values.all? do |value|
|
60
|
+
allows_value_of(value)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module SimpleParams
|
2
|
+
module ValidationMatchers
|
3
|
+
def have_required_parameter(attr)
|
4
|
+
RequiredParameterMatcher.new(attr)
|
5
|
+
end
|
6
|
+
|
7
|
+
class RequiredParameterMatcher < ValidationMatcher
|
8
|
+
attr_accessor :default_value, :attribute, :allowed_values
|
9
|
+
|
10
|
+
def initialize(attribute)
|
11
|
+
super(attribute)
|
12
|
+
@default_value = nil
|
13
|
+
@attribute = attribute
|
14
|
+
@allowed_values = nil
|
15
|
+
end
|
16
|
+
|
17
|
+
def with_default(value)
|
18
|
+
@default_value = value
|
19
|
+
self
|
20
|
+
end
|
21
|
+
|
22
|
+
def with_allowed_values(*values)
|
23
|
+
@allowed_values = values
|
24
|
+
self
|
25
|
+
end
|
26
|
+
|
27
|
+
def matches?(subject)
|
28
|
+
super(subject)
|
29
|
+
@expected_message ||= :blank
|
30
|
+
|
31
|
+
if @default_value
|
32
|
+
matches_default_value?
|
33
|
+
elsif @allowed_values
|
34
|
+
disallows_value_of(nil) && matches_allowed_values?
|
35
|
+
else
|
36
|
+
disallows_value_of(nil, @expected_message)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def description
|
41
|
+
"require #{@attribute} to be set"
|
42
|
+
end
|
43
|
+
|
44
|
+
def failure_message_for_should
|
45
|
+
"Expected #{@default_value} to be set and to be one of #{@allowed_values}"
|
46
|
+
end
|
47
|
+
|
48
|
+
def failure_message_for_should_not
|
49
|
+
"Expected #{@default_value} not to be set and not to be one of #{@allowed_values}"
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def matches_default_value?
|
55
|
+
@subject.send(@attribute) == @default_value
|
56
|
+
end
|
57
|
+
|
58
|
+
def matches_allowed_values?
|
59
|
+
allowed_values.all? do |value|
|
60
|
+
allows_value_of(value)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require "shoulda-matchers"
|
2
|
+
|
3
|
+
module SimpleParams
|
4
|
+
module ValidationMatchers
|
5
|
+
class ValidationMatcher < ::Shoulda::Matchers::ActiveModel::ValidationMatcher
|
6
|
+
end
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
# module Shoulda
|
12
|
+
# module Matchers
|
13
|
+
# module ActiveModel
|
14
|
+
# # @private
|
15
|
+
# class ValidationMatcher
|
16
|
+
# attr_reader :failure_message
|
17
|
+
|
18
|
+
# alias failure_message_for_should failure_message
|
19
|
+
|
20
|
+
# def initialize(attribute)
|
21
|
+
# @attribute = attribute
|
22
|
+
# @strict = false
|
23
|
+
# @failure_message = nil
|
24
|
+
# @failure_message_when_negated = nil
|
25
|
+
# end
|
26
|
+
|
27
|
+
# def on(context)
|
28
|
+
# @context = context
|
29
|
+
# self
|
30
|
+
# end
|
31
|
+
|
32
|
+
# def strict
|
33
|
+
# @strict = true
|
34
|
+
# self
|
35
|
+
# end
|
36
|
+
|
37
|
+
# def failure_message_when_negated
|
38
|
+
# @failure_message_when_negated || @failure_message
|
39
|
+
# end
|
40
|
+
# alias failure_message_for_should_not failure_message_when_negated
|
41
|
+
|
42
|
+
# def matches?(subject)
|
43
|
+
# @subject = subject
|
44
|
+
# false
|
45
|
+
# end
|
46
|
+
|
47
|
+
# private
|
48
|
+
|
49
|
+
# def allows_value_of(value, message = nil, &block)
|
50
|
+
# allow = allow_value_matcher(value, message)
|
51
|
+
# yield allow if block_given?
|
52
|
+
|
53
|
+
# if allow.matches?(@subject)
|
54
|
+
# @failure_message_when_negated = allow.failure_message_when_negated
|
55
|
+
# true
|
56
|
+
# else
|
57
|
+
# @failure_message = allow.failure_message
|
58
|
+
# false
|
59
|
+
# end
|
60
|
+
# end
|
61
|
+
|
62
|
+
# def disallows_value_of(value, message = nil, &block)
|
63
|
+
# disallow = disallow_value_matcher(value, message)
|
64
|
+
# yield disallow if block_given?
|
65
|
+
|
66
|
+
# if disallow.matches?(@subject)
|
67
|
+
# @failure_message_when_negated = disallow.failure_message_when_negated
|
68
|
+
# true
|
69
|
+
# else
|
70
|
+
# @failure_message = disallow.failure_message
|
71
|
+
# false
|
72
|
+
# end
|
73
|
+
# end
|
74
|
+
|
75
|
+
# def allow_value_matcher(value, message)
|
76
|
+
# matcher = AllowValueMatcher.new(value).for(@attribute).
|
77
|
+
# with_message(message)
|
78
|
+
|
79
|
+
# if defined?(@context)
|
80
|
+
# matcher.on(@context)
|
81
|
+
# end
|
82
|
+
|
83
|
+
# if strict?
|
84
|
+
# matcher.strict
|
85
|
+
# end
|
86
|
+
|
87
|
+
# matcher
|
88
|
+
# end
|
89
|
+
|
90
|
+
# def disallow_value_matcher(value, message)
|
91
|
+
# matcher = DisallowValueMatcher.new(value).for(@attribute).
|
92
|
+
# with_message(message)
|
93
|
+
|
94
|
+
# if defined?(@context)
|
95
|
+
# matcher.on(@context)
|
96
|
+
# end
|
97
|
+
|
98
|
+
# if strict?
|
99
|
+
# matcher.strict
|
100
|
+
# end
|
101
|
+
|
102
|
+
# matcher
|
103
|
+
# end
|
104
|
+
|
105
|
+
# def strict?
|
106
|
+
# @strict
|
107
|
+
# end
|
108
|
+
# end
|
109
|
+
# end
|
110
|
+
# end
|
111
|
+
# end
|
data/lib/simple_params.rb
CHANGED
@@ -5,7 +5,13 @@ require 'simple_params/errors'
|
|
5
5
|
require 'simple_params/validations'
|
6
6
|
require 'simple_params/params'
|
7
7
|
require 'simple_params/simple_params_error'
|
8
|
+
require 'simple_params/type_mappings'
|
8
9
|
require 'simple_params/api_pie_doc'
|
9
10
|
require 'simple_params/api_pie_doc/attribute_base'
|
10
11
|
require 'simple_params/api_pie_doc/attribute'
|
11
12
|
require 'simple_params/api_pie_doc/nested_attribute'
|
13
|
+
require 'simple_params/validation_matchers/validation_matcher'
|
14
|
+
require 'simple_params/validation_matchers/coercion_matcher'
|
15
|
+
require 'simple_params/validation_matchers/format_matcher'
|
16
|
+
require 'simple_params/validation_matchers/required_parameter_matcher'
|
17
|
+
require 'simple_params/validation_matchers/optional_parameter_matcher'
|
data/simple_params.gemspec
CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_dependency "activemodel", ">= 3.0", "< 5.0"
|
22
22
|
spec.add_dependency "virtus", ">= 1.0.0"
|
23
|
+
spec.add_dependency "shoulda-matchers", "~> 2.8"
|
23
24
|
spec.add_development_dependency "bundler", "~> 1.5"
|
24
25
|
spec.add_development_dependency "rake", "~> 10.1"
|
25
26
|
spec.add_development_dependency "rspec", "~> 2.6"
|
data/spec/acceptance_spec.rb
CHANGED
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
class AcceptanceParams < SimpleParams::Params
|
4
4
|
param :reference, type: :object, optional: true
|
5
5
|
param :name
|
6
|
-
param :age, type: :integer, optional: true
|
6
|
+
param :age, type: :integer, optional: true, validations: { inclusion: { in: 18..100 } }
|
7
7
|
param :color, default: "red", validations: { inclusion: { in: ["red", "green"] }}
|
8
8
|
|
9
9
|
nested_hash :address do
|
@@ -164,7 +164,7 @@ describe SimpleParams::Params do
|
|
164
164
|
describe "#validate!" do
|
165
165
|
let(:params) { AcceptanceParams.new }
|
166
166
|
|
167
|
-
it "raises error with
|
167
|
+
it "raises error with validation descriptions" do
|
168
168
|
expect { params.validate! }.to raise_error(SimpleParamsError,
|
169
169
|
"{:name=>[\"can't be blank\"], :address=>{:street=>[\"can't be blank\"], :city=>[\"is too short (minimum is 4 characters)\", \"can't be blank\"]}}"
|
170
170
|
)
|
@@ -4,6 +4,7 @@ class DummyParams < SimpleParams::Params
|
|
4
4
|
string_param :first_initial, default: lambda { |params, param| params.name[0] if params.name.present? }
|
5
5
|
decimal_param :amount, optional: true, default: 0.10, formatter: lambda { |params, param| param.round(2) }
|
6
6
|
param :color, default: "red", validations: { inclusion: { in: ["red", "green"] }}, formatter: :lower_case_colors
|
7
|
+
string_param :height, optional: true, validations: { inclusion: { in: ["tall","supertall"]} }
|
7
8
|
|
8
9
|
nested_hash :address do
|
9
10
|
string_param :street
|
data/spec/params_spec.rb
CHANGED
@@ -72,7 +72,7 @@ describe SimpleParams::Params do
|
|
72
72
|
describe "attributes", attributes: true do
|
73
73
|
it "returns array of attribute symbols" do
|
74
74
|
params = DummyParams.new
|
75
|
-
params.attributes.should eq([:name, :age, :first_initial, :amount, :color, :address, :phone])
|
75
|
+
params.attributes.should eq([:name, :age, :first_initial, :amount, :color, :height, :address, :phone])
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
@@ -123,6 +123,23 @@ describe SimpleParams::Params do
|
|
123
123
|
end
|
124
124
|
end
|
125
125
|
|
126
|
+
describe "optional params with inclusion" do
|
127
|
+
let(:params) do
|
128
|
+
DummyParams.new(
|
129
|
+
name: "Bill",
|
130
|
+
age: 30,
|
131
|
+
address: {
|
132
|
+
city: "Greenville"
|
133
|
+
}
|
134
|
+
)
|
135
|
+
end
|
136
|
+
|
137
|
+
it "allows optional params to be nil with inclusion" do
|
138
|
+
params.should_not be_valid
|
139
|
+
params.errors[:height].should be_empty
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
126
143
|
describe "coercion", coercion: true do
|
127
144
|
it "coerces values on initialization" do
|
128
145
|
params = DummyParams.new(age: "42")
|
@@ -297,6 +314,7 @@ describe SimpleParams::Params do
|
|
297
314
|
param :first_initial, String, desc: '', required: true
|
298
315
|
param :amount, desc: '', required: false
|
299
316
|
param :color, String, desc: '', required: true
|
317
|
+
param :height, String, desc: '', required: false
|
300
318
|
param :address, Hash, desc: '', required: true do
|
301
319
|
param :street, String, desc: '', required: true
|
302
320
|
param :city, String, desc: '', required: true
|
data/spec/spec_helper.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'bundler/setup'
|
3
3
|
require 'simple_params'
|
4
|
+
require 'shoulda/matchers'
|
4
5
|
require 'pry'
|
5
6
|
|
6
7
|
Dir[File.join('.', 'spec', 'support', '**', '*.rb')].each {|f| require f}
|
@@ -9,4 +10,5 @@ I18n.config.enforce_available_locales = true
|
|
9
10
|
|
10
11
|
RSpec.configure do |config|
|
11
12
|
config.mock_with :rspec
|
13
|
+
config.include(SimpleParams::ValidationMatchers)
|
12
14
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SimpleParams::ValidationMatchers::CoercionMatcher do
|
4
|
+
class CoercionMatcherTestClass < SimpleParams::Params
|
5
|
+
param :name, type: :string
|
6
|
+
param :expiration_date, type: :date
|
7
|
+
param :amount, type: :integer
|
8
|
+
param :beginning_date, type: :datetime
|
9
|
+
param :cost, type: :float
|
10
|
+
param :weight, type: :decimal
|
11
|
+
param :colors, type: :array
|
12
|
+
param :animals, type: :hash
|
13
|
+
param :title, type: :object
|
14
|
+
param :office_hours, type: :time
|
15
|
+
param :cellphone, type: :boolean
|
16
|
+
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
subject { CoercionMatcherTestClass.new }
|
21
|
+
|
22
|
+
it { should coerce_param(:name).into(:string) }
|
23
|
+
it { should coerce_param(:expiration_date).into(:date) }
|
24
|
+
it { should_not coerce_param(:expiration_date).into(:datetime) }
|
25
|
+
it { should coerce_param(:amount).into(:integer) }
|
26
|
+
it { should coerce_param(:beginning_date).into(:datetime) }
|
27
|
+
it { should coerce_param(:cost).into(:float) }
|
28
|
+
it { should_not coerce_param(:cost).into(:integer) }
|
29
|
+
it { should coerce_param(:weight).into(:decimal) }
|
30
|
+
it { should_not coerce_param(:weight).into(:float) }
|
31
|
+
it { should coerce_param(:colors).into(:array) }
|
32
|
+
it { should coerce_param(:animals).into(:hash) }
|
33
|
+
it { should coerce_param(:title).into(:object) }
|
34
|
+
it { should coerce_param(:office_hours).into(:time) }
|
35
|
+
it { should coerce_param(:cellphone).into(:boolean) }
|
36
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SimpleParams::ValidationMatchers::FormatMatcher do
|
4
|
+
class FormatMatcher < SimpleParams::Params
|
5
|
+
param :amount, type: :float, formatter: lambda { |params, amt| sprintf('%.2f', amt) }
|
6
|
+
param :expiration_date, type: :date, formatter: lambda { |params, date| date.strftime("%Y-%m")}
|
7
|
+
param :cost, type: :float, formatter: lambda { |params, amt| sprintf('%.2f', amt) }
|
8
|
+
end
|
9
|
+
|
10
|
+
subject { FormatMatcher.new }
|
11
|
+
|
12
|
+
it { should format(:amount).with_value(10).into("10.00") }
|
13
|
+
it { should format(:expiration_date).with_value(Date.new(2014, 2, 4)).into("2014-02") }
|
14
|
+
it { should_not format(:cost).with_value(12).into("14.00") }
|
15
|
+
it { should_not format(:expiration_date).with_value(Date.new(2016, 2, 4)).into("2014-02") }
|
16
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SimpleParams::ValidationMatchers::OptionalParameterMatcher do
|
4
|
+
class OptionalParameterMatcher < SimpleParams::Params
|
5
|
+
param :name
|
6
|
+
param :age, optional: true, default: 37
|
7
|
+
param :title, optional: true, default: "programmer"
|
8
|
+
param :account_type, default: "checking", validations: { inclusion: { in: ["checking", "savings"] }}
|
9
|
+
param :account_status, optional: true, validations: { inclusion: { in: ["active", "inactive"] }}
|
10
|
+
end
|
11
|
+
|
12
|
+
subject { OptionalParameterMatcher.new }
|
13
|
+
|
14
|
+
it { should_not have_optional_parameter(:name) }
|
15
|
+
it { should have_optional_parameter(:age).with_default(37) }
|
16
|
+
it { should have_optional_parameter(:title).with_default("programmer") }
|
17
|
+
it { should have_optional_parameter(:account_status).with_allowed_values("active", "inactive") }
|
18
|
+
it { should have_optional_parameter(:account_type).with_default("checking").with_allowed_values("checking", "savings") }
|
19
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SimpleParams::ValidationMatchers::RequiredParameterMatcher do
|
4
|
+
class RequiredParameterMatcherTestClass < SimpleParams::Params
|
5
|
+
param :name
|
6
|
+
param :age, optional: true
|
7
|
+
param :title, default: "programmer"
|
8
|
+
param :account_type, validations: { inclusion: { in: ["checking", "savings"] }}
|
9
|
+
param :account_status, default: "active", validations: { inclusion: { in: ["active", "inactive"] }}
|
10
|
+
end
|
11
|
+
|
12
|
+
subject { RequiredParameterMatcherTestClass.new }
|
13
|
+
|
14
|
+
it { should have_required_parameter(:name) }
|
15
|
+
it { should_not have_required_parameter(:age) }
|
16
|
+
it { should_not have_required_parameter(:name).with_default("Matthew") }
|
17
|
+
it { should have_required_parameter(:title).with_default("programmer") }
|
18
|
+
it { should have_required_parameter(:account_type).with_allowed_values("checking", "savings") }
|
19
|
+
it { should have_required_parameter(:account_status).with_default("active").with_allowed_values("active", "inactive") }
|
20
|
+
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: 0.0.2.
|
4
|
+
version: 0.0.2.pre10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- brycesenz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-05-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -44,6 +44,20 @@ dependencies:
|
|
44
44
|
- - ! '>='
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: 1.0.0
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: shoulda-matchers
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '2.8'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ~>
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '2.8'
|
47
61
|
- !ruby/object:Gem::Dependency
|
48
62
|
name: bundler
|
49
63
|
requirement: !ruby/object:Gem::Requirement
|
@@ -123,6 +137,12 @@ files:
|
|
123
137
|
- lib/simple_params/formatter.rb
|
124
138
|
- lib/simple_params/params.rb
|
125
139
|
- lib/simple_params/simple_params_error.rb
|
140
|
+
- lib/simple_params/type_mappings.rb
|
141
|
+
- lib/simple_params/validation_matchers/coercion_matcher.rb
|
142
|
+
- lib/simple_params/validation_matchers/format_matcher.rb
|
143
|
+
- lib/simple_params/validation_matchers/optional_parameter_matcher.rb
|
144
|
+
- lib/simple_params/validation_matchers/required_parameter_matcher.rb
|
145
|
+
- lib/simple_params/validation_matchers/validation_matcher.rb
|
126
146
|
- lib/simple_params/validations.rb
|
127
147
|
- lib/simple_params/version.rb
|
128
148
|
- simple_params.gemspec
|
@@ -137,6 +157,10 @@ files:
|
|
137
157
|
- spec/params_spec.rb
|
138
158
|
- spec/spec_helper.rb
|
139
159
|
- spec/support/shared_examples/base_attribute.rb
|
160
|
+
- spec/validation_matchers/coercion_matcher_spec.rb
|
161
|
+
- spec/validation_matchers/format_matcher_spec.rb
|
162
|
+
- spec/validation_matchers/optional_parameter_matcher_spec.rb
|
163
|
+
- spec/validation_matchers/required_parameter_matcher_spec.rb
|
140
164
|
homepage: https://github.com/brycesenz/simple_params
|
141
165
|
licenses:
|
142
166
|
- MIT
|
@@ -173,3 +197,7 @@ test_files:
|
|
173
197
|
- spec/params_spec.rb
|
174
198
|
- spec/spec_helper.rb
|
175
199
|
- spec/support/shared_examples/base_attribute.rb
|
200
|
+
- spec/validation_matchers/coercion_matcher_spec.rb
|
201
|
+
- spec/validation_matchers/format_matcher_spec.rb
|
202
|
+
- spec/validation_matchers/optional_parameter_matcher_spec.rb
|
203
|
+
- spec/validation_matchers/required_parameter_matcher_spec.rb
|