Skip to content
Merged
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
10 changes: 5 additions & 5 deletions gems/smithy/lib/smithy/templates/client/schema.erb
Original file line number Diff line number Diff line change
Expand Up @@ -34,20 +34,20 @@ module <%= module_name %>
<% shape.members.each do |member| -%>
<%= shape.name %>.add_member(:<%= member.name %>, <%= shape.union_type(member) %>, <%= member.initializer %>)
<% end -%>
<%= shape.name %>.add_member(:unknown, Types::<%= shape.name %>::Unknown, Smithy::Schema::Shapes::ShapeRef.new(shape: Smithy::Schema::Shapes::Prelude::Unit))
<%= shape.name %>.add_member(:unknown, Types::<%= shape.name %>::Unknown, ::Smithy::Schema::Shapes::ShapeRef.new(shape: ::Smithy::Schema::Shapes::Prelude::Unit))
<%= shape.name %>.type = <%= shape.type_class %>
<% end -%>
<% end -%>

<%= service_shape.name %> = Smithy::Schema::Shapes::ServiceShape.new do |service|
<%= service_shape.name %> = ::Smithy::Schema::Shapes::ServiceShape.new do |service|
service.id = "<%= service_shape.id %>"
service.name = "<%= service_shape.name %>"
<% if service_shape.version -%>
service.version = "<%= service_shape.version %>"
<% end -%>
service.traits = <%= service_shape.traits %>
<% operation_shapes.each do |shape| -%>
service.add_operation(:<%= shape.name.underscore %>, Smithy::Schema::Shapes::OperationShape.new do |operation|
service.add_operation(:<%= shape.name.underscore %>, ::Smithy::Schema::Shapes::OperationShape.new do |operation|
operation.id = "<%= shape.id %>"
operation.name = "<%= shape.name %>"
operation.input = <%= shape.input.initializer %>
Expand All @@ -68,8 +68,8 @@ module <%= module_name %>
def type_registry
return @type_registry if @type_registry

shapes = constants.map { |sym| const_get(sym) }.select { |const| const.is_a?(Smithy::Schema::Shapes::StructureShape) }
@type_registry = Smithy::Schema::TypeRegistry.new(shapes)
shapes = constants.map { |sym| const_get(sym) }.select { |const| const.is_a?(::Smithy::Schema::Shapes::StructureShape) }
@type_registry = ::Smithy::Schema::TypeRegistry.new(shapes)
end
end
end
Expand Down
13 changes: 2 additions & 11 deletions gems/smithy/lib/smithy/templates/client/types.erb
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,6 @@ module <%= module_name %>
# <%= docstring %>
<% end -%>
<% case type.type -%>
<% when 'enum', 'intEnum' -%>
module <%= type.name %>
<% type.members.each do |member| -%>
<% member.docstrings.each do |docstring| -%>
# <%= docstring %>
<% end -%>
<%= member.name %> = <%= member.value %>
<% end -%>
end
<% when 'structure' -%>
<% type.attribute_docstrings.each do |docstring| -%>
# <%= docstring %>
Expand All @@ -29,7 +20,7 @@ module <%= module_name %>
:<%= member.name.underscore %>,
<% end -%>
keyword_init: true)
include Smithy::Schema::Structure
include ::Smithy::Schema::Structure
<% if !type.input? && type.defaults.any? -%>

def initialize(options = {})
Expand All @@ -50,7 +41,7 @@ module <%= module_name %>
<% end -%>
:unknown,
keyword_init: true)
include Smithy::Schema::Union
include ::Smithy::Schema::Union

<% type.members.each do |member| -%>
class <%= member.name.camelize %> < <%= type.name %>; end
Expand Down
6 changes: 2 additions & 4 deletions gems/smithy/lib/smithy/views/client/paginators.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ def paginators
.operations_for(@plan.service)
.map do |id, operation|
operation_trait = paginated_trait(operation)
next if operation_trait.empty?

resolved_trait = @service_trait.merge(operation_trait)
next if resolved_trait.empty?

