coercive 1.5.0 → 1.6.0
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 +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:
|