datacaster 3.3.1 → 4.1.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 +17 -1
- data/lib/datacaster/hash_mapper.rb +3 -2
- data/lib/datacaster/predefined.rb +4 -3
- data/lib/datacaster/runtimes/structure_cleaner.rb +5 -0
- data/lib/datacaster/runtimes/user_context.rb +11 -4
- data/lib/datacaster/transformer.rb +5 -1
- data/lib/datacaster/version.rb +1 -1
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1cbcb054db89c228c0c38e19a2af1a3863a1835708dd9717a9f3d5c0b3f27286
|
4
|
+
data.tar.gz: 79aa8db52e0cb760b1fd6e8b49bf77b7853b7fae192f2a746d4a9205bc3c1b14
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f5a325a3bd5534b69024488ea015d05e5c1e12970df5c07a2eeb26c34a0c8be48bbc2f2c98971f1ba4653231c7740d06cf38359c628ee030e4d8423cafebb278
|
7
|
+
data.tar.gz: aa0b7b42f0ecd22f9d4d9865e0c2c95602a990585550f5579c2b466f2a9bde4d6814adf0faeffe08d0e9e391d79c27519a1e5647a9fb0f9370276f72c8e461d2
|
data/README.md
CHANGED
@@ -849,7 +849,7 @@ I18n keys:
|
|
849
849
|
|
850
850
|
#### `transform_to_value(value)`
|
851
851
|
|
852
|
-
Always returns ValidResult. The value is transformed to provided argument (disregarding the original value).
|
852
|
+
Always returns ValidResult. The value is transformed to provided argument (disregarding the original value). If the resultant value is a Hash, all its keys are marked as validated and will survive `Datacaster.schema { ... }` call.
|
853
853
|
|
854
854
|
Returned value is deeply frozen with [`Ractor::make_shareable`](https://docs.ruby-lang.org/en/master/Ractor.html#method-c-make_shareable) to prevent application bugs due to modification of unintentionally shared value. If that effect is undesired, use [`transform { value }`](#transform--value--) instead.
|
855
855
|
|
@@ -1070,6 +1070,8 @@ Useful to perform some side-effect such as raising an exception, making a log en
|
|
1070
1070
|
|
1071
1071
|
Always returns ValidResult. Transforms the value: returns whatever the block has returned.
|
1072
1072
|
|
1073
|
+
If the resultant value is a Hash, all its keys are marked as validated and will survive `Datacaster.schema { ... }` call.
|
1074
|
+
|
1073
1075
|
```ruby
|
1074
1076
|
city =
|
1075
1077
|
Datacaster.schema do
|
@@ -1087,6 +1089,8 @@ city.(name: "Denver", distance: "2.5") # => Datacaster::ValidResult({:name=>"Den
|
|
1087
1089
|
|
1088
1090
|
Always returns ValidResult. If the value is `Datacaster.absent`, then `Datacaster.absent` is returned (the block isn't called). Otherwise, works like [`transform`](#transform--value).
|
1089
1091
|
|
1092
|
+
If the resultant value is a Hash, all its keys are marked as validated and will survive `Datacaster.schema { ... }` call.
|
1093
|
+
|
1090
1094
|
### Array schemas
|
1091
1095
|
|
1092
1096
|
To define compound data type, array of 'something', use `array_schema(something)` (or the alias `array_of(something)`). There is no built-in way to define an array wherein each element is of a different type.
|
@@ -1543,6 +1547,18 @@ schema.with_context(five: 15).(nil)
|
|
1543
1547
|
# => Datacaster::ValidResult(nil)
|
1544
1548
|
```
|
1545
1549
|
|
1550
|
+
Method `has_key?` could be used to determine whether key is available in the context
|
1551
|
+
|
1552
|
+
```ruby
|
1553
|
+
schema =
|
1554
|
+
Datacaster.schema do
|
1555
|
+
check { context.has_key?(:five) }
|
1556
|
+
end
|
1557
|
+
|
1558
|
+
schema.with_context(five: 15).(nil)
|
1559
|
+
# => Datacaster::ValidResult(nil)
|
1560
|
+
```
|
1561
|
+
|
1546
1562
|
**Note**
|
1547
1563
|
|
1548
1564
|
`context` can be accesed only in casters' blocks. It can't be used in schema definition itself:
|
@@ -17,8 +17,6 @@ module Datacaster
|
|
17
17
|
errors = {}
|
18
18
|
result = {}
|
19
19
|
|
20
|
-
runtime.will_check!
|
21
|
-
|
22
20
|
@fields.each do |key, validator|
|
23
21
|
new_value = runtime.ignore_checks! { validator.with_runtime(runtime).(object) }
|
24
22
|
|
@@ -52,6 +50,9 @@ module Datacaster
|
|
52
50
|
end
|
53
51
|
end
|
54
52
|
|
53
|
+
runtime.will_check!
|
54
|
+
result.keys.each { |key| runtime.checked_key!(key) }
|
55
|
+
|
55
56
|
errors.delete_if { |_, v| v.empty? }
|
56
57
|
|
57
58
|
if errors.empty?
|
@@ -161,7 +161,7 @@ module Datacaster
|
|
161
161
|
end
|
162
162
|
|
163
163
|
def pass
|
164
|
-
|
164
|
+
cast { |v| Datacaster::ValidResult(v) }
|
165
165
|
end
|
166
166
|
|
167
167
|
def pass_if(base)
|
@@ -189,7 +189,7 @@ module Datacaster
|
|
189
189
|
end
|
190
190
|
end
|
191
191
|
|
192
|
-
must_be(Enumerable) &
|
192
|
+
must_be(Enumerable) & cast { |input|
|
193
193
|
result =
|
194
194
|
keys.map do |key|
|
195
195
|
Array(key).reduce(input) do |result, k|
|
@@ -198,7 +198,8 @@ module Datacaster
|
|
198
198
|
result
|
199
199
|
end
|
200
200
|
end
|
201
|
-
keys.length == 1 ? result.first : result
|
201
|
+
result = keys.length == 1 ? result.first : result
|
202
|
+
Datacaster::ValidResult(result)
|
202
203
|
}
|
203
204
|
end
|
204
205
|
|
@@ -32,9 +32,14 @@ module Datacaster
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def will_check!
|
35
|
+
return if @ignore
|
35
36
|
@should_check_stack[-1] = true
|
36
37
|
end
|
37
38
|
|
39
|
+
def will_not_check!
|
40
|
+
@should_check_stack[-1] = false
|
41
|
+
end
|
42
|
+
|
38
43
|
# Notify current runtime that some child runtime has built schema,
|
39
44
|
# child runtime's schema is passed as the argument
|
40
45
|
def checked_schema!(schema)
|
@@ -4,6 +4,10 @@ module Datacaster
|
|
4
4
|
module Runtimes
|
5
5
|
class UserContext < Base
|
6
6
|
class ContextStruct
|
7
|
+
def self.context_has_key?(context, key)
|
8
|
+
context.respond_to?(:key?) && context.key?(key) || context.to_h.key?(key.to_sym)
|
9
|
+
end
|
10
|
+
|
7
11
|
def initialize(context, node)
|
8
12
|
@context = context
|
9
13
|
@node = node
|
@@ -14,10 +18,7 @@ module Datacaster
|
|
14
18
|
return super
|
15
19
|
end
|
16
20
|
|
17
|
-
|
18
|
-
@context.to_h.key?(m.to_sym)
|
19
|
-
|
20
|
-
if key_present && args.empty?
|
21
|
+
if self.class.context_has_key?(@context, m) && args.empty?
|
21
22
|
return @context[m]
|
22
23
|
end
|
23
24
|
|
@@ -31,6 +32,12 @@ module Datacaster
|
|
31
32
|
raise NoMethodError.new("Key #{m.inspect} is not found in the context")
|
32
33
|
end
|
33
34
|
end
|
35
|
+
|
36
|
+
def has_key?(key)
|
37
|
+
self.class.context_has_key?(@context, key) || @node.class.send_to_parent(@node, :context).has_key?(key)
|
38
|
+
rescue NoMethodError
|
39
|
+
false
|
40
|
+
end
|
34
41
|
end
|
35
42
|
|
36
43
|
def initialize(parent, user_context)
|
@@ -7,7 +7,11 @@ module Datacaster
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def cast(object, runtime:)
|
10
|
-
|
10
|
+
result = Runtimes::Base.(runtime, @transform, object)
|
11
|
+
if runtime.respond_to?(:will_not_check!)
|
12
|
+
runtime.will_not_check!
|
13
|
+
end
|
14
|
+
Datacaster::ValidResult(result)
|
11
15
|
end
|
12
16
|
|
13
17
|
def inspect
|
data/lib/datacaster/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: datacaster
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eugene Zolotarev
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-10-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -106,7 +106,7 @@ dependencies:
|
|
106
106
|
- - "<"
|
107
107
|
- !ruby/object:Gem::Version
|
108
108
|
version: '3'
|
109
|
-
description:
|
109
|
+
description:
|
110
110
|
email:
|
111
111
|
- eugzol@gmail.com
|
112
112
|
executables: []
|
@@ -178,7 +178,7 @@ licenses:
|
|
178
178
|
- MIT
|
179
179
|
metadata:
|
180
180
|
source_code_uri: https://github.com/EugZol/datacaster
|
181
|
-
post_install_message:
|
181
|
+
post_install_message:
|
182
182
|
rdoc_options: []
|
183
183
|
require_paths:
|
184
184
|
- lib
|
@@ -193,8 +193,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
193
193
|
- !ruby/object:Gem::Version
|
194
194
|
version: '0'
|
195
195
|
requirements: []
|
196
|
-
rubygems_version: 3.
|
197
|
-
signing_key:
|
196
|
+
rubygems_version: 3.1.6
|
197
|
+
signing_key:
|
198
198
|
specification_version: 4
|
199
199
|
summary: Run-time type checker and transformer for Ruby
|
200
200
|
test_files: []
|