Paginator.new(Model::Shape.name(id), resolved_trait)
end
.compact
Expand All @@ -52,7 +52,6 @@ def next_tokens_code
next_token_getter = output_getter(@output_token)
code = ["next_token = #{next_token_getter}"]
code << 'return {} if next_token.nil? || next_token.empty?'
code << ''
code << 'tokens = Hash.new { |h, k| h[k] = {} }'
next_token_setter = input_getter(@input_token, 'tokens')
code << "#{next_token_setter} = next_token"
Expand All @@ -64,7 +63,6 @@ def prev_tokens_code
prev_token_getter = input_getter(@input_token)
code = ["prev_token = #{prev_token_getter}"]
code << 'return {} if prev_token.nil? || prev_token.empty?'
code << ''
code << 'tokens = Hash.new { |h, k| h[k] = {} }'
prev_token_setter = input_getter(@input_token, 'tokens')
code << "#{prev_token_setter} = prev_token"
Expand Down
17 changes: 6 additions & 11 deletions gems/smithy/lib/smithy/views/client/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ def initialize(service, id, shape)

def initializer
traits_str = ", traits: #{@traits}" unless @traits.empty?
"Smithy::Schema::Shapes::#{SHAPE_CLASS_MAP[@type]}.new(id: '#{@id}', name: '#{@name}'#{traits_str})"
"::Smithy::Schema::Shapes::#{SHAPE_CLASS_MAP[@type]}.new(id: '#{@id}', name: '#{@name}'#{traits_str})"
end
end

Expand Down Expand Up @@ -275,7 +275,7 @@ def type_class
end

def union_type(shape_ref)
"#{type_class}::#{shape_ref.name.camelize}"
"#{type_class}::#{shape_ref.location_name.camelize}"
end

private
Expand All @@ -289,7 +289,6 @@ def build_shape_refs(members)
class ShapeRef
OMITTED_TRAITS = %w[
smithy.api#documentation
smithy.api#httpPayload
].freeze

