coercive 1.5.0 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +30 -5
- data/coercive.gemspec +1 -1
- data/lib/coercive.rb +27 -0
- data/test/coercive.rb +60 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: af1258f102aed9654f229199a6999f7dc817550b51fd009d9e8057de26c8cb11
|
4
|
+
data.tar.gz: 297d85ff20739bf100f7434d657a842adbaa783a17b10c459325724391d84196
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e9e1e6a9d98a32bc3819ef6ea4765f21a45ed103000186d71d394d10ac657178eb6498d55bebd2b7a54182cb6565593efc8f377f1ba8bf4074dbed030a81704f
|
7
|
+
data.tar.gz: 9cde425ae7847267b73118f741304a2a1b1b04cd7585d52c5d1bb0a5f51b664dd530c00a5e50c3bdecf9f0c0e3e3c1cc4a8a567a472e0d6745d28e26f84b76cb
|
data/README.md
CHANGED
@@ -217,19 +217,44 @@ end
|
|
217
217
|
CoerceFoo.call("foo" => "bar")
|
218
218
|
# => Coercive::Error: {"foo"=>"not_valid"}
|
219
219
|
|
220
|
-
CoerceFoo.call("
|
221
|
-
# => Coercive::Error: {"
|
220
|
+
CoerceFoo.call("foo_bounds" => "0.5")
|
221
|
+
# => Coercive::Error: {"foo_bounds"=>"too_low"}
|
222
222
|
|
223
|
-
CoerceFoo.call("
|
224
|
-
# => Coercive::Error: {"
|
223
|
+
CoerceFoo.call("foo_bounds" => 6.5)
|
224
|
+
# => Coercive::Error: {"foo_bounds"=>"too_high"}
|
225
225
|
|
226
226
|
CoerceFoo.call("foo" => "0.1")
|
227
227
|
# => {"foo"=>0.1}
|
228
|
-
|
228
|
+
|
229
229
|
CoerceFoo.call("foo" => "0.1e5")
|
230
230
|
# => {"foo"=>10000.0}
|
231
231
|
```
|
232
232
|
|
233
|
+
### `boolean(true_if:, false_if:)
|
234
|
+
|
235
|
+
`boolean` will coerce input into `true` or `false`. You can also specifiy additional values to coerce into `true` or `false` with the `true_if` and `false_if` options.
|
236
|
+
|
237
|
+
```ruby
|
238
|
+
module CoerceFoo
|
239
|
+
extend Coercive
|
240
|
+
|
241
|
+
attribute :foo, boolean, optional
|
242
|
+
attribute :foo_if, boolean(true_if: member(["1", "on"])), optional
|
243
|
+
end
|
244
|
+
|
245
|
+
CoerceFoo.call("foo" => true)
|
246
|
+
# => {"foo"=>true}
|
247
|
+
|
248
|
+
CoerceFoo.call("foo" => "true")
|
249
|
+
# => {"foo"=>true}
|
250
|
+
|
251
|
+
CoerceFoo.call("foo" => nil)
|
252
|
+
# => Coercive::Error: {"foo"=>"not_valid"}
|
253
|
+
|
254
|
+
CoerceFoo.call("foo_if" => "on")
|
255
|
+
# => {"foo_if"=>true}
|
256
|
+
```
|
257
|
+
|
233
258
|
### `array`
|
234
259
|
|
235
260
|
The `array` coercion is interesting because it's where `Coercive` starts to shine, by letting you compose coercion functions together. Let's see:
|
data/coercive.gemspec
CHANGED
data/lib/coercive.rb
CHANGED
@@ -186,6 +186,33 @@ module Coercive
|
|
186
186
|
end
|
187
187
|
end
|
188
188
|
|
189
|
+
# Public DSL: Return a coerce function to coerce input to true or false.
|
190
|
+
# Used when declaring an attribute. See documentation for attr_coerce_fns.
|
191
|
+
#
|
192
|
+
# true_if - coerce function to override which values will coerce to true.
|
193
|
+
# false_if - coerce function to override which values will coerce to false.
|
194
|
+
def boolean(true_if: member([true, "true"]), false_if: member([false, "false"]))
|
195
|
+
->(input) do
|
196
|
+
test_success = ->(coerce_fn) do
|
197
|
+
begin
|
198
|
+
coerce_fn.call(input)
|
199
|
+
rescue Coercive::Error
|
200
|
+
return false
|
201
|
+
end
|
202
|
+
|
203
|
+
true
|
204
|
+
end
|
205
|
+
|
206
|
+
if test_success.(true_if)
|
207
|
+
true
|
208
|
+
elsif test_success.(false_if)
|
209
|
+
false
|
210
|
+
else
|
211
|
+
fail Coercive::Error.new("not_valid")
|
212
|
+
end
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
189
216
|
# Public DSL: Return a coerce function to coerce input to a String.
|
190
217
|
# Used when declaring an attribute. See documentation for attr_coerce_fns.
|
191
218
|
#
|
data/test/coercive.rb
CHANGED
@@ -137,7 +137,7 @@ describe "Coercive" do
|
|
137
137
|
expected_errors = { "baz" => "too_low" }
|
138
138
|
|
139
139
|
assert_coercion_error(expected_errors) { @coercion.call("baz" => 0) }
|
140
|
-
|
140
|
+
|
141
141
|
expected_errors = { "baz" => "too_high" }
|
142
142
|
|
143
143
|
assert_coercion_error(expected_errors) { @coercion.call("baz" => 11) }
|
@@ -182,13 +182,71 @@ describe "Coercive" do
|
|
182
182
|
expected_errors = { "bar" => "too_low" }
|
183
183
|
|
184
184
|
assert_coercion_error(expected_errors) { @coercion.call("bar" => 0.5) }
|
185
|
-
|
185
|
+
|
186
186
|
expected_errors = { "bar" => "too_high" }
|
187
187
|
|
188
188
|
assert_coercion_error(expected_errors) { @coercion.call("bar" => 6.0) }
|
189
189
|
end
|
190
190
|
end
|
191
191
|
|
192
|
+
describe "boolean" do
|
193
|
+
before do
|
194
|
+
@coercion = Module.new do
|
195
|
+
extend Coercive
|
196
|
+
|
197
|
+
attribute :foo, boolean, optional
|
198
|
+
attribute :foo_true, boolean(true_if: member(["on", 1])), optional
|
199
|
+
attribute :foo_false, boolean(false_if: member(["off", "0"])), optional
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
it "supports true or false as String by default" do
|
204
|
+
[true, "true"].each do |value|
|
205
|
+
attributes = { "foo" => value }
|
206
|
+
|
207
|
+
expected = { "foo" => true }
|
208
|
+
|
209
|
+
assert_equal expected, @coercion.call(attributes)
|
210
|
+
end
|
211
|
+
|
212
|
+
[false, "false"].each do |value|
|
213
|
+
attributes = { "foo" => value }
|
214
|
+
|
215
|
+
expected = { "foo" => false }
|
216
|
+
|
217
|
+
assert_equal expected, @coercion.call(attributes)
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
it "supports customizing values to coerce into true or false" do
|
222
|
+
["on", 1].each do |value|
|
223
|
+
attributes = { "foo_true" => value }
|
224
|
+
|
225
|
+
expected = { "foo_true" => true }
|
226
|
+
|
227
|
+
assert_equal expected, @coercion.call(attributes)
|
228
|
+
end
|
229
|
+
|
230
|
+
["off", "0"].each do |value|
|
231
|
+
attributes = { "foo_false" => value }
|
232
|
+
|
233
|
+
expected = { "foo_false" => false }
|
234
|
+
|
235
|
+
assert_equal expected, @coercion.call(attributes)
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
it "fails on unknown values" do
|
240
|
+
["nope", nil].each do |value|
|
241
|
+
attributes = { "foo" => value }
|
242
|
+
|
243
|
+
expected_errors = { "foo" => "not_valid" }
|
244
|
+
|
245
|
+
assert_coercion_error(expected_errors) { @coercion.call(attributes) }
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
192
250
|
describe "string" do
|
193
251
|
before do
|
194
252
|
@coercion = Module.new do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: coercive
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joe McIlvain
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2020-09-
|
12
|
+
date: 2020-09-21 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Coercive is a library to validate and coerce user input
|
15
15
|
email:
|