diff --git a/aws-sdk-core/lib/aws-sdk-core/dynamodb/attribute_value.rb b/aws-sdk-core/lib/aws-sdk-core/dynamodb/attribute_value.rb index c8dc9a07dbc..161ff881724 100644 --- a/aws-sdk-core/lib/aws-sdk-core/dynamodb/attribute_value.rb +++ b/aws-sdk-core/lib/aws-sdk-core/dynamodb/attribute_value.rb @@ -34,7 +34,7 @@ def format(obj) end when String then { s: obj } when Numeric then { n: obj.to_s } - when StringIO, IO then { b: obj.read } + when StringIO, IO then { b: obj } when Set then format_set(obj) when true, false then { bool: obj } when nil then { null: true } @@ -51,7 +51,7 @@ def format_set(set) case set.first when String then { ss: set.map(&:to_s) } when Numeric then { ns: set.map(&:to_s) } - when StringIO, IO then { bs: set.map(&:read) } + when StringIO, IO then { bs: set.to_a } else msg = "set types only support String, Numeric, or IO objects" raise ArgumentError, msg diff --git a/aws-sdk-core/spec/aws/dynamodb/attribute_value_spec.rb b/aws-sdk-core/spec/aws/dynamodb/attribute_value_spec.rb index e0a5d6ff5bb..cb9384b0794 100644 --- a/aws-sdk-core/spec/aws/dynamodb/attribute_value_spec.rb +++ b/aws-sdk-core/spec/aws/dynamodb/attribute_value_spec.rb @@ -26,6 +26,12 @@ module DynamoDB ]) end + it 'converts IO objects to :b (binary)' do + io = StringIO.new('bar') + formatted = value.marshal(foo: io) + expect(formatted[:m]["foo"][:b].read).to eq('bar') + end + it 'converts string sets to :ss (string set)' do formatted = value.marshal(Set.new(%w(abc mno))) expect(formatted).to eq(ss: %w(abc mno)) @@ -37,8 +43,9 @@ module DynamoDB end it 'converts binary sets to :bs (binary set)' do - formatted = value.marshal(Set.new([StringIO.new('data')])) - expect(formatted).to eq(bs: ['data']) + io_obj = StringIO.new('data') + formatted = value.marshal(Set.new([io_obj])) + expect(formatted).to eq(bs: [io_obj]) end it 'converts numerics to :n (number)' do