PRELUDE_SHAPES_MAP = {
Expand Down Expand Up @@ -321,28 +320,24 @@ def initialize(service, location_name, shape_ref)
@name = location_name.underscore if location_name
@location_name = location_name
@shape = shape(shape_ref['target'])
@traits = shape_ref.fetch('traits', {})
@traits = shape_ref.fetch('traits', {}).except(*OMITTED_TRAITS)
end

attr_reader :name
attr_reader :name, :location_name

def initializer
options_str = "shape: #{@shape}"
options_str += ", location_name: '#{@location_name}'" if @location_name
options_str += ", traits: #{@traits}" unless @traits.empty?
"Smithy::Schema::Shapes::ShapeRef.new(#{options_str})"
"::Smithy::Schema::Shapes::ShapeRef.new(#{options_str})"
end

def shape(id)
return "Smithy::Schema::Shapes::#{PRELUDE_SHAPES_MAP[id]}" if PRELUDE_SHAPES_MAP.key?(id)
return "::Smithy::Schema::Shapes::#{PRELUDE_SHAPES_MAP[id]}" if PRELUDE_SHAPES_MAP.key?(id)

(@service.dig('rename', id) || Model::Shape.name(id)).camelize
end

def traits
@traits.except(*OMITTED_TRAITS)
end

def http_payload?
@traits.key?('smithy.api#httpPayload')
end
Expand Down
31 changes: 3 additions & 28 deletions gems/smithy/lib/smithy/views/client/types.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ def types
Model::ServiceIndex
.new(@model)
.shapes_for(@plan.service)
.select { |_key, shape| %w[enum intEnum structure union].include?(shape['type']) }
.select { |_key, shape| %w[structure union].include?(shape['type']) }
.map { |id, shape| build_type(id, shape) }
end

Expand All @@ -28,7 +28,6 @@ def types
def build_type(id, shape)
args = [@plan.service, @model, id, shape]
case shape['type']
when 'enum', 'intEnum' then EnumType.new(*args)
when 'structure' then StructureType.new(*args)
when 'union' then UnionType.new(*args)
end
Expand Down Expand Up @@ -99,15 +98,6 @@ def unstable_docstrings
end
end

# @api private
class EnumType < Type
private

def build_members(members)
members.map { |name, member| EnumMember.new(@service, @model, name, member) }
end
end

# @api private
class StructureType < Type
def input?
Expand Down Expand Up @@ -208,21 +198,6 @@ def unstable_docstrings
end
end

# @api private
class EnumMember < Member
def value
value = @traits['smithy.api#enumValue']
case value
when String then "'#{value}'"
else value
end
end

def documentation_docstrings
@member.fetch('traits', {}).fetch('smithy.api#documentation', '').split("\n")
end
end

# @api private
class StructMember < Member
def docstrings # rubocop:disable Metrics/AbcSize
Expand All @@ -244,9 +219,10 @@ def default?

def default
default = @member.dig('traits', 'smithy.api#default')
return 'nil' if default.nil?

case @target['type']
when 'blob' then "Base64.strict_decode64('#{default}')"
when 'bigDecimal' then "BigDecimal('#{default}')"
when 'document' then document_default(default)
when 'enum', 'string' then "'#{default}'"
when 'timestamp' then timestamp_default(default)
Expand All @@ -273,7 +249,6 @@ def return_docstrings

def document_default(default)
case default
when nil then 'nil'
when String then "'#{default}'"
else default
end
Expand Down
71 changes: 71 additions & 0 deletions gems/smithy/spec/fixtures/paginated_trait/inheritance/model.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
{
"smithy": "2.0",
"shapes": {
"smithy.ruby.tests#InheritedTraitOperation": {
"type": "operation",
"input": {
"target": "smithy.ruby.tests#OperationInputOutput"
},
"output": {
"target": "smithy.ruby.tests#OperationInputOutput"
}
},
"smithy.ruby.tests#Items": {
"type": "list",
"member": {
"target": "smithy.api#String"
}
},
"smithy.ruby.tests#MergedTraitOperation": {
"type": "operation",
"input": {
"target": "smithy.ruby.tests#OperationInputOutput"
},
"output": {
"target": "smithy.ruby.tests#OperationInputOutput"
},
"traits": {
"smithy.api#paginated": {
"inputToken": "outputToken",
"outputToken": "inputToken",
"items": "items"
}
}
},
"smithy.ruby.tests#OperationInputOutput": {
"type": "structure",
"members": {
"inputToken": {
"target": "smithy.api#String"
},
"outputToken": {
"target": "smithy.api#String"
},
"pageSize": {
"target": "smithy.api#Integer"
},
"items": {
"target": "smithy.ruby.tests#Items"
}
}
},
"smithy.ruby.tests#PaginatedService": {
"type": "service",
"operations": [
{
"target": "smithy.ruby.tests#InheritedTraitOperation"
},
{
"target": "smithy.ruby.tests#MergedTraitOperation"
}
],
"traits": {
"smithy.api#paginated": {
"inputToken": "inputToken",
"outputToken": "outputToken",
"pageSize": "pageSize"
}
}
}
}
}
33 changes: 33 additions & 0 deletions gems/smithy/spec/fixtures/paginated_trait/inheritance/model.smithy
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
$version: "2.0"

namespace smithy.ruby.tests

@paginated(inputToken: "inputToken", outputToken: "outputToken", pageSize: "pageSize")
service PaginatedService {
operations: [
InheritedTraitOperation,
MergedTraitOperation
]
}

operation InheritedTraitOperation {
input: OperationInputOutput
output: OperationInputOutput
}

@paginated(inputToken: "outputToken", outputToken: "inputToken", items: "items")
operation MergedTraitOperation {
input: OperationInputOutput
output: OperationInputOutput
}

structure OperationInputOutput {
inputToken: String
outputToken: String
pageSize: Integer
items: Items
}

list Items {
member: String
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
{
"smithy": "2.0",
"shapes": {
"smithy.ruby.tests#OperationInputOutput": {
"type": "structure",
"members": {
"inputToken": {
"target": "smithy.api#String"
},
"outputToken": {
"target": "smithy.api#String"
}
}
},
"smithy.ruby.tests#PaginatedOperation": {
"type": "operation",
"input": {
"target": "smithy.ruby.tests#OperationInputOutput"
},
"output": {
"target": "smithy.ruby.tests#OperationInputOutput"
},
"traits": {
"smithy.api#paginated": {
"inputToken": "inputToken",
"outputToken": "outputToken"
}
}
},
"smithy.ruby.tests#PaginatedService": {
"type": "service",
"operations": [
{
"target": "smithy.ruby.tests#PaginatedOperation"
},
{
"target": "smithy.ruby.tests#UnpaginatedOperation"
}
]
},
"smithy.ruby.tests#UnpaginatedOperation": {
"type": "operation",
"input": {
"target": "smithy.ruby.tests#OperationInputOutput"
},
"output": {
"target": "smithy.ruby.tests#OperationInputOutput"
}
}
}
}
Loading