diff --git a/lib/userializer.rb b/lib/userializer.rb index 4679a9b..99c9470 100644 --- a/lib/userializer.rb +++ b/lib/userializer.rb @@ -1,6 +1,7 @@ require 'userializer/version' require 'userializer/base_serializer' require 'userializer/array_serializer' +require 'userializer/raw_serializer' require 'userializer/composite_serializer' module USerializer diff --git a/lib/userializer/composite_serializer.rb b/lib/userializer/composite_serializer.rb index 5be707b..ed95eea 100644 --- a/lib/userializer/composite_serializer.rb +++ b/lib/userializer/composite_serializer.rb @@ -61,7 +61,7 @@ def compose_objs(objs) objs.map do |(key, obj)| opts = options_for(key) - if obj.is_a? Enumerable + if obj.is_a? Array ArraySerializer.new(obj, opts) else CompositeObject.new(obj, opts) diff --git a/lib/userializer/raw_serializer.rb b/lib/userializer/raw_serializer.rb new file mode 100644 index 0000000..81dd729 --- /dev/null +++ b/lib/userializer/raw_serializer.rb @@ -0,0 +1,29 @@ +require 'oj' + +module USerializer + class RawSerializer + def initialize(obj, _) + @obj = obj + end + + def serializable_hash(_) + @obj + end + + def merge_root(res, key, _, _) + res[key] = @obj + end + + def to_hash + res = {} + + merge_root(res, @root_key, true, nil) + + res + end + + def to_json + Oj.dump(to_hash, mode: :compat) + end + end +end diff --git a/spec/userializer/composite_serializer_spec.rb b/spec/userializer/composite_serializer_spec.rb index 7b1faf1..9bbfd6a 100644 --- a/spec/userializer/composite_serializer_spec.rb +++ b/spec/userializer/composite_serializer_spec.rb @@ -120,4 +120,21 @@ class Foo ) end end + + context 'with raw hash' do + it do + expect( + USerializer::CompositeSerializer.new( + { + key: foo, + bar: { buz: 'value' } + }, + serializer: { bar: USerializer::RawSerializer } + ).to_hash + ).to eq( + key: { id: 1, bar: 'bar' }, + bar: { buz: 'value' } + ) + end + end end