Skip to content

Commit d1b0637

Browse files
author
Matt Muller
committed
Fix smithy-json spec and rbs
1 parent 21b35df commit d1b0637

5 files changed

Lines changed: 63 additions & 62 deletions

File tree

gems/smithy-client/lib/smithy-client/param_converter.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,8 @@ def structure(ref, values)
8686
def union(ref, values)
8787
values = c(ref, values)
8888
if values.is_a?(Schema::Union)
89-
member_shape = ref.shape.member_by_type(values.class)
90-
member(member_shape, values)
89+
member_ref = ref.shape.member_by_type(values.class)
90+
member(member_ref, values)
9191
else
9292
key, value = values.first
9393
values[key] = member(ref.shape.member(key), value)

gems/smithy-json/lib/smithy-json/deserializer.rb

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,22 @@ def initialize(options = {})
1313
def deserialize(shape, bytes, target)
1414
return {} if bytes.empty?
1515

16-
shape(shape, ::JSON.parse(bytes), target)
16+
ref = shape.is_a?(ShapeRef) ? shape : ShapeRef.new(shape: shape)
17+
shape(ref, ::JSON.parse(bytes), target)
1718
end
1819

1920
private
2021

21-
def shape(shape, value, target = nil) # rubocop:disable Metrics/CyclomaticComplexity
22-
case shape
22+
def shape(ref, value, target = nil) # rubocop:disable Metrics/CyclomaticComplexity
23+
case ref.shape
2324
when BlobShape then Base64.decode64(value)
2425
when BooleanShape then value.to_s == 'true'
2526
when FloatShape then float(value)
26-
when ListShape then list(shape, value, target)
27-
when MapShape then map(shape, value, target)
28-
when StructureShape then structure(shape, value, target)
27+
when ListShape then list(ref, value, target)
28+
when MapShape then map(ref, value, target)
29+
when StructureShape then structure(ref, value, target)
2930
when TimestampShape then timestamp(value)
30-
when UnionShape then union(shape, value, target)
31+
when UnionShape then union(ref, value, target)
3132
else value
3233
end
3334
end
@@ -42,35 +43,35 @@ def float(value)
4243
end
4344
end
4445

45-
def list(shape, values, target = nil)
46+
def list(ref, values, target = nil)
4647
target = [] if target.nil?
4748
values.each do |value|
48-
next if value.nil? && !sparse?(shape)
49+
next if value.nil? && !sparse?(ref.shape)
4950

50-
target << (value.nil? ? nil : shape(shape.member.shape, value))
51+
target << (value.nil? ? nil : shape(ref.shape.member, value))
5152
end
5253
target
5354
end
5455

55-
def map(shape, values, target = nil)
56+
def map(ref, values, target = nil)
5657
target = {} if target.nil?
5758
values.each do |key, value|
58-
next if value.nil? && !sparse?(shape)
59+
next if value.nil? && !sparse?(ref.shape)
5960

60-
target[key] = value.nil? ? nil : shape(shape.value.shape, value)
61+
target[key] = value.nil? ? nil : shape(ref.shape.value, value)
6162
end
6263
target
6364
end
6465

65-
def structure(shape, values, target = nil)
66-
return Smithy::Schema::EmptyStructure.new if shape == Prelude::Unit
66+
def structure(ref, values, target = nil) # rubocop:disable Metrics/AbcSize
67+
return Smithy::Schema::EmptyStructure.new if ref.shape == Prelude::Unit
6768

68-
target = shape.type.new if target.nil?
69-
shape.members.each do |member_name, member_shape|
70-
key = member_shape.traits['smithy.api#jsonName'] || member_shape.name
69+
target = ref.shape.type.new if target.nil?
70+
ref.shape.members.each do |member_name, member_ref|
71+
key = member_ref.traits['smithy.api#jsonName'] || member_ref.location_name
7172
next unless values.key?(key)
7273

73-
target[member_name] = shape(member_shape.shape, values[key])
74+
target[member_name] = shape(member_ref, values[key])
7475
end
7576
target
7677
end
@@ -90,29 +91,29 @@ def timestamp(value)
9091
end
9192
end
9293

93-
def union(shape, values, target = nil) # rubocop:disable Metrics/AbcSize
94-
sanitize_union!(shape, values)
94+
def union(ref, values, target = nil) # rubocop:disable Metrics/AbcSize
95+
sanitize_union!(ref, values)
9596

9697
key, value = values.first
9798
return nil if key.nil?
9899

99-
shape.members.each do |member_name, member_shape|
100-
name = member_shape.traits['smithy.api#jsonName'] || member_shape.name
100+
ref.shape.members.each do |member_name, member_ref|
101+
name = member_ref.traits['smithy.api#jsonName'] || member_ref.location_name
101102
next unless values.key?(name)
102103

103-
target = shape.member_type(member_name) if target.nil?
104-
return target.new(shape(member_shape.shape, values[name]))
104+
target = ref.shape.member_type(member_name) if target.nil?
105+
return target.new(shape(member_ref, values[name]))
105106
end
106-
shape.member_type(:unknown).new(key, value)
107+
ref.shape.member_type(:unknown).new(key, value)
107108
end
108109

109-
def sanitize_union!(shape, values) # rubocop:disable Metrics/CyclomaticComplexity
110+
def sanitize_union!(ref, values) # rubocop:disable Metrics/CyclomaticComplexity
110111
return unless values.size > 1
111112

