datacaster 3.3.1 → 4.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5864f7aa276d30db8a1c774847715f6167733719b1f5ea0364a1997732dbffeb
4
- data.tar.gz: 546d45344a7c8acb31510c3a6dc99c275067041d3a06b5d705da6867714ac953
3
+ metadata.gz: 1cbcb054db89c228c0c38e19a2af1a3863a1835708dd9717a9f3d5c0b3f27286
4
+ data.tar.gz: 79aa8db52e0cb760b1fd6e8b49bf77b7853b7fae192f2a746d4a9205bc3c1b14
5
5
  SHA512:
6
- metadata.gz: 03a21b07500ea5fbae488b4e3664b635833a38b107d231a0cad67a89ff522a63ce6652ae24d9db9c2cf2229fd1709c40d49219691f255e1e0cf0635bd0015347
7
- data.tar.gz: 59257ede6016d05f13a0f64ed3277131f18cd82b4e3cf17a6d97ee850593e7d111e3f195690a9581f9f13540d82d81713e71ae74bf0d8cc678215179fb43283c
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
- transform(&:itself)
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) & transform { |input|
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
- key_present = @context.respond_to?(:key?) && @context.key?(m) ||
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
- Datacaster.ValidResult(Runtimes::Base.(runtime, @transform, object))
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
@@ -1,3 +1,3 @@
1
1
  module Datacaster
2
- VERSION = "3.3.1"
2
+ VERSION = "4.1.0"
3
3
  end
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: 3.3.1
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-07-08 00:00:00.000000000 Z
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.5.14
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: []