From 64de6284fbc4f717b29b946439225cd73ef58613 Mon Sep 17 00:00:00 2001 From: Eugene Zolotarev Date: Tue, 8 Oct 2024 16:43:53 +0300 Subject: [PATCH] Fix for transform to instances --- lib/datacaster/predefined.rb | 5 +++-- lib/datacaster/runtimes/structure_cleaner.rb | 4 ++++ lib/datacaster/transformer.rb | 4 ++-- spec/structure_cleaner_spec.rb | 10 ++++++++++ 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/lib/datacaster/predefined.rb b/lib/datacaster/predefined.rb index b00f4c6..95b45dc 100644 --- a/lib/datacaster/predefined.rb +++ b/lib/datacaster/predefined.rb @@ -189,7 +189,7 @@ def pick(*keys) end end - must_be(Enumerable) & transform { |input| + must_be(Enumerable) & cast { |input| result = keys.map do |key| Array(key).reduce(input) do |result, k| @@ -198,7 +198,8 @@ def pick(*keys) result end end - keys.length == 1 ? result.first : result + result = keys.length == 1 ? result.first : result + Datacaster::ValidResult(result) } end diff --git a/lib/datacaster/runtimes/structure_cleaner.rb b/lib/datacaster/runtimes/structure_cleaner.rb index 75dc546..266c0d0 100644 --- a/lib/datacaster/runtimes/structure_cleaner.rb +++ b/lib/datacaster/runtimes/structure_cleaner.rb @@ -36,6 +36,10 @@ def will_check! @should_check_stack[-1] = true end + def will_not_check! + @should_check_stack[-1] = false + end + # Notify current runtime that some child runtime has built schema, # child runtime's schema is passed as the argument def checked_schema!(schema) diff --git a/lib/datacaster/transformer.rb b/lib/datacaster/transformer.rb index ce496b3..94e6427 100644 --- a/lib/datacaster/transformer.rb +++ b/lib/datacaster/transformer.rb @@ -8,8 +8,8 @@ def initialize(&block) def cast(object, runtime:) result = Runtimes::Base.(runtime, @transform, object) - if runtime.respond_to?(:checked_key!) && result.is_a?(Hash) - result.keys.each { |key| runtime.checked_key!(key) } + if runtime.respond_to?(:will_not_check!) + runtime.will_not_check! end Datacaster::ValidResult(result) end diff --git a/spec/structure_cleaner_spec.rb b/spec/structure_cleaner_spec.rb index cd64016..216fcc2 100644 --- a/spec/structure_cleaner_spec.rb +++ b/spec/structure_cleaner_spec.rb @@ -9,6 +9,16 @@ expect(caster.(a: 'value').to_dry_result).to eq Success(b: 'value') end + it 'transform can cast to classes' do + i = Class.new.new + + caster = + Datacaster.schema do + hash_schema(a: string) & transform { i } + end + expect(caster.(a: 'value').to_dry_result).to eq Success(i) + end + it 'defaults marks hashes as cleaned' do caster = Datacaster.schema do