112113
# __type should be ignored unless it's a jsonName for a member
113114
type_as_name = false
114-
shape.members.each_value do |member_shape|
115-
name = member_shape.traits['smithy.api#jsonName'] || member_shape.name
115+
ref.shape.members.each_value do |member_ref|
116+
name = member_ref.traits['smithy.api#jsonName'] || member_ref.location_name
116117
type_as_name = true if name == '__type'
117118
end
118119

gems/smithy-json/lib/smithy-json/serializer.rb

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,22 @@ def initialize(options = {})
1313
def serialize(shape, data)
1414
return nil if shape == Prelude::Unit
1515

16-
shape = MemberShape.new('Dummy', shape) # TODO: this is pretty bad probably
17-
::JSON.dump(shape(shape, data))
16+
ref = shape.is_a?(ShapeRef) ? shape : ShapeRef.new(shape: shape)
17+
::JSON.dump(shape(ref, data))
1818
end
1919

2020
private
2121

22-
def shape(member_shape, value) # rubocop:disable Metrics/CyclomaticComplexity
23-
shape = member_shape.shape
22+
def shape(ref, value) # rubocop:disable Metrics/CyclomaticComplexity
23+
shape = ref.shape
2424
case shape
2525
when BlobShape then blob(value)
2626
when FloatShape then float(value)
27-
when ListShape then list(shape, value)
28-
when MapShape then map(shape, value)
29-
when StructureShape then structure(shape, value)
30-
when TimestampShape then timestamp(member_shape, shape, value)
31-
when UnionShape then union(shape, value)
27+
when ListShape then list(ref, value)
28+
when MapShape then map(ref, value)
29+
when StructureShape then structure(ref, value)
30+
when TimestampShape then timestamp(ref, value)
31+
when UnionShape then union(ref, value)
3232
else value
3333
end
3434
end
@@ -49,37 +49,37 @@ def float(value)
4949
end
5050
end
5151

52-
def list(shape, values)
52+
def list(ref, values)
5353
values.collect do |value|
54-
next if value.nil? && !sparse?(shape)
54+
next if value.nil? && !sparse?(ref.shape)
5555

56-
value.nil? ? nil : shape(shape.member, value)
56+
value.nil? ? nil : shape(ref.shape.member, value)
5757
end
5858
end
5959

60-
def map(shape, values)
60+
def map(ref, values)
6161
values.each.with_object({}) do |(key, value), data|
62-
next if value.nil? && !sparse?(shape)
62+
next if value.nil? && !sparse?(ref.shape)
6363

64-
data[key] = value.nil? ? nil : shape(shape.value, value)
64+
data[key] = value.nil? ? nil : shape(ref.shape.value, value)
6565
end
6666
end
6767

68-
def structure(shape, values)
68+
def structure(ref, values)
6969
return nil if values.nil?
7070

7171
values.each_pair.with_object({}) do |(key, value), data|
72-
if shape.member?(key) && !value.nil?
73-
member_shape = shape.member(key)
74-
member_name = member_shape.traits['smithy.api#jsonName'] || member_shape.name
75-
data[member_name] = shape(member_shape, value)
72+
if ref.shape.member?(key) && !value.nil?
73+
member_ref = ref.shape.member(key)
74+
member_name = member_ref.traits['smithy.api#jsonName'] || member_ref.location_name
75+
data[member_name] = shape(member_ref, value)
7676
end
7777
end
7878
end
7979

80-
def timestamp(member_shape, shape, value)
80+
def timestamp(ref, value)
8181
trait = 'smithy.api#timestampFormat'
82-
case member_shape.traits[trait] || shape.traits[trait]
82+
case ref.traits[trait] || ref.shape.traits[trait]
8383
when 'date-time' then value.utc.iso8601
8484
when 'http-date' then value.utc.httpdate
8585
else
@@ -88,18 +88,18 @@ def timestamp(member_shape, shape, value)
8888
end
8989
end
9090

91-
def union(shape, values) # rubocop:disable Metrics/AbcSize
91+
def union(ref, values) # rubocop:disable Metrics/AbcSize
9292
data = {}
9393
if values.is_a?(Smithy::Schema::Union)
94-
member_shape = shape.member_by_type(values.class)
95-
member_name = member_shape.traits['smithy.api#jsonName'] || member_shape.name
96-
data[member_name] = shape(member_shape, values)
94+
member_ref = ref.shape.member_by_type(values.class)
95+
member_name = member_ref.traits['smithy.api#jsonName'] || member_ref.location_name
96+
data[member_name] = shape(member_ref, values)
9797
else
9898
key, value = values.first
99-
if shape.member?(key)
100-
member_shape = shape.member(key)
101-
member_name = member_shape.traits['smithy.api#jsonName'] || member_shape.name
102-
data[member_name] = shape(member_shape, value)
99+
if ref.shape.member?(key)
100+
member_ref = ref.shape.member(key)
101+
member_name = member_ref.traits['smithy.api#jsonName'] || member_ref.location_name
102+
data[member_name] = shape(member_ref, value)
103103
end
104104
end
105105
data
File renamed without changes.

gems/smithy-schema/sig/smithy-schema/shapes.rbs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ module Smithy
1414
def initialize: (?Hash[Symbol, untyped]) -> void
1515

1616
attr_accessor shape: Shape
17-
attr_accessor location_name: String
17+
attr_accessor location_name: String?
1818
attr_accessor traits: Hash[String, untyped]
1919
def []: (Symbol) -> Object
2020
def []=: (Symbol, Object) -> void

0 commit comments

Comments
 (0)