Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions gems/smithy-cbor/lib/smithy-cbor/parser.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ def list(shape, values, result = nil)
sparse = target.traits.key?('smithy.api#sparse')
result = [] if result.nil?
values.each do |value|
next if value.nil? && !sparse
raise ParseError, "Expected #{list_member.target.name}, got nil" if value.nil? && !sparse

result << parse_shape(list_member, value)
end
Expand All @@ -48,7 +48,7 @@ def map(shape, values, result = nil)
sparse = target.traits.key?('smithy.api#sparse')
result = {} if result.nil?
values.each do |key, value|
next if value.nil? && !sparse
raise ParseError, "Expected #{value_member.target.name}, got nil" if value.nil? && !sparse

result[key] = parse_shape(value_member, value)
end
Expand Down
10 changes: 6 additions & 4 deletions gems/smithy-cbor/spec/smithy-cbor/parser_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -114,10 +114,11 @@ module Cbor
expect(subject.parse(structure_shape, bytes).to_h).to eq(list: ['string'])
end

it 'parses lists with nil values' do
it 'rejects nil values in non-sparse lists' do
data = { 'list' => [nil] }
bytes = Cbor.encode(data)
expect(subject.parse(structure_shape, bytes).to_h).to eq(list: [])
expect { subject.parse(structure_shape, bytes) }
.to raise_error(Cbor::ParseError, 'Expected String, got nil')
end

it 'parses sparse lists' do
Expand All @@ -135,10 +136,11 @@ module Cbor
expect(subject.parse(structure_shape, bytes).to_h).to eq(map: { 'key' => 'value' })
end

it 'parses maps with nil values' do
it 'rejects nil values in non-sparse maps' do
data = { 'map' => { 'key' => nil } }
bytes = Cbor.encode(data)
expect(subject.parse(structure_shape, bytes).to_h).to eq(map: {})
expect { subject.parse(structure_shape, bytes) }
.to raise_error(Cbor::ParseError, 'Expected String, got nil')
end

it 'parses sparse maps' do
Expand Down
4 changes: 2 additions & 2 deletions gems/smithy-json/lib/smithy-json/parser.rb
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ def list(shape, values, result = nil)
sparse = target.traits.key?('smithy.api#sparse')
result = [] if result.nil?
values.each do |value|
next if value.nil? && !sparse
raise ParseError, "Expected #{member.target.name}, got nil" if value.nil? && !sparse

result << parse_shape(member, value)
end
Expand All @@ -63,7 +63,7 @@ def map(shape, values, result = nil)
sparse = target.traits.key?('smithy.api#sparse')
result = {} if result.nil?
values.each do |key, value|
next if value.nil? && !sparse
raise ParseError, "Expected #{value_member.target.name}, got nil" if value.nil? && !sparse

result[key] = parse_shape(value_member, value)
end
Expand Down
19 changes: 12 additions & 7 deletions gems/smithy-json/spec/smithy-json/parser_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,8 @@ module Json
it 'parses unknown members' do
data = { union: { 'someThing' => 'someValue' } }
bytes = Json.dump(data)
expect(subject.parse(structure_shape, bytes).to_h).to eq(union: { unknown: { 'someThing' => 'someValue' } })
expect(subject.parse(structure_shape, bytes).to_h)
.to eq(union: { unknown: { 'someThing' => 'someValue' } })
end

it 'parsing ignores an extra __type key' do
Expand Down Expand Up @@ -152,10 +153,11 @@ module Json
expect(subject.parse(structure_shape, bytes).to_h).to eq(list: ['string'])
end

it 'parses lists with nil values' do
it 'rejects nil values in non-sparse lists' do
data = { 'list' => [nil] }
bytes = Json.dump(data)
expect(subject.parse(structure_shape, bytes).to_h).to eq(list: [])
expect { subject.parse(structure_shape, bytes) }
.to raise_error(Json::ParseError, 'Expected String, got nil')
end

it 'parses sparse lists' do
Expand All @@ -173,17 +175,19 @@ module Json
expect(subject.parse(structure_shape, bytes).to_h).to eq(map: { 'key' => 'value' })
end

it 'parses maps with nil values' do
it 'rejects nil values in non-sparse maps' do
data = { 'map' => { 'key' => nil } }
bytes = Json.dump(data)
expect(subject.parse(structure_shape, bytes).to_h).to eq(map: {})
expect { subject.parse(structure_shape, bytes) }
.to raise_error(Json::ParseError, 'Expected String, got nil')
end

it 'parses sparse maps' do
shapes['smithy.ruby.tests#Map']['traits'] = { 'smithy.api#sparse' => {} }
data = { 'map' => { 'key' => nil, 'anotherKey' => 'value' } }
bytes = Json.dump(data)
expect(subject.parse(structure_shape, bytes).to_h).to eq(map: { 'key' => nil, 'anotherKey' => 'value' })
expect(subject.parse(structure_shape, bytes).to_h)
.to eq(map: { 'key' => nil, 'anotherKey' => 'value' })
end
end

Expand Down Expand Up @@ -243,7 +247,8 @@ module Json
it 'handles unrecognized timestamp formats' do
data = { 'timestamp' => 'unrecognized format' }
bytes = Json.dump(data)
expect { subject.parse(structure_shape, bytes) }.to raise_error(/unhandled epoch-seconds timestamp/)
expect { subject.parse(structure_shape, bytes) }
.to raise_error(/unhandled epoch-seconds timestamp/)
end
end
end
Expand Down
